]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Avoid leaving DataChecksumState->worker_pid to an old value
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 24 Jun 2026 12:07:27 +0000 (15:07 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 24 Jun 2026 12:07:27 +0000 (15:07 +0300)
It might be left to an old value if the launcher was terminated while
a worker was running.  launcher_exit() sends SIGTERM to the worker,
but did not clear 'worker_pid'.  Clear it, to be tidy.

Also clear it in ProcessDatabase() before starting a new datachecksums
worker, to be sure we start from a clean slate.  The codepath where
WaitForBackgroundWorkerStartup() returns BGWH_STOPPED but
worker_result != DATACHECKSUMSWORKER_SUCCESSFUL didn't clear it, while
all other codepaths did clear or set it.

Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
Discussion: https://www.postgresql.org/message-id/b283fbb9-298e-4953-9120-eefaf24fae20@iki.fi

src/backend/postmaster/datachecksum_state.c

index 9103546c3825c88a587f651af3bdf6b7c73ca07d..79bd5cd26b56895a5ccc895046f65ac00c029e1f 100644 (file)
@@ -817,6 +817,7 @@ ProcessDatabase(DataChecksumsWorkerDatabase *db)
 
        LWLockAcquire(DataChecksumsWorkerLock, LW_EXCLUSIVE);
        DataChecksumState->success = DATACHECKSUMSWORKER_FAILED;
+       DataChecksumState->worker_pid = InvalidPid;
        LWLockRelease(DataChecksumsWorkerLock);
 
        memset(&bgw, 0, sizeof(bgw));
@@ -856,9 +857,6 @@ ProcessDatabase(DataChecksumsWorkerDatabase *db)
                {
                        LWLockRelease(DataChecksumsWorkerLock);
                        pgstat_report_activity(STATE_IDLE, NULL);
-                       LWLockAcquire(DataChecksumsWorkerLock, LW_EXCLUSIVE);
-                       DataChecksumState->worker_pid = InvalidPid;
-                       LWLockRelease(DataChecksumsWorkerLock);
                        return DataChecksumState->success;
                }
                LWLockRelease(DataChecksumsWorkerLock);
@@ -951,6 +949,7 @@ launcher_exit(int code, Datum arg)
                        ereport(LOG,
                                        errmsg("data checksums launcher exiting while worker is still running, signalling worker"));
                        kill(DataChecksumState->worker_pid, SIGTERM);
+                       DataChecksumState->worker_pid = InvalidPid;
                }
                LWLockRelease(DataChecksumsWorkerLock);
        }