]> granicus.if.org Git - postgresql/commitdiff
Eliminate one background-worker-related flag variable.
authorRobert Haas <rhaas@postgresql.org>
Sun, 5 Oct 2014 01:25:41 +0000 (21:25 -0400)
committerRobert Haas <rhaas@postgresql.org>
Sun, 5 Oct 2014 02:15:06 +0000 (22:15 -0400)
Teach sigusr1_handler() to use the same test for whether a worker
might need to be started as ServerLoop().  Aside from being perhaps
a bit simpler, this prevents a potentially-unbounded delay when
starting a background worker.  On some platforms, select() doesn't
return when interrupted by a signal, but is instead restarted,
including a reset of the timeout to the originally-requested value.
If signals arrive often enough, but no connection requests arrive,
sigusr1_handler() will be executed repeatedly, but the body of
ServerLoop() won't be reached.  This change ensures that, even in
that case, background workers will eventually get launched.

This is far from a perfect fix; really, we need select() to return
control to ServerLoop() after an interrupt, either via the self-pipe
trick or some other mechanism.  But that's going to require more
work and discussion, so let's do this for now to at least mitigate
the damage.

Per investigation of test_shm_mq failures on buildfarm member anole.

src/backend/postmaster/postmaster.c

index 15b0fe6d0bd519c93d9f17bef951be2297d469c2..268ef0036ed6b6642a23594d2aadb10208ca9438 100644 (file)
@@ -4757,7 +4757,6 @@ static void
 sigusr1_handler(SIGNAL_ARGS)
 {
        int                     save_errno = errno;
-       bool            start_bgworker = false;
 
        PG_SETMASK(&BlockSig);
 
@@ -4765,7 +4764,7 @@ sigusr1_handler(SIGNAL_ARGS)
        if (CheckPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE))
        {
                BackgroundWorkerStateChange();
-               start_bgworker = true;
+               StartWorkerNeeded = true;
        }
 
        /*
@@ -4806,10 +4805,10 @@ sigusr1_handler(SIGNAL_ARGS)
 
                pmState = PM_HOT_STANDBY;
                /* Some workers may be scheduled to start now */
-               start_bgworker = true;
+               StartWorkerNeeded = true;
        }
 
-       if (start_bgworker)
+       if (StartWorkerNeeded || HaveCrashedWorker)
                maybe_start_bgworker();
 
        if (CheckPostmasterSignal(PMSIGNAL_WAKEN_ARCHIVER) &&