From 6f7ce4e903eed136cc9038952f9d57d4423736dd Mon Sep 17 00:00:00 2001 From: Klaus Wenninger Date: Sun, 4 Nov 2018 23:15:58 +0100 Subject: [PATCH 1/2] Refactor: remote_ra: have attribute strings in msg_xml.h --- crmd/remote_lrmd_ra.c | 6 +++--- include/crm/msg_xml.h | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/crmd/remote_lrmd_ra.c b/crmd/remote_lrmd_ra.c index 3cdc7f0..a164fc1 100644 --- a/crmd/remote_lrmd_ra.c +++ b/crmd/remote_lrmd_ra.c @@ -724,10 +724,10 @@ handle_remote_ra_start(lrm_state_t * lrm_state, remote_ra_cmd_t * cmd, int timeo int timeout_used = timeout_ms > MAX_START_TIMEOUT_MS ? MAX_START_TIMEOUT_MS : timeout_ms; for (tmp = cmd->params; tmp; tmp = tmp->next) { - if (safe_str_eq(tmp->key, "addr") || safe_str_eq(tmp->key, "server")) { + if (safe_str_eq(tmp->key, XML_RSC_ATTR_REMOTE_RA_ADDR) || + safe_str_eq(tmp->key, XML_RSC_ATTR_REMOTE_RA_SERVER)) { server = tmp->value; - } - if (safe_str_eq(tmp->key, "port")) { + } else if (safe_str_eq(tmp->key, XML_RSC_ATTR_REMOTE_RA_PORT)) { port = atoi(tmp->value); } } diff --git a/include/crm/msg_xml.h b/include/crm/msg_xml.h index 1ac4302..55f42c4 100644 --- a/include/crm/msg_xml.h +++ b/include/crm/msg_xml.h @@ -233,6 +233,9 @@ # define XML_RSC_ATTR_REMOTE_NODE "remote-node" # define XML_RSC_ATTR_CLEAR_OP "clear_failure_op" # define XML_RSC_ATTR_CLEAR_INTERVAL "clear_failure_interval" +# define XML_RSC_ATTR_REMOTE_RA_ADDR "addr" +# define XML_RSC_ATTR_REMOTE_RA_SERVER "server" +# define XML_RSC_ATTR_REMOTE_RA_PORT "port" # define XML_REMOTE_ATTR_RECONNECT_INTERVAL "reconnect_interval" -- 1.8.3.1 From 4dae6746002b034868feda763a85de85e08834e7 Mon Sep 17 00:00:00 2001 From: Klaus Wenninger Date: Sun, 4 Nov 2018 23:54:11 +0100 Subject: [PATCH 2/2] Fix: pacemaker-remote: skip remote_config_check for guest-nodes This is crucial when watchdog-fencing is enabled as the sbd-check done by pacemaker-remote would fail on guest-containers & bundles (eventually tearing down pacemaker-remote inside the container) and even on system-virtualized-guests the sbd-check doesn't make sense as these guests would be fenced by stop/start-cycling the VM. --- crmd/crmd_lrm.h | 1 + crmd/lrm_state.c | 14 +++++++++----- crmd/remote_lrmd_ra.c | 20 ++++++++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/crmd/crmd_lrm.h b/crmd/crmd_lrm.h index 7a74f7a..d115056 100644 --- a/crmd/crmd_lrm.h +++ b/crmd/crmd_lrm.h @@ -168,5 +168,6 @@ void remote_ra_fail(const char *node_name); void remote_ra_process_pseudo(xmlNode *xml); gboolean remote_ra_is_in_maintenance(lrm_state_t * lrm_state); void remote_ra_process_maintenance_nodes(xmlNode *xml); +gboolean remote_ra_controlling_guest(lrm_state_t * lrm_state); gboolean process_lrm_event(lrm_state_t * lrm_state, lrmd_event_data_t * op, struct recurring_op_s *pending); diff --git a/crmd/lrm_state.c b/crmd/lrm_state.c index 497afe1..40da762 100644 --- a/crmd/lrm_state.c +++ b/crmd/lrm_state.c @@ -500,11 +500,15 @@ crmd_remote_proxy_cb(lrmd_t *lrmd, void *userdata, xmlNode *msg) const char *channel = crm_element_value(msg, F_LRMD_IPC_IPC_SERVER); proxy = crmd_remote_proxy_new(lrmd, lrm_state->node_name, session, channel); - if (proxy != NULL) { - /* Look up stonith-watchdog-timeout and send to the remote peer for validation */ - int rc = fsa_cib_conn->cmds->query(fsa_cib_conn, XML_CIB_TAG_CRMCONFIG, NULL, cib_scope_local); - fsa_cib_conn->cmds->register_callback_full(fsa_cib_conn, rc, 10, FALSE, lrmd, - "remote_config_check", remote_config_check, NULL); + if (!remote_ra_controlling_guest(lrm_state)) { + if (proxy != NULL) { + /* Look up stonith-watchdog-timeout and send to the remote peer for validation */ + int rc = fsa_cib_conn->cmds->query(fsa_cib_conn, XML_CIB_TAG_CRMCONFIG, NULL, cib_scope_local); + fsa_cib_conn->cmds->register_callback_full(fsa_cib_conn, rc, 10, FALSE, lrmd, + "remote_config_check", remote_config_check, NULL); + } + } else { + crm_debug("Skipping remote_config_check for guest-nodes"); } } else if (safe_str_eq(op, LRMD_IPC_OP_SHUTDOWN_REQ)) { diff --git a/crmd/remote_lrmd_ra.c b/crmd/remote_lrmd_ra.c index a164fc1..0414709 100644 --- a/crmd/remote_lrmd_ra.c +++ b/crmd/remote_lrmd_ra.c @@ -85,6 +85,15 @@ typedef struct remote_ra_data_s { * so we have it signalled back with the * transition from pengine */ + gboolean controlling_guest; /* Similar for if we are controlling a guest + * or a bare-metal remote. + * Fortunately there is a meta-attribute in + * the transition already and as the + * situation doesn't change over time we can + * use the resource start for noting down + * the information for later use when the + * attributes aren't at hand. + */ } remote_ra_data_t; static int handle_remote_ra_start(lrm_state_t * lrm_state, remote_ra_cmd_t * cmd, int timeout_ms); @@ -721,6 +730,7 @@ handle_remote_ra_start(lrm_state_t * lrm_state, remote_ra_cmd_t * cmd, int timeo const char *server = NULL; lrmd_key_value_t *tmp = NULL; int port = 0; + remote_ra_data_t *ra_data = lrm_state->remote_ra_data; int timeout_used = timeout_ms > MAX_START_TIMEOUT_MS ? MAX_START_TIMEOUT_MS : timeout_ms; for (tmp = cmd->params; tmp; tmp = tmp->next) { @@ -729,6 +739,8 @@ handle_remote_ra_start(lrm_state_t * lrm_state, remote_ra_cmd_t * cmd, int timeo server = tmp->value; } else if (safe_str_eq(tmp->key, XML_RSC_ATTR_REMOTE_RA_PORT)) { port = atoi(tmp->value); + } else if (safe_str_eq(tmp->key, CRM_META"_"XML_RSC_ATTR_CONTAINER)) { + ra_data->controlling_guest = TRUE; } } @@ -1262,3 +1274,11 @@ remote_ra_is_in_maintenance(lrm_state_t * lrm_state) return ra_data->is_maintenance; } + +gboolean +remote_ra_controlling_guest(lrm_state_t * lrm_state) +{ + remote_ra_data_t *ra_data = lrm_state->remote_ra_data; + + return ra_data->controlling_guest; +} -- 1.8.3.1