In walsender, in the main loop that waits for backend requests to send WAL, there's this comment:

+               /*
+                * Nap for the configured time or until a request arrives.
+                *
+                * On some platforms, signals won't interrupt the sleep.  To 
ensure we
+                * respond reasonably promptly when someone signals us, break 
down the
+                * sleep into 1-second increments, and check for interrupts 
after each
+                * nap.
+                */

That's apparently copy-pasted from bgwriter. It's fine for bgwriter, where a prompt response is not important, but it seems pretty awful for synchronous replication. On such platforms, that would introduce a delay of 500ms on average at every commit. I'm not sure if the comment is actually accurate, though. bgwriter uses pq_usleep(), while this loop uses pq_wait, which uses secure_poll().

There's also a small race condition in that loop:

+               while (remaining > 0)
+               {
+                       int waitres;
+                       
+                       if (got_SIGHUP || shutdown_requested || 
replication_requested)
+                               break;
+                       
+                       /*
+                        * Check whether the data from standby can be read.
+                        */
+ waitres = pq_wait(true, false, + remaining > 1000 ? 1000 : remaining);
+                       
                ...

If a signal is received just before pq_wait call, after checking replication_requested, pq_wait won't be interrupted and will wait up to a second before responding to it.

BTW, on what platforms signal doesn't interrupt sleep?

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to