]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: peers: Start learning for local peer before receiving messages
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 24 Apr 2024 18:55:23 +0000 (20:55 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 25 Apr 2024 16:29:57 +0000 (18:29 +0200)
A local peer assigned for leaning can immediately start to learn, without
sending any request. So we can do that first, before receiving
messages. This way, only PEER_LR_ST_PROCESSING state is evaluating when
received messages are processed.

In addition, when the resync request is sent, we are sure it is for a remote
peer.

src/peers.c

index ad9cb66e84f78c7a91e93d63432acef1df1d28f7..674cbd7f12ad829744b9df16ea9819f008dd1d23 100644 (file)
@@ -2532,7 +2532,7 @@ static inline int peer_treat_awaited_msg(struct appctx *appctx, struct peer *pee
                else if (msg_head[1] == PEER_MSG_CTRL_RESYNCFINISHED) {
                        TRACE_PROTO("received control message", PEERS_EV_CTRLMSG,
                                    NULL, &msg_head[1], peers->local->id, peer->id);
-                       if (peer->learnstate == PEER_LR_ST_PROCESSING || (peer->local && peer->learnstate == PEER_LR_ST_ASSIGNED)) {
+                       if (peer->learnstate == PEER_LR_ST_PROCESSING) {
                                peer->learnstate = PEER_LR_ST_FINISHED;
                                peer->flags |= PEER_F_WAIT_SYNCTASK_ACK;
                                task_wakeup(peers->sync_task, TASK_WOKEN_MSG);
@@ -2542,7 +2542,7 @@ static inline int peer_treat_awaited_msg(struct appctx *appctx, struct peer *pee
                else if (msg_head[1] == PEER_MSG_CTRL_RESYNCPARTIAL) {
                        TRACE_PROTO("received control message", PEERS_EV_CTRLMSG,
                                    NULL, &msg_head[1], peers->local->id, peer->id);
-                       if (peer->learnstate == PEER_LR_ST_PROCESSING || (peer->local && peer->learnstate == PEER_LR_ST_ASSIGNED)) {
+                       if (peer->learnstate == PEER_LR_ST_PROCESSING) {
                                peer->learnstate = PEER_LR_ST_FINISHED;
                                peer->flags |= (PEER_F_LEARN_NOTUP2DATE|PEER_F_WAIT_SYNCTASK_ACK);
                                task_wakeup(peers->sync_task, TASK_WOKEN_MSG);
@@ -2641,13 +2641,12 @@ static inline int peer_send_msgs(struct appctx *appctx,
 {
        int repl;
 
-       /* Need to request a resync */
+       /* Need to request a resync (only possible for a remote peer at this stage) */
        if (peer->learnstate == PEER_LR_ST_ASSIGNED) {
-               if (!peer->local) {
-                       repl = peer_send_resync_reqmsg(appctx, peer, peers);
-                       if (repl <= 0)
-                               return repl;
-               }
+               BUG_ON(peer->local);
+               repl = peer_send_resync_reqmsg(appctx, peer, peers);
+               if (repl <= 0)
+                       return repl;
                peer->learnstate = PEER_LR_ST_PROCESSING;
        }
 
@@ -3136,6 +3135,10 @@ switchstate:
                                if (curpeer->flags & PEER_F_WAIT_SYNCTASK_ACK)
                                        goto out;
 
+                               /* local peer is assigned of a lesson, start it */
+                               if (curpeer->learnstate == PEER_LR_ST_ASSIGNED && curpeer->local)
+                                       curpeer->learnstate = PEER_LR_ST_PROCESSING;
+
                                reql = peer_recv_msg(appctx, (char *)msg_head, sizeof msg_head, &msg_len, &totl);
                                if (reql <= 0) {
                                        if (reql == -1)