diff options
author | Vadim B. Mikheev <vadim4o@yahoo.com> | 1999-06-03 13:33:13 +0000 |
---|---|---|
committer | Vadim B. Mikheev <vadim4o@yahoo.com> | 1999-06-03 13:33:13 +0000 |
commit | 5541abee0dd56669ef0e9a87121e449d905c3efd (patch) | |
tree | da8503c579bfc40595d1183f681ebd7901bfdab3 /src/backend/access/transam/xact.c | |
parent | f103501286d8daf9073dc71a6f3ac2e532e6ef5b (diff) |
1. Additional fix against ERROR: Child itemid marked as unused
in CommitTransaction().
2. Changes in GetSnapshotData().
Diffstat (limited to 'src/backend/access/transam/xact.c')
-rw-r--r-- | src/backend/access/transam/xact.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 6884e635904..6bde05733ac 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.38 1999/06/03 04:41:41 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.39 1999/06/03 13:33:12 vadim Exp $ * * NOTES * Transaction aborts can now occur two ways: @@ -646,18 +646,6 @@ RecordTransactionCommit() FlushBufferPool(!TransactionFlushEnabled()); if (leak) ResetBufferPool(); - - /* - * Let others know about no transaction in progress. - * Note that this must be done _before_ releasing locks - * we hold or bad (too high) XmaxRecent value might be - * used by vacuum. - */ - if (MyProc != (PROC *) NULL) - { - MyProc->xid = InvalidTransactionId; - MyProc->xmin = InvalidTransactionId; - } } @@ -950,6 +938,28 @@ CommitTransaction() DestroyNoNameRels(); AtEOXact_portals(); RecordTransactionCommit(); + + /* + * 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 + * 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 + */ + if (MyProc != (PROC *) NULL) + { + SpinAcquire(ShmemIndexLock); + MyProc->xid = InvalidTransactionId; + MyProc->xmin = InvalidTransactionId; + SpinRelease(ShmemIndexLock); + } + RelationPurgeLocalRelation(true); AtCommit_Cache(); AtCommit_Locks(); |