]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: peers: reset tables stage flags stages on new conns
authorEmeric Brun <ebrun@haproxy.com>
Tue, 20 Apr 2021 12:43:46 +0000 (14:43 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 28 Apr 2021 12:23:10 +0000 (14:23 +0200)
Flags used as context to know current status of each table pushing a
full resync to a peer were correctly reset receiving a new resync
request or confirmation message but in case of local peer sync during
reload the resync request is implicit and those flags were not
correctly reset in this case.

This could result to a partial initial resync of some tables after reload
if the connection with the old process was broken and retried.

This patch reset those flags at the end of the handshake for all new
connections to be sure to push a entire full resync if needed.

This patch should be backported on all supported branches ( v >= 1.6 )

src/peers.c

index a01210679c160337abb647b470a2b2df3558fda4..961ac45927bb0f0391249def04df8a5d14a308ac 100644 (file)
@@ -2413,6 +2413,7 @@ static inline void init_accepted_peer(struct peer *peer, struct peers *peers)
                if ((int)(st->table->localupdate - st->update) < 0)
                        st->update = st->table->localupdate + (2147483648U);
                st->teaching_origin = st->last_pushed = st->update;
+               st->flags = 0;
                if ((int)(st->last_pushed - st->table->commitupdate) > 0)
                        st->table->commitupdate = st->last_pushed;
                HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock);
@@ -2465,6 +2466,7 @@ static inline void init_connected_peer(struct peer *peer, struct peers *peers)
                if ((int)(st->table->localupdate - st->update) < 0)
                        st->update = st->table->localupdate + (2147483648U);
                st->teaching_origin = st->last_pushed = st->update;
+               st->flags = 0;
                if ((int)(st->last_pushed - st->table->commitupdate) > 0)
                        st->table->commitupdate = st->last_pushed;
                HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock);