From 1a7b9a35228cd5ef9d6ad96ec35f6fc812ee821c Mon Sep 17 00:00:00 2001 From: Goldwyn Rodrigues Date: Tue, 23 Jul 2013 12:09:28 -0500 Subject: [PATCH 2/5] Add corosync cfg to get configuration information --- ocfs2_controld/Makefile | 2 +- ocfs2_controld/cpg.c | 1 - ocfs2_controld/main.c | 58 ++------------------- ocfs2_controld/member.c | 111 ++++++++++++++++++++++++++++++++++++++++ ocfs2_controld/ocfs2_controld.h | 20 ++------ 5 files changed, 119 insertions(+), 73 deletions(-) create mode 100644 ocfs2_controld/member.c Index: ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/Makefile =================================================================== --- ocfs2-tools-1.8.2+git.1361836695.ff84eb5.orig/ocfs2_controld/Makefile 2013-07-31 08:25:43.559675366 -0500 +++ ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/Makefile 2013-07-31 08:26:05.733331692 -0500 @@ -49,7 +49,7 @@ CMAN_CFILES = cman.c CMAN_DAEMON_CFILES = $(DAEMON_CFILES) $(CMAN_CFILES) CMAN_DAEMON_OBJS = $(subst .c,.o,$(CMAN_DAEMON_CFILES)) -COROSYNC_CFILES = +COROSYNC_CFILES = member.c COROSYNC_DAEMON_CFILES = $(DAEMON_CFILES) $(COROSYNC_CFILES) COROSYNC_DAEMON_OBJS = $(subst .c,.o,$(COROSYNC_DAEMON_CFILES)) Index: ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/cpg.c =================================================================== --- ocfs2-tools-1.8.2+git.1361836695.ff84eb5.orig/ocfs2_controld/cpg.c 2013-07-31 08:25:34.868418089 -0500 +++ ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/cpg.c 2013-07-31 08:25:43.559675366 -0500 @@ -339,7 +339,6 @@ static void handle_daemon_left(struct cp if (1) { log_error("kill node %d - ocfs2_controld PROCDOWN", addr->nodeid); - kill_stack_node(addr->nodeid); } /* FALL THROUGH */ Index: ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/main.c =================================================================== --- ocfs2-tools-1.8.2+git.1361836695.ff84eb5.orig/ocfs2_controld/main.c 2013-07-31 08:25:34.837417171 -0500 +++ ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/main.c 2013-07-31 08:25:43.560675395 -0500 @@ -114,10 +114,8 @@ static struct ocfs2_protocol_version dae .pv_major = CONTROLD_PROTOCOL_MAJOR, .pv_minor = CONTROLD_PROTOCOL_MINOR, }; -static struct ocfs2_protocol_version fs_max_proto; struct ocfs2_protocol_version daemon_running_proto; struct ocfs2_protocol_version fs_running_proto; -struct ckpt_handle *node_handle; void shutdown_daemon(void) { @@ -254,11 +252,6 @@ static int do_mount(int ci, int fd, cons goto fail; } - if (!validate_cluster(cluster)) { - error_msg = "Invalid cluster name"; - goto fail; - } - return start_mount(ci, fd, uuid, device, service); fail: @@ -456,11 +449,6 @@ static int send_filesystems(int ci, int goto fail; } - if (!validate_cluster(cluster)) { - error_msg = "Invalid cluster name"; - goto fail; - } - return send_mountgroups(ci, fd); fail: @@ -471,15 +459,6 @@ static int send_clustername(int ci, int { int rc = 0, rctmp; char error_msg[100]; /* Arbitrary size smaller than a message */ - const char *cluster; - - rc = get_clustername(&cluster); - if (rc) { - snprintf(error_msg, sizeof(error_msg), - "Unable to query cluster name: %s", - strerror(-rc)); - goto out_status; - } /* Cman only supports one cluster */ rc = send_message(fd, CM_ITEMCOUNT, 1); @@ -490,7 +469,7 @@ static int send_clustername(int ci, int goto out_status; } - rc = send_message(fd, CM_ITEM, cluster); + rc = send_message(fd, CM_ITEM, cluster_name); if (rc) { snprintf(error_msg, sizeof(error_msg), "Unable to send ITEM: %s", @@ -630,27 +609,6 @@ static int setup_listener(void) return 0; } -static int proto_version_to_checkpoint(struct ocfs2_protocol_version *proto, - char **checkpoint_data) -{ - size_t len; - char *buf; - - len = snprintf(NULL, 0, "%02x %02x", proto->pv_major, - proto->pv_minor); - buf = malloc(sizeof(char) * (len + 1)); - if (!buf) { - log_error("Unable to allocate memory for checkpoint data"); - return -ENOMEM; - } - - snprintf(buf, len + 1, "%02x %02x", proto->pv_major, - proto->pv_minor); - *checkpoint_data = buf; - - return 0; -} - static void cpg_joined(int first) { int rv; @@ -759,7 +717,7 @@ static int loop(void) if (rv < 0) goto out; - rv = install_node_checkpoint(); + rv = setup_cluster_cfg(); if (rv < 0) goto out; @@ -1032,17 +990,6 @@ int main(int argc, char **argv) return 1; } - err = o2cb_get_stack_name(&stack); - if (err) { - com_err(prog_name, err, "while determining the current cluster stack"); - return 1; - } - if (strcmp(stack, stackname)) { - log_error("%s: This daemon supports the \"%s\" stack, but the \"%s\" stack is in use", - prog_name, stackname, stack); - return 1; - } - if (!daemon_debug_opt) daemonize(); Index: ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/member.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/member.c 2013-07-31 08:25:43.560675395 -0500 @@ -0,0 +1,111 @@ +#include +#include +#include +#include + +#include "ocfs2_controld.h" +#include +#include +#include + + +char cluster_name[65]; +int our_nodeid; + +static corosync_cfg_handle_t ch; + +static int detect_cluster_name(void) +{ + cmap_handle_t handle; + char *str = NULL; + int rv, err = -1; + + rv = cmap_initialize(&handle); + if (rv != CS_OK) { + log_error("cmap_initialize error %d", rv); + return -1; + } + + rv = cmap_get_string(handle, "totem.cluster_name", &str); + if (rv != CS_OK) { + log_error("cmap_get_string totem.cluster_name error %d", rv); + goto out; + } else + err = 0; + + log_debug("cmap totem.cluster_name = '%s'", str); + + strncpy(cluster_name, str, 64); +out: + if (str) + free(str); + cmap_finalize(handle); + return err; +} + +static void shutdown_callback(corosync_cfg_handle_t h, + corosync_cfg_shutdown_flags_t flags) +{ + if (flags & COROSYNC_CFG_SHUTDOWN_FLAG_REQUEST) { + log_debug("shutdown request yes"); + corosync_cfg_replyto_shutdown(ch, COROSYNC_CFG_SHUTDOWN_FLAG_YES); + } +} + +static corosync_cfg_callbacks_t cfg_callbacks = +{ + .corosync_cfg_shutdown_callback = shutdown_callback, +}; + +int setup_cluster_cfg(void) +{ + cs_error_t err; + unsigned int nodeid; + int fd; + int retry = 1; + +try_again: + err = corosync_cfg_initialize(&ch, &cfg_callbacks); + if (err != CS_OK) { + if ((err == CS_ERR_TRY_AGAIN) && (retry <= 10)) { + log_error("corosync has not completed initialization.. retry %d", retry); + sleep(1); + retry++; + goto try_again; + } + log_error("corosync cfg init error %d", err); + return -1; + } + + err = corosync_cfg_fd_get(ch, &fd); + if (err != CS_OK) { + log_error("corosync cfg fd_get error %d", err); + corosync_cfg_finalize(ch); + return -1; + } + + err = corosync_cfg_local_get(ch, &nodeid); + if (err != CS_OK) { + log_error("corosync cfg local_get error %d", err); + corosync_cfg_finalize(ch); + return -1; + } + + our_nodeid = nodeid; + log_debug("our_nodeid %d", our_nodeid); + + if (our_nodeid < 0) { + log_error("negative nodeid, set corosync totem.clear_node_high_bit"); + corosync_cfg_finalize(ch); + return -1; + } + + return fd; +} + +void close_cluster_cfg(void) +{ + corosync_cfg_finalize(ch); +} + + Index: ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/ocfs2_controld.h =================================================================== --- ocfs2-tools-1.8.2+git.1361836695.ff84eb5.orig/ocfs2_controld/ocfs2_controld.h 2013-07-31 08:25:34.869418118 -0500 +++ ocfs2-tools-1.8.2+git.1361836695.ff84eb5/ocfs2_controld/ocfs2_controld.h 2013-07-31 08:25:43.560675395 -0500 @@ -39,6 +39,7 @@ extern int dump_point; extern int dump_wrap; extern int our_nodeid; extern const char *stackname; +extern char cluster_name[65]; extern void daemon_dump_save(void); @@ -70,25 +71,12 @@ int connection_add(int fd, void (*work)( void connection_dead(int ci); void shutdown_daemon(void); -/* ckpt.c */ -int setup_ckpt(void); -void exit_ckpt(void); -int ckpt_open_global(int write); -void ckpt_close_global(void); -int ckpt_open_node(int nodeid, struct ckpt_handle **handle); -int ckpt_open_this_node(struct ckpt_handle **handle); -void ckpt_close(struct ckpt_handle *handle); -int ckpt_global_store(const char *section, const char *data, size_t data_len); -int ckpt_global_get(const char *section, char **data, size_t *data_len); -int ckpt_section_store(struct ckpt_handle *handle, const char *section, - const char *data, size_t data_len); -int ckpt_section_get(struct ckpt_handle *handle, const char *section, - char **data, size_t *data_len); - +/* member.c */ +int setup_cluster_cfg(void); +void close_cluster_cfg(void); /* stack-specific interfaces (cman.c) */ int setup_stack(void); char *nodeid2name(int nodeid); -int validate_cluster(const char *cluster); int get_clustername(const char **cluster); int kill_stack_node(int nodeid); void exit_stack(void);