提交 46c333a9 编写于 作者: H Heikki Linnakangas

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.
上级 93d88823
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册