diff options
Diffstat (limited to 'src/include/access/ginblock.h')
-rw-r--r-- | src/include/access/ginblock.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/include/access/ginblock.h b/src/include/access/ginblock.h index 553566529a4..f626c40ae3b 100644 --- a/src/include/access/ginblock.h +++ b/src/include/access/ginblock.h @@ -10,6 +10,7 @@ #ifndef GINBLOCK_H #define GINBLOCK_H +#include "access/transam.h" #include "storage/block.h" #include "storage/itemptr.h" #include "storage/off.h" @@ -128,6 +129,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" */ |