From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14377 invoked by alias); 26 Aug 2008 16:49:42 -0000 Received: (qmail 14371 invoked by alias); 26 Aug 2008 16:49:41 -0000 X-Spam-Status: No, hits=-1.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_63,J_CHICKENPOX_66,KAM_MX,SPF_HELO_PASS X-Spam-Check-By: sourceware.org X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on bastion.fedora.phx.redhat.com X-Spam-Level: Subject: STABLE2 - groupd: send and check version messages To: cluster-cvs-relay@redhat.com X-Project: Cluster Project X-Git-Module: cluster.git X-Git-Refname: refs/heads/STABLE2 X-Git-Reftype: branch X-Git-Oldrev: 3d592cd8d21b3bd14587b899364686b9586a8111 X-Git-Newrev: c164f9dc1298a25af7a7398313a64b5e88a8280e From: David Teigland Message-Id: <20080826164421.077F112035E@lists.fedorahosted.org> Date: Wed, 27 Aug 2008 06:24:00 -0000 X-Scanned-By: MIMEDefang 2.58 on 172.16.52.254 Mailing-List: contact cluster-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cluster-cvs-owner@sourceware.org X-SW-Source: 2008-q3/txt/msg00315.txt.bz2 Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c164f9dc1298a25af7a7398313a64b5e88a8280e Commit: c164f9dc1298a25af7a7398313a64b5e88a8280e Parent: 3d592cd8d21b3bd14587b899364686b9586a8111 Author: David Teigland AuthorDate: Thu Aug 21 13:55:52 2008 -0500 Committer: David Teigland 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 --- 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;