From mboxrd@z Thu Jan 1 00:00:00 1970 From: lhh@sourceware.org Date: 7 Nov 2007 19:08:30 -0000 Subject: [Cluster-devel] cluster ccs/ccs_tool/update.c ccs/daemon/clust ... Message-ID: <20071107190830.20876.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL45 Changes by: lhh at sourceware.org 2007-11-07 19:08:27 Modified files: ccs/ccs_tool : update.c ccs/daemon : cluster_mgr.c magma/lib : magmamsg.h memberlist.c message.c rgmanager : ChangeLog rgmanager/src/daemons: main.c rgmanager/src/utils: clustat.c clusvcadm.c Log message: Fix #362611, #362631, #362651 Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/ccs/ccs_tool/update.c.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.1.2.4&r2=1.1.2.4.4.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/ccs/daemon/cluster_mgr.c.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.10.2.8&r2=1.10.2.8.4.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/magmamsg.h.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.5&r2=1.5.16.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/memberlist.c.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.6&r2=1.6.16.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/message.c.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.9.2.3&r2=1.9.2.3.8.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/ChangeLog.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.5.2.24&r2=1.5.2.24.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/main.c.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.9.2.22&r2=1.9.2.22.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clustat.c.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.5.2.19&r2=1.5.2.19.2.1 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clusvcadm.c.diff?cvsroot=cluster&only_with_tag=RHEL45&r1=1.2.2.9&r2=1.2.2.9.2.1 --- cluster/ccs/ccs_tool/update.c 2006/01/12 18:11:26 1.1.2.4 +++ cluster/ccs/ccs_tool/update.c 2007/11/07 19:08:26 1.1.2.4.4.1 @@ -80,6 +80,7 @@ } int update(char *location){ + uint64_t nid; int error = 0; int i, fd; int cluster_fd = -1; @@ -190,6 +191,8 @@ membership = clu_member_list(NULL); msg_update(membership); + clu_local_nodeid(NULL, &nid); + msg_set_nodeid(nid); memb_resolve_list(membership, NULL); --- cluster/ccs/daemon/cluster_mgr.c 2006/02/16 20:12:26 1.10.2.8 +++ cluster/ccs/daemon/cluster_mgr.c 2007/11/07 19:08:26 1.10.2.8.4.1 @@ -306,6 +306,7 @@ static void cluster_communicator(void){ + uint64_t nid; int cluster_fd = -1; int listen_fds[2], listeners; int warn_user = 0; @@ -371,6 +372,8 @@ membership = clu_member_list(NULL); msg_update(membership); + clu_local_nodeid(NULL, &nid); + msg_set_nodeid(nid); memb_resolve_list(membership, NULL); while(1) { --- cluster/magma/lib/Attic/magmamsg.h 2004/11/02 20:11:38 1.5 +++ cluster/magma/lib/Attic/magmamsg.h 2007/11/07 19:08:26 1.5.16.1 @@ -22,6 +22,7 @@ #include int msg_update(cluster_member_list_t *membership); +int msg_set_nodeid(uint64_t nodeid); void msg_shutdown(void); ssize_t msg_receive_timeout(int fd, void *buf, ssize_t count, unsigned int timeout); --- cluster/magma/lib/Attic/memberlist.c 2004/11/02 20:11:38 1.6 +++ cluster/magma/lib/Attic/memberlist.c 2007/11/07 19:08:26 1.6.16.1 @@ -234,7 +234,7 @@ { int x; - if (!list) + if (!list || nodeid == NODE_ID_NONE) return NULL; for (x = 0; x < list->cml_count; x++) { --- cluster/magma/lib/Attic/message.c 2005/04/21 17:28:29 1.9.2.3 +++ cluster/magma/lib/Attic/message.c 2007/11/07 19:08:26 1.9.2.3.8.1 @@ -61,6 +61,7 @@ */ static pthread_mutex_t ml_mutex = PTHREAD_MUTEX_INITIALIZER; static cluster_member_list_t *ml_membership; +static uint64_t _local_id = NODE_ID_NONE; /* Mutex to prevent thread1 thread2 @@ -104,6 +105,16 @@ } +int +msg_set_nodeid(uint64_t my_node_id) +{ + pthread_mutex_lock(&ml_mutex); + _local_id = my_node_id; + pthread_mutex_unlock(&ml_mutex); + return 0; +} + + /** Shut down the mssage subsystem. Closes all file descriptors and cleans up the membership list. @@ -300,9 +311,12 @@ @see connect_nb, ipv4_connect */ static int -ipv6_connect(struct in6_addr *in6_addr, uint16_t port, int timeout) +ipv6_connect(struct in6_addr *in6_addr, uint16_t port, int timeout, + cluster_member_t *me) { struct sockaddr_in6 _sin6; + struct sockaddr_in6 srcaddr; + struct addrinfo *ai; int fd, ret; fd = socket(PF_INET6, SOCK_STREAM, 0); @@ -315,6 +329,29 @@ _sin6.sin6_flowinfo = 0; memcpy(&_sin6.sin6_addr, in6_addr, sizeof(_sin6.sin6_addr)); + if (me) { + /* if we know the local node, bind to its resolved + interface so other nodes don't reject the connection + due to improper source-routing */ + memset(&srcaddr, 0, sizeof(srcaddr)); + srcaddr.sin6_family = AF_INET6; + + for (ai = me->cm_addrs; ai; ai = ai->ai_next) { + if (ai->ai_family != AF_INET6) + continue; + + if (ai->ai_socktype != SOCK_STREAM) + continue; + + memcpy(&((struct sockaddr_in6 *)&srcaddr)->sin6_addr, + &((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr, + sizeof(struct in6_addr)); + + bind(fd, (struct sockaddr *)&srcaddr, + sizeof(srcaddr)); + } + } + ret = connect_nb(fd, (struct sockaddr *)&_sin6, sizeof(_sin6), timeout); if (ret < 0) { close(fd); @@ -335,15 +372,41 @@ @see connect_nb, ipv6_connect */ static int -ipv4_connect(struct in_addr *in_addr, uint16_t port, int timeout) +ipv4_connect(struct in_addr *in_addr, uint16_t port, int timeout, + cluster_member_t *me) { struct sockaddr_in _sin; + struct sockaddr_in srcaddr; + struct addrinfo *ai; int fd, ret; fd = socket(PF_INET, SOCK_STREAM, 0); if (fd < 0) return -1; + if (me) { + /* if we know the local node, bind to its resolved + interface so other nodes don't reject the connection + due to improper source-routing */ + memset(&srcaddr, 0, sizeof(srcaddr)); + srcaddr.sin_family = AF_INET; + + for (ai = me->cm_addrs; ai; ai = ai->ai_next) { + if (ai->ai_family != AF_INET) + continue; + + if (ai->ai_socktype != SOCK_STREAM) + continue; + + memcpy(&((struct sockaddr_in *)&srcaddr)->sin_addr, + &((struct sockaddr_in *)ai->ai_addr)->sin_addr, + sizeof(struct in_addr)); + + bind(fd, (struct sockaddr *)&srcaddr, + sizeof(srcaddr)); + } + } + _sin.sin_family = AF_INET; _sin.sin_port = htons(port); memcpy(&_sin.sin_addr, in_addr, sizeof(_sin.sin_addr)); @@ -377,6 +440,7 @@ { int fd; cluster_member_t *nodep; + cluster_member_t *me; struct addrinfo *ai; pthread_mutex_lock(&ml_mutex); @@ -387,6 +451,10 @@ return -1; } + me = memb_id_to_p(ml_membership, _local_id); + if (me) + memb_resolve(me); + /* Try to resolve if we haven't done so */ if (!nodep->cm_addrs && (memb_resolve(nodep) < 0)) { pthread_mutex_unlock(&ml_mutex); @@ -404,7 +472,7 @@ fd = ipv6_connect( &((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr, - baseport + IPV6_PORT_OFFSET, timeout); + baseport + IPV6_PORT_OFFSET, timeout, me); if (fd >= 0) { pthread_mutex_unlock(&ml_mutex); @@ -428,7 +496,7 @@ fd = ipv4_connect( &((struct sockaddr_in *)ai->ai_addr)->sin_addr, - baseport, timeout); + baseport, timeout, me ); if (fd >= 0) { pthread_mutex_unlock(&ml_mutex); --- cluster/rgmanager/ChangeLog 2006/11/03 16:26:18 1.5.2.24 +++ cluster/rgmanager/ChangeLog 2007/11/07 19:08:27 1.5.2.24.2.1 @@ -1,3 +1,8 @@ +2007-11-07 Lon Hohberger + * src/daemons/main.c, src/utils/clustat.c, clusvcadm.c: Call + msg_set_nodeid() to ensure we route from the right IP on a + host with multiple IPs on our cluster subnet. + 2006-11-03 Lon Hohberger * src/daemons/restree.c: Merge patch from Jeff Layton to instrument res_exec more closely. (#213246) --- cluster/rgmanager/src/daemons/main.c 2007/01/04 15:52:41 1.9.2.22 +++ cluster/rgmanager/src/daemons/main.c 2007/11/07 19:08:27 1.9.2.22.2.1 @@ -870,6 +870,7 @@ clu_local_nodeid(NULL, &myNodeID); set_my_id(myNodeID); + msg_set_nodeid(myNodeID); /* Initialize the VF stuff. --- cluster/rgmanager/src/utils/clustat.c 2007/02/06 20:18:48 1.5.2.19 +++ cluster/rgmanager/src/utils/clustat.c 2007/11/07 19:08:27 1.5.2.19.2.1 @@ -637,6 +637,7 @@ /* Grab the local node ID and flag it from the list of reported online nodes */ clu_local_nodeid(NULL, lid); + msg_set_nodeid(*lid); if (!all) return NULL; --- cluster/rgmanager/src/utils/clusvcadm.c 2007/01/04 15:52:41 1.2.2.9 +++ cluster/rgmanager/src/utils/clusvcadm.c 2007/11/07 19:08:27 1.2.2.9.2.1 @@ -324,6 +324,7 @@ membership = clu_member_list(RG_SERVICE_GROUP); msg_update(membership); clu_local_nodeid(RG_SERVICE_GROUP, &me); + msg_set_nodeid(me); if (node_specified) { msgtarget = memb_name_to_id(membership, nodename);