agora inbox for [email protected]
help / color / mirror / Atom feed[PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
22+ messages / 2 participants
[nested] [flat]
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping.
@ 2021-01-20 14:59 Kyotaro Horiguchi <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Kyotaro Horiguchi @ 2021-01-20 14:59 UTC (permalink / raw)
WAL-skipping optimization omits bumping page LSN when ALTER TABLE SET
TABLESPACE. Also heap_page_prune does the same. However,
old_snapshot_threshold feature needs page LSN to be kept updated on
these operations so that TestForOldSnapshot properly find identify
whether a snapshot is invalidated.
---
src/backend/access/heap/pruneheap.c | 14 ++++++++++++++
src/backend/catalog/storage.c | 8 ++++++++
src/include/storage/bufmgr.h | 3 ++-
src/include/utils/rel.h | 4 ++--
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index e3a716a2a2..33c0841b36 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -70,6 +70,8 @@ static void heap_prune_record_redirect(PruneState *prstate,
static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum);
static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum);
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* Optionally prune and repair fragmentation in the specified page.
@@ -331,6 +333,18 @@ heap_page_prune(Relation relation, Buffer buffer,
PageSetLSN(BufferGetPage(buffer), recptr);
}
+ else if (relation->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
+ {
+ XLogRecPtr currlsn = GetXLogInsertRecPtr();
+ Page page = BufferGetPage(buffer);
+
+ Assert(wal_level < WAL_LEVEL_REPLICA);
+
+ /* we need to update page LSN to notify reader of pruning */
+ if (PageGetLSN(page) == currlsn)
+ currlsn = gistXLogAssignLSN();
+ PageSetLSN(page, currlsn);
+ }
}
else
{
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index cba7a9ada0..488ac6f760 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -75,6 +75,8 @@ typedef struct PendingRelSync
static PendingRelDelete *pendingDeletes = NULL; /* head of linked list */
HTAB *pendingSyncHash = NULL;
+/* XXXXXXXX tmporary modification */
+extern XLogRecPtr gistXLogAssignLSN(void);
/*
* AddPendingSync
@@ -414,6 +416,7 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
bool copying_initfork;
BlockNumber nblocks;
BlockNumber blkno;
+ XLogRecPtr fakepagelsn;
page = (Page) buf.data;
@@ -434,6 +437,9 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
use_wal = XLogIsNeeded() &&
(relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork);
+ if (!use_wal)
+ fakepagelsn = gistXLogAssignLSN();
+
nblocks = smgrnblocks(src, forkNum);
for (blkno = 0; blkno < nblocks; blkno++)
@@ -460,6 +466,8 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
*/
if (use_wal)
log_newpage(&dst->smgr_rnode.node, forkNum, blkno, page, false);
+ else
+ PageSetLSN(page, fakepagelsn);
PageSetChecksumInplace(page, blkno);
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index e641174798..9ab9e7394c 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -19,6 +19,7 @@
#include "storage/buf.h"
#include "storage/bufpage.h"
#include "storage/relfilenode.h"
+#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/snapmgr.h"
@@ -289,7 +290,7 @@ TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page)
&& ((snapshot)->snapshot_type == SNAPSHOT_MVCC
|| (snapshot)->snapshot_type == SNAPSHOT_TOAST)
&& !XLogRecPtrIsInvalid((snapshot)->lsn)
- && (!XLogIsNeeded() || PageGetLSN(page) > (snapshot)->lsn))
+ && PageGetLSN(page) > (snapshot)->lsn)
TestForOldSnapshot_impl(snapshot, relation);
}
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f58d65cf28..35e53c8d74 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -618,8 +618,8 @@ typedef struct ViewOptions
* decoding snapshot.
*/
#define RelationIsAccessibleInLogicalDecoding(relation) \
- (XLogLogicalInfoActive() && \
- RelationNeedsWAL(relation) && \
+ (XLogLogicalInfoActive() && \
+ (relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT && \
(IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))
/*
--
2.27.0
----Next_Part(Thu_Jan_21_00_28_44_2021_003)----
^ permalink raw reply [nested|flat] 22+ messages in thread
* Status of cluster file encryption
@ 2022-05-26 21:08 Bruce Momjian <[email protected]>
0 siblings, 0 replies; 22+ messages in thread
From: Bruce Momjian @ 2022-05-26 21:08 UTC (permalink / raw)
To: pgsql-hackers; +Cc: Antonin Houska <[email protected]>; Stephen Frost <[email protected]>
Here is a status report of where I think we are with cluster file
encryption.
The last patch for temporary file I/O centralization is from April 20:
https://www.postgresql.org/message-id/24759.1650466826@antos
Once that is done I can modify my patch set to switch from CTR to XTS
mode and hook into the temporary file I/O centralization code. After
that, we need to work on the WAL encryption code and tool support.
Replication must also be handled.
I think once the temporary file I/O centralization is done we can
consider putting some of my patch set into the tree once PG 16 opens for
development --- the first step might be the key management feature.
I have updated my cluster file encryption presentation to show diagrams
of the architecture:
https://momjian.us/main/writings/pgsql/cfe.pdf
Hopefully that helps.
--
Bruce Momjian <[email protected]> https://momjian.us
EDB https://enterprisedb.com
Indecision is a decision. Inaction is an action. Mark Batterson
^ permalink raw reply [nested|flat] 22+ messages in thread
end of thread, other threads:[~2022-05-26 21:08 UTC | newest]
Thread overview: 22+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2021-01-20 14:59 [PATCH v5 3/3] Poc: Keep page-LSN updated while WAL-skipping. Kyotaro Horiguchi <[email protected]>
2022-05-26 21:08 Status of cluster file encryption Bruce Momjian <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox