On 01/31/2017 05:03 PM, Konstantin Knizhnik wrote:
One more assertion failure:
ExceptionalCondition(conditionName = "!(OldPageRqstPtr <=
XLogCtl->InitializedUpTo)", errorType = "FailedAssertion", fileName =
"xlog.c", lineNumber = 1887), line 54 in "assert.c"
(dbx) p OldPageRqstPtr
(dbx) p XLogCtl->InitializedUpTo
(dbx) p InitializedUpTo
I slightly modify xlog.c code - store value of XLogCtl->InitializedUpTo
in local variable:
1870 LWLockAcquire(WALBufMappingLock, LW_EXCLUSIVE);
1873 * Now that we have the lock, check if someone
initialized the page
1874 * already.
1876 while (upto >= XLogCtl->InitializedUpTo || opportunistic)
1878 XLogRecPtr InitializedUpTo =
1879 nextidx = XLogRecPtrToBufIdx(InitializedUpTo);
1882 * Get ending-offset of the buffer page we need
to replace (this may
1883 * be zero if the buffer hasn't been used yet).
Fall through if it's
1884 * already written out.
1886 OldPageRqstPtr = XLogCtl->xlblocks[nextidx];
1887 Assert(OldPageRqstPtr <= XLogCtl->InitializedUpTo);
And, as you can see, XLogCtl->InitializedUpTo is not equal to saved
But we are under exclusive WALBufMappingLock and InitializedUpTo is
updated only under this lock.
So it means that LW-locks doesn't work!
Yeah, so it seems. XLogCtl->InitializeUpTo is quite clearly protected by
the WALBufMappingLock. All references to it (after StartupXLog) happen
while holding the lock.
Can you get the assembly output of the AdvanceXLInsertBuffer() function?
I wonder if the compiler is rearranging things so that
XLogCtl->InitializedUpTo is fetched before the LWLockAcquire call. Or
should there be a memory barrier instruction somewhere in LWLockAcquire?
Sent via pgsql-hackers mailing list (firstname.lastname@example.org)
To make changes to your subscription: