aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Geoghegan <pg@bowt.ie>2023-04-19 10:42:39 -0700
committerPeter Geoghegan <pg@bowt.ie>2023-04-19 10:42:39 -0700
commit50547a3fae0ce62e74c1d2175c7949937f2c69fc (patch)
treee7d7b434c990970111d5d53d74348233c112f768 /src
parent9e1e9d6560ec60535289ac15729a08e2f7cf4165 (diff)
downloadpostgresql-50547a3fae0ce62e74c1d2175c7949937f2c69fc.tar.gz
postgresql-50547a3fae0ce62e74c1d2175c7949937f2c69fc.zip
Fix wal_consistency_checking enhanced desc output.
Recent enhancements to rmgr desc routines that made the output summarize certain block data (added by commits 7d8219a4 and 1c453cfd) dealt with records that lack relevant block data (and so have nothing to give a more detailed summary of) by testing !DecodedBkpBlock.has_image. As a result, more detailed descriptions of block data were not output when wal_consistency_checking was enabled. This bug affected records with summarizable block data that also happened to have an FPI that the REDO routine isn't supposed to apply (FPIs used for consistency checking purposes only). The presence of such an FPI was incorrectly taken to indicate the absence of block data. To fix, test DecodedBkpBlock.has_data, not !DecodedBkpBlock.has_image. This is the exact condition that we care about, not an inexact proxy. Author: Peter Geoghegan <pg@bowt.ie> Discussion: https://postgr.es/m/CAH2-Wzm5Sc9cBg1qWV_cEBfLNJCrW9FjS-SoHVt8FLA7Ldn8yg@mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/rmgrdesc/heapdesc.c8
-rw-r--r--src/backend/access/rmgrdesc/nbtdesc.c4
-rw-r--r--src/include/access/xlogreader.h2
3 files changed, 8 insertions, 6 deletions
diff --git a/src/backend/access/rmgrdesc/heapdesc.c b/src/backend/access/rmgrdesc/heapdesc.c
index 1c0fbb3e8cc..d73248abddf 100644
--- a/src/backend/access/rmgrdesc/heapdesc.c
+++ b/src/backend/access/rmgrdesc/heapdesc.c
@@ -184,7 +184,7 @@ heap2_desc(StringInfo buf, XLogReaderState *record)
xlrec->nredirected,
xlrec->ndead);
- if (!XLogRecHasBlockImage(record, 0))
+ if (XLogRecHasBlockData(record, 0))
{
OffsetNumber *end;
OffsetNumber *redirected;
@@ -223,7 +223,7 @@ heap2_desc(StringInfo buf, XLogReaderState *record)
appendStringInfo(buf, "nunused: %u", xlrec->nunused);
- if (!XLogRecHasBlockImage(record, 0))
+ if (XLogRecHasBlockData(record, 0))
{
OffsetNumber *nowunused;
@@ -241,7 +241,7 @@ heap2_desc(StringInfo buf, XLogReaderState *record)
appendStringInfo(buf, "snapshotConflictHorizon: %u, nplans: %u",
xlrec->snapshotConflictHorizon, xlrec->nplans);
- if (!XLogRecHasBlockImage(record, 0))
+ if (XLogRecHasBlockData(record, 0))
{
xl_heap_freeze_plan *plans;
OffsetNumber *offsets;
@@ -270,7 +270,7 @@ heap2_desc(StringInfo buf, XLogReaderState *record)
appendStringInfo(buf, "ntuples: %d, flags: 0x%02X", xlrec->ntuples,
xlrec->flags);
- if (!XLogRecHasBlockImage(record, 0) && !isinit)
+ if (XLogRecHasBlockData(record, 0) && !isinit)
{
appendStringInfoString(buf, ", offsets:");
array_desc(buf, xlrec->offsets, sizeof(OffsetNumber),
diff --git a/src/backend/access/rmgrdesc/nbtdesc.c b/src/backend/access/rmgrdesc/nbtdesc.c
index c50d5547de8..281a015f563 100644
--- a/src/backend/access/rmgrdesc/nbtdesc.c
+++ b/src/backend/access/rmgrdesc/nbtdesc.c
@@ -62,7 +62,7 @@ btree_desc(StringInfo buf, XLogReaderState *record)
appendStringInfo(buf, "ndeleted: %u, nupdated: %u",
xlrec->ndeleted, xlrec->nupdated);
- if (!XLogRecHasBlockImage(record, 0))
+ if (XLogRecHasBlockData(record, 0))
delvacuum_desc(buf, XLogRecGetBlockData(record, 0, NULL),
xlrec->ndeleted, xlrec->nupdated);
break;
@@ -75,7 +75,7 @@ btree_desc(StringInfo buf, XLogReaderState *record)
xlrec->snapshotConflictHorizon,
xlrec->ndeleted, xlrec->nupdated);
- if (!XLogRecHasBlockImage(record, 0))
+ if (XLogRecHasBlockData(record, 0))
delvacuum_desc(buf, XLogRecGetBlockData(record, 0, NULL),
xlrec->ndeleted, xlrec->nupdated);
break;
diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h
index d77bb2ab9bc..30d20c323e6 100644
--- a/src/include/access/xlogreader.h
+++ b/src/include/access/xlogreader.h
@@ -423,6 +423,8 @@ extern bool DecodeXLogRecord(XLogReaderState *state,
((decoder)->record->blocks[block_id].has_image)
#define XLogRecBlockImageApply(decoder, block_id) \
((decoder)->record->blocks[block_id].apply_image)
+#define XLogRecHasBlockData(decoder, block_id) \
+ ((decoder)->record->blocks[block_id].has_data)
#ifndef FRONTEND
extern FullTransactionId XLogRecGetFullXid(XLogReaderState *record);