ctdb-tcp: Create outbound queue when the connection becomes writable
authorMartin Schwenke <martin@meltin.net>
Thu, 15 Aug 2019 05:57:31 +0000 (15:57 +1000)
committerMartin Schwenke <martins@samba.org>
Fri, 16 Aug 2019 21:30:35 +0000 (21:30 +0000)
Since commit ddd97553f0a8bfaada178ec4a7460d76fa21f079
ctdb_queue_send() doesn't queue a packet if the connection isn't yet
established (i.e. when fd == -1).  So, don't bother creating the
outbound queue during initialisation but create it when the connection
becomes writable.

Now the presence of the queue indicates that the outbound connection
is up.

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>
ctdb/tcp/tcp_connect.c
ctdb/tcp/tcp_init.c
ctdb/tcp/tcp_io.c

index 16d754810501fb56a52a4a3072dde7ccd9d71837..4374242015c5bd7d9e5f557e2fa904336cb3feff 100644 (file)
@@ -44,8 +44,8 @@ void ctdb_tcp_stop_connection(struct ctdb_node *node)
 {
        struct ctdb_tcp_node *tnode = talloc_get_type(
                node->private_data, struct ctdb_tcp_node);
-       
-       ctdb_queue_set_fd(tnode->out_queue, -1);
+
+       TALLOC_FREE(tnode->out_queue);
        TALLOC_FREE(tnode->connect_te);
        TALLOC_FREE(tnode->connect_fde);
        if (tnode->out_fd != -1) {
@@ -126,7 +126,24 @@ static void ctdb_node_connect_write(struct tevent_context *ev,
                            strerror(errno));
        }
 
-       ctdb_queue_set_fd(tnode->out_queue, tnode->out_fd);
+       tnode->out_queue = ctdb_queue_setup(node->ctdb,
+                                           tnode,
+                                           tnode->out_fd,
+                                           CTDB_TCP_ALIGNMENT,
+                                           ctdb_tcp_tnode_cb,
+                                           node,
+                                           "to-node-%s",
+                                           node->name);
+       if (tnode->out_queue == NULL) {
+               DBG_ERR("Failed to set up outgoing queue\n");
+               ctdb_tcp_stop_connection(node);
+               tnode->connect_te = tevent_add_timer(ctdb->ev,
+                                                    tnode,
+                                                    timeval_current_ofs(1, 0),
+                                                    ctdb_tcp_node_connect,
+                                                    node);
+               return;
+       }
 
        /* the queue subsystem now owns this fd */
        tnode->out_fd = -1;
index d4b42b0d0f2d5c17d94968fdb4b87e7fb20b1fe8..a9cb9b36a01cbe49753e75af7a02ae7f6c52361c 100644 (file)
@@ -67,15 +67,6 @@ static int ctdb_tcp_add_node(struct ctdb_node *node)
        node->private_data = tnode;
        talloc_set_destructor(tnode, tnode_destructor);
 
-       tnode->out_queue = ctdb_queue_setup(node->ctdb,
-                                           node,
-                                           tnode->out_fd,
-                                           CTDB_TCP_ALIGNMENT,
-                                           ctdb_tcp_tnode_cb,
-                                           node,
-                                           "to-node-%s",
-                                           node->name);
-
        return 0;
 }
 
index be4558b16ea3bc28f352d931e7fa2f93feab9295..e33ed44048ea9e66c1b5413b0b061c65f4431857 100644 (file)
@@ -87,5 +87,10 @@ int ctdb_tcp_queue_pkt(struct ctdb_node *node, uint8_t *data, uint32_t length)
 {
        struct ctdb_tcp_node *tnode = talloc_get_type(node->private_data,
                                                      struct ctdb_tcp_node);
+       if (tnode->out_queue == NULL) {
+               DBG_DEBUG("No outgoing connection, dropping packet\n");
+               return 0;
+       }
+
        return ctdb_queue_send(tnode->out_queue, data, length);
 }