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]