diff options
author | Andrew Tridgell <tridge@samba.org> | 2007-06-02 08:41:19 +1000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2007-06-02 08:41:19 +1000 |
commit | 5e5701a7b802a82ac03df50e34b0f314eca410b0 (patch) | |
tree | 389d9625dca59299119247d473e6d54772673be4 /ctdb/tcp | |
parent | 21f6fa53598b6a107d557d7af58970befbc038d7 (diff) | |
download | samba-5e5701a7b802a82ac03df50e34b0f314eca410b0.tar.gz samba-5e5701a7b802a82ac03df50e34b0f314eca410b0.tar.xz samba-5e5701a7b802a82ac03df50e34b0f314eca410b0.zip |
- make calling of recovered event script async
- shutdown sockets before calling shutdown script
(This used to be ctdb commit c5e099feef94a014a77742b6cc1d0afe78ef9da9)
Diffstat (limited to 'ctdb/tcp')
-rw-r--r-- | ctdb/tcp/tcp_connect.c | 22 | ||||
-rw-r--r-- | ctdb/tcp/tcp_init.c | 25 |
2 files changed, 31 insertions, 16 deletions
diff --git a/ctdb/tcp/tcp_connect.c b/ctdb/tcp/tcp_connect.c index 9bd5d4a9639..e44fbfb923d 100644 --- a/ctdb/tcp/tcp_connect.c +++ b/ctdb/tcp/tcp_connect.c @@ -43,7 +43,7 @@ void ctdb_tcp_tnode_cb(uint8_t *data, size_t cnt, void *private_data) link */ ctdb_queue_set_fd(tnode->queue, -1); tnode->fd = -1; - event_add_timed(node->ctdb->ev, node, timeval_zero(), + event_add_timed(node->ctdb->ev, tnode, timeval_zero(), ctdb_tcp_node_connect, node); } @@ -70,7 +70,7 @@ static void ctdb_node_connect_write(struct event_context *ev, struct fd_event *f talloc_free(fde); close(tnode->fd); tnode->fd = -1; - event_add_timed(ctdb->ev, node, timeval_current_ofs(1, 0), + event_add_timed(ctdb->ev, tnode, timeval_current_ofs(1, 0), ctdb_tcp_node_connect, node); return; } @@ -161,20 +161,20 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct timed_event *te, /* try again once a second */ close(tnode->fd); tnode->fd = -1; - event_add_timed(ctdb->ev, node, timeval_current_ofs(1, 0), + event_add_timed(ctdb->ev, tnode, timeval_current_ofs(1, 0), ctdb_tcp_node_connect, node); return; } /* non-blocking connect - wait for write event */ - tnode->connect_fde = event_add_fd(node->ctdb->ev, node, tnode->fd, + tnode->connect_fde = event_add_fd(node->ctdb->ev, tnode, tnode->fd, EVENT_FD_WRITE|EVENT_FD_READ, ctdb_node_connect_write, node); /* don't give it long to connect - retry in one second. This ensures that we find a node is up quickly (tcp normally backs off a syn reply delay by quite a lot) */ - tnode->connect_te = event_add_timed(ctdb->ev, node, timeval_current_ofs(1, 0), + tnode->connect_te = event_add_timed(ctdb->ev, tnode, timeval_current_ofs(1, 0), ctdb_tcp_node_connect, node); } @@ -186,22 +186,20 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct timed_event *te, static void ctdb_listen_event(struct event_context *ev, struct fd_event *fde, uint16_t flags, void *private_data) { - struct ctdb_context *ctdb; - struct ctdb_tcp *ctcp; + struct ctdb_context *ctdb = talloc_get_type(private_data, struct ctdb_context); + struct ctdb_tcp *ctcp = talloc_get_type(ctdb->private_data, struct ctdb_tcp); struct sockaddr_in addr; socklen_t len; int fd; struct ctdb_incoming *in; int one = 1; - ctdb = talloc_get_type(private_data, struct ctdb_context); - ctcp = talloc_get_type(ctdb->private_data, struct ctdb_tcp); memset(&addr, 0, sizeof(addr)); len = sizeof(addr); fd = accept(ctcp->listen_fd, (struct sockaddr *)&addr, &len); if (fd == -1) return; - in = talloc_zero(ctdb, struct ctdb_incoming); + in = talloc_zero(ctcp, struct ctdb_incoming); in->fd = fd; in->ctdb = ctdb; @@ -286,7 +284,7 @@ static int ctdb_tcp_listen_automatic(struct ctdb_context *ctdb) goto failed; } - event_add_fd(ctdb->ev, ctdb, ctcp->listen_fd, EVENT_FD_READ, + event_add_fd(ctdb->ev, ctcp, ctcp->listen_fd, EVENT_FD_READ|EVENT_FD_AUTOCLOSE, ctdb_listen_event, ctdb); close(lock_fd); @@ -346,7 +344,7 @@ int ctdb_tcp_listen(struct ctdb_context *ctdb) goto failed; } - event_add_fd(ctdb->ev, ctdb, ctcp->listen_fd, EVENT_FD_READ, + event_add_fd(ctdb->ev, ctcp, ctcp->listen_fd, EVENT_FD_READ|EVENT_FD_AUTOCLOSE, ctdb_listen_event, ctdb); return 0; diff --git a/ctdb/tcp/tcp_init.c b/ctdb/tcp/tcp_init.c index 4f3c29a010a..7e751953028 100644 --- a/ctdb/tcp/tcp_init.c +++ b/ctdb/tcp/tcp_init.c @@ -32,14 +32,16 @@ */ static int ctdb_tcp_add_node(struct ctdb_node *node) { + struct ctdb_tcp *ctcp = talloc_get_type(node->ctdb->private_data, + struct ctdb_tcp); struct ctdb_tcp_node *tnode; - tnode = talloc_zero(node, struct ctdb_tcp_node); + tnode = talloc_zero(ctcp, struct ctdb_tcp_node); CTDB_NO_MEMORY(node->ctdb, tnode); tnode->fd = -1; node->private_data = tnode; - tnode->queue = ctdb_queue_setup(node->ctdb, node, tnode->fd, CTDB_TCP_ALIGNMENT, + tnode->queue = ctdb_queue_setup(node->ctdb, ctcp, tnode->fd, CTDB_TCP_ALIGNMENT, ctdb_tcp_tnode_cb, node); return 0; @@ -76,9 +78,11 @@ static int ctdb_tcp_start(struct ctdb_context *ctdb) next event loop */ for (i=0;i<ctdb->num_nodes;i++) { struct ctdb_node *node = *(ctdb->nodes + i); + struct ctdb_tcp_node *tnode = talloc_get_type( + node->private_data, struct ctdb_tcp_node); if (!(ctdb->flags & CTDB_FLAG_SELF_CONNECT) && ctdb_same_address(&ctdb->address, &node->address)) continue; - event_add_timed(ctdb->ev, node, timeval_zero(), + event_add_timed(ctdb->ev, tnode, timeval_zero(), ctdb_tcp_node_connect, node); } @@ -87,6 +91,18 @@ static int ctdb_tcp_start(struct ctdb_context *ctdb) /* + shutdown the transport +*/ +static void ctdb_tcp_shutdown(struct ctdb_context *ctdb) +{ + struct ctdb_tcp *ctcp = talloc_get_type(ctdb->private_data, + struct ctdb_tcp); + talloc_free(ctcp); + ctdb->private_data = NULL; +} + + +/* transport packet allocator - allows transport to control memory for packets */ static void *ctdb_tcp_allocate_pkt(TALLOC_CTX *mem_ctx, size_t size) @@ -104,7 +120,8 @@ static const struct ctdb_methods ctdb_tcp_methods = { .start = ctdb_tcp_start, .queue_pkt = ctdb_tcp_queue_pkt, .add_node = ctdb_tcp_add_node, - .allocate_pkt = ctdb_tcp_allocate_pkt + .allocate_pkt = ctdb_tcp_allocate_pkt, + .shutdown = ctdb_tcp_shutdown, }; /* |