]> git.meshlink.io Git - meshlink/commitdiff
When a new connection is activated, terminate any pending connections to the same...
authorGuus Sliepen <guus@meshlink.io>
Sun, 11 Oct 2020 14:16:31 +0000 (16:16 +0200)
committerGuus Sliepen <guus@meshlink.io>
Sun, 11 Oct 2020 14:16:31 +0000 (16:16 +0200)
This prevents issues mainly in the test suite where peers try to connect to
each other simultaneously, and have to terminate one of the connections.
Before both connections would succeed, and both would be terminated, leading
to a loop of reconnections until enough randomness got in to break the tie.

src/protocol_auth.c

index 7db41d51eb0d54159955fdbf0f74705ac7fe3095..7bf121989b308558a0305d29cb0478a943818e07 100644 (file)
@@ -381,6 +381,25 @@ bool ack_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
                mesh->meta_status_cb(mesh, (meshlink_node_t *)n, true);
        }
 
+       /*  Terminate any connections to this node that are not activated yet */
+
+       for list_each(connection_t, other, mesh->connections) {
+               if(!other->status.active && !strcmp(other->name, c->name)) {
+                       if(other->outgoing) {
+                               if(c->outgoing) {
+                                       logger(mesh, MESHLINK_WARNING, "Two outgoing connections to the same node!");
+                               } else {
+                                       c->outgoing = other->outgoing;
+                               }
+
+                               other->outgoing = NULL;
+                       }
+
+                       logger(mesh, MESHLINK_DEBUG, "Terminating pending second connection with %s", n->name);
+                       terminate_connection(mesh, other, false);
+               }
+       }
+
        /* Send him everything we know */
 
        send_everything(mesh, c);