From: Christopher Faulet Date: Fri, 26 Aug 2022 16:46:16 +0000 (+0200) Subject: BUG/MEDIUM: peers: Don't start resync on reload if local peer is not up-to-date X-Git-Tag: v2.7-dev5~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b372f16d352bfa20a3abbd60003e113976d16c9c;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: peers: Don't start resync on reload if local peer is not up-to-date On a reload, if the previous resync was not finished, the freshly old worker must not try to start a new resync. Otherwise, it will compete with the older wokers, slowing down or blocking the resync. Only an up-to-date woker must try to perform a local resync. This patch must be backported as far as 2.0 (and maybe to 1.8 too). --- diff --git a/src/peers.c b/src/peers.c index 39a5382d35..d4aa69f232 100644 --- a/src/peers.c +++ b/src/peers.c @@ -3472,12 +3472,14 @@ struct task *process_peer_sync(struct task * task, void *context, unsigned int s peers->resync_timeout = tick_add(now_ms, MS_TO_TICKS(PEER_RESYNC_TIMEOUT)); /* If there's no active peer connection */ - if (!tick_is_expired(peers->resync_timeout, now_ms) && + if ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FINISHED && + !tick_is_expired(peers->resync_timeout, now_ms) && (ps->statuscode == 0 || ps->statuscode == PEER_SESS_SC_SUCCESSCODE || ps->statuscode == PEER_SESS_SC_CONNECTEDCODE || ps->statuscode == PEER_SESS_SC_TRYAGAIN)) { - /* The resync timeout is not expired and + /* The resync is finished for the local peer and + * the resync timeout is not expired and * connection never tried * or previous peer connection was successfully established * or previous tcp connect succeeded but init state incomplete