[Ocfs2-tools-devel] [PATCH 21/39] ocfs2_controld.cman: Provide a callback when the daemon group is joined

Joel Becker joel.becker at oracle.com
Fri Mar 14 16:52:44 PDT 2008


Rather than listen for clients at the very beginning (when the cluster
may not be ready), let's start listening after the daemon has joined the
"ocfs2" cluster group.  This is accomplished via a callback passed to
setup_cpg().

This also prepares us to negotiate with other daemons at startup.

Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
 ocfs2_controld/cpg.c            |   24 +++++++++++++++++++++---
 ocfs2_controld/main.c           |   19 ++++++++++++++-----
 ocfs2_controld/ocfs2_controld.h |    2 +-
 3 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/ocfs2_controld/cpg.c b/ocfs2_controld/cpg.c
index c4e9322..3423a43 100644
--- a/ocfs2_controld/cpg.c
+++ b/ocfs2_controld/cpg.c
@@ -76,6 +76,8 @@ struct cgroup {
 	int			cg_cb_left_count;
 };
 
+/* Note, we never store cnode structures on daemon_group.  Thus,
+ * ->node_down() (which is NULL) is never called */
 struct cgroup daemon_group;
 struct list_head group_list;
 static int message_flow_control_on;
@@ -397,9 +399,11 @@ static void daemon_change(struct cgroup *cg)
 		}
 	}
 
-	if (found)
+	if (found) {
+		if (!cg->cg_joined)
+			cg->cg_set_cgroup(cg, cg->cg_user_data);
 		cg->cg_joined = 1;
-	else
+	} else
 		log_error("this node is not in the ocfs2_controld confchg: %u %u",
 			  our_nodeid, (uint32_t)getpid());
 
@@ -714,11 +718,25 @@ out:
 	return rc;
 }
 
-int setup_cpg(void)
+static void daemon_set_cgroup(struct cgroup *cg, void *user_data)
+{
+	void (*daemon_joined)(void) = user_data;
+
+	if (cg != &daemon_group) {
+		log_error("Somehow, daemon_set_cgroup is called on a different group!");
+		return;
+	}
+
+	daemon_joined();
+}
+
+int setup_cpg(void (*daemon_joined)(void))
 {
 	cpg_error_t error;
 
 	INIT_LIST_HEAD(&group_list);
+	daemon_group.cg_set_cgroup = daemon_set_cgroup;
+	daemon_group.cg_user_data = daemon_joined;
 	error = init_group(&daemon_group, "ocfs2_controld");
 
 	return error;
diff --git a/ocfs2_controld/main.c b/ocfs2_controld/main.c
index 23fe97d..22b5ac6 100644
--- a/ocfs2_controld/main.c
+++ b/ocfs2_controld/main.c
@@ -494,13 +494,22 @@ static int setup_listener(void)
 	return 0;
 }
 
-static int loop(void)
+static void cpg_joined(void)
 {
-	int rv, i, poll_timeout = -1;
+	int rv;
+
+	log_debug("CPG is live, starting to listen for mounters");
 
 	rv = setup_listener();
-	if (rv < 0) 
-		goto out;
+	if (rv < 0) {
+		shutdown_daemon();
+		return;
+	}
+}
+
+static int loop(void)
+{
+	int rv, i, poll_timeout = -1;
 
 	rv = setup_sigpipe();
 	if (rv < 0)
@@ -510,7 +519,7 @@ static int loop(void)
 	if (rv < 0)
 		goto out;
 
-	rv = setup_cpg();
+	rv = setup_cpg(cpg_joined);
 	if (rv < 0)
 		goto out;
 
diff --git a/ocfs2_controld/ocfs2_controld.h b/ocfs2_controld/ocfs2_controld.h
index 91de939..be27490 100644
--- a/ocfs2_controld/ocfs2_controld.h
+++ b/ocfs2_controld/ocfs2_controld.h
@@ -68,7 +68,7 @@ int kill_cman(int nodeid);
 void exit_cman(void);
 
 /* cpg.c */
-int setup_cpg(void);
+int setup_cpg(void (*daemon_joined)(void));
 void exit_cpg(void);
 void for_each_node(struct cgroup *cg,
 		   void (*func)(int nodeid,
-- 
1.5.3.8




More information about the Ocfs2-tools-devel mailing list