Hiroshi Inoue wrote:
>
> However,when I did vacuum while testing I got the following error
> message.
> ERROR: Child itemid marked as unused
>
> TransactionId-s of tuples in update chain may be out of order.
1. Fix and explanation in xact.c:CommitTransaction():
RecordTransactionCommit();
/* * Let others know about no transaction in progress by me. * Note that this must be done _before_ releasing
lockswe hold * and SpinAcquire(ShmemIndexLock) is required - or bad (too high) * XmaxRecent value might be used
byvacuum: UPDATE with xid 0 is * blocked by xid 1' UPDATE, xid 1 is doing commit while xid 2 * gets snapshot - if
xid2' GetSnapshotData sees xid 1 as running * then it must see xid 0 as running as well or XmaxRecent = 1 * might
beused by concurrent vacuum causing * ERROR: Child itemid marked as unused * This bug was reported by
HiroshiInoue and I was able to reproduce * it with 3 sessions and gdb. - vadim 06/03/99 */ if (MyProc != (PROC
*)NULL) { SpinAcquire(ShmemIndexLock); MyProc->xid = InvalidTransactionId; MyProc->xmin =
InvalidTransactionId; SpinRelease(ShmemIndexLock); }
2. It was possible to get two versions of the same row from select. Fixed by moving MyProc->xid assignment from
StartTransaction()inside GetNewTransactionId().
Thanks, Hiroshi! And please run your tests - I used just
3 sessions and gdb.
Vadim