public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
From: teigland@sourceware.org
To: cluster-cvs@sources.redhat.com, cluster-devel@redhat.com
Subject: Cluster Project branch, master, updated. cluster-2.99.06-34-gca00560
Date: Fri, 18 Jul 2008 19:08:00 -0000	[thread overview]
Message-ID: <20080718190848.17821.qmail@sourceware.org> (raw)

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=ca00560267f0dfbc12b53ffe18b601ff87386138

The branch, master has been updated
       via  ca00560267f0dfbc12b53ffe18b601ff87386138 (commit)
      from  e9c7fd5bec2bb2479229e33fed2d477a0377451f (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 ca00560267f0dfbc12b53ffe18b601ff87386138
Author: David Teigland <teigland@redhat.com>
Date:   Fri Jul 18 14:00:32 2008 -0500

    dlm_controld: improved start messages
    
    Copy the improved start/sync message formats from fenced/gfs_controld,
    which allows the messages to be extended in the future without breaking
    compatibility.
    
    Signed-off-by: David Teigland <teigland@redhat.com>

-----------------------------------------------------------------------

Summary of changes:
 group/dlm_controld/cpg.c |  350 ++++++++++++++++++++++++----------------------
 1 files changed, 185 insertions(+), 165 deletions(-)

diff --git a/group/dlm_controld/cpg.c b/group/dlm_controld/cpg.c
index 4ea31f3..6aa3402 100644
--- a/group/dlm_controld/cpg.c
+++ b/group/dlm_controld/cpg.c
@@ -50,6 +50,52 @@ struct change {
 	uint32_t combined_seq; /* for queries */
 };
 
+struct ls_info {
+	uint32_t ls_info_size;
+	uint32_t id_info_size;
+	uint32_t id_info_count;
+
+	uint32_t started_count;
+
+	int member_count;
+	int joined_count;
+	int remove_count;
+	int failed_count;
+};
+
+struct id_info {
+	int nodeid;
+};
+
+static void ls_info_in(struct ls_info *li)
+{
+	li->ls_info_size  = le32_to_cpu(li->ls_info_size);
+	li->id_info_size  = le32_to_cpu(li->id_info_size);
+	li->id_info_count = le32_to_cpu(li->id_info_count);
+	li->started_count = le32_to_cpu(li->started_count);
+	li->member_count  = le32_to_cpu(li->member_count);
+	li->joined_count  = le32_to_cpu(li->joined_count);
+	li->remove_count  = le32_to_cpu(li->remove_count);
+	li->failed_count  = le32_to_cpu(li->failed_count);
+}
+
+static void id_info_in(struct id_info *id)
+{
+	id->nodeid = le32_to_cpu(id->nodeid);
+}
+
+static void ids_in(struct ls_info *li, struct id_info *ids)
+{
+	struct id_info *id;
+	int i;
+
+	id = ids;
+	for (i = 0; i < li->id_info_count; i++) {
+		id_info_in(id);
+		id = (struct id_info *)((char *)id + li->id_info_size);
+	}
+}
+
 char *msg_name(int type)
 {
 	switch (type) {
@@ -80,25 +126,6 @@ char *msg_name(int type)
 	}
 }
 
-static char *str_nums(int *nums, int n_ints)
-{
-	static char buf[128];
-	int i, len, ret, pos = 0;
-
-	len = sizeof(buf);
-	memset(buf, 0, len);
-
-	for (i = 0; i < n_ints; i++) {
-		ret = snprintf(buf + pos, len - pos, "%d ",
-			       le32_to_cpu(nums[i]));
-		if (ret >= len - pos)
-			break;
-		pos += ret;
-	}
-
-	return buf;
-}
-
 static int _send_message(cpg_handle_t h, void *buf, int len, int type)
 {
 	struct iovec iov;
@@ -686,48 +713,42 @@ static void set_plock_ckpt_node(struct lockspace *ls)
 	ls->plock_ckpt_node = low;
 }
 
-#define COUNT_NUMS 5
+static struct id_info *get_id_struct(struct id_info *ids, int count, int size,
+                                     int nodeid)
+{
+	struct id_info *id = ids;
+	int i;
+
+	for (i = 0; i < count; i++) {
+		if (id->nodeid == nodeid)
+			return id;
+		id = (struct id_info *)((char *)id + size);
+	}
+	return NULL;
+}
 
 /* do the change details in the message match the details of the given change */
 
 static int match_change(struct lockspace *ls, struct change *cg,
-			struct dlm_header *hd, int len, uint32_t *started)
+			struct dlm_header *hd, struct ls_info *li,
+			struct id_info *ids)
 {
+	struct id_info *id;
 	struct member *memb;
-	int member_count, joined_count, remove_count, failed_count;
-	int i, n_ints, *nums, nodeid, members_mismatch;
 	uint32_t seq = hd->msgdata;
-	uint32_t started_count;
+	int i, members_mismatch;
 
-	nums = (int *)((char *)hd + sizeof(struct dlm_header));
+	/* 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. */
 
-	started_count = le32_to_cpu(nums[0]);
-	member_count = le32_to_cpu(nums[1]);
-	joined_count = le32_to_cpu(nums[2]);
-	remove_count = le32_to_cpu(nums[3]);
-	failed_count = le32_to_cpu(nums[4]);
+	id = get_id_struct(ids, li->id_info_count, li->id_info_size,our_nodeid);
 
-	*started = started_count;
-
-	n_ints = COUNT_NUMS + member_count;
-	if (len < (sizeof(struct dlm_header) + (n_ints * sizeof(int)))) {
-		log_group(ls, "match_change fail %d:%u bad len %d nums %s",
-			  hd->nodeid, seq, len, str_nums(nums, n_ints));
-		return 0;
-	}
-
-	/* 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. */
-
-	for (i = 0; i < member_count; i++) {
-		if (our_nodeid == le32_to_cpu(nums[COUNT_NUMS + i]))
-			break;
-	}
-	if (i == member_count) {
-		log_group(ls, "match_change fail %d:%u we are not in members",
+	if (!id) {
+		log_debug("match_change fail %d:%u we are not in members",
 			  hd->nodeid, seq);
-		return 0;
+                return 0;
 	}
 
 	memb = find_memb(cg, hd->nodeid);
@@ -740,28 +761,29 @@ static int match_change(struct lockspace *ls, struct change *cg,
 	/* verify this is the right change by matching the counts
 	   and the nodeids of the current members */
 
-	if (member_count != cg->member_count ||
-	    joined_count != cg->joined_count ||
-	    remove_count != cg->remove_count ||
-	    failed_count != cg->failed_count) {
+	if (li->member_count != cg->member_count ||
+	    li->joined_count != cg->joined_count ||
+	    li->remove_count != cg->remove_count ||
+	    li->failed_count != cg->failed_count) {
 		log_group(ls, "match_change fail %d:%u expect counts "
-			  "%d %d %d %d nums %s",
-			  hd->nodeid, seq,
+			  "%d %d %d %d", hd->nodeid, seq,
 			  cg->member_count, cg->joined_count,
-			  cg->remove_count, cg->failed_count,
-			  str_nums(nums, n_ints));
+			  cg->remove_count, cg->failed_count);
 		return 0;
 	}
 
 	members_mismatch = 0;
-	for (i = 0; i < member_count; i++) {
-		nodeid = le32_to_cpu(nums[COUNT_NUMS + i]);
-		memb = find_memb(cg, nodeid);
-		if (memb)
-			continue;
-		log_group(ls, "match_change fail %d:%u no memb %d",
-			  hd->nodeid, seq, nodeid);
-		members_mismatch = 1;
+	id = ids;
+
+	for (i = 0; i < li->id_info_count; i++) {
+		memb = find_memb(cg, id->nodeid);
+		if (!memb) {
+			log_group(ls, "match_change fail %d:%u no memb %d",
+			  	  hd->nodeid, seq, id->nodeid);
+			members_mismatch = 1;
+			break;
+		}
+		id = (struct id_info *)((char *)id + li->id_info_size);
 	}
 	if (members_mismatch)
 		return 0;
@@ -770,76 +792,6 @@ static int match_change(struct lockspace *ls, struct change *cg,
 	return 1;
 }
 
-static void send_plocks_stored(struct lockspace *ls)
-{
-	struct change *cg = list_first_entry(&ls->changes, struct change, list);
-	struct dlm_header *hd;
-	struct member *memb;
-	int n_ints, len, *p, i;
-	char *buf;
-
-	n_ints = COUNT_NUMS + cg->member_count;
-	len = sizeof(struct dlm_header) + (n_ints * sizeof(uint32_t));
-
-	buf = malloc(len);
-	if (!buf) {
-		return;
-	}
-	memset(buf, 0, len);
-
-	hd = (struct dlm_header *)buf;
-	hd->type = DLM_MSG_PLOCKS_STORED;
-	hd->msgdata = cg->seq;
-
-	p = (int *)(buf + sizeof(struct dlm_header));
-
-	/* sending all this stuff is probably unnecessary, but gives
-	   us more certainty in matching stopped messages to the correct
-	   change that they are for */
-
-	p[0] = cpu_to_le32(ls->started_count);
-	p[1] = cpu_to_le32(cg->member_count);
-	p[2] = cpu_to_le32(cg->joined_count);
-	p[3] = cpu_to_le32(cg->remove_count);
-	p[4] = cpu_to_le32(cg->failed_count);
-
-	i = COUNT_NUMS;
-	list_for_each_entry(memb, &cg->members, list)
-		p[i++] = cpu_to_le32(memb->nodeid);
-
-	dlm_send_message(ls, buf, len);
-
-	free(buf);
-}
-
-static void receive_plocks_stored(struct lockspace *ls, struct dlm_header *hd,
-				  int len)
-{
-	uint32_t started_count;
-
-	log_group(ls, "receive_plocks_stored %d:%u need_plocks %d",
-		  hd->nodeid, hd->msgdata, ls->need_plocks);
-
-	if (!ls->need_plocks)
-		return;
-
-	/* a confchg arrived between the last start and the plocks_stored msg,
-	   so we ignore this plocks_stored msg and wait to read the ckpt until
-	   the next plocks_stored msg following the current start */
-	   
-	if (!list_empty(&ls->changes) || !ls->started_change ||
-	    !match_change(ls, ls->started_change, hd, len, &started_count)) {
-		log_group(ls, "receive_plocks_stored %d:%u ignore",
-			  hd->nodeid, hd->msgdata);
-		return;
-	}
-
-	retrieve_plocks(ls);
-	process_saved_plocks(ls);
-	ls->need_plocks = 0;
-	ls->save_plocks = 0;
-}
-
 /* Unfortunately, there's no really simple way to match a message with the
    specific change that it was sent for.  We hope that by passing all the
    details of the change in the message, we will be able to uniquely match the
@@ -860,12 +812,12 @@ static void receive_plocks_stored(struct lockspace *ls, struct dlm_header *hd,
    for confchg1 or confchg2?  Hopefully by comparing the counts and members. */
 
 static struct change *find_change(struct lockspace *ls, struct dlm_header *hd,
-				  int len, uint32_t *started_count)
+				  struct ls_info *li, struct id_info *ids)
 {
 	struct change *cg;
 
 	list_for_each_entry_reverse(cg, &ls->changes, list) {
-		if (!match_change(ls, cg, hd, len, started_count))
+		if (!match_change(ls, cg, hd, li, ids))
 			continue;
 		return cg;
 	}
@@ -891,14 +843,20 @@ static void receive_start(struct lockspace *ls, struct dlm_header *hd, int len)
 {
 	struct change *cg;
 	struct member *memb;
+	struct ls_info *li;
+	struct id_info *ids;
 	uint32_t seq = hd->msgdata;
-	uint32_t started_count;
 	int added;
 
-	log_group(ls, "receive_start %d:%u flags %x len %d", hd->nodeid, seq,
-		  hd->flags, len);
+	log_group(ls, "receive_start %d:%u len %d", hd->nodeid, seq, len);
+
+	li = (struct ls_info *)((char *)hd + sizeof(struct dlm_header));
+	ids = (struct id_info *)((char *)li + sizeof(struct ls_info));
 
-	cg = find_change(ls, hd, len, &started_count);
+	ls_info_in(li);
+	ids_in(li, ids);
+
+	cg = find_change(ls, hd, li, ids);
 	if (!cg)
 		return;
 
@@ -913,9 +871,9 @@ static void receive_start(struct lockspace *ls, struct dlm_header *hd, int len)
 
 	added = is_added(ls, hd->nodeid);
 
-	if (added && started_count) {
+	if (added && li->started_count) {
 		log_error("receive_start %d:%u add node with started_count %u",
-			  hd->nodeid, seq, started_count);
+			  hd->nodeid, seq, li->started_count);
 
 		/* observe this scheme working before using it; I'm not sure
 		   that a joining node won't ever see an existing node as added
@@ -930,50 +888,102 @@ static void receive_start(struct lockspace *ls, struct dlm_header *hd, int len)
 	memb->start = 1;
 }
 
-static void send_start(struct lockspace *ls)
+static void receive_plocks_stored(struct lockspace *ls, struct dlm_header *hd,
+				  int len)
 {
-	struct change *cg = list_first_entry(&ls->changes, struct change, list);
+	struct ls_info *li;
+	struct id_info *ids;
+
+	log_group(ls, "receive_plocks_stored %d:%u need_plocks %d",
+		  hd->nodeid, hd->msgdata, ls->need_plocks);
+
+	if (!ls->need_plocks)
+		return;
+
+	/* a confchg arrived between the last start and the plocks_stored msg,
+	   so we ignore this plocks_stored msg and wait to read the ckpt until
+	   the next plocks_stored msg following the current start */
+   
+	if (!list_empty(&ls->changes) || !ls->started_change) {
+		log_group(ls, "receive_plocks_stored %d:%u ignore",
+			  hd->nodeid, hd->msgdata);
+		return;
+	}
+
+	li = (struct ls_info *)((char *)hd + sizeof(struct dlm_header));
+	ids = (struct id_info *)((char *)li + sizeof(struct ls_info));
+	ls_info_in(li);
+	ids_in(li, ids);
+
+	if (!match_change(ls, ls->started_change, hd, li, ids)) {
+		log_group(ls, "receive_plocks_stored %d:%u ignore no match",
+			  hd->nodeid, hd->msgdata);
+		return;
+	}
+
+	retrieve_plocks(ls);
+	process_saved_plocks(ls);
+	ls->need_plocks = 0;
+	ls->save_plocks = 0;
+}
+
+static void send_info(struct lockspace *ls, int type)
+{
+	struct change *cg;
 	struct dlm_header *hd;
+	struct ls_info *li;
+	struct id_info *id;
 	struct member *memb;
-	int n_ints, len, *p, i;
 	char *buf;
+	int len, id_count;
+
+	cg = list_first_entry(&ls->changes, struct change, list);
 
-	n_ints = COUNT_NUMS + cg->member_count;
-	len = sizeof(struct dlm_header) + (n_ints * sizeof(int));
+	id_count = cg->member_count;
+
+	len = sizeof(struct dlm_header) + sizeof(struct ls_info) +
+	      id_count * sizeof(struct id_info);
 
 	buf = malloc(len);
 	if (!buf) {
+		log_error("send_info len %d no mem", len);
 		return;
 	}
 	memset(buf, 0, len);
 
 	hd = (struct dlm_header *)buf;
-	hd->type = DLM_MSG_START;
-	hd->msgdata = cg->seq;
+	li = (struct ls_info *)(buf + sizeof(*hd));
+	id = (struct id_info *)(buf + sizeof(*hd) + sizeof(*li));
 
+	/* fill in header (dlm_send_message handles part of header) */
+
+	hd->type = type;
+	hd->msgdata = cg->seq;
 	if (ls->joining)
 		hd->flags |= DLM_MFLG_JOINING;
-
 	if (!ls->need_plocks)
 		hd->flags |= DLM_MFLG_HAVEPLOCK;
 
-	p = (int *)(buf + sizeof(struct dlm_header));
+	/* fill in ls_info */
 
-	/* sending all this stuff is probably unnecessary, but gives
-	   us more certainty in matching stopped messages to the correct
-	   change that they are for */
+	li->ls_info_size  = cpu_to_le32(sizeof(struct ls_info));
+	li->id_info_size  = cpu_to_le32(sizeof(struct id_info));
+	li->id_info_count = cpu_to_le32(id_count);
+	li->started_count = cpu_to_le32(ls->started_count);
+	li->member_count  = cpu_to_le32(cg->member_count);
+	li->joined_count  = cpu_to_le32(cg->joined_count);
+	li->remove_count  = cpu_to_le32(cg->remove_count);
+	li->failed_count  = cpu_to_le32(cg->failed_count);
 
-	p[0] = cpu_to_le32(ls->started_count);
-	p[1] = cpu_to_le32(cg->member_count);
-	p[2] = cpu_to_le32(cg->joined_count);
-	p[3] = cpu_to_le32(cg->remove_count);
-	p[4] = cpu_to_le32(cg->failed_count);
+	/* fill in id_info entries */
 
-	i = COUNT_NUMS;
-	list_for_each_entry(memb, &cg->members, list)
-		p[i++] = cpu_to_le32(memb->nodeid);
+	list_for_each_entry(memb, &cg->members, list) {
+		id->nodeid = cpu_to_le32(memb->nodeid);
+		id++;
+	}
 
-	log_group(ls, "send_start %u flags %x counts %u %d %d %d %d",
+	log_group(ls, "send_%s %u flags %x counts %u %d %d %d %d",
+		  type == DLM_MSG_START ? "start" : "plocks_stored",
 		  cg->seq, hd->flags, ls->started_count, cg->member_count,
 		  cg->joined_count, cg->remove_count, cg->failed_count);
 
@@ -982,6 +992,16 @@ static void send_start(struct lockspace *ls)
 	free(buf);
 }
 
+static void send_start(struct lockspace *ls)
+{
+	send_info(ls, DLM_MSG_START);
+}
+
+static void send_plocks_stored(struct lockspace *ls)
+{
+	send_info(ls, DLM_MSG_PLOCKS_STORED);
+}
+
 static int nodes_added(struct lockspace *ls)
 {
 	struct change *cg;


hooks/post-receive
--
Cluster Project


                 reply	other threads:[~2008-07-18 19:08 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080718190848.17821.qmail@sourceware.org \
    --to=teigland@sourceware.org \
    --cc=cluster-cvs@sources.redhat.com \
    --cc=cluster-devel@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).