diff options
Diffstat (limited to 'src/include/access/gin_private.h')
-rw-r--r-- | src/include/access/gin_private.h | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h index fce9e221607..4ff7c3755c7 100644 --- a/src/include/access/gin_private.h +++ b/src/include/access/gin_private.h @@ -13,9 +13,11 @@ #include "access/genam.h" #include "access/gin.h" #include "access/itup.h" +#include "access/transam.h" #include "fmgr.h" -#include "storage/bufmgr.h" #include "lib/rbtree.h" +#include "storage/bufmgr.h" +#include "utils/snapmgr.h" /* @@ -132,6 +134,15 @@ typedef struct GinMetaPageData #define GinPageRightMost(page) ( GinPageGetOpaque(page)->rightlink == InvalidBlockNumber) /* + * We should reclaim deleted page only once every transaction started before + * its deletion is over. + */ +#define GinPageGetDeleteXid(page) ( ((PageHeader) (page))->pd_prune_xid ) +#define GinPageSetDeleteXid(page, xid) ( ((PageHeader) (page))->pd_prune_xid = xid) +#define GinPageIsRecyclable(page) ( PageIsNew(page) || (GinPageIsDeleted(page) \ + && TransactionIdPrecedes(GinPageGetDeleteXid(page), RecentGlobalXmin))) + +/* * We use our own ItemPointerGet(BlockNumber|OffsetNumber) * to avoid Asserts, since sometimes the ip_posid isn't "valid" */ @@ -540,6 +551,7 @@ typedef struct ginxlogDeletePage { OffsetNumber parentOffset; BlockNumber rightLink; + TransactionId deleteXid; /* last Xid which could see this page in scan */ } ginxlogDeletePage; #define XLOG_GIN_UPDATE_META_PAGE 0x60 |