diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/transam/varsup.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c index 6453bad761c..9a40f7eabc3 100644 --- a/src/backend/access/transam/varsup.c +++ b/src/backend/access/transam/varsup.c @@ -6,7 +6,7 @@ * Copyright (c) 2000, PostgreSQL Global Development Group * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.51 2002/09/04 20:31:13 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.51.2.1 2004/01/26 19:16:40 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -45,10 +45,8 @@ GetNewTransactionId(void) xid = ShmemVariableCache->nextXid; - TransactionIdAdvance(ShmemVariableCache->nextXid); - /* - * If we have just allocated the first XID of a new page of the commit + * If we are allocating the first XID of a new page of the commit * log, zero out that commit-log page before returning. We must do * this while holding XidGenLock, else another xact could acquire and * commit a later XID before we zero the page. Fortunately, a page of @@ -58,6 +56,14 @@ GetNewTransactionId(void) ExtendCLOG(xid); /* + * Now advance the nextXid counter. This must not happen until after + * we have successfully completed ExtendCLOG() --- if that routine fails, + * we want the next incoming transaction to try it again. We cannot + * assign more XIDs until there is CLOG space for them. + */ + TransactionIdAdvance(ShmemVariableCache->nextXid); + + /* * Must set MyProc->xid before releasing XidGenLock. This ensures * that when GetSnapshotData calls ReadNewTransactionId, all active * XIDs before the returned value of nextXid are already present in @@ -74,7 +80,7 @@ GetNewTransactionId(void) * * A solution to the atomic-store problem would be to give each PGPROC * its own spinlock used only for fetching/storing that PGPROC's xid. - * (SInvalLock would then mean primarily that PROCs couldn't be added/ + * (SInvalLock would then mean primarily that PGPROCs couldn't be added/ * removed while holding the lock.) */ if (MyProc != (PGPROC *) NULL) |