Fix overly strict assertion in SummarizeOldestCommittedSxact(). There's a
race condition where SummarizeOldestCommittedSxact() is called even though another backend already cleared out all finished sxact entries. That's OK, RegisterSerializableTransactionInt() can just retry getting a news xact slot from the available-list when that happens. Reported by YAMAMOTO Takashi, bug #5918.
This commit is contained in:
parent
93d888232e
commit
46c333a963
@ -1314,15 +1314,21 @@ SummarizeOldestCommittedSxact(void)
|
|||||||
|
|
||||||
LWLockAcquire(SerializableFinishedListLock, LW_EXCLUSIVE);
|
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))
|
if (SHMQueueEmpty(FinishedSerializableTransactions))
|
||||||
{
|
{
|
||||||
LWLockRelease(SerializableFinishedListLock);
|
LWLockRelease(SerializableFinishedListLock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
Assert(!SHMQueueEmpty(FinishedSerializableTransactions));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Grab the first sxact off the finished list -- this will be the earliest
|
* Grab the first sxact off the finished list -- this will be the earliest
|
||||||
|
Loading…
x
Reference in New Issue
Block a user