From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2920 invoked by alias); 16 Jul 2008 20:42:12 -0000 Received: (qmail 2890 invoked by uid 9453); 16 Jul 2008 20:42:12 -0000 Date: Wed, 16 Jul 2008 20:42:00 -0000 Message-ID: <20080716204211.2874.qmail@sourceware.org> From: teigland@sourceware.org To: cluster-cvs@sources.redhat.com, cluster-devel@redhat.com Subject: Cluster Project branch, master, updated. cluster-2.99.06-14-gab0f0a1 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: a2d8eb2d13f854b22184e1948f5e5cfa1c107be8 X-Git-Newrev: ab0f0a1043740922837819238b3450aaa668a2c5 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/msg00081.txt.bz2 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Cluster Project". http://sources.redhat.com/git/gitweb.cgi?p=cluster.git;a=commitdiff;h=ab0f0a1043740922837819238b3450aaa668a2c5 The branch, master has been updated via ab0f0a1043740922837819238b3450aaa668a2c5 (commit) from a2d8eb2d13f854b22184e1948f5e5cfa1c107be8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ab0f0a1043740922837819238b3450aaa668a2c5 Author: David Teigland Date: Wed Jul 16 15:32:16 2008 -0500 gfs_controld: change start message from new members Have new nodes include an id struct for all members so we have the extra verification step when matching start messages to changes. Signed-off-by: David Teigland ----------------------------------------------------------------------- Summary of changes: group/gfs_controld/cpg-new.c | 119 ++++++++++++++++++++--------------------- 1 files changed, 58 insertions(+), 61 deletions(-) diff --git a/group/gfs_controld/cpg-new.c b/group/gfs_controld/cpg-new.c index 672b79d..5c72bfd 100644 --- a/group/gfs_controld/cpg-new.c +++ b/group/gfs_controld/cpg-new.c @@ -501,6 +501,9 @@ static int nodes_failed(struct mountgroup *mg) return 0; } +/* find a start message from an old node to use; it doesn't matter which old + node we take the start message from, they should all be the same */ + static int get_id_list(struct mountgroup *mg, struct id_info **ids, int *count, int *size) { @@ -509,10 +512,6 @@ static int get_id_list(struct mountgroup *mg, struct id_info **ids, cg = list_first_entry(&mg->changes, struct change, list); - /* find a start message from an old node to use; it doesn't - matter which old node we take the start message from, they - should all be the same */ - list_for_each_entry(memb, &cg->members, list) { if (!memb->mg_info->started_count) continue; @@ -784,26 +783,17 @@ static int match_change(struct mountgroup *mg, struct change *cg, sizeof(struct gfs_header) + mi->mg_info_size); - if (!mi->started_count) { - if (mi->id_info_count != 1) { - log_error("match_change fail %d:%u id_count %d exp 1", - hd->nodeid, seq, mi->id_info_count); - return 0; - } - } else { - /* We can ignore messages if we're not in the list of members. - The one known time this will happen is after we've joined - the cpg, we can get messages for changes prior to the change - in which we're added. */ + /* We can ignore messages if we're not in the list of members. + The one known time this will happen is after we've joined + the cpg, we can get messages for changes prior to the change + in which we're added. */ - id = get_id_struct(ids, mi->id_info_count, mi->id_info_size, - our_nodeid); + id = get_id_struct(ids, mi->id_info_count, mi->id_info_size, our_nodeid); - if (!id || !(id->flags & IDI_NODEID_IS_MEMBER)) { - log_group(mg, "match_change fail %d:%u we are not in " - "members", hd->nodeid, seq); - return 0; - } + if (!id || !(id->flags & IDI_NODEID_IS_MEMBER)) { + log_group(mg, "match_change fail %d:%u we are not in members", + hd->nodeid, seq); + return 0; } memb = find_memb(cg, hd->nodeid); @@ -831,17 +821,15 @@ static int match_change(struct mountgroup *mg, struct change *cg, id = ids; for (i = 0; i < mi->id_info_count; i++) { - if (!(id->flags & IDI_NODEID_IS_MEMBER)) - goto next; - - memb = find_memb(cg, id->nodeid); - if (!memb) { - log_group(mg, "match_change fail %d:%u no memb %d", - hd->nodeid, seq, id->nodeid); - members_mismatch = 1; - break; + if (id->flags & IDI_NODEID_IS_MEMBER) { + memb = find_memb(cg, id->nodeid); + if (!memb) { + log_group(mg, "match_change fail %d:%u memb %d", + hd->nodeid, seq, id->nodeid); + members_mismatch = 1; + break; + } } - next: id = (struct id_info *)((char *)id + mi->id_info_size); } @@ -993,9 +981,6 @@ static int count_ids(struct mountgroup *mg) struct journal *j; int count = 0; - if (!mg->started_count) - return 1; - cg = list_first_entry(&mg->changes, struct change, list); list_for_each_entry(memb, &cg->members, list) @@ -1037,6 +1022,14 @@ static void send_start(struct mountgroup *mg) id_count = count_ids(mg); + /* sanity check */ + + if (!mg->started_count && id_count != cg->member_count) { + log_error("send_start bad counts id_count %d member_count %d", + cg->member_count, id_count); + return; + } + len = sizeof(struct gfs_header) + sizeof(struct mg_info) + id_count * sizeof(struct id_info); @@ -1072,31 +1065,27 @@ static void send_start(struct mountgroup *mg) /* fill in id_info entries */ - /* new members only send info about themselves, it's all they have */ - - if (!mg->started_count) { - flags = IDI_NODEID_IS_MEMBER; - flags |= mg->ro ? IDI_MOUNT_RO : 0; - flags |= mg->spectator ? IDI_MOUNT_SPECTATOR : 0; - - id->nodeid = cpu_to_le32(our_nodeid); - id->jid = cpu_to_le32(JID_NONE); - id->flags = cpu_to_le32(flags); - goto do_send; - } - - /* all old members send full info about all old members, and empty - id_info slots about new members. The union of start messages - from a single old node and all new nodes give a complete picture - of state for all members. In sync_state, all nodes (old and new) - make this union, and then assign jid's to new nodes. */ + /* New members send info about themselves, and empty id_info slots for + all other members. Old members send full info about all old + members, and empty id_info slots about new members. The union of + start messages from a single old node and all new nodes give a + complete picture of state for all members. In sync_state, all nodes + (old and new) make this union, and then assign jid's to new nodes. */ list_for_each_entry(memb, &cg->members, list) { - if (is_added(mg, memb->nodeid)) { + + if (!mg->started_count || is_added(mg, memb->nodeid)) { /* send empty slot for new member */ jid = JID_NONE; flags = IDI_NODEID_IS_MEMBER; + + /* include our own info which no one knows yet */ + if (!mg->started_count && memb->nodeid == our_nodeid) { + flags |= mg->ro ? IDI_MOUNT_RO : 0; + flags |= mg->spectator ? IDI_MOUNT_SPECTATOR : 0; + } new_memb++; + } else { /* send full info for old member */ node = get_node_history(mg, memb->nodeid); @@ -1145,7 +1134,14 @@ static void send_start(struct mountgroup *mg) } } - do_send: + /* sanity check */ + + if (!mg->started_count && (old_memb || old_journal || new_journal)) { + log_error("send_start %u bad counts om %d nm %d oj %d nj %d", + cg->seq, old_memb, new_memb, old_journal, new_journal); + return; + } + log_group(mg, "send_start %u id_count %d om %d nm %d oj %d nj %d", cg->seq, id_count, old_memb, new_memb, old_journal, new_journal); @@ -1518,7 +1514,7 @@ static void create_new_nodes(struct mountgroup *mg) { struct change *cg; struct member *memb; - struct id_info *id; + struct id_info *ids, *id; struct node *node; cg = list_first_entry(&mg->changes, struct change, list); @@ -1534,11 +1530,12 @@ static void create_new_nodes(struct mountgroup *mg) return; } - /* a new node sends one id struct describing itself */ + ids = (struct id_info *)(memb->start_msg + + sizeof(struct gfs_header) + + memb->mg_info->mg_info_size); - id = (struct id_info *)(memb->start_msg + - sizeof(struct gfs_header) + - memb->mg_info->mg_info_size); + id = get_id_struct(ids, memb->mg_info->id_info_count, + memb->mg_info->id_info_size, memb->nodeid); if (!(id->flags & IDI_NODEID_IS_MEMBER) || (id->flags & IDI_JID_NEEDS_RECOVERY)) { @@ -1934,7 +1931,7 @@ void process_recovery_uevent(char *table) /* * Assumption here is that only the first mounter will get * uevents when first_recovery_needed is set. - */ + */ /* make a local record of jid and recover_status; we may want to check below that we've seen uevents for all jids hooks/post-receive -- Cluster Project