[Cluster-devel] conga/ricci/modules/cluster ClusterConf.cpp Cl ...

kupcevic at sourceware.org kupcevic at sourceware.org
Tue Aug 15 00:16:31 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	kupcevic at sourceware.org	2006-08-15 00:16:31

Modified files:
	ricci/modules/cluster: ClusterConf.cpp ClusterStatus.cpp 
	                       Clusvcadm.cpp 

Log message:
	cluster module: add CS5 support

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/ClusterConf.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/ClusterStatus.cpp.diff?cvsroot=cluster&r1=1.10&r2=1.11
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/Clusvcadm.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4

--- conga/ricci/modules/cluster/ClusterConf.cpp	2006/08/10 22:53:08	1.4
+++ conga/ricci/modules/cluster/ClusterConf.cpp	2006/08/15 00:16:30	1.5
@@ -38,7 +38,11 @@
 #define CLUSTER_CONF_PATH    (CLUSTER_CONF_DIR + CLUSTER_CONF_NAME)
 
 #define CCS_TOOL_PATH        "/sbin/ccs_tool"
-#define CMAN_TOOL_PATH       "/sbin/cman_tool"
+
+
+static void 
+set_CMAN_TOOL_PATH();
+static String CMAN_TOOL_PATH;
 
 
 
@@ -69,6 +73,8 @@
 ClusterConf::set(const XMLObject& xml,
 		 bool propagate)
 {
+  set_CMAN_TOOL_PATH();
+  
   // sanity check
   if (xml.tag() != "cluster")
     throw String("invalid cluster.conf");
@@ -110,13 +116,7 @@
       if (status != 0)
 	throw String("ccs_tool failed");
       
-      bool cman = false;
-      for (list<XMLObject>::const_iterator iter = xml.children().begin();
-	   iter != xml.children().end();
-	   iter++)
-	if (iter->tag() == "cman")
-	  cman = true;
-      if (cman) {
+      if (is_cman(xml)) {
 	args.clear();
 	args.push_back("version");
 	args.push_back("-r");
@@ -143,18 +143,30 @@
 bool
 ClusterConf::is_gulm(const XMLObject& cluster_conf)
 {
-  return !is_cman(cluster_conf);
-}
-
-bool
-ClusterConf::is_cman(const XMLObject& cluster_conf)
-{
   for (list<XMLObject>::const_iterator iter = cluster_conf.children().begin();
        iter != cluster_conf.children().end();
        iter++)
-    if (iter->tag() == "cman")
+    if (iter->tag() == "gulm")
       return true;
   return false;
 }
 
+bool
+ClusterConf::is_cman(const XMLObject& cluster_conf)
+{
+  return !is_gulm(cluster_conf);
+}
+
 
+
+void 
+set_CMAN_TOOL_PATH()
+{
+  static bool path_set = false;
+  if (!path_set) {
+    CMAN_TOOL_PATH = "/sbin/cman_tool";
+    if (access(CMAN_TOOL_PATH.c_str(), X_OK)) 
+      CMAN_TOOL_PATH = "/usr/sbin/cman_tool";
+    path_set = true;
+  }
+}
--- conga/ricci/modules/cluster/ClusterStatus.cpp	2006/08/10 22:53:08	1.10
+++ conga/ricci/modules/cluster/ClusterStatus.cpp	2006/08/15 00:16:30	1.11
@@ -34,9 +34,11 @@
 using namespace std;
 
 
+static void 
+set_CMAN_TOOL_PATH();
+static String CMAN_TOOL_PATH;
 
 #define INITD_DIR_PATH        "/etc/init.d/"
-#define CMAN_TOOL_PATH        "/sbin/cman_tool"
 #define LSMOD_PATH            "/sbin/lsmod"
 #define MODPROBE_PATH         "/sbin/modprobe"
 #define CHKCONFIG_PATH        "/sbin/chkconfig"
@@ -109,87 +111,174 @@
 void 
 Cluster::start_node(bool cluster_startup)
 {
-  run_initd("ccsd", true, false);
-  if (ClusterConf::is_cman(ClusterConf::get()))
+  XMLObject stat = status();
+  
+  if (stat.get_attr("cluster_version") == "4") {
+    XMLObject cluster_conf(ClusterConf::get());
+    run_initd("ccsd", true, false);
+    if (ClusterConf::is_cman(cluster_conf))
+      try {
+	run_initd("cman", true, true);
+      } catch ( ... ) {
+	// try again
+	run_initd("cman", true, true);
+      }
+    else
+      run_initd("lock_gulmd", true, true);
+    
+    if (cluster_startup) {
+      // wait for all nodes to join -> avoid fencing
+      bool all_in = false;
+      while (all_in == false) {
+	all_in = true;
+	XMLObject stat = status();
+	for (list<XMLObject>::const_iterator iter = stat.children().begin();
+	     iter != stat.children().end();
+	     iter++)
+	  if (iter->tag() == "node")
+	    if (iter->get_attr("clustered") == "false")
+	      all_in = false;
+	if (all_in == false)
+	  sleep_sec(CLUMON_SYNC_TIME);
+      }
+    }
+    
+    run_initd("fenced", true, false);
+    run_initd("clvmd", true, false);
+    run_initd("gfs", true, false);
+    run_initd("rgmanager", true, true);
+    
+    // enable them on boot
+    
+    run_chkconfig("ccsd", true);
+    if (ClusterConf::is_cman(cluster_conf)) {
+      run_chkconfig("cman", true);
+      run_chkconfig("lock_gulmd", false);
+    } else {
+      run_chkconfig("cman", false);
+      run_chkconfig("lock_gulmd", true);
+    }
+    run_chkconfig("fenced", true);
+    run_chkconfig("clvmd", true);
+    run_chkconfig("gfs", true);
+    run_chkconfig("rgmanager", true);
+    
+  } else if (stat.get_attr("cluster_version") == "5") {
     try {
       run_initd("cman", true, true);
     } catch ( ... ) {
       // try again
       run_initd("cman", true, true);
     }
-  else
-    run_initd("lock_gulmd", true, true);
-  
-  if (cluster_startup) {
-    // wait for all nodes to join -> avoid fencing
-    bool all_in = false;
-    while (all_in == false) {
-      all_in = true;
-      XMLObject stat = status();
-      for (list<XMLObject>::const_iterator iter = stat.children().begin();
-	   iter != stat.children().end();
-	   iter++)
-	if (iter->tag() == "node")
-	  if (iter->get_attr("clustered") == "false")
-	    all_in = false;
-      if (all_in == false)
-	sleep_sec(CLUMON_SYNC_TIME);
+    
+    if (cluster_startup) {
+      // wait for all nodes to join -> avoid fencing
+      // trouble: fenced started from within cman!!!
+      /*
+      bool all_in = false;
+      while (all_in == false) {
+	all_in = true;
+	XMLObject stat = status();
+	for (list<XMLObject>::const_iterator iter = stat.children().begin();
+	     iter != stat.children().end();
+	     iter++)
+	  if (iter->tag() == "node")
+	    if (iter->get_attr("clustered") == "false")
+	      all_in = false;
+	if (all_in == false)
+	  sleep_sec(CLUMON_SYNC_TIME);
+      }
+      */
     }
-  }
-  
-  run_initd("fenced", true, false);
-  run_initd("clvmd", true, false);
-  run_initd("gfs", true, false);
-  run_initd("rgmanager", true, true);
-  
-  // enable them on boot
-  
-  run_chkconfig("ccsd", true);
-  if (ClusterConf::is_cman(ClusterConf::get()))
+    
+    bool use_qdisk = false;
+    XMLObject cluster_conf(ClusterConf::get()); // ccsd should bring newest cluster.conf
+    for (list<XMLObject>::const_iterator iter = cluster_conf.children().begin();
+	 iter != cluster_conf.children().end();
+	 iter++)
+      if (iter->tag() == "quorumd")
+	use_qdisk = true;
+    if (use_qdisk)
+      run_initd("qdiskd", true, false);
+    
+    run_initd("clvmd", true, false);
+    run_initd("gfs", true, false);
+    run_initd("gfs2", true, false);
+    run_initd("rgmanager", true, true);
+    
+    // enable them on boot
+    
     run_chkconfig("cman", true);
-  else
-    run_chkconfig("lock_gulmd", true);
-  run_chkconfig("fenced", true);
-  run_chkconfig("clvmd", true);
-  run_chkconfig("gfs", true);
-  run_chkconfig("rgmanager", true);
+    if (use_qdisk)
+      run_chkconfig("qdiskd", true);
+    else
+      run_chkconfig("qdiskd", false);
+    run_chkconfig("clvmd", true);
+    run_chkconfig("gfs", true);
+    run_chkconfig("gfs2", true);
+    run_chkconfig("rgmanager", true);
+  } else {
+    throw String("unsupported cluster version ") + stat.get_attr("cluster_version");
+  }
 }
 
 void 
 Cluster::stop_node(bool cluster_shutdown)
 {
+  XMLObject stat = status();
+  
   if (cluster_shutdown) {
     // stop all services, so they don't bounce around
-    XMLObject stat = status();
     for (list<XMLObject>::const_iterator iter = stat.children().begin();
 	 iter != stat.children().end();
 	 iter++)
       if (iter->tag() == "service")
 	if (iter->get_attr("running") == "true")
-	  Clusvcadm::stop(iter->get_attr("name"));
+	  try {
+	    Clusvcadm::stop(iter->get_attr("name"));
+	  } catch ( ... ) {}
   }
   
-  run_initd("rgmanager", false, true);
-  run_initd("gfs", false, false);
-  run_initd("clvmd", false, false);
-  run_initd("fenced", false, false);
-  if (ClusterConf::is_cman(ClusterConf::get()))
-    cman_leave();
-  else
-    gulm_leave();
-  run_initd("ccsd", false, false);
-  
-  // disable them on boot
-  
-  run_chkconfig("ccsd", false);
-  if (ClusterConf::is_cman(ClusterConf::get()))
+  if (stat.get_attr("cluster_version") == "4") {
+    run_initd("rgmanager", false, true);
+    run_initd("gfs", false, false);
+    run_initd("clvmd", false, false);
+    run_initd("fenced", false, false);
+    if (ClusterConf::is_cman(ClusterConf::get()))
+      cman_leave();
+    else
+      gulm_leave();
+    run_initd("ccsd", false, false);
+    
+    // disable them on boot
+    
+    run_chkconfig("ccsd", false);
     run_chkconfig("cman", false);
-  else
     run_chkconfig("lock_gulmd", false);
-  run_chkconfig("fenced", false);
-  run_chkconfig("clvmd", false);
-  run_chkconfig("gfs", false);
-  run_chkconfig("rgmanager", false);
+    run_chkconfig("fenced", false);
+    run_chkconfig("clvmd", false);
+    run_chkconfig("gfs", false);
+    run_chkconfig("rgmanager", false);
+    
+  } else if (stat.get_attr("cluster_version") == "5") {
+    run_initd("rgmanager", false, true);
+    run_initd("gfs2", false, false);
+    run_initd("gfs", false, false);
+    run_initd("clvmd", false, false);
+    run_initd("qdiskd", false, false);
+    run_initd("cman", false, true);
+    
+    // disable them on boot
+    
+    run_chkconfig("cman", false);
+    run_chkconfig("qdiskd", false);
+    run_chkconfig("clvmd", false);
+    run_chkconfig("gfs", false);
+    run_chkconfig("gfs2", false);
+    run_chkconfig("rgmanager", false);
+  } else {
+    throw String("unsupported cluster version ") + stat.get_attr("cluster_version");
+  }
 }
 
 
@@ -235,6 +324,8 @@
 void 
 cman_leave()
 {
+  set_CMAN_TOOL_PATH();
+  
   // when bz179627 gets fixed, just call service cman stop, but for now ...
   String out, err;
   int status;
@@ -276,3 +367,17 @@
   
   run_initd("lock_gulmd", false, true);
 }
+
+
+
+void 
+set_CMAN_TOOL_PATH()
+{
+  static bool path_set = false;
+  if (!path_set) {
+    CMAN_TOOL_PATH = "/sbin/cman_tool";
+    if (access(CMAN_TOOL_PATH.c_str(), X_OK)) 
+      CMAN_TOOL_PATH = "/usr/sbin/cman_tool";
+    path_set = true;
+  }
+}
--- conga/ricci/modules/cluster/Clusvcadm.cpp	2006/08/10 22:53:08	1.3
+++ conga/ricci/modules/cluster/Clusvcadm.cpp	2006/08/15 00:16:30	1.4
@@ -201,6 +201,17 @@
   String out, err;
   int status;
   vector<String> args;
+  
+  bool fast_available = false;  // clustat -f ?
+  args.push_back("-h");
+  if (utils::execute(CLUSTAT_TOOL_PATH, args, out, err, status, false))
+    throw String("missing clustat");
+  if (out.find("-f") != out.npos)
+    fast_available = true;
+  
+  args.clear();
+  if (fast_available)
+    args.push_back("-f");
   args.push_back("-x");
   if (utils::execute(CLUSTAT_TOOL_PATH, args, out, err, status, false))
     throw String("execute failed");
@@ -222,6 +233,7 @@
     else if (iter->tag() == "quorum")
       quorum_xml = *iter;
   
+  // TODO: groupmember missing in CS5
   if (quorum_xml.get_attr("groupmember") != "1")
     throw NoServiceManager();
   




More information about the Cluster-devel mailing list