653 lines
23 KiB
Diff
653 lines
23 KiB
Diff
From 0a884f325e1049febc28bf0419ab307dd0bce5af Mon Sep 17 00:00:00 2001
|
|
From: Ken Gaillot <kgaillot@redhat.com>
|
|
Date: Thu, 16 May 2019 20:04:57 -0500
|
|
Subject: [PATCH] Log: various: improve fencer connection messages
|
|
|
|
Previously, log messages around fencer connections were inconsistent.
|
|
|
|
This attempts to make them more consistent by: having stonith_api_signon() log
|
|
only at debug level, letting the callers log at a level appropriate to the
|
|
situation using the return code; functionizing retrying a connection; and
|
|
using similar wording across clients.
|
|
|
|
This also does a bit of refactoring for better error checking and improved
|
|
efficiency.
|
|
---
|
|
daemons/controld/controld_control.c | 7 +-
|
|
daemons/controld/controld_te_utils.c | 59 ++++++-----
|
|
daemons/execd/pacemaker-execd.c | 28 ++---
|
|
daemons/fenced/cts-fence-helper.c | 38 +++----
|
|
include/crm/stonith-ng.h | 4 +
|
|
lib/fencing/st_client.c | 195 ++++++++++++++++++++---------------
|
|
tools/crm_mon.c | 1 -
|
|
tools/stonith_admin.c | 29 +-----
|
|
8 files changed, 181 insertions(+), 180 deletions(-)
|
|
|
|
diff --git a/daemons/controld/controld_control.c b/daemons/controld/controld_control.c
|
|
index 89b5b5d..6d9f335 100644
|
|
--- a/daemons/controld/controld_control.c
|
|
+++ b/daemons/controld/controld_control.c
|
|
@@ -628,10 +628,11 @@ do_started(long long action,
|
|
register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL);
|
|
}
|
|
|
|
+ // Try connecting to fencer (retrying later in mainloop if failed)
|
|
if (stonith_reconnect == NULL) {
|
|
- int dummy;
|
|
-
|
|
- stonith_reconnect = mainloop_add_trigger(G_PRIORITY_LOW, te_connect_stonith, &dummy);
|
|
+ stonith_reconnect = mainloop_add_trigger(G_PRIORITY_LOW,
|
|
+ te_connect_stonith,
|
|
+ GINT_TO_POINTER(TRUE));
|
|
}
|
|
set_bit(fsa_input_register, R_ST_REQUIRED);
|
|
mainloop_set_trigger(stonith_reconnect);
|
|
diff --git a/daemons/controld/controld_te_utils.c b/daemons/controld/controld_te_utils.c
|
|
index 5606ed6..22f83ad 100644
|
|
--- a/daemons/controld/controld_te_utils.c
|
|
+++ b/daemons/controld/controld_te_utils.c
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright 2004-2018 Andrew Beekhof <andrew@beekhof.net>
|
|
+ * Copyright 2004-2019 the Pacemaker project contributors
|
|
*
|
|
* This source code is licensed under the GNU General Public License version 2
|
|
* or later (GPLv2+) WITHOUT ANY WARRANTY.
|
|
@@ -385,10 +385,18 @@ te_trigger_stonith_history_sync(void)
|
|
mainloop_timer_start(stonith_history_sync_timer);
|
|
}
|
|
|
|
+/*!
|
|
+ * \brief Connect to fencer
|
|
+ *
|
|
+ * \param[in] user_data If NULL, retry failures now, otherwise retry in main loop
|
|
+ *
|
|
+ * \return TRUE
|
|
+ * \note If user_data is NULL, this will wait 2s between attempts, for up to
|
|
+ * 30 attempts, meaning the controller could be blocked as long as 58s.
|
|
+ */
|
|
gboolean
|
|
te_connect_stonith(gpointer user_data)
|
|
{
|
|
- int lpc = 0;
|
|
int rc = pcmk_ok;
|
|
|
|
if (stonith_api == NULL) {
|
|
@@ -396,42 +404,41 @@ te_connect_stonith(gpointer user_data)
|
|
}
|
|
|
|
if (stonith_api->state != stonith_disconnected) {
|
|
- crm_trace("Still connected");
|
|
+ crm_trace("Already connected to fencer, no need to retry");
|
|
return TRUE;
|
|
}
|
|
|
|
- for (lpc = 0; lpc < 30; lpc++) {
|
|
- crm_debug("Attempting connection to fencing daemon...");
|
|
-
|
|
- sleep(1);
|
|
- rc = stonith_api->cmds->connect(stonith_api, crm_system_name, NULL);
|
|
-
|
|
- if (rc == pcmk_ok) {
|
|
- break;
|
|
+ if (user_data == NULL) {
|
|
+ // Blocking (retry failures now until successful)
|
|
+ rc = stonith_api_connect_retry(stonith_api, crm_system_name, 30);
|
|
+ if (rc != pcmk_ok) {
|
|
+ crm_err("Could not connect to fencer in 30 attempts: %s "
|
|
+ CRM_XS " rc=%d", pcmk_strerror(rc), rc);
|
|
}
|
|
-
|
|
- if (user_data != NULL) {
|
|
+ } else {
|
|
+ // Non-blocking (retry failures later in main loop)
|
|
+ rc = stonith_api->cmds->connect(stonith_api, crm_system_name, NULL);
|
|
+ if (rc != pcmk_ok) {
|
|
if (is_set(fsa_input_register, R_ST_REQUIRED)) {
|
|
- crm_err("Sign-in failed: triggered a retry");
|
|
+ crm_err("Fencer connection failed (will retry): %s "
|
|
+ CRM_XS " rc=%d", pcmk_strerror(rc), rc);
|
|
mainloop_set_trigger(stonith_reconnect);
|
|
} else {
|
|
- crm_info("Sign-in failed, but no longer required");
|
|
+ crm_info("Fencer connection failed (ignoring because no longer required): %s "
|
|
+ CRM_XS " rc=%d", pcmk_strerror(rc), rc);
|
|
}
|
|
return TRUE;
|
|
}
|
|
-
|
|
- crm_err("Sign-in failed: pausing and trying again in 2s...");
|
|
- sleep(1);
|
|
}
|
|
|
|
- CRM_CHECK(rc == pcmk_ok, return TRUE); /* If not, we failed 30 times... just get out */
|
|
- stonith_api->cmds->register_notification(stonith_api, T_STONITH_NOTIFY_DISCONNECT,
|
|
- tengine_stonith_connection_destroy);
|
|
-
|
|
- stonith_api->cmds->register_notification(stonith_api, T_STONITH_NOTIFY_FENCE,
|
|
- tengine_stonith_notify);
|
|
-
|
|
- crm_trace("Connected");
|
|
+ if (rc == pcmk_ok) {
|
|
+ stonith_api->cmds->register_notification(stonith_api,
|
|
+ T_STONITH_NOTIFY_DISCONNECT,
|
|
+ tengine_stonith_connection_destroy);
|
|
+ stonith_api->cmds->register_notification(stonith_api,
|
|
+ T_STONITH_NOTIFY_FENCE,
|
|
+ tengine_stonith_notify);
|
|
+ }
|
|
return TRUE;
|
|
}
|
|
|
|
diff --git a/daemons/execd/pacemaker-execd.c b/daemons/execd/pacemaker-execd.c
|
|
index 21bb0ed..e2fdfca 100644
|
|
--- a/daemons/execd/pacemaker-execd.c
|
|
+++ b/daemons/execd/pacemaker-execd.c
|
|
@@ -65,28 +65,20 @@ get_stonith_connection(void)
|
|
stonith_api = NULL;
|
|
}
|
|
|
|
- if (!stonith_api) {
|
|
- int rc = 0;
|
|
- int tries = 10;
|
|
+ if (stonith_api == NULL) {
|
|
+ int rc = pcmk_ok;
|
|
|
|
stonith_api = stonith_api_new();
|
|
- do {
|
|
- rc = stonith_api->cmds->connect(stonith_api, "pacemaker-execd", NULL);
|
|
- if (rc == pcmk_ok) {
|
|
- stonith_api->cmds->register_notification(stonith_api,
|
|
- T_STONITH_NOTIFY_DISCONNECT,
|
|
- stonith_connection_destroy_cb);
|
|
- break;
|
|
- }
|
|
- sleep(1);
|
|
- tries--;
|
|
- } while (tries);
|
|
-
|
|
- if (rc) {
|
|
- crm_err("Unable to connect to stonith daemon to execute command. error: %s",
|
|
- pcmk_strerror(rc));
|
|
+ rc = stonith_api_connect_retry(stonith_api, crm_system_name, 10);
|
|
+ if (rc != pcmk_ok) {
|
|
+ crm_err("Could not connect to fencer in 10 attempts: %s "
|
|
+ CRM_XS " rc=%d", pcmk_strerror(rc), rc);
|
|
stonith_api_delete(stonith_api);
|
|
stonith_api = NULL;
|
|
+ } else {
|
|
+ stonith_api->cmds->register_notification(stonith_api,
|
|
+ T_STONITH_NOTIFY_DISCONNECT,
|
|
+ stonith_connection_destroy_cb);
|
|
}
|
|
}
|
|
return stonith_api;
|
|
diff --git a/daemons/fenced/cts-fence-helper.c b/daemons/fenced/cts-fence-helper.c
|
|
index c5ce1ab..4552fc1 100644
|
|
--- a/daemons/fenced/cts-fence-helper.c
|
|
+++ b/daemons/fenced/cts-fence-helper.c
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright 2009-2018 Andrew Beekhof <andrew@beekhof.net>
|
|
+ * Copyright 2009-2019 the Pacemaker project contributors
|
|
*
|
|
* This source code is licensed under the GNU General Public License version 2
|
|
* or later (GPLv2+) WITHOUT ANY WARRANTY.
|
|
@@ -124,8 +124,10 @@ passive_test(void)
|
|
int rc = 0;
|
|
|
|
rc = st->cmds->connect(st, crm_system_name, &pollfd.fd);
|
|
- crm_debug("Connect: %d", rc);
|
|
-
|
|
+ if (rc != pcmk_ok) {
|
|
+ stonith_api_delete(st);
|
|
+ crm_exit(CRM_EX_DISCONNECT);
|
|
+ }
|
|
st->cmds->register_notification(st, T_STONITH_NOTIFY_DISCONNECT, st_callback);
|
|
st->cmds->register_notification(st, T_STONITH_NOTIFY_FENCE, st_callback);
|
|
st->cmds->register_notification(st, STONITH_OP_DEVICE_ADD, st_callback);
|
|
@@ -271,8 +273,10 @@ sanity_tests(void)
|
|
int rc = 0;
|
|
|
|
rc = st->cmds->connect(st, crm_system_name, &pollfd.fd);
|
|
- crm_debug("Connect: %d", rc);
|
|
-
|
|
+ if (rc != pcmk_ok) {
|
|
+ stonith_api_delete(st);
|
|
+ crm_exit(CRM_EX_DISCONNECT);
|
|
+ }
|
|
st->cmds->register_notification(st, T_STONITH_NOTIFY_DISCONNECT, st_callback);
|
|
st->cmds->register_notification(st, T_STONITH_NOTIFY_FENCE, st_callback);
|
|
st->cmds->register_notification(st, STONITH_OP_DEVICE_ADD, st_callback);
|
|
@@ -295,7 +299,10 @@ standard_dev_test(void)
|
|
stonith_key_value_t *params = NULL;
|
|
|
|
rc = st->cmds->connect(st, crm_system_name, &pollfd.fd);
|
|
- crm_debug("Connect: %d", rc);
|
|
+ if (rc != pcmk_ok) {
|
|
+ stonith_api_delete(st);
|
|
+ crm_exit(CRM_EX_DISCONNECT);
|
|
+ }
|
|
|
|
params = stonith_key_value_add(params, "pcmk_host_map", "some-host=pcmk-7 true_1_node1=3,4");
|
|
|
|
@@ -502,23 +509,12 @@ test_register_async_devices(int check_event)
|
|
static void
|
|
try_mainloop_connect(int check_event)
|
|
{
|
|
- int tries = 10;
|
|
- int i = 0;
|
|
- int rc = 0;
|
|
+ int rc = stonith_api_connect_retry(st, crm_system_name, 10);
|
|
|
|
- for (i = 0; i < tries; i++) {
|
|
- rc = st->cmds->connect(st, crm_system_name, NULL);
|
|
-
|
|
- if (!rc) {
|
|
- crm_info("stonith client connection established");
|
|
- mainloop_test_done(TRUE);
|
|
- return;
|
|
- } else {
|
|
- crm_info("stonith client connection failed");
|
|
- }
|
|
- sleep(1);
|
|
+ if (rc == pcmk_ok) {
|
|
+ mainloop_test_done(TRUE);
|
|
+ return;
|
|
}
|
|
-
|
|
crm_err("API CONNECTION FAILURE");
|
|
mainloop_test_done(FALSE);
|
|
}
|
|
diff --git a/include/crm/stonith-ng.h b/include/crm/stonith-ng.h
|
|
index b7365a9..b640732 100644
|
|
--- a/include/crm/stonith-ng.h
|
|
+++ b/include/crm/stonith-ng.h
|
|
@@ -430,6 +430,10 @@ void stonith_key_value_freeall(stonith_key_value_t * kvp, int keys, int values);
|
|
|
|
void stonith_history_free(stonith_history_t *history);
|
|
|
|
+// Convenience functions
|
|
+int stonith_api_connect_retry(stonith_t *st, const char *name,
|
|
+ int max_attempts);
|
|
+
|
|
/* Basic helpers that allows nodes to be fenced and the history to be
|
|
* queried without mainloop or the caller understanding the full API
|
|
*
|
|
diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c
|
|
index 270ef8d..ceee944 100644
|
|
--- a/lib/fencing/st_client.c
|
|
+++ b/lib/fencing/st_client.c
|
|
@@ -1,5 +1,5 @@
|
|
/*
|
|
- * Copyright 2004-2018 Andrew Beekhof <andrew@beekhof.net>
|
|
+ * Copyright 2004-2019 the Pacemaker project contributors
|
|
*
|
|
* This source code is licensed under the GNU Lesser General Public License
|
|
* version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
|
|
@@ -1415,14 +1415,21 @@ static int
|
|
stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd)
|
|
{
|
|
int rc = pcmk_ok;
|
|
- stonith_private_t *native = stonith->st_private;
|
|
+ stonith_private_t *native = NULL;
|
|
+ const char *display_name = name? name : "client";
|
|
|
|
static struct ipc_client_callbacks st_callbacks = {
|
|
.dispatch = stonith_dispatch_internal,
|
|
.destroy = stonith_connection_destroy
|
|
};
|
|
|
|
- crm_trace("Connecting command channel");
|
|
+ CRM_CHECK(stonith != NULL, return -EINVAL);
|
|
+
|
|
+ native = stonith->st_private;
|
|
+ CRM_ASSERT(native != NULL);
|
|
+
|
|
+ crm_debug("Attempting fencer connection by %s with%s mainloop",
|
|
+ display_name, (stonith_fd? "out" : ""));
|
|
|
|
stonith->state = stonith_connected_command;
|
|
if (stonith_fd) {
|
|
@@ -1432,8 +1439,9 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd)
|
|
if (native->ipc && crm_ipc_connect(native->ipc)) {
|
|
*stonith_fd = crm_ipc_get_fd(native->ipc);
|
|
} else if (native->ipc) {
|
|
- crm_perror(LOG_ERR, "Connection to fencer failed");
|
|
- rc = -ENOTCONN;
|
|
+ crm_ipc_close(native->ipc);
|
|
+ crm_ipc_destroy(native->ipc);
|
|
+ native->ipc = NULL;
|
|
}
|
|
|
|
} else {
|
|
@@ -1444,11 +1452,8 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd)
|
|
}
|
|
|
|
if (native->ipc == NULL) {
|
|
- crm_debug("Could not connect to the Stonith API");
|
|
rc = -ENOTCONN;
|
|
- }
|
|
-
|
|
- if (rc == pcmk_ok) {
|
|
+ } else {
|
|
xmlNode *reply = NULL;
|
|
xmlNode *hello = create_xml_node(NULL, "stonith_command");
|
|
|
|
@@ -1458,11 +1463,12 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd)
|
|
rc = crm_ipc_send(native->ipc, hello, crm_ipc_client_response, -1, &reply);
|
|
|
|
if (rc < 0) {
|
|
- crm_perror(LOG_DEBUG, "Couldn't complete registration with the fencing API: %d", rc);
|
|
+ crm_debug("Couldn't register with the fencer: %s "
|
|
+ CRM_XS " rc=%d", pcmk_strerror(rc), rc);
|
|
rc = -ECOMM;
|
|
|
|
} else if (reply == NULL) {
|
|
- crm_err("Did not receive registration reply");
|
|
+ crm_debug("Couldn't register with the fencer: no reply");
|
|
rc = -EPROTO;
|
|
|
|
} else {
|
|
@@ -1470,18 +1476,23 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd)
|
|
const char *tmp_ticket = crm_element_value(reply, F_STONITH_CLIENTID);
|
|
|
|
if (safe_str_neq(msg_type, CRM_OP_REGISTER)) {
|
|
- crm_err("Invalid registration message: %s", msg_type);
|
|
- crm_log_xml_err(reply, "Bad reply");
|
|
+ crm_debug("Couldn't register with the fencer: invalid reply type '%s'",
|
|
+ (msg_type? msg_type : "(missing)"));
|
|
+ crm_log_xml_debug(reply, "Invalid fencer reply");
|
|
rc = -EPROTO;
|
|
|
|
} else if (tmp_ticket == NULL) {
|
|
- crm_err("No registration token provided");
|
|
- crm_log_xml_err(reply, "Bad reply");
|
|
+ crm_debug("Couldn't register with the fencer: no token in reply");
|
|
+ crm_log_xml_debug(reply, "Invalid fencer reply");
|
|
rc = -EPROTO;
|
|
|
|
} else {
|
|
- crm_trace("Obtained registration token: %s", tmp_ticket);
|
|
native->token = strdup(tmp_ticket);
|
|
+#if HAVE_MSGFROMIPC_TIMEOUT
|
|
+ stonith->call_timeout = MAX_IPC_DELAY;
|
|
+#endif
|
|
+ crm_debug("Connection to fencer by %s succeeded (registration token: %s)",
|
|
+ display_name, native->token);
|
|
rc = pcmk_ok;
|
|
}
|
|
}
|
|
@@ -1490,16 +1501,11 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd)
|
|
free_xml(hello);
|
|
}
|
|
|
|
- if (rc == pcmk_ok) {
|
|
-#if HAVE_MSGFROMIPC_TIMEOUT
|
|
- stonith->call_timeout = MAX_IPC_DELAY;
|
|
-#endif
|
|
- crm_debug("Connection to fencer successful");
|
|
- return pcmk_ok;
|
|
+ if (rc != pcmk_ok) {
|
|
+ crm_debug("Connection attempt to fencer by %s failed: %s "
|
|
+ CRM_XS " rc=%d", display_name, pcmk_strerror(rc), rc);
|
|
+ stonith->cmds->disconnect(stonith);
|
|
}
|
|
-
|
|
- crm_debug("Connection to fencer failed: %s", pcmk_strerror(rc));
|
|
- stonith->cmds->disconnect(stonith);
|
|
return rc;
|
|
}
|
|
|
|
@@ -2071,6 +2077,36 @@ stonith_api_new(void)
|
|
return new_stonith;
|
|
}
|
|
|
|
+/*!
|
|
+ * \brief Make a blocking connection attempt to the fencer
|
|
+ *
|
|
+ * \param[in,out] st Fencer API object
|
|
+ * \param[in] name Client name to use with fencer
|
|
+ * \param[in] max_attempts Return error if this many attempts fail
|
|
+ *
|
|
+ * \return pcmk_ok on success, result of last attempt otherwise
|
|
+ */
|
|
+int
|
|
+stonith_api_connect_retry(stonith_t *st, const char *name, int max_attempts)
|
|
+{
|
|
+ int rc = -EINVAL; // if max_attempts is not positive
|
|
+
|
|
+ for (int attempt = 1; attempt <= max_attempts; attempt++) {
|
|
+ rc = st->cmds->connect(st, name, NULL);
|
|
+ if (rc == pcmk_ok) {
|
|
+ return pcmk_ok;
|
|
+ } else if (attempt < max_attempts) {
|
|
+ crm_notice("Fencer connection attempt %d of %d failed (retrying in 2s): %s "
|
|
+ CRM_XS " rc=%d",
|
|
+ attempt, max_attempts, pcmk_strerror(rc), rc);
|
|
+ sleep(2);
|
|
+ }
|
|
+ }
|
|
+ crm_notice("Could not connect to fencer: %s " CRM_XS " rc=%d",
|
|
+ pcmk_strerror(rc), rc);
|
|
+ return rc;
|
|
+}
|
|
+
|
|
stonith_key_value_t *
|
|
stonith_key_value_add(stonith_key_value_t * head, const char *key, const char *value)
|
|
{
|
|
@@ -2122,85 +2158,78 @@ stonith_key_value_freeall(stonith_key_value_t * head, int keys, int values)
|
|
int
|
|
stonith_api_kick(uint32_t nodeid, const char *uname, int timeout, bool off)
|
|
{
|
|
- char *name = NULL;
|
|
- const char *action = "reboot";
|
|
-
|
|
- int rc = -EPROTO;
|
|
- stonith_t *st = NULL;
|
|
- enum stonith_call_options opts = st_opt_sync_call | st_opt_allow_suicide;
|
|
+ int rc = pcmk_ok;
|
|
+ stonith_t *st = stonith_api_new();
|
|
+ const char *action = off? "off" : "reboot";
|
|
|
|
api_log_open();
|
|
- st = stonith_api_new();
|
|
- if (st) {
|
|
- rc = st->cmds->connect(st, "stonith-api", NULL);
|
|
- if(rc != pcmk_ok) {
|
|
- api_log(LOG_ERR, "Connection failed, could not kick (%s) node %u/%s : %s (%d)", action, nodeid, uname, pcmk_strerror(rc), rc);
|
|
- }
|
|
+ if (st == NULL) {
|
|
+ api_log(LOG_ERR, "API initialization failed, could not kick (%s) node %u/%s",
|
|
+ action, nodeid, uname);
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
- if (uname != NULL) {
|
|
- name = strdup(uname);
|
|
-
|
|
- } else if (nodeid > 0) {
|
|
- opts |= st_opt_cs_nodeid;
|
|
- name = crm_itoa(nodeid);
|
|
- }
|
|
-
|
|
- if (off) {
|
|
- action = "off";
|
|
- }
|
|
-
|
|
- if (rc == pcmk_ok) {
|
|
+ rc = st->cmds->connect(st, "stonith-api", NULL);
|
|
+ if (rc != pcmk_ok) {
|
|
+ api_log(LOG_ERR, "Connection failed, could not kick (%s) node %u/%s : %s (%d)",
|
|
+ action, nodeid, uname, pcmk_strerror(rc), rc);
|
|
+ } else {
|
|
+ char *name = NULL;
|
|
+ enum stonith_call_options opts = st_opt_sync_call | st_opt_allow_suicide;
|
|
+
|
|
+ if (uname != NULL) {
|
|
+ name = strdup(uname);
|
|
+ } else if (nodeid > 0) {
|
|
+ opts |= st_opt_cs_nodeid;
|
|
+ name = crm_itoa(nodeid);
|
|
+ }
|
|
rc = st->cmds->fence(st, opts, name, action, timeout, 0);
|
|
- if(rc != pcmk_ok) {
|
|
- api_log(LOG_ERR, "Could not kick (%s) node %u/%s : %s (%d)", action, nodeid, uname, pcmk_strerror(rc), rc);
|
|
+ free(name);
|
|
+
|
|
+ if (rc != pcmk_ok) {
|
|
+ api_log(LOG_ERR, "Could not kick (%s) node %u/%s : %s (%d)",
|
|
+ action, nodeid, uname, pcmk_strerror(rc), rc);
|
|
} else {
|
|
- api_log(LOG_NOTICE, "Node %u/%s kicked: %s ", nodeid, uname, action);
|
|
+ api_log(LOG_NOTICE, "Node %u/%s kicked: %s", nodeid, uname, action);
|
|
}
|
|
}
|
|
|
|
- if (st) {
|
|
- st->cmds->disconnect(st);
|
|
- stonith_api_delete(st);
|
|
- }
|
|
-
|
|
- free(name);
|
|
+ stonith_api_delete(st);
|
|
return rc;
|
|
}
|
|
|
|
time_t
|
|
stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress)
|
|
{
|
|
- int rc = 0;
|
|
- char *name = NULL;
|
|
-
|
|
+ int rc = pcmk_ok;
|
|
time_t when = 0;
|
|
- stonith_t *st = NULL;
|
|
+ stonith_t *st = stonith_api_new();
|
|
stonith_history_t *history = NULL, *hp = NULL;
|
|
- enum stonith_call_options opts = st_opt_sync_call;
|
|
-
|
|
- st = stonith_api_new();
|
|
- if (st) {
|
|
- rc = st->cmds->connect(st, "stonith-api", NULL);
|
|
- if(rc != pcmk_ok) {
|
|
- api_log(LOG_NOTICE, "Connection failed: %s (%d)", pcmk_strerror(rc), rc);
|
|
- }
|
|
- }
|
|
-
|
|
- if (uname != NULL) {
|
|
- name = strdup(uname);
|
|
|
|
- } else if (nodeid > 0) {
|
|
- opts |= st_opt_cs_nodeid;
|
|
- name = crm_itoa(nodeid);
|
|
+ if (st == NULL) {
|
|
+ api_log(LOG_ERR, "Could not retrieve fence history for %u/%s: "
|
|
+ "API initialization failed", nodeid, uname);
|
|
+ return when;
|
|
}
|
|
|
|
- if (st && rc == pcmk_ok) {
|
|
+ rc = st->cmds->connect(st, "stonith-api", NULL);
|
|
+ if (rc != pcmk_ok) {
|
|
+ api_log(LOG_NOTICE, "Connection failed: %s (%d)", pcmk_strerror(rc), rc);
|
|
+ } else {
|
|
int entries = 0;
|
|
int progress = 0;
|
|
int completed = 0;
|
|
-
|
|
+ char *name = NULL;
|
|
+ enum stonith_call_options opts = st_opt_sync_call;
|
|
+
|
|
+ if (uname != NULL) {
|
|
+ name = strdup(uname);
|
|
+ } else if (nodeid > 0) {
|
|
+ opts |= st_opt_cs_nodeid;
|
|
+ name = crm_itoa(nodeid);
|
|
+ }
|
|
rc = st->cmds->history(st, opts, name, &history, 120);
|
|
+ free(name);
|
|
|
|
for (hp = history; hp; hp = hp->next) {
|
|
entries++;
|
|
@@ -2227,15 +2256,11 @@ stonith_api_time(uint32_t nodeid, const char *uname, bool in_progress)
|
|
}
|
|
}
|
|
|
|
- if (st) {
|
|
- st->cmds->disconnect(st);
|
|
- stonith_api_delete(st);
|
|
- }
|
|
+ stonith_api_delete(st);
|
|
|
|
if(when) {
|
|
api_log(LOG_INFO, "Node %u/%s last kicked at: %ld", nodeid, uname, (long int)when);
|
|
}
|
|
- free(name);
|
|
return when;
|
|
}
|
|
|
|
diff --git a/tools/crm_mon.c b/tools/crm_mon.c
|
|
index e101b62..bed0796 100644
|
|
--- a/tools/crm_mon.c
|
|
+++ b/tools/crm_mon.c
|
|
@@ -298,7 +298,6 @@ cib_connect(gboolean full)
|
|
}
|
|
|
|
if ((fence_connect) && (st->state == stonith_disconnected)) {
|
|
- crm_trace("Connecting to stonith");
|
|
rc = st->cmds->connect(st, crm_system_name, NULL);
|
|
if (rc == pcmk_ok) {
|
|
crm_trace("Setting up stonith callbacks");
|
|
diff --git a/tools/stonith_admin.c b/tools/stonith_admin.c
|
|
index d960fb1..6be66c6 100644
|
|
--- a/tools/stonith_admin.c
|
|
+++ b/tools/stonith_admin.c
|
|
@@ -198,31 +198,6 @@ struct {
|
|
int rc;
|
|
} async_fence_data;
|
|
|
|
-static int
|
|
-try_mainloop_connect(void)
|
|
-{
|
|
- stonith_t *st = async_fence_data.st;
|
|
- int tries = 10;
|
|
- int i = 0;
|
|
- int rc = 0;
|
|
-
|
|
- for (i = 0; i < tries; i++) {
|
|
- crm_debug("Connecting as %s", async_fence_data.name);
|
|
- rc = st->cmds->connect(st, async_fence_data.name, NULL);
|
|
-
|
|
- if (!rc) {
|
|
- crm_debug("stonith client connection established");
|
|
- return 0;
|
|
- } else {
|
|
- crm_debug("stonith client connection failed");
|
|
- }
|
|
- sleep(1);
|
|
- }
|
|
-
|
|
- crm_err("Could not connect to the fencer");
|
|
- return -1;
|
|
-}
|
|
-
|
|
static void
|
|
notify_callback(stonith_t * st, stonith_event_t * e)
|
|
{
|
|
@@ -251,8 +226,10 @@ async_fence_helper(gpointer user_data)
|
|
{
|
|
stonith_t *st = async_fence_data.st;
|
|
int call_id = 0;
|
|
+ int rc = stonith_api_connect_retry(st, async_fence_data.name, 10);
|
|
|
|
- if (try_mainloop_connect()) {
|
|
+ if (rc != pcmk_ok) {
|
|
+ fprintf(stderr, "Could not connect to fencer: %s\n", pcmk_strerror(rc));
|
|
g_main_loop_quit(mainloop);
|
|
return TRUE;
|
|
}
|
|
--
|
|
1.8.3.1
|
|
|