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

