summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAmit Kapila2025-12-09 07:25:20 +0000
committerAmit Kapila2025-12-09 07:25:20 +0000
commit04396eacd3faeaa4fa3d084a6749e4e384bdf0db (patch)
tree742bce4fab70268522e939392743299c4c6a07b3 /src
parent2268f2b91b5513cbf430d1cca488203d66103b3a (diff)
Fix LOCK_TIMEOUT handling in slotsync worker.
Previously, the slotsync worker relied on SIGINT for graceful shutdown during promotion. However, SIGINT is also used by the LOCK_TIMEOUT handler to cancel queries. Since the slotsync worker can lock catalog tables while parsing libpq tuples, this overlap caused it to ignore LOCK_TIMEOUT signals and potentially wait indefinitely on locks. This patch replaces the slotsync worker's SIGINT handler with StatementCancelHandler to correctly process query-cancel interrupts. Additionally, the startup process now uses SIGUSR1 to signal the slotsync worker to stop during promotion. The worker exits after detecting that the shared memory flag stopSignaled is set. Author: Hou Zhijie <houzj.fnst@fujitsu.com> Reviewed-by: shveta malik <shveta.malik@gmail.com> Reviewed-by: Chao Li <li.evan.chao@gmail.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Backpatch-through: 17, here it was introduced Discussion: https://postgr.es/m/TY4PR01MB169078F33846E9568412D878C94A2A@TY4PR01MB16907.jpnprd01.prod.outlook.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/logical/slotsync.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 31d7cb3ca77..7e3b4c4413e 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -1254,10 +1254,10 @@ ProcessSlotSyncInterrupts(void)
{
CHECK_FOR_INTERRUPTS();
- if (ShutdownRequestPending)
+ if (SlotSyncCtx->stopSignaled)
{
ereport(LOG,
- errmsg("replication slot synchronization worker is shutting down on receiving SIGINT"));
+ errmsg("replication slot synchronization worker is shutting down because promotion is triggered"));
proc_exit(0);
}
@@ -1488,7 +1488,7 @@ ReplSlotSyncWorkerMain(const void *startup_data, size_t startup_data_len)
/* Setup signal handling */
pqsignal(SIGHUP, SignalHandlerForConfigReload);
- pqsignal(SIGINT, SignalHandlerForShutdownRequest);
+ pqsignal(SIGINT, StatementCancelHandler);
pqsignal(SIGTERM, die);
pqsignal(SIGFPE, FloatExceptionHandler);
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
@@ -1595,7 +1595,8 @@ ReplSlotSyncWorkerMain(const void *startup_data, size_t startup_data_len)
/*
* The slot sync worker can't get here because it will only stop when it
- * receives a SIGINT from the startup process, or when there is an error.
+ * receives a stop request from the startup process, or when there is an
+ * error.
*/
Assert(false);
}
@@ -1680,8 +1681,12 @@ ShutDownSlotSync(void)
SpinLockRelease(&SlotSyncCtx->mutex);
+ /*
+ * Signal slotsync worker if it was still running. The worker will stop
+ * upon detecting that the stopSignaled flag is set to true.
+ */
if (worker_pid != InvalidPid)
- kill(worker_pid, SIGINT);
+ kill(worker_pid, SIGUSR1);
/* Wait for slot sync to end */
for (;;)