This is the mail archive of the cluster-cvs@sourceware.org mailing list for the cluster.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

STABLE2 - groupd: send and check version messages


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c164f9dc1298a25af7a7398313a64b5e88a8280e
Commit:        c164f9dc1298a25af7a7398313a64b5e88a8280e
Parent:        3d592cd8d21b3bd14587b899364686b9586a8111
Author:        David Teigland <teigland@redhat.com>
AuthorDate:    Thu Aug 21 13:55:52 2008 -0500
Committer:     David Teigland <teigland@redhat.com>
CommitterDate: Tue Aug 26 11:34:39 2008 -0500

groupd: send and check version messages

for better compatibility with and upgrades to cluster3 eventually.

bz 457104

- cluster3 nodes that are trying to detect old cluster2 nodes will be
  helped by the cluster2 groupd sending its version.
- if someone adds a cluster2 node to a cluster3 cluster (which is not
  supposed to be done), detect the newer version and exit

Signed-off-by: David Teigland <teigland@redhat.com>
---
 group/daemon/cpg.c         |   91 ++++++++++++++++++++++++++++++++++++++++++++
 group/daemon/gd_internal.h |    3 +-
 group/daemon/main.c        |    2 +-
 3 files changed, 94 insertions(+), 2 deletions(-)

diff --git a/group/daemon/cpg.c b/group/daemon/cpg.c
index 3ac42f9..869cdb3 100644
--- a/group/daemon/cpg.c
+++ b/group/daemon/cpg.c
@@ -22,6 +22,20 @@ static cpg_handle_t		saved_handle;
 static struct cpg_name		saved_name;
 static int			message_flow_control_on;
 
+#define GROUP_LIBGROUP		2
+#define GROUP_LIBCPG		3
+
+#define CLUSTER2		2
+#define CLUSTER3		3
+
+struct group_version {
+	uint32_t nodeid;
+	uint16_t cluster;
+	uint16_t group_mode;
+	uint16_t groupd_compat;
+	uint16_t groupd_count;
+	uint32_t unused;
+};
 
 static node_t *find_group_node(group_t *g, int nodeid)
 {
@@ -183,6 +197,52 @@ static int send_gid(uint32_t gid)
 	return send_message_groupd(&g, &msg, sizeof(msg), MSG_GLOBAL_ID);
 }
 
+static void _send_version(int nodeid, int cluster, int mode, int compat)
+{
+	group_t g, *gp;
+	char *buf;
+	msg_t *msg;
+	int len;
+	int count = 0;
+	struct group_version *ver;
+
+	list_for_each_entry(gp, &gd_groups, list)
+		count++;
+
+	/* just so log_group will work */
+	memset(&g, 0, sizeof(group_t));
+	strcpy(g.name, "groupd");
+
+	len = sizeof(msg_t) + sizeof(struct group_version);
+
+	buf = malloc(len);
+	if (!buf)
+		return;
+	memset(buf, 0, len);
+
+	msg = (msg_t *)buf;
+	ver = (struct group_version *)(buf + sizeof(msg_t));
+
+	msg->ms_type = MSG_GROUP_VERSION;
+	msg_bswap_out(msg);
+
+	log_debug("send_version nodeid %d cluster %d mode %d compat %d",
+		  nodeid, cluster, mode, compat);
+
+	ver->nodeid	   = cpu_to_le32(nodeid);
+	ver->cluster       = cpu_to_le16(cluster);
+	ver->group_mode    = cpu_to_le16(mode);
+	ver->groupd_compat = cpu_to_le16(compat);
+	ver->groupd_count  = cpu_to_le16(count);
+
+	send_message_groupd(&g, buf, len, MSG_GROUP_VERSION);
+}
+
+static void send_version(void)
+{
+	_send_version(our_nodeid, CLUSTER2, GROUP_LIBGROUP, 1);
+}
+
 void process_groupd_confchg(void)
 {
 	group_t *g;
@@ -193,6 +253,9 @@ void process_groupd_confchg(void)
 	log_debug("groupd confchg total %d left %d joined %d",
 		  saved_member_count, saved_left_count, saved_joined_count);
 
+	if (saved_joined_count)
+		send_version();
+
 	memcpy(&groupd_cpg_member, &saved_member, sizeof(saved_member));
 	groupd_cpg_member_count = saved_member_count;
 
@@ -292,6 +355,29 @@ group_t *find_group_by_handle(cpg_handle_t h)
 	return NULL;
 }
 
+static void version_copy_in(struct group_version *ver)
+{
+	ver->nodeid        = le32_to_cpu(ver->nodeid);
+	ver->cluster       = le16_to_cpu(ver->cluster);
+	ver->group_mode    = le16_to_cpu(ver->group_mode);
+	ver->groupd_compat = le16_to_cpu(ver->groupd_compat);
+	ver->groupd_count  = le16_to_cpu(ver->groupd_count);
+}
+
+static void receive_version(int from, msg_t *msg, int len)
+{
+	struct group_version *ver;
+
+	ver = (struct group_version *)((char *)msg + sizeof(msg_t));
+
+	version_copy_in(ver);
+
+	if (ver->group_mode == GROUP_LIBCPG) {
+		log_print("incompatible group mode from %d", from);
+		exit(1);
+	}
+}
+
 void deliver_cb(cpg_handle_t handle, struct cpg_name *group_name,
 		uint32_t nodeid, uint32_t pid, void *data, int data_len)
 {
@@ -307,6 +393,11 @@ void deliver_cb(cpg_handle_t handle, struct cpg_name *group_name,
 
 	msg_bswap_in(msg);
 
+	if (msg->ms_type == MSG_GROUP_VERSION) {
+		receive_version(nodeid, msg, data_len);
+		return;
+	}
+
 	if (msg->ms_type == MSG_GLOBAL_ID) {
 		to_nodeid = msg->ms_global_id & 0x0000FFFF;
 		counter = (msg->ms_global_id >> 16) & 0x0000FFFF;
diff --git a/group/daemon/gd_internal.h b/group/daemon/gd_internal.h
index b842905..b56dd92 100644
--- a/group/daemon/gd_internal.h
+++ b/group/daemon/gd_internal.h
@@ -178,9 +178,10 @@ struct app {
 #define MSG_APP_RECOVER        3
 #define MSG_APP_INTERNAL       4
 #define MSG_GLOBAL_ID          5
+#define MSG_GROUP_VERSION      6
 
 #define MSG_VER_MAJOR          1
-#define MSG_VER_MINOR          0
+#define MSG_VER_MINOR          1
 #define MSG_VER_PATCH          0
 
 struct msg {
diff --git a/group/daemon/main.c b/group/daemon/main.c
index e02c925..8e278c5 100644
--- a/group/daemon/main.c
+++ b/group/daemon/main.c
@@ -97,7 +97,7 @@ static int do_read(int fd, void *buf, size_t count)
 static int ignore_gfs_nolock(char *sysfs_dir, char *table)
 {
 	char path[PATH_MAX];
-	int rv, fd;
+	int fd;
 
 	if (!strstr(sysfs_dir, "gfs"))
 		return 0;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]