diff --git a/dlm_controld/action.c b/dlm_controld/action.c index ae3f6cd..d4bf11d 100644 --- a/dlm_controld/action.c +++ b/dlm_controld/action.c @@ -67,14 +67,14 @@ static int detect_cluster_name(void) return -1; } - rv = cmap_get_string(handle, "cluster.name", &str); + rv = cmap_get_string(handle, "totem.cluster_name", &str); if (rv != CS_OK) { - log_error("cmap_get_string cluster.name error %d", rv); + log_error("cmap_get_string totem.cluster_name error %d", rv); goto out; } else err = 0; - log_debug("cmap cluster.name = '%s'", str); + log_debug("cmap totem.cluster_name = '%s'", str); strncpy(cluster_name, str, DLM_LOCKSPACE_LEN); out: @@ -848,10 +848,12 @@ int setup_configfs_options(void) detect_cluster_name(); - if (cluster_name[0]) + if (cluster_name[0]) { set_configfs_cluster("cluster_name", cluster_name, 0); - else + } else { log_error("no cluster name"); + return -1; + } } return 0; } diff --git a/dlm_controld/cpg.c b/dlm_controld/cpg.c index f490cf5..ced912f 100644 --- a/dlm_controld/cpg.c +++ b/dlm_controld/cpg.c @@ -280,7 +280,7 @@ const char *msg_name(int type) static int _send_message(cpg_handle_t h, void *buf, int len, int type) { struct iovec iov; - cpg_error_t error; + cs_error_t error; int retries = 0; iov.iov_base = buf; @@ -288,7 +288,7 @@ static int _send_message(cpg_handle_t h, void *buf, int len, int type) retry: error = cpg_mcast_joined(h, CPG_TYPE_AGREED, &iov, 1); - if (error == CPG_ERR_TRY_AGAIN) { + if (error == CS_ERR_TRY_AGAIN) { retries++; usleep(1000); if (!(retries % 100)) @@ -296,7 +296,7 @@ static int _send_message(cpg_handle_t h, void *buf, int len, int type) retries, msg_name(type)); goto retry; } - if (error != CPG_OK) { + if (error != CS_OK) { log_error("cpg_mcast_joined error %d handle %llx %s", error, (unsigned long long)h, msg_name(type)); return -1; @@ -686,6 +686,11 @@ static int need_fencing(struct lockspace *ls) return 0; } +/* we don't need to ask fenced to initiate fencing; it does + so itself when it sees a fence domain member fail. Without + fenced we'll probably need to ask another daemon to initiate + fencing, then check with it above, like we check libfenced. */ + static void request_fencing(struct lockspace *ls) { struct node *node; @@ -693,12 +698,7 @@ static void request_fencing(struct lockspace *ls) list_for_each_entry(node, &ls->node_history, list) { if (!node->request_fencing) continue; - - /* we don't need to ask fenced to initiate fencing; it does - so itself when it sees a fence domain member fail. Without - fenced we'll probably need to ask another daemon to initiate - fencing, then check with it above, like we check libfenced. */ - + fence_request(node->nodeid); node->request_fencing = 0; } } @@ -1886,11 +1886,11 @@ static cpg_model_v1_data_t cpg_callbacks = { void update_flow_control_status(void) { cpg_flow_control_state_t flow_control_state; - cpg_error_t error; + cs_error_t error; error = cpg_flow_control_state_get(cpg_handle_daemon, &flow_control_state); - if (error != CPG_OK) { + if (error != CS_OK) { log_error("cpg_flow_control_state_get %d", error); return; } @@ -1911,7 +1911,7 @@ void update_flow_control_status(void) static void process_cpg_lockspace(int ci) { struct lockspace *ls; - cpg_error_t error; + cs_error_t error; ls = find_ls_ci(ci); if (!ls) { @@ -1919,8 +1919,8 @@ static void process_cpg_lockspace(int ci) return; } - error = cpg_dispatch(ls->cpg_handle, CPG_DISPATCH_ALL); - if (error != CPG_OK) { + error = cpg_dispatch(ls->cpg_handle, CS_DISPATCH_ALL); + if (error != CS_OK) { log_error("cpg_dispatch error %d", error); return; } @@ -1932,7 +1932,7 @@ static void process_cpg_lockspace(int ci) int dlm_join_lockspace(struct lockspace *ls) { - cpg_error_t error; + cs_error_t error; cpg_handle_t h; struct cpg_name name; int i = 0, fd, ci, rv; @@ -1947,7 +1947,7 @@ int dlm_join_lockspace(struct lockspace *ls) error = cpg_model_initialize(&h, CPG_MODEL_V1, (cpg_model_data_t *)&cpg_callbacks, NULL); - if (error != CPG_OK) { + if (error != CS_OK) { log_error("cpg_model_initialize error %d", error); rv = -1; goto fail_free; @@ -1976,13 +1976,13 @@ int dlm_join_lockspace(struct lockspace *ls) log_group(ls, "cpg_join %s ...", name.value); retry: error = cpg_join(h, &name); - if (error == CPG_ERR_TRY_AGAIN) { + if (error == CS_ERR_TRY_AGAIN) { sleep(1); if (!(++i % 10)) log_error("cpg_join error retrying"); goto retry; } - if (error != CPG_OK) { + if (error != CS_OK) { log_error("cpg_join error %d", error); cpg_finalize(h); rv = -1; @@ -2005,7 +2005,7 @@ int dlm_join_lockspace(struct lockspace *ls) int dlm_leave_lockspace(struct lockspace *ls) { - cpg_error_t error; + cs_error_t error; struct cpg_name name; int i = 0; @@ -2017,13 +2017,13 @@ int dlm_leave_lockspace(struct lockspace *ls) retry: error = cpg_leave(ls->cpg_handle, &name); - if (error == CPG_ERR_TRY_AGAIN) { + if (error == CS_ERR_TRY_AGAIN) { sleep(1); if (!(++i % 10)) log_error("cpg_leave error retrying"); goto retry; } - if (error != CPG_OK) + if (error != CS_OK) log_error("cpg_leave error %d", error); return 0; @@ -2563,16 +2563,16 @@ static cpg_model_v1_data_t cpg_callbacks_daemon = { void process_cpg_daemon(int ci) { - cpg_error_t error; + cs_error_t error; - error = cpg_dispatch(cpg_handle_daemon, CPG_DISPATCH_ALL); - if (error != CPG_OK) + error = cpg_dispatch(cpg_handle_daemon, CS_DISPATCH_ALL); + if (error != CS_OK) log_error("daemon cpg_dispatch error %d", error); } int setup_cpg_daemon(void) { - cpg_error_t error; + cs_error_t error; struct cpg_name name; int i = 0; @@ -2597,7 +2597,7 @@ int setup_cpg_daemon(void) error = cpg_model_initialize(&cpg_handle_daemon, CPG_MODEL_V1, (cpg_model_data_t *)&cpg_callbacks_daemon, NULL); - if (error != CPG_OK) { + if (error != CS_OK) { log_error("daemon cpg_initialize error %d", error); return -1; } @@ -2611,13 +2611,13 @@ int setup_cpg_daemon(void) log_debug("cpg_join %s ...", name.value); retry: error = cpg_join(cpg_handle_daemon, &name); - if (error == CPG_ERR_TRY_AGAIN) { + if (error == CS_ERR_TRY_AGAIN) { sleep(1); if (!(++i % 10)) log_error("daemon cpg_join error retrying"); goto retry; } - if (error != CPG_OK) { + if (error != CS_OK) { log_error("daemon cpg_join error %d", error); goto fail; } @@ -2633,7 +2633,7 @@ int setup_cpg_daemon(void) void close_cpg_daemon(void) { struct lockspace *ls; - cpg_error_t error; + cs_error_t error; struct cpg_name name; int i = 0; @@ -2649,13 +2649,13 @@ void close_cpg_daemon(void) log_debug("cpg_leave %s ...", name.value); retry: error = cpg_leave(cpg_handle_daemon, &name); - if (error == CPG_ERR_TRY_AGAIN) { + if (error == CS_ERR_TRY_AGAIN) { sleep(1); if (!(++i % 10)) log_error("daemon cpg_leave error retrying"); goto retry; } - if (error != CPG_OK) + if (error != CS_OK) log_error("daemon cpg_leave error %d", error); fin: list_for_each_entry(ls, &lockspaces, list) { diff --git a/dlm_controld/dlm_daemon.h b/dlm_controld/dlm_daemon.h index 497e6e8..3899550 100644 --- a/dlm_controld/dlm_daemon.h +++ b/dlm_controld/dlm_daemon.h @@ -348,6 +348,7 @@ void process_cluster_cfg(int ci); void kick_node_from_cluster(int nodeid); /* fence.c */ +void fence_request(int nodeid); int fence_node_time(int nodeid, uint64_t *last_fenced_time); int fence_in_progress(int *count); diff --git a/dlm_controld/fence.c b/dlm_controld/fence.c index 95a8bc1..f91d9de 100644 --- a/dlm_controld/fence.c +++ b/dlm_controld/fence.c @@ -7,38 +7,30 @@ */ #include "dlm_daemon.h" -//#include "libfenced.h" +#ifdef STONITH +#include +#endif -int fence_node_time(int nodeid, uint64_t *last_fenced_time) +void fence_request(int nodeid) { -/* - struct fenced_node nodeinfo; +#ifdef STONITH int rv; + rv = stonith_api_kick_cs_helper(nodeid, 300, 1); + if (rv) + log_error("stonith_api_kick_cs_helper %d error %d", nodeid, rv); +#endif +} - memset(&nodeinfo, 0, sizeof(nodeinfo)); - - rv = fenced_node_info(nodeid, &nodeinfo); - if (rv < 0) - return rv; - - *last_fenced_time = nodeinfo.last_fenced_time; -*/ +int fence_node_time(int nodeid, uint64_t *last_fenced_time) +{ +#ifdef STONITH + *last_fenced_time = stonith_api_time_cs_helper(nodeid, 0); +#endif return 0; } int fence_in_progress(int *count) { -/* struct fenced_domain domain; - int rv; - - memset(&domain, 0, sizeof(domain)); - - rv = fenced_domain_info(&domain); - if (rv < 0) - return rv; - - *count = domain.victim_count; -*/ return 0; } diff --git a/dlm_controld/member.c b/dlm_controld/member.c index 4a445c8..7af581c 100644 --- a/dlm_controld/member.c +++ b/dlm_controld/member.c @@ -265,7 +265,6 @@ static void shutdown_callback(corosync_cfg_handle_t h, static corosync_cfg_callbacks_t cfg_callbacks = { .corosync_cfg_shutdown_callback = shutdown_callback, - .corosync_cfg_state_track_callback = NULL, }; void process_cluster_cfg(int ci) @@ -302,9 +301,16 @@ int setup_cluster_cfg(void) 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; } diff --git a/init/dlm.init b/init/dlm.init index db8f17f..7f3da2d 100644 --- a/init/dlm.init +++ b/init/dlm.init @@ -26,7 +26,7 @@ progdir="cluster" lockfile="/var/run/$progdir/$prog.pid" exec="/usr/sbin/$prog" -[ -f /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog +[ -f /etc/sysconfig/dlm ] && . /etc/sysconfig/dlm setup() { modprobe dlm > /dev/null 2>&1 diff --git a/init/dlm.service b/init/dlm.service index e275843..d7cf9c7 100644 --- a/init/dlm.service +++ b/init/dlm.service @@ -4,7 +4,10 @@ After=syslog.target network.target corosync.service [Service] Type=forking -ExecStart=/usr/sbin/dlm_controld $OPTIONS +EnvironmentFile=/etc/sysconfig/dlm +ExecStartPre=/sbin/modprobe dlm +ExecStart=/usr/sbin/dlm_controld $DLM_CONTROLD_OPTS +#ExecStopPost=/sbin/modprobe -r dlm [Install] WantedBy=multi-user.target diff --git a/libdlm/51-dlm.rules b/libdlm/51-dlm.rules index f71e79d..9d21fc0 100644 --- a/libdlm/51-dlm.rules +++ b/libdlm/51-dlm.rules @@ -1,5 +1,4 @@ -KERNEL=="dlm-control", NAME="misc/dlm-control", MODE="0666" -KERNEL=="dlm-monitor", NAME="misc/dlm-monitor", MODE="0666" -KERNEL=="dlm_default", NAME="misc/dlm_default", MODE="0666" -KERNEL=="dlm_*", NAME="misc/%k", MODE="0660" - +KERNEL=="dlm-control", MODE="0666", SYMLINK+="misc/dlm-control" +KERNEL=="dlm-monitor", MODE="0666", SYMLINK+="misc/dlm-monitor" +KERNEL=="dlm_plock", MODE="0666", SYMLINK+="misc/dlm_plock" +KERNEL=="dlm_*", MODE="0660", SYMLINK+="misc/%k"