From: | Andres Freund <andres(at)2ndquadrant(dot)com> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | recovery_min_delay casting problems lead to busy looping |
Date: | 2015-03-23 14:18:19 |
Message-ID: | 20150323141819.GH26995@alap3.anarazel.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi,
recoveryApplyDelay() does:
TimestampDifference(GetCurrentTimestamp(), recoveryDelayUntilTime,
&secs, µsecs);
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
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Haas | 2015-03-23 14:25:48 | Re: recovery_min_delay casting problems lead to busy looping |
Previous Message | Tom Lane | 2015-03-23 14:16:36 | Re: Order of enforcement of CHECK constraints? |