diff options
author | Alvaro Herrera | 2008-03-26 16:20:48 +0000 |
---|---|---|
committer | Alvaro Herrera | 2008-03-26 16:20:48 +0000 |
commit | d43b085d578148f8dec2fea774912103e2f3044f (patch) | |
tree | 1be5ecca422dfe036fe9624355b4c952e7a8bc61 /src/include | |
parent | 2d7705e85e22c8798fe70234aed8161ed84fdaa8 (diff) |
Separate snapshot management code from tuple visibility code, create a
snapmgmt.c file for the former. The header files have also been reorganized
in three parts: the most basic snapshot definitions are now in a new file
snapshot.h, and the also new snapmgmt.h keeps the definitions for snapmgmt.c.
tqual.h has been reduced to the bare minimum.
This patch is just a first step towards managing live snapshots within a
transaction; there is no functionality change.
Per my proposal to pgsql-patches on 20080318191940.GB27458@alvh.no-ip.org and
subsequent discussion.
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/access/relscan.h | 5 | ||||
-rw-r--r-- | src/include/storage/large_object.h | 4 | ||||
-rw-r--r-- | src/include/storage/procarray.h | 5 | ||||
-rw-r--r-- | src/include/utils/snapmgmt.h | 33 | ||||
-rw-r--r-- | src/include/utils/snapshot.h | 62 | ||||
-rw-r--r-- | src/include/utils/tqual.h | 65 |
6 files changed, 106 insertions, 68 deletions
diff --git a/src/include/access/relscan.h b/src/include/access/relscan.h index 62a0276fd0..eebcc86bb3 100644 --- a/src/include/access/relscan.h +++ b/src/include/access/relscan.h @@ -7,16 +7,17 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/relscan.h,v 1.60 2008/01/14 01:39:09 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/relscan.h,v 1.61 2008/03/26 16:20:48 alvherre Exp $ * *------------------------------------------------------------------------- */ #ifndef RELSCAN_H #define RELSCAN_H +#include "access/htup.h" #include "access/skey.h" #include "storage/bufpage.h" -#include "utils/tqual.h" +#include "utils/snapshot.h" typedef struct HeapScanDescData diff --git a/src/include/storage/large_object.h b/src/include/storage/large_object.h index 5d538e3545..1430e7d63c 100644 --- a/src/include/storage/large_object.h +++ b/src/include/storage/large_object.h @@ -8,14 +8,14 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/large_object.h,v 1.39 2008/01/01 19:45:59 momjian Exp $ + * $PostgreSQL: pgsql/src/include/storage/large_object.h,v 1.40 2008/03/26 16:20:48 alvherre Exp $ * *------------------------------------------------------------------------- */ #ifndef LARGE_OBJECT_H #define LARGE_OBJECT_H -#include "utils/tqual.h" +#include "utils/snapshot.h" /*---------- diff --git a/src/include/storage/procarray.h b/src/include/storage/procarray.h index 26b27fa941..160b6c9670 100644 --- a/src/include/storage/procarray.h +++ b/src/include/storage/procarray.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/storage/procarray.h,v 1.20 2008/01/09 21:52:36 tgl Exp $ + * $PostgreSQL: pgsql/src/include/storage/procarray.h,v 1.21 2008/03/26 16:20:48 alvherre Exp $ * *------------------------------------------------------------------------- */ @@ -15,6 +15,7 @@ #define PROCARRAY_H #include "storage/lock.h" +#include "utils/snapshot.h" extern Size ProcArrayShmemSize(void); @@ -25,6 +26,8 @@ extern void ProcArrayRemove(PGPROC *proc, TransactionId latestXid); extern void ProcArrayEndTransaction(PGPROC *proc, TransactionId latestXid); extern void ProcArrayClearTransaction(PGPROC *proc); +extern Snapshot GetSnapshotData(Snapshot snapshot, bool serializable); + extern bool TransactionIdIsInProgress(TransactionId xid); extern bool TransactionIdIsActive(TransactionId xid); extern TransactionId GetOldestXmin(bool allDbs, bool ignoreVacuum); diff --git a/src/include/utils/snapmgmt.h b/src/include/utils/snapmgmt.h new file mode 100644 index 0000000000..349523ea2e --- /dev/null +++ b/src/include/utils/snapmgmt.h @@ -0,0 +1,33 @@ +/*------------------------------------------------------------------------- + * + * snapmgmt.h + * POSTGRES snapshot management definitions + * + * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * $PostgreSQL: pgsql/src/include/utils/snapmgmt.h,v 1.1 2008/03/26 16:20:48 alvherre Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef SNAPMGMT_H +#define SNAPMGMT_H + +#include "utils/snapshot.h" + + +extern PGDLLIMPORT Snapshot SerializableSnapshot; +extern PGDLLIMPORT Snapshot LatestSnapshot; +extern PGDLLIMPORT Snapshot ActiveSnapshot; + +extern TransactionId TransactionXmin; +extern TransactionId RecentXmin; +extern TransactionId RecentGlobalXmin; + +extern Snapshot GetTransactionSnapshot(void); +extern Snapshot GetLatestSnapshot(void); +extern Snapshot CopySnapshot(Snapshot snapshot); +extern void FreeSnapshot(Snapshot snapshot); +extern void FreeXactSnapshot(void); + +#endif /* SNAPMGMT_H */ diff --git a/src/include/utils/snapshot.h b/src/include/utils/snapshot.h new file mode 100644 index 0000000000..7dca978ee9 --- /dev/null +++ b/src/include/utils/snapshot.h @@ -0,0 +1,62 @@ +/*------------------------------------------------------------------------- + * + * snapshot.h + * POSTGRES snapshot definition + * + * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * $PostgreSQL: pgsql/src/include/utils/snapshot.h,v 1.1 2008/03/26 16:20:48 alvherre Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef SNAPSHOT_H +#define SNAPSHOT_H + +#include "access/htup.h" +#include "storage/buf.h" + + +typedef struct SnapshotData *Snapshot; + +#define InvalidSnapshot ((Snapshot) NULL) + +/* + * We use SnapshotData structures to represent both "regular" (MVCC) + * snapshots and "special" snapshots that have non-MVCC semantics. + * The specific semantics of a snapshot are encoded by the "satisfies" + * function. + */ +typedef bool (*SnapshotSatisfiesFunc) (HeapTupleHeader tuple, + Snapshot snapshot, Buffer buffer); + +typedef struct SnapshotData +{ + SnapshotSatisfiesFunc satisfies; /* tuple test function */ + + /* + * The remaining fields are used only for MVCC snapshots, and are normally + * just zeroes in special snapshots. (But xmin and xmax are used + * specially by HeapTupleSatisfiesDirty.) + * + * An MVCC snapshot can never see the effects of XIDs >= xmax. It can see + * the effects of all older XIDs except those listed in the snapshot. xmin + * is stored as an optimization to avoid needing to search the XID arrays + * for most tuples. + */ + TransactionId xmin; /* all XID < xmin are visible to me */ + TransactionId xmax; /* all XID >= xmax are invisible to me */ + uint32 xcnt; /* # of xact ids in xip[] */ + TransactionId *xip; /* array of xact IDs in progress */ + /* note: all ids in xip[] satisfy xmin <= xip[i] < xmax */ + int32 subxcnt; /* # of xact ids in subxip[], -1 if overflow */ + TransactionId *subxip; /* array of subxact IDs in progress */ + + /* + * note: all ids in subxip[] are >= xmin, but we don't bother filtering + * out any that are >= xmax + */ + CommandId curcid; /* in my xact, CID < curcid are visible */ +} SnapshotData; + +#endif /* SNAPSHOT_H */ diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h index a0399bd331..c9e078369f 100644 --- a/src/include/utils/tqual.h +++ b/src/include/utils/tqual.h @@ -8,59 +8,16 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/tqual.h,v 1.71 2008/01/01 19:45:59 momjian Exp $ + * $PostgreSQL: pgsql/src/include/utils/tqual.h,v 1.72 2008/03/26 16:20:48 alvherre Exp $ * *------------------------------------------------------------------------- */ #ifndef TQUAL_H #define TQUAL_H -#include "access/htup.h" -#include "storage/buf.h" +#include "utils/snapshot.h" -/* - * We use SnapshotData structures to represent both "regular" (MVCC) - * snapshots and "special" snapshots that have non-MVCC semantics. - * The specific semantics of a snapshot are encoded by the "satisfies" - * function. - */ -typedef struct SnapshotData *Snapshot; - -typedef bool (*SnapshotSatisfiesFunc) (HeapTupleHeader tuple, - Snapshot snapshot, Buffer buffer); - -typedef struct SnapshotData -{ - SnapshotSatisfiesFunc satisfies; /* tuple test function */ - - /* - * The remaining fields are used only for MVCC snapshots, and are normally - * just zeroes in special snapshots. (But xmin and xmax are used - * specially by HeapTupleSatisfiesDirty.) - * - * An MVCC snapshot can never see the effects of XIDs >= xmax. It can see - * the effects of all older XIDs except those listed in the snapshot. xmin - * is stored as an optimization to avoid needing to search the XID arrays - * for most tuples. - */ - TransactionId xmin; /* all XID < xmin are visible to me */ - TransactionId xmax; /* all XID >= xmax are invisible to me */ - uint32 xcnt; /* # of xact ids in xip[] */ - TransactionId *xip; /* array of xact IDs in progress */ - /* note: all ids in xip[] satisfy xmin <= xip[i] < xmax */ - int32 subxcnt; /* # of xact ids in subxip[], -1 if overflow */ - TransactionId *subxip; /* array of subxact IDs in progress */ - - /* - * note: all ids in subxip[] are >= xmin, but we don't bother filtering - * out any that are >= xmax - */ - CommandId curcid; /* in my xact, CID < curcid are visible */ -} SnapshotData; - -#define InvalidSnapshot ((Snapshot) NULL) - /* Static variables representing various special snapshot semantics */ extern PGDLLIMPORT SnapshotData SnapshotNowData; extern PGDLLIMPORT SnapshotData SnapshotSelfData; @@ -84,15 +41,6 @@ extern PGDLLIMPORT SnapshotData SnapshotToastData; #define IsMVCCSnapshot(snapshot) \ ((snapshot)->satisfies == HeapTupleSatisfiesMVCC) - -extern PGDLLIMPORT Snapshot SerializableSnapshot; -extern PGDLLIMPORT Snapshot LatestSnapshot; -extern PGDLLIMPORT Snapshot ActiveSnapshot; - -extern TransactionId TransactionXmin; -extern TransactionId RecentXmin; -extern TransactionId RecentGlobalXmin; - /* * HeapTupleSatisfiesVisibility * True iff heap tuple satisfies a time qual. @@ -149,13 +97,4 @@ extern HTSV_Result HeapTupleSatisfiesVacuum(HeapTupleHeader tuple, extern void HeapTupleSetHintBits(HeapTupleHeader tuple, Buffer buffer, uint16 infomask, TransactionId xid); -extern Snapshot GetTransactionSnapshot(void); -extern Snapshot GetLatestSnapshot(void); -extern Snapshot CopySnapshot(Snapshot snapshot); -extern void FreeSnapshot(Snapshot snapshot); -extern void FreeXactSnapshot(void); - -/* in procarray.c; declared here to avoid including tqual.h in procarray.h: */ -extern Snapshot GetSnapshotData(Snapshot snapshot, bool serializable); - #endif /* TQUAL_H */ |