|
From: Michael P. <mic...@gm...> - 2014-01-09 05:22:52
|
>> According to the stack of the session which holds the TwoPhaseStateLock,
>> the error is in the function of
>> LockGXact:
>>
>> static GlobalTransaction
>> LockGXact(const char *gid, Oid user)
>> {
>> ......
>> LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE);
>>
>> for (i = 0; i < TwoPhaseState->numPrepXacts; i++)
>> {
>> ......
>> gxact->locking_xid = GetTopTransactionId();
>>
>> LWLockRelease(TwoPhaseStateLock);
>>
>> return gxact;
>> }
>>
>> LWLockRelease(TwoPhaseStateLock);
>> ......
>> }
>>
>>
>> GetTopTransactionId() is blocked by acquiring another lock, but it is
>> invoked between the TwoPhaseStatLock's Acquire and Release.
>>
>> To fix it, I just call GetTopTransactionId() before
>> "LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE)" to enable the
>> TopTransactionId can be got directly later.
>>
>> diff --git a/src/backend/access/transam/twophase.c
>> b/src/backend/access/transam/twophase.c
>> index c39d9e6..1312e88 100644
>> --- a/src/backend/access/transam/twophase.c
>> +++ b/src/backend/access/transam/twophase.c
>> @@ -414,6 +414,8 @@ LockGXact(const char *gid, Oid user)
>> {
>> int i;
>>
>> + GetTopTransactionId();
>> +
>> LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE);
>>
>> for (i = 0; i < TwoPhaseState->numPrepXacts; i++)
>>
>>
>> Any commiter can help to review it and commit it to the Github master
>> branch?
> Can you please provide and patch, which fixes this problem?
The patch is a one-line fix and is in the email content... There is
even an analysis and backtraces. There is enough content to review it.
Regards,
--
Michael
|