*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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);
*
*
* 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:
/*
* 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)
{
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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 (;;)
{
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
WriteBuffer(Pbuf);
continue;
}
+#endif
tp.t_data = Ptp.t_data;
tlen = tp.t_len = ItemIdGetLength(Pitemid);
if (freeCbuf)
page = BufferGetPage(buf);
num_tuples = 0;
for (offnum = FirstOffsetNumber;
- offnum < maxoff;
+ offnum <= maxoff;
offnum = OffsetNumberNext(offnum))
{
itemid = PageGetItemId(page, offnum);
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
* 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,
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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)