Skip to content

Commit

Permalink
We dont need to serialize the "probe which address this node is" if w…
Browse files Browse the repository at this point in the history
…e have given an explicit --node-ip on the commandline

(This used to be ctdb commit e3dc5bd3f1ef1f0ed08f57a5b5bafcac936e9ed0)
  • Loading branch information
sahlberg committed May 10, 2012
1 parent a57eba2 commit dfdec4a
Showing 1 changed file with 27 additions and 20 deletions.
47 changes: 27 additions & 20 deletions ctdb/tcp/tcp_connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,26 +281,29 @@ static int ctdb_tcp_listen_automatic(struct ctdb_context *ctdb)
int sock_size;
struct tevent_fd *fde;

/* in order to ensure that we don't get two nodes with the
same adddress, we must make the bind() and listen() calls
atomic. The SO_REUSEADDR setsockopt only prevents double
binds if the first socket is in LISTEN state */
lock_fd = open(lock_path, O_RDWR|O_CREAT, 0666);
if (lock_fd == -1) {
DEBUG(DEBUG_CRIT,("Unable to open %s\n", lock_path));
return -1;
}
/* We only need to serialize this if we dont yet know the node ip */
if (!ctdb->node_ip) {
/* in order to ensure that we don't get two nodes with the
same adddress, we must make the bind() and listen() calls
atomic. The SO_REUSEADDR setsockopt only prevents double
binds if the first socket is in LISTEN state */
lock_fd = open(lock_path, O_RDWR|O_CREAT, 0666);
if (lock_fd == -1) {
DEBUG(DEBUG_CRIT,("Unable to open %s\n", lock_path));
return -1;
}

lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 1;
lock.l_pid = 0;
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 1;
lock.l_pid = 0;

if (fcntl(lock_fd, F_SETLKW, &lock) != 0) {
DEBUG(DEBUG_CRIT,("Unable to lock %s\n", lock_path));
close(lock_fd);
return -1;
if (fcntl(lock_fd, F_SETLKW, &lock) != 0) {
DEBUG(DEBUG_CRIT,("Unable to lock %s\n", lock_path));
close(lock_fd);
return -1;
}
}

for (i=0; i < ctdb->num_nodes; i++) {
Expand Down Expand Up @@ -399,11 +402,15 @@ static int ctdb_tcp_listen_automatic(struct ctdb_context *ctdb)
ctdb_listen_event, ctdb);
tevent_fd_set_auto_close(fde);

close(lock_fd);
if (!ctdb->node_ip) {
close(lock_fd);
}
return 0;

failed:
close(lock_fd);
if (!ctdb->node_ip) {
close(lock_fd);
}
close(ctcp->listen_fd);
ctcp->listen_fd = -1;
return -1;
Expand Down

0 comments on commit dfdec4a

Please sign in to comment.