0003-Avoid-leaving-DataChecksumState-worker_pid-to-an-old.patch
text/x-patch
Filename: 0003-Avoid-leaving-DataChecksumState-worker_pid-to-an-old.patch
Type: text/x-patch
Part: 2
Message:
Little checksum worker cleanups
Patch
Format: format-patch
Series: patch 0003
Subject: Avoid leaving DataChecksumState->worker_pid to an old value
| File | + | − |
|---|---|---|
| src/backend/postmaster/datachecksum_state.c | 2 | 3 |
From 409926ec65f6b27020ee454903aba5b9fbe242db Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Tue, 23 Jun 2026 23:29:59 +0300
Subject: [PATCH 3/6] Avoid leaving DataChecksumState->worker_pid to an old
value
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 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.
---
src/backend/postmaster/datachecksum_state.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/backend/postmaster/datachecksum_state.c b/src/backend/postmaster/datachecksum_state.c
index 91fff22d70d..6b44e4ee9ea 100644
--- a/src/backend/postmaster/datachecksum_state.c
+++ b/src/backend/postmaster/datachecksum_state.c
@@ -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);
}
--
2.47.3