postgres.git / summary / log / commit / refs
commit cffb4d8bd65e4c05ecd5697d09c4969467596ea5
Author: Daniel Gustafsson <dgustafsson@postgresql.org>
Date: Mon Sep 14 13:33:15 2026 +0000
Fix abort and launcher state resets in data checksums launcher
The launcher_running flag was reset to false during shutdown, which
left a small window where a new launcher could be started when the
exit handler was still running. Fix by only updating the running
flag in shared memory in the exit handler if our local copy is true.
Also reset the aborted state if the launch_operation changes during
shutdown to allow scenarios like "start -> abort -> start" to work
even if they reach the second start before the abort is fully done.
Issues found by Noah and Robert using AI assisted review with Claude.
Backpatch to v19 where the online checksums feature was introduced.
Reported-by: Noah Misch <noah@leadboat.com>
Reported-by: Robert Haas <robertmhaas@gmail.com>
Discussion: https://postgr.es/m/E15AC050-C4B5-488D-BB2D-3C7AC9F89EA8@yesql.se
Backpatch-through: 19
src/backend/postmaster/datachecksum_state.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/backend/postmaster/datachecksum_state.c b/src/backend/postmaster/datachecksum_state.c
index 099a6b4fe2e..e2b673a96b5 100644
--- a/src/backend/postmaster/datachecksum_state.c
+++ b/src/backend/postmaster/datachecksum_state.c
@@ -1156,8 +1156,9 @@ launcher_exit(int code, Datum arg)
SetDataChecksumsOff();
LWLockAcquire(DataChecksumsWorkerLock, LW_EXCLUSIVE);
+ if (launcher_running)
+ DataChecksumState->launcher_running = false;
launcher_running = false;
- DataChecksumState->launcher_running = false;
LWLockRelease(DataChecksumsWorkerLock);
}
@@ -1388,6 +1389,13 @@ done:
operation = DataChecksumState->launch_operation;
DataChecksumState->cost_delay = DataChecksumState->launch_cost_delay;
DataChecksumState->cost_limit = DataChecksumState->launch_cost_limit;
+
+ /*
+ * If the user started, but aborted processing, and then changed their
+ * mind again before we had time to exit we need to clear the abort
+ * flag.
+ */
+ abort_requested = false;
LWLockRelease(DataChecksumsWorkerLock);
goto again;
}
[parent: 9a45131b7cf3]