128 lines
4.7 KiB
Diff
128 lines
4.7 KiB
Diff
From 2587f9fabea3a7ef01eb7752d4e2ef082823934e Mon Sep 17 00:00:00 2001
|
|
From: eabdullin <ed.abdullin.1@gmail.com>
|
|
Date: Wed, 13 Sep 2023 14:15:46 +0300
|
|
Subject: [PATCH] - Fix: controller: don't try to execute agent action at
|
|
shutdown Normally, agent execution is not possible at shutdown. However, when
|
|
metadata is needed for some action, the agent can be called asynchronously,
|
|
and when the metadata action returns, the original action is performed. If
|
|
the metadata is initiated before shutdown, but completes after shutdown has
|
|
begun, do not try to attempt the original action, so we avoid unnecessary
|
|
error logs. - Refactor: controller: de-functionize lrm_state_destroy() It was
|
|
a one-liner called once - Log: controller: improve messages for resource
|
|
history updates - Low: controller: guard lrm_state_table usage with NULLcheck
|
|
It is NULL while draining the mainloop during the shutdown sequence.
|
|
|
|
---
|
|
daemons/controld/controld_execd.c | 15 ++++++++++++---
|
|
daemons/controld/controld_execd_state.c | 15 +++++++--------
|
|
daemons/controld/controld_lrm.h | 5 -----
|
|
3 files changed, 19 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/daemons/controld/controld_execd.c b/daemons/controld/controld_execd.c
|
|
index afead92..e7a91ab 100644
|
|
--- a/daemons/controld/controld_execd.c
|
|
+++ b/daemons/controld/controld_execd.c
|
|
@@ -1728,7 +1728,9 @@ metadata_complete(int pid, const pcmk__action_result_t *result, void *user_data)
|
|
md = controld_cache_metadata(lrm_state->metadata_cache, data->rsc,
|
|
result->action_stdout);
|
|
}
|
|
- do_lrm_rsc_op(lrm_state, data->rsc, data->input_xml, md);
|
|
+ if (!pcmk_is_set(fsa_input_register, R_HA_DISCONNECTED)) {
|
|
+ do_lrm_rsc_op(lrm_state, data->rsc, data->input_xml, md);
|
|
+ }
|
|
free_metadata_cb_data(data);
|
|
}
|
|
|
|
@@ -2406,10 +2408,17 @@ cib_rsc_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void *use
|
|
case pcmk_ok:
|
|
case -pcmk_err_diff_failed:
|
|
case -pcmk_err_diff_resync:
|
|
- crm_trace("Resource update %d complete: rc=%d", call_id, rc);
|
|
+ crm_trace("Resource history update completed (call=%d rc=%d)",
|
|
+ call_id, rc);
|
|
break;
|
|
default:
|
|
- crm_warn("Resource update %d failed: (rc=%d) %s", call_id, rc, pcmk_strerror(rc));
|
|
+ if (call_id > 0) {
|
|
+ crm_warn("Resource history update %d failed: %s "
|
|
+ CRM_XS " rc=%d", call_id, pcmk_strerror(rc), rc);
|
|
+ } else {
|
|
+ crm_warn("Resource history update failed: %s " CRM_XS " rc=%d",
|
|
+ pcmk_strerror(rc), rc);
|
|
+ }
|
|
}
|
|
|
|
if (call_id == last_resource_update) {
|
|
diff --git a/daemons/controld/controld_execd_state.c b/daemons/controld/controld_execd_state.c
|
|
index adba2e5..3994b6d 100644
|
|
--- a/daemons/controld/controld_execd_state.c
|
|
+++ b/daemons/controld/controld_execd_state.c
|
|
@@ -131,12 +131,6 @@ lrm_state_create(const char *node_name)
|
|
return state;
|
|
}
|
|
|
|
-void
|
|
-lrm_state_destroy(const char *node_name)
|
|
-{
|
|
- g_hash_table_remove(lrm_state_table, node_name);
|
|
-}
|
|
-
|
|
static gboolean
|
|
remote_proxy_remove_by_node(gpointer key, gpointer value, gpointer user_data)
|
|
{
|
|
@@ -252,7 +246,7 @@ lrm_state_destroy_all(void)
|
|
lrm_state_t *
|
|
lrm_state_find(const char *node_name)
|
|
{
|
|
- if (!node_name) {
|
|
+ if ((node_name == NULL) || (lrm_state_table == NULL)) {
|
|
return NULL;
|
|
}
|
|
return g_hash_table_lookup(lrm_state_table, node_name);
|
|
@@ -263,6 +257,8 @@ lrm_state_find_or_create(const char *node_name)
|
|
{
|
|
lrm_state_t *lrm_state;
|
|
|
|
+ CRM_CHECK(lrm_state_table != NULL, return NULL);
|
|
+
|
|
lrm_state = g_hash_table_lookup(lrm_state_table, node_name);
|
|
if (!lrm_state) {
|
|
lrm_state = lrm_state_create(node_name);
|
|
@@ -274,6 +270,9 @@ lrm_state_find_or_create(const char *node_name)
|
|
GList *
|
|
lrm_state_get_list(void)
|
|
{
|
|
+ if (lrm_state_table == NULL) {
|
|
+ return NULL;
|
|
+ }
|
|
return g_hash_table_get_values(lrm_state_table);
|
|
}
|
|
|
|
@@ -764,7 +763,7 @@ lrm_state_unregister_rsc(lrm_state_t * lrm_state,
|
|
}
|
|
|
|
if (is_remote_lrmd_ra(NULL, NULL, rsc_id)) {
|
|
- lrm_state_destroy(rsc_id);
|
|
+ g_hash_table_remove(lrm_state_table, rsc_id);
|
|
return pcmk_ok;
|
|
}
|
|
|
|
diff --git a/daemons/controld/controld_lrm.h b/daemons/controld/controld_lrm.h
|
|
index 983c288..11ff1bc 100644
|
|
--- a/daemons/controld/controld_lrm.h
|
|
+++ b/daemons/controld/controld_lrm.h
|
|
@@ -113,11 +113,6 @@ void lrm_state_destroy_all(void);
|
|
*/
|
|
lrm_state_t *lrm_state_create(const char *node_name);
|
|
|
|
-/*!
|
|
- * \brief Destroy executor connection by node name
|
|
- */
|
|
-void lrm_state_destroy(const char *node_name);
|
|
-
|
|
/*!
|
|
* \brief Find lrm_state data by node name
|
|
*/
|
|
--
|
|
|