cluster-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
From: teigland@sourceware.org <teigland@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/group/daemon joinleave.c gd_internal.h ...
Date: 28 Jun 2006 22:16:40 -0000	[thread overview]
Message-ID: <20060628221640.10023.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	teigland at sourceware.org	2006-06-28 22:16:37

Modified files:
	group/daemon   : joinleave.c gd_internal.h app.c 

Log message:
	- extra checking and debugging when events get backlogged
	- prevent joins while we're still leaving and leaves while
	we're still joining

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/daemon/joinleave.c.diff?cvsroot=cluster&r1=1.16&r2=1.17
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/daemon/gd_internal.h.diff?cvsroot=cluster&r1=1.35&r2=1.36
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/daemon/app.c.diff?cvsroot=cluster&r1=1.33&r2=1.34

--- cluster/group/daemon/joinleave.c	2006/06/21 20:43:54	1.16
+++ cluster/group/daemon/joinleave.c	2006/06/28 22:16:36	1.17
@@ -93,7 +93,7 @@
 	a->client = ci;
 
 	log_debug("%d:%s got join", level, name);
-
+	g->joining = 1;
 	rv = do_cpg_join(g);
  out:
 	return rv;
@@ -102,6 +102,7 @@
 int do_leave(char *name, int level)
 {
 	group_t *g;
+	event_t *ev;
 	int rv;
 
 	g = find_group_level(name, level);
@@ -113,8 +114,30 @@
 		return -EINVAL;
 	}
 
-	log_debug("%d:%s got leave", level, name);
+	if (g->joining) {
+		log_group(g, "leave: still joining");
+		return -EAGAIN;
+	}
+
+	if (g->leaving) {
+		log_group(g, "leave: already leaving");
+		return -EBUSY;
+	}
 
+	if (g->app->current_event &&
+	    g->app->current_event->nodeid == our_nodeid) {
+		log_group(g, "leave: busy event %llx state %s",
+			  ev->id, ev_state_str(g->app->current_event));
+		return -EAGAIN;
+	}
+
+	list_for_each_entry(ev, &g->app->events, list) {
+		ASSERT(ev->nodeid != our_nodeid);
+		log_group(g, "event id %llx", ev->id);
+	}
+
+	log_debug("%d:%s got leave", level, name);
+	g->leaving = 1;
 	rv = do_cpg_leave(g);
 	return rv;
 }
--- cluster/group/daemon/gd_internal.h	2006/06/22 18:39:26	1.35
+++ cluster/group/daemon/gd_internal.h	2006/06/28 22:16:36	1.36
@@ -169,6 +169,8 @@
 	int			cpg_fd;
 	int			cpg_client;
 	int			have_set_id;
+	int			joining;
+	int			leaving;
 };
 
 struct app {
--- cluster/group/daemon/app.c	2006/06/22 21:12:33	1.33
+++ cluster/group/daemon/app.c	2006/06/28 22:16:36	1.34
@@ -525,16 +525,52 @@
 	}
 }
 
+event_t *search_event(group_t *g, int nodeid)
+{
+	event_t *ev;
+
+	list_for_each_entry(ev, &g->app->events, list) {
+		if (ev->nodeid == nodeid)
+			return ev;
+	}
+	return NULL;
+}
+
+void dump_queued_events(group_t *g)
+{
+	event_t *ev;
+
+	list_for_each_entry(ev, &g->app->events, list) {
+		log_group(g, "    queued ev %d %llx %s",
+			  ev->nodeid, ev->id, ev_state_str(ev));
+	}
+}
+
 int queue_app_join(group_t *g, int nodeid)
 {
 	event_t *ev;
 
+	/* sanity check */
+	ev = g->app->current_event;
+	if (ev && ev->nodeid == nodeid) {
+		log_group(g, "queue_app_join: current event %d %llx %s",
+			  nodeid, ev->id, ev_state_str(ev));
+	}
+
+	/* sanity check */
+	ev = search_event(g, nodeid);
+	if (ev) {
+		log_group(g, "queue_app_join: queued event %d %llx %s",
+			  nodeid, ev->id, ev_state_str(ev));
+	}
+
 	ev = create_event(g);
 	ev->nodeid = nodeid;
 	ev->state = EST_JOIN_BEGIN;
 	ev->id = make_event_id(g, EST_JOIN_BEGIN, nodeid);
 
 	log_group(g, "queue join event for nodeid %d", nodeid);
+	dump_queued_events(g);
 
 	if (nodeid == our_nodeid)
 		add_event_nodes(g, ev);
@@ -547,12 +583,27 @@
 {
 	event_t *ev;
 
+	/* sanity check */
+	ev = g->app->current_event;
+	if (ev && ev->nodeid == nodeid) {
+		log_group(g, "queue_app_leave: current event %d %llx %s",
+			  nodeid, ev->id, ev_state_str(ev));
+	}
+
+	/* sanity check */
+	ev = search_event(g, nodeid);
+	if (ev) {
+		log_group(g, "queue_app_leave: queued event %d %llx %s",
+			  nodeid, ev->id, ev_state_str(ev));
+	}
+
 	ev = create_event(g);
 	ev->nodeid = nodeid;
 	ev->state = EST_LEAVE_BEGIN;
 	ev->id = make_event_id(g, EST_LEAVE_BEGIN, nodeid);
 
 	log_group(g, "queue leave event for nodeid %d", nodeid);
+	dump_queued_events(g);
 
 	list_add_tail(&ev->list, &g->app->events);
 	return 0;
@@ -845,8 +896,10 @@
 	case EST_JOIN_ALL_STARTED:
 		app_finish(a);
 
-		if (is_our_join(ev))
+		if (is_our_join(ev)) {
 			purge_messages(g);
+			g->joining = 0;
+		}
 		free_event(ev);
 		a->current_event = NULL;
 		rv = 1;



                 reply	other threads:[~2006-06-28 22:16 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=20060628221640.10023.qmail@sourceware.org \
    --to=teigland@sourceware.org \
    /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 NNTP newsgroup(s).