diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c index fd23de1d98..0ec7ede4e7 100644 --- a/src/backend/access/transam/varsup.c +++ b/src/backend/access/transam/varsup.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.21 1999/06/03 04:41:40 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.22 1999/06/06 20:19:33 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -335,16 +335,13 @@ ReadNewTransactionId(TransactionId *xid) SpinAcquire(OidGenLockId); /* not good for concurrency... */ - if (ShmemVariableCache->xid_count == 0) - { - TransactionId nextid; - - VariableRelationGetNextXid(&nextid); - TransactionIdStore(nextid, &(ShmemVariableCache->nextXid)); - ShmemVariableCache->xid_count = VAR_XID_PREFETCH; - TransactionIdAdd(&nextid, VAR_XID_PREFETCH); - VariableRelationPutNextXid(nextid); - } + /* + * Note that we don't check is ShmemVariableCache->xid_count equal + * to 0 or not. This will work as long as we don't call + * ReadNewTransactionId() before GetNewTransactionId(). + */ + if (ShmemVariableCache->nextXid == 0) + elog(ERROR, "ReadNewTransactionId: ShmemVariableCache->nextXid is not initialized"); TransactionIdStore(ShmemVariableCache->nextXid, xid); diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 6bde05733a..d03136b508 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.39 1999/06/03 13:33:12 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.40 1999/06/06 20:19:34 vadim Exp $ * * NOTES * Transaction aborts can now occur two ways: @@ -942,15 +942,11 @@ CommitTransaction() /* * Let others know about no transaction in progress by me. * Note that this must be done _before_ releasing locks we hold - * and SpinAcquire(ShmemIndexLock) is required - or bad (too high) - * XmaxRecent value might be used by vacuum: UPDATE with xid 0 is + * and SpinAcquire(ShmemIndexLock) is required: UPDATE with xid 0 is * blocked by xid 1' UPDATE, xid 1 is doing commit while xid 2 * gets snapshot - if xid 2' GetSnapshotData sees xid 1 as running - * then it must see xid 0 as running as well or XmaxRecent = 1 - * might be used by concurrent vacuum causing - * ERROR: Child itemid marked as unused - * This bug was reported by Hiroshi Inoue and I was able to reproduce - * it with 3 sessions and gdb. - vadim 06/03/99 + * then it must see xid 0 as running as well or it will see two + * tuple versions - one deleted by xid 1 and one inserted by xid 0. */ if (MyProc != (PROC *) NULL) { diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 80a554d7d9..7c1a8cd600 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.106 1999/06/03 13:25:54 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.107 1999/06/06 20:19:34 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -1238,11 +1238,28 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel, Citemid = PageGetItemId(Cpage, ItemPointerGetOffsetNumber(&Ctid)); if (!ItemIdIsUsed(Citemid)) - elog(ERROR, "Child itemid marked as unused"); + { + /* + * This means that in the middle of chain there was + * tuple updated by older (than XmaxRecent) xaction + * and this tuple is already deleted by me. Actually, + * upper part of chain should be removed and seems + * that this should be handled in vc_scanheap(), but + * it's not implemented at the moment and so we + * just stop shrinking here. + */ + ReleaseBuffer(Cbuf); + pfree(vtmove); + vtmove = NULL; + elog(NOTICE, "Child itemid in update-chain marked as unused - can't continue vc_rpfheap"); + break; + } tp.t_data = (HeapTupleHeader) PageGetItem(Cpage, Citemid); tp.t_self = Ctid; tlen = tp.t_len = ItemIdGetLength(Citemid); } + if (vtmove == NULL) + break; /* first, can chain be moved ? */ for (;;) { @@ -1336,6 +1353,7 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel, Ptp.t_data = (HeapTupleHeader) PageGetItem(Ppage, Pitemid); Assert(Ptp.t_data->t_xmax == tp.t_data->t_xmin); +#ifdef NOT_USED /* I'm not sure that this will wotk properly... */ /* * If this tuple is updated version of row and it * was created by the same transaction then no one @@ -1353,6 +1371,7 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel, WriteBuffer(Pbuf); continue; } +#endif tp.t_data = Ptp.t_data; tlen = tp.t_len = ItemIdGetLength(Pitemid); if (freeCbuf) @@ -1763,7 +1782,7 @@ Elapsed %u/%u sec.", page = BufferGetPage(buf); num_tuples = 0; for (offnum = FirstOffsetNumber; - offnum < maxoff; + offnum <= maxoff; offnum = OffsetNumberNext(offnum)) { itemid = PageGetItemId(page, offnum); diff --git a/src/backend/storage/buffer/s_lock.c b/src/backend/storage/buffer/s_lock.c index 38370ea1e9..cf25e7e06c 100644 --- a/src/backend/storage/buffer/s_lock.c +++ b/src/backend/storage/buffer/s_lock.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/buffer/Attic/s_lock.c,v 1.20 1999/05/25 22:04:32 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/buffer/Attic/s_lock.c,v 1.21 1999/06/06 20:19:35 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -28,7 +28,7 @@ * note: total time to cycle through all 16 entries might be about .07 sec. */ #define S_NSPINCYCLE 20 -#define S_MAX_BUSY 500 * S_NSPINCYCLE +#define S_MAX_BUSY 1000 * S_NSPINCYCLE int s_spincycle[S_NSPINCYCLE] = {0, 0, 0, 0, 10000, 0, 0, 0, 10000, 0, diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index 04cfa1a812..e317c0e1ad 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.41 1999/06/03 13:33:13 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/ipc/shmem.c,v 1.42 1999/06/06 20:19:35 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -652,9 +652,15 @@ GetSnapshotData(bool serializable) snapshot->xip = (TransactionId *) malloc(have * sizeof(TransactionId)); snapshot->xmin = cid; - ReadNewTransactionId(&(snapshot->xmax)); SpinAcquire(ShmemIndexLock); + /* + * Unfortunately, we have to call ReadNewTransactionId() + * after acquiring ShmemIndexLock above. It's not good because of + * ReadNewTransactionId() does SpinAcquire(OidGenLockId) but + * _necessary_. + */ + ReadNewTransactionId(&(snapshot->xmax)); hash_seq((HTAB *) NULL); while ((result = (ShmemIndexEnt *) hash_seq(ShmemIndex)) != NULL)