Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite31d524

Browse files
committed
Fix intermittent crash in DROP INDEX CONCURRENTLY.
When deleteOneObject closes and reopens the pg_depend relation,we must see to it that the relcache pointer held by the calling function(typically performMultipleDeletions) is updated. Usually the relcacheentry is retained so that the pointer value doesn't change, which is whythe problem had escaped notice ... but after a cache flush event there'sno guarantee that the same memory will be reassigned. To fix, changethe recursive functions' APIs so that we pass around a "Relation *"not just "Relation".Per investigation of occasional buildfarm failures. This is trivialto reproduce with -DCLOBBER_CACHE_ALWAYS, which points up the sadlack of any buildfarm member running that way on a regular basis.
1 parent5e15cdb commite31d524

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

‎src/backend/catalog/dependency.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,13 @@ static void findDependentObjects(const ObjectAddress *object,
171171
ObjectAddressStack*stack,
172172
ObjectAddresses*targetObjects,
173173
constObjectAddresses*pendingObjects,
174-
RelationdepRel);
174+
Relation*depRel);
175175
staticvoidreportDependentObjects(constObjectAddresses*targetObjects,
176176
DropBehaviorbehavior,
177177
intmsglevel,
178178
constObjectAddress*origObject);
179179
staticvoiddeleteOneObject(constObjectAddress*object,
180-
RelationdepRel,int32flags);
180+
Relation*depRel,int32flags);
181181
staticvoiddoDeletion(constObjectAddress*object,intflags);
182182
staticvoidAcquireDeletionLock(constObjectAddress*object,intflags);
183183
staticvoidReleaseDeletionLock(constObjectAddress*object);
@@ -250,7 +250,7 @@ performDeletion(const ObjectAddress *object,
250250
NULL,/* empty stack */
251251
targetObjects,
252252
NULL,/* no pendingObjects */
253-
depRel);
253+
&depRel);
254254

255255
/*
256256
* Check if deletion is allowed, and report about cascaded deletes.
@@ -267,7 +267,7 @@ performDeletion(const ObjectAddress *object,
267267
{
268268
ObjectAddress*thisobj=targetObjects->refs+i;
269269

270-
deleteOneObject(thisobj,depRel,flags);
270+
deleteOneObject(thisobj,&depRel,flags);
271271
}
272272

273273
/* And clean up */
@@ -328,7 +328,7 @@ performMultipleDeletions(const ObjectAddresses *objects,
328328
NULL,/* empty stack */
329329
targetObjects,
330330
objects,
331-
depRel);
331+
&depRel);
332332
}
333333

334334
/*
@@ -349,7 +349,7 @@ performMultipleDeletions(const ObjectAddresses *objects,
349349
{
350350
ObjectAddress*thisobj=targetObjects->refs+i;
351351

352-
deleteOneObject(thisobj,depRel,flags);
352+
deleteOneObject(thisobj,&depRel,flags);
353353
}
354354

355355
/* And clean up */
@@ -398,7 +398,7 @@ deleteWhatDependsOn(const ObjectAddress *object,
398398
NULL,/* empty stack */
399399
targetObjects,
400400
NULL,/* no pendingObjects */
401-
depRel);
401+
&depRel);
402402

403403
/*
404404
* Check if deletion is allowed, and report about cascaded deletes.
@@ -427,7 +427,7 @@ deleteWhatDependsOn(const ObjectAddress *object,
427427
* action.If, in the future, this function is used for other
428428
* purposes, we might need to revisit this.
429429
*/
430-
deleteOneObject(thisobj,depRel,PERFORM_DELETION_INTERNAL);
430+
deleteOneObject(thisobj,&depRel,PERFORM_DELETION_INTERNAL);
431431
}
432432

433433
/* And clean up */
@@ -462,15 +462,15 @@ deleteWhatDependsOn(const ObjectAddress *object,
462462
*targetObjects: list of objects that are scheduled to be deleted
463463
*pendingObjects: list of other objects slated for destruction, but
464464
*not necessarily in targetObjects yet (can be NULL if none)
465-
*depRel: already opened pg_depend relation
465+
**depRel: already opened pg_depend relation
466466
*/
467467
staticvoid
468468
findDependentObjects(constObjectAddress*object,
469469
intflags,
470470
ObjectAddressStack*stack,
471471
ObjectAddresses*targetObjects,
472472
constObjectAddresses*pendingObjects,
473-
RelationdepRel)
473+
Relation*depRel)
474474
{
475475
ScanKeyDatakey[3];
476476
intnkeys;
@@ -540,7 +540,7 @@ findDependentObjects(const ObjectAddress *object,
540540
else
541541
nkeys=2;
542542

543-
scan=systable_beginscan(depRel,DependDependerIndexId, true,
543+
scan=systable_beginscan(*depRel,DependDependerIndexId, true,
544544
SnapshotNow,nkeys,key);
545545

546546
while (HeapTupleIsValid(tup=systable_getnext(scan)))
@@ -715,7 +715,7 @@ findDependentObjects(const ObjectAddress *object,
715715
else
716716
nkeys=2;
717717

718-
scan=systable_beginscan(depRel,DependReferenceIndexId, true,
718+
scan=systable_beginscan(*depRel,DependReferenceIndexId, true,
719719
SnapshotNow,nkeys,key);
720720

721721
while (HeapTupleIsValid(tup=systable_getnext(scan)))
@@ -986,10 +986,10 @@ reportDependentObjects(const ObjectAddresses *targetObjects,
986986
/*
987987
* deleteOneObject: delete a single object for performDeletion.
988988
*
989-
* depRel is the already-open pg_depend relation.
989+
**depRel is the already-open pg_depend relation.
990990
*/
991991
staticvoid
992-
deleteOneObject(constObjectAddress*object,RelationdepRel,intflags)
992+
deleteOneObject(constObjectAddress*object,Relation*depRel,intflags)
993993
{
994994
ScanKeyDatakey[3];
995995
intnkeys;
@@ -1012,7 +1012,7 @@ deleteOneObject(const ObjectAddress *object, Relation depRel, int flags)
10121012
* relation open across doDeletion().
10131013
*/
10141014
if (flags&PERFORM_DELETION_CONCURRENTLY)
1015-
heap_close(depRel,RowExclusiveLock);
1015+
heap_close(*depRel,RowExclusiveLock);
10161016

10171017
/*
10181018
* Delete the object itself, in an object-type-dependent way.
@@ -1029,7 +1029,7 @@ deleteOneObject(const ObjectAddress *object, Relation depRel, int flags)
10291029
* Reopen depRel if we closed it above
10301030
*/
10311031
if (flags&PERFORM_DELETION_CONCURRENTLY)
1032-
depRel=heap_open(DependRelationId,RowExclusiveLock);
1032+
*depRel=heap_open(DependRelationId,RowExclusiveLock);
10331033

10341034
/*
10351035
* Now remove any pg_depend records that link from this object to others.
@@ -1057,12 +1057,12 @@ deleteOneObject(const ObjectAddress *object, Relation depRel, int flags)
10571057
else
10581058
nkeys=2;
10591059

1060-
scan=systable_beginscan(depRel,DependDependerIndexId, true,
1060+
scan=systable_beginscan(*depRel,DependDependerIndexId, true,
10611061
SnapshotNow,nkeys,key);
10621062

10631063
while (HeapTupleIsValid(tup=systable_getnext(scan)))
10641064
{
1065-
simple_heap_delete(depRel,&tup->t_self);
1065+
simple_heap_delete(*depRel,&tup->t_self);
10661066
}
10671067

10681068
systable_endscan(scan);
@@ -1125,10 +1125,6 @@ doDeletion(const ObjectAddress *object, int flags)
11251125
break;
11261126
}
11271127

1128-
caseOCLASS_EVENT_TRIGGER:
1129-
RemoveEventTriggerById(object->objectId);
1130-
break;
1131-
11321128
caseOCLASS_PROC:
11331129
RemoveFunctionById(object->objectId);
11341130
break;
@@ -1238,6 +1234,10 @@ doDeletion(const ObjectAddress *object, int flags)
12381234
RemoveExtensionById(object->objectId);
12391235
break;
12401236

1237+
caseOCLASS_EVENT_TRIGGER:
1238+
RemoveEventTriggerById(object->objectId);
1239+
break;
1240+
12411241
default:
12421242
elog(ERROR,"unrecognized object class: %u",
12431243
object->classId);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp