*** a/src/backend/storage/lmgr/predicate.c --- b/src/backend/storage/lmgr/predicate.c *************** *** 1755,1763 **** CoarserLockCovers(const PREDICATELOCKTARGETTAG *newtargettag) } /* ! * Check whether both the list of related predicate locks and the pointer to ! * a prior version of the row (if this is a tuple lock target) are empty for ! * a predicate lock target, and remove the target if they are. */ static void RemoveTargetIfNoLongerUsed(PREDICATELOCKTARGET *target, uint32 targettaghash) --- 1755,1762 ---- } /* ! * Check whether the list of related predicate locks is empty for a ! * predicate lock target, and remove the target if it is. */ static void RemoveTargetIfNoLongerUsed(PREDICATELOCKTARGET *target, uint32 targettaghash) *************** *** 3120,3130 **** ClearOldPredicateLocks(void) /* * Loop through predicate locks on dummy transaction for summarized data. */ predlock = (PREDICATELOCK *) SHMQueueNext(&OldCommittedSxact->predicateLocks, &OldCommittedSxact->predicateLocks, offsetof(PREDICATELOCK, xactLink)); - LWLockAcquire(SerializablePredicateLockListLock, LW_SHARED); while (predlock) { PREDICATELOCK *nextpredlock; --- 3119,3129 ---- /* * Loop through predicate locks on dummy transaction for summarized data. */ + LWLockAcquire(SerializablePredicateLockListLock, LW_SHARED); predlock = (PREDICATELOCK *) SHMQueueNext(&OldCommittedSxact->predicateLocks, &OldCommittedSxact->predicateLocks, offsetof(PREDICATELOCK, xactLink)); while (predlock) { PREDICATELOCK *nextpredlock;