diff options
| author | Tom Lane | 2004-07-01 00:52:04 +0000 |
|---|---|---|
| committer | Tom Lane | 2004-07-01 00:52:04 +0000 |
| commit | 573a71a5da70d6e2503c8f53e3b4f26b3b6d738d (patch) | |
| tree | 070f677b0043631518f83ce84ff201bf8fda700f /src/include/access | |
| parent | 4c9aa572fa2ee60e8ac557b866eccc7310df0a09 (diff) | |
Nested transactions. There is still much left to do, especially on the
performance front, but with feature freeze upon us I think it's time to
drive a stake in the ground and say that this will be in 7.5.
Alvaro Herrera, with some help from Tom Lane.
Diffstat (limited to 'src/include/access')
| -rw-r--r-- | src/include/access/clog.h | 15 | ||||
| -rw-r--r-- | src/include/access/gistscan.h | 3 | ||||
| -rw-r--r-- | src/include/access/hash.h | 3 | ||||
| -rw-r--r-- | src/include/access/htup.h | 67 | ||||
| -rw-r--r-- | src/include/access/rmgr.h | 4 | ||||
| -rw-r--r-- | src/include/access/rtree.h | 3 | ||||
| -rw-r--r-- | src/include/access/slru.h | 11 | ||||
| -rw-r--r-- | src/include/access/subtrans.h | 35 | ||||
| -rw-r--r-- | src/include/access/transam.h | 7 | ||||
| -rw-r--r-- | src/include/access/xact.h | 41 | ||||
| -rw-r--r-- | src/include/access/xlog.h | 4 |
11 files changed, 119 insertions, 74 deletions
diff --git a/src/include/access/clog.h b/src/include/access/clog.h index bd7f4152be3..2df1cedc1c9 100644 --- a/src/include/access/clog.h +++ b/src/include/access/clog.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/clog.h,v 1.8 2003/11/29 22:40:55 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/access/clog.h,v 1.9 2004/07/01 00:51:38 tgl Exp $ */ #ifndef CLOG_H #define CLOG_H @@ -16,13 +16,16 @@ /* * Possible transaction statuses --- note that all-zeroes is the initial * state. + * + * A "subcommitted" transaction is a committed subtransaction whose parent + * hasn't committed or aborted yet. */ typedef int XidStatus; #define TRANSACTION_STATUS_IN_PROGRESS 0x00 #define TRANSACTION_STATUS_COMMITTED 0x01 #define TRANSACTION_STATUS_ABORTED 0x02 -/* 0x03 is available without changing commit log space allocation */ +#define TRANSACTION_STATUS_SUB_COMMITTED 0x03 /* exported because lwlock.c needs it */ #define NUM_CLOG_BUFFERS 8 @@ -39,12 +42,6 @@ extern void ShutdownCLOG(void); extern void CheckPointCLOG(void); extern void ExtendCLOG(TransactionId newestXact); extern void TruncateCLOG(TransactionId oldestXact); - -/* XLOG stuff */ -#define CLOG_ZEROPAGE 0x00 - -extern void clog_redo(XLogRecPtr lsn, XLogRecord *record); -extern void clog_undo(XLogRecPtr lsn, XLogRecord *record); -extern void clog_desc(char *buf, uint8 xl_info, char *rec); +extern void clog_zeropage_redo(int pageno); #endif /* CLOG_H */ diff --git a/src/include/access/gistscan.h b/src/include/access/gistscan.h index b8466429959..4022f542752 100644 --- a/src/include/access/gistscan.h +++ b/src/include/access/gistscan.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/gistscan.h,v 1.22 2003/11/29 22:40:55 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/access/gistscan.h,v 1.23 2004/07/01 00:51:38 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -23,5 +23,6 @@ extern Datum gistrestrpos(PG_FUNCTION_ARGS); extern Datum gistendscan(PG_FUNCTION_ARGS); extern void gistadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum); extern void AtEOXact_gist(void); +extern void AtEOSubXact_gist(TransactionId childXid); #endif /* GISTSCAN_H */ diff --git a/src/include/access/hash.h b/src/include/access/hash.h index ffeea63417b..2088cc2f5a6 100644 --- a/src/include/access/hash.h +++ b/src/include/access/hash.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/hash.h,v 1.54 2003/11/29 22:40:55 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/access/hash.h,v 1.55 2004/07/01 00:51:38 tgl Exp $ * * NOTES * modeled after Margo Seltzer's hash implementation for unix. @@ -293,6 +293,7 @@ extern void _hash_regscan(IndexScanDesc scan); extern void _hash_dropscan(IndexScanDesc scan); extern bool _hash_has_active_scan(Relation rel, Bucket bucket); extern void AtEOXact_hash(void); +extern void AtEOSubXact_hash(TransactionId childXid); /* hashsearch.c */ extern bool _hash_next(IndexScanDesc scan, ScanDirection dir); diff --git a/src/include/access/htup.h b/src/include/access/htup.h index 3d48b5f45a3..fdcfc8dc6f1 100644 --- a/src/include/access/htup.h +++ b/src/include/access/htup.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.65 2004/04/01 21:28:45 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.66 2004/07/01 00:51:38 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -109,18 +109,14 @@ typedef struct HeapTupleFields { TransactionId t_xmin; /* inserting xact ID */ - - union - { - CommandId t_cmin; /* inserting command ID */ - TransactionId t_xmax; /* deleting xact ID */ - } t_field2; + CommandId t_cmin; /* inserting command ID */ + TransactionId t_xmax; /* deleting xact ID */ union { CommandId t_cmax; /* deleting command ID */ TransactionId t_xvac; /* VACUUM FULL xact ID */ - } t_field3; + } t_field4; } HeapTupleFields; typedef struct DatumTupleFields @@ -172,9 +168,7 @@ typedef HeapTupleHeaderData *HeapTupleHeader; * attribute(s) */ #define HEAP_HASEXTENDED 0x000C /* the two above combined */ #define HEAP_HASOID 0x0010 /* has an object-id field */ -/* bit 0x0020 is presently unused */ -#define HEAP_XMAX_IS_XMIN 0x0040 /* created and deleted in the same - * transaction */ +/* 0x0020 and 0x0040 are unused */ #define HEAP_XMAX_UNLOGGED 0x0080 /* to lock tuple for update * without logging */ #define HEAP_XMIN_COMMITTED 0x0100 /* t_xmin committed */ @@ -211,62 +205,47 @@ typedef HeapTupleHeaderData *HeapTupleHeader; #define HeapTupleHeaderGetXmax(tup) \ ( \ - ((tup)->t_infomask & HEAP_XMAX_IS_XMIN) ? \ - (tup)->t_choice.t_heap.t_xmin \ - : \ - (tup)->t_choice.t_heap.t_field2.t_xmax \ + (tup)->t_choice.t_heap.t_xmax \ ) #define HeapTupleHeaderSetXmax(tup, xid) \ -do { \ - TransactionId _newxid = (xid); \ - if (TransactionIdEquals((tup)->t_choice.t_heap.t_xmin, _newxid)) \ - (tup)->t_infomask |= HEAP_XMAX_IS_XMIN; \ - else \ - { \ - (tup)->t_infomask &= ~HEAP_XMAX_IS_XMIN; \ - TransactionIdStore(_newxid, &(tup)->t_choice.t_heap.t_field2.t_xmax); \ - } \ -} while (0) +( \ + TransactionIdStore((xid), &(tup)->t_choice.t_heap.t_xmax) \ +) -/* - * Note: GetCmin will produce wrong answers after SetXmax has been executed - * by a transaction other than the inserting one. We could check - * HEAP_XMAX_INVALID and return FirstCommandId if it's clear, but since that - * bit will be set again if the deleting transaction aborts, there'd be no - * real gain in safety from the extra test. So, just rely on the caller not - * to trust the value unless it's meaningful. - */ #define HeapTupleHeaderGetCmin(tup) \ ( \ - (tup)->t_choice.t_heap.t_field2.t_cmin \ + (tup)->t_choice.t_heap.t_cmin \ ) #define HeapTupleHeaderSetCmin(tup, cid) \ -do { \ - Assert((tup)->t_infomask & HEAP_XMAX_INVALID); \ - (tup)->t_choice.t_heap.t_field2.t_cmin = (cid); \ -} while (0) +( \ + (tup)->t_choice.t_heap.t_cmin = (cid) \ +) /* - * As with GetCmin, we can't completely ensure that GetCmax can detect whether - * a valid command ID is available, and there's little point in a partial test. + * Note: GetCmax will produce wrong answers after SetXvac has been executed + * by a transaction other than the inserting one. We could check + * HEAP_XMAX_INVALID and return FirstCommandId if it's clear, but since that + * bit will be set again if the deleting transaction aborts, there'd be no + * real gain in safety from the extra test. So, just rely on the caller not + * to trust the value unless it's meaningful. */ #define HeapTupleHeaderGetCmax(tup) \ ( \ - (tup)->t_choice.t_heap.t_field3.t_cmax \ + (tup)->t_choice.t_heap.t_field4.t_cmax \ ) #define HeapTupleHeaderSetCmax(tup, cid) \ do { \ Assert(!((tup)->t_infomask & HEAP_MOVED)); \ - (tup)->t_choice.t_heap.t_field3.t_cmax = (cid); \ + (tup)->t_choice.t_heap.t_field4.t_cmax = (cid); \ } while (0) #define HeapTupleHeaderGetXvac(tup) \ ( \ ((tup)->t_infomask & HEAP_MOVED) ? \ - (tup)->t_choice.t_heap.t_field3.t_xvac \ + (tup)->t_choice.t_heap.t_field4.t_xvac \ : \ InvalidTransactionId \ ) @@ -274,7 +253,7 @@ do { \ #define HeapTupleHeaderSetXvac(tup, xid) \ do { \ Assert((tup)->t_infomask & HEAP_MOVED); \ - TransactionIdStore((xid), &(tup)->t_choice.t_heap.t_field3.t_xvac); \ + TransactionIdStore((xid), &(tup)->t_choice.t_heap.t_field4.t_xvac); \ } while (0) #define HeapTupleHeaderGetDatumLength(tup) \ diff --git a/src/include/access/rmgr.h b/src/include/access/rmgr.h index e63e3fbc31d..7ea3134031d 100644 --- a/src/include/access/rmgr.h +++ b/src/include/access/rmgr.h @@ -3,7 +3,7 @@ * * Resource managers definition * - * $PostgreSQL: pgsql/src/include/access/rmgr.h,v 1.10 2003/11/29 22:40:55 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/access/rmgr.h,v 1.11 2004/07/01 00:51:38 tgl Exp $ */ #ifndef RMGR_H #define RMGR_H @@ -16,7 +16,7 @@ typedef uint8 RmgrId; #define RM_XLOG_ID 0 #define RM_XACT_ID 1 #define RM_SMGR_ID 2 -#define RM_CLOG_ID 3 +#define RM_SLRU_ID 3 #define RM_HEAP_ID 10 #define RM_BTREE_ID 11 #define RM_HASH_ID 12 diff --git a/src/include/access/rtree.h b/src/include/access/rtree.h index fdb33eba06f..5b5347e9a08 100644 --- a/src/include/access/rtree.h +++ b/src/include/access/rtree.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/rtree.h,v 1.32 2003/11/29 22:40:55 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/access/rtree.h,v 1.33 2004/07/01 00:51:38 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -130,6 +130,7 @@ extern void rtree_desc(char *buf, uint8 xl_info, char *rec); extern void rtadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum); extern void AtEOXact_rtree(void); +extern void AtEOSubXact_rtree(TransactionId childXid); /* rtstrat.c */ extern StrategyNumber RTMapToInternalOperator(StrategyNumber strat); diff --git a/src/include/access/slru.h b/src/include/access/slru.h index 213cca5c216..e3245fac658 100644 --- a/src/include/access/slru.h +++ b/src/include/access/slru.h @@ -6,11 +6,12 @@ * Portions Copyright (c) 2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/slru.h,v 1.6 2004/05/31 03:48:08 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/slru.h,v 1.7 2004/07/01 00:51:38 tgl Exp $ */ #ifndef SLRU_H #define SLRU_H +#include "access/xlog.h" #include "storage/lwlock.h" @@ -56,4 +57,12 @@ extern void SimpleLruSetLatestPage(SlruCtl ctl, int pageno); extern void SimpleLruFlush(SlruCtl ctl, bool checkpoint); extern void SimpleLruTruncate(SlruCtl ctl, int cutoffPage); +/* XLOG stuff */ +#define CLOG_ZEROPAGE 0x00 +#define SUBTRANS_ZEROPAGE 0x10 + +extern void slru_redo(XLogRecPtr lsn, XLogRecord *record); +extern void slru_undo(XLogRecPtr lsn, XLogRecord *record); +extern void slru_desc(char *buf, uint8 xl_info, char *rec); + #endif /* SLRU_H */ diff --git a/src/include/access/subtrans.h b/src/include/access/subtrans.h new file mode 100644 index 00000000000..2c601752d12 --- /dev/null +++ b/src/include/access/subtrans.h @@ -0,0 +1,35 @@ +/* + * subtrans.h + * + * PostgreSQL subtrans-log manager + * + * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * $PostgreSQL: pgsql/src/include/access/subtrans.h,v 1.1 2004/07/01 00:51:38 tgl Exp $ + */ +#ifndef SUBTRANS_H +#define SUBTRANS_H + +#include "access/xlog.h" + +/* exported because lwlock.c needs it */ +/* cannot be different from NUM_CLOG_BUFFERS without slru.c changes */ +#define NUM_SUBTRANS_BUFFERS NUM_CLOG_BUFFERS + +extern void SubTransSetParent(TransactionId xid, TransactionId parent); +extern TransactionId SubTransGetParent(TransactionId xid); +extern TransactionId SubTransGetTopmostTransaction(TransactionId xid); +extern bool SubTransXidsHaveCommonAncestor(TransactionId xid1, TransactionId xid2); + +extern int SUBTRANSShmemSize(void); +extern void SUBTRANSShmemInit(void); +extern void BootStrapSUBTRANS(void); +extern void StartupSUBTRANS(void); +extern void ShutdownSUBTRANS(void); +extern void CheckPointSUBTRANS(void); +extern void ExtendSUBTRANS(TransactionId newestXact); +extern void TruncateSUBTRANS(TransactionId oldestXact); +extern void subtrans_zeropage_redo(int pageno); + +#endif /* SUBTRANS_H */ diff --git a/src/include/access/transam.h b/src/include/access/transam.h index 3a2cad7bb03..44e0ff6ea75 100644 --- a/src/include/access/transam.h +++ b/src/include/access/transam.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/transam.h,v 1.48 2003/11/29 22:40:55 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/access/transam.h,v 1.49 2004/07/01 00:51:38 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -107,13 +107,16 @@ extern bool TransactionIdDidCommit(TransactionId transactionId); extern bool TransactionIdDidAbort(TransactionId transactionId); extern void TransactionIdCommit(TransactionId transactionId); extern void TransactionIdAbort(TransactionId transactionId); +extern void TransactionIdSubCommit(TransactionId transactionId); +extern void TransactionIdCommitTree(int nxids, TransactionId *xids); +extern void TransactionIdAbortTree(int nxids, TransactionId *xids); extern bool TransactionIdPrecedes(TransactionId id1, TransactionId id2); extern bool TransactionIdPrecedesOrEquals(TransactionId id1, TransactionId id2); extern bool TransactionIdFollows(TransactionId id1, TransactionId id2); extern bool TransactionIdFollowsOrEquals(TransactionId id1, TransactionId id2); /* in transam/varsup.c */ -extern TransactionId GetNewTransactionId(void); +extern TransactionId GetNewTransactionId(bool isSubXact); extern TransactionId ReadNewTransactionId(void); extern Oid GetNewObjectId(void); extern void CheckMaxObjectId(Oid assigned_oid); diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 53a585ec694..c5b66afd0df 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.63 2004/05/22 23:14:38 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.64 2004/07/01 00:51:38 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -63,7 +63,15 @@ typedef enum TBlockState TBLOCK_INPROGRESS, TBLOCK_END, TBLOCK_ABORT, - TBLOCK_ENDABORT + TBLOCK_ENDABORT, + + TBLOCK_SUBBEGIN, + TBLOCK_SUBBEGINABORT, + TBLOCK_SUBINPROGRESS, + TBLOCK_SUBEND, + TBLOCK_SUBABORT, + TBLOCK_SUBENDABORT_OK, + TBLOCK_SUBENDABORT_ERROR } TBlockState; /* @@ -76,12 +84,15 @@ typedef void (*EOXactCallback) (bool isCommit, void *arg); */ typedef struct TransactionStateData { - TransactionId transactionIdData; - CommandId commandId; - AbsoluteTime startTime; - int startTimeUsec; - TransState state; - TBlockState blockState; + TransactionId transactionIdData; /* my XID */ + CommandId commandId; /* current CID */ + TransState state; /* low-level state */ + TBlockState blockState; /* high-level state */ + int nestingLevel; /* nest depth */ + MemoryContext curTransactionContext; /* my xact-lifetime context */ + List *childXids; /* subcommitted child XIDs */ + AclId currentUser; /* subxact start current_user */ + struct TransactionStateData *parent; /* back link to parent */ } TransactionStateData; typedef TransactionStateData *TransactionState; @@ -102,9 +113,11 @@ typedef TransactionStateData *TransactionState; typedef struct xl_xact_commit { time_t xtime; + int nrels; /* number of RelFileNodes */ + int nsubxacts; /* number of subtransaction XIDs */ /* Array of RelFileNode(s) to drop at commit */ - /* The XLOG record length determines how many there are */ RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */ + /* ARRAY OF COMMITTED SUBTRANSACTION XIDs FOLLOWS */ } xl_xact_commit; #define MinSizeOfXactCommit offsetof(xl_xact_commit, xnodes) @@ -112,9 +125,11 @@ typedef struct xl_xact_commit typedef struct xl_xact_abort { time_t xtime; + int nrels; /* number of RelFileNodes */ + int nsubxacts; /* number of subtransaction XIDs */ /* Array of RelFileNode(s) to drop at abort */ - /* The XLOG record length determines how many there are */ RelFileNode xnodes[1]; /* VARIABLE LENGTH ARRAY */ + /* ARRAY OF ABORTED SUBTRANSACTION XIDs FOLLOWS */ } xl_xact_abort; #define MinSizeOfXactAbort offsetof(xl_xact_abort, xnodes) @@ -126,18 +141,20 @@ typedef struct xl_xact_abort */ extern bool IsTransactionState(void); extern bool IsAbortedTransactionBlockState(void); +extern TransactionId GetTopTransactionId(void); extern TransactionId GetCurrentTransactionId(void); extern CommandId GetCurrentCommandId(void); extern AbsoluteTime GetCurrentTransactionStartTime(void); extern AbsoluteTime GetCurrentTransactionStartTimeUsec(int *usec); +extern int GetCurrentTransactionNestLevel(void); extern bool TransactionIdIsCurrentTransactionId(TransactionId xid); -extern bool CommandIdIsCurrentCommandId(CommandId cid); extern void CommandCounterIncrement(void); extern void StartTransactionCommand(void); extern void CommitTransactionCommand(void); extern void AbortCurrentTransaction(void); extern void BeginTransactionBlock(void); extern void EndTransactionBlock(void); +extern bool IsSubTransaction(void); extern bool IsTransactionBlock(void); extern bool IsTransactionOrTransactionBlock(void); extern char TransactionBlockStatusCode(void); @@ -151,6 +168,8 @@ extern void UnregisterEOXactCallback(EOXactCallback callback, void *arg); extern void RecordTransactionCommit(void); +extern int xactGetCommittedChildren(TransactionId **ptr, bool metoo); + extern void XactPushRollback(void (*func) (void *), void *data); extern void XactPopRollback(void); diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 0e44e77446d..1c29ab07626 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.51 2004/05/29 22:48:22 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.52 2004/07/01 00:51:38 tgl Exp $ */ #ifndef XLOG_H #define XLOG_H @@ -111,7 +111,7 @@ typedef struct XLogContRecord /* * Each page of XLOG file has a header like this: */ -#define XLOG_PAGE_MAGIC 0xD05A /* can be used as WAL version indicator */ +#define XLOG_PAGE_MAGIC 0xD05B /* can be used as WAL version indicator */ typedef struct XLogPageHeaderData { |
