------------------------------------------------------------ revno: 346 revision-id: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Andrew Tridgell <[EMAIL PROTECTED]> branch nick: tridge timestamp: Fri 2007-05-25 22:07:45 +1000 message: make sure we find out about new nodes as fast as possible modified: tcp/ctdb_tcp.h ctdb_tcp.h-20061127103747-l8xeniwiapbydehq-3 tcp/tcp_connect.c tcp_connect.c-20061128004937-x70q1cu5xzg5g2tm-1 === modified file 'tcp/ctdb_tcp.h' --- a/tcp/ctdb_tcp.h 2007-04-13 10:38:24 +0000 +++ b/tcp/ctdb_tcp.h 2007-05-25 12:07:45 +0000 @@ -39,6 +39,8 @@ struct ctdb_tcp_node { int fd; struct ctdb_queue *queue; + struct fd_event *connect_fde; + struct timed_event *connect_te; };
=== modified file 'tcp/tcp_connect.c' --- a/tcp/tcp_connect.c 2007-05-15 08:40:56 +0000 +++ b/tcp/tcp_connect.c 2007-05-25 12:07:45 +0000 @@ -50,6 +50,7 @@ /* start a new connect cycle to try to re-establish the link */ ctdb_queue_set_fd(tnode->queue, -1); + tnode->fd = -1; event_add_timed(node->ctdb->ev, node, timeval_zero(), ctdb_tcp_node_connect, node); } @@ -69,6 +70,9 @@ socklen_t len = sizeof(error); int one = 1; + talloc_free(tnode->connect_te); + tnode->connect_te = NULL; + if (getsockopt(tnode->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0 || error != 0) { talloc_free(fde); @@ -120,6 +124,13 @@ struct sockaddr_in sock_in; struct sockaddr_in sock_out; + if (tnode->fd != -1) { + talloc_free(tnode->connect_fde); + tnode->connect_fde = NULL; + close(tnode->fd); + tnode->fd = -1; + } + tnode->fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); set_nonblocking(tnode->fd); @@ -163,8 +174,15 @@ } /* non-blocking connect - wait for write event */ - event_add_fd(node->ctdb->ev, node, tnode->fd, EVENT_FD_WRITE|EVENT_FD_READ, - ctdb_node_connect_write, node); + tnode->connect_fde = event_add_fd(node->ctdb->ev, node, 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), + ctdb_tcp_node_connect, node); } /*