recovery_min_delay casting problems lead to busy looping

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

Responses

Browse pgsql-hackers by date

  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?