From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 22 Aug 2007 18:47:21 -0000 Subject: [Cluster-devel] conga/ricci/modules/cluster ClusterConf.cpp Cl ... Message-ID: <20070822184721.32302.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Changes by: rmccabe at sourceware.org 2007-08-22 18:47:20 Modified files: ricci/modules/cluster: ClusterConf.cpp ClusterStatus.cpp Clusvcadm.cpp Fence.cpp Virt.cpp ricci/modules/cluster/clumon/src/daemon: Monitor.cpp main.cpp Log message: - Return more useful error information when a command fails. - Some other minor cleanups. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/ClusterConf.cpp.diff?cvsroot=cluster&r1=1.9&r2=1.10 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/ClusterStatus.cpp.diff?cvsroot=cluster&r1=1.19&r2=1.20 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/Clusvcadm.cpp.diff?cvsroot=cluster&r1=1.13&r2=1.14 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/Fence.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/Virt.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp.diff?cvsroot=cluster&r1=1.14&r2=1.15 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/main.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5 --- conga/ricci/modules/cluster/ClusterConf.cpp 2006/12/10 18:58:46 1.9 +++ conga/ricci/modules/cluster/ClusterConf.cpp 2007/08/22 18:47:19 1.10 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2005 + Copyright Red Hat, Inc. 2005-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -60,12 +60,12 @@ // sanity check if (xml.tag() != "cluster") - throw String("invalid cluster.conf"); + throw String("invalid cluster.conf: no cluster tag"); if (xml.get_attr("name").empty()) - throw String("invalid cluster.conf"); + throw String("invalid cluster.conf: no cluster name attribute"); long long conf_version = utils::to_long(xml.get_attr("config_version")); if (conf_version == 0) - throw String("invalid cluster.conf"); + throw String("invalid cluster.conf: no config_version attribute"); // create dir, if not existing DIR* dir = opendir(CLUSTER_CONF_DIR.c_str()); @@ -75,9 +75,9 @@ if (errno == ENOENT) { if (mkdir(CLUSTER_CONF_DIR.c_str(), S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)) - throw String("failed to create ") + CLUSTER_CONF_DIR; + throw String("failed to create ") + CLUSTER_CONF_DIR + ": " + String(strerror(errno)); } else - throw String("opendir() error"); + throw String("opendir() error: ") + String(strerror(errno)); } // save tmp cluster.conf @@ -98,7 +98,7 @@ if (utils::execute(CCS_TOOL_PATH, args, out, err, status, false)) throw command_not_found_error_msg(CCS_TOOL_PATH); if (status != 0) - throw String("ccs_tool failed"); + throw String("ccs_tool failed: ") + err; if (is_cman(xml)) { args.clear(); @@ -108,7 +108,7 @@ if (utils::execute(CMAN_TOOL_PATH, args, out, err, status, false)) throw command_not_found_error_msg(CMAN_TOOL_PATH); if (status != 0) - throw String("cman_tool failed"); + throw String("cman_tool failed: ") + err; } unlink(tmp_path.c_str()); @@ -118,8 +118,9 @@ } } else { if (rename(tmp_path.c_str(), CLUSTER_CONF_PATH.c_str())) { + int errnold = errno; unlink(tmp_path.c_str()); - throw String("failed to rename cluster.conf"); + throw String("failed to rename cluster.conf: ") + String(strerror(errnold)); } } } --- conga/ricci/modules/cluster/ClusterStatus.cpp 2007/03/06 09:15:01 1.19 +++ conga/ricci/modules/cluster/ClusterStatus.cpp 2007/08/22 18:47:19 1.20 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2005 + Copyright Red Hat, Inc. 2005-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -50,11 +50,8 @@ -static void run_initd(const String& servname, - bool start, - bool fail); -static void run_chkconfig(const String& servname, - bool on); +static void run_initd(const String& servname, bool start, bool fail); +static void run_chkconfig(const String& servname, bool on); static void cman_leave(); static void gulm_leave(); @@ -377,9 +374,7 @@ } void -run_initd(const String& servname, - bool start, - bool fail) +run_initd(const String& servname, bool start, bool fail) { String path(INITD_DIR_PATH); path += servname; @@ -396,7 +391,7 @@ if (status == 0) failed = false; if (fail && failed) - throw String("service ") + servname + " " + String(start?"start":"stop") + " failed"; + throw String("service ") + servname + " " + String(start?"start":"stop") + " failed: " + err; } void @@ -434,7 +429,7 @@ if (utils::execute(MODPROBE_PATH, args, out, err, status, false)) throw command_not_found_error_msg(MODPROBE_PATH); if (status != 0) - throw String("modprobe -r failed"); + throw String("modprobe -r failed: ") + err; } } --- conga/ricci/modules/cluster/Clusvcadm.cpp 2007/08/20 16:31:14 1.13 +++ conga/ricci/modules/cluster/Clusvcadm.cpp 2007/08/22 18:47:19 1.14 @@ -38,7 +38,8 @@ class ServiceStatus { public: - enum state {RG_STATE_STOPPED = 110, // Resource group is stopped + enum state { + RG_STATE_STOPPED = 110, // Resource group is stopped RG_STATE_STARTING = 111, // Resource is starting RG_STATE_STARTED = 112, // Resource is started RG_STATE_STOPPING = 113, // Resource is stopping @@ -48,7 +49,8 @@ RG_STATE_ERROR = 117, // Recoverable error RG_STATE_RECOVER = 118, // Pending recovery RG_STATE_DISABLED = 119, // Resource not allowd to run - RG_STATE_MIGRATE = 120}; // Resource migrating + RG_STATE_MIGRATE = 120 // Resource migrating + }; ServiceStatus(const String& name, const String& node, @@ -202,7 +204,7 @@ if (utils::execute(CLUSVCADM_TOOL_PATH, args, out, err, status, false)) throw command_not_found_error_msg(CLUSVCADM_TOOL_PATH); if (status != 0) - throw String("clusvcadm failed to migrate " + servicename); + throw String("clusvcadm failed to migrate " + servicename + ": " + err); } return; } @@ -236,7 +238,7 @@ if (utils::execute(CLUSVCADM_TOOL_PATH, args, out, err, status, false)) throw command_not_found_error_msg(CLUSVCADM_TOOL_PATH); if (status != 0) - throw String("clusvcadm failed to stop " + servicename); + throw String("clusvcadm failed to stop " + servicename + ": " + err); } return; } @@ -288,7 +290,7 @@ if (utils::execute(CLUSVCADM_TOOL_PATH, args, out, err, status, false)) throw command_not_found_error_msg(CLUSVCADM_TOOL_PATH); if (status != 0) - throw String("clusvcadm failed to restart cluster service " + servicename); + throw String("clusvcadm failed to restart cluster service " + servicename + ": " + err); } return; } @@ -306,25 +308,17 @@ int status; vector args; - bool fast_available = false; // clustat -f ? - args.push_back("-h"); - if (utils::execute(CLUSTAT_TOOL_PATH, args, out, err, status, false)) - throw command_not_found_error_msg(CLUSTAT_TOOL_PATH); - if (out.find("-f") != out.npos) - fast_available = true; - args.clear(); - if (fast_available) - args.push_back("-f"); + args.push_back("-f"); args.push_back("-x"); if (utils::execute(CLUSTAT_TOOL_PATH, args, out, err, status, false)) throw command_not_found_error_msg(CLUSTAT_TOOL_PATH); if (status) - throw String("clustat failed"); + throw String("clustat failed: ") + err; XMLObject xml = parseXML(out); if (xml.tag() != "clustat") - throw String("invalid clustat output"); + throw String("invalid clustat output: no clustat tag"); XMLObject nodes_xml("noname"), groups_xml("noname"), quorum_xml("noname"); for (list::const_iterator iter = xml.children().begin(); --- conga/ricci/modules/cluster/Fence.cpp 2006/10/06 03:10:13 1.4 +++ conga/ricci/modules/cluster/Fence.cpp 2007/08/22 18:47:19 1.5 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2005 + Copyright Red Hat, Inc. 2005-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -45,5 +45,5 @@ if (utils::execute(FENCE_NODE_TOOL_PATH, args, out, err, status, false)) throw command_not_found_error_msg(FENCE_NODE_TOOL_PATH); if (status != 0) - throw String("fence_node failed"); + throw String("fence_node failed: ") + err; } --- conga/ricci/modules/cluster/Virt.cpp 2007/07/23 18:47:50 1.3 +++ conga/ricci/modules/cluster/Virt.cpp 2007/08/22 18:47:19 1.4 @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include "base64.h" } @@ -38,7 +40,7 @@ if (utils::execute(DMIDECODE_PATH, args, out, err, status, false)) throw command_not_found_error_msg(DMIDECODE_PATH); if (status != 0) - throw String("dmidecode failed"); + throw String("dmidecode failed: " + err); if (out.find("Vendor: Xen") != out.npos) return true; if (out.find("Manufacturer: Xen") != out.npos) @@ -76,21 +78,24 @@ old_mask = umask(077); fd = mkstemp(tmpname); - umask(old_mask); if (fd < 0) { + int err = errno; + umask(old_mask); memset(buf, 0, keylen_dec); free(buf); - throw String("error setting new key"); + throw String("error setting new key: ") + String(strerror(err)); } + umask(old_mask); fchmod(fd, 0600); ret = write(fd, buf, keylen_dec); if (ret < 0 || (size_t) ret != keylen_dec) { + int err = errno; unlink(tmpname); close(fd); memset(buf, 0, keylen_dec); free(buf); - throw String("error setting new key"); + throw String("error setting new key: ") + String(strerror(err)); } close(fd); @@ -98,8 +103,9 @@ free(buf); if (rename(tmpname, XVM_KEY_PATH) != 0) { + int err = errno; unlink(tmpname); - throw String("error setting new key"); + throw String("error setting new key: ") + String(strerror(err)); } return (true); @@ -110,29 +116,32 @@ size_t ret; char buf[XVM_KEY_MAX_SIZE]; struct stat stat; + int err = 0; if (keylen < XVM_KEY_MIN_SIZE || keylen > XVM_KEY_MAX_SIZE) throw String("invalid key length"); fd = open("/dev/urandom", O_RDONLY); if (fd < 0) - throw String("error generating key"); + throw String("error generating key: ") + String(strerror(errno)); ret = read(fd, buf, keylen); + err = errno; close(fd); if ((size_t) ret != keylen) - throw String("error generating key"); + throw String("error generating key: ") + String(strerror(err)); fd = open(XVM_KEY_PATH, O_WRONLY | O_EXCL | O_CREAT, 0600); if (fd < 0) - throw String("error generating key"); + throw String("error generating key: ") + String(strerror(errno)); ret = write(fd, buf, keylen); + err = errno; close(fd); if ((size_t) ret != keylen) { unlink(XVM_KEY_PATH); - throw String("error generating key"); + throw String("error generating key: ") + String(strerror(err)); } return (true); } @@ -145,21 +154,23 @@ char buf[XVM_KEY_MAX_SIZE]; struct stat st; char *key_out = NULL; + int err = 0; fd = open(XVM_KEY_PATH, O_RDONLY); if (fd < 0) - throw String("error retrieving key"); + throw String("error retrieving key:") + String(strerror(errno)); if (fstat(fd, &st) != 0) { close(fd); - throw String("error retrieving key"); + throw String("error retrieving key: ") + String(strerror(errno)); } ret = read(fd, buf, sizeof(buf)); + err = errno; close(fd); if (ret < 0 || (off_t) ret != st.st_size) { memset(buf, 0, sizeof(buf)); - throw String("error retrieving key"); + throw String("error retrieving key: ") + String(strerror(err)); } keylen_bin = (size_t) ret; --- conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp 2007/03/23 17:25:13 1.14 +++ conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp 2007/08/22 18:47:20 1.15 @@ -49,6 +49,8 @@ #define RG_STATE_ERROR 117 /** Recoverable error */ #define RG_STATE_RECOVER 118 /** Pending recovery */ #define RG_STATE_DISABLED 119 /** Resource not allowd to run */ +#define RG_STATE_MIGRATE 120 /** Resource migrating */ + @@ -607,18 +609,8 @@ int status; vector args; - bool fast_available = false; // clustat -f ? - args.push_back("-h"); - if (execute("/usr/sbin/clustat", args, out, err, status, EXECUTE_TIMEOUT)) - throw String("services_info(): missing clustat"); - if (status) - throw String("services_info(): `clustat -h` failed"); - if (out.find("-f") != out.npos) - fast_available = true; - args.clear(); - if (fast_available) - args.push_back("-f"); + args.push_back("-f"); args.push_back("-x"); if (execute("/usr/sbin/clustat", args, out, err, status, EXECUTE_TIMEOUT)) throw String("services_info(): missing clustat"); @@ -667,6 +659,7 @@ running = false; failed = true; break; + case RG_STATE_MIGRATE: case RG_STATE_STARTING: case RG_STATE_STARTED: case RG_STATE_CHECK: @@ -676,8 +669,8 @@ default: continue; } - service.set_attr("failed", (failed)? "true" : "false"); - service.set_attr("running", (running)? "true" : "false"); + service.set_attr("failed", (failed) ? "true" : "false"); + service.set_attr("running", (running) ? "true" : "false"); if (running) service.set_attr("nodename", group.get_attr("owner")); --- conga/ricci/modules/cluster/clumon/src/daemon/main.cpp 2006/10/14 18:00:02 1.4 +++ conga/ricci/modules/cluster/clumon/src/daemon/main.cpp 2007/08/22 18:47:20 1.5 @@ -166,7 +166,7 @@ if (errno == EINTR) continue; else - throw String("serve_clients(): poll() error"); + throw String("serve_clients(): poll() error: " + String(strerror(errno))); } // process events @@ -183,7 +183,7 @@ } catch ( ... ) {} } if (poll_info.revents & (POLLERR | POLLHUP | POLLNVAL)) - throw String("serve_clients(): server socket error????"); + throw String("serve_clients(): poll: " + String(strerror(errno))); } else { // client socket if (poll_info.revents & POLLIN) { @@ -226,11 +226,11 @@ segfault(int) { char msg[128]; - snprintf(msg, sizeof(msg)-1, "PID %d Thread %d: SIGSEGV, waiting forensics", + snprintf(msg, sizeof(msg), "PID %d Thread %d: SIGSEGV, waiting forensics", getpid(), (int) pthread_self()); + log_sigsafe(msg, LogAll); - while(1) - sleep(60); + select(0, NULL, NULL, NULL, NULL); } void