diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c index 15f0a64d3c2f8d95468ae0c7006f1918709d5be6..870cf4277cf991aca1c588b70330d398843a8faf 100644 --- a/src/backend/storage/lmgr/predicate.c +++ b/src/backend/storage/lmgr/predicate.c @@ -1314,15 +1314,21 @@ SummarizeOldestCommittedSxact(void) LWLockAcquire(SerializableFinishedListLock, LW_EXCLUSIVE); -#ifdef TEST_OLDSERXID + /* + * This function is only called if there are no sxact slots available. + * Some of them must belong to old, already-finished transactions, so + * there should be something in FinishedSerializableTransactions list + * that we can summarize. However, there's a race condition: while we + * were not holding any locks, a transaction might have ended and cleaned + * up all the finished sxact entries already, freeing up their sxact + * slots. In that case, we have nothing to do here. The caller will find + * one of the slots released by the other backend when it retries. + */ if (SHMQueueEmpty(FinishedSerializableTransactions)) { LWLockRelease(SerializableFinishedListLock); return; } -#else - Assert(!SHMQueueEmpty(FinishedSerializableTransactions)); -#endif /* * Grab the first sxact off the finished list -- this will be the earliest