On Fri, Apr 14, 2017 at 9:33 PM, Pavan Deolasee <pavan.deola...@gmail.com> wrote:
> Since all those offsets fall on a page boundary, my guess is that we're > somehow failing to handle a new page correctly. > > Looking at the patch itself, my feeling is that the following code > in src/backend/access/transam/twophase.c might be causing the problem. > > 1841 > 1842 /* update nextXid if needed */ > 1843 if (TransactionIdFollowsOrEquals(maxsubxid, > ShmemVariableCache->nextXid)) > 1844 { > 1845 LWLockAcquire(XidGenLock, LW_EXCLUSIVE); > 1846 ShmemVariableCache->nextXid = maxsubxid; > 1847 TransactionIdAdvance(ShmemVariableCache->nextXid); > 1848 LWLockRelease(XidGenLock); > 1849 } > > The function PrescanPreparedTransactions() gets called at the start of > the redo recovery and this specific block will get exercised irrespective > of whether there are any prepared transactions or not. What I find > particularly wrong here is that we are initialising maxsubxid to current > value of ShmemVariableCache->nextXid when the function enters, but this > block would then again increment ShmemVariableCache->nextXid, when there > are no prepared transactions in the system. > > I wonder if we should do as in attached patch. > That solves it for me. Thanks, Jeff