From: Frédéric Lécaille Date: Mon, 29 May 2017 11:47:16 +0000 (+0200) Subject: BUG/MINOR: Wrong peer task expiration handling during synchronization processing. X-Git-Tag: v1.8-dev3~280 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5d6e5f86c51cef6c22c6aeacc6b0e528f8fe58e9;p=thirdparty%2Fhaproxy.git BUG/MINOR: Wrong peer task expiration handling during synchronization processing. When a peer task has sent a synchronization request to remote peers its next expiration date was updated based on a resynchronization timeout value which itself may have already expired leading the underlying poller to wait for 0ms during a fraction of second (consuming high CPU resources). With this patch we update such peer task expiration dates only if the resynchronization timeout is not already expired. Thanks to Patrick Hemmer who reported an issue with nice traces which helped in finding this one. This patch may be backported to 1.7 and 1.6. --- diff --git a/src/peers.c b/src/peers.c index beeec96f55..7f63aa9fc7 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1963,8 +1963,9 @@ static struct task *process_peer_sync(struct task * task) if ((peers->flags & PEERS_RESYNC_STATEMASK) != PEERS_RESYNC_FINISHED) { /* Resync not finished*/ - /* reschedule task to resync timeout, to ended resync if needed */ - task->expire = tick_first(task->expire, peers->resync_timeout); + /* reschedule task to resync timeout if not expired, to ended resync if needed */ + if (!tick_is_expired(peers->resync_timeout, now_ms)) + task->expire = tick_first(task->expire, peers->resync_timeout); } } /* !stopping */ else {