aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/access/ginblock.h10
-rw-r--r--src/include/access/ginxlog.h1
2 files changed, 11 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"
*/
diff --git a/src/include/access/ginxlog.h b/src/include/access/ginxlog.h
index 64a3c9e18b4..b2f3126aa8a 100644
--- a/src/include/access/ginxlog.h
+++ b/src/include/access/ginxlog.h
@@ -158,6 +158,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