aboutsummaryrefslogtreecommitdiff
path: root/src/include/access/gist.h
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2005-06-27 12:45:23 +0000
committerTeodor Sigaev <teodor@sigaev.ru>2005-06-27 12:45:23 +0000
commite8cab5fe49c45e9dc2990e36ecd6a42bf01dc4bc (patch)
treeb4950c8a1550ce26aa276a157b8680732ae3ac9b /src/include/access/gist.h
parentc3be085ab7a21e01f530357d962fa22f74a637ef (diff)
downloadpostgresql-e8cab5fe49c45e9dc2990e36ecd6a42bf01dc4bc.tar.gz
postgresql-e8cab5fe49c45e9dc2990e36ecd6a42bf01dc4bc.zip
Concurrency for GiST
- full concurrency for insert/update/select/vacuum: - select and vacuum never locks more than one page simultaneously - select (gettuple) hasn't any lock across it's calls - insert never locks more than two page simultaneously: - during search of leaf to insert it locks only one page simultaneously - while walk upward to the root it locked only parent (may be non-direct parent) and child. One of them X-lock, another may be S- or X-lock - 'vacuum full' locks index - improve gistgetmulti - simplify XLOG records Fix bug in index_beginscan_internal: LockRelation may clean rd_aminfo structure, so move GET_REL_PROCEDURE after LockRelation
Diffstat (limited to 'src/include/access/gist.h')
-rw-r--r--src/include/access/gist.h39
1 files changed, 28 insertions, 11 deletions
diff --git a/src/include/access/gist.h b/src/include/access/gist.h
index bf9c1c712bb..ee060e83c2b 100644
--- a/src/include/access/gist.h
+++ b/src/include/access/gist.h
@@ -9,7 +9,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/access/gist.h,v 1.47 2005/06/20 10:29:36 teodor Exp $
+ * $PostgreSQL: pgsql/src/include/access/gist.h,v 1.48 2005/06/27 12:45:22 teodor Exp $
*
*-------------------------------------------------------------------------
*/
@@ -19,6 +19,8 @@
#include "storage/bufpage.h"
#include "storage/off.h"
#include "utils/rel.h"
+#include "access/xlog.h"
+#include "access/xlogdefs.h"
/*
* amproc indexes for GiST indexes.
@@ -39,9 +41,22 @@
#define F_DELETED (1 << 1)
#define F_TUPLES_DELETED (1 << 2)
+typedef XLogRecPtr GistNSN;
+
typedef struct GISTPageOpaqueData
{
- uint32 flags;
+ uint8 flags;
+
+ /* number page to which current one is splitted in last split */
+ uint8 nsplited;
+
+ /* level of page, 0 - leaf */
+ uint16 level;
+ BlockNumber rightlink;
+
+ /* the only meaning - change this value if
+ page split. */
+ GistNSN nsn;
} GISTPageOpaqueData;
typedef GISTPageOpaqueData *GISTPageOpaque;
@@ -90,18 +105,20 @@ typedef struct GISTENTRY
bool leafkey;
} GISTENTRY;
-#define GistPageIsLeaf(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags & F_LEAF)
+#define GistPageGetOpaque(page) ( (GISTPageOpaque) PageGetSpecialPointer(page) )
+
+#define GistPageIsLeaf(page) ( GistPageGetOpaque(page)->flags & F_LEAF)
#define GIST_LEAF(entry) (GistPageIsLeaf((entry)->page))
-#define GistPageSetLeaf(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags |= F_LEAF)
-#define GistPageSetNonLeaf(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags &= ~F_LEAF)
+#define GistPageSetLeaf(page) ( GistPageGetOpaque(page)->flags |= F_LEAF)
+#define GistPageSetNonLeaf(page) ( GistPageGetOpaque(page)->flags &= ~F_LEAF)
-#define GistPageIsDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags & F_DELETED)
-#define GistPageSetDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags |= F_DELETED)
-#define GistPageSetNonDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags &= ~F_DELETED)
+#define GistPageIsDeleted(page) ( GistPageGetOpaque(page)->flags & F_DELETED)
+#define GistPageSetDeleted(page) ( GistPageGetOpaque(page)->flags |= F_DELETED)
+#define GistPageSetNonDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_DELETED)
-#define GistTuplesDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags & F_TUPLES_DELETED)
-#define GistMarkTuplesDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags |= F_TUPLES_DELETED)
-#define GistClearTuplesDeleted(page) (((GISTPageOpaque) PageGetSpecialPointer(page))->flags &= ~F_TUPLES_DELETED)
+#define GistTuplesDeleted(page) ( GistPageGetOpaque(page)->flags & F_TUPLES_DELETED)
+#define GistMarkTuplesDeleted(page) ( GistPageGetOpaque(page)->flags |= F_TUPLES_DELETED)
+#define GistClearTuplesDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_TUPLES_DELETED)
/*
* Vector of GISTENTRY structs; user-defined methods union and pick