diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2009-11-23 09:59:11 +0000 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2009-11-23 09:59:11 +0000 |
commit | 26a13b72421f6d54077db23200326536ece2cf7c (patch) | |
tree | 890d117f7806119ff1b676573a0505a802ab6cb7 /src/include/access/multixact.h | |
parent | 22452fa96f6c748f72da039f5b24787f1f3f1484 (diff) | |
download | postgresql-26a13b72421f6d54077db23200326536ece2cf7c.tar.gz postgresql-26a13b72421f6d54077db23200326536ece2cf7c.zip |
Fix an old bug in multixact and two-phase commit. Prepared transactions can
be part of multixacts, so allocate a slot for each prepared transaction in
the "oldest member" array in multixact.c. On PREPARE TRANSACTION, transfer
the oldest member value from the current backends slot to the prepared xact
slot. Also save and recover the value from the 2pc state file.
The symptom of the bug was that after a transaction prepared, a shared lock
still held by the prepared transaction was sometimes ignored by other
transactions.
Fix back to 8.1, where both 2PC and multixact were introduced.
Diffstat (limited to 'src/include/access/multixact.h')
-rw-r--r-- | src/include/access/multixact.h | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/include/access/multixact.h b/src/include/access/multixact.h index 208226916b4..3656edfc67a 100644 --- a/src/include/access/multixact.h +++ b/src/include/access/multixact.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/multixact.h,v 1.11 2006/11/17 18:00:15 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/multixact.h,v 1.11.2.1 2009/11/23 09:59:11 heikki Exp $ */ #ifndef MULTIXACT_H #define MULTIXACT_H @@ -52,6 +52,8 @@ extern void MultiXactIdSetOldestMember(void); extern int GetMultiXactIdMembers(MultiXactId multi, TransactionId **xids); extern void AtEOXact_MultiXact(void); +extern void AtPrepare_MultiXact(void); +extern void PostPrepare_MultiXact(TransactionId xid); extern Size MultiXactShmemSize(void); extern void MultiXactShmemInit(void); @@ -67,6 +69,13 @@ extern void MultiXactSetNextMXact(MultiXactId nextMulti, extern void MultiXactAdvanceNextMXact(MultiXactId minMulti, MultiXactOffset minMultiOffset); +extern void multixact_twophase_recover(TransactionId xid, uint16 info, + void *recdata, uint32 len); +extern void multixact_twophase_postcommit(TransactionId xid, uint16 info, + void *recdata, uint32 len); +extern void multixact_twophase_postabort(TransactionId xid, uint16 info, + void *recdata, uint32 len); + extern void multixact_redo(XLogRecPtr lsn, XLogRecord *record); extern void multixact_desc(StringInfo buf, uint8 xl_info, char *rec); |