Get rid of the dedicated latch for signaling the startup process.
authorFujii Masao <fujii@postgresql.org>
Wed, 4 Nov 2020 07:41:29 +0000 (16:41 +0900)
committerFujii Masao <fujii@postgresql.org>
Wed, 4 Nov 2020 07:43:43 +0000 (16:43 +0900)
This commit gets rid of the dedicated latch for signaling the startup
process in favor of using its procLatch,  since that comports better
with possible generic signal handlers using that latch.

Commit 1e53fe0e70 changed background processes so that they use standard
SIGHUP handler. Like that, this commit also makes the startup process use
standard SIGHUP handler to simplify the code.

Author: Fujii Masao
Reviewed-by: Bharath Rupireddy, Michael Paquier
Discussion: https://postgr.es/m/CALj2ACXPorUqePswDtOeM_s82v9RW32E1fYmOPZ5NuE+TWKj_A@mail.gmail.com

src/backend/access/transam/xlog.c
src/backend/postmaster/startup.c

index 52a67b117015695502bda158544feee26628dfc2..e081bf926089215c713dd7c93979fbc35dde68e3 100644 (file)
@@ -682,7 +682,7 @@ typedef struct XLogCtlData
     * WAL replay, if it is waiting for WAL to arrive or failover trigger file
     * to appear.
     */
-   Latch       recoveryWakeupLatch;
+   Latch       *recoveryWakeupLatch;
 
    /*
     * During recovery, we keep a copy of the latest checkpoint record here.
@@ -5185,7 +5185,6 @@ XLOGShmemInit(void)
    SpinLockInit(&XLogCtl->Insert.insertpos_lck);
    SpinLockInit(&XLogCtl->info_lck);
    SpinLockInit(&XLogCtl->ulsn_lck);
-   InitSharedLatch(&XLogCtl->recoveryWakeupLatch);
 }
 
 /*
@@ -6122,7 +6121,7 @@ recoveryApplyDelay(XLogReaderState *record)
 
    while (true)
    {
-       ResetLatch(&XLogCtl->recoveryWakeupLatch);
+       ResetLatch(MyLatch);
 
        /* might change the trigger file's location */
        HandleStartupProcInterrupts();
@@ -6146,7 +6145,7 @@ recoveryApplyDelay(XLogReaderState *record)
        elog(DEBUG2, "recovery apply delay %ld seconds, %d milliseconds",
             secs, microsecs / 1000);
 
-       (void) WaitLatch(&XLogCtl->recoveryWakeupLatch,
+       (void) WaitLatch(MyLatch,
                         WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
                         secs * 1000L + microsecs / 1000,
                         WAIT_EVENT_RECOVERY_APPLY_DELAY);
@@ -6474,11 +6473,11 @@ StartupXLOG(void)
    }
 
    /*
-    * Take ownership of the wakeup latch if we're going to sleep during
-    * recovery.
+    * Advertise our latch that other processes can use to wake us up
+    * if we're going to sleep during recovery.
     */
    if (ArchiveRecoveryRequested)
-       OwnLatch(&XLogCtl->recoveryWakeupLatch);
+       XLogCtl->recoveryWakeupLatch = &MyProc->procLatch;
 
    /* Set up XLOG reader facility */
    MemSet(&private, 0, sizeof(XLogPageReadPrivate));
@@ -7489,11 +7488,11 @@ StartupXLOG(void)
        ResetUnloggedRelations(UNLOGGED_RELATION_INIT);
 
    /*
-    * We don't need the latch anymore. It's not strictly necessary to disown
-    * it, but let's do it for the sake of tidiness.
+    * We don't need the latch anymore. It's not strictly necessary to reset
+    * it to NULL, but let's do it for the sake of tidiness.
     */
    if (ArchiveRecoveryRequested)
-       DisownLatch(&XLogCtl->recoveryWakeupLatch);
+       XLogCtl->recoveryWakeupLatch = NULL;
 
    /*
     * We are now done reading the xlog from stream. Turn off streaming
@@ -12242,12 +12241,12 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
                        wait_time = wal_retrieve_retry_interval -
                            (secs * 1000 + usecs / 1000);
 
-                       (void) WaitLatch(&XLogCtl->recoveryWakeupLatch,
+                       (void) WaitLatch(MyLatch,
                                         WL_LATCH_SET | WL_TIMEOUT |
                                         WL_EXIT_ON_PM_DEATH,
                                         wait_time,
                                         WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL);
-                       ResetLatch(&XLogCtl->recoveryWakeupLatch);
+                       ResetLatch(MyLatch);
                        now = GetCurrentTimestamp();
                    }
                    last_fail_time = now;
@@ -12498,11 +12497,11 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
                     * to react to a trigger file promptly and to check if the
                     * WAL receiver is still active.
                     */
-                   (void) WaitLatch(&XLogCtl->recoveryWakeupLatch,
+                   (void) WaitLatch(MyLatch,
                                     WL_LATCH_SET | WL_TIMEOUT |
                                     WL_EXIT_ON_PM_DEATH,
                                     5000L, WAIT_EVENT_RECOVERY_WAL_STREAM);
-                   ResetLatch(&XLogCtl->recoveryWakeupLatch);
+                   ResetLatch(MyLatch);
                    break;
                }
 
@@ -12674,7 +12673,7 @@ CheckPromoteSignal(void)
 void
 WakeupRecovery(void)
 {
-   SetLatch(&XLogCtl->recoveryWakeupLatch);
+   SetLatch(XLogCtl->recoveryWakeupLatch);
 }
 
 /*
index 64af7b8707cc6fcf89c346b088b621f3f851f111..eab9c8c4ed332fa100f646985b12615d851ec925 100644 (file)
@@ -37,7 +37,6 @@
 /*
  * Flags set by interrupt handlers for later service in the redo loop.
  */
-static volatile sig_atomic_t got_SIGHUP = false;
 static volatile sig_atomic_t shutdown_requested = false;
 static volatile sig_atomic_t promote_signaled = false;
 
@@ -49,7 +48,6 @@ static volatile sig_atomic_t in_restore_command = false;
 
 /* Signal handlers */
 static void StartupProcTriggerHandler(SIGNAL_ARGS);
-static void StartupProcSigHupHandler(SIGNAL_ARGS);
 
 
 /* --------------------------------
@@ -64,19 +62,7 @@ StartupProcTriggerHandler(SIGNAL_ARGS)
    int         save_errno = errno;
 
    promote_signaled = true;
-   WakeupRecovery();
-
-   errno = save_errno;
-}
-
-/* SIGHUP: set flag to re-read config file at next convenient time */
-static void
-StartupProcSigHupHandler(SIGNAL_ARGS)
-{
-   int         save_errno = errno;
-
-   got_SIGHUP = true;
-   WakeupRecovery();
+   SetLatch(MyLatch);
 
    errno = save_errno;
 }
@@ -91,7 +77,7 @@ StartupProcShutdownHandler(SIGNAL_ARGS)
        proc_exit(1);
    else
        shutdown_requested = true;
-   WakeupRecovery();
+   SetLatch(MyLatch);
 
    errno = save_errno;
 }
@@ -137,9 +123,9 @@ HandleStartupProcInterrupts(void)
    /*
     * Process any requests or signals received recently.
     */
-   if (got_SIGHUP)
+   if (ConfigReloadPending)
    {
-       got_SIGHUP = false;
+       ConfigReloadPending = false;
        StartupRereadConfig();
    }
 
@@ -172,7 +158,7 @@ StartupProcessMain(void)
    /*
     * Properly accept or ignore signals the postmaster might send us.
     */
-   pqsignal(SIGHUP, StartupProcSigHupHandler); /* reload config file */
+   pqsignal(SIGHUP, SignalHandlerForConfigReload); /* reload config file */
    pqsignal(SIGINT, SIG_IGN);  /* ignore query cancel */
    pqsignal(SIGTERM, StartupProcShutdownHandler);  /* request shutdown */
    /* SIGQUIT handler was already set up by InitPostmasterChild */