diff options
author | Martin Schwenke <martin@meltin.net> | 2019-08-09 15:33:05 +1000 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2019-08-16 21:30:35 +0000 |
commit | 8c98c10f242bc722beffc711e85c0e4f2e74cd57 (patch) | |
tree | f50cb61d6d7b990f8f929962ac92c3882e3df815 /ctdb/tcp | |
parent | 7f4854d9643a096a6d8a354fcd27b7c6ed24a75e (diff) | |
download | samba-8c98c10f242bc722beffc711e85c0e4f2e74cd57.tar.gz |
ctdb-tcp: Only mark a node connected if both directions are up
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>
Diffstat (limited to 'ctdb/tcp')
-rw-r--r-- | ctdb/tcp/tcp_connect.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/ctdb/tcp/tcp_connect.c b/ctdb/tcp/tcp_connect.c index 4374242015c..fd635b9abf2 100644 --- a/ctdb/tcp/tcp_connect.c +++ b/ctdb/tcp/tcp_connect.c @@ -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); + } + } /* |