ctdb-tcp: Only mark a node connected if both directions are up
authorMartin Schwenke <martin@meltin.net>
Fri, 9 Aug 2019 05:33:05 +0000 (15:33 +1000)
committerKarolin Seeger <kseeger@samba.org>
Wed, 28 Aug 2019 09:12:17 +0000 (09:12 +0000)
Nodes are currently marked as up if the outgoing connection is
established.  However, if the incoming connection is not yet
established then this node could send a request where the replying
node can not queue its reply.  Wait until both directions are up
before marking a node as connected.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14084

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
(cherry picked from commit 8c98c10f242bc722beffc711e85c0e4f2e74cd57)

ctdb/tcp/tcp_connect.c

index 4374242015c5bd7d9e5f557e2fa904336cb3feff..fd635b9abf2fe7d40991bf34f5c695a2d369b6c9 100644 (file)
@@ -148,8 +148,14 @@ static void ctdb_node_connect_write(struct tevent_context *ev,
        /* the queue subsystem now owns this fd */
        tnode->out_fd = -1;
 
-       /* tell the ctdb layer we are connected */
-       node->ctdb->upcalls->node_connected(node);
+       /*
+        * Mark the node to which this connection has been established
+        * as connected, but only if the corresponding listening
+        * socket is also connected
+        */
+       if (tnode->in_fd != -1) {
+               node->ctdb->upcalls->node_connected(node);
+       }
 }
 
 
@@ -343,7 +349,15 @@ static void ctdb_listen_event(struct tevent_context *ev, struct tevent_fd *fde,
        }
 
        tnode->in_fd = fd;
-}
+
+       /*
+       * Mark the connecting node as connected, but only if the
+       * corresponding outbound connected is also up
+       */
+       if (tnode->out_queue != NULL) {
+               node->ctdb->upcalls->node_connected(node);
+       }
+ }
 
 
 /*