[Sheepdog] [PATCH v2 3/7] sheep: remove joining flag

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Thu Oct 20 09:24:28 CEST 2011


We no longer receives any events during node joining, so we can remove
the joining flag.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/group.c      |   85 ++++-----------------------------------------------
 sheep/sheep_priv.h |    2 -
 2 files changed, 7 insertions(+), 80 deletions(-)

diff --git a/sheep/group.c b/sheep/group.c
index 7315fce..6f7766a 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -107,28 +107,7 @@ struct work_leave {
 	}							\
 })
 
-enum cpg_event_work_bits {
-	CPG_EVENT_WORK_RUNNING = 1,
-	CPG_EVENT_WORK_JOINING,
-};
-
-#define CPG_EVENT_WORK_FNS(bit, name)					\
-static int cpg_event_##name(void)					\
-{									\
-	return test_bit(CPG_EVENT_WORK_##bit,				\
-		&sys->cpg_event_work_flags);				\
-}									\
-static void cpg_event_clear_##name(void)				\
-{									\
-	clear_bit(CPG_EVENT_WORK_##bit, &sys->cpg_event_work_flags);	\
-}									\
-static void cpg_event_set_##name(void)					\
-{									\
-	set_bit(CPG_EVENT_WORK_##bit, &sys->cpg_event_work_flags);	\
-}
-
-CPG_EVENT_WORK_FNS(RUNNING, running)
-CPG_EVENT_WORK_FNS(JOINING, joining)
+static int cpg_event_running;
 
 static int get_node_idx(struct sheepdog_node_list_entry *ent,
 			struct sheepdog_node_list_entry *entries, int nr_nodes)
@@ -952,11 +931,7 @@ static void sd_notify_handler(struct sheepdog_node_list_entry *sender,
 	} else
 		w->msg = NULL;
 
-	if (cpg_event_joining() && m->state == DM_FIN) {
-		list_add(&cevent->cpg_event_list, &sys->cpg_event_siblings);
-		cpg_event_clear_joining();
-	} else
-		list_add_tail(&cevent->cpg_event_list, &sys->cpg_event_siblings);
+	list_add_tail(&cevent->cpg_event_list, &sys->cpg_event_siblings);
 
 	start_cpg_event_work();
 }
@@ -1268,9 +1243,6 @@ static void cpg_event_fn(struct work *work, int idx)
 {
 	struct cpg_event *cevent = sys->cur_cevent;
 
-	vprintf(SDOG_DEBUG, "%p, %d %lx\n", cevent, cevent->ctype,
-		sys->cpg_event_work_flags);
-
 	/*
 	 * we can't touch sys->cpg_event_siblings because of a race
 	 * with sd_deliver() and sd_confchg()...
@@ -1310,12 +1282,6 @@ static void cpg_event_done(struct work *work, int idx)
 
 	vprintf(SDOG_DEBUG, "%p\n", cevent);
 
-	if (cpg_event_joining())
-		goto out;
-
-	if (cevent->skip)
-		goto out;
-
 	switch (cevent->ctype) {
 	case CPG_EVENT_JOIN:
 		__sd_join_done(cevent);
@@ -1324,15 +1290,8 @@ static void cpg_event_done(struct work *work, int idx)
 		__sd_leave_done(cevent);
 		break;
 	case CPG_EVENT_NOTIFY:
-	{
-		struct work_notify *w = container_of(cevent, struct work_notify, cev);
-
-		if (sys->join_finished && w->msg->state == DM_INIT)
-			cpg_event_set_joining();
-
 		__sd_notify_done(cevent);
 		break;
-	}
 	case CPG_EVENT_REQUEST:
 		vprintf(SDOG_ERR, "should not happen\n");
 		break;
@@ -1340,10 +1299,9 @@ static void cpg_event_done(struct work *work, int idx)
 		vprintf(SDOG_ERR, "unknown event %d\n", cevent->ctype);
 	}
 
-out:
 	vprintf(SDOG_DEBUG, "free %p\n", cevent);
 	cpg_event_free(cevent);
-	cpg_event_clear_running();
+	cpg_event_running = 0;
 
 	if (!list_empty(&sys->cpg_event_siblings))
 		start_cpg_event_work();
@@ -1426,42 +1384,13 @@ void start_cpg_event_work(void)
 
 	cevent = list_first_entry(&sys->cpg_event_siblings,
 				  struct cpg_event, cpg_event_list);
-
-	vprintf(SDOG_DEBUG, "%lx %u\n", sys->cpg_event_work_flags,
-		cevent->ctype);
-
 	/*
 	 * we need to serialize cpg events so we don't call queue_work
 	 * if a thread is still running for a cpg event; executing
-	 * cpg_event_fn() or cpg_event_done(). A exception: if a
-	 * thread is running for a deliver for VDI, then we need to
-	 * run io requests.
+	 * cpg_event_fn() or cpg_event_done().
 	 */
-	if (cpg_event_running() && is_membership_change_event(cevent->ctype))
+	if (cpg_event_running && is_membership_change_event(cevent->ctype))
 		return;
-
-	/*
-	 * we are in the processing of handling JOIN so we can't
-	 * execute requests (or cpg events).
-	 */
-	if (cpg_event_joining()) {
-		if (cevent->ctype == CPG_EVENT_REQUEST) {
-			struct request *req = container_of(cevent, struct request, cev);
-			if (is_io_request(req->rq.opcode) && req->rq.flags & SD_FLAG_CMD_DIRECT) {
-				list_del(&cevent->cpg_event_list);
-
-				req->rp.result = SD_RES_NEW_NODE_VER;
-
-				/* TODO: cleanup */
-				list_add_tail(&req->r_wlist, &sys->outstanding_req_list);
-				sys->nr_outstanding_io++;
-
-				req->work.done(&req->work, 0);
-			}
-		}
-		return;
-	}
-
 do_retry:
 	retry = 0;
 
@@ -1547,7 +1476,7 @@ do_retry:
 	if (retry)
 		goto do_retry;
 
-	if (cpg_event_running() || list_empty(&sys->cpg_event_siblings))
+	if (cpg_event_running || list_empty(&sys->cpg_event_siblings))
 		return;
 
 	cevent = list_first_entry(&sys->cpg_event_siblings,
@@ -1559,7 +1488,7 @@ do_retry:
 	list_del(&cevent->cpg_event_list);
 	sys->cur_cevent = cevent;
 
-	cpg_event_set_running();
+	cpg_event_running = 1;
 
 	INIT_LIST_HEAD(&cpg_event_work.w_list);
 	cpg_event_work.fn = cpg_event_fn;
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 17872f9..0ada007 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -48,7 +48,6 @@ enum cpg_event_type {
 struct cpg_event {
 	enum cpg_event_type ctype;
 	struct list_head cpg_event_list;
-	unsigned int skip;
 };
 
 struct client_info {
@@ -139,7 +138,6 @@ struct cluster_info {
 
 	struct list_head cpg_event_siblings;
 	struct cpg_event *cur_cevent;
-	unsigned long cpg_event_work_flags;
 	int nr_outstanding_io;
 	int nr_outstanding_reqs;
 
-- 
1.7.2.5




More information about the sheepdog mailing list