[Cluster-devel] cluster ccs/ccs_tool/update.c ccs/daemon/clust ...
lhh at sourceware.org
lhh at sourceware.org
Fri Oct 26 20:15:39 UTC 2007
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL4
Changes by: lhh at sourceware.org 2007-10-26 20:15:37
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 bugzillas #298831, #298861, #354391 - apps using magmamsg don't connect from correct source IP on multi-homed hosts
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/ccs/ccs_tool/update.c.diff?cvsroot=cluster&only_with_tag=RHEL46&r1=1.1.2.4&r2=1.1.2.4.6.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/ccs/daemon/cluster_mgr.c.diff?cvsroot=cluster&only_with_tag=RHEL46&r1=1.10.2.8&r2=1.10.2.8.6.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/magmamsg.h.diff?cvsroot=cluster&only_with_tag=RHEL46&r1=1.5&r2=1.5.18.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/memberlist.c.diff?cvsroot=cluster&only_with_tag=RHEL46&r1=1.6&r2=1.6.18.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma/lib/message.c.diff?cvsroot=cluster&only_with_tag=RHEL46&r1=1.9.2.3&r2=1.9.2.3.10.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/ChangeLog.diff?cvsroot=cluster&only_with_tag=RHEL46&r1=1.5.2.32.2.1&r2=1.5.2.32.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/main.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.9.2.22&r2=1.9.2.23
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clustat.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5.2.19&r2=1.5.2.20
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/utils/clusvcadm.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2.2.9&r2=1.2.2.10
--- cluster/ccs/ccs_tool/update.c 2006/01/12 18:11:26 1.1.2.4
+++ cluster/ccs/ccs_tool/update.c 2007/10/26 20:15:37 1.1.2.4.6.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/10/26 20:15:37 1.10.2.8.6.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/10/26 20:15:37 1.5.18.1
@@ -22,6 +22,7 @@
#include <magma.h>
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/10/26 20:15:37 1.6.18.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/10/26 20:15:37 1.9.2.3.10.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 2007/10/03 21:06:19 1.5.2.32.2.1
+++ cluster/rgmanager/ChangeLog 2007/10/26 20:15:37 1.5.2.32.2.2
@@ -1,3 +1,8 @@
+2007-10-26 Lon Hohberger <lhh at redhat.com>
+ * 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.
+
2007-10-03 Lon hohberger <lhh at redhat.com>
* ChangeLog: Fix dates.
* include/reslist.h: Actually commit fix for #310981
--- cluster/rgmanager/src/daemons/main.c 2007/01/04 15:52:41 1.9.2.22
+++ cluster/rgmanager/src/daemons/main.c 2007/10/26 20:15:37 1.9.2.23
@@ -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/10/26 20:15:37 1.5.2.20
@@ -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/10/26 20:15:37 1.2.2.10
@@ -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);
More information about the Cluster-devel
mailing list