diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2005-06-27 12:45:23 +0000 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2005-06-27 12:45:23 +0000 |
commit | e8cab5fe49c45e9dc2990e36ecd6a42bf01dc4bc (patch) | |
tree | b4950c8a1550ce26aa276a157b8680732ae3ac9b /src/include/access/gist.h | |
parent | c3be085ab7a21e01f530357d962fa22f74a637ef (diff) | |
download | postgresql-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.h | 39 |
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 |