From 7ce3c30b3e5aa9505a103291455827eb4cda65a7 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sun, 11 Oct 2020 16:16:31 +0200 Subject: [PATCH] When a new connection is activated, terminate any pending connections to the same peer. 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 | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/protocol_auth.c b/src/protocol_auth.c index 7db41d51..7bf12198 100644 --- a/src/protocol_auth.c +++ b/src/protocol_auth.c @@ -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); -- 2.39.5