summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2019-08-15 15:57:31 +1000
committerKarolin Seeger <kseeger@samba.org>2019-08-28 07:36:30 +0000
commit9155ad23d43bfe00169980fba736579be1771b11 (patch)
tree7dad23edcf358e9b96a2ffa1456ad53f3eb3b787
parentf2ce6c745cff004afee2576043274984205a3104 (diff)
downloadsamba-9155ad23d43bfe00169980fba736579be1771b11.tar.gz
ctdb-tcp: Create outbound queue when the connection becomes writable
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> (cherry picked from commit 7f4854d9643a096a6d8a354fcd27b7c6ed24a75e)
-rw-r--r--ctdb/tcp/tcp_connect.c23
-rw-r--r--ctdb/tcp/tcp_init.c9
-rw-r--r--ctdb/tcp/tcp_io.c5
3 files changed, 25 insertions, 12 deletions
diff --git a/ctdb/tcp/tcp_connect.c b/ctdb/tcp/tcp_connect.c
index f2d036fb5f7..15ce73103b9 100644
--- a/ctdb/tcp/tcp_connect.c
+++ b/ctdb/tcp/tcp_connect.c
@@ -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;
diff --git a/ctdb/tcp/tcp_init.c b/ctdb/tcp/tcp_init.c
index ec45d645c83..91d4e992c8f 100644
--- a/ctdb/tcp/tcp_init.c
+++ b/ctdb/tcp/tcp_init.c
@@ -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;
}
diff --git a/ctdb/tcp/tcp_io.c b/ctdb/tcp/tcp_io.c
index be4558b16ea..e33ed44048e 100644
--- a/ctdb/tcp/tcp_io.c
+++ b/ctdb/tcp/tcp_io.c
@@ -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);
}