Hi,

The function  in $subject does:
        while (PQisBusy(streamConn))
        {
            int         rc;

            /*
             * We don't need to break down the sleep into smaller increments,
             * since we'll get interrupted by signals and can either handle
             * interrupts here or elog(FATAL) within SIGTERM signal handler if
             * the signal arrives in the middle of establishment of
             * replication connection.
             */
            ResetLatch(&MyProc->procLatch);
            rc = WaitLatchOrSocket(&MyProc->procLatch,
                                   WL_POSTMASTER_DEATH | WL_SOCKET_READABLE |
                                   WL_LATCH_SET,
                                   PQsocket(streamConn),
                                   0,
                                   WAIT_EVENT_LIBPQWALRECEIVER);
            if (rc & WL_POSTMASTER_DEATH)
                exit(1);
            /* interrupted */
            if (rc & WL_LATCH_SET)
            {
                CHECK_FOR_INTERRUPTS();
                continue;
            }

Doing ResetLatch();WaitLatch() like that makes it possible to miss a the
latch being set, e.g. if it happens just after WaitLatchOrSocket()
returns.

Afaict, the ResetLatch() really should just instead be in the if (rc & 
WL_LATCH_SET)
block.

Unless somebody protests, I'll make it so.

Greetings,

Andres Freund


-- 
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