0003-debug-checksums-injection-points.patch
text/x-patch
Filename: 0003-debug-checksums-injection-points.patch
Type: text/x-patch
Part: 2
From 1e58b18a70502339c5608ba352f6e351f6114359 Mon Sep 17 00:00:00 2001
From: test <test>
Date: Fri, 1 May 2026 22:14:18 +0200
Subject: [PATCH 03/13] debug: checksums injection points
---
src/backend/access/transam/xlog.c | 74 ++++++++++++++++++++++++++++++-
1 file changed, 72 insertions(+), 2 deletions(-)
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 72110d92c8b..8dd003d25e2 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -4759,6 +4759,13 @@ SetDataChecksumsOnInProgress(void)
elog(LOG, "SetDataChecksumsOnInProgress / start");
+ INJECTION_POINT("datachecksums-enable-inprogress-checksums-start", NULL);
+
+ /* load before critical section */
+ INJECTION_POINT_LOAD("datachecksums-enable-inprogress-checksums-after-xlog");
+ INJECTION_POINT_LOAD("datachecksums-enable-inprogress-checksums-after-xlogctl");
+ INJECTION_POINT_LOAD("datachecksums-enable-inprogress-checksums-after-controlfile");
+
/*
* The state transition is performed in a critical section with
* checkpoints held off to provide crash safety.
@@ -4768,6 +4775,8 @@ SetDataChecksumsOnInProgress(void)
XLogChecksums(PG_DATA_CHECKSUM_INPROGRESS_ON);
+ INJECTION_POINT_CACHED("datachecksums-enable-inprogress-checksums-after-xlog", NULL);
+
SpinLockAcquire(&XLogCtl->info_lck);
data_checksum_version = XLogCtl->data_checksum_version;
XLogCtl->data_checksum_version = PG_DATA_CHECKSUM_INPROGRESS_ON;
@@ -4776,6 +4785,8 @@ SetDataChecksumsOnInProgress(void)
elog(LOG, "SetDataChecksumsOnInProgress XLogCtl->data_checksum_version %u => %u",
data_checksum_version, PG_DATA_CHECKSUM_INPROGRESS_ON);
+ INJECTION_POINT_CACHED("datachecksums-enable-inprogress-checksums-after-xlogctl", NULL);
+
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
elog(LOG, "SetDataChecksumsOnInProgress ControlFile->data_checksum_version %u => %u",
@@ -4785,15 +4796,21 @@ SetDataChecksumsOnInProgress(void)
UpdateControlFile();
LWLockRelease(ControlFileLock);
+ INJECTION_POINT_CACHED("datachecksums-enable-inprogress-checksums-after-controlfile", NULL);
+
elog(LOG, "SetDataChecksumsOnInProgress / EmitProcSignalBarrier(PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_ON)");
barrier = EmitProcSignalBarrier(PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_ON);
MyProc->delayChkptFlags &= ~DELAY_CHKPT_START;
END_CRIT_SECTION();
+ INJECTION_POINT("datachecksums-enable-inprogress-checksums-before-barrier-wait", NULL);
+
elog(LOG, "SetDataChecksumsOnInProgress / WaitForProcSignalBarrier(PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_ON)");
WaitForProcSignalBarrier(barrier);
+ INJECTION_POINT("datachecksums-enable-inprogress-checksums-end", NULL);
+
elog(LOG, "SetDataChecksumsOnInProgress / end");
}
@@ -4846,12 +4863,20 @@ SetDataChecksumsOn(void)
SpinLockRelease(&XLogCtl->info_lck);
- INJECTION_POINT("datachecksums-enable-checksums-delay", NULL);
+ INJECTION_POINT("datachecksums-enable-checksums-start", NULL);
+
+ /* load before critical section */
+ INJECTION_POINT_LOAD("datachecksums-enable-checksums-after-xlog");
+ INJECTION_POINT_LOAD("datachecksums-enable-checksums-after-xlogctl");
+ INJECTION_POINT_LOAD("datachecksums-enable-checksums-after-controlfile");
+
START_CRIT_SECTION();
MyProc->delayChkptFlags |= DELAY_CHKPT_START;
XLogChecksums(PG_DATA_CHECKSUM_VERSION);
+ INJECTION_POINT_CACHED("datachecksums-enable-checksums-after-xlog", NULL);
+
SpinLockAcquire(&XLogCtl->info_lck);
data_checksum_version = XLogCtl->data_checksum_version;
XLogCtl->data_checksum_version = PG_DATA_CHECKSUM_VERSION;
@@ -4860,6 +4885,8 @@ SetDataChecksumsOn(void)
elog(LOG, "SetDataChecksumsOn / XLogCtl->data_checksum_version %u => %u",
data_checksum_version, PG_DATA_CHECKSUM_VERSION);
+ INJECTION_POINT_CACHED("datachecksums-enable-checksums-after-xlogctl", NULL);
+
/*
* Update the controlfile before waiting since if we have an immediate
* shutdown while waiting we want to come back up with checksums enabled.
@@ -4873,18 +4900,26 @@ SetDataChecksumsOn(void)
UpdateControlFile();
LWLockRelease(ControlFileLock);
+ INJECTION_POINT_CACHED("datachecksums-enable-checksums-after-controlfile", NULL);
+
elog(LOG, "SetDataChecksumsOn / EmitProcSignalBarrier(PG_DATA_CHECKSUM_VERSION)");
barrier = EmitProcSignalBarrier(PROCSIGNAL_BARRIER_CHECKSUM_ON);
MyProc->delayChkptFlags &= ~DELAY_CHKPT_START;
END_CRIT_SECTION();
+ INJECTION_POINT("datachecksums-enable-checksums-before-checkpoint", NULL);
+
elog(LOG, "SetDataChecksumsOn / RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FAST)");
RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FAST);
+ INJECTION_POINT("datachecksums-enable-checksums-before-barrier-wait", NULL);
+
elog(LOG, "SetDataChecksumsOn / WaitForProcSignalBarrier(PG_DATA_CHECKSUM_VERSION)");
WaitForProcSignalBarrier(barrier);
+ INJECTION_POINT("datachecksums-enable-checksums-end", NULL);
+
elog(LOG, "SetDataChecksumsOn / end");
}
@@ -4930,11 +4965,20 @@ SetDataChecksumsOff(void)
{
SpinLockRelease(&XLogCtl->info_lck);
+ INJECTION_POINT("datachecksums-disable-inprogress-checksums-start", NULL);
+
+ /* load before critical section */
+ INJECTION_POINT_LOAD("datachecksums-disable-inprogress-checksums-after-xlog");
+ INJECTION_POINT_LOAD("datachecksums-disable-inprogress-checksums-after-xlogctl");
+ INJECTION_POINT_LOAD("datachecksums-disable-inprogress-checksums-after-controlfile");
+
START_CRIT_SECTION();
MyProc->delayChkptFlags |= DELAY_CHKPT_START;
XLogChecksums(PG_DATA_CHECKSUM_INPROGRESS_OFF);
+ INJECTION_POINT_CACHED("datachecksums-disable-inprogress-checksums-after-xlog", NULL);
+
SpinLockAcquire(&XLogCtl->info_lck);
data_checksum_version = XLogCtl->data_checksum_version;
XLogCtl->data_checksum_version = PG_DATA_CHECKSUM_INPROGRESS_OFF;
@@ -4943,6 +4987,8 @@ SetDataChecksumsOff(void)
elog(LOG, "SetDataChecksumsOff / XLogCtl->data_checksum_version %u => %u",
data_checksum_version, PG_DATA_CHECKSUM_INPROGRESS_OFF);
+ INJECTION_POINT_CACHED("datachecksums-disable-inprogress-checksums-after-xlogctl", NULL);
+
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
elog(LOG, "SetDataChecksumsOff / ControlFile->data_checksum_version %u => %u",
@@ -4952,15 +4998,21 @@ SetDataChecksumsOff(void)
UpdateControlFile();
LWLockRelease(ControlFileLock);
+ INJECTION_POINT_CACHED("datachecksums-disable-inprogress-checksums-after-controlfile", NULL);
+
elog(LOG, "SetDataChecksumsOff / EmitProcSignalBarrier(PG_DATA_CHECKSUM_INPROGRESS_OFF)");
barrier = EmitProcSignalBarrier(PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_OFF);
MyProc->delayChkptFlags &= ~DELAY_CHKPT_START;
END_CRIT_SECTION();
+ INJECTION_POINT("datachecksums-disable-inprogress-checksums-before-checkpoint", NULL);
+
elog(LOG, "SetDataChecksumsOff / RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FAST)");
RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FAST);
+ INJECTION_POINT("datachecksums-disable-inprogress-checksums-before-barrier-wait", NULL);
+
elog(LOG, "SetDataChecksumsOff / WaitForProcSignalBarrier(PG_DATA_CHECKSUM_INPROGRESS_OFF)");
WaitForProcSignalBarrier(barrier);
@@ -4979,12 +5031,21 @@ SetDataChecksumsOff(void)
SpinLockRelease(&XLogCtl->info_lck);
}
+ INJECTION_POINT("datachecksums-disable-checksums-start", NULL);
+
+ /* load before critical section */
+ INJECTION_POINT_LOAD("datachecksums-disable-checksums-after-xlog");
+ INJECTION_POINT_LOAD("datachecksums-disable-checksums-after-xlogctl");
+ INJECTION_POINT_LOAD("datachecksums-disable-checksums-after-controlfile");
+
START_CRIT_SECTION();
/* Ensure that we don't incur a checkpoint during disabling checksums */
MyProc->delayChkptFlags |= DELAY_CHKPT_START;
XLogChecksums(PG_DATA_CHECKSUM_OFF);
+ INJECTION_POINT_CACHED("datachecksums-disable-checksums-after-xlog", NULL);
+
SpinLockAcquire(&XLogCtl->info_lck);
data_checksum_version = XLogCtl->data_checksum_version;
XLogCtl->data_checksum_version = PG_DATA_CHECKSUM_OFF;
@@ -4993,6 +5054,8 @@ SetDataChecksumsOff(void)
elog(LOG, "SetDataChecksumsOff / XLogCtl->data_checksum_version %u => %u",
data_checksum_version, PG_DATA_CHECKSUM_OFF);
+ INJECTION_POINT_CACHED("datachecksums-disable-checksums-after-xlogctl", NULL);
+
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
elog(LOG, "SetDataChecksumsOff / ControlFile->data_checksum_version %u => %u",
@@ -5002,18 +5065,26 @@ SetDataChecksumsOff(void)
UpdateControlFile();
LWLockRelease(ControlFileLock);
+ INJECTION_POINT_CACHED("datachecksums-disable-checksums-after-controlfile", NULL);
+
elog(LOG, "SetDataChecksumsOff / EmitProcSignalBarrier(PROCSIGNAL_BARRIER_CHECKSUM_OFF)");
barrier = EmitProcSignalBarrier(PROCSIGNAL_BARRIER_CHECKSUM_OFF);
MyProc->delayChkptFlags &= ~DELAY_CHKPT_START;
END_CRIT_SECTION();
+ INJECTION_POINT("datachecksums-disable-checksums-before-checkpoint", NULL);
+
elog(LOG, "SetDataChecksumsOff / RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FAST)");
RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FAST);
+ INJECTION_POINT("datachecksums-disable-checksums-before-barrier-wait", NULL);
+
elog(LOG, "SetDataChecksumsOff / WaitForProcSignalBarrier(PROCSIGNAL_BARRIER_CHECKSUM_OFF)");
WaitForProcSignalBarrier(barrier);
+ INJECTION_POINT("datachecksums-disable-checksums-end", NULL);
+
elog(LOG, "SetDataChecksumsOff / end");
}
@@ -8968,7 +9039,6 @@ xlog_redo(XLogReaderState *record)
{
CheckPoint checkPoint;
TimeLineID replayTLI;
- uint32 data_checksum_version;
memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));
/* In a SHUTDOWN checkpoint, believe the counters exactly */
--
2.54.0