From 5d6e5f86c51cef6c22c6aeacc6b0e528f8fe58e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Mon, 29 May 2017 13:47:16 +0200 Subject: [PATCH] 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. --- src/peers.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/peers.c b/src/peers.c index beeec96f5..7f63aa9fc 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 {