Hi,

recoveryApplyDelay() does:
    TimestampDifference(GetCurrentTimestamp(), recoveryDelayUntilTime,
                        &secs, &microsecs);

    if (secs <= 0 && microsecs <= 0)
        break;

    elog(DEBUG2, "recovery apply delay %ld seconds, %d milliseconds",
         secs, microsecs / 1000);

    WaitLatch(&XLogCtl->recoveryWakeupLatch,
              WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
              secs * 1000L + microsecs / 1000);

The problem is that the 'microsecs <= 0' comparison is done while in
microsecs, but the sleeping converts to milliseconds. Which will often
be 0. I've seen this cause ~15-20 iterations per loop. Annoying, but not
terrible.

I think we should simply make the abort condition '&& microsecs / 1000
<= 0'.

Greetings,

Andres Freund

-- 
 Andres Freund                     http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services


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