From 2b4ea33a2b263849264b2c00b0b40470f6367050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Mon, 9 Mar 2020 23:22:19 +0000 Subject: [PATCH] maintenanced: Don't call proc_exit in SIGTERM handler Instead set got_SIGTERM to true to signal mainloop to exit --- src/backend/distributed/utils/maintenanced.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/backend/distributed/utils/maintenanced.c b/src/backend/distributed/utils/maintenanced.c index d6ba2ad0f..f5ee19922 100644 --- a/src/backend/distributed/utils/maintenanced.c +++ b/src/backend/distributed/utils/maintenanced.c @@ -102,6 +102,7 @@ static MaintenanceDaemonControlData *MaintenanceDaemonControl = NULL; static HTAB *MaintenanceDaemonDBHash; static volatile sig_atomic_t got_SIGHUP = false; +static volatile sig_atomic_t got_SIGTERM = false; static void MaintenanceDaemonSigTermHandler(SIGNAL_ARGS); static void MaintenanceDaemonSigHupHandler(SIGNAL_ARGS); @@ -145,8 +146,7 @@ InitializeMaintenanceDaemonBackend(void) MaintenanceDaemonDBData *dbData = (MaintenanceDaemonDBData *) hash_search( MaintenanceDaemonDBHash, - & - MyDatabaseId, + &MyDatabaseId, HASH_ENTER_NULL, &found); @@ -253,7 +253,7 @@ CitusMaintenanceDaemonMain(Datum main_arg) /* * Look up this worker's configuration. */ - LWLockAcquire(&MaintenanceDaemonControl->lock, LW_SHARED); + LWLockAcquire(&MaintenanceDaemonControl->lock, LW_EXCLUSIVE); MaintenanceDaemonDBData *myDbData = (MaintenanceDaemonDBData *) hash_search(MaintenanceDaemonDBHash, &databaseOid, @@ -305,7 +305,7 @@ CitusMaintenanceDaemonMain(Datum main_arg) pgstat_report_appname("Citus Maintenance Daemon"); /* enter main loop */ - for (;;) + while (!got_SIGTERM) { int rc; int latchFlags = WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH; @@ -651,7 +651,15 @@ MaintenanceDaemonShmemInit(void) static void MaintenanceDaemonSigTermHandler(SIGNAL_ARGS) { - proc_exit(0); + int save_errno = errno; + + got_SIGTERM = true; + if (MyProc != NULL) + { + SetLatch(&MyProc->procLatch); + } + + errno = save_errno; }