diff --git a/daemons/attrd/attrd_alerts.c b/daemons/attrd/attrd_alerts.c index 81d02d2ce2c..9ee8738bc3c 100644 --- a/daemons/attrd/attrd_alerts.c +++ b/daemons/attrd/attrd_alerts.c @@ -1,5 +1,5 @@ /* - * Copyright 2015-2024 the Pacemaker project contributors + * Copyright 2015-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -26,7 +26,7 @@ attrd_lrmd_callback(lrmd_event_data_t * op) CRM_CHECK(op != NULL, return); switch (op->type) { case lrmd_event_disconnect: - crm_info("Lost connection to executor"); + pcmk__info("Lost connection to executor"); attrd_lrmd_disconnect(); break; default: @@ -52,8 +52,8 @@ attrd_lrmd_connect(void) break; } - crm_debug("Could not connect to executor, %d tries remaining", - (max_attempts - fails)); + pcmk__debug("Could not connect to executor, %d tries remaining", + (max_attempts - fails)); /* @TODO We don't want to block here with sleep, but we should wait * some time between connection attempts. We could possibly add a * timer with a callback, but then we'd likely need an alert queue. @@ -84,10 +84,10 @@ config_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void xmlNode *crmalerts = NULL; if (rc == -ENXIO) { - crm_debug("Local CIB has no alerts section"); + pcmk__debug("Local CIB has no alerts section"); return; } else if (rc != pcmk_ok) { - crm_notice("Could not query local CIB: %s", pcmk_strerror(rc)); + pcmk__notice("Could not query local CIB: %s", pcmk_strerror(rc)); return; } @@ -96,7 +96,7 @@ config_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void crmalerts = pcmk__xe_first_child(crmalerts, PCMK_XE_ALERTS, NULL, NULL); } if (!crmalerts) { - crm_notice("CIB query result has no " PCMK_XE_ALERTS " section"); + pcmk__notice("CIB query result has no " PCMK_XE_ALERTS " section"); return; } @@ -119,7 +119,7 @@ attrd_read_options(gpointer user_data) "config_query_callback", config_query_callback, free); - crm_trace("Querying the CIB... call %d", call_id); + pcmk__trace("Querying the CIB... call %d", call_id); return TRUE; } diff --git a/daemons/attrd/attrd_attributes.c b/daemons/attrd/attrd_attributes.c index fdc238375e7..a4864ca65b4 100644 --- a/daemons/attrd/attrd_attributes.c +++ b/daemons/attrd/attrd_attributes.c @@ -1,5 +1,5 @@ /* - * Copyright 2013-2024 the Pacemaker project contributors + * Copyright 2013-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -26,9 +26,9 @@ attrd_create_attribute(xmlNode *xml) { int is_private = 0; long long dampen = 0; - const char *name = crm_element_value(xml, PCMK__XA_ATTR_NAME); - const char *set_type = crm_element_value(xml, PCMK__XA_ATTR_SET_TYPE); - const char *dampen_s = crm_element_value(xml, PCMK__XA_ATTR_DAMPENING); + const char *name = pcmk__xe_get(xml, PCMK__XA_ATTR_NAME); + const char *set_type = pcmk__xe_get(xml, PCMK__XA_ATTR_SET_TYPE); + const char *dampen_s = pcmk__xe_get(xml, PCMK__XA_ATTR_DAMPENING); attribute_t *a = NULL; if (set_type == NULL) { @@ -38,12 +38,12 @@ attrd_create_attribute(xmlNode *xml) /* Set type is meaningful only when writing to the CIB. Private * attributes are not written. */ - crm_element_value_int(xml, PCMK__XA_ATTR_IS_PRIVATE, &is_private); + pcmk__xe_get_int(xml, PCMK__XA_ATTR_IS_PRIVATE, &is_private); if (!is_private && !pcmk__str_any_of(set_type, PCMK_XE_INSTANCE_ATTRIBUTES, PCMK_XE_UTILIZATION, NULL)) { - crm_warn("Ignoring attribute %s with invalid set type %s", - pcmk__s(name, "(unidentified)"), set_type); + pcmk__warn("Ignoring attribute %s with invalid set type %s", + pcmk__s(name, "(unidentified)"), set_type); return NULL; } @@ -51,8 +51,8 @@ attrd_create_attribute(xmlNode *xml) a->id = pcmk__str_copy(name); a->set_type = pcmk__str_copy(set_type); - a->set_id = crm_element_value_copy(xml, PCMK__XA_ATTR_SET); - a->user = crm_element_value_copy(xml, PCMK__XA_ATTR_USER); + a->set_id = pcmk__xe_get_copy(xml, PCMK__XA_ATTR_SET); + a->user = pcmk__xe_get_copy(xml, PCMK__XA_ATTR_USER); a->values = pcmk__strikey_table(NULL, attrd_free_attribute_value); if (is_private) { @@ -60,20 +60,20 @@ attrd_create_attribute(xmlNode *xml) } if (dampen_s != NULL) { - dampen = crm_get_msec(dampen_s); - } + if ((pcmk__parse_ms(dampen_s, &dampen) != pcmk_rc_ok) || (dampen < 0)) { + pcmk__warn("Ignoring invalid delay %s for attribute %s", dampen_s, + a->id); - if (dampen > 0) { - a->timeout_ms = (int) QB_MIN(dampen, INT_MAX); - a->timer = attrd_add_timer(a->id, a->timeout_ms, a); - } else if (dampen < 0) { - crm_warn("Ignoring invalid delay %s for attribute %s", dampen_s, a->id); + } else if (dampen > 0) { + a->timeout_ms = (int) QB_MIN(dampen, INT_MAX); + a->timer = attrd_add_timer(a->id, a->timeout_ms, a); + } } - crm_trace("Created attribute %s with %s write delay and %s CIB user", - a->id, - ((dampen > 0)? pcmk__readable_interval(a->timeout_ms) : "no"), - pcmk__s(a->user, "default")); + pcmk__trace("Created attribute %s with %s write delay and %s CIB user", + a->id, + ((dampen > 0)? pcmk__readable_interval(a->timeout_ms) : "no"), + pcmk__s(a->user, "default")); g_hash_table_replace(attributes, a->id, a); return a; @@ -82,19 +82,18 @@ attrd_create_attribute(xmlNode *xml) static int attrd_update_dampening(attribute_t *a, xmlNode *xml, const char *attr) { - const char *dvalue = crm_element_value(xml, PCMK__XA_ATTR_DAMPENING); + const char *dvalue = pcmk__xe_get(xml, PCMK__XA_ATTR_DAMPENING); long long dampen = 0; if (dvalue == NULL) { - crm_warn("Could not update %s: peer did not specify value for delay", - attr); + pcmk__warn("Could not update %s: peer did not specify value for delay", + attr); return EINVAL; } - dampen = crm_get_msec(dvalue); - if (dampen < 0) { - crm_warn("Could not update %s: invalid delay value %dms (%s)", - attr, dampen, dvalue); + if ((pcmk__parse_ms(dvalue, &dampen) != pcmk_rc_ok) || (dampen < 0)) { + pcmk__warn("Could not update %s: invalid delay value %dms (%s)", attr, + dampen, dvalue); return EINVAL; } @@ -103,11 +102,11 @@ attrd_update_dampening(attribute_t *a, xmlNode *xml, const char *attr) a->timeout_ms = (int) QB_MIN(dampen, INT_MAX); if (dampen > 0) { a->timer = attrd_add_timer(attr, a->timeout_ms, a); - crm_info("Update attribute %s delay to %dms (%s)", - attr, dampen, dvalue); + pcmk__info("Update attribute %s delay to %dms (%s)", + attr, dampen, dvalue); } else { a->timer = NULL; - crm_info("Update attribute %s to remove delay", attr); + pcmk__info("Update attribute %s to remove delay", attr); } /* If dampening changed, do an immediate write-out, @@ -138,11 +137,11 @@ attrd_add_value_xml(xmlNode *parent, const attribute_t *a, { xmlNode *xml = pcmk__xe_create(parent, __func__); - crm_xml_add(xml, PCMK__XA_ATTR_NAME, a->id); - crm_xml_add(xml, PCMK__XA_ATTR_SET_TYPE, a->set_type); - crm_xml_add(xml, PCMK__XA_ATTR_SET, a->set_id); - crm_xml_add(xml, PCMK__XA_ATTR_USER, a->user); - crm_xml_add(xml, PCMK__XA_ATTR_HOST, v->nodename); + pcmk__xe_set(xml, PCMK__XA_ATTR_NAME, a->id); + pcmk__xe_set(xml, PCMK__XA_ATTR_SET_TYPE, a->set_type); + pcmk__xe_set(xml, PCMK__XA_ATTR_SET, a->set_id); + pcmk__xe_set(xml, PCMK__XA_ATTR_USER, a->user); + pcmk__xe_set(xml, PCMK__XA_ATTR_HOST, v->nodename); /* @COMPAT Prior to 2.1.10 and 3.0.1, the node's cluster ID was added * instead of its XML ID. For Corosync and Pacemaker Remote nodes, those are @@ -150,16 +149,17 @@ attrd_add_value_xml(xmlNode *parent, const attribute_t *a, * cluster IDs, we will have to drop support for rolling upgrades from * versions before those. */ - crm_xml_add(xml, PCMK__XA_ATTR_HOST_ID, attrd_get_node_xml_id(v->nodename)); - - crm_xml_add(xml, PCMK__XA_ATTR_VALUE, v->current); - crm_xml_add_int(xml, PCMK__XA_ATTR_DAMPENING, - pcmk__timeout_ms2s(a->timeout_ms)); - crm_xml_add_int(xml, PCMK__XA_ATTR_IS_PRIVATE, - pcmk_is_set(a->flags, attrd_attr_is_private)); - crm_xml_add_int(xml, PCMK__XA_ATTR_IS_REMOTE, - pcmk_is_set(v->flags, attrd_value_remote)); - crm_xml_add_int(xml, PCMK__XA_ATTRD_IS_FORCE_WRITE, force_write); + pcmk__xe_set(xml, PCMK__XA_ATTR_HOST_ID, + attrd_get_node_xml_id(v->nodename)); + + pcmk__xe_set(xml, PCMK__XA_ATTR_VALUE, v->current); + pcmk__xe_set_int(xml, PCMK__XA_ATTR_DAMPENING, + pcmk__timeout_ms2s(a->timeout_ms)); + pcmk__xe_set_int(xml, PCMK__XA_ATTR_IS_PRIVATE, + pcmk__is_set(a->flags, attrd_attr_is_private)); + pcmk__xe_set_int(xml, PCMK__XA_ATTR_IS_REMOTE, + pcmk__is_set(v->flags, attrd_value_remote)); + pcmk__xe_set_int(xml, PCMK__XA_ATTRD_IS_FORCE_WRITE, force_write); return xml; } @@ -187,7 +187,7 @@ attrd_populate_attribute(xmlNode *xml, const char *attr) attribute_t *a = NULL; bool update_both = false; - const char *op = crm_element_value(xml, PCMK_XA_TASK); + const char *op = pcmk__xe_get(xml, PCMK_XA_TASK); // NULL because PCMK__ATTRD_CMD_SYNC_RESPONSE has no PCMK_XA_TASK update_both = pcmk__str_eq(op, PCMK__ATTRD_CMD_UPDATE_BOTH, @@ -203,7 +203,7 @@ attrd_populate_attribute(xmlNode *xml, const char *attr) } } else { - crm_warn("Could not update %s: attribute not found", attr); + pcmk__warn("Could not update %s: attribute not found", attr); return NULL; } } @@ -243,7 +243,7 @@ attrd_set_id(const attribute_t *attr, const char *node_state_id) * not limited by the schema in any way, but it's still unfortunate. * For backward compatibility reasons, we can't change this. */ - set_id = crm_strdup_printf("%s-%s", PCMK_XE_STATUS, node_state_id); + set_id = pcmk__assert_asprintf("%s-%s", PCMK_XE_STATUS, node_state_id); } else { /* @COMPAT When the user specifies a set ID for an attribute, it is the * same for every node. That is less than ideal, but again, the schema @@ -273,11 +273,11 @@ attrd_nvpair_id(const attribute_t *attr, const char *node_state_id) char *nvpair_id = NULL; if (attr->set_id != NULL) { - nvpair_id = crm_strdup_printf("%s-%s", attr->set_id, attr->id); + nvpair_id = pcmk__assert_asprintf("%s-%s", attr->set_id, attr->id); } else { - nvpair_id = crm_strdup_printf(PCMK_XE_STATUS "-%s-%s", - node_state_id, attr->id); + nvpair_id = pcmk__assert_asprintf(PCMK_XE_STATUS "-%s-%s", + node_state_id, attr->id); } pcmk__xml_sanitize_id(nvpair_id); return nvpair_id; diff --git a/daemons/attrd/attrd_cib.c b/daemons/attrd/attrd_cib.c index 4231e4a668a..5a6d54300dd 100644 --- a/daemons/attrd/attrd_cib.c +++ b/daemons/attrd/attrd_cib.c @@ -1,5 +1,5 @@ /* - * Copyright 2013-2024 the Pacemaker project contributors + * Copyright 2013-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -35,11 +35,11 @@ attrd_cib_destroy_cb(gpointer user_data) cib->cmds->signoff(cib); if (attrd_shutting_down(false)) { - crm_info("Disconnected from the CIB manager"); + pcmk__info("Disconnected from the CIB manager"); } else { // @TODO This should trigger a reconnect, not a shutdown - crm_crit("Lost connection to the CIB manager, shutting down"); + pcmk__crit("Lost connection to the CIB manager, shutting down"); attrd_exit_status = CRM_EX_DISCONNECT; attrd_shutdown(0); } @@ -58,7 +58,7 @@ attrd_cib_updated_cb(const char *event, xmlNode *msg) if (pcmk__cib_element_in_patchset(patchset, PCMK_XE_ALERTS)) { if (attrd_shutting_down(true)) { - crm_debug("Ignoring alerts change in CIB during shutdown"); + pcmk__debug("Ignoring alerts change in CIB during shutdown"); } else { mainloop_set_trigger(attrd_config_read); } @@ -66,7 +66,7 @@ attrd_cib_updated_cb(const char *event, xmlNode *msg) status_changed = pcmk__cib_element_in_patchset(patchset, PCMK_XE_STATUS); - client_name = crm_element_value(msg, PCMK__XA_CIB_CLIENTNAME); + client_name = pcmk__xe_get(msg, PCMK__XA_CIB_CLIENTNAME); if (!cib__client_triggers_refresh(client_name)) { /* This change came from a source that ensured the CIB is consistent * with our attributes table, so we don't need to write anything out. @@ -83,7 +83,7 @@ attrd_cib_updated_cb(const char *event, xmlNode *msg) || pcmk__cib_element_in_patchset(patchset, PCMK_XE_NODES)) { if (attrd_shutting_down(true)) { - crm_debug("Ignoring node change in CIB during shutdown"); + pcmk__debug("Ignoring node change in CIB during shutdown"); return; } @@ -92,10 +92,10 @@ attrd_cib_updated_cb(const char *event, xmlNode *msg) * the CIB. */ if (client_name == NULL) { - client_name = crm_element_value(msg, PCMK__XA_CIB_CLIENTID); + client_name = pcmk__xe_get(msg, PCMK__XA_CIB_CLIENTID); } - crm_notice("Updating all attributes after %s event triggered by %s", - event, pcmk__s(client_name, "unidentified client")); + pcmk__notice("Updating all attributes after %s event triggered by %s", + event, pcmk__s(client_name, "unidentified client")); attrd_write_attributes(attrd_write_all); } @@ -118,22 +118,22 @@ attrd_cib_connect(int max_retry) sleep(attempts); } attempts++; - crm_debug("Connection attempt %d to the CIB manager", attempts); + pcmk__debug("Connection attempt %d to the CIB manager", attempts); rc = the_cib->cmds->signon(the_cib, crm_system_name, cib_command); } while ((rc != pcmk_ok) && (attempts < max_retry)); if (rc != pcmk_ok) { - crm_err("Connection to the CIB manager failed: %s " QB_XS " rc=%d", - pcmk_strerror(rc), rc); + pcmk__err("Connection to the CIB manager failed: %s " QB_XS " rc=%d", + pcmk_strerror(rc), rc); goto cleanup; } - crm_debug("Connected to the CIB manager after %d attempts", attempts); + pcmk__debug("Connected to the CIB manager after %d attempts", attempts); rc = the_cib->cmds->set_connection_dnotify(the_cib, attrd_cib_destroy_cb); if (rc != pcmk_ok) { - crm_err("Could not set disconnection callback"); + pcmk__err("Could not set disconnection callback"); goto cleanup; } @@ -141,7 +141,7 @@ attrd_cib_connect(int max_retry) PCMK__VALUE_CIB_DIFF_NOTIFY, attrd_cib_updated_cb); if (rc != pcmk_ok) { - crm_err("Could not set CIB notification callback"); + pcmk__err("Could not set CIB notification callback"); goto cleanup; } @@ -169,10 +169,11 @@ attrd_erase_cb(xmlNode *msg, int call_id, int rc, xmlNode *output, const char *node = pcmk__s((const char *) user_data, "a node"); if (rc == pcmk_ok) { - crm_info("Cleared transient node attributes for %s from CIB", node); + pcmk__info("Cleared transient node attributes for %s from CIB", node); } else { - crm_err("Unable to clear transient node attributes for %s from CIB: %s", - node, pcmk_strerror(rc)); + pcmk__err("Unable to clear transient node attributes for %s from CIB: " + "%s", + node, pcmk_strerror(rc)); } } @@ -194,10 +195,10 @@ attrd_cib_erase_transient_attrs(const char *node) CRM_CHECK(node != NULL, return); - xpath = crm_strdup_printf(XPATH_TRANSIENT, node); + xpath = pcmk__assert_asprintf(XPATH_TRANSIENT, node); - crm_debug("Clearing transient node attributes for %s from CIB using %s", - node, xpath); + pcmk__debug("Clearing transient node attributes for %s from CIB using %s", + node, xpath); call_id = the_cib->cmds->remove(the_cib, xpath, NULL, cib_xpath); free(xpath); @@ -238,7 +239,7 @@ static gboolean attribute_timer_cb(gpointer data) { attribute_t *a = data; - crm_trace("Dampen interval expired for %s", a->id); + pcmk__trace("Dampen interval expired for %s", a->id); attrd_write_or_elect_attribute(a); return FALSE; } @@ -255,7 +256,7 @@ attrd_cib_callback(xmlNode *msg, int call_id, int rc, xmlNode *output, void *use attribute_t *a = g_hash_table_lookup(attributes, name); if(a == NULL) { - crm_info("Attribute %s no longer exists", name); + pcmk__info("Attribute %s no longer exists", name); return; } @@ -290,8 +291,8 @@ attrd_cib_callback(xmlNode *msg, int call_id, int rc, xmlNode *output, void *use g_hash_table_iter_init(&iter, a->values); while (g_hash_table_iter_next(&iter, (gpointer *) & peer, (gpointer *) & v)) { if (rc == pcmk_ok) { - crm_info("* Wrote %s[%s]=%s", - a->id, peer, pcmk__s(v->requested, "(unset)")); + pcmk__info("* Wrote %s[%s]=%s", a->id, peer, + pcmk__s(v->requested, "(unset)")); pcmk__str_update(&(v->requested), NULL); } else { do_crm_log(level, "* Could not write %s[%s]=%s", @@ -301,12 +302,12 @@ attrd_cib_callback(xmlNode *msg, int call_id, int rc, xmlNode *output, void *use } } - if (pcmk_is_set(a->flags, attrd_attr_changed) && attrd_election_won()) { + if (pcmk__is_set(a->flags, attrd_attr_changed) && attrd_election_won()) { if (rc == pcmk_ok) { /* We deferred a write of a new update because this update was in * progress. Write out the new value without additional delay. */ - crm_debug("Pending update for %s can be written now", a->id); + pcmk__debug("Pending update for %s can be written now", a->id); write_attribute(a, false); /* We're re-attempting a write because the original failed; delay @@ -321,8 +322,8 @@ attrd_cib_callback(xmlNode *msg, int call_id, int rc, xmlNode *output, void *use } else if (a->timer) { // Attribute has a dampening value, so use that as delay if (!mainloop_timer_running(a->timer)) { - crm_trace("Delayed re-attempted write for %s by %s", - name, pcmk__readable_interval(a->timeout_ms)); + pcmk__trace("Delayed re-attempted write for %s by %s", + name, pcmk__readable_interval(a->timeout_ms)); mainloop_timer_start(a->timer); } } else { @@ -356,18 +357,18 @@ add_set_attr_update(const attribute_t *attr, const char *attr_id, xmlNode *child = update; int rc = ENOMEM; - crm_xml_add(child, PCMK_XA_ID, node_id); + pcmk__xe_set(child, PCMK_XA_ID, node_id); child = pcmk__xe_create(child, PCMK__XE_TRANSIENT_ATTRIBUTES); - crm_xml_add(child, PCMK_XA_ID, node_id); + pcmk__xe_set(child, PCMK_XA_ID, node_id); child = pcmk__xe_create(child, attr->set_type); - crm_xml_add(child, PCMK_XA_ID, set_id); + pcmk__xe_set(child, PCMK_XA_ID, set_id); child = pcmk__xe_create(child, PCMK_XE_NVPAIR); - crm_xml_add(child, PCMK_XA_ID, attr_id); - crm_xml_add(child, PCMK_XA_NAME, attr->id); - crm_xml_add(child, PCMK_XA_VALUE, value); + pcmk__xe_set(child, PCMK_XA_ID, attr_id); + pcmk__xe_set(child, PCMK_XA_NAME, attr->id); + pcmk__xe_set(child, PCMK_XA_VALUE, value); rc = the_cib->cmds->modify(the_cib, PCMK_XE_STATUS, update, cib_can_create|cib_transaction); @@ -392,18 +393,18 @@ static int add_unset_attr_update(const attribute_t *attr, const char *attr_id, const char *node_id, const char *set_id) { - char *xpath = crm_strdup_printf("/" PCMK_XE_CIB - "/" PCMK_XE_STATUS - "/" PCMK__XE_NODE_STATE - "[@" PCMK_XA_ID "='%s']" - "/" PCMK__XE_TRANSIENT_ATTRIBUTES - "[@" PCMK_XA_ID "='%s']" - "/%s[@" PCMK_XA_ID "='%s']" - "/" PCMK_XE_NVPAIR - "[@" PCMK_XA_ID "='%s' " - "and @" PCMK_XA_NAME "='%s']", - node_id, node_id, attr->set_type, set_id, - attr_id, attr->id); + char *xpath = pcmk__assert_asprintf("/" PCMK_XE_CIB + "/" PCMK_XE_STATUS + "/" PCMK__XE_NODE_STATE + "[@" PCMK_XA_ID "='%s']" + "/" PCMK__XE_TRANSIENT_ATTRIBUTES + "[@" PCMK_XA_ID "='%s']" + "/%s[@" PCMK_XA_ID "='%s']" + "/" PCMK_XE_NVPAIR + "[@" PCMK_XA_ID "='%s' " + "and @" PCMK_XA_NAME "='%s']", + node_id, node_id, attr->set_type, + set_id, attr_id, attr->id); int rc = the_cib->cmds->remove(the_cib, xpath, NULL, cib_xpath|cib_transaction); @@ -453,11 +454,11 @@ send_alert_attributes_value(attribute_t *a, GHashTable *t) rc = attrd_send_attribute_alert(at->nodename, node_xml_id, a->id, at->current); - crm_trace("Sent alerts for %s[%s]=%s with node XML ID %s " - "(%s agents failed)", - a->id, at->nodename, at->current, - pcmk__s(node_xml_id, "unknown"), - ((rc == 0)? "no" : ((rc == -1)? "some" : "all"))); + pcmk__trace("Sent alerts for %s[%s]=%s with node XML ID %s (%s agents " + "failed)", + a->id, at->nodename, at->current, + pcmk__s(node_xml_id, "unknown"), + ((rc == 0)? "no" : ((rc == -1)? "some" : "all"))); } } @@ -501,7 +502,7 @@ write_attribute(attribute_t *a, bool ignore_delay) } // Private attributes (or any in standalone mode) are not written to the CIB - if (stand_alone || pcmk_is_set(a->flags, attrd_attr_is_private)) { + if (stand_alone || pcmk__is_set(a->flags, attrd_attr_is_private)) { should_write = false; } @@ -509,21 +510,22 @@ write_attribute(attribute_t *a, bool ignore_delay) if (should_write) { /* Defer the write if now's not a good time */ if (a->update && (a->update < last_cib_op_done)) { - crm_info("Write out of '%s' continuing: update %d considered lost", - a->id, a->update); + pcmk__info("Write out of '%s' continuing: update %d considered " + "lost", + a->id, a->update); a->update = 0; // Don't log this message again } else if (a->update) { - crm_info("Write out of '%s' delayed: update %d in progress", - a->id, a->update); + pcmk__info("Write out of '%s' delayed: update %d in progress", + a->id, a->update); goto done; } else if (mainloop_timer_running(a->timer)) { if (ignore_delay) { mainloop_timer_stop(a->timer); - crm_debug("Overriding '%s' write delay", a->id); + pcmk__debug("Overriding '%s' write delay", a->id); } else { - crm_info("Delaying write of '%s'", a->id); + pcmk__info("Delaying write of '%s'", a->id); goto done; } } @@ -533,9 +535,9 @@ write_attribute(attribute_t *a, bool ignore_delay) the_cib->cmds->set_user(the_cib, a->user); rc = the_cib->cmds->init_transaction(the_cib); if (rc != pcmk_ok) { - crm_err("Failed to write %s (set %s): Could not initiate " - "CIB transaction", - a->id, pcmk__s(a->set_id, "unspecified")); + pcmk__err("Failed to write %s (set %s): Could not initiate " + "CIB transaction", + a->id, pcmk__s(a->set_id, "unspecified")); goto done; } } @@ -571,7 +573,7 @@ write_attribute(attribute_t *a, bool ignore_delay) prev_xml_id = attrd_get_node_xml_id(v->nodename); - if (pcmk_is_set(v->flags, attrd_value_remote)) { + if (pcmk__is_set(v->flags, attrd_value_remote)) { // A Pacemaker Remote node's XML ID is the same as its name node_xml_id = v->nodename; @@ -590,32 +592,32 @@ write_attribute(attribute_t *a, bool ignore_delay) // Defer write if this is a cluster node that's never been seen if (node_xml_id == NULL) { attrd_set_attr_flags(a, attrd_attr_node_unknown); - crm_notice("Cannot write %s[%s]='%s' to CIB because node's XML ID " - "is unknown (will retry if learned)", - a->id, v->nodename, v->current); + pcmk__notice("Cannot write %s[%s]='%s' to CIB because node's XML " + "ID is unknown (will retry if learned)", + a->id, v->nodename, v->current); continue; } if (!pcmk__str_eq(prev_xml_id, node_xml_id, pcmk__str_none)) { - crm_trace("Setting %s[%s] node XML ID to %s (was %s)", - a->id, v->nodename, node_xml_id, - pcmk__s(prev_xml_id, "unknown")); + pcmk__trace("Setting %s[%s] node XML ID to %s (was %s)", a->id, + v->nodename, node_xml_id, + pcmk__s(prev_xml_id, "unknown")); attrd_set_node_xml_id(v->nodename, node_xml_id); } // Update this value as part of the CIB transaction we're building rc = add_attr_update(a, v->current, node_xml_id); if (rc != pcmk_rc_ok) { - crm_err("Couldn't add %s[%s]='%s' to CIB transaction: %s " - QB_XS " node XML ID %s", - a->id, v->nodename, v->current, pcmk_rc_str(rc), - node_xml_id); + pcmk__err("Couldn't add %s[%s]='%s' to CIB transaction: %s " + QB_XS " node XML ID %s", + a->id, v->nodename, v->current, pcmk_rc_str(rc), + node_xml_id); continue; } - crm_debug("Added %s[%s]=%s to CIB transaction (node XML ID %s)", - a->id, v->nodename, pcmk__s(v->current, "(unset)"), - node_xml_id); + pcmk__debug("Added %s[%s]=%s to CIB transaction (node XML ID %s)", + a->id, v->nodename, pcmk__s(v->current, "(unset)"), + node_xml_id); cib_updates++; /* Preservation of the attribute to transmit alert */ @@ -626,9 +628,9 @@ write_attribute(attribute_t *a, bool ignore_delay) } if (private_updates) { - crm_info("Processed %d private change%s for %s (set %s)", - private_updates, pcmk__plural_s(private_updates), - a->id, pcmk__s(a->set_id, "unspecified")); + pcmk__info("Processed %d private change%s for %s (set %s)", + private_updates, pcmk__plural_s(private_updates), + a->id, pcmk__s(a->set_id, "unspecified")); } if (cib_updates > 0) { char *id = pcmk__str_copy(a->id); @@ -636,9 +638,9 @@ write_attribute(attribute_t *a, bool ignore_delay) // Commit transaction a->update = the_cib->cmds->end_transaction(the_cib, true, cib_none); - crm_info("Sent CIB request %d with %d change%s for %s (set %s)", - a->update, cib_updates, pcmk__plural_s(cib_updates), - a->id, pcmk__s(a->set_id, "unspecified")); + pcmk__info("Sent CIB request %d with %d change%s for %s (set %s)", + a->update, cib_updates, pcmk__plural_s(cib_updates), + a->id, pcmk__s(a->set_id, "unspecified")); if (the_cib->cmds->register_callback_full(the_cib, a->update, CIB_OP_TIMEOUT_S, FALSE, id, @@ -673,30 +675,31 @@ attrd_write_attributes(uint32_t options) GHashTableIter iter; attribute_t *a = NULL; - crm_debug("Writing out %s attributes", - pcmk_is_set(options, attrd_write_all)? "all" : "changed"); + pcmk__debug("Writing out %s attributes", + pcmk__is_set(options, attrd_write_all)? "all" : "changed"); g_hash_table_iter_init(&iter, attributes); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) & a)) { - if (!pcmk_is_set(options, attrd_write_all) - && pcmk_is_set(a->flags, attrd_attr_node_unknown)) { + if (!pcmk__is_set(options, attrd_write_all) + && pcmk__is_set(a->flags, attrd_attr_node_unknown)) { // Try writing this attribute again, in case peer ID was learned attrd_set_attr_flags(a, attrd_attr_changed); - } else if (pcmk_is_set(a->flags, attrd_attr_force_write)) { + } else if (pcmk__is_set(a->flags, attrd_attr_force_write)) { /* If the force_write flag is set, write the attribute. */ attrd_set_attr_flags(a, attrd_attr_changed); } - if (pcmk_is_set(options, attrd_write_all) || - pcmk_is_set(a->flags, attrd_attr_changed)) { - bool ignore_delay = pcmk_is_set(options, attrd_write_no_delay); + if (pcmk__is_set(options, attrd_write_all) + || pcmk__is_set(a->flags, attrd_attr_changed)) { + + bool ignore_delay = pcmk__is_set(options, attrd_write_no_delay); - if (pcmk_is_set(a->flags, attrd_attr_force_write)) { + if (pcmk__is_set(a->flags, attrd_attr_force_write)) { // Always ignore delay when forced write flag is set ignore_delay = true; } write_attribute(a, ignore_delay); } else { - crm_trace("Skipping unchanged attribute %s", a->id); + pcmk__trace("Skipping unchanged attribute %s", a->id); } } } diff --git a/daemons/attrd/attrd_corosync.c b/daemons/attrd/attrd_corosync.c index e97e09cb865..25f297b79ab 100644 --- a/daemons/attrd/attrd_corosync.c +++ b/daemons/attrd/attrd_corosync.c @@ -1,5 +1,5 @@ /* - * Copyright 2013-2024 the Pacemaker project contributors + * Copyright 2013-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -28,10 +28,10 @@ attrd_confirmation(int callid) { xmlNode *node = pcmk__xe_create(NULL, __func__); - crm_xml_add(node, PCMK__XA_T, PCMK__VALUE_ATTRD); - crm_xml_add(node, PCMK__XA_SRC, pcmk__cluster_local_node_name()); - crm_xml_add(node, PCMK_XA_TASK, PCMK__ATTRD_CMD_CONFIRM); - crm_xml_add_int(node, PCMK__XA_CALL_ID, callid); + pcmk__xe_set(node, PCMK__XA_T, PCMK__VALUE_ATTRD); + pcmk__xe_set(node, PCMK__XA_SRC, pcmk__cluster_local_node_name()); + pcmk__xe_set(node, PCMK_XA_TASK, PCMK__ATTRD_CMD_CONFIRM); + pcmk__xe_set_int(node, PCMK__XA_CALL_ID, callid); return node; } @@ -39,7 +39,7 @@ attrd_confirmation(int callid) static void attrd_peer_message(pcmk__node_status_t *peer, xmlNode *xml) { - const char *election_op = crm_element_value(xml, PCMK__XA_CRM_TASK); + const char *election_op = pcmk__xe_get(xml, PCMK__XA_CRM_TASK); if (election_op) { attrd_handle_election_op(peer, xml); @@ -64,7 +64,7 @@ attrd_peer_message(pcmk__node_status_t *peer, xmlNode *xml) .result = PCMK__UNKNOWN_RESULT, }; - request.op = crm_element_value_copy(request.xml, PCMK_XA_TASK); + request.op = pcmk__xe_get_copy(request.xml, PCMK_XA_TASK); CRM_CHECK(request.op != NULL, return); attrd_handle_request(&request); @@ -81,7 +81,7 @@ attrd_peer_message(pcmk__node_status_t *peer, xmlNode *xml) * response so the originating peer knows what they're a confirmation * for. */ - crm_element_value_int(xml, PCMK__XA_CALL_ID, &callid); + pcmk__xe_get_int(xml, PCMK__XA_CALL_ID, &callid); reply = attrd_confirmation(callid); /* And then send the confirmation back to the originating peer. This @@ -89,7 +89,7 @@ attrd_peer_message(pcmk__node_status_t *peer, xmlNode *xml) * peer where it will have to do something with a PCMK__XA_CONFIRM type * message. */ - crm_debug("Sending %s a confirmation", peer->name); + pcmk__debug("Sending %s a confirmation", peer->name); attrd_send_message(peer, reply, false); pcmk__xml_free(reply); } @@ -114,8 +114,8 @@ attrd_cpg_dispatch(cpg_handle_t handle, xml = pcmk__xml_parse(data); if (xml == NULL) { - crm_err("Bad message received from %s[%u]: '%.120s'", - from, nodeid, data); + pcmk__err("Bad message received from %s[%u]: '%.120s'", from, nodeid, + data); } else { attrd_peer_message(pcmk__get_node(nodeid, from, NULL, pcmk__node_search_cluster_member), @@ -130,10 +130,10 @@ static void attrd_cpg_destroy(gpointer unused) { if (attrd_shutting_down(false)) { - crm_info("Disconnected from Corosync process group"); + pcmk__info("Disconnected from Corosync process group"); } else { - crm_crit("Lost connection to Corosync process group, shutting down"); + pcmk__crit("Lost connection to Corosync process group, shutting down"); attrd_exit_status = CRM_EX_DISCONNECT; attrd_shutdown(0); } @@ -151,7 +151,7 @@ attrd_broadcast_value(const attribute_t *a, const attribute_value_t *v) { xmlNode *op = pcmk__xe_create(NULL, PCMK_XE_OP); - crm_xml_add(op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); + pcmk__xe_set(op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); attrd_add_value_xml(op, a, v, false); attrd_send_message(NULL, op, false); pcmk__xml_free(op); @@ -164,33 +164,33 @@ attrd_peer_change_cb(enum pcmk__node_update kind, pcmk__node_status_t *peer, const void *data) { bool gone = false; - bool is_remote = pcmk_is_set(peer->flags, pcmk__node_status_remote); + bool is_remote = pcmk__is_set(peer->flags, pcmk__node_status_remote); switch (kind) { case pcmk__node_update_name: - crm_debug("%s node %s is now %s", - (is_remote? "Remote" : "Cluster"), - peer->name, state_text(peer->state)); + pcmk__debug("%s node %s is now %s", + (is_remote? "Remote" : "Cluster"), + peer->name, state_text(peer->state)); break; case pcmk__node_update_processes: - if (!pcmk_is_set(peer->processes, crm_get_cluster_proc())) { + if (!pcmk__is_set(peer->processes, crm_get_cluster_proc())) { gone = true; } - crm_debug("Node %s is %s a peer", - peer->name, (gone? "no longer" : "now")); + pcmk__debug("Node %s is %s a peer", peer->name, + (gone? "no longer" : "now")); break; case pcmk__node_update_state: - crm_debug("%s node %s is now %s (was %s)", - (is_remote? "Remote" : "Cluster"), - peer->name, state_text(peer->state), state_text(data)); + pcmk__debug("%s node %s is now %s (was %s)", + (is_remote? "Remote" : "Cluster"), + peer->name, state_text(peer->state), state_text(data)); if (pcmk__str_eq(peer->state, PCMK_VALUE_MEMBER, pcmk__str_none)) { /* If we're the writer, send new peers a list of all attributes * (unless it's a remote node, which doesn't run its own attrd) */ if (attrd_election_won() - && !pcmk_is_set(peer->flags, pcmk__node_status_remote)) { + && !pcmk__is_set(peer->flags, pcmk__node_status_remote)) { attrd_peer_sync(peer); } } else { @@ -223,7 +223,7 @@ update_attr_on_host(attribute_t *a, const pcmk__node_status_t *peer, bool changed = false; attribute_value_t *v = NULL; const char *prev_xml_id = NULL; - const char *node_xml_id = crm_element_value(xml, PCMK__XA_ATTR_HOST_ID); + const char *node_xml_id = pcmk__xe_get(xml, PCMK__XA_ATTR_HOST_ID); // Create entry for value if not already existing v = g_hash_table_lookup(a->values, host); @@ -243,7 +243,7 @@ update_attr_on_host(attribute_t *a, const pcmk__node_status_t *peer, } // If value is for a Pacemaker Remote node, remember that - crm_element_value_int(xml, PCMK__XA_ATTR_IS_REMOTE, &is_remote); + pcmk__xe_get_int(xml, PCMK__XA_ATTR_IS_REMOTE, &is_remote); if (is_remote) { attrd_set_value_flags(v, attrd_value_remote); pcmk__assert(pcmk__cluster_lookup_remote_node(host) != NULL); @@ -261,18 +261,24 @@ update_attr_on_host(attribute_t *a, const pcmk__node_status_t *peer, * kept in sync. */ v = g_hash_table_lookup(a->values, attrd_cluster->priv->node_name); - crm_notice("%s[%s]: local value '%s' takes priority over '%s' from %s", - attr, host, readable_value(v), value, peer->name); + pcmk__notice("%s[%s]: local value '%s' takes priority over '%s' from " + "%s", + attr, host, readable_value(v), value, peer->name); attrd_broadcast_value(a, v); } else if (changed) { - crm_notice("Setting %s[%s]%s%s: %s -> %s " - QB_XS " from %s with %s write delay and node XML ID %s", - attr, host, a->set_type ? " in " : "", - pcmk__s(a->set_type, ""), readable_value(v), - pcmk__s(value, "(unset)"), peer->name, - (a->timeout_ms == 0)? "no" : pcmk__readable_interval(a->timeout_ms), - pcmk__s(node_xml_id, "unknown")); + const char *timeout_s = "no"; + + if (a->timeout_ms != 0) { + timeout_s = pcmk__readable_interval(a->timeout_ms); + } + + pcmk__notice("Setting %s[%s]%s%s: %s -> %s " + QB_XS " from %s with %s write delay and node XML ID %s", + attr, host, ((a->set_type != NULL)? " in " : ""), + pcmk__s(a->set_type, ""), readable_value(v), + pcmk__s(value, "(unset)"), peer->name, timeout_s, + pcmk__s(node_xml_id, "unknown")); pcmk__str_update(&v->current, value); attrd_set_attr_flags(a, attrd_attr_changed); @@ -289,8 +295,8 @@ update_attr_on_host(attribute_t *a, const pcmk__node_status_t *peer, // Write out new value or start dampening timer if (a->timeout_ms && a->timer) { - crm_trace("Delaying write of %s %s for dampening", - attr, pcmk__readable_interval(a->timeout_ms)); + pcmk__trace("Delaying write of %s %s for dampening", attr, + pcmk__readable_interval(a->timeout_ms)); mainloop_timer_start(a->timer); } else { attrd_write_or_elect_attribute(a); @@ -299,18 +305,17 @@ update_attr_on_host(attribute_t *a, const pcmk__node_status_t *peer, } else { int is_force_write = 0; - crm_element_value_int(xml, PCMK__XA_ATTRD_IS_FORCE_WRITE, - &is_force_write); + pcmk__xe_get_int(xml, PCMK__XA_ATTRD_IS_FORCE_WRITE, &is_force_write); if (is_force_write == 1 && a->timeout_ms && a->timer) { /* Save forced writing and set change flag. */ /* The actual attribute is written by Writer after election. */ - crm_trace("%s[%s] from %s is unchanged (%s), forcing write", - attr, host, peer->name, pcmk__s(value, "unset")); + pcmk__trace("%s[%s] from %s is unchanged (%s), forcing write", attr, + host, peer->name, pcmk__s(value, "unset")); attrd_set_attr_flags(a, attrd_attr_force_write); } else { - crm_trace("%s[%s] from %s is unchanged (%s)", - attr, host, peer->name, pcmk__s(value, "unset")); + pcmk__trace("%s[%s] from %s is unchanged (%s)", attr, host, + peer->name, pcmk__s(value, "unset")); } } @@ -320,9 +325,8 @@ update_attr_on_host(attribute_t *a, const pcmk__node_status_t *peer, // Remember node's XML ID if we're just learning it if ((node_xml_id != NULL) && !pcmk__str_eq(node_xml_id, prev_xml_id, pcmk__str_none)) { - crm_trace("Learned %s[%s] node XML ID is %s (was %s)", - a->id, v->nodename, node_xml_id, - pcmk__s(prev_xml_id, "unknown")); + pcmk__trace("Learned %s[%s] node XML ID is %s (was %s)", a->id, + v->nodename, node_xml_id, pcmk__s(prev_xml_id, "unknown")); attrd_set_node_xml_id(v->nodename, node_xml_id); if (attrd_election_won()) { // In case we couldn't write a value missing the XML ID before @@ -336,12 +340,12 @@ attrd_peer_update_one(const pcmk__node_status_t *peer, xmlNode *xml, bool filter) { attribute_t *a = NULL; - const char *attr = crm_element_value(xml, PCMK__XA_ATTR_NAME); - const char *value = crm_element_value(xml, PCMK__XA_ATTR_VALUE); - const char *host = crm_element_value(xml, PCMK__XA_ATTR_HOST); + const char *attr = pcmk__xe_get(xml, PCMK__XA_ATTR_NAME); + const char *value = pcmk__xe_get(xml, PCMK__XA_ATTR_VALUE); + const char *host = pcmk__xe_get(xml, PCMK__XA_ATTR_HOST); if (attr == NULL) { - crm_warn("Could not update attribute: peer did not specify name"); + pcmk__warn("Could not update attribute: peer did not specify name"); return; } @@ -354,7 +358,7 @@ attrd_peer_update_one(const pcmk__node_status_t *peer, xmlNode *xml, // If no host was specified, update all hosts GHashTableIter vIter; - crm_debug("Setting %s for all hosts to %s", attr, value); + pcmk__debug("Setting %s for all hosts to %s", attr, value); pcmk__xe_remove_attr(xml, PCMK__XA_ATTR_HOST_ID); g_hash_table_iter_init(&vIter, a->values); @@ -390,14 +394,15 @@ broadcast_unseen_local_values(void) g_hash_table_iter_init(&vIter, a->values); while (g_hash_table_iter_next(&vIter, NULL, (gpointer *) & v)) { - if (!pcmk_is_set(v->flags, attrd_value_from_peer) + if (!pcmk__is_set(v->flags, attrd_value_from_peer) && pcmk__str_eq(v->nodename, attrd_cluster->priv->node_name, pcmk__str_casei)) { - crm_trace("* %s[%s]='%s' is local-only", - a->id, v->nodename, readable_value(v)); + pcmk__trace("* %s[%s]='%s' is local-only", a->id, v->nodename, + readable_value(v)); if (sync == NULL) { sync = pcmk__xe_create(NULL, __func__); - crm_xml_add(sync, PCMK_XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE); + pcmk__xe_set(sync, PCMK_XA_TASK, + PCMK__ATTRD_CMD_SYNC_RESPONSE); } attrd_add_value_xml(sync, a, v, a->timeout_ms && a->timer); } @@ -405,7 +410,7 @@ broadcast_unseen_local_values(void) } if (sync != NULL) { - crm_debug("Broadcasting local-only values"); + pcmk__debug("Broadcasting local-only values"); attrd_send_message(NULL, sync, false); pcmk__xml_free(sync); } @@ -427,7 +432,7 @@ attrd_cluster_connect(void) rc = pcmk_cluster_connect(attrd_cluster); rc = pcmk_rc2legacy(rc); if (rc != pcmk_ok) { - crm_err("Cluster connection failed"); + pcmk__err("Cluster connection failed"); return rc; } return pcmk_ok; @@ -437,11 +442,10 @@ void attrd_peer_clear_failure(pcmk__request_t *request) { xmlNode *xml = request->xml; - const char *rsc = crm_element_value(xml, PCMK__XA_ATTR_RESOURCE); - const char *host = crm_element_value(xml, PCMK__XA_ATTR_HOST); - const char *op = crm_element_value(xml, PCMK__XA_ATTR_CLEAR_OPERATION); - const char *interval_spec = crm_element_value(xml, - PCMK__XA_ATTR_CLEAR_INTERVAL); + const char *rsc = pcmk__xe_get(xml, PCMK__XA_ATTR_RESOURCE); + const char *host = pcmk__xe_get(xml, PCMK__XA_ATTR_HOST); + const char *op = pcmk__xe_get(xml, PCMK__XA_ATTR_CLEAR_OPERATION); + const char *interval_spec = pcmk__xe_get(xml, PCMK__XA_ATTR_CLEAR_INTERVAL); guint interval_ms = 0U; char *attr = NULL; GHashTableIter iter; @@ -454,12 +458,12 @@ attrd_peer_clear_failure(pcmk__request_t *request) pcmk_parse_interval_spec(interval_spec, &interval_ms); if (attrd_failure_regex(®ex, rsc, op, interval_ms) != pcmk_ok) { - crm_info("Ignoring invalid request to clear failures for %s", - pcmk__s(rsc, "all resources")); + pcmk__info("Ignoring invalid request to clear failures for %s", + pcmk__s(rsc, "all resources")); return; } - crm_xml_add(xml, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); + pcmk__xe_set(xml, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); /* Make sure value is not set, so we delete */ pcmk__xe_remove_attr(xml, PCMK__XA_ATTR_VALUE); @@ -467,9 +471,9 @@ attrd_peer_clear_failure(pcmk__request_t *request) g_hash_table_iter_init(&iter, attributes); while (g_hash_table_iter_next(&iter, (gpointer *) &attr, NULL)) { if (regexec(®ex, attr, 0, NULL, 0) == 0) { - crm_trace("Matched %s when clearing %s", - attr, pcmk__s(rsc, "all resources")); - crm_xml_add(xml, PCMK__XA_ATTR_NAME, attr); + pcmk__trace("Matched %s when clearing %s", attr, + pcmk__s(rsc, "all resources")); + pcmk__xe_set(xml, PCMK__XA_ATTR_NAME, attr); attrd_peer_update(peer, xml, host, false); } } @@ -488,8 +492,8 @@ void attrd_peer_sync_response(const pcmk__node_status_t *peer, bool peer_won, xmlNode *xml) { - crm_info("Processing " PCMK__ATTRD_CMD_SYNC_RESPONSE " from %s", - peer->name); + pcmk__info("Processing " PCMK__ATTRD_CMD_SYNC_RESPONSE " from %s", + peer->name); if (peer_won) { /* Initialize the "seen" flag for all attributes to cleared, so we can @@ -502,8 +506,8 @@ attrd_peer_sync_response(const pcmk__node_status_t *peer, bool peer_won, for (xmlNode *child = pcmk__xe_first_child(xml, NULL, NULL, NULL); child != NULL; child = pcmk__xe_next(child, NULL)) { - attrd_peer_update(peer, child, - crm_element_value(child, PCMK__XA_ATTR_HOST), true); + attrd_peer_update(peer, child, pcmk__xe_get(child, PCMK__XA_ATTR_HOST), + true); } if (peer_won) { @@ -529,14 +533,14 @@ attrd_peer_remove(const char *host, bool uncache, const char *source) GHashTableIter aIter; CRM_CHECK(host != NULL, return); - crm_notice("Removing all %s attributes for node %s " - QB_XS " %s reaping node from cache", - host, source, (uncache? "and" : "without")); + pcmk__notice("Removing all %s attributes for node %s " + QB_XS " %s reaping node from cache", + host, source, (uncache? "and" : "without")); g_hash_table_iter_init(&aIter, attributes); while (g_hash_table_iter_next(&aIter, NULL, (gpointer *) & a)) { if(g_hash_table_remove(a->values, host)) { - crm_debug("Removed %s[%s] for peer %s", a->id, host, source); + pcmk__debug("Removed %s[%s] for peer %s", a->id, host, source); } } @@ -562,20 +566,19 @@ attrd_peer_sync(pcmk__node_status_t *peer) attribute_value_t *v = NULL; xmlNode *sync = pcmk__xe_create(NULL, __func__); - crm_xml_add(sync, PCMK_XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE); + pcmk__xe_set(sync, PCMK_XA_TASK, PCMK__ATTRD_CMD_SYNC_RESPONSE); g_hash_table_iter_init(&aIter, attributes); while (g_hash_table_iter_next(&aIter, NULL, (gpointer *) & a)) { g_hash_table_iter_init(&vIter, a->values); while (g_hash_table_iter_next(&vIter, NULL, (gpointer *) & v)) { - crm_debug("Syncing %s[%s]='%s' to %s", - a->id, v->nodename, readable_value(v), - readable_peer(peer)); + pcmk__debug("Syncing %s[%s]='%s' to %s", a->id, v->nodename, + readable_value(v), readable_peer(peer)); attrd_add_value_xml(sync, a, v, false); } } - crm_debug("Syncing values to %s", readable_peer(peer)); + pcmk__debug("Syncing values to %s", readable_peer(peer)); attrd_send_message(peer, sync, false); pcmk__xml_free(sync); } @@ -611,7 +614,7 @@ attrd_peer_update(const pcmk__node_status_t *peer, xmlNode *xml, * point, process that now. */ if (handle_sync_point) { - crm_trace("Hit local sync point for attribute update"); + pcmk__trace("Hit local sync point for attribute update"); attrd_ack_waitlist_clients(attrd_sync_point_local, xml); } } diff --git a/daemons/attrd/attrd_elections.c b/daemons/attrd/attrd_elections.c index 281ec12c2fd..0b21ac73487 100644 --- a/daemons/attrd/attrd_elections.c +++ b/daemons/attrd/attrd_elections.c @@ -1,5 +1,5 @@ /* - * Copyright 2013-2024 the Pacemaker project contributors + * Copyright 2013-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -43,7 +43,7 @@ attrd_start_election_if_needed(void) && (election_state(attrd_cluster) != election_in_progress) && !attrd_shutting_down(false)) { - crm_info("Starting an election to determine the writer"); + pcmk__info("Starting an election to determine the writer"); election_vote(attrd_cluster); } } @@ -60,15 +60,15 @@ attrd_handle_election_op(const pcmk__node_status_t *peer, xmlNode *xml) enum election_result rc = 0; enum election_result previous = election_state(attrd_cluster); - crm_xml_add(xml, PCMK__XA_SRC, peer->name); + pcmk__xe_set(xml, PCMK__XA_SRC, peer->name); // Don't become writer if we're shutting down rc = election_count_vote(attrd_cluster, xml, !attrd_shutting_down(false)); switch(rc) { case election_start: - crm_debug("Unsetting writer (was %s) and starting new election", - peer_writer? peer_writer : "unset"); + pcmk__debug("Unsetting writer (was %s) and starting new election", + pcmk__s(peer_writer, "unset")); free(peer_writer); peer_writer = NULL; election_vote(attrd_cluster); @@ -88,8 +88,8 @@ attrd_handle_election_op(const pcmk__node_status_t *peer, xmlNode *xml) */ if ((peer_writer == NULL) || (previous != election_lost)) { pcmk__str_update(&peer_writer, peer->name); - crm_debug("Election lost, presuming %s is writer for now", - peer_writer); + pcmk__debug("Election lost, presuming %s is writer for now", + peer_writer); } break; @@ -98,7 +98,7 @@ attrd_handle_election_op(const pcmk__node_status_t *peer, xmlNode *xml) break; default: - crm_info("Ignoring election op from %s due to error", peer->name); + pcmk__info("Ignoring election op from %s due to error", peer->name); break; } } @@ -108,19 +108,19 @@ attrd_check_for_new_writer(const pcmk__node_status_t *peer, const xmlNode *xml) { int peer_state = 0; - crm_element_value_int(xml, PCMK__XA_ATTR_WRITER, &peer_state); + pcmk__xe_get_int(xml, PCMK__XA_ATTR_WRITER, &peer_state); if (peer_state == election_won) { if ((election_state(attrd_cluster) == election_won) && !pcmk__str_eq(peer->name, attrd_cluster->priv->node_name, pcmk__str_casei)) { - crm_notice("Detected another attribute writer (%s), starting new " - "election", - peer->name); + pcmk__notice("Detected another attribute writer (%s), starting new " + "election", + peer->name); election_vote(attrd_cluster); } else if (!pcmk__str_eq(peer->name, peer_writer, pcmk__str_casei)) { - crm_notice("Recorded new attribute writer: %s (was %s)", - peer->name, pcmk__s(peer_writer, "unset")); + pcmk__notice("Recorded new attribute writer: %s (was %s)", + peer->name, pcmk__s(peer_writer, "unset")); pcmk__str_update(&peer_writer, peer->name); } } @@ -130,8 +130,8 @@ attrd_check_for_new_writer(const pcmk__node_status_t *peer, const xmlNode *xml) void attrd_declare_winner(void) { - crm_notice("Recorded local node as attribute writer (was %s)", - (peer_writer? peer_writer : "unset")); + pcmk__notice("Recorded local node as attribute writer (was %s)", + pcmk__s(peer_writer, "unset")); pcmk__str_update(&peer_writer, attrd_cluster->priv->node_name); } @@ -144,7 +144,7 @@ attrd_remove_voter(const pcmk__node_status_t *peer) free(peer_writer); peer_writer = NULL; - crm_notice("Lost attribute writer %s", peer->name); + pcmk__notice("Lost attribute writer %s", peer->name); /* Clear any election dampening in effect. Otherwise, if the lost writer * had just won, the election could fizzle out with no new writer. @@ -164,7 +164,8 @@ attrd_remove_voter(const pcmk__node_status_t *peer) * would be pending until it's timed out. */ } else if (election_state(attrd_cluster) == election_in_progress) { - crm_debug("Checking election status upon loss of voter %s", peer->name); + pcmk__debug("Checking election status upon loss of voter %s", + peer->name); election_check(attrd_cluster); } } @@ -172,5 +173,5 @@ attrd_remove_voter(const pcmk__node_status_t *peer) void attrd_xml_add_writer(xmlNode *xml) { - crm_xml_add_int(xml, PCMK__XA_ATTR_WRITER, election_state(attrd_cluster)); + pcmk__xe_set_int(xml, PCMK__XA_ATTR_WRITER, election_state(attrd_cluster)); } diff --git a/daemons/attrd/attrd_ipc.c b/daemons/attrd/attrd_ipc.c index 07fe84399ad..29b0ffff018 100644 --- a/daemons/attrd/attrd_ipc.c +++ b/daemons/attrd/attrd_ipc.c @@ -44,9 +44,9 @@ static xmlNode *build_query_reply(const char *attr, const char *host) xmlNode *reply = pcmk__xe_create(NULL, __func__); attribute_t *a; - crm_xml_add(reply, PCMK__XA_T, PCMK__VALUE_ATTRD); - crm_xml_add(reply, PCMK__XA_SUBT, PCMK__ATTRD_CMD_QUERY); - crm_xml_add(reply, PCMK__XA_ATTR_VERSION, ATTRD_PROTOCOL_VERSION); + pcmk__xe_set(reply, PCMK__XA_T, PCMK__VALUE_ATTRD); + pcmk__xe_set(reply, PCMK__XA_SUBT, PCMK__ATTRD_CMD_QUERY); + pcmk__xe_set(reply, PCMK__XA_ATTR_VERSION, ATTRD_PROTOCOL_VERSION); /* If desired attribute exists, add its value(s) to the reply */ a = g_hash_table_lookup(attributes, attr); @@ -54,21 +54,21 @@ static xmlNode *build_query_reply(const char *attr, const char *host) attribute_value_t *v; xmlNode *host_value; - crm_xml_add(reply, PCMK__XA_ATTR_NAME, attr); + pcmk__xe_set(reply, PCMK__XA_ATTR_NAME, attr); /* Allow caller to use "localhost" to refer to local node */ if (pcmk__str_eq(host, "localhost", pcmk__str_casei)) { host = attrd_cluster->priv->node_name; - crm_trace("Mapped localhost to %s", host); + pcmk__trace("Mapped localhost to %s", host); } /* If a specific node was requested, add its value */ if (host) { v = g_hash_table_lookup(a->values, host); host_value = pcmk__xe_create(reply, PCMK_XE_NODE); - crm_xml_add(host_value, PCMK__XA_ATTR_HOST, host); - crm_xml_add(host_value, PCMK__XA_ATTR_VALUE, - (v? v->current : NULL)); + pcmk__xe_set(host_value, PCMK__XA_ATTR_HOST, host); + pcmk__xe_set(host_value, PCMK__XA_ATTR_VALUE, + ((v != NULL)? v->current : NULL)); /* Otherwise, add all nodes' values */ } else { @@ -77,8 +77,8 @@ static xmlNode *build_query_reply(const char *attr, const char *host) g_hash_table_iter_init(&iter, a->values); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &v)) { host_value = pcmk__xe_create(reply, PCMK_XE_NODE); - crm_xml_add(host_value, PCMK__XA_ATTR_HOST, v->nodename); - crm_xml_add(host_value, PCMK__XA_ATTR_VALUE, v->current); + pcmk__xe_set(host_value, PCMK__XA_ATTR_HOST, v->nodename); + pcmk__xe_set(host_value, PCMK__XA_ATTR_VALUE, v->current); } } } @@ -100,12 +100,12 @@ attrd_client_clear_failure(pcmk__request_t *request) return NULL; } - rsc = crm_element_value(xml, PCMK__XA_ATTR_RESOURCE); - op = crm_element_value(xml, PCMK__XA_ATTR_CLEAR_OPERATION); - interval_spec = crm_element_value(xml, PCMK__XA_ATTR_CLEAR_INTERVAL); + rsc = pcmk__xe_get(xml, PCMK__XA_ATTR_RESOURCE); + op = pcmk__xe_get(xml, PCMK__XA_ATTR_CLEAR_OPERATION); + interval_spec = pcmk__xe_get(xml, PCMK__XA_ATTR_CLEAR_INTERVAL); /* Map this to an update */ - crm_xml_add(xml, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); + pcmk__xe_set(xml, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); /* Add regular expression matching desired attributes */ @@ -113,21 +113,21 @@ attrd_client_clear_failure(pcmk__request_t *request) char *pattern; if (op == NULL) { - pattern = crm_strdup_printf(ATTRD_RE_CLEAR_ONE, rsc); + pattern = pcmk__assert_asprintf(ATTRD_RE_CLEAR_ONE, rsc); } else { guint interval_ms = 0U; pcmk_parse_interval_spec(interval_spec, &interval_ms); - pattern = crm_strdup_printf(ATTRD_RE_CLEAR_OP, - rsc, op, interval_ms); + pattern = pcmk__assert_asprintf(ATTRD_RE_CLEAR_OP, rsc, op, + interval_ms); } - crm_xml_add(xml, PCMK__XA_ATTR_REGEX, pattern); + pcmk__xe_set(xml, PCMK__XA_ATTR_REGEX, pattern); free(pattern); } else { - crm_xml_add(xml, PCMK__XA_ATTR_REGEX, ATTRD_RE_CLEAR_ALL); + pcmk__xe_set(xml, PCMK__XA_ATTR_REGEX, ATTRD_RE_CLEAR_ALL); } /* Make sure attribute and value are not set, so we delete via regex */ @@ -143,7 +143,7 @@ attrd_client_peer_remove(pcmk__request_t *request) xmlNode *xml = request->xml; // Host and ID are not used in combination, rather host has precedence - const char *host = crm_element_value(xml, PCMK__XA_ATTR_HOST); + const char *host = pcmk__xe_get(xml, PCMK__XA_ATTR_HOST); char *host_alloc = NULL; attrd_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags); @@ -151,7 +151,7 @@ attrd_client_peer_remove(pcmk__request_t *request) if (host == NULL) { int nodeid = 0; - crm_element_value_int(xml, PCMK__XA_ATTR_HOST_ID, &nodeid); + pcmk__xe_get_int(xml, PCMK__XA_ATTR_HOST_ID, &nodeid); if (nodeid > 0) { pcmk__node_status_t *node = NULL; char *host_alloc = NULL; @@ -166,18 +166,19 @@ attrd_client_peer_remove(pcmk__request_t *request) host_alloc = pcmk__cluster_node_name(nodeid); host = host_alloc; } - crm_xml_add(xml, PCMK__XA_ATTR_HOST, host); + pcmk__xe_set(xml, PCMK__XA_ATTR_HOST, host); } } if (host) { - crm_info("Client %s is requesting all values for %s be removed", - pcmk__client_name(request->ipc_client), host); + pcmk__info("Client %s is requesting all values for %s be removed", + pcmk__client_name(request->ipc_client), host); attrd_send_message(NULL, xml, false); /* ends up at attrd_peer_message() */ free(host_alloc); } else { - crm_info("Ignoring request by client %s to remove all peer values without specifying peer", - pcmk__client_name(request->ipc_client)); + pcmk__info("Ignoring request by client %s to remove all peer values " + "without specifying peer", + pcmk__client_name(request->ipc_client)); } pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); @@ -191,10 +192,11 @@ attrd_client_query(pcmk__request_t *request) xmlNode *reply = NULL; const char *attr = NULL; - crm_debug("Query arrived from %s", pcmk__client_name(request->ipc_client)); + pcmk__debug("Query arrived from %s", + pcmk__client_name(request->ipc_client)); /* Request must specify attribute name to query */ - attr = crm_element_value(query, PCMK__XA_ATTR_NAME); + attr = pcmk__xe_get(query, PCMK__XA_ATTR_NAME); if (attr == NULL) { pcmk__format_result(&request->result, CRM_EX_ERROR, PCMK_EXEC_ERROR, "Ignoring malformed query from %s (no attribute name given)", @@ -203,8 +205,7 @@ attrd_client_query(pcmk__request_t *request) } /* Build the XML reply */ - reply = build_query_reply(attr, - crm_element_value(query, PCMK__XA_ATTR_HOST)); + reply = build_query_reply(attr, pcmk__xe_get(query, PCMK__XA_ATTR_HOST)); if (reply == NULL) { pcmk__format_result(&request->result, CRM_EX_ERROR, PCMK_EXEC_ERROR, "Could not respond to query from %s: could not create XML reply", @@ -221,7 +222,7 @@ attrd_client_query(pcmk__request_t *request) xmlNode * attrd_client_refresh(pcmk__request_t *request) { - crm_info("Updating all attributes"); + pcmk__info("Updating all attributes"); attrd_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags); attrd_write_attributes(attrd_write_all|attrd_write_no_delay); @@ -233,13 +234,13 @@ attrd_client_refresh(pcmk__request_t *request) static void handle_missing_host(xmlNode *xml) { - if (crm_element_value(xml, PCMK__XA_ATTR_HOST) == NULL) { - crm_trace("Inferring local node %s with XML ID %s", - attrd_cluster->priv->node_name, - attrd_cluster->priv->node_xml_id); - crm_xml_add(xml, PCMK__XA_ATTR_HOST, attrd_cluster->priv->node_name); - crm_xml_add(xml, PCMK__XA_ATTR_HOST_ID, + if (pcmk__xe_get(xml, PCMK__XA_ATTR_HOST) == NULL) { + pcmk__trace("Inferring local node %s with XML ID %s", + attrd_cluster->priv->node_name, attrd_cluster->priv->node_xml_id); + pcmk__xe_set(xml, PCMK__XA_ATTR_HOST, attrd_cluster->priv->node_name); + pcmk__xe_set(xml, PCMK__XA_ATTR_HOST_ID, + attrd_cluster->priv->node_xml_id); } } @@ -254,7 +255,7 @@ expand_regexes(xmlNode *xml, const char *attr, const char *value, const char *re GHashTableIter aIter; regex_t r_patt; - crm_debug("Setting %s to %s", regex, value); + pcmk__debug("Setting %s to %s", regex, value); if (regcomp(&r_patt, regex, REG_EXTENDED|REG_NOSUB)) { return EINVAL; } @@ -266,7 +267,7 @@ expand_regexes(xmlNode *xml, const char *attr, const char *value, const char *re if (status == 0) { xmlNode *child = pcmk__xe_create(xml, PCMK_XE_OP); - crm_trace("Matched %s with %s", attr, regex); + pcmk__trace("Matched %s with %s", attr, regex); matched = true; /* Copy all the non-conflicting attributes from the parent over, @@ -274,7 +275,7 @@ expand_regexes(xmlNode *xml, const char *attr, const char *value, const char *re */ pcmk__xe_copy_attrs(child, xml, pcmk__xaf_no_overwrite); pcmk__xe_remove_attr(child, PCMK__XA_ATTR_REGEX); - crm_xml_add(child, PCMK__XA_ATTR_NAME, attr); + pcmk__xe_set(child, PCMK__XA_ATTR_NAME, attr); } } @@ -302,9 +303,9 @@ handle_regexes(pcmk__request_t *request) xmlNode *xml = request->xml; int rc = pcmk_rc_ok; - const char *attr = crm_element_value(xml, PCMK__XA_ATTR_NAME); - const char *value = crm_element_value(xml, PCMK__XA_ATTR_VALUE); - const char *regex = crm_element_value(xml, PCMK__XA_ATTR_REGEX); + const char *attr = pcmk__xe_get(xml, PCMK__XA_ATTR_NAME); + const char *value = pcmk__xe_get(xml, PCMK__XA_ATTR_VALUE); + const char *regex = pcmk__xe_get(xml, PCMK__XA_ATTR_REGEX); rc = expand_regexes(xml, attr, value, regex); @@ -314,7 +315,8 @@ handle_regexes(pcmk__request_t *request) pcmk__client_name(request->ipc_client)); } else if (rc == pcmk_rc_bad_nvpair) { - crm_err("Update request did not specify attribute or regular expression"); + pcmk__err("Update request did not specify attribute or regular " + "expression"); pcmk__format_result(&request->result, CRM_EX_ERROR, PCMK_EXEC_ERROR, "Client %s update request did not specify attribute or regular expression", pcmk__client_name(request->ipc_client)); @@ -338,17 +340,17 @@ handle_value_expansion(const char **value, xmlNode *xml, const char *op, attribute_value_t *v = NULL; if (a) { - const char *host = crm_element_value(xml, PCMK__XA_ATTR_HOST); + const char *host = pcmk__xe_get(xml, PCMK__XA_ATTR_HOST); v = g_hash_table_lookup(a->values, host); } int_value = attrd_expand_value(*value, (v? v->current : NULL)); - crm_info("Expanded %s=%s to %d", attr, *value, int_value); - crm_xml_add_int(xml, PCMK__XA_ATTR_VALUE, int_value); + pcmk__info("Expanded %s=%s to %d", attr, *value, int_value); + pcmk__xe_set_int(xml, PCMK__XA_ATTR_VALUE, int_value); /* Replacing the value frees the previous memory, so re-query it */ - *value = crm_element_value(xml, PCMK__XA_ATTR_VALUE); + *value = pcmk__xe_get(xml, PCMK__XA_ATTR_VALUE); } return pcmk_rc_ok; @@ -414,8 +416,8 @@ attrd_client_update(pcmk__request_t *request) NULL); child != NULL; child = pcmk__xe_next(child, PCMK_XE_OP)) { - attr = crm_element_value(child, PCMK__XA_ATTR_NAME); - value = crm_element_value(child, PCMK__XA_ATTR_VALUE); + attr = pcmk__xe_get(child, PCMK__XA_ATTR_NAME); + value = pcmk__xe_get(child, PCMK__XA_ATTR_VALUE); handle_missing_host(child); @@ -446,9 +448,9 @@ attrd_client_update(pcmk__request_t *request) return NULL; } - attr = crm_element_value(xml, PCMK__XA_ATTR_NAME); - value = crm_element_value(xml, PCMK__XA_ATTR_VALUE); - regex = crm_element_value(xml, PCMK__XA_ATTR_REGEX); + attr = pcmk__xe_get(xml, PCMK__XA_ATTR_NAME); + value = pcmk__xe_get(xml, PCMK__XA_ATTR_VALUE); + regex = pcmk__xe_get(xml, PCMK__XA_ATTR_REGEX); if (handle_regexes(request) != pcmk_rc_ok) { /* Error handling was already dealt with in handle_regexes, so just return. */ @@ -469,9 +471,9 @@ attrd_client_update(pcmk__request_t *request) return NULL; } - crm_debug("Broadcasting %s[%s]=%s%s", - attr, crm_element_value(xml, PCMK__XA_ATTR_HOST), - value, (attrd_election_won()? " (writer)" : "")); + pcmk__debug("Broadcasting %s[%s]=%s%s", attr, + pcmk__xe_get(xml, PCMK__XA_ATTR_HOST), value, + (attrd_election_won()? " (writer)" : "")); send_update_msg_to_cluster(request, xml); pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); @@ -491,10 +493,10 @@ attrd_client_update(pcmk__request_t *request) static int32_t attrd_ipc_accept(qb_ipcs_connection_t *c, uid_t uid, gid_t gid) { - crm_trace("New client connection %p", c); + pcmk__trace("New client connection %p", c); if (attrd_shutting_down(false)) { - crm_info("Ignoring new connection from pid %d during shutdown", - pcmk__client_pid(c)); + pcmk__info("Ignoring new connection from pid %d during shutdown", + pcmk__client_pid(c)); return -ECONNREFUSED; } @@ -518,9 +520,9 @@ attrd_ipc_closed(qb_ipcs_connection_t *c) pcmk__client_t *client = pcmk__find_client(c); if (client == NULL) { - crm_trace("Ignoring request to clean up unknown connection %p", c); + pcmk__trace("Ignoring request to clean up unknown connection %p", c); } else { - crm_trace("Cleaning up closed client connection %p", c); + pcmk__trace("Cleaning up closed client connection %p", c); /* Remove the client from the sync point waitlist if it's present. */ attrd_remove_client_from_waitlist(client); @@ -546,7 +548,7 @@ attrd_ipc_closed(qb_ipcs_connection_t *c) static void attrd_ipc_destroy(qb_ipcs_connection_t *c) { - crm_trace("Destroying client connection %p", c); + pcmk__trace("Destroying client connection %p", c); attrd_ipc_closed(c); } @@ -561,14 +563,14 @@ attrd_ipc_dispatch(qb_ipcs_connection_t * c, void *data, size_t size) // Sanity-check, and parse XML from IPC data CRM_CHECK((c != NULL) && (client != NULL), return 0); if (data == NULL) { - crm_debug("No IPC data from PID %d", pcmk__client_pid(c)); + pcmk__debug("No IPC data from PID %d", pcmk__client_pid(c)); return 0; } xml = pcmk__client_data2xml(client, data, &id, &flags); if (xml == NULL) { - crm_debug("Unrecognizable IPC data from PID %d", pcmk__client_pid(c)); + pcmk__debug("Unrecognizable IPC data from PID %d", pcmk__client_pid(c)); pcmk__ipc_send_ack(client, id, flags, PCMK__XE_ACK, NULL, CRM_EX_PROTOCOL); return 0; @@ -587,7 +589,7 @@ attrd_ipc_dispatch(qb_ipcs_connection_t * c, void *data, size_t size) pcmk__assert(client->user != NULL); pcmk__update_acl_user(xml, PCMK__XA_ATTR_USER, client->user); - request.op = crm_element_value_copy(request.xml, PCMK_XA_TASK); + request.op = pcmk__xe_get_copy(request.xml, PCMK_XA_TASK); CRM_CHECK(request.op != NULL, return 0); attrd_handle_request(&request); diff --git a/daemons/attrd/attrd_messages.c b/daemons/attrd/attrd_messages.c index 44312ae8bc7..7d146a93890 100644 --- a/daemons/attrd/attrd_messages.c +++ b/daemons/attrd/attrd_messages.c @@ -46,8 +46,9 @@ remove_unsupported_sync_points(pcmk__request_t *request) { if (request->xml->children != NULL && !ATTRD_SUPPORTS_MULTI_MESSAGE(minimum_protocol_version) && attrd_request_has_sync_point(request->xml)) { - crm_warn("Ignoring sync point in request from %s because not all nodes support it", - pcmk__request_origin(request)); + pcmk__warn("Ignoring sync point in request from %s because not all " + "nodes support it", + pcmk__request_origin(request)); remove_sync_point_attribute(request->xml, NULL); } } @@ -55,9 +56,9 @@ remove_unsupported_sync_points(pcmk__request_t *request) static xmlNode * handle_unknown_request(pcmk__request_t *request) { - crm_err("Unknown IPC request %s from %s %s", - request->op, pcmk__request_origin_type(request), - pcmk__request_origin(request)); + pcmk__err("Unknown IPC request %s from %s %s", request->op, + pcmk__request_origin_type(request), + pcmk__request_origin(request)); pcmk__format_result(&request->result, CRM_EX_PROTOCOL, PCMK_EXEC_INVALID, "Unknown request type '%s' (bug?)", request->op); return NULL; @@ -105,10 +106,10 @@ handle_confirm_request(pcmk__request_t *request) if (request->peer != NULL) { int callid; - crm_debug("Received confirmation from %s", request->peer); + pcmk__debug("Received confirmation from %s", request->peer); - if (crm_element_value_int(request->xml, PCMK__XA_CALL_ID, - &callid) == -1) { + if (pcmk__xe_get_int(request->xml, PCMK__XA_CALL_ID, + &callid) != pcmk_rc_ok) { pcmk__set_result(&request->result, CRM_EX_PROTOCOL, PCMK_EXEC_INVALID, "Could not get callid from XML"); } else { @@ -136,7 +137,7 @@ static xmlNode * handle_remove_request(pcmk__request_t *request) { if (request->peer != NULL) { - const char *host = crm_element_value(request->xml, PCMK__XA_ATTR_HOST); + const char *host = pcmk__xe_get(request->xml, PCMK__XA_ATTR_HOST); bool reap = false; if (pcmk__xe_get_bool_attr(request->xml, PCMK__XA_REAP, @@ -188,7 +189,7 @@ static xmlNode * handle_update_request(pcmk__request_t *request) { if (request->peer != NULL) { - const char *host = crm_element_value(request->xml, PCMK__XA_ATTR_HOST); + const char *host = pcmk__xe_get(request->xml, PCMK__XA_ATTR_HOST); pcmk__node_status_t *peer = pcmk__get_node(0, request->peer, NULL, pcmk__node_search_cluster_member); @@ -260,6 +261,7 @@ attrd_handle_request(pcmk__request_t *request) { xmlNode *reply = NULL; char *log_msg = NULL; + const char *exec_status_s = NULL; const char *reason = NULL; if (attrd_handlers == NULL) { @@ -269,31 +271,33 @@ attrd_handle_request(pcmk__request_t *request) reply = pcmk__process_request(request, attrd_handlers); if (reply != NULL) { - crm_log_xml_trace(reply, "Reply"); + pcmk__log_xml_trace(reply, "Reply"); if (request->ipc_client != NULL) { pcmk__ipc_send_xml(request->ipc_client, request->ipc_id, reply, request->ipc_flags); } else { - crm_err("Not sending CPG reply to client"); + pcmk__err("Not sending CPG reply to client"); } pcmk__xml_free(reply); } + exec_status_s = pcmk_exec_status_str(request->result.execution_status); reason = request->result.exit_reason; - log_msg = crm_strdup_printf("Processed %s request from %s %s: %s%s%s%s", - request->op, pcmk__request_origin_type(request), - pcmk__request_origin(request), - pcmk_exec_status_str(request->result.execution_status), - (reason == NULL)? "" : " (", - pcmk__s(reason, ""), - (reason == NULL)? "" : ")"); + log_msg = pcmk__assert_asprintf("Processed %s request from %s %s: %s%s%s%s", + request->op, + pcmk__request_origin_type(request), + pcmk__request_origin(request), + exec_status_s, + (reason == NULL)? "" : " (", + pcmk__s(reason, ""), + (reason == NULL)? "" : ")"); if (!pcmk__result_ok(&request->result)) { - crm_warn("%s", log_msg); + pcmk__warn("%s", log_msg); } else { - crm_debug("%s", log_msg); + pcmk__debug("%s", log_msg); } free(log_msg); @@ -309,18 +313,18 @@ attrd_broadcast_protocol(void) { xmlNode *attrd_op = pcmk__xe_create(NULL, __func__); - crm_xml_add(attrd_op, PCMK__XA_T, PCMK__VALUE_ATTRD); - crm_xml_add(attrd_op, PCMK__XA_SRC, crm_system_name); - crm_xml_add(attrd_op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); - crm_xml_add(attrd_op, PCMK__XA_ATTR_NAME, CRM_ATTR_PROTOCOL); - crm_xml_add(attrd_op, PCMK__XA_ATTR_VALUE, ATTRD_PROTOCOL_VERSION); - crm_xml_add_int(attrd_op, PCMK__XA_ATTR_IS_PRIVATE, 1); - crm_xml_add(attrd_op, PCMK__XA_ATTR_HOST, attrd_cluster->priv->node_name); - crm_xml_add(attrd_op, PCMK__XA_ATTR_HOST_ID, - attrd_cluster->priv->node_xml_id); + pcmk__xe_set(attrd_op, PCMK__XA_T, PCMK__VALUE_ATTRD); + pcmk__xe_set(attrd_op, PCMK__XA_SRC, crm_system_name); + pcmk__xe_set(attrd_op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); + pcmk__xe_set(attrd_op, PCMK__XA_ATTR_NAME, CRM_ATTR_PROTOCOL); + pcmk__xe_set(attrd_op, PCMK__XA_ATTR_VALUE, ATTRD_PROTOCOL_VERSION); + pcmk__xe_set_int(attrd_op, PCMK__XA_ATTR_IS_PRIVATE, 1); + pcmk__xe_set(attrd_op, PCMK__XA_ATTR_HOST, attrd_cluster->priv->node_name); + pcmk__xe_set(attrd_op, PCMK__XA_ATTR_HOST_ID, + attrd_cluster->priv->node_xml_id); - crm_debug("Broadcasting attrd protocol version %s for node %s", - ATTRD_PROTOCOL_VERSION, attrd_cluster->priv->node_name); + pcmk__debug("Broadcasting attrd protocol version %s for node %s", + ATTRD_PROTOCOL_VERSION, attrd_cluster->priv->node_name); attrd_send_message(NULL, attrd_op, false); /* ends up at attrd_peer_message() */ @@ -330,10 +334,10 @@ attrd_broadcast_protocol(void) gboolean attrd_send_message(pcmk__node_status_t *node, xmlNode *data, bool confirm) { - const char *op = crm_element_value(data, PCMK_XA_TASK); + const char *op = pcmk__xe_get(data, PCMK_XA_TASK); - crm_xml_add(data, PCMK__XA_T, PCMK__VALUE_ATTRD); - crm_xml_add(data, PCMK__XA_ATTR_VERSION, ATTRD_PROTOCOL_VERSION); + pcmk__xe_set(data, PCMK__XA_T, PCMK__VALUE_ATTRD); + pcmk__xe_set(data, PCMK__XA_ATTR_VERSION, ATTRD_PROTOCOL_VERSION); /* Request a confirmation from the destination peer node (which could * be all if node is NULL) that the message has been received and diff --git a/daemons/attrd/attrd_sync.c b/daemons/attrd/attrd_sync.c index 23915a619d1..ef664188e36 100644 --- a/daemons/attrd/attrd_sync.c +++ b/daemons/attrd/attrd_sync.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -163,14 +163,14 @@ attrd_add_client_to_waitlist(pcmk__request_t *request) next_key(); pcmk__intkey_table_insert(waitlist, waitlist_client, wl); - crm_trace("Added client %s to waitlist for %s sync point", - wl->client_id, sync_point_str(wl->sync_point)); - crm_trace("%d clients now on waitlist", g_hash_table_size(waitlist)); + pcmk__trace("Added client %s to waitlist for %s sync point", + wl->client_id, sync_point_str(wl->sync_point)); + pcmk__trace("%u clients now on waitlist", g_hash_table_size(waitlist)); /* And then add the key to the request XML so we can uniquely identify * it when it comes time to issue the ACK. */ - crm_xml_add_int(request->xml, PCMK__XA_CALL_ID, waitlist_client); + pcmk__xe_set_int(request->xml, PCMK__XA_CALL_ID, waitlist_client); } /*! @@ -213,7 +213,8 @@ attrd_remove_client_from_waitlist(pcmk__client_t *client) if (pcmk__str_eq(wl->client_id, client->id, pcmk__str_none)) { g_hash_table_iter_remove(&iter); - crm_trace("%d clients now on waitlist", g_hash_table_size(waitlist)); + pcmk__trace("%u clients now on waitlist", + g_hash_table_size(waitlist)); } } } @@ -240,8 +241,8 @@ attrd_ack_waitlist_clients(enum attrd_sync_point sync_point, const xmlNode *xml) return; } - if (crm_element_value_int(xml, PCMK__XA_CALL_ID, &callid) == -1) { - crm_warn("Could not get callid from request XML"); + if (pcmk__xe_get_int(xml, PCMK__XA_CALL_ID, &callid) != pcmk_rc_ok) { + pcmk__warn("Could not get callid from request XML"); return; } @@ -254,8 +255,8 @@ attrd_ack_waitlist_clients(enum attrd_sync_point sync_point, const xmlNode *xml) return; } - crm_notice("Alerting client %s for reached %s sync point", - wl->client_id, sync_point_str(wl->sync_point)); + pcmk__notice("Alerting client %s for reached %s sync point", + wl->client_id, sync_point_str(wl->sync_point)); client = pcmk__find_client_by_id(wl->client_id); if (client == NULL) { @@ -267,7 +268,7 @@ attrd_ack_waitlist_clients(enum attrd_sync_point sync_point, const xmlNode *xml) /* And then remove the client so it doesn't get alerted again. */ pcmk__intkey_table_remove(waitlist, callid); - crm_trace("%d clients now on waitlist", g_hash_table_size(waitlist)); + pcmk__trace("%u clients now on waitlist", g_hash_table_size(waitlist)); } } @@ -283,7 +284,7 @@ attrd_ack_waitlist_clients(enum attrd_sync_point sync_point, const xmlNode *xml) int attrd_cluster_sync_point_update(xmlNode *xml) { - crm_trace("Hit cluster sync point for attribute update"); + pcmk__trace("Hit cluster sync point for attribute update"); attrd_ack_waitlist_clients(attrd_sync_point_cluster, xml); return pcmk_rc_ok; } @@ -315,13 +316,13 @@ attrd_request_sync_point(xmlNode *xml) PCMK__XA_ATTR_SYNC_POINT, NULL); if (child) { - return crm_element_value(child, PCMK__XA_ATTR_SYNC_POINT); + return pcmk__xe_get(child, PCMK__XA_ATTR_SYNC_POINT); } else { return NULL; } } else { - return crm_element_value(xml, PCMK__XA_ATTR_SYNC_POINT); + return pcmk__xe_get(xml, PCMK__XA_ATTR_SYNC_POINT); } } @@ -376,14 +377,16 @@ confirmation_timeout_cb(gpointer data) return G_SOURCE_REMOVE; } - crm_trace("Timed out waiting for confirmations for client %s", client->id); + pcmk__trace("Timed out waiting for confirmations for client %s", + client->id); pcmk__ipc_send_ack(client, action->ipc_id, action->flags|crm_ipc_client_response, PCMK__XE_ACK, ATTRD_PROTOCOL_VERSION, CRM_EX_TIMEOUT); g_hash_table_iter_remove(&iter); - crm_trace("%d requests now in expected confirmations table", g_hash_table_size(expected_confirmations)); + pcmk__trace("%u requests now in expected confirmations table", + g_hash_table_size(expected_confirmations)); break; } } @@ -410,7 +413,7 @@ attrd_do_not_expect_from_peer(const char *host) keys = g_hash_table_get_keys(expected_confirmations); - crm_trace("Removing peer %s from expected confirmations", host); + pcmk__trace("Removing peer %s from expected confirmations", host); for (GList *node = keys; node != NULL; node = node->next) { int callid = *(int *) node->data; @@ -445,9 +448,11 @@ attrd_do_not_wait_for_client(pcmk__client_t *client) struct confirmation_action *action = (struct confirmation_action *) value; if (pcmk__str_eq(action->client_id, client->id, pcmk__str_none)) { - crm_trace("Removing client %s from expected confirmations", client->id); + pcmk__trace("Removing client %s from expected confirmations", + client->id); g_hash_table_iter_remove(&iter); - crm_trace("%d requests now in expected confirmations table", g_hash_table_size(expected_confirmations)); + pcmk__trace("%u requests now in expected confirmations table", + g_hash_table_size(expected_confirmations)); break; } } @@ -484,13 +489,14 @@ attrd_expect_confirmations(pcmk__request_t *request, attrd_confirmation_action_f expected_confirmations = pcmk__intkey_table((GDestroyNotify) free_action); } - if (crm_element_value_int(request->xml, PCMK__XA_CALL_ID, &callid) == -1) { - crm_err("Could not get callid from xml"); + if (pcmk__xe_get_int(request->xml, PCMK__XA_CALL_ID, + &callid) != pcmk_rc_ok) { + pcmk__err("Could not get callid from xml"); return; } if (pcmk__intkey_table_lookup(expected_confirmations, callid)) { - crm_err("Already waiting on confirmations for call id %d", callid); + pcmk__err("Already waiting on confirmations for call id %d", callid); return; } @@ -515,8 +521,10 @@ attrd_expect_confirmations(pcmk__request_t *request, attrd_confirmation_action_f mainloop_timer_start(action->timer); pcmk__intkey_table_insert(expected_confirmations, callid, action); - crm_trace("Callid %d now waiting on %d confirmations", callid, g_list_length(respondents)); - crm_trace("%d requests now in expected confirmations table", g_hash_table_size(expected_confirmations)); + pcmk__trace("Callid %d now waiting on %u confirmations", callid, + g_list_length(respondents)); + pcmk__trace("%u requests now in expected confirmations table", + g_hash_table_size(expected_confirmations)); } void @@ -561,11 +569,13 @@ attrd_handle_confirmation(int callid, const char *host) } action->respondents = g_list_remove(action->respondents, node->data); - crm_trace("Callid %d now waiting on %d confirmations", callid, g_list_length(action->respondents)); + pcmk__trace("Callid %d now waiting on %u confirmations", callid, + g_list_length(action->respondents)); if (action->respondents == NULL) { action->fn(action->xml); pcmk__intkey_table_remove(expected_confirmations, callid); - crm_trace("%d requests now in expected confirmations table", g_hash_table_size(expected_confirmations)); + pcmk__trace("%u requests now in expected confirmations table", + g_hash_table_size(expected_confirmations)); } } diff --git a/daemons/attrd/attrd_utils.c b/daemons/attrd/attrd_utils.c index f219b8862d3..e0a33339033 100644 --- a/daemons/attrd/attrd_utils.c +++ b/daemons/attrd/attrd_utils.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -19,6 +19,7 @@ #include #include #include +#include // pcmk_parse_score(), etc. #include #include "pacemaker-attrd.h" @@ -211,13 +212,14 @@ attrd_failure_regex(regex_t *regex, const char *rsc, const char *op, if (rsc == NULL) { pattern = pcmk__str_copy(ATTRD_RE_CLEAR_ALL); } else if (op == NULL) { - pattern = crm_strdup_printf(ATTRD_RE_CLEAR_ONE, rsc); + pattern = pcmk__assert_asprintf(ATTRD_RE_CLEAR_ONE, rsc); } else { - pattern = crm_strdup_printf(ATTRD_RE_CLEAR_OP, rsc, op, interval_ms); + pattern = pcmk__assert_asprintf(ATTRD_RE_CLEAR_OP, rsc, op, + interval_ms); } /* Compile pattern into regular expression */ - crm_trace("Clearing attributes matching %s", pattern); + pcmk__trace("Clearing attributes matching %s", pattern); rc = regcomp(regex, pattern, REG_EXTENDED|REG_NOSUB); free(pattern); @@ -299,8 +301,8 @@ attrd_update_minimum_protocol_ver(const char *host, const char *value) /* If the protocol version is a new minimum, record it as such. */ if (minimum_protocol_version == -1 || ver < minimum_protocol_version) { minimum_protocol_version = ver; - crm_trace("Set minimum attrd protocol version to %d", - minimum_protocol_version); + pcmk__trace("Set minimum attrd protocol version to %d", + minimum_protocol_version); } } } diff --git a/daemons/attrd/pacemaker-attrd.c b/daemons/attrd/pacemaker-attrd.c index 3c31bcd932e..47c416fecfa 100644 --- a/daemons/attrd/pacemaker-attrd.c +++ b/daemons/attrd/pacemaker-attrd.c @@ -1,5 +1,5 @@ /* - * Copyright 2013-2024 the Pacemaker project contributors + * Copyright 2013-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -73,8 +73,8 @@ ipc_already_running(void) rc = pcmk__connect_ipc(old_instance, pcmk_ipc_dispatch_sync, 2); if (rc != pcmk_rc_ok) { - crm_debug("No existing %s manager instance found: %s", - pcmk_ipc_name(old_instance, true), pcmk_rc_str(rc)); + pcmk__debug("No existing %s manager instance found: %s", + pcmk_ipc_name(old_instance, true), pcmk_rc_str(rc)); pcmk_free_ipc_api(old_instance); return false; } @@ -134,15 +134,15 @@ main(int argc, char **argv) pcmk__add_logfiles(log_files, out); crm_log_init(PCMK__VALUE_ATTRD, LOG_INFO, TRUE, FALSE, argc, argv, FALSE); - crm_notice("Starting Pacemaker node attribute manager%s", - stand_alone ? " in standalone mode" : ""); + pcmk__notice("Starting Pacemaker node attribute manager%s", + (stand_alone ? " in standalone mode" : "")); if (ipc_already_running()) { attrd_exit_status = CRM_EX_OK; g_set_error(&error, PCMK__EXITC_ERROR, attrd_exit_status, "Aborting start-up because an attribute manager " "instance is already active"); - crm_crit("%s", error->message); + pcmk__crit("%s", error->message); goto done; } @@ -161,7 +161,7 @@ main(int argc, char **argv) "Could not connect to the CIB"); goto done; } - crm_info("CIB connection active"); + pcmk__info("CIB connection active"); } if (attrd_cluster_connect() != pcmk_ok) { @@ -170,7 +170,7 @@ main(int argc, char **argv) "Could not connect to the cluster"); goto done; } - crm_info("Cluster connection active"); + pcmk__info("Cluster connection active"); // Initialization that requires the cluster to be connected attrd_election_init(); @@ -187,12 +187,13 @@ main(int argc, char **argv) attrd_broadcast_protocol(); attrd_init_ipc(); - crm_notice("Pacemaker node attribute manager successfully started and accepting connections"); + pcmk__notice("Pacemaker node attribute manager successfully started and " + "accepting connections"); attrd_run_mainloop(); done: if (initialized) { - crm_info("Shutting down attribute manager"); + pcmk__info("Shutting down attribute manager"); attrd_ipc_fini(); attrd_lrmd_disconnect(); diff --git a/daemons/attrd/pacemaker-attrd.h b/daemons/attrd/pacemaker-attrd.h index cc0dcf29ee4..ebb1250501b 100644 --- a/daemons/attrd/pacemaker-attrd.h +++ b/daemons/attrd/pacemaker-attrd.h @@ -15,6 +15,7 @@ #include #include #include +#include // PCMK__LOG_TRACE #include #include @@ -141,16 +142,21 @@ typedef struct attribute_s { mainloop_timer_t *timer; // Timer to use for timeout_ms } attribute_t; -#define attrd_set_attr_flags(attr, flags_to_set) do { \ - (attr)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Value for attribute", (attr)->id, \ - (attr)->flags, (flags_to_set), #flags_to_set); \ +#define attrd_set_attr_flags(attr, flags_to_set) do { \ + (attr)->flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Value for attribute", \ + (attr)->id, (attr)->flags, \ + (flags_to_set), #flags_to_set); \ } while (0) -#define attrd_clear_attr_flags(attr, flags_to_clear) do { \ - (attr)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Value for attribute", (attr)->id, \ - (attr)->flags, (flags_to_clear), #flags_to_clear); \ +#define attrd_clear_attr_flags(attr, flags_to_clear) do { \ + (attr)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Value for attribute", \ + (attr)->id, (attr)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) enum attrd_value_flags { @@ -166,16 +172,24 @@ typedef struct attribute_value_s { uint32_t flags; // Group of attrd_value_flags } attribute_value_t; -#define attrd_set_value_flags(attr_value, flags_to_set) do { \ - (attr_value)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Value for node", (attr_value)->nodename, \ - (attr_value)->flags, (flags_to_set), #flags_to_set); \ +#define attrd_set_value_flags(attr_value, flags_to_set) do { \ + (attr_value)->flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Value for node", \ + (attr_value)->nodename, \ + (attr_value)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) -#define attrd_clear_value_flags(attr_value, flags_to_clear) do { \ - (attr_value)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Value for node", (attr_value)->nodename, \ - (attr_value)->flags, (flags_to_clear), #flags_to_clear); \ +#define attrd_clear_value_flags(attr_value, flags_to_clear) do { \ + (attr_value)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Value for node", \ + (attr_value)->nodename, \ + (attr_value)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) extern pcmk_cluster_t *attrd_cluster; diff --git a/daemons/based/based_callbacks.c b/daemons/based/based_callbacks.c index d9f359b5720..4d2df2a371e 100644 --- a/daemons/based/based_callbacks.c +++ b/daemons/based/based_callbacks.c @@ -51,8 +51,8 @@ static int32_t cib_ipc_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) { if (cib_shutdown_flag) { - crm_info("Ignoring new IPC client [%d] during shutdown", - pcmk__client_pid(c)); + pcmk__info("Ignoring new IPC client [%d] during shutdown", + pcmk__client_pid(c)); return -ECONNREFUSED; } @@ -67,7 +67,7 @@ cib_ipc_dispatch_rw(qb_ipcs_connection_t * c, void *data, size_t size) { pcmk__client_t *client = pcmk__find_client(c); - crm_trace("%p message from %s", c, client->id); + pcmk__trace("%p message from %s", c, client->id); return cib_common_callback(c, data, size, TRUE); } @@ -76,7 +76,7 @@ cib_ipc_dispatch_ro(qb_ipcs_connection_t * c, void *data, size_t size) { pcmk__client_t *client = pcmk__find_client(c); - crm_trace("%p message from %s", c, client->id); + pcmk__trace("%p message from %s", c, client->id); return cib_common_callback(c, data, size, FALSE); } @@ -89,7 +89,7 @@ cib_ipc_closed(qb_ipcs_connection_t * c) if (client == NULL) { return 0; } - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); pcmk__free_client(client); return 0; } @@ -97,7 +97,7 @@ cib_ipc_closed(qb_ipcs_connection_t * c) static void cib_ipc_destroy(qb_ipcs_connection_t * c) { - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); cib_ipc_closed(c); if (cib_shutdown_flag) { cib_shutdown(0); @@ -142,17 +142,17 @@ create_cib_reply(const char *op, const char *call_id, const char *client_id, { xmlNode *reply = pcmk__xe_create(NULL, PCMK__XE_CIB_REPLY); - crm_xml_add(reply, PCMK__XA_T, PCMK__VALUE_CIB); - crm_xml_add(reply, PCMK__XA_CIB_OP, op); - crm_xml_add(reply, PCMK__XA_CIB_CALLID, call_id); - crm_xml_add(reply, PCMK__XA_CIB_CLIENTID, client_id); - crm_xml_add_int(reply, PCMK__XA_CIB_CALLOPT, call_options); - crm_xml_add_int(reply, PCMK__XA_CIB_RC, rc); + pcmk__xe_set(reply, PCMK__XA_T, PCMK__VALUE_CIB); + pcmk__xe_set(reply, PCMK__XA_CIB_OP, op); + pcmk__xe_set(reply, PCMK__XA_CIB_CALLID, call_id); + pcmk__xe_set(reply, PCMK__XA_CIB_CLIENTID, client_id); + pcmk__xe_set_int(reply, PCMK__XA_CIB_CALLOPT, call_options); + pcmk__xe_set_int(reply, PCMK__XA_CIB_RC, rc); if (call_data != NULL) { xmlNode *wrapper = pcmk__xe_create(reply, PCMK__XE_CIB_CALLDATA); - crm_trace("Attaching reply output"); + pcmk__trace("Attaching reply output"); pcmk__xml_copy(wrapper, call_data); } @@ -171,14 +171,15 @@ do_local_notify(const xmlNode *notify_src, const char *client_id, CRM_CHECK((notify_src != NULL) && (client_id != NULL), return); - crm_element_value_int(notify_src, PCMK__XA_CIB_CALLID, &msg_id); + pcmk__xe_get_int(notify_src, PCMK__XA_CIB_CALLID, &msg_id); client_obj = pcmk__find_client_by_id(client_id); if (client_obj == NULL) { - crm_debug("Could not notify client %s%s %s of call %d result: " - "client no longer exists", client_id, - (from_peer? " (originator of delegated request)" : ""), - (sync_reply? "synchronously" : "asynchronously"), msg_id); + pcmk__debug("Could not notify client %s%s %s of call %d result: " + "client no longer exists", + client_id, + (from_peer? " (originator of delegated request)" : ""), + (sync_reply? "synchronously" : "asynchronously"), msg_id); return; } @@ -203,18 +204,18 @@ do_local_notify(const xmlNode *notify_src, const char *client_id, break; } if (rc == pcmk_rc_ok) { - crm_trace("Notified %s client %s%s %s of call %d result", - pcmk__client_type_str(PCMK__CLIENT_TYPE(client_obj)), - pcmk__client_name(client_obj), - (from_peer? " (originator of delegated request)" : ""), - (sync_reply? "synchronously" : "asynchronously"), msg_id); + pcmk__trace("Notified %s client %s%s %s of call %d result", + pcmk__client_type_str(PCMK__CLIENT_TYPE(client_obj)), + pcmk__client_name(client_obj), + (from_peer? " (originator of delegated request)" : ""), + (sync_reply? "synchronously" : "asynchronously"), msg_id); } else { - crm_warn("Could not notify %s client %s%s %s of call %d result: %s", - pcmk__client_type_str(PCMK__CLIENT_TYPE(client_obj)), - pcmk__client_name(client_obj), - (from_peer? " (originator of delegated request)" : ""), - (sync_reply? "synchronously" : "asynchronously"), msg_id, - pcmk_rc_str(rc)); + pcmk__warn("Could not notify %s client %s%s %s of call %d result: %s", + pcmk__client_type_str(PCMK__CLIENT_TYPE(client_obj)), + pcmk__client_name(client_obj), + (from_peer? " (originator of delegated request)" : ""), + (sync_reply? "synchronously" : "asynchronously"), msg_id, + pcmk_rc_str(rc)); } } @@ -222,20 +223,20 @@ void cib_common_callback_worker(uint32_t id, uint32_t flags, xmlNode * op_request, pcmk__client_t *cib_client, gboolean privileged) { - const char *op = crm_element_value(op_request, PCMK__XA_CIB_OP); + const char *op = pcmk__xe_get(op_request, PCMK__XA_CIB_OP); uint32_t call_options = cib_none; int rc = pcmk_rc_ok; rc = pcmk__xe_get_flags(op_request, PCMK__XA_CIB_CALLOPT, &call_options, cib_none); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); } /* Requests with cib_transaction set should not be sent to based directly * (outside of a commit-transaction request) */ - if (pcmk_is_set(call_options, cib_transaction)) { + if (pcmk__is_set(call_options, cib_transaction)) { return; } @@ -243,8 +244,8 @@ cib_common_callback_worker(uint32_t id, uint32_t flags, xmlNode * op_request, if (flags & crm_ipc_client_response) { xmlNode *ack = pcmk__xe_create(NULL, __func__); - crm_xml_add(ack, PCMK__XA_CIB_OP, CRM_OP_REGISTER); - crm_xml_add(ack, PCMK__XA_CIB_CLIENTID, cib_client->id); + pcmk__xe_set(ack, PCMK__XA_CIB_OP, CRM_OP_REGISTER); + pcmk__xe_set(ack, PCMK__XA_CIB_CLIENTID, cib_client->id); pcmk__ipc_send_xml(cib_client, id, ack, flags); cib_client->request_id = 0; pcmk__xml_free(ack); @@ -256,14 +257,12 @@ cib_common_callback_worker(uint32_t id, uint32_t flags, xmlNode * op_request, int on_off = 0; crm_exit_t status = CRM_EX_OK; uint64_t bit = UINT64_C(0); - const char *type = crm_element_value(op_request, - PCMK__XA_CIB_NOTIFY_TYPE); + const char *type = pcmk__xe_get(op_request, PCMK__XA_CIB_NOTIFY_TYPE); - crm_element_value_int(op_request, PCMK__XA_CIB_NOTIFY_ACTIVATE, - &on_off); + pcmk__xe_get_int(op_request, PCMK__XA_CIB_NOTIFY_ACTIVATE, &on_off); - crm_debug("Setting %s callbacks %s for client %s", - type, (on_off? "on" : "off"), pcmk__client_name(cib_client)); + pcmk__debug("Setting %s callbacks %s for client %s", type, + (on_off? "on" : "off"), pcmk__client_name(cib_client)); if (pcmk__str_eq(type, PCMK__VALUE_CIB_POST_NOTIFY, pcmk__str_none)) { bit = cib_notify_post; @@ -314,31 +313,30 @@ cib_common_callback(qb_ipcs_connection_t * c, void *data, size_t size, gboolean rc = pcmk__xe_get_flags(op_request, PCMK__XA_CIB_CALLOPT, &call_options, cib_none); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from request: %s", - pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from request: %s", + pcmk_rc_str(rc)); } } if (op_request == NULL) { - crm_trace("Invalid message from %p", c); + pcmk__trace("Invalid message from %p", c); pcmk__ipc_send_ack(cib_client, id, flags, PCMK__XE_NACK, NULL, CRM_EX_PROTOCOL); return 0; } else if(cib_client == NULL) { - crm_trace("Invalid client %p", c); + pcmk__trace("Invalid client %p", c); return 0; } - if (pcmk_is_set(call_options, cib_sync_call)) { + if (pcmk__is_set(call_options, cib_sync_call)) { CRM_LOG_ASSERT(flags & crm_ipc_client_response); CRM_LOG_ASSERT(cib_client->request_id == 0); /* This means the client has two synchronous events in-flight */ cib_client->request_id = id; /* Reply only to the last one */ } if (cib_client->name == NULL) { - const char *value = crm_element_value(op_request, - PCMK__XA_CIB_CLIENTNAME); + const char *value = pcmk__xe_get(op_request, PCMK__XA_CIB_CLIENTNAME); if (value == NULL) { cib_client->name = pcmk__itoa(cib_client->pid); @@ -351,14 +349,14 @@ cib_common_callback(qb_ipcs_connection_t * c, void *data, size_t size, gboolean } /* Allow cluster daemons more leeway before being evicted */ - if (pcmk_is_set(cib_client->flags, cib_is_daemon)) { + if (pcmk__is_set(cib_client->flags, cib_is_daemon)) { const char *qmax = cib_config_lookup(PCMK_OPT_CLUSTER_IPC_LIMIT); pcmk__set_client_queue_max(cib_client, qmax); } - crm_xml_add(op_request, PCMK__XA_CIB_CLIENTID, cib_client->id); - crm_xml_add(op_request, PCMK__XA_CIB_CLIENTNAME, cib_client->name); + pcmk__xe_set(op_request, PCMK__XA_CIB_CLIENTID, cib_client->id); + pcmk__xe_set(op_request, PCMK__XA_CIB_CLIENTNAME, cib_client->name); CRM_LOG_ASSERT(cib_client->user != NULL); pcmk__update_acl_user(op_request, PCMK__XA_CIB_USER, cib_client->user); @@ -385,13 +383,13 @@ cib_digester_cb(gpointer data) ping_digest = NULL; ping_modified_since = FALSE; snprintf(buffer, 32, "%" PRIu64, ping_seq); - crm_trace("Requesting peer digests (%s)", buffer); + pcmk__trace("Requesting peer digests (%s)", buffer); - crm_xml_add(ping, PCMK__XA_T, PCMK__VALUE_CIB); - crm_xml_add(ping, PCMK__XA_CIB_OP, CRM_OP_PING); - crm_xml_add(ping, PCMK__XA_CIB_PING_ID, buffer); + pcmk__xe_set(ping, PCMK__XA_T, PCMK__VALUE_CIB); + pcmk__xe_set(ping, PCMK__XA_CIB_OP, CRM_OP_PING); + pcmk__xe_set(ping, PCMK__XA_CIB_PING_ID, buffer); - crm_xml_add(ping, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(ping, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); pcmk__cluster_send_message(NULL, pcmk_ipc_based, ping); pcmk__xml_free(ping); @@ -403,17 +401,17 @@ static void process_ping_reply(xmlNode *reply) { uint64_t seq = 0; - const char *host = crm_element_value(reply, PCMK__XA_SRC); + const char *host = pcmk__xe_get(reply, PCMK__XA_SRC); xmlNode *wrapper = pcmk__xe_first_child(reply, PCMK__XE_CIB_CALLDATA, NULL, NULL); xmlNode *pong = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); - const char *seq_s = crm_element_value(pong, PCMK__XA_CIB_PING_ID); - const char *digest = crm_element_value(pong, PCMK__XA_DIGEST); + const char *seq_s = pcmk__xe_get(pong, PCMK__XA_CIB_PING_ID); + const char *digest = pcmk__xe_get(pong, PCMK__XA_DIGEST); if (seq_s == NULL) { - crm_debug("Ignoring ping reply with no " PCMK__XA_CIB_PING_ID); + pcmk__debug("Ignoring ping reply with no " PCMK__XA_CIB_PING_ID); return; } else { @@ -421,29 +419,34 @@ process_ping_reply(xmlNode *reply) int rc = pcmk__scan_ll(seq_s, &seq_ll, 0LL); if (rc != pcmk_rc_ok) { - crm_debug("Ignoring ping reply with invalid " PCMK__XA_CIB_PING_ID - " '%s': %s", seq_s, pcmk_rc_str(rc)); + pcmk__debug("Ignoring ping reply with invalid " PCMK__XA_CIB_PING_ID + " '%s': %s", + seq_s, pcmk_rc_str(rc)); return; } seq = (uint64_t) seq_ll; } if(digest == NULL) { - crm_trace("Ignoring ping reply %s from %s with no digest", seq_s, host); + pcmk__trace("Ignoring ping reply %s from %s with no digest", seq_s, + host); } else if(seq != ping_seq) { - crm_trace("Ignoring out of sequence ping reply %s from %s", seq_s, host); + pcmk__trace("Ignoring out of sequence ping reply %s from %s", seq_s, + host); } else if(ping_modified_since) { - crm_trace("Ignoring ping reply %s from %s: cib updated since", seq_s, host); + pcmk__trace("Ignoring ping reply %s from %s: cib updated since", seq_s, + host); } else { if(ping_digest == NULL) { - crm_trace("Calculating new digest"); + pcmk__trace("Calculating new digest"); ping_digest = pcmk__digest_xml(the_cib, true); } - crm_trace("Processing ping reply %s from %s (%s)", seq_s, host, digest); + pcmk__trace("Processing ping reply %s from %s (%s)", seq_s, host, + digest); if (!pcmk__str_eq(ping_digest, digest, pcmk__str_casei)) { xmlNode *wrapper = pcmk__xe_first_child(pong, PCMK__XE_CIB_CALLDATA, NULL, NULL); @@ -454,28 +457,27 @@ process_ping_reply(xmlNode *reply) const char *num_updates_s = NULL; if (remote_cib != NULL) { - admin_epoch_s = crm_element_value(remote_cib, - PCMK_XA_ADMIN_EPOCH); - epoch_s = crm_element_value(remote_cib, PCMK_XA_EPOCH); - num_updates_s = crm_element_value(remote_cib, - PCMK_XA_NUM_UPDATES); + admin_epoch_s = pcmk__xe_get(remote_cib, PCMK_XA_ADMIN_EPOCH); + epoch_s = pcmk__xe_get(remote_cib, PCMK_XA_EPOCH); + num_updates_s = pcmk__xe_get(remote_cib, PCMK_XA_NUM_UPDATES); } - crm_notice("Local CIB %s.%s.%s.%s differs from %s: %s.%s.%s.%s %p", - crm_element_value(the_cib, PCMK_XA_ADMIN_EPOCH), - crm_element_value(the_cib, PCMK_XA_EPOCH), - crm_element_value(the_cib, PCMK_XA_NUM_UPDATES), - ping_digest, host, - pcmk__s(admin_epoch_s, "_"), - pcmk__s(epoch_s, "_"), - pcmk__s(num_updates_s, "_"), - digest, remote_cib); + pcmk__notice("Local CIB %s.%s.%s.%s differs from %s: %s.%s.%s.%s " + "%p", + pcmk__xe_get(the_cib, PCMK_XA_ADMIN_EPOCH), + pcmk__xe_get(the_cib, PCMK_XA_EPOCH), + pcmk__xe_get(the_cib, PCMK_XA_NUM_UPDATES), + ping_digest, host, + pcmk__s(admin_epoch_s, "_"), + pcmk__s(epoch_s, "_"), + pcmk__s(num_updates_s, "_"), + digest, remote_cib); if(remote_cib && remote_cib->children) { // Additional debug - xml_calculate_changes(the_cib, remote_cib); + pcmk__xml_mark_changes(the_cib, remote_cib); pcmk__log_xml_changes(LOG_INFO, remote_cib); - crm_trace("End of differences"); + pcmk__trace("End of differences"); } pcmk__xml_free(remote_cib); @@ -497,27 +499,27 @@ parse_local_options(const pcmk__client_t *cib_client, *local_notify = TRUE; *needs_forward = FALSE; - if (pcmk_is_set(operation->flags, cib__op_attr_local)) { + if (pcmk__is_set(operation->flags, cib__op_attr_local)) { /* Always process locally if cib__op_attr_local is set. * * @COMPAT: Currently host is ignored. At a compatibility break, throw * an error (from cib_process_request() or earlier) if host is not NULL or * OUR_NODENAME. */ - crm_trace("Processing always-local %s op from client %s", - op, pcmk__client_name(cib_client)); + pcmk__trace("Processing always-local %s op from client %s", op, + pcmk__client_name(cib_client)); if (!pcmk__str_eq(host, OUR_NODENAME, pcmk__str_casei|pcmk__str_null_matches)) { - crm_warn("Operation '%s' is always local but its target host is " - "set to '%s'", - op, host); + pcmk__warn("Operation '%s' is always local but its target host is " + "set to '%s'", + op, host); } return; } - if (pcmk_is_set(operation->flags, cib__op_attr_modifies) + if (pcmk__is_set(operation->flags, cib__op_attr_modifies) || !pcmk__str_eq(host, OUR_NODENAME, pcmk__str_casei|pcmk__str_null_matches)) { @@ -527,20 +529,19 @@ parse_local_options(const pcmk__client_t *cib_client, *local_notify = FALSE; *needs_forward = TRUE; - crm_trace("%s op from %s needs to be forwarded to %s", - op, pcmk__client_name(cib_client), - pcmk__s(host, "all nodes")); + pcmk__trace("%s op from %s needs to be forwarded to %s", op, + pcmk__client_name(cib_client), pcmk__s(host, "all nodes")); return; } if (stand_alone) { - crm_trace("Processing %s op from client %s (stand-alone)", - op, pcmk__client_name(cib_client)); + pcmk__trace("Processing %s op from client %s (stand-alone)", op, + pcmk__client_name(cib_client)); } else { - crm_trace("Processing %saddressed %s op from client %s", - ((host != NULL)? "locally " : "un"), - op, pcmk__client_name(cib_client)); + pcmk__trace("Processing %saddressed %s op from client %s", + ((host != NULL)? "locally " : "un"), op, + pcmk__client_name(cib_client)); } } @@ -557,11 +558,10 @@ parse_peer_options(const cib__operation_t *operation, xmlNode *request, * trace code more closely to check.) */ const char *host = NULL; - const char *delegated = crm_element_value(request, - PCMK__XA_CIB_DELEGATED_FROM); - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); - const char *originator = crm_element_value(request, PCMK__XA_SRC); - const char *reply_to = crm_element_value(request, PCMK__XA_CIB_ISREPLYTO); + const char *delegated = pcmk__xe_get(request, PCMK__XA_CIB_DELEGATED_FROM); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); + const char *originator = pcmk__xe_get(request, PCMK__XA_SRC); + const char *reply_to = pcmk__xe_get(request, PCMK__XA_CIB_ISREPLYTO); gboolean is_reply = pcmk__str_eq(reply_to, OUR_NODENAME, pcmk__str_casei); @@ -595,18 +595,17 @@ parse_peer_options(const cib__operation_t *operation, xmlNode *request, * Except this time PCMK__XA_CIB_SCHEMA_MAX will be set which puts a * limit on how far newer nodes will go */ - const char *max = crm_element_value(request, PCMK__XA_CIB_SCHEMA_MAX); - const char *upgrade_rc = crm_element_value(request, - PCMK__XA_CIB_UPGRADE_RC); + const char *max = pcmk__xe_get(request, PCMK__XA_CIB_SCHEMA_MAX); + const char *upgrade_rc = pcmk__xe_get(request, PCMK__XA_CIB_UPGRADE_RC); - crm_trace("Parsing upgrade %s for %s with max=%s and upgrade_rc=%s", - (is_reply? "reply" : "request"), - (based_is_primary? "primary" : "secondary"), - pcmk__s(max, "none"), pcmk__s(upgrade_rc, "none")); + pcmk__trace("Parsing upgrade %s for %s with max=%s and upgrade_rc=%s", + (is_reply? "reply" : "request"), + (based_is_primary? "primary" : "secondary"), + pcmk__s(max, "none"), pcmk__s(upgrade_rc, "none")); if (upgrade_rc != NULL) { // Our upgrade request was rejected by DC, notify clients of result - crm_xml_add(request, PCMK__XA_CIB_RC, upgrade_rc); + pcmk__xe_set(request, PCMK__XA_CIB_RC, upgrade_rc); } else if ((max == NULL) && based_is_primary) { /* We are the DC, check if this upgrade is allowed */ @@ -622,13 +621,14 @@ parse_peer_options(const cib__operation_t *operation, xmlNode *request, } } else if (pcmk__xe_attr_is_true(request, PCMK__XA_CIB_UPDATE)) { - crm_info("Detected legacy %s global update from %s", op, originator); + pcmk__info("Detected legacy %s global update from %s", op, originator); send_sync_request(NULL); return FALSE; } else if (is_reply - && pcmk_is_set(operation->flags, cib__op_attr_modifies)) { - crm_trace("Ignoring legacy %s reply sent from %s to local clients", op, originator); + && pcmk__is_set(operation->flags, cib__op_attr_modifies)) { + pcmk__trace("Ignoring legacy %s reply sent from %s to local clients", + op, originator); return FALSE; } else if (pcmk__str_eq(op, PCMK__CIB_REQUEST_SHUTDOWN, pcmk__str_none)) { @@ -636,15 +636,15 @@ parse_peer_options(const cib__operation_t *operation, xmlNode *request, if (reply_to == NULL) { *process = TRUE; } else { // Not possible? - crm_debug("Ignoring shutdown request from %s because reply_to=%s", - originator, reply_to); + pcmk__debug("Ignoring shutdown request from %s because reply_to=%s", + originator, reply_to); } return *process; } if (is_reply) { - crm_trace("Will notify local clients for %s reply from %s", - op, originator); + pcmk__trace("Will notify local clients for %s reply from %s", op, + originator); *process = FALSE; *needs_reply = FALSE; *local_notify = TRUE; @@ -657,28 +657,29 @@ parse_peer_options(const cib__operation_t *operation, xmlNode *request, *local_notify = pcmk__str_eq(delegated, OUR_NODENAME, pcmk__str_casei); - host = crm_element_value(request, PCMK__XA_CIB_HOST); + host = pcmk__xe_get(request, PCMK__XA_CIB_HOST); if (pcmk__str_eq(host, OUR_NODENAME, pcmk__str_casei)) { - crm_trace("Processing %s request sent to us from %s", op, originator); + pcmk__trace("Processing %s request sent to us from %s", op, originator); *needs_reply = TRUE; return TRUE; } else if (host != NULL) { - crm_trace("Ignoring %s request intended for CIB manager on %s", - op, host); + pcmk__trace("Ignoring %s request intended for CIB manager on %s", op, + host); return FALSE; } else if(is_reply == FALSE && pcmk__str_eq(op, CRM_OP_PING, pcmk__str_casei)) { *needs_reply = TRUE; } - crm_trace("Processing %s request broadcast by %s call %s on %s " - "(local clients will%s be notified)", op, - pcmk__s(crm_element_value(request, PCMK__XA_CIB_CLIENTNAME), - "client"), - pcmk__s(crm_element_value(request, PCMK__XA_CIB_CALLID), - "without ID"), - originator, (*local_notify? "" : "not")); + pcmk__trace("Processing %s request broadcast by %s call %s on %s (local " + "clients will%s be notified)", + op, + pcmk__s(pcmk__xe_get(request, PCMK__XA_CIB_CLIENTNAME), + "client"), + pcmk__s(pcmk__xe_get(request, PCMK__XA_CIB_CALLID), + "without ID"), + originator, (*local_notify? "" : "not")); return TRUE; } @@ -691,13 +692,12 @@ parse_peer_options(const cib__operation_t *operation, xmlNode *request, static void forward_request(xmlNode *request) { - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); - const char *section = crm_element_value(request, PCMK__XA_CIB_SECTION); - const char *host = crm_element_value(request, PCMK__XA_CIB_HOST); - const char *originator = crm_element_value(request, PCMK__XA_SRC); - const char *client_name = crm_element_value(request, - PCMK__XA_CIB_CLIENTNAME); - const char *call_id = crm_element_value(request, PCMK__XA_CIB_CALLID); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); + const char *section = pcmk__xe_get(request, PCMK__XA_CIB_SECTION); + const char *host = pcmk__xe_get(request, PCMK__XA_CIB_HOST); + const char *originator = pcmk__xe_get(request, PCMK__XA_SRC); + const char *client_name = pcmk__xe_get(request, PCMK__XA_CIB_CLIENTNAME); + const char *call_id = pcmk__xe_get(request, PCMK__XA_CIB_CALLID); pcmk__node_status_t *peer = NULL; int log_level = LOG_INFO; @@ -715,7 +715,7 @@ forward_request(xmlNode *request) pcmk__s(client_name, "unspecified"), pcmk__s(call_id, "unspecified")); - crm_xml_add(request, PCMK__XA_CIB_DELEGATED_FROM, OUR_NODENAME); + pcmk__xe_set(request, PCMK__XA_CIB_DELEGATED_FROM, OUR_NODENAME); if (host != NULL) { peer = pcmk__get_node(0, host, NULL, pcmk__node_search_cluster_member); @@ -739,8 +739,8 @@ send_peer_reply(xmlNode *msg, const char *originator) node = pcmk__get_node(0, originator, NULL, pcmk__node_search_cluster_member); - crm_trace("Sending request result to %s only", originator); - crm_xml_add(msg, PCMK__XA_CIB_ISREPLYTO, originator); + pcmk__trace("Sending request result to %s only", originator); + pcmk__xe_set(msg, PCMK__XA_CIB_ISREPLYTO, originator); pcmk__cluster_send_message(node, pcmk_ipc_based, msg); } @@ -772,14 +772,13 @@ cib_process_request(xmlNode *request, gboolean privileged, xmlNode *result_diff = NULL; int rc = pcmk_ok; - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); - const char *originator = crm_element_value(request, PCMK__XA_SRC); - const char *host = crm_element_value(request, PCMK__XA_CIB_HOST); - const char *call_id = crm_element_value(request, PCMK__XA_CIB_CALLID); - const char *client_id = crm_element_value(request, PCMK__XA_CIB_CLIENTID); - const char *client_name = crm_element_value(request, - PCMK__XA_CIB_CLIENTNAME); - const char *reply_to = crm_element_value(request, PCMK__XA_CIB_ISREPLYTO); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); + const char *originator = pcmk__xe_get(request, PCMK__XA_SRC); + const char *host = pcmk__xe_get(request, PCMK__XA_CIB_HOST); + const char *call_id = pcmk__xe_get(request, PCMK__XA_CIB_CALLID); + const char *client_id = pcmk__xe_get(request, PCMK__XA_CIB_CLIENTID); + const char *client_name = pcmk__xe_get(request, PCMK__XA_CIB_CLIENTNAME); + const char *reply_to = pcmk__xe_get(request, PCMK__XA_CIB_ISREPLYTO); const cib__operation_t *operation = NULL; cib__op_fn_t op_function = NULL; @@ -787,7 +786,7 @@ cib_process_request(xmlNode *request, gboolean privileged, rc = pcmk__xe_get_flags(request, PCMK__XA_CIB_CALLOPT, &call_options, cib_none); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); } if ((host != NULL) && (*host == '\0')) { @@ -795,27 +794,28 @@ cib_process_request(xmlNode *request, gboolean privileged, } if (cib_client == NULL) { - crm_trace("Processing peer %s operation from %s/%s on %s intended for %s (reply=%s)", - op, pcmk__s(client_name, "client"), call_id, originator, - pcmk__s(host, "all"), reply_to); + pcmk__trace("Processing peer %s operation from %s/%s on %s intended " + "for %s (reply=%s)", + op, pcmk__s(client_name, "client"), call_id, originator, + pcmk__s(host, "all"), reply_to); } else { - crm_xml_add(request, PCMK__XA_SRC, OUR_NODENAME); - crm_trace("Processing local %s operation from %s/%s intended for %s", - op, pcmk__s(client_name, "client"), call_id, - pcmk__s(host, "all")); + pcmk__xe_set(request, PCMK__XA_SRC, OUR_NODENAME); + pcmk__trace("Processing local %s operation from %s/%s intended for %s", + op, pcmk__s(client_name, "client"), call_id, + pcmk__s(host, "all")); } rc = cib__get_operation(op, &operation); rc = pcmk_rc2legacy(rc); if (rc != pcmk_ok) { /* TODO: construct error reply? */ - crm_err("Pre-processing of command failed: %s", pcmk_strerror(rc)); + pcmk__err("Pre-processing of command failed: %s", pcmk_strerror(rc)); return rc; } op_function = based_get_op_function(operation); if (op_function == NULL) { - crm_err("Operation %s not supported by CIB manager", op); + pcmk__err("Operation %s not supported by CIB manager", op); return -EOPNOTSUPP; } @@ -829,7 +829,7 @@ cib_process_request(xmlNode *request, gboolean privileged, return rc; } - if (pcmk_is_set(call_options, cib_transaction)) { + if (pcmk__is_set(call_options, cib_transaction)) { /* All requests in a transaction are processed locally against a working * CIB copy, and we don't notify for individual requests because the * entire transaction is atomic. @@ -843,16 +843,16 @@ cib_process_request(xmlNode *request, gboolean privileged, needs_forward = FALSE; } - is_update = pcmk_is_set(operation->flags, cib__op_attr_modifies); + is_update = pcmk__is_set(operation->flags, cib__op_attr_modifies); - if (pcmk_is_set(call_options, cib_discard_reply)) { + if (pcmk__is_set(call_options, cib_discard_reply)) { /* If the request will modify the CIB, and we are in legacy mode, we * need to build a reply so we can broadcast a diff, even if the * requester doesn't want one. */ needs_reply = FALSE; local_notify = FALSE; - crm_trace("Client is not interested in the reply"); + pcmk__trace("Client is not interested in the reply"); } if (needs_forward) { @@ -862,8 +862,9 @@ cib_process_request(xmlNode *request, gboolean privileged, if (cib_status != pcmk_ok) { rc = cib_status; - crm_err("Ignoring request because cluster configuration is invalid " - "(please repair and restart): %s", pcmk_strerror(rc)); + pcmk__err("Ignoring request because cluster configuration is invalid " + "(please repair and restart): %s", + pcmk_strerror(rc)); op_reply = create_cib_reply(op, call_id, client_id, call_options, rc, the_cib); @@ -871,7 +872,7 @@ cib_process_request(xmlNode *request, gboolean privileged, time_t finished = 0; time_t now = time(NULL); int level = LOG_INFO; - const char *section = crm_element_value(request, PCMK__XA_CIB_SECTION); + const char *section = pcmk__xe_get(request, PCMK__XA_CIB_SECTION); const char *admin_epoch_s = NULL; const char *epoch_s = NULL; const char *num_updates_s = NULL; @@ -880,7 +881,7 @@ cib_process_request(xmlNode *request, gboolean privileged, &result_diff, privileged); if (!is_update) { - level = LOG_TRACE; + level = PCMK__LOG_TRACE; } else if (pcmk__xe_attr_is_true(request, PCMK__XA_CIB_UPDATE)) { switch (rc) { @@ -890,7 +891,7 @@ cib_process_request(xmlNode *request, gboolean privileged, case -pcmk_err_old_data: case -pcmk_err_diff_resync: case -pcmk_err_diff_failed: - level = LOG_TRACE; + level = PCMK__LOG_TRACE; break; default: level = LOG_ERR; @@ -901,9 +902,9 @@ cib_process_request(xmlNode *request, gboolean privileged, } if (the_cib != NULL) { - admin_epoch_s = crm_element_value(the_cib, PCMK_XA_ADMIN_EPOCH); - epoch_s = crm_element_value(the_cib, PCMK_XA_EPOCH); - num_updates_s = crm_element_value(the_cib, PCMK_XA_NUM_UPDATES); + admin_epoch_s = pcmk__xe_get(the_cib, PCMK_XA_ADMIN_EPOCH); + epoch_s = pcmk__xe_get(the_cib, PCMK_XA_EPOCH); + num_updates_s = pcmk__xe_get(the_cib, PCMK_XA_NUM_UPDATES); } do_crm_log(level, @@ -917,55 +918,57 @@ cib_process_request(xmlNode *request, gboolean privileged, finished = time(NULL); if ((finished - now) > 3) { - crm_trace("%s operation took %lds to complete", op, (long)(finished - now)); + pcmk__trace("%s operation took %llds to complete", op, + (long long) (finished - now)); crm_write_blackbox(0, NULL); } if (op_reply == NULL && (needs_reply || local_notify)) { - crm_err("Unexpected NULL reply to message"); - crm_log_xml_err(request, "null reply"); + pcmk__err("Unexpected NULL reply to message"); + pcmk__log_xml_err(request, "null reply"); needs_reply = FALSE; local_notify = FALSE; } } if (is_update) { - crm_trace("Completed pre-sync update from %s/%s/%s%s", - originator ? originator : "local", - pcmk__s(client_name, "client"), call_id, - local_notify?" with local notification":""); + pcmk__trace("Completed pre-sync update from %s/%s/%s%s", + pcmk__s(originator, "local"), + pcmk__s(client_name, "client"), call_id, + (local_notify? " with local notification" : "")); } else if (!needs_reply || stand_alone) { // This was a non-originating secondary update - crm_trace("Completed update as secondary"); + pcmk__trace("Completed update as secondary"); } else if ((cib_client == NULL) - && !pcmk_is_set(call_options, cib_discard_reply)) { + && !pcmk__is_set(call_options, cib_discard_reply)) { if (is_update == FALSE || result_diff == NULL) { - crm_trace("Request not broadcast: R/O call"); + pcmk__trace("Request not broadcast: R/O call"); } else if (rc != pcmk_ok) { - crm_trace("Request not broadcast: call failed: %s", pcmk_strerror(rc)); + pcmk__trace("Request not broadcast: call failed: %s", + pcmk_strerror(rc)); } else { - crm_trace("Directing reply to %s", originator); + pcmk__trace("Directing reply to %s", originator); } send_peer_reply(op_reply, originator); } if (local_notify && client_id) { - crm_trace("Performing local %ssync notification for %s", - (pcmk_is_set(call_options, cib_sync_call)? "" : "a"), - client_id); + pcmk__trace("Performing local %ssync notification for %s", + (pcmk__is_set(call_options, cib_sync_call)? "" : "a"), + client_id); if (process == FALSE) { do_local_notify(request, client_id, - pcmk_is_set(call_options, cib_sync_call), + pcmk__is_set(call_options, cib_sync_call), (cib_client == NULL)); } else { do_local_notify(op_reply, client_id, - pcmk_is_set(call_options, cib_sync_call), + pcmk__is_set(call_options, cib_sync_call), (cib_client == NULL)); } } @@ -1000,7 +1003,7 @@ prepare_input(const xmlNode *request, enum cib__op_type type, if (type == cib__op_apply_patch) { *section = NULL; } else { - *section = crm_element_value(request, PCMK__XA_CIB_SECTION); + *section = pcmk__xe_get(request, PCMK__XA_CIB_SECTION); } // Grab the specified section @@ -1045,11 +1048,10 @@ cib_process_command(xmlNode *request, const cib__operation_t *operation, const char *op = NULL; const char *section = NULL; - const char *call_id = crm_element_value(request, PCMK__XA_CIB_CALLID); - const char *client_id = crm_element_value(request, PCMK__XA_CIB_CLIENTID); - const char *client_name = crm_element_value(request, - PCMK__XA_CIB_CLIENTNAME); - const char *originator = crm_element_value(request, PCMK__XA_SRC); + const char *call_id = pcmk__xe_get(request, PCMK__XA_CIB_CALLID); + const char *client_id = pcmk__xe_get(request, PCMK__XA_CIB_CLIENTID); + const char *client_name = pcmk__xe_get(request, PCMK__XA_CIB_CLIENTNAME); + const char *originator = pcmk__xe_get(request, PCMK__XA_SRC); int rc = pcmk_ok; @@ -1068,22 +1070,23 @@ cib_process_command(xmlNode *request, const cib__operation_t *operation, *cib_diff = NULL; /* Start processing the request... */ - op = crm_element_value(request, PCMK__XA_CIB_OP); + op = pcmk__xe_get(request, PCMK__XA_CIB_OP); rc = pcmk__xe_get_flags(request, PCMK__XA_CIB_CALLOPT, &call_options, cib_none); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); } - if (!privileged && pcmk_is_set(operation->flags, cib__op_attr_privileged)) { + if (!privileged + && pcmk__is_set(operation->flags, cib__op_attr_privileged)) { rc = -EACCES; - crm_trace("Failed due to lack of privileges: %s", pcmk_strerror(rc)); + pcmk__trace("Failed due to lack of privileges: %s", pcmk_strerror(rc)); goto done; } input = prepare_input(request, operation->type, §ion); - if (!pcmk_is_set(operation->flags, cib__op_attr_modifies)) { + if (!pcmk__is_set(operation->flags, cib__op_attr_modifies)) { rc = cib_perform_op(NULL, op, call_options, op_function, true, section, request, input, false, &config_changed, &the_cib, &result_cib, NULL, &output); @@ -1102,7 +1105,7 @@ cib_process_command(xmlNode *request, const cib__operation_t *operation, if (pcmk__xe_attr_is_true(request, PCMK__XA_CIB_UPDATE)) { manage_counters = false; cib__set_call_options(call_options, "call", cib_force_diff); - crm_trace("Global update detected"); + pcmk__trace("Global update detected"); CRM_LOG_ASSERT(pcmk__str_any_of(op, PCMK__CIB_REQUEST_APPLY_PATCH, @@ -1121,27 +1124,27 @@ cib_process_command(xmlNode *request, const cib__operation_t *operation, * negates the need to detect ordering changes. */ if ((rc == pcmk_ok) - && pcmk_is_set(operation->flags, cib__op_attr_writes_through)) { + && pcmk__is_set(operation->flags, cib__op_attr_writes_through)) { config_changed = true; } if ((rc == pcmk_ok) - && !pcmk_any_flags_set(call_options, cib_dryrun|cib_transaction)) { + && !pcmk__any_flags_set(call_options, cib_dryrun|cib_transaction)) { if (result_cib != the_cib) { - if (pcmk_is_set(operation->flags, cib__op_attr_writes_through)) { + if (pcmk__is_set(operation->flags, cib__op_attr_writes_through)) { config_changed = true; } - crm_trace("Activating %s->%s%s", - crm_element_value(the_cib, PCMK_XA_NUM_UPDATES), - crm_element_value(result_cib, PCMK_XA_NUM_UPDATES), - (config_changed? " changed" : "")); + pcmk__trace("Activating %s->%s%s", + pcmk__xe_get(the_cib, PCMK_XA_NUM_UPDATES), + pcmk__xe_get(result_cib, PCMK_XA_NUM_UPDATES), + (config_changed? " changed" : "")); rc = activateCibXml(result_cib, config_changed, op); if (rc != pcmk_ok) { - crm_err("Failed to activate new CIB: %s", pcmk_strerror(rc)); + pcmk__err("Failed to activate new CIB: %s", pcmk_strerror(rc)); } } @@ -1160,9 +1163,9 @@ cib_process_command(xmlNode *request, const cib__operation_t *operation, */ if ((operation->type == cib__op_commit_transact) && pcmk__str_eq(originator, OUR_NODENAME, pcmk__str_casei) - && compare_version(crm_element_value(the_cib, - PCMK_XA_CRM_FEATURE_SET), - "3.19.0") < 0) { + && (pcmk__compare_versions(pcmk__xe_get(the_cib, + PCMK_XA_CRM_FEATURE_SET), + "3.19.0") < 0)) { sync_our_cib(request, TRUE); } @@ -1174,34 +1177,34 @@ cib_process_command(xmlNode *request, const cib__operation_t *operation, pcmk__assert(result_cib != the_cib); if (output != NULL) { - crm_log_xml_info(output, "cib:output"); + pcmk__log_xml_info(output, "cib:output"); pcmk__xml_free(output); } output = result_cib; } else { - crm_trace("Not activating %d %d %s", rc, - pcmk_is_set(call_options, cib_dryrun), - crm_element_value(result_cib, PCMK_XA_NUM_UPDATES)); + pcmk__trace("Not activating %d %d %s", rc, + pcmk__is_set(call_options, cib_dryrun), + pcmk__xe_get(result_cib, PCMK_XA_NUM_UPDATES)); if (result_cib != the_cib) { pcmk__xml_free(result_cib); } } - if (!pcmk_any_flags_set(call_options, - cib_dryrun|cib_inhibit_notify|cib_transaction)) { - crm_trace("Sending notifications %d", - pcmk_is_set(call_options, cib_dryrun)); + if (!pcmk__any_flags_set(call_options, + cib_dryrun|cib_inhibit_notify|cib_transaction)) { + pcmk__trace("Sending notifications %d", + pcmk__is_set(call_options, cib_dryrun)); cib_diff_notify(op, rc, call_id, client_id, client_name, originator, input, *cib_diff); } - pcmk__log_xml_patchset(LOG_TRACE, *cib_diff); + pcmk__log_xml_patchset(PCMK__LOG_TRACE, *cib_diff); done: - if (!pcmk_is_set(call_options, cib_discard_reply)) { + if (!pcmk__is_set(call_options, cib_discard_reply)) { *reply = create_cib_reply(op, call_id, client_id, call_options, rc, output); } @@ -1209,7 +1212,7 @@ cib_process_command(xmlNode *request, const cib__operation_t *operation, if (output != the_cib) { pcmk__xml_free(output); } - crm_trace("done"); + pcmk__trace("done"); return rc; } @@ -1217,34 +1220,34 @@ void cib_peer_callback(xmlNode * msg, void *private_data) { const char *reason = NULL; - const char *originator = crm_element_value(msg, PCMK__XA_SRC); + const char *originator = pcmk__xe_get(msg, PCMK__XA_SRC); if (pcmk__peer_cache == NULL) { reason = "membership not established"; goto bail; } - if (crm_element_value(msg, PCMK__XA_CIB_CLIENTNAME) == NULL) { - crm_xml_add(msg, PCMK__XA_CIB_CLIENTNAME, originator); + if (pcmk__xe_get(msg, PCMK__XA_CIB_CLIENTNAME) == NULL) { + pcmk__xe_set(msg, PCMK__XA_CIB_CLIENTNAME, originator); } - /* crm_log_xml_trace(msg, "Peer[inbound]"); */ + // pcmk__log_xml_trace(msg, "Peer[inbound]"); cib_process_request(msg, TRUE, NULL); return; bail: if (reason) { - const char *op = crm_element_value(msg, PCMK__XA_CIB_OP); + const char *op = pcmk__xe_get(msg, PCMK__XA_CIB_OP); - crm_warn("Discarding %s message from %s: %s", op, originator, reason); + pcmk__warn("Discarding %s message from %s: %s", op, originator, reason); } } static gboolean cib_force_exit(gpointer data) { - crm_notice("Exiting immediately after %s without shutdown acknowledgment", - pcmk__readable_interval(EXIT_ESCALATION_MS)); + pcmk__notice("Exiting immediately after %s without shutdown acknowledgment", + pcmk__readable_interval(EXIT_ESCALATION_MS)); terminate_cib(CRM_EX_ERROR); return FALSE; } @@ -1254,8 +1257,8 @@ disconnect_remote_client(gpointer key, gpointer value, gpointer user_data) { pcmk__client_t *a_client = value; - crm_err("Can't disconnect client %s: Not implemented", - pcmk__client_name(a_client)); + pcmk__err("Can't disconnect client %s: Not implemented", + pcmk__client_name(a_client)); } static void @@ -1266,16 +1269,17 @@ initiate_exit(void) active = pcmk__cluster_num_active_nodes(); if (active < 2) { // This is the last active node - crm_info("Exiting without sending shutdown request (no active peers)"); + pcmk__info("Exiting without sending shutdown request (no active " + "peers)"); terminate_cib(CRM_EX_OK); return; } - crm_info("Sending shutdown request to %d peers", active); + pcmk__info("Sending shutdown request to %d peers", active); leaving = pcmk__xe_create(NULL, PCMK__XE_EXIT_NOTIFICATION); - crm_xml_add(leaving, PCMK__XA_T, PCMK__VALUE_CIB); - crm_xml_add(leaving, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_SHUTDOWN); + pcmk__xe_set(leaving, PCMK__XA_T, PCMK__VALUE_CIB); + pcmk__xe_set(leaving, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_SHUTDOWN); pcmk__cluster_send_message(NULL, pcmk_ipc_based, leaving); pcmk__xml_free(leaving); @@ -1300,7 +1304,7 @@ cib_shutdown(int nsig) c = qb_ipcs_connection_next_get(ipcs_rw, last); - crm_debug("Disconnecting r/w client %p...", last); + pcmk__debug("Disconnecting r/w client %p...", last); qb_ipcs_disconnect(last); qb_ipcs_connection_unref(last); disconnects++; @@ -1312,7 +1316,7 @@ cib_shutdown(int nsig) c = qb_ipcs_connection_next_get(ipcs_ro, last); - crm_debug("Disconnecting r/o client %p...", last); + pcmk__debug("Disconnecting r/o client %p...", last); qb_ipcs_disconnect(last); qb_ipcs_connection_unref(last); disconnects++; @@ -1324,7 +1328,7 @@ cib_shutdown(int nsig) c = qb_ipcs_connection_next_get(ipcs_shm, last); - crm_debug("Disconnecting non-blocking r/w client %p...", last); + pcmk__debug("Disconnecting non-blocking r/w client %p...", last); qb_ipcs_disconnect(last); qb_ipcs_connection_unref(last); disconnects++; @@ -1332,20 +1336,21 @@ cib_shutdown(int nsig) disconnects += pcmk__ipc_client_count(); - crm_debug("Disconnecting %d remote clients", pcmk__ipc_client_count()); + pcmk__debug("Disconnecting %d remote clients", + pcmk__ipc_client_count()); pcmk__foreach_ipc_client(disconnect_remote_client, NULL); - crm_info("Disconnected %d clients", disconnects); + pcmk__info("Disconnected %d clients", disconnects); } qb_ipcs_stats_get(ipcs_rw, &srv_stats, QB_FALSE); if (pcmk__ipc_client_count() == 0) { - crm_info("All clients disconnected (%d)", srv_stats.active_connections); + pcmk__info("All clients disconnected (%d)", srv_stats.active_connections); initiate_exit(); } else { - crm_info("Waiting on %d clients to disconnect (%d)", - pcmk__ipc_client_count(), srv_stats.active_connections); + pcmk__info("Waiting on %d clients to disconnect (%d)", + pcmk__ipc_client_count(), srv_stats.active_connections); } } diff --git a/daemons/based/based_io.c b/daemons/based/based_io.c index 3424a7f03f8..79c2bb13c23 100644 --- a/daemons/based/based_io.c +++ b/daemons/based/based_io.c @@ -43,17 +43,18 @@ static void cib_rename(const char *old) { int new_fd; - char *new = crm_strdup_printf("%s/cib.auto.XXXXXX", cib_root); + char *new = pcmk__assert_asprintf("%s/cib.auto.XXXXXX", cib_root); umask(S_IWGRP | S_IWOTH | S_IROTH); new_fd = mkstemp(new); if ((new_fd < 0) || (rename(old, new) < 0)) { - crm_err("Couldn't archive unusable file %s (disabling disk writes and continuing)", - old); + pcmk__err("Couldn't archive unusable file %s (disabling disk writes " + "and continuing)", + old); cib_writes_enabled = FALSE; } else { - crm_err("Archived unusable file %s as %s", old, new); + pcmk__err("Archived unusable file %s as %s", old, new); } if (new_fd > 0) { @@ -73,10 +74,10 @@ retrieveCib(const char *filename, const char *sigfile) int rc = cib_file_read_and_verify(filename, sigfile, &root); if (rc == pcmk_ok) { - crm_info("Loaded CIB from %s (with digest %s)", filename, sigfile); + pcmk__info("Loaded CIB from %s (with digest %s)", filename, sigfile); } else { - crm_warn("Continuing but NOT using CIB from %s (with digest %s): %s", - filename, sigfile, pcmk_strerror(rc)); + pcmk__warn("Continuing but NOT using CIB from %s (with digest %s): %s", + filename, sigfile, pcmk_strerror(rc)); if (rc == -pcmk_err_cib_modified) { // Archive the original files so the contents are not lost cib_rename(filename); @@ -91,25 +92,26 @@ static int cib_archive_filter(const struct dirent * a) int rc = 0; // Looking for regular files starting with "cib-" and not ending in .sig struct stat s; - char *a_path = crm_strdup_printf("%s/%s", cib_root, a->d_name); + char *a_path = pcmk__assert_asprintf("%s/%s", cib_root, a->d_name); if(stat(a_path, &s) != 0) { rc = errno; - crm_trace("%s - stat failed: %s (%d)", a->d_name, pcmk_rc_str(rc), rc); + pcmk__trace("%s - stat failed: %s (%d)", a->d_name, pcmk_rc_str(rc), + rc); rc = 0; } else if (!S_ISREG(s.st_mode)) { - crm_trace("%s - wrong type (%#o)", - a->d_name, (unsigned int) (s.st_mode & S_IFMT)); + pcmk__trace("%s - wrong type (%#o)", a->d_name, + (unsigned int) (s.st_mode & S_IFMT)); } else if(strstr(a->d_name, "cib-") != a->d_name) { - crm_trace("%s - wrong prefix", a->d_name); + pcmk__trace("%s - wrong prefix", a->d_name); } else if (pcmk__ends_with_ext(a->d_name, ".sig")) { - crm_trace("%s - wrong suffix", a->d_name); + pcmk__trace("%s - wrong suffix", a->d_name); } else { - crm_debug("%s - candidate", a->d_name); + pcmk__debug("%s - candidate", a->d_name); rc = 1; } @@ -126,8 +128,8 @@ static int cib_archive_sort(const struct dirent ** a, const struct dirent **b) time_t a_age = 0; time_t b_age = 0; - char *a_path = crm_strdup_printf("%s/%s", cib_root, a[0]->d_name); - char *b_path = crm_strdup_printf("%s/%s", cib_root, b[0]->d_name); + char *a_path = pcmk__assert_asprintf("%s/%s", cib_root, a[0]->d_name); + char *b_path = pcmk__assert_asprintf("%s/%s", cib_root, b[0]->d_name); if(stat(a_path, &buf) == 0) { a_age = buf.st_ctime; @@ -145,7 +147,7 @@ static int cib_archive_sort(const struct dirent ** a, const struct dirent **b) rc = -1; } - crm_trace("%s (%lu) vs. %s (%lu) : %d", + pcmk__trace("%s (%lu) vs. %s (%lu) : %d", a[0]->d_name, (unsigned long)a_age, b[0]->d_name, (unsigned long)b_age, rc); return rc; @@ -167,15 +169,15 @@ readCibXmlFile(const char *dir, const char *file, gboolean discard_status) xmlNode *root = NULL; xmlNode *status = NULL; - sigfile = crm_strdup_printf("%s.sig", file); + sigfile = pcmk__assert_asprintf("%s.sig", file); if (pcmk__daemon_can_write(dir, file) == FALSE || pcmk__daemon_can_write(dir, sigfile) == FALSE) { cib_status = -EACCES; return NULL; } - filename = crm_strdup_printf("%s/%s", dir, file); - sigfilepath = crm_strdup_printf("%s/%s", dir, sigfile); + filename = pcmk__assert_asprintf("%s/%s", dir, file); + sigfilepath = pcmk__assert_asprintf("%s/%s", dir, sigfile); free(sigfile); cib_status = pcmk_ok; @@ -186,8 +188,8 @@ readCibXmlFile(const char *dir, const char *file, gboolean discard_status) if (root == NULL) { lpc = scandir(cib_root, &namelist, cib_archive_filter, cib_archive_sort); if (lpc < 0) { - crm_err("Could not check for CIB backups in %s: %s", - cib_root, pcmk_rc_str(errno)); + pcmk__err("Could not check for CIB backups in %s: %s", cib_root, + pcmk_rc_str(errno)); } } @@ -196,17 +198,19 @@ readCibXmlFile(const char *dir, const char *file, gboolean discard_status) lpc--; - filename = crm_strdup_printf("%s/%s", cib_root, namelist[lpc]->d_name); - sigfile = crm_strdup_printf("%s.sig", filename); + filename = pcmk__assert_asprintf("%s/%s", cib_root, + namelist[lpc]->d_name); + sigfile = pcmk__assert_asprintf("%s.sig", filename); rc = cib_file_read_and_verify(filename, sigfile, &root); if (rc == pcmk_ok) { - crm_notice("Loaded CIB from last valid backup %s (with digest %s)", - filename, sigfile); + pcmk__notice("Loaded CIB from last valid backup %s (with digest " + "%s)", + filename, sigfile); } else { - crm_warn("Not using next most recent CIB backup from %s " - "(with digest %s): %s", - filename, sigfile, pcmk_strerror(rc)); + pcmk__warn("Not using next most recent CIB backup from %s (with " + "digest %s): %s", + filename, sigfile, pcmk_strerror(rc)); } free(namelist[lpc]); @@ -217,15 +221,15 @@ readCibXmlFile(const char *dir, const char *file, gboolean discard_status) if (root == NULL) { root = createEmptyCib(0); - crm_warn("Continuing with an empty configuration"); + pcmk__warn("Continuing with an empty configuration"); } if (cib_writes_enabled && (use_valgrind != NULL) - && (crm_is_true(use_valgrind) + && (pcmk__is_true(use_valgrind) || (strstr(use_valgrind, PCMK__SERVER_BASED) != NULL))) { cib_writes_enabled = FALSE; - crm_err("*** Disabling disk writes to avoid confusing Valgrind ***"); + pcmk__err("*** Disabling disk writes to avoid confusing Valgrind ***"); } status = pcmk__xe_first_child(root, PCMK_XE_STATUS, NULL, NULL); @@ -241,31 +245,31 @@ readCibXmlFile(const char *dir, const char *file, gboolean discard_status) /* Do this before schema validation happens */ /* fill in some defaults */ - value = crm_element_value(root, PCMK_XA_ADMIN_EPOCH); + value = pcmk__xe_get(root, PCMK_XA_ADMIN_EPOCH); if (value == NULL) { // Not possible with schema validation enabled - crm_warn("Defaulting missing " PCMK_XA_ADMIN_EPOCH " to 0, but " - "cluster may get confused about which node's configuration " - "is most recent"); - crm_xml_add_int(root, PCMK_XA_ADMIN_EPOCH, 0); + pcmk__warn("Defaulting missing " PCMK_XA_ADMIN_EPOCH " to 0, but " + "cluster may get confused about which node's configuration " + "is most recent"); + pcmk__xe_set_int(root, PCMK_XA_ADMIN_EPOCH, 0); } name = PCMK_XA_EPOCH; - value = crm_element_value(root, name); + value = pcmk__xe_get(root, name); if (value == NULL) { - crm_xml_add_int(root, name, 0); + pcmk__xe_set_int(root, name, 0); } name = PCMK_XA_NUM_UPDATES; - value = crm_element_value(root, name); + value = pcmk__xe_get(root, name); if (value == NULL) { - crm_xml_add_int(root, name, 0); + pcmk__xe_set_int(root, name, 0); } // Unset (DC should set appropriate value) pcmk__xe_remove_attr(root, PCMK_XA_DC_UUID); if (discard_status) { - crm_log_xml_trace(root, "[on-disk]"); + pcmk__log_xml_trace(root, "[on-disk]"); } if (!pcmk__configured_schema_validates(root)) { @@ -301,17 +305,18 @@ activateCibXml(xmlNode * new_cib, gboolean to_disk, const char *op) the_cib = new_cib; pcmk__xml_free(saved_cib); if (cib_writes_enabled && cib_status == pcmk_ok && to_disk) { - crm_debug("Triggering CIB write for %s op", op); + pcmk__debug("Triggering CIB write for %s op", op); mainloop_set_trigger(cib_writer); } return pcmk_ok; } - crm_err("Ignoring invalid CIB"); + pcmk__err("Ignoring invalid CIB"); if (the_cib) { - crm_warn("Reverting to last known CIB"); + pcmk__warn("Reverting to last known CIB"); } else { - crm_crit("Could not write out new CIB and no saved version to revert to"); + pcmk__crit("Could not write out new CIB and no saved version to revert " + "to"); } return -ENODATA; } @@ -327,15 +332,15 @@ cib_diskwrite_complete(mainloop_child_t * p, pid_t pid, int core, int signo, int } if ((signo == 0) && (exitcode == 0)) { - crm_trace("Disk write [%d] succeeded", (int) pid); + pcmk__trace("Disk write [%d] succeeded", (int) pid); } else if (signo == 0) { - crm_err("%s: process %d exited %d", errmsg, (int) pid, exitcode); + pcmk__err("%s: process %d exited %d", errmsg, (int) pid, exitcode); } else { - crm_err("%s: process %d terminated with signal %d (%s)%s", - errmsg, (int) pid, signo, strsignal(signo), - (core? " and dumped core" : "")); + pcmk__err("%s: process %d terminated with signal %d (%s)%s", + errmsg, (int) pid, signo, strsignal(signo), + ((core != 0)? " and dumped core" : "")); } mainloop_trigger_complete(cib_writer); @@ -366,7 +371,8 @@ write_cib_contents(gpointer p) pid = fork(); if (pid < 0) { - crm_err("Disabling disk writes after fork failure: %s", pcmk_rc_str(errno)); + pcmk__err("Disabling disk writes after fork failure: %s", + pcmk_rc_str(errno)); cib_writes_enabled = FALSE; return FALSE; } diff --git a/daemons/based/based_messages.c b/daemons/based/based_messages.c index 596ccbc4e98..297c57c0076 100644 --- a/daemons/based/based_messages.c +++ b/daemons/based/based_messages.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -44,21 +44,21 @@ cib_process_shutdown_req(const char *op, int options, const char *section, xmlNo xmlNode * input, xmlNode * existing_cib, xmlNode ** result_cib, xmlNode ** answer) { - const char *host = crm_element_value(req, PCMK__XA_SRC); + const char *host = pcmk__xe_get(req, PCMK__XA_SRC); *answer = NULL; - if (crm_element_value(req, PCMK__XA_CIB_ISREPLYTO) == NULL) { - crm_info("Peer %s is requesting to shut down", host); + if (pcmk__xe_get(req, PCMK__XA_CIB_ISREPLYTO) == NULL) { + pcmk__info("Peer %s is requesting to shut down", host); return pcmk_ok; } if (cib_shutdown_flag == FALSE) { - crm_err("Peer %s mistakenly thinks we wanted to shut down", host); + pcmk__err("Peer %s mistakenly thinks we wanted to shut down", host); return -EINVAL; } - crm_info("Exiting after %s acknowledged our shutdown request", host); + pcmk__info("Exiting after %s acknowledged our shutdown request", host); terminate_cib(CRM_EX_OK); return pcmk_ok; } @@ -69,7 +69,7 @@ cib_process_noop(const char *op, int options, const char *section, xmlNode *req, xmlNode *input, xmlNode *existing_cib, xmlNode **result_cib, xmlNode **answer) { - crm_trace("Processing \"%s\" event", op); + pcmk__trace("Processing \"%s\" event", op); *answer = NULL; return pcmk_ok; } @@ -81,7 +81,7 @@ cib_process_readwrite(const char *op, int options, const char *section, xmlNode { int result = pcmk_ok; - crm_trace("Processing \"%s\" event", op); + pcmk__trace("Processing \"%s\" event", op); // @COMPAT Pacemaker Remote clients <3.0.0 may send this if (pcmk__str_eq(op, PCMK__CIB_REQUEST_IS_PRIMARY, pcmk__str_none)) { @@ -95,14 +95,14 @@ cib_process_readwrite(const char *op, int options, const char *section, xmlNode if (pcmk__str_eq(op, PCMK__CIB_REQUEST_PRIMARY, pcmk__str_none)) { if (!based_is_primary) { - crm_info("We are now in R/W mode"); + pcmk__info("We are now in R/W mode"); based_is_primary = true; } else { - crm_debug("We are still in R/W mode"); + pcmk__debug("We are still in R/W mode"); } } else if (based_is_primary) { - crm_info("We are now in R/O mode"); + pcmk__info("We are now in R/O mode"); based_is_primary = false; } @@ -120,12 +120,12 @@ send_sync_request(const char *host) xmlNode *sync_me = pcmk__xe_create(NULL, "sync-me"); pcmk__node_status_t *peer = NULL; - crm_info("Requesting re-sync from %s", (host? host : "all peers")); + pcmk__info("Requesting re-sync from %s", (host? host : "all peers")); sync_in_progress = 1; - crm_xml_add(sync_me, PCMK__XA_T, PCMK__VALUE_CIB); - crm_xml_add(sync_me, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_SYNC_TO_ONE); - crm_xml_add(sync_me, PCMK__XA_CIB_DELEGATED_FROM, OUR_NODENAME); + pcmk__xe_set(sync_me, PCMK__XA_T, PCMK__VALUE_CIB); + pcmk__xe_set(sync_me, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_SYNC_TO_ONE); + pcmk__xe_set(sync_me, PCMK__XA_CIB_DELEGATED_FROM, OUR_NODENAME); if (host != NULL) { peer = pcmk__get_node(0, host, NULL, pcmk__node_search_cluster_member); @@ -138,18 +138,18 @@ int cib_process_ping(const char *op, int options, const char *section, xmlNode * req, xmlNode * input, xmlNode * existing_cib, xmlNode ** result_cib, xmlNode ** answer) { - const char *host = crm_element_value(req, PCMK__XA_SRC); - const char *seq = crm_element_value(req, PCMK__XA_CIB_PING_ID); + const char *host = pcmk__xe_get(req, PCMK__XA_SRC); + const char *seq = pcmk__xe_get(req, PCMK__XA_CIB_PING_ID); char *digest = pcmk__digest_xml(the_cib, true); xmlNode *wrapper = NULL; - crm_trace("Processing \"%s\" event %s from %s", op, seq, host); + pcmk__trace("Processing \"%s\" event %s from %s", op, seq, host); *answer = pcmk__xe_create(NULL, PCMK__XE_PING_RESPONSE); - crm_xml_add(*answer, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); - crm_xml_add(*answer, PCMK__XA_DIGEST, digest); - crm_xml_add(*answer, PCMK__XA_CIB_PING_ID, seq); + pcmk__xe_set(*answer, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(*answer, PCMK__XA_DIGEST, digest); + pcmk__xe_set(*answer, PCMK__XA_CIB_PING_ID, seq); wrapper = pcmk__xe_create(*answer, PCMK__XE_CIB_CALLDATA); @@ -171,11 +171,11 @@ cib_process_ping(const char *op, int options, const char *section, xmlNode * req ); } - crm_info("Reporting our current digest to %s: %s for %s.%s.%s", - host, digest, - crm_element_value(existing_cib, PCMK_XA_ADMIN_EPOCH), - crm_element_value(existing_cib, PCMK_XA_EPOCH), - crm_element_value(existing_cib, PCMK_XA_NUM_UPDATES)); + pcmk__info("Reporting our current digest to %s: %s for %s.%s.%s", + host, digest, + pcmk__xe_get(existing_cib, PCMK_XA_ADMIN_EPOCH), + pcmk__xe_get(existing_cib, PCMK_XA_EPOCH), + pcmk__xe_get(existing_cib, PCMK_XA_NUM_UPDATES)); free(digest); @@ -197,7 +197,7 @@ cib_process_upgrade_server(const char *op, int options, const char *section, xml *answer = NULL; - if (crm_element_value(req, PCMK__XA_CIB_SCHEMA_MAX) != NULL) { + if (pcmk__xe_get(req, PCMK__XA_CIB_SCHEMA_MAX) != NULL) { /* The originator of an upgrade request sends it to the DC, without * PCMK__XA_CIB_SCHEMA_MAX. If an upgrade is needed, the DC * re-broadcasts the request with PCMK__XA_CIB_SCHEMA_MAX, and each node @@ -208,39 +208,39 @@ cib_process_upgrade_server(const char *op, int options, const char *section, xml } else { xmlNode *scratch = pcmk__xml_copy(NULL, existing_cib); - const char *host = crm_element_value(req, PCMK__XA_SRC); + const char *host = pcmk__xe_get(req, PCMK__XA_SRC); const char *original_schema = NULL; const char *new_schema = NULL; - const char *client_id = crm_element_value(req, PCMK__XA_CIB_CLIENTID); - const char *call_opts = crm_element_value(req, PCMK__XA_CIB_CALLOPT); - const char *call_id = crm_element_value(req, PCMK__XA_CIB_CALLID); + const char *client_id = pcmk__xe_get(req, PCMK__XA_CIB_CLIENTID); + const char *call_opts = pcmk__xe_get(req, PCMK__XA_CIB_CALLOPT); + const char *call_id = pcmk__xe_get(req, PCMK__XA_CIB_CALLID); - crm_trace("Processing \"%s\" event", op); - original_schema = crm_element_value(existing_cib, - PCMK_XA_VALIDATE_WITH); + pcmk__trace("Processing \"%s\" event", op); + original_schema = pcmk__xe_get(existing_cib, PCMK_XA_VALIDATE_WITH); if (original_schema == NULL) { - crm_info("Rejecting upgrade request from %s: No " - PCMK_XA_VALIDATE_WITH, host); + pcmk__info("Rejecting upgrade request from %s: No " + PCMK_XA_VALIDATE_WITH, + host); return -pcmk_err_cib_corrupt; } rc = pcmk__update_schema(&scratch, NULL, true, true); rc = pcmk_rc2legacy(rc); - new_schema = crm_element_value(scratch, PCMK_XA_VALIDATE_WITH); + new_schema = pcmk__xe_get(scratch, PCMK_XA_VALIDATE_WITH); if (pcmk__cmp_schemas_by_name(new_schema, original_schema) > 0) { xmlNode *up = pcmk__xe_create(NULL, __func__); rc = pcmk_ok; - crm_notice("Upgrade request from %s verified", host); + pcmk__notice("Upgrade request from %s verified", host); - crm_xml_add(up, PCMK__XA_T, PCMK__VALUE_CIB); - crm_xml_add(up, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_UPGRADE); - crm_xml_add(up, PCMK__XA_CIB_SCHEMA_MAX, new_schema); - crm_xml_add(up, PCMK__XA_CIB_DELEGATED_FROM, host); - crm_xml_add(up, PCMK__XA_CIB_CLIENTID, client_id); - crm_xml_add(up, PCMK__XA_CIB_CALLOPT, call_opts); - crm_xml_add(up, PCMK__XA_CIB_CALLID, call_id); + pcmk__xe_set(up, PCMK__XA_T, PCMK__VALUE_CIB); + pcmk__xe_set(up, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_UPGRADE); + pcmk__xe_set(up, PCMK__XA_CIB_SCHEMA_MAX, new_schema); + pcmk__xe_set(up, PCMK__XA_CIB_DELEGATED_FROM, host); + pcmk__xe_set(up, PCMK__XA_CIB_CLIENTID, client_id); + pcmk__xe_set(up, PCMK__XA_CIB_CALLOPT, call_opts); + pcmk__xe_set(up, PCMK__XA_CIB_CALLID, call_id); pcmk__cluster_send_message(NULL, pcmk_ipc_based, up); @@ -257,23 +257,24 @@ cib_process_upgrade_server(const char *op, int options, const char *section, xml origin = pcmk__search_node_caches(0, host, NULL, pcmk__node_search_cluster_member); - crm_info("Rejecting upgrade request from %s: %s " - QB_XS " rc=%d peer=%s", host, pcmk_strerror(rc), rc, - (origin? origin->name : "lost")); + pcmk__info("Rejecting upgrade request from %s: %s " + QB_XS " rc=%d peer=%s", + host, pcmk_strerror(rc), rc, + ((origin != NULL)? origin->name : "lost")); if (origin) { xmlNode *up = pcmk__xe_create(NULL, __func__); - crm_xml_add(up, PCMK__XA_T, PCMK__VALUE_CIB); - crm_xml_add(up, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_UPGRADE); - crm_xml_add(up, PCMK__XA_CIB_DELEGATED_FROM, host); - crm_xml_add(up, PCMK__XA_CIB_ISREPLYTO, host); - crm_xml_add(up, PCMK__XA_CIB_CLIENTID, client_id); - crm_xml_add(up, PCMK__XA_CIB_CALLOPT, call_opts); - crm_xml_add(up, PCMK__XA_CIB_CALLID, call_id); - crm_xml_add_int(up, PCMK__XA_CIB_UPGRADE_RC, rc); + pcmk__xe_set(up, PCMK__XA_T, PCMK__VALUE_CIB); + pcmk__xe_set(up, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_UPGRADE); + pcmk__xe_set(up, PCMK__XA_CIB_DELEGATED_FROM, host); + pcmk__xe_set(up, PCMK__XA_CIB_ISREPLYTO, host); + pcmk__xe_set(up, PCMK__XA_CIB_CLIENTID, client_id); + pcmk__xe_set(up, PCMK__XA_CIB_CALLOPT, call_opts); + pcmk__xe_set(up, PCMK__XA_CIB_CALLID, call_id); + pcmk__xe_set_int(up, PCMK__XA_CIB_UPGRADE_RC, rc); if (!pcmk__cluster_send_message(origin, pcmk_ipc_based, up)) { - crm_warn("Could not send CIB upgrade result to %s", host); + pcmk__warn("Could not send CIB upgrade result to %s", host); } pcmk__xml_free(up); } @@ -320,15 +321,16 @@ cib_server_process_diff(const char *op, int options, const char *section, xmlNod &diff_del_admin_epoch, &diff_del_epoch, &diff_del_updates); sync_in_progress++; - crm_notice("Not applying diff %d.%d.%d -> %d.%d.%d (sync in progress)", - diff_del_admin_epoch, diff_del_epoch, diff_del_updates, - diff_add_admin_epoch, diff_add_epoch, diff_add_updates); + pcmk__notice("Not applying diff %d.%d.%d -> %d.%d.%d (sync in " + "progress)", + diff_del_admin_epoch, diff_del_epoch, diff_del_updates, + diff_add_admin_epoch, diff_add_epoch, diff_add_updates); return -pcmk_err_diff_resync; } rc = cib_process_diff(op, options, section, req, input, existing_cib, result_cib, answer); - crm_trace("result: %s (%d), %s", pcmk_strerror(rc), rc, - (based_is_primary? "primary": "secondary")); + pcmk__trace("result: %s (%d), %s", pcmk_strerror(rc), rc, + (based_is_primary? "primary": "secondary")); if ((rc == -pcmk_err_diff_resync) && !based_is_primary) { pcmk__xml_free(*result_cib); @@ -338,7 +340,7 @@ cib_server_process_diff(const char *op, int options, const char *section, xmlNod } else if (rc == -pcmk_err_diff_resync) { rc = -pcmk_err_diff_failed; if (options & cib_force_diff) { - crm_warn("Not requesting full refresh in R/W mode"); + pcmk__warn("Not requesting full refresh in R/W mode"); } } @@ -395,11 +397,9 @@ cib_msg_copy(xmlNode *msg) for (int lpc = 0; lpc < PCMK__NELEM(field_list); lpc++) { const char *field = field_list[lpc]; - const char *value = crm_element_value(msg, field); + const char *value = pcmk__xe_get(msg, field); - if (value != NULL) { - crm_xml_add(copy, field, value); - } + pcmk__xe_set(copy, field, value); } return copy; @@ -410,8 +410,8 @@ sync_our_cib(xmlNode * request, gboolean all) { int result = pcmk_ok; char *digest = NULL; - const char *host = crm_element_value(request, PCMK__XA_SRC); - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); + const char *host = pcmk__xe_get(request, PCMK__XA_SRC); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); pcmk__node_status_t *peer = NULL; xmlNode *replace_request = NULL; xmlNode *wrapper = NULL; @@ -419,27 +419,27 @@ sync_our_cib(xmlNode * request, gboolean all) CRM_CHECK(the_cib != NULL, return -EINVAL); CRM_CHECK(all || (host != NULL), return -EINVAL); - crm_debug("Syncing CIB to %s", all ? "all peers" : host); + pcmk__debug("Syncing CIB to %s", (all? "all peers" : host)); replace_request = cib_msg_copy(request); if (host != NULL) { - crm_xml_add(replace_request, PCMK__XA_CIB_ISREPLYTO, host); + pcmk__xe_set(replace_request, PCMK__XA_CIB_ISREPLYTO, host); } if (all) { pcmk__xe_remove_attr(replace_request, PCMK__XA_CIB_HOST); } - crm_xml_add(replace_request, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_REPLACE); + pcmk__xe_set(replace_request, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_REPLACE); // @TODO Keep for tracing, or drop? - crm_xml_add(replace_request, PCMK__XA_ORIGINAL_CIB_OP, op); + pcmk__xe_set(replace_request, PCMK__XA_ORIGINAL_CIB_OP, op); pcmk__xe_set_bool_attr(replace_request, PCMK__XA_CIB_UPDATE, true); - crm_xml_add(replace_request, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(replace_request, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); digest = pcmk__digest_xml(the_cib, true); - crm_xml_add(replace_request, PCMK__XA_DIGEST, digest); + pcmk__xe_set(replace_request, PCMK__XA_DIGEST, digest); wrapper = pcmk__xe_create(replace_request, PCMK__XE_CIB_CALLDATA); pcmk__xml_copy(wrapper, the_cib); @@ -466,8 +466,8 @@ cib_process_commit_transaction(const char *op, int options, const char *section, * On failure, our caller will free *result_cib. */ int rc = pcmk_rc_ok; - const char *client_id = crm_element_value(req, PCMK__XA_CIB_CLIENTID); - const char *origin = crm_element_value(req, PCMK__XA_SRC); + const char *client_id = pcmk__xe_get(req, PCMK__XA_CIB_CLIENTID); + const char *origin = pcmk__xe_get(req, PCMK__XA_SRC); pcmk__client_t *client = pcmk__find_client_by_id(client_id); rc = based_commit_transaction(input, client, origin, result_cib); @@ -475,8 +475,8 @@ cib_process_commit_transaction(const char *op, int options, const char *section, if (rc != pcmk_rc_ok) { char *source = based_transaction_source_str(client, origin); - crm_err("Could not commit transaction for %s: %s", - source, pcmk_rc_str(rc)); + pcmk__err("Could not commit transaction for %s: %s", source, + pcmk_rc_str(rc)); free(source); } return pcmk_rc2legacy(rc); @@ -499,13 +499,13 @@ cib_process_schemas(const char *op, int options, const char *section, xmlNode *r wrapper = pcmk__xe_first_child(req, PCMK__XE_CIB_CALLDATA, NULL, NULL); data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); if (data == NULL) { - crm_warn("No data specified in request"); + pcmk__warn("No data specified in request"); return -EPROTO; } - after_ver = crm_element_value(data, PCMK_XA_VERSION); + after_ver = pcmk__xe_get(data, PCMK_XA_VERSION); if (after_ver == NULL) { - crm_warn("No version specified in request"); + pcmk__warn("No version specified in request"); return -EPROTO; } diff --git a/daemons/based/based_notify.c b/daemons/based/based_notify.c index 04b8ae48438..0ca3ef4dc1b 100644 --- a/daemons/based/based_notify.c +++ b/daemons/based/based_notify.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -48,29 +48,29 @@ cib_notify_send_one(gpointer key, gpointer value, gpointer user_data) struct cib_notification_s *update = user_data; if (client->ipcs == NULL && client->remote == NULL) { - crm_warn("Skipping client with NULL channel"); + pcmk__warn("Skipping client with NULL channel"); return; } - type = crm_element_value(update->msg, PCMK__XA_SUBT); + type = pcmk__xe_get(update->msg, PCMK__XA_SUBT); CRM_LOG_ASSERT(type != NULL); - if (pcmk_is_set(client->flags, cib_notify_diff) + if (pcmk__is_set(client->flags, cib_notify_diff) && pcmk__str_eq(type, PCMK__VALUE_CIB_DIFF_NOTIFY, pcmk__str_none)) { do_send = TRUE; - } else if (pcmk_is_set(client->flags, cib_notify_confirm) + } else if (pcmk__is_set(client->flags, cib_notify_confirm) && pcmk__str_eq(type, PCMK__VALUE_CIB_UPDATE_CONFIRMATION, pcmk__str_none)) { do_send = TRUE; - } else if (pcmk_is_set(client->flags, cib_notify_pre) + } else if (pcmk__is_set(client->flags, cib_notify_pre) && pcmk__str_eq(type, PCMK__VALUE_CIB_PRE_NOTIFY, pcmk__str_none)) { do_send = TRUE; - } else if (pcmk_is_set(client->flags, cib_notify_post) + } else if (pcmk__is_set(client->flags, cib_notify_post) && pcmk__str_eq(type, PCMK__VALUE_CIB_POST_NOTIFY, pcmk__str_none)) { do_send = TRUE; @@ -82,21 +82,21 @@ cib_notify_send_one(gpointer key, gpointer value, gpointer user_data) rc = pcmk__ipc_send_iov(client, update->iov, crm_ipc_server_event); if (rc != pcmk_rc_ok) { - crm_warn("Could not notify client %s: %s " QB_XS " id=%s", - pcmk__client_name(client), pcmk_rc_str(rc), - client->id); + pcmk__warn("Could not notify client %s: %s " QB_XS " id=%s", + pcmk__client_name(client), pcmk_rc_str(rc), + client->id); } break; case pcmk__client_tls: case pcmk__client_tcp: - crm_debug("Sent %s notification to client %s (id %s)", - type, pcmk__client_name(client), client->id); + pcmk__debug("Sent %s notification to client %s (id %s)", type, + pcmk__client_name(client), client->id); pcmk__remote_send_xml(client->remote, update->msg); break; default: - crm_err("Unknown transport for client %s " - QB_XS " flags=%#016" PRIx64, - pcmk__client_name(client), client->flags); + pcmk__err("Unknown transport for client %s " + QB_XS " flags=%#016" PRIx64, + pcmk__client_name(client), client->flags); } } } @@ -117,8 +117,8 @@ cib_notify_send(const xmlNode *xml) pcmk__foreach_ipc_client(cib_notify_send_one, &update); } else { - crm_notice("Could not notify clients: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__notice("Could not notify clients: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); } pcmk_free_ipc_event(iov); } @@ -136,7 +136,7 @@ cib_diff_notify(const char *op, int result, const char *call_id, int del_epoch = 0; int del_admin_epoch = 0; - uint8_t log_level = LOG_TRACE; + uint8_t log_level = PCMK__LOG_TRACE; xmlNode *update_msg = NULL; xmlNode *wrapper = NULL; @@ -180,19 +180,19 @@ cib_diff_notify(const char *op, int result, const char *call_id, update_msg = pcmk__xe_create(NULL, PCMK__XE_NOTIFY); - crm_xml_add(update_msg, PCMK__XA_T, PCMK__VALUE_CIB_NOTIFY); - crm_xml_add(update_msg, PCMK__XA_SUBT, PCMK__VALUE_CIB_DIFF_NOTIFY); - crm_xml_add(update_msg, PCMK__XA_CIB_OP, op); - crm_xml_add(update_msg, PCMK__XA_CIB_CLIENTID, client_id); - crm_xml_add(update_msg, PCMK__XA_CIB_CLIENTNAME, client_name); - crm_xml_add(update_msg, PCMK__XA_CIB_CALLID, call_id); - crm_xml_add(update_msg, PCMK__XA_SRC, origin); - crm_xml_add_int(update_msg, PCMK__XA_CIB_RC, result); + pcmk__xe_set(update_msg, PCMK__XA_T, PCMK__VALUE_CIB_NOTIFY); + pcmk__xe_set(update_msg, PCMK__XA_SUBT, PCMK__VALUE_CIB_DIFF_NOTIFY); + pcmk__xe_set(update_msg, PCMK__XA_CIB_OP, op); + pcmk__xe_set(update_msg, PCMK__XA_CIB_CLIENTID, client_id); + pcmk__xe_set(update_msg, PCMK__XA_CIB_CLIENTNAME, client_name); + pcmk__xe_set(update_msg, PCMK__XA_CIB_CALLID, call_id); + pcmk__xe_set(update_msg, PCMK__XA_SRC, origin); + pcmk__xe_set_int(update_msg, PCMK__XA_CIB_RC, result); wrapper = pcmk__xe_create(update_msg, PCMK__XE_CIB_UPDATE_RESULT); pcmk__xml_copy(wrapper, diff); - crm_log_xml_trace(update_msg, "diff-notify"); + pcmk__log_xml_trace(update_msg, "diff-notify"); cib_notify_send(update_msg); pcmk__xml_free(update_msg); } diff --git a/daemons/based/based_remote.c b/daemons/based/based_remote.c index ea7378919bc..4581699bc11 100644 --- a/daemons/based/based_remote.c +++ b/daemons/based/based_remote.c @@ -67,7 +67,7 @@ static int cib_remote_msg(gpointer data); static void remote_connection_destroy(gpointer user_data) { - crm_info("No longer listening for remote connections"); + pcmk__info("No longer listening for remote connections"); return; } @@ -92,25 +92,25 @@ init_remote_listener(int port, gboolean encrypted) if (encrypted) { bool use_cert = pcmk__x509_enabled(); - crm_notice("Starting TLS listener on port %d", port); + pcmk__notice("Starting TLS listener on port %d", port); rc = pcmk__init_tls(&tls, true, use_cert ? GNUTLS_CRD_CERTIFICATE : GNUTLS_CRD_ANON); if (rc != pcmk_rc_ok) { return -1; } } else { - crm_warn("Starting plain-text listener on port %d", port); + pcmk__warn("Starting plain-text listener on port %d", port); } #ifndef HAVE_PAM - crm_warn("This build does not support remote administrators " - "because PAM support is not available"); + pcmk__warn("This build does not support remote administrators because PAM " + "support is not available"); #endif /* create server socket */ ssock = pcmk__assert_alloc(1, sizeof(int)); *ssock = socket(AF_INET, SOCK_STREAM, 0); if (*ssock == -1) { - crm_err("Listener socket creation failed: %s", pcmk_rc_str(errno)); + pcmk__err("Listener socket creation failed: %s", pcmk_rc_str(errno)); free(ssock); return -1; } @@ -119,8 +119,8 @@ init_remote_listener(int port, gboolean encrypted) optval = 1; rc = setsockopt(*ssock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); if (rc < 0) { - crm_err("Local address reuse not allowed on listener socket: %s", - pcmk_rc_str(errno)); + pcmk__err("Local address reuse not allowed on listener socket: %s", + pcmk_rc_str(errno)); } /* bind server socket */ @@ -129,20 +129,20 @@ init_remote_listener(int port, gboolean encrypted) saddr.sin_addr.s_addr = INADDR_ANY; saddr.sin_port = htons(port); if (bind(*ssock, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) { - crm_err("Cannot bind to listener socket: %s", pcmk_rc_str(errno)); + pcmk__err("Cannot bind to listener socket: %s", pcmk_rc_str(errno)); close(*ssock); free(ssock); return -2; } if (listen(*ssock, 10) == -1) { - crm_err("Cannot listen on socket: %s", pcmk_rc_str(errno)); + pcmk__err("Cannot listen on socket: %s", pcmk_rc_str(errno)); close(*ssock); free(ssock); return -3; } mainloop_add_fd("cib-remote", G_PRIORITY_DEFAULT, *ssock, ssock, &remote_listen_fd_callbacks); - crm_debug("Started listener on port %d", port); + pcmk__debug("Started listener on port %d", port); return *ssock; } @@ -151,23 +151,25 @@ static int check_group_membership(const char *usr, const char *grp) { int index = 0; - struct passwd *pwd = NULL; + gid_t gid = 0; struct group *group = NULL; + int rc = pcmk_rc_ok; - pwd = getpwnam(usr); - if (pwd == NULL) { - crm_notice("Rejecting remote client: '%s' is not a valid user", usr); + rc = pcmk__lookup_user(usr, NULL, &gid); + if (rc != pcmk_rc_ok) { + pcmk__notice("Rejecting remote client: could not find user '%s': %s", + usr, pcmk_rc_str(rc)); return FALSE; } - group = getgrgid(pwd->pw_gid); + group = getgrgid(gid); if (group != NULL && pcmk__str_eq(grp, group->gr_name, pcmk__str_none)) { return TRUE; } group = getgrnam(grp); if (group == NULL) { - crm_err("Rejecting remote client: '%s' is not a valid group", grp); + pcmk__err("Rejecting remote client: '%s' is not a valid group", grp); return FALSE; } @@ -182,8 +184,9 @@ check_group_membership(const char *usr, const char *grp) } } - crm_notice("Rejecting remote client: User '%s' is not a member of " - "group '%s'", usr, grp); + pcmk__notice("Rejecting remote client: User '%s' is not a member of group " + "'%s'", + usr, grp); return FALSE; } @@ -199,30 +202,32 @@ cib_remote_auth(xmlNode * login) } if (!pcmk__xe_is(login, PCMK__XE_CIB_COMMAND)) { - crm_warn("Rejecting remote client: Unrecognizable message " - "(element '%s' not '" PCMK__XE_CIB_COMMAND "')", login->name); - crm_log_xml_debug(login, "bad"); + pcmk__warn("Rejecting remote client: Unrecognizable message (element " + "'%s' not '" PCMK__XE_CIB_COMMAND "')", + login->name); + pcmk__log_xml_debug(login, "bad"); return FALSE; } - tmp = crm_element_value(login, PCMK_XA_OP); + tmp = pcmk__xe_get(login, PCMK_XA_OP); if (!pcmk__str_eq(tmp, "authenticate", pcmk__str_casei)) { - crm_warn("Rejecting remote client: Unrecognizable message " - "(operation '%s' not 'authenticate')", tmp); - crm_log_xml_debug(login, "bad"); + pcmk__warn("Rejecting remote client: Unrecognizable message (operation " + "'%s' not 'authenticate')", + tmp); + pcmk__log_xml_debug(login, "bad"); return FALSE; } - user = crm_element_value(login, PCMK_XA_USER); - pass = crm_element_value(login, PCMK__XA_PASSWORD); + user = pcmk__xe_get(login, PCMK_XA_USER); + pass = pcmk__xe_get(login, PCMK__XA_PASSWORD); if (!user || !pass) { - crm_warn("Rejecting remote client: No %s given", - ((user == NULL)? "username" : "password")); - crm_log_xml_debug(login, "bad"); + pcmk__warn("Rejecting remote client: No %s given", + ((user == NULL)? "username" : "password")); + pcmk__log_xml_debug(login, "bad"); return FALSE; } - crm_log_xml_debug(login, "auth"); + pcmk__log_xml_debug(login, "auth"); return check_group_membership(user, CRM_DAEMON_GROUP) && authenticate_user(user, pass); @@ -235,12 +240,12 @@ remote_auth_timeout_cb(gpointer data) client->remote->auth_timeout = 0; - if (pcmk_is_set(client->flags, pcmk__client_authenticated)) { + if (pcmk__is_set(client->flags, pcmk__client_authenticated)) { return FALSE; } mainloop_del_fd(client->remote->source); - crm_err("Remote client authentication timed out"); + pcmk__err("Remote client authentication timed out"); return FALSE; } @@ -267,7 +272,8 @@ cib_remote_listen(gpointer data) memset(&addr, 0, sizeof(addr)); csock = accept(ssock, (struct sockaddr *)&addr, &laddr); if (csock == -1) { - crm_warn("Could not accept remote connection: %s", pcmk_rc_str(errno)); + pcmk__warn("Could not accept remote connection: %s", + pcmk_rc_str(errno)); return TRUE; } @@ -275,9 +281,9 @@ cib_remote_listen(gpointer data) rc = pcmk__set_nonblocking(csock); if (rc != pcmk_rc_ok) { - crm_warn("Dropping remote connection from %s because " - "it could not be set to non-blocking: %s", - ipstr, pcmk_rc_str(rc)); + pcmk__warn("Dropping remote connection from %s because it could not be " + "set to non-blocking: %s", + ipstr, pcmk_rc_str(rc)); close(csock); return TRUE; } @@ -305,9 +311,9 @@ cib_remote_listen(gpointer data) new_client->remote->auth_timeout = pcmk__create_timer(REMOTE_AUTH_TIMEOUT, remote_auth_timeout_cb, new_client); - crm_info("%s connection from %s pending authentication for client %s", - ((ssock == remote_tls_fd)? "Encrypted" : "Clear-text"), - ipstr, new_client->id); + pcmk__info("%s connection from %s pending authentication for client %s", + ((ssock == remote_tls_fd)? "Encrypted" : "Clear-text"), ipstr, + new_client->id); new_client->remote->source = mainloop_add_fd("cib-remote-client", G_PRIORITY_DEFAULT, csock, new_client, @@ -326,11 +332,11 @@ cib_remote_connection_destroy(gpointer user_data) return; } - crm_trace("Cleaning up after client %s disconnect", - pcmk__client_name(client)); + pcmk__trace("Cleaning up after client %s disconnect", + pcmk__client_name(client)); num_clients--; - crm_trace("Num unfree'd clients: %d", num_clients); + pcmk__trace("Num unfree'd clients: %d", num_clients); switch (PCMK__CLIENT_TYPE(client)) { case pcmk__client_tcp: @@ -340,8 +346,8 @@ cib_remote_connection_destroy(gpointer user_data) if (client->remote->tls_session) { csock = pcmk__tls_get_client_sock(client->remote); - if (pcmk_is_set(client->flags, - pcmk__client_tls_handshake_complete)) { + if (pcmk__is_set(client->flags, + pcmk__client_tls_handshake_complete)) { gnutls_bye(client->remote->tls_session, GNUTLS_SHUT_WR); } gnutls_deinit(client->remote->tls_session); @@ -349,9 +355,9 @@ cib_remote_connection_destroy(gpointer user_data) } break; default: - crm_warn("Unknown transport for client %s " - QB_XS " flags=%#016" PRIx64, - pcmk__client_name(client), client->flags); + pcmk__warn("Unknown transport for client %s " + QB_XS " flags=%#016" PRIx64, + pcmk__client_name(client), client->flags); } if (csock >= 0) { @@ -360,7 +366,7 @@ cib_remote_connection_destroy(gpointer user_data) pcmk__free_client(client); - crm_trace("Freed the cib client"); + pcmk__trace("Freed the cib client"); if (cib_shutdown_flag) { cib_shutdown(0); @@ -372,7 +378,7 @@ static void cib_handle_remote_msg(pcmk__client_t *client, xmlNode *command) { if (!pcmk__xe_is(command, PCMK__XE_CIB_COMMAND)) { - crm_log_xml_trace(command, "bad"); + pcmk__log_xml_trace(command, "bad"); return; } @@ -385,24 +391,24 @@ cib_handle_remote_msg(pcmk__client_t *client, xmlNode *command) pcmk__xe_remove_attr(command, PCMK__XA_CIB_HOST); pcmk__xe_remove_attr(command, PCMK__XA_CIB_UPDATE); - crm_xml_add(command, PCMK__XA_T, PCMK__VALUE_CIB); - crm_xml_add(command, PCMK__XA_CIB_CLIENTID, client->id); - crm_xml_add(command, PCMK__XA_CIB_CLIENTNAME, client->name); - crm_xml_add(command, PCMK__XA_CIB_USER, client->user); + pcmk__xe_set(command, PCMK__XA_T, PCMK__VALUE_CIB); + pcmk__xe_set(command, PCMK__XA_CIB_CLIENTID, client->id); + pcmk__xe_set(command, PCMK__XA_CIB_CLIENTNAME, client->name); + pcmk__xe_set(command, PCMK__XA_CIB_USER, client->user); - if (crm_element_value(command, PCMK__XA_CIB_CALLID) == NULL) { - char *call_uuid = crm_generate_uuid(); + if (pcmk__xe_get(command, PCMK__XA_CIB_CALLID) == NULL) { + char *call_uuid = pcmk__generate_uuid(); /* fix the command */ - crm_xml_add(command, PCMK__XA_CIB_CALLID, call_uuid); + pcmk__xe_set(command, PCMK__XA_CIB_CALLID, call_uuid); free(call_uuid); } - if (crm_element_value(command, PCMK__XA_CIB_CALLOPT) == NULL) { - crm_xml_add_int(command, PCMK__XA_CIB_CALLOPT, 0); + if (pcmk__xe_get(command, PCMK__XA_CIB_CALLOPT) == NULL) { + pcmk__xe_set_int(command, PCMK__XA_CIB_CALLOPT, 0); } - crm_log_xml_trace(command, "Remote command: "); + pcmk__log_xml_trace(command, "Remote command: "); cib_common_callback_worker(0, 0, command, client, TRUE); } @@ -414,11 +420,11 @@ cib_remote_msg(gpointer data) int rc; const char *client_name = pcmk__client_name(client); - crm_trace("Remote %s message received for client %s", - pcmk__client_type_str(PCMK__CLIENT_TYPE(client)), client_name); + pcmk__trace("Remote %s message received for client %s", + pcmk__client_type_str(PCMK__CLIENT_TYPE(client)), client_name); if ((PCMK__CLIENT_TYPE(client) == pcmk__client_tls) - && !pcmk_is_set(client->flags, pcmk__client_tls_handshake_complete)) { + && !pcmk__is_set(client->flags, pcmk__client_tls_handshake_complete)) { int rc = pcmk__read_handshake_data(client); @@ -431,7 +437,8 @@ cib_remote_msg(gpointer data) return -1; } - crm_debug("Completed TLS handshake with remote client %s", client_name); + pcmk__debug("Completed TLS handshake with remote client %s", + client_name); pcmk__set_client_flags(client, pcmk__client_tls_handshake_complete); if (client->remote->auth_timeout) { g_source_remove(client->remote->auth_timeout); @@ -462,12 +469,13 @@ cib_remote_msg(gpointer data) default: /* Error */ - crm_trace("Error reading from remote client: %s", pcmk_rc_str(rc)); + pcmk__trace("Error reading from remote client: %s", + pcmk_rc_str(rc)); return -1; } /* must pass auth before we will process anything else */ - if (!pcmk_is_set(client->flags, pcmk__client_authenticated)) { + if (!pcmk__is_set(client->flags, pcmk__client_authenticated)) { xmlNode *reg; const char *user = NULL; @@ -480,21 +488,21 @@ cib_remote_msg(gpointer data) pcmk__set_client_flags(client, pcmk__client_authenticated); g_source_remove(client->remote->auth_timeout); client->remote->auth_timeout = 0; - client->name = crm_element_value_copy(command, PCMK_XA_NAME); + client->name = pcmk__xe_get_copy(command, PCMK_XA_NAME); - user = crm_element_value(command, PCMK_XA_USER); + user = pcmk__xe_get(command, PCMK_XA_USER); if (user) { client->user = pcmk__str_copy(user); } - crm_notice("Remote connection accepted for authenticated user %s " - QB_XS " client %s", - pcmk__s(user, ""), client_name); + pcmk__notice("Remote connection accepted for authenticated user %s " + QB_XS " client %s", + pcmk__s(user, ""), client_name); /* send ACK */ reg = pcmk__xe_create(NULL, PCMK__XE_CIB_RESULT); - crm_xml_add(reg, PCMK__XA_CIB_OP, CRM_OP_REGISTER); - crm_xml_add(reg, PCMK__XA_CIB_CLIENTID, client->id); + pcmk__xe_set(reg, PCMK__XA_CIB_OP, CRM_OP_REGISTER); + pcmk__xe_set(reg, PCMK__XA_CIB_CLIENTID, client->id); pcmk__remote_send_xml(client->remote, reg); pcmk__xml_free(reg); pcmk__xml_free(command); @@ -502,7 +510,7 @@ cib_remote_msg(gpointer data) command = pcmk__remote_message_xml(client->remote); if (command != NULL) { - crm_trace("Remote message received from client %s", client_name); + pcmk__trace("Remote message received from client %s", client_name); cib_handle_remote_msg(client, command); pcmk__xml_free(command); } @@ -541,19 +549,19 @@ construct_pam_passwd(int num_msg, const struct pam_message **msg, // Password requested break; case PAM_TEXT_INFO: - crm_info("PAM: %s", msg[0]->msg); + pcmk__info("PAM: %s", msg[0]->msg); data = NULL; break; case PAM_ERROR_MSG: /* In theory we should show msg[0]->msg, but that might * contain the password, which we don't want in the logs */ - crm_err("PAM reported an error"); + pcmk__err("PAM reported an error"); data = NULL; break; default: - crm_warn("Ignoring PAM message of unrecognized type %d", - msg[0]->msg_style); + pcmk__warn("Ignoring PAM message of unrecognized type %d", + msg[0]->msg_style); return PAM_CONV_ERR; } @@ -601,17 +609,17 @@ authenticate_user(const char *user, const char *passwd) rc = pam_start(pam_name, user, &p_conv, &pam_h); if (rc != PAM_SUCCESS) { - crm_warn("Rejecting remote client for user %s " - "because PAM initialization failed: %s", - user, pam_strerror(pam_h, rc)); + pcmk__warn("Rejecting remote client for user %s because PAM " + "initialization failed: %s", + user, pam_strerror(pam_h, rc)); goto bail; } // Check user credentials rc = pam_authenticate(pam_h, PAM_SILENT); if (rc != PAM_SUCCESS) { - crm_notice("Access for remote user %s denied: %s", - user, pam_strerror(pam_h, rc)); + pcmk__notice("Access for remote user %s denied: %s", user, + pam_strerror(pam_h, rc)); goto bail; } @@ -621,30 +629,31 @@ authenticate_user(const char *user, const char *passwd) */ rc = pam_get_item(pam_h, PAM_USER, &p_user); if (rc != PAM_SUCCESS) { - crm_warn("Rejecting remote client for user %s " - "because PAM failed to return final user name: %s", - user, pam_strerror(pam_h, rc)); + pcmk__warn("Rejecting remote client for user %s because PAM failed to " + "return final user name: %s", + user, pam_strerror(pam_h, rc)); goto bail; } if (p_user == NULL) { - crm_warn("Rejecting remote client for user %s " - "because PAM returned no final user name", user); + pcmk__warn("Rejecting remote client for user %s because PAM returned " + "no final user name", + user); goto bail; } // @TODO Why do we require these to match? if (!pcmk__str_eq(p_user, user, pcmk__str_none)) { - crm_warn("Rejecting remote client for user %s " - "because PAM returned different final user name %s", - user, p_user); + pcmk__warn("Rejecting remote client for user %s because PAM returned " + "different final user name %s", + user, p_user); goto bail; } // Check user account restrictions (expiration, etc.) rc = pam_acct_mgmt(pam_h, PAM_SILENT); if (rc != PAM_SUCCESS) { - crm_notice("Access for remote user %s denied: %s", - user, pam_strerror(pam_h, rc)); + pcmk__notice("Access for remote user %s denied: %s", user, + pam_strerror(pam_h, rc)); goto bail; } pass = true; @@ -654,8 +663,9 @@ authenticate_user(const char *user, const char *passwd) return pass; #else // @TODO Implement for non-PAM environments - crm_warn("Rejecting remote user %s because this build does not have " - "PAM support", user); + pcmk__warn("Rejecting remote user %s because this build does not have PAM " + "support", + user); return false; #endif } diff --git a/daemons/based/based_transaction.c b/daemons/based/based_transaction.c index 93c09b6797b..ca3c660dfea 100644 --- a/daemons/based/based_transaction.c +++ b/daemons/based/based_transaction.c @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the Pacemaker project contributors + * Copyright 2023-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -29,11 +29,11 @@ char * based_transaction_source_str(const pcmk__client_t *client, const char *origin) { if (client != NULL) { - return crm_strdup_printf("client %s (%s)%s%s", - pcmk__client_name(client), - pcmk__s(client->id, "unidentified"), - ((origin != NULL)? " on " : ""), - pcmk__s(origin, "")); + return pcmk__assert_asprintf("client %s (%s)%s%s", + pcmk__client_name(client), + pcmk__s(client->id, "unidentified"), + ((origin != NULL)? " on " : ""), + pcmk__s(origin, "")); } else { return pcmk__str_copy(pcmk__s(origin, "unknown source")); } @@ -61,13 +61,13 @@ process_transaction_requests(xmlNodePtr transaction, request != NULL; request = pcmk__xe_next(request, PCMK__XE_CIB_COMMAND)) { - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); - const char *host = crm_element_value(request, PCMK__XA_CIB_HOST); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); + const char *host = pcmk__xe_get(request, PCMK__XA_CIB_HOST); const cib__operation_t *operation = NULL; int rc = cib__get_operation(op, &operation); if (rc == pcmk_rc_ok) { - if (!pcmk_is_set(operation->flags, cib__op_attr_transaction) + if (!pcmk__is_set(operation->flags, cib__op_attr_transaction) || (host != NULL)) { rc = EOPNOTSUPP; @@ -81,16 +81,16 @@ process_transaction_requests(xmlNodePtr transaction, } if (rc != pcmk_rc_ok) { - crm_err("Aborting CIB transaction for %s due to failed %s request: " - "%s", - source, op, pcmk_rc_str(rc)); - crm_log_xml_info(request, "Failed request"); + pcmk__err("Aborting CIB transaction for %s due to failed %s " + "request: %s", + source, op, pcmk_rc_str(rc)); + pcmk__log_xml_info(request, "Failed request"); return rc; } - crm_trace("Applied %s request to transaction working CIB for %s", - op, source); - crm_log_xml_trace(request, "Successful request"); + pcmk__trace("Applied %s request to transaction working CIB for %s", op, + source); + pcmk__log_xml_trace(request, "Successful request"); } return pcmk_rc_ok; @@ -138,15 +138,15 @@ based_commit_transaction(xmlNodePtr transaction, const pcmk__client_t *client, *result_cib = pcmk__xml_copy(NULL, the_cib)); source = based_transaction_source_str(client, origin); - crm_trace("Committing transaction for %s to working CIB", source); + pcmk__trace("Committing transaction for %s to working CIB", source); // Apply all changes to a working copy of the CIB the_cib = *result_cib; rc = process_transaction_requests(transaction, client, origin); - crm_trace("Transaction commit %s for %s", - ((rc == pcmk_rc_ok)? "succeeded" : "failed"), source); + pcmk__trace("Transaction commit %s for %s", + ((rc == pcmk_rc_ok)? "succeeded" : "failed"), source); /* Some request types (for example, erase) may have freed the_cib (the * working copy) and pointed it at a new XML object. In that case, it diff --git a/daemons/based/pacemaker-based.c b/daemons/based/pacemaker-based.c index fad865a920d..967705ffe24 100644 --- a/daemons/based/pacemaker-based.c +++ b/daemons/based/pacemaker-based.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -59,7 +59,7 @@ static crm_exit_t exit_code = CRM_EX_OK; static void cib_enable_writes(int nsig) { - crm_info("(Re)enabling disk writes"); + pcmk__info("(Re)enabling disk writes"); cib_writes_enabled = TRUE; } @@ -74,52 +74,50 @@ cib_enable_writes(int nsig) static int setup_stand_alone(GError **error) { - int rc = 0; - struct passwd *pwentry = NULL; + uid_t uid = 0; + gid_t gid = 0; + int rc = pcmk_rc_ok; preserve_status = TRUE; cib_writes_enabled = FALSE; - errno = 0; - pwentry = getpwnam(CRM_DAEMON_USER); - if (pwentry == NULL) { + rc = pcmk__daemon_user(&uid, &gid); + if (rc != pcmk_rc_ok) { exit_code = CRM_EX_FATAL; - if (errno != 0) { - g_set_error(error, PCMK__EXITC_ERROR, exit_code, - "Error getting password DB entry for %s: %s", - CRM_DAEMON_USER, strerror(errno)); - return errno; - } g_set_error(error, PCMK__EXITC_ERROR, exit_code, - "Password DB entry for '%s' not found", CRM_DAEMON_USER); - return ENXIO; + "Error getting password DB entry for '%s': %s", + CRM_DAEMON_USER, pcmk_rc_str(rc)); + return rc; } - rc = setgid(pwentry->pw_gid); + rc = setgid(gid); if (rc < 0) { + rc = errno; exit_code = CRM_EX_FATAL; g_set_error(error, PCMK__EXITC_ERROR, exit_code, - "Could not set group to %d: %s", - pwentry->pw_gid, strerror(errno)); - return errno; + "Could not set group to %lld: %s", (long long) gid, + pcmk_rc_str(rc)); + return rc; } - rc = initgroups(CRM_DAEMON_USER, pwentry->pw_gid); + rc = initgroups(CRM_DAEMON_USER, gid); if (rc < 0) { + rc = errno; exit_code = CRM_EX_FATAL; g_set_error(error, PCMK__EXITC_ERROR, exit_code, - "Could not setup groups for user %d: %s", - pwentry->pw_uid, strerror(errno)); - return errno; + "Could not set up groups for user %lld: %s", + (long long) uid, pcmk_rc_str(rc)); + return rc; } - rc = setuid(pwentry->pw_uid); + rc = setuid(uid); if (rc < 0) { + rc = errno; exit_code = CRM_EX_FATAL; g_set_error(error, PCMK__EXITC_ERROR, exit_code, - "Could not set user to %d: %s", - pwentry->pw_uid, strerror(errno)); - return errno; + "Could not set user to %lld: %s", (long long) uid, + pcmk_rc_str(rc)); + return rc; } return pcmk_rc_ok; } @@ -228,12 +226,12 @@ main(int argc, char **argv) pcmk__cli_init_logging(PCMK__SERVER_BASED, args->verbosity); crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE); - crm_notice("Starting Pacemaker CIB manager"); + pcmk__notice("Starting Pacemaker CIB manager"); old_instance = crm_ipc_new(PCMK__SERVER_BASED_RO, 0); if (old_instance == NULL) { /* crm_ipc_new() will have already logged an error message with - * crm_err() + * pcmk__err() */ exit_code = CRM_EX_FATAL; goto done; @@ -243,8 +241,8 @@ main(int argc, char **argv) /* IPC end-point already up */ crm_ipc_close(old_instance); crm_ipc_destroy(old_instance); - crm_crit("Aborting start-up because another CIB manager instance is " - "already active"); + pcmk__crit("Aborting start-up because another CIB manager instance is " + "already active"); goto done; } else { /* not up or not authentic, we'll proceed either way */ @@ -262,12 +260,12 @@ main(int argc, char **argv) if (cib_root == NULL) { cib_root = g_strdup(CRM_CONFIG_DIR); } else { - crm_notice("Using custom config location: %s", cib_root); + pcmk__notice("Using custom config location: %s", cib_root); } if (!pcmk__daemon_can_write(cib_root, NULL)) { exit_code = CRM_EX_FATAL; - crm_err("Terminating due to bad permissions on %s", cib_root); + pcmk__err("Terminating due to bad permissions on %s", cib_root); g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "Bad permissions on %s (see logs for details)", cib_root); goto done; @@ -280,7 +278,8 @@ main(int argc, char **argv) // Run the main loop mainloop = g_main_loop_new(NULL, FALSE); - crm_notice("Pacemaker CIB manager successfully started and accepting connections"); + pcmk__notice("Pacemaker CIB manager successfully started and accepting " + "connections"); g_main_loop_run(mainloop); /* If main loop returned, clean up and exit. We disconnect in case @@ -328,11 +327,11 @@ cib_cs_dispatch(cpg_handle_t handle, xml = pcmk__xml_parse(data); if (xml == NULL) { - crm_err("Invalid XML: '%.120s'", data); + pcmk__err("Invalid XML: '%.120s'", data); free(data); return; } - crm_xml_add(xml, PCMK__XA_SRC, from); + pcmk__xe_set(xml, PCMK__XA_SRC, from); cib_peer_callback(xml, NULL); pcmk__xml_free(xml); @@ -343,10 +342,10 @@ static void cib_cs_destroy(gpointer user_data) { if (cib_shutdown_flag) { - crm_info("Corosync disconnection complete"); + pcmk__info("Corosync disconnection complete"); } else { - crm_crit("Exiting immediately after losing connection " - "to cluster layer"); + pcmk__crit("Exiting immediately after losing connection to cluster " + "layer"); terminate_cib(CRM_EX_DISCONNECT); } } @@ -362,7 +361,7 @@ cib_peer_update_callback(enum pcmk__node_update type, if (cib_shutdown_flag && (pcmk__cluster_num_active_nodes() < 2) && (pcmk__ipc_client_count() == 0)) { - crm_info("Exiting after no more peers or clients remain"); + pcmk__info("Exiting after no more peers or clients remain"); terminate_cib(-1); } break; @@ -388,7 +387,7 @@ cib_init(void) config_hash = pcmk__strkey_table(free, free); if (startCib("cib.xml") == FALSE) { - crm_crit("Cannot start CIB... terminating"); + pcmk__crit("Cannot start CIB... terminating"); crm_exit(CRM_EX_NOINPUT); } @@ -396,7 +395,7 @@ cib_init(void) pcmk__cluster_set_status_callback(&cib_peer_update_callback); if (pcmk_cluster_connect(crm_cluster) != pcmk_rc_ok) { - crm_crit("Cannot sign in to the cluster... terminating"); + pcmk__crit("Cannot sign in to the cluster... terminating"); crm_exit(CRM_EX_FATAL); } } @@ -422,13 +421,12 @@ startCib(const char *filename) cib_read_config(config_hash, cib); - pcmk__scan_port(crm_element_value(cib, PCMK_XA_REMOTE_TLS_PORT), &port); + pcmk__scan_port(pcmk__xe_get(cib, PCMK_XA_REMOTE_TLS_PORT), &port); if (port >= 0) { remote_tls_fd = init_remote_listener(port, TRUE); } - pcmk__scan_port(crm_element_value(cib, PCMK_XA_REMOTE_CLEAR_PORT), - &port); + pcmk__scan_port(pcmk__xe_get(cib, PCMK_XA_REMOTE_CLEAR_PORT), &port); if (port >= 0) { remote_fd = init_remote_listener(port, FALSE); } diff --git a/daemons/controld/controld_attrd.c b/daemons/controld/controld_attrd.c index eff8070818d..502ca313413 100644 --- a/daemons/controld/controld_attrd.c +++ b/daemons/controld/controld_attrd.c @@ -1,5 +1,5 @@ /* - * Copyright 2006-2024 the Pacemaker project contributors + * Copyright 2006-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -23,7 +23,7 @@ void controld_close_attrd_ipc(void) { if (attrd_api != NULL) { - crm_trace("Closing connection to " PCMK__SERVER_ATTRD); + pcmk__trace("Closing connection to " PCMK__SERVER_ATTRD); pcmk_disconnect_ipc(attrd_api); pcmk_free_ipc_api(attrd_api); attrd_api = NULL; @@ -39,8 +39,8 @@ node_type(bool is_remote) static inline const char * when(void) { - return pcmk_is_set(controld_globals.fsa_input_register, - R_SHUTDOWN)? " at shutdown" : ""; + return pcmk__is_set(controld_globals.fsa_input_register, + R_SHUTDOWN)? " at shutdown" : ""; } static void @@ -53,7 +53,7 @@ handle_attr_error(void) */ crmd_exit(CRM_EX_FATAL); - } else if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + } else if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { // Fast-track shutdown since unable to request via attribute register_fsa_input(C_FSA_INTERNAL, I_FAIL, NULL); } @@ -115,14 +115,15 @@ update_attrd_remote_node_removed(const char *host, const char *user_name) rc = pcmk_new_ipc_api(&attrd_api, pcmk_ipc_attrd); } if (rc == pcmk_rc_ok) { - crm_trace("Asking attribute manager to purge Pacemaker Remote node %s", - host); + pcmk__trace("Asking attribute manager to purge Pacemaker Remote node " + "%s", + host); rc = pcmk__attrd_api_purge(attrd_api, host, true); } if (rc != pcmk_rc_ok) { - crm_err("Could not purge Pacemaker Remote node %s " - "in attribute manager%s: %s " QB_XS " rc=%d", - host, when(), pcmk_rc_str(rc), rc); + pcmk__err("Could not purge Pacemaker Remote node %s in attribute " + "manager%s: %s " QB_XS " rc=%d", + host, when(), pcmk_rc_str(rc), rc); } } @@ -150,9 +151,10 @@ update_attrd_clear_failures(const char *host, const char *rsc, const char *op, if (op != NULL) { interval_desc = pcmk__s(interval_spec, "nonrecurring"); } - crm_err("Could not clear failure of %s %s for %s on %s node %s%s: %s " - QB_XS " rc=%d", interval_desc, pcmk__s(op, "operations"), - pcmk__s(rsc, "all resources"), node_type(is_remote_node), host, - when(), pcmk_rc_str(rc), rc); + pcmk__err("Could not clear failure of %s %s for %s on %s node %s%s: %s " + QB_XS " rc=%d", + interval_desc, pcmk__s(op, "operations"), + pcmk__s(rsc, "all resources"), node_type(is_remote_node), + host, when(), pcmk_rc_str(rc), rc); } } diff --git a/daemons/controld/controld_callbacks.c b/daemons/controld/controld_callbacks.c index fd70d85dcc1..a226cc8e4b1 100644 --- a/daemons/controld/controld_callbacks.c +++ b/daemons/controld/controld_callbacks.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -17,6 +17,7 @@ #include #include +#include // PCMK_SCORE_INFINITY #include #include #include @@ -30,14 +31,14 @@ void crmd_ha_msg_filter(xmlNode * msg) { if (AM_I_DC) { - const char *sys_from = crm_element_value(msg, PCMK__XA_CRM_SYS_FROM); + const char *sys_from = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_FROM); if (pcmk__str_eq(sys_from, CRM_SYSTEM_DC, pcmk__str_casei)) { - const char *from = crm_element_value(msg, PCMK__XA_SRC); + const char *from = pcmk__xe_get(msg, PCMK__XA_SRC); if (!controld_is_local_node(from)) { int level = LOG_INFO; - const char *op = crm_element_value(msg, PCMK__XA_CRM_TASK); + const char *op = pcmk__xe_get(msg, PCMK__XA_CRM_TASK); /* make sure the election happens NOW */ if (controld_globals.fsa_state != S_ELECTION) { @@ -55,14 +56,14 @@ crmd_ha_msg_filter(xmlNode * msg) } } else { - const char *sys_to = crm_element_value(msg, PCMK__XA_CRM_SYS_TO); + const char *sys_to = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_TO); if (pcmk__str_eq(sys_to, CRM_SYSTEM_DC, pcmk__str_casei)) { return; } } - /* crm_log_xml_trace(msg, "HA[inbound]"); */ + // pcmk__log_xml_trace(msg, "HA[inbound]"); route_message(C_HA_MESSAGE, msg); done: @@ -82,7 +83,7 @@ crmd_ha_msg_filter(xmlNode * msg) static int node_alive(const pcmk__node_status_t *node) { - if (pcmk_is_set(node->flags, pcmk__node_status_remote)) { + if (pcmk__is_set(node->flags, pcmk__node_status_remote)) { // Pacemaker Remote nodes can't be partially alive if (pcmk__str_eq(node->state, PCMK_VALUE_MEMBER, pcmk__str_none)) { return 1; @@ -93,7 +94,7 @@ node_alive(const pcmk__node_status_t *node) // Completely up cluster node: both cluster member and peer return 1; - } else if (!pcmk_is_set(node->processes, crm_get_cluster_proc()) + } else if (!pcmk__is_set(node->processes, crm_get_cluster_proc()) && !pcmk__str_eq(node->state, PCMK_VALUE_MEMBER, pcmk__str_none)) { // Completely down cluster node: neither cluster member nor peer @@ -113,7 +114,7 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, { uint32_t old = 0; bool appeared = FALSE; - bool is_remote = pcmk_is_set(node->flags, pcmk__node_status_remote); + bool is_remote = pcmk__is_set(node->flags, pcmk__node_status_remote); controld_node_pending_timer(node); @@ -126,7 +127,7 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, } if ((type == pcmk__node_update_processes) - && pcmk_is_set(node->processes, crm_get_cluster_proc()) + && pcmk__is_set(node->processes, crm_get_cluster_proc()) && !AM_I_DC && !is_remote) { /* relay_message() on the recipient ignores these messages, but @@ -136,9 +137,9 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, NULL, CRM_SYSTEM_CRMD, CRM_OP_HELLO, NULL); - crm_debug("Sending hello to node %" PRIu32 " so that it learns our " - "node name", - node->cluster_layer_id); + pcmk__debug("Sending hello to node %" PRIu32 " so that it learns our " + "node name", + node->cluster_layer_id); pcmk__cluster_send_message(node, pcmk_ipc_controld, query); pcmk__xml_free(query); } @@ -150,9 +151,9 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, switch (type) { case pcmk__node_update_name: /* If we've never seen the node, then it also won't be in the status section */ - crm_info("%s node %s is now %s", - (is_remote? "Remote" : "Cluster"), - node->name, state_text(node->state)); + pcmk__info("%s node %s is now %s", + (is_remote? "Remote" : "Cluster"), node->name, + state_text(node->state)); return; case pcmk__node_update_state: @@ -162,9 +163,9 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, CRM_CHECK(!pcmk__str_eq(data, node->state, pcmk__str_casei), return); - crm_info("%s node %s is now %s (was %s)", - (is_remote? "Remote" : "Cluster"), - node->name, state_text(node->state), state_text(data)); + pcmk__info("%s node %s is now %s (was %s)", + (is_remote? "Remote" : "Cluster"), node->name, + state_text(node->state), state_text(data)); if (pcmk__str_eq(PCMK_VALUE_MEMBER, node->state, pcmk__str_none)) { appeared = TRUE; @@ -182,7 +183,7 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, case pcmk__node_update_processes: CRM_CHECK(data != NULL, return); old = *(const uint32_t *)data; - appeared = pcmk_is_set(node->processes, crm_get_cluster_proc()); + appeared = pcmk__is_set(node->processes, crm_get_cluster_proc()); { const char *dc_s = controld_globals.dc_name; @@ -191,18 +192,20 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, dc_s = PCMK_VALUE_TRUE; } - crm_info("Node %s is %s a peer " QB_XS - " DC=%s old=%#07x new=%#07x", - node->name, (appeared? "now" : "no longer"), - pcmk__s(dc_s, ""), old, node->processes); + pcmk__info("Node %s is %s a peer " QB_XS + " DC=%s old=%#07x new=%#07x", + node->name, (appeared? "now" : "no longer"), + pcmk__s(dc_s, ""), old, node->processes); } - if (!pcmk_is_set((node->processes ^ old), crm_get_cluster_proc())) { + if (!pcmk__is_set((node->processes ^ old), + crm_get_cluster_proc())) { /* Peer status did not change. This should not be possible, * since we don't track process flags other than peer status. */ - crm_trace("Process flag %#7x did not change from %#7x to %#7x", - crm_get_cluster_proc(), old, node->processes); + pcmk__trace("Process flag %#7x did not change from %#7x to " + "%#7x", + crm_get_cluster_proc(), old, node->processes); return; } @@ -213,19 +216,20 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, controld_remove_voter(node->name); } - if (!pcmk_is_set(controld_globals.fsa_input_register, - R_CIB_CONNECTED)) { - crm_trace("Ignoring peer status change because not connected to CIB"); + if (!pcmk__is_set(controld_globals.fsa_input_register, + R_CIB_CONNECTED)) { + pcmk__trace("Ignoring peer status change because not connected " + "to CIB"); return; } else if (controld_globals.fsa_state == S_STOPPING) { - crm_trace("Ignoring peer status change because stopping"); + pcmk__trace("Ignoring peer status change because stopping"); return; } if (!appeared && controld_is_local_node(node->name)) { /* Did we get evicted? */ - crm_notice("Our peer connection failed"); + pcmk__notice("Our peer connection failed"); register_fsa_input(C_CRMD_STATUS_CALLBACK, I_ERROR, NULL); } else if (pcmk__str_eq(node->name, controld_globals.dc_name, @@ -239,15 +243,15 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, * DC's expected state to down. This avoids fencing upon * deletion of its transient attributes. */ - crm_notice("Our peer on the DC (%s) is dead", - controld_globals.dc_name); + pcmk__notice("Our peer on the DC (%s) is dead", + controld_globals.dc_name); register_fsa_input(C_CRMD_STATUS_CALLBACK, I_ELECTION, NULL); controld_delete_node_state(node->name, controld_section_attrs, cib_none); } else if (AM_I_DC - || pcmk_is_set(controld_globals.flags, controld_dc_left) + || pcmk__is_set(controld_globals.flags, controld_dc_left) || (controld_globals.dc_name == NULL)) { /* This only needs to be done once, so normally the DC should do * it. However if there is no DC, every node must do it, since @@ -270,23 +274,24 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, int alive = node_alive(node); pcmk__graph_action_t *down = match_down_event(node->xml_id); - crm_trace("Alive=%d, appeared=%d, down=%d", - alive, appeared, (down? down->id : -1)); + pcmk__trace("Alive=%d, appeared=%d, down=%d", alive, appeared, + ((down != NULL)? down->id : -1)); if (appeared && (alive > 0) && !is_remote) { register_fsa_input_before(C_FSA_INTERNAL, I_NODE_JOIN, NULL); } if (down) { - const char *task = crm_element_value(down->xml, PCMK_XA_OPERATION); + const char *task = pcmk__xe_get(down->xml, PCMK_XA_OPERATION); if (pcmk__str_eq(task, PCMK_ACTION_STONITH, pcmk__str_casei)) { const bool confirmed = - pcmk_is_set(down->flags, pcmk__graph_action_confirmed); + pcmk__is_set(down->flags, pcmk__graph_action_confirmed); /* tengine_stonith_callback() confirms fence actions */ - crm_trace("Updating CIB %s fencer reported fencing of %s complete", - (confirmed? "after" : "before"), node->name); + pcmk__trace("Updating CIB %s fencer reported fencing of %s " + "complete", + (confirmed? "after" : "before"), node->name); } else if (!appeared && pcmk__str_eq(task, PCMK_ACTION_DO_SHUTDOWN, pcmk__str_casei)) { @@ -298,11 +303,13 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, check_join_state(controld_globals.fsa_state, __func__); } if (alive >= 0) { - crm_info("%s of peer %s is in progress " QB_XS " action=%d", - task, node->name, down->id); - } else { - crm_notice("%s of peer %s is complete " QB_XS " action=%d", + pcmk__info("%s of peer %s is in progress " + QB_XS " action=%d", task, node->name, down->id); + } else { + pcmk__notice("%s of peer %s is complete " + QB_XS " action=%d", + task, node->name, down->id); pcmk__update_graph(controld_globals.transition_graph, down); trigger_graph(); } @@ -317,18 +324,19 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, liveness = "dead"; } - crm_trace("Node %s is %s, was expected to %s (op %d)", - node->name, liveness, task, down->id); + pcmk__trace("Node %s is %s, was expected to %s (op %d)", + node->name, liveness, task, down->id); } } else if (appeared == FALSE) { if ((controld_globals.transition_graph == NULL) || (controld_globals.transition_graph->id <= 0)) { - crm_info("Stonith/shutdown of node %s is unknown to the " - "current DC", node->name); + pcmk__info("Stonith/shutdown of node %s is unknown to the " + "current DC", + node->name); } else { - crm_warn("Stonith/shutdown of node %s was not expected", - node->name); + pcmk__warn("Stonith/shutdown of node %s was not expected", + node->name); } if (!is_remote) { crm_update_peer_join(__func__, node, controld_join_none); @@ -340,8 +348,8 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, node->xml_id); } else { - crm_trace("Node %s came up, was not expected to be down", - node->name); + pcmk__trace("Node %s came up, was not expected to be down", + node->name); } if (is_remote) { @@ -372,7 +380,8 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, /* Update the CIB node state */ update = create_node_state_update(node, flags, NULL, __func__); if (update == NULL) { - crm_debug("Node state update not yet possible for %s", node->name); + pcmk__debug("Node state update not yet possible for %s", + node->name); } else { fsa_cib_anon_update(PCMK_XE_STATUS, update); } @@ -385,10 +394,10 @@ peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, gboolean crm_fsa_trigger(gpointer user_data) { - crm_trace("Invoked (queue len: %d)", - g_list_length(controld_globals.fsa_message_queue)); + pcmk__trace("Invoked (queue len: %u)", + g_list_length(controld_globals.fsa_message_queue)); s_crmd_fsa(C_FSA_INTERNAL); - crm_trace("Exited (queue len: %d)", - g_list_length(controld_globals.fsa_message_queue)); + pcmk__trace("Exited (queue len: %u)", + g_list_length(controld_globals.fsa_message_queue)); return TRUE; } diff --git a/daemons/controld/controld_cib.c b/daemons/controld/controld_cib.c index 122e5d81446..559a2d11079 100644 --- a/daemons/controld/controld_cib.c +++ b/daemons/controld/controld_cib.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,6 +12,7 @@ #include /* sleep */ #include +#include // crm_meta_value() #include #include #include @@ -35,14 +36,14 @@ handle_cib_disconnect(gpointer user_data) controld_trigger_fsa(); controld_globals.cib_conn->state = cib_disconnected; - if (pcmk_is_set(controld_globals.fsa_input_register, R_CIB_CONNECTED)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_CIB_CONNECTED)) { // @TODO This should trigger a reconnect, not a shutdown - crm_crit("Lost connection to the CIB manager, shutting down"); + pcmk__crit("Lost connection to the CIB manager, shutting down"); register_fsa_input(C_FSA_INTERNAL, I_ERROR, NULL); controld_clear_fsa_input_flags(R_CIB_CONNECTED); } else { // Expected - crm_info("Disconnected from the CIB manager"); + pcmk__info("Disconnected from the CIB manager"); } } @@ -52,7 +53,7 @@ do_cib_updated(const char *event, xmlNode * msg) const xmlNode *patchset = NULL; const char *client_name = NULL; - crm_debug("Received CIB diff notification: DC=%s", pcmk__btoa(AM_I_DC)); + pcmk__debug("Received CIB diff notification: DC=%s", pcmk__btoa(AM_I_DC)); if (cib__get_notify_patchset(msg, &patchset) != pcmk_rc_ok) { return; @@ -69,7 +70,7 @@ do_cib_updated(const char *event, xmlNode * msg) return; } - client_name = crm_element_value(msg, PCMK__XA_CIB_CLIENTNAME); + client_name = pcmk__xe_get(msg, PCMK__XA_CIB_CLIENTNAME); if (!cib__client_triggers_refresh(client_name)) { // The CIB is still accurate return; @@ -83,11 +84,11 @@ do_cib_updated(const char *event, xmlNode * msg) * process again so we get everyone's current resource history. */ if (client_name == NULL) { - client_name = crm_element_value(msg, PCMK__XA_CIB_CLIENTID); + client_name = pcmk__xe_get(msg, PCMK__XA_CIB_CLIENTID); } - crm_notice("Populating nodes and starting an election after %s event " - "triggered by %s", - event, pcmk__s(client_name, "(unidentified client)")); + pcmk__notice("Populating nodes and starting an election after %s event " + "triggered by %s", + event, pcmk__s(client_name, "(unidentified client)")); populate_cib_nodes(node_update_quick|node_update_all, __func__); register_fsa_input(C_FSA_INTERNAL, I_ELECTION, NULL); @@ -101,7 +102,7 @@ controld_disconnect_cib_manager(void) pcmk__assert(cib_conn != NULL); - crm_debug("Disconnecting from the CIB manager"); + pcmk__debug("Disconnecting from the CIB manager"); controld_clear_fsa_input_flags(R_CIB_CONNECTED); @@ -133,25 +134,25 @@ do_cib_control(long long action, pcmk__assert(cib_conn != NULL); - if (pcmk_is_set(action, A_CIB_STOP)) { + if (pcmk__is_set(action, A_CIB_STOP)) { if ((cib_conn->state != cib_disconnected) && (pending_rsc_update != 0)) { - crm_info("Waiting for resource update %d to complete", - pending_rsc_update); + pcmk__info("Waiting for resource update %d to complete", + pending_rsc_update); crmd_fsa_stall(FALSE); return; } controld_disconnect_cib_manager(); } - if (!pcmk_is_set(action, A_CIB_START)) { + if (!pcmk__is_set(action, A_CIB_START)) { return; } if (cur_state == S_STOPPING) { - crm_err("Ignoring request to connect to the CIB manager after " - "shutdown"); + pcmk__err("Ignoring request to connect to the CIB manager after " + "shutdown"); return; } @@ -166,34 +167,37 @@ do_cib_control(long long action, } if (rc != pcmk_ok) { - crm_info("Could not connect to the CIB manager: %s", pcmk_strerror(rc)); + pcmk__info("Could not connect to the CIB manager: %s", + pcmk_strerror(rc)); } else if (cib_conn->cmds->set_connection_dnotify(cib_conn, dnotify_fn) != pcmk_ok) { - crm_err("Could not set dnotify callback"); + pcmk__err("Could not set dnotify callback"); } else if (cib_conn->cmds->add_notify_callback(cib_conn, PCMK__VALUE_CIB_DIFF_NOTIFY, update_cb) != pcmk_ok) { - crm_err("Could not set CIB notification callback (update)"); + pcmk__err("Could not set CIB notification callback (update)"); } else { controld_set_fsa_input_flags(R_CIB_CONNECTED); cib_retries = 0; } - if (!pcmk_is_set(controld_globals.fsa_input_register, R_CIB_CONNECTED)) { + if (!pcmk__is_set(controld_globals.fsa_input_register, R_CIB_CONNECTED)) { cib_retries++; if (cib_retries < 30) { - crm_warn("Couldn't complete CIB registration %d times... " - "pause and retry", cib_retries); + pcmk__warn("Couldn't complete CIB registration %d times... pause " + "and retry", + cib_retries); controld_start_wait_timer(); crmd_fsa_stall(FALSE); } else { - crm_err("Could not complete CIB registration %d times... " - "hard error", cib_retries); + pcmk__err("Could not complete CIB registration %d times... hard " + "error", + cib_retries); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } } @@ -217,8 +221,8 @@ cib_op_timeout(void) + 1U); calculated_timeout = QB_MAX(calculated_timeout, MIN_CIB_OP_TIMEOUT); - crm_trace("Calculated timeout: %s", - pcmk__readable_interval(calculated_timeout * 1000)); + pcmk__trace("Calculated timeout: %s", + pcmk__readable_interval(calculated_timeout * 1000)); if (controld_globals.cib_conn) { controld_globals.cib_conn->call_timeout = calculated_timeout; @@ -239,8 +243,8 @@ crmd_cib_smart_opt(void) if ((controld_globals.fsa_state == S_ELECTION) || (controld_globals.fsa_state == S_PENDING)) { - crm_info("Sending update to local CIB in state: %s", - fsa_state2string(controld_globals.fsa_state)); + pcmk__info("Sending update to local CIB in state: %s", + fsa_state2string(controld_globals.fsa_state)); cib__set_call_options(call_opt, "update", cib_none); } return call_opt; @@ -253,10 +257,12 @@ cib_delete_callback(xmlNode *msg, int call_id, int rc, xmlNode *output, char *desc = user_data; if (rc == 0) { - crm_debug("Deletion of %s (via CIB call %d) succeeded", desc, call_id); + pcmk__debug("Deletion of %s (via CIB call %d) succeeded", desc, + call_id); } else { - crm_warn("Deletion of %s (via CIB call %d) failed: %s " QB_XS " rc=%d", - desc, call_id, pcmk_strerror(rc), rc); + pcmk__warn("Deletion of %s (via CIB call %d) failed: %s " + QB_XS " rc=%d", + desc, call_id, pcmk_strerror(rc), rc); } } @@ -311,25 +317,25 @@ controld_node_state_deletion_strings(const char *uname, switch (section) { case controld_section_lrm: - *xpath = crm_strdup_printf(XPATH_NODE_LRM, uname); + *xpath = pcmk__assert_asprintf(XPATH_NODE_LRM, uname); desc_pre = "resource history"; break; case controld_section_lrm_unlocked: - *xpath = crm_strdup_printf(XPATH_NODE_LRM_UNLOCKED, - uname, uname, expire); + *xpath = pcmk__assert_asprintf(XPATH_NODE_LRM_UNLOCKED, uname, + uname, expire); desc_pre = "resource history (other than shutdown locks)"; break; case controld_section_attrs: - *xpath = crm_strdup_printf(XPATH_NODE_ATTRS, uname); + *xpath = pcmk__assert_asprintf(XPATH_NODE_ATTRS, uname); desc_pre = "transient attributes"; break; case controld_section_all: - *xpath = crm_strdup_printf(XPATH_NODE_ALL, uname); + *xpath = pcmk__assert_asprintf(XPATH_NODE_ALL, uname); desc_pre = "all state"; break; case controld_section_all_unlocked: - *xpath = crm_strdup_printf(XPATH_NODE_ALL_UNLOCKED, - uname, uname, expire, uname); + *xpath = pcmk__assert_asprintf(XPATH_NODE_ALL_UNLOCKED, uname, + uname, expire, uname); desc_pre = "all state (other than shutdown locks)"; break; default: @@ -339,7 +345,7 @@ controld_node_state_deletion_strings(const char *uname, } if (desc != NULL) { - *desc = crm_strdup_printf("%s for node %s", desc_pre, uname); + *desc = pcmk__assert_asprintf("%s for node %s", desc_pre, uname); } } @@ -368,8 +374,8 @@ controld_delete_node_state(const char *uname, enum controld_section_e section, cib_xpath|cib_multiple); cib_rc = cib->cmds->remove(cib, xpath, NULL, options); fsa_register_cib_callback(cib_rc, desc, cib_delete_callback); - crm_info("Deleting %s (via CIB call %d) " QB_XS " xpath=%s", - desc, cib_rc, xpath); + pcmk__info("Deleting %s (via CIB call %d) " QB_XS " xpath=%s", desc, cib_rc, + xpath); // CIB library handles freeing desc free(xpath); @@ -405,15 +411,15 @@ controld_delete_resource_history(const char *rsc_id, const char *node, CRM_CHECK((rsc_id != NULL) && (node != NULL), return EINVAL); - desc = crm_strdup_printf("resource history for %s on %s", rsc_id, node); + desc = pcmk__assert_asprintf("resource history for %s on %s", rsc_id, node); if (cib == NULL) { - crm_err("Unable to clear %s: no CIB connection", desc); + pcmk__err("Unable to clear %s: no CIB connection", desc); free(desc); return ENOTCONN; } // Ask CIB to delete the entry - xpath = crm_strdup_printf(XPATH_RESOURCE_HISTORY, node, rsc_id); + xpath = pcmk__assert_asprintf(XPATH_RESOURCE_HISTORY, node, rsc_id); cib->cmds->set_user(cib, user_name); rc = cib->cmds->remove(cib, xpath, NULL, call_options|cib_xpath); @@ -421,26 +427,26 @@ controld_delete_resource_history(const char *rsc_id, const char *node, if (rc < 0) { rc = pcmk_legacy2rc(rc); - crm_err("Could not delete resource status of %s on %s%s%s: %s " - QB_XS " rc=%d", rsc_id, node, - (user_name? " for user " : ""), (user_name? user_name : ""), - pcmk_rc_str(rc), rc); + pcmk__err("Could not delete resource status of %s on %s%s%s: %s " + QB_XS " rc=%d", + rsc_id, node, ((user_name != NULL)? " for user " : ""), + pcmk__s(user_name, ""), pcmk_rc_str(rc), rc); free(desc); free(xpath); return rc; } - if (pcmk_is_set(call_options, cib_sync_call)) { - if (pcmk_is_set(call_options, cib_dryrun)) { - crm_debug("Deletion of %s would succeed", desc); + if (pcmk__is_set(call_options, cib_sync_call)) { + if (pcmk__is_set(call_options, cib_dryrun)) { + pcmk__debug("Deletion of %s would succeed", desc); } else { - crm_debug("Deletion of %s succeeded", desc); + pcmk__debug("Deletion of %s succeeded", desc); } free(desc); } else { - crm_info("Clearing %s (via CIB call %d) " QB_XS " xpath=%s", - desc, rc, xpath); + pcmk__info("Clearing %s (via CIB call %d) " QB_XS " xpath=%s", desc, rc, + xpath); fsa_register_cib_callback(rc, desc, cib_delete_callback); // CIB library handles freeing desc } @@ -480,8 +486,9 @@ build_parameter_list(const lrmd_event_data_t *op, /* Consider all parameters only except private ones to be consistent with * what scheduler does with calculate_secure_digest(). */ - if (param_type == ra_param_private - && compare_version(controld_globals.dc_version, "3.16.0") >= 0) { + if ((param_type == ra_param_private) + && (pcmk__compare_versions(controld_globals.dc_version, + "3.16.0") >= 0)) { g_hash_table_foreach(op->params, hash2field, *result); pcmk__filter_op_for_digest(*result); } @@ -494,23 +501,24 @@ build_parameter_list(const lrmd_event_data_t *op, switch (param_type) { case ra_param_reloadable: - accept_for_list = !pcmk_is_set(param->rap_flags, param_type); + accept_for_list = !pcmk__is_set(param->rap_flags, param_type); accept_for_xml = accept_for_list; break; case ra_param_unique: - accept_for_list = pcmk_is_set(param->rap_flags, param_type); + accept_for_list = pcmk__is_set(param->rap_flags, param_type); accept_for_xml = accept_for_list; break; case ra_param_private: - accept_for_list = pcmk_is_set(param->rap_flags, param_type); + accept_for_list = pcmk__is_set(param->rap_flags, param_type); accept_for_xml = !accept_for_list; break; } if (accept_for_list) { - crm_trace("Attr %s is %s", param->rap_name, ra_param_flag2text(param_type)); + pcmk__trace("Attr %s is %s", param->rap_name, + ra_param_flag2text(param_type)); if (list == NULL) { // We will later search for " WORD ", so start list with a space @@ -519,19 +527,22 @@ build_parameter_list(const lrmd_event_data_t *op, pcmk__add_word(&list, 0, param->rap_name); } else { - crm_trace("Rejecting %s for %s", param->rap_name, ra_param_flag2text(param_type)); + pcmk__trace("Rejecting %s for %s", param->rap_name, + ra_param_flag2text(param_type)); } if (accept_for_xml) { const char *v = g_hash_table_lookup(op->params, param->rap_name); if (v != NULL) { - crm_trace("Adding attr %s=%s to the xml result", param->rap_name, v); - crm_xml_add(*result, param->rap_name, v); + pcmk__trace("Adding attr %s=%s to the xml result", + param->rap_name, v); + pcmk__xe_set(*result, param->rap_name, v); } } else { - crm_trace("Removing attr %s from the xml result", param->rap_name); + pcmk__trace("Removing attr %s from the xml result", + param->rap_name); pcmk__xe_remove_attr(*result, param->rap_name); } } @@ -558,14 +569,14 @@ append_restart_list(lrmd_event_data_t *op, struct ra_metadata_s *metadata, return; } - if (pcmk_is_set(metadata->ra_flags, ra_supports_reload_agent)) { + if (pcmk__is_set(metadata->ra_flags, ra_supports_reload_agent)) { /* Add parameters not marked reloadable to the PCMK__XA_OP_FORCE_RESTART * list */ list = build_parameter_list(op, metadata, ra_param_reloadable, &restart); - } else if (pcmk_is_set(metadata->ra_flags, ra_supports_legacy_reload)) { + } else if (pcmk__is_set(metadata->ra_flags, ra_supports_legacy_reload)) { /* @COMPAT pre-OCF-1.1 resource agents * * Before OCF 1.1, Pacemaker abused "unique=0" to indicate @@ -584,14 +595,14 @@ append_restart_list(lrmd_event_data_t *op, struct ra_metadata_s *metadata, * the resource supports reload, no matter if it actually supports any * reloadable parameters */ - crm_xml_add(update, PCMK__XA_OP_FORCE_RESTART, - (list == NULL)? "" : (const char *) list->str); - crm_xml_add(update, PCMK__XA_OP_RESTART_DIGEST, digest); + pcmk__xe_set(update, PCMK__XA_OP_FORCE_RESTART, + (list == NULL)? "" : (const char *) list->str); + pcmk__xe_set(update, PCMK__XA_OP_RESTART_DIGEST, digest); if ((list != NULL) && (list->len > 0)) { - crm_trace("%s: %s, %s", op->rsc_id, digest, (const char *) list->str); + pcmk__trace("%s: %s, %s", op->rsc_id, digest, list->str); } else { - crm_trace("%s: %s", op->rsc_id, digest); + pcmk__trace("%s: %s", op->rsc_id, digest); } if (list != NULL) { @@ -618,14 +629,14 @@ append_secure_list(lrmd_event_data_t *op, struct ra_metadata_s *metadata, if (list != NULL) { digest = pcmk__digest_operation(secure); - crm_xml_add(update, PCMK__XA_OP_SECURE_PARAMS, - (const char *) list->str); - crm_xml_add(update, PCMK__XA_OP_SECURE_DIGEST, digest); + pcmk__xe_set(update, PCMK__XA_OP_SECURE_PARAMS, + (const char *) list->str); + pcmk__xe_set(update, PCMK__XA_OP_SECURE_DIGEST, digest); - crm_trace("%s: %s, %s", op->rsc_id, digest, (const char *) list->str); + pcmk__trace("%s: %s, %s", op->rsc_id, digest, list->str); g_string_free(list, TRUE); } else { - crm_trace("%s: no secure parameters", op->rsc_id); + pcmk__trace("%s: no secure parameters", op->rsc_id); } pcmk__xml_free(secure); @@ -673,16 +684,16 @@ controld_add_resource_history_xml_as(const char *func, xmlNode *parent, if ((rsc == NULL) || (op->params == NULL) || !crm_op_needs_metadata(rsc->standard, op->op_type)) { - crm_trace("No digests needed for %s action on %s (params=%p rsc=%p)", - op->op_type, op->rsc_id, op->params, rsc); + pcmk__trace("No digests needed for %s action on %s (params=%p rsc=%p)", + op->op_type, op->rsc_id, op->params, rsc); return; } lrm_state = controld_get_executor_state(node_name, false); if (lrm_state == NULL) { - crm_warn("Cannot calculate digests for operation " PCMK__OP_FMT - " because we have no connection to executor for %s", - op->rsc_id, op->op_type, op->interval_ms, node_name); + pcmk__warn("Cannot calculate digests for operation " PCMK__OP_FMT + " because we have no connection to executor for %s", + op->rsc_id, op->op_type, op->interval_ms, node_name); return; } @@ -698,8 +709,8 @@ controld_add_resource_history_xml_as(const char *func, xmlNode *parent, return; } - crm_trace("Including additional digests for %s:%s:%s", - rsc->standard, rsc->provider, rsc->type); + pcmk__trace("Including additional digests for %s:%s:%s", rsc->standard, + rsc->provider, rsc->type); append_restart_list(op, metadata, xml_op, caller_version); append_secure_list(op, metadata, xml_op, caller_version); @@ -733,7 +744,7 @@ controld_record_pending_op(const char *node_name, const lrmd_rsc_info_t *rsc, // Check action's PCMK_META_RECORD_PENDING meta-attribute (defaults to true) record_pending = crm_meta_value(op->params, PCMK_META_RECORD_PENDING); - if ((record_pending != NULL) && !crm_is_true(record_pending)) { + if ((record_pending != NULL) && !pcmk__is_true(record_pending)) { pcmk__warn_once(pcmk__wo_record_pending, "The " PCMK_META_RECORD_PENDING " option (for example, " "for the %s resource's %s operation) is deprecated and " @@ -748,9 +759,9 @@ controld_record_pending_op(const char *node_name, const lrmd_rsc_info_t *rsc, lrmd__set_result(op, PCMK_OCF_UNKNOWN, PCMK_EXEC_PENDING, NULL); - crm_debug("Recording pending %s-interval %s for %s on %s in the CIB", - pcmk__readable_interval(op->interval_ms), op->op_type, op->rsc_id, - node_name); + pcmk__debug("Recording pending %s-interval %s for %s on %s in the CIB", + pcmk__readable_interval(op->interval_ms), op->op_type, + op->rsc_id, node_name); controld_update_resource_history(node_name, rsc, op, 0); return true; } @@ -762,16 +773,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 history update completed (call=%d rc=%d)", - call_id, rc); + pcmk__trace("Resource history update completed (call=%d rc=%d)", + call_id, rc); break; default: if (call_id > 0) { - crm_warn("Resource history update %d failed: %s " - QB_XS " rc=%d", call_id, pcmk_strerror(rc), rc); + pcmk__warn("Resource history update %d failed: %s " + QB_XS " rc=%d", + call_id, pcmk_strerror(rc), rc); } else { - crm_warn("Resource history update failed: %s " QB_XS " rc=%d", - pcmk_strerror(rc), rc); + pcmk__warn("Resource history update failed: %s " QB_XS " rc=%d", + pcmk_strerror(rc), rc); } } @@ -788,7 +800,7 @@ cib_rsc_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void *use static bool should_preserve_lock(lrmd_event_data_t *op) { - if (!pcmk_is_set(controld_globals.flags, controld_shutdown_lock_enabled)) { + if (!pcmk__is_set(controld_globals.flags, controld_shutdown_lock_enabled)) { return false; } if (!strcmp(op->op_type, PCMK_ACTION_STOP) && (op->rc == PCMK_OCF_OK)) { @@ -827,15 +839,15 @@ controld_update_cib(const char *section, xmlNode *data, int options, if (cib != NULL) { cib_rc = cib->cmds->modify(cib, section, data, options); if (cib_rc >= 0) { - crm_debug("Submitted CIB update %d for %s section", - cib_rc, section); + pcmk__debug("Submitted CIB update %d for %s section", cib_rc, + section); } } if (callback == NULL) { if (cib_rc < 0) { - crm_err("Failed to update CIB %s section: %s", - section, pcmk_rc_str(pcmk_legacy2rc(cib_rc))); + pcmk__err("Failed to update CIB %s section: %s", section, + pcmk_rc_str(pcmk_legacy2rc(cib_rc))); } } else { @@ -878,7 +890,7 @@ controld_update_resource_history(const char *node_name, CRM_CHECK((node_name != NULL) && (op != NULL), return); if (rsc == NULL) { - crm_warn("Resource %s no longer exists in the executor", op->rsc_id); + pcmk__warn("Resource %s no longer exists in the executor", op->rsc_id); controld_ack_event_directly(NULL, NULL, rsc, op, op->rsc_id); return; } @@ -894,23 +906,23 @@ controld_update_resource_history(const char *node_name, node_id = node_name; pcmk__xe_set_bool_attr(xml, PCMK_XA_REMOTE_NODE, true); } - crm_xml_add(xml, PCMK_XA_ID, node_id); - crm_xml_add(xml, PCMK_XA_UNAME, node_name); - crm_xml_add(xml, PCMK_XA_CRM_DEBUG_ORIGIN, __func__); + pcmk__xe_set(xml, PCMK_XA_ID, node_id); + pcmk__xe_set(xml, PCMK_XA_UNAME, node_name); + pcmk__xe_set(xml, PCMK_XA_CRM_DEBUG_ORIGIN, __func__); // xml = pcmk__xe_create(xml, PCMK__XE_LRM); - crm_xml_add(xml, PCMK_XA_ID, node_id); + pcmk__xe_set(xml, PCMK_XA_ID, node_id); // xml = pcmk__xe_create(xml, PCMK__XE_LRM_RESOURCES); // xml = pcmk__xe_create(xml, PCMK__XE_LRM_RESOURCE); - crm_xml_add(xml, PCMK_XA_ID, op->rsc_id); - crm_xml_add(xml, PCMK_XA_CLASS, rsc->standard); - crm_xml_add(xml, PCMK_XA_PROVIDER, rsc->provider); - crm_xml_add(xml, PCMK_XA_TYPE, rsc->type); + pcmk__xe_set(xml, PCMK_XA_ID, op->rsc_id); + pcmk__xe_set(xml, PCMK_XA_CLASS, rsc->standard); + pcmk__xe_set(xml, PCMK_XA_PROVIDER, rsc->provider); + pcmk__xe_set(xml, PCMK_XA_TYPE, rsc->type); if (lock_time != 0) { /* Actions on a locked resource should either preserve the lock by * recording it with the action result, or clear it. @@ -918,15 +930,15 @@ controld_update_resource_history(const char *node_name, if (!should_preserve_lock(op)) { lock_time = 0; } - crm_xml_add_ll(xml, PCMK_OPT_SHUTDOWN_LOCK, (long long) lock_time); + pcmk__xe_set_time(xml, PCMK_OPT_SHUTDOWN_LOCK, lock_time); } if (op->params != NULL) { container = g_hash_table_lookup(op->params, CRM_META "_" PCMK__META_CONTAINER); if (container != NULL) { - crm_trace("Resource %s is a part of container resource %s", - op->rsc_id, container); - crm_xml_add(xml, PCMK__META_CONTAINER, container); + pcmk__trace("Resource %s is a part of container resource %s", + op->rsc_id, container); + pcmk__xe_set(xml, PCMK__META_CONTAINER, container); } } @@ -937,7 +949,7 @@ controld_update_resource_history(const char *node_name, * discovered during the next election. Worst case, the node is wrongly * fenced for running a resource it isn't. */ - crm_log_xml_trace(update, __func__); + pcmk__log_xml_trace(update, __func__); controld_update_cib(PCMK_XE_STATUS, update, call_opt, cib_rsc_callback); pcmk__xml_free(update); } @@ -956,23 +968,24 @@ controld_delete_action_history(const lrmd_event_data_t *op) CRM_CHECK(op != NULL, return); xml_top = pcmk__xe_create(NULL, PCMK__XE_LRM_RSC_OP); - crm_xml_add_int(xml_top, PCMK__XA_CALL_ID, op->call_id); - crm_xml_add(xml_top, PCMK__XA_TRANSITION_KEY, op->user_data); + pcmk__xe_set_int(xml_top, PCMK__XA_CALL_ID, op->call_id); + pcmk__xe_set(xml_top, PCMK__XA_TRANSITION_KEY, op->user_data); if (op->interval_ms > 0) { char *op_id = pcmk__op_key(op->rsc_id, op->op_type, op->interval_ms); /* Avoid deleting last_failure too (if it was a result of this recurring op failing) */ - crm_xml_add(xml_top, PCMK_XA_ID, op_id); + pcmk__xe_set(xml_top, PCMK_XA_ID, op_id); free(op_id); } - crm_debug("Erasing resource operation history for " PCMK__OP_FMT " (call=%d)", - op->rsc_id, op->op_type, op->interval_ms, op->call_id); + pcmk__debug("Erasing resource operation history for " PCMK__OP_FMT + " (call=%d)", + op->rsc_id, op->op_type, op->interval_ms, op->call_id); controld_globals.cib_conn->cmds->remove(controld_globals.cib_conn, PCMK_XE_STATUS, xml_top, cib_none); - crm_log_xml_trace(xml_top, "op:cancel"); + pcmk__log_xml_trace(xml_top, "op:cancel"); pcmk__xml_free(xml_top); } @@ -1015,13 +1028,13 @@ controld_cib_delete_last_failure(const char *rsc_id, const char *node, // Generate XPath to match desired entry last_failure_key = pcmk__op_key(rsc_id, "last_failure", 0); if (action == NULL) { - xpath = crm_strdup_printf(XPATH_HISTORY_ID, node, rsc_id, - last_failure_key); + xpath = pcmk__assert_asprintf(XPATH_HISTORY_ID, node, rsc_id, + last_failure_key); } else { char *action_key = pcmk__op_key(rsc_id, action, interval_ms); - xpath = crm_strdup_printf(XPATH_HISTORY_ORIG, node, rsc_id, - last_failure_key, action_key); + xpath = pcmk__assert_asprintf(XPATH_HISTORY_ORIG, node, rsc_id, + last_failure_key, action_key); free(action_key); } free(last_failure_key); @@ -1049,10 +1062,10 @@ controld_delete_action_history_by_key(const char *rsc_id, const char *node, CRM_CHECK((rsc_id != NULL) && (node != NULL) && (key != NULL), return); if (call_id > 0) { - xpath = crm_strdup_printf(XPATH_HISTORY_CALL, node, rsc_id, key, - call_id); + xpath = pcmk__assert_asprintf(XPATH_HISTORY_CALL, node, rsc_id, key, + call_id); } else { - xpath = crm_strdup_printf(XPATH_HISTORY_ID, node, rsc_id, key); + xpath = pcmk__assert_asprintf(XPATH_HISTORY_ID, node, rsc_id, key); } controld_globals.cib_conn->cmds->remove(controld_globals.cib_conn, xpath, NULL, cib_xpath); diff --git a/daemons/controld/controld_cib.h b/daemons/controld/controld_cib.h index b8622d52280..90418945203 100644 --- a/daemons/controld/controld_cib.h +++ b/daemons/controld/controld_cib.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -22,7 +22,7 @@ static inline void fsa_cib_anon_update(const char *section, xmlNode *data) { if (controld_globals.cib_conn == NULL) { - crm_err("No CIB connection available"); + pcmk__err("No CIB connection available"); } else { controld_globals.cib_conn->cmds->modify(controld_globals.cib_conn, section, data, cib_can_create); @@ -32,7 +32,7 @@ fsa_cib_anon_update(const char *section, xmlNode *data) { static inline void fsa_cib_anon_update_discard_reply(const char *section, xmlNode *data) { if (controld_globals.cib_conn == NULL) { - crm_err("No CIB connection available"); + pcmk__err("No CIB connection available"); } else { controld_globals.cib_conn->cmds->modify(controld_globals.cib_conn, section, data, diff --git a/daemons/controld/controld_control.c b/daemons/controld/controld_control.c index ed4751b8d76..ede068b242e 100644 --- a/daemons/controld/controld_control.c +++ b/daemons/controld/controld_control.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -14,6 +14,7 @@ #include #include +#include // pcmk_unpack_nvpair_blocks() #include #include #include @@ -47,7 +48,7 @@ do_ha_control(long long action, if (action & A_HA_DISCONNECT) { pcmk_cluster_disconnect(controld_globals.cluster); - crm_info("Disconnected from the cluster"); + pcmk__info("Disconnected from the cluster"); controld_set_fsa_input_flags(R_HA_DISCONNECTED); } @@ -72,7 +73,7 @@ do_ha_control(long long action, pcmk__str_copy(pcmk__cluster_get_xml_id(node)); if (controld_globals.our_uuid == NULL) { - crm_err("Could not obtain local uuid"); + pcmk__err("Could not obtain local uuid"); registered = FALSE; } } @@ -85,12 +86,12 @@ do_ha_control(long long action, populate_cib_nodes(node_update_none, __func__); controld_clear_fsa_input_flags(R_HA_DISCONNECTED); - crm_info("Connected to the cluster"); + pcmk__info("Connected to the cluster"); } if (action & ~(A_HA_CONNECT | A_HA_DISCONNECT)) { - crm_err("Unexpected action %s in %s", fsa_action2string(action), - __func__); + pcmk__err("Unexpected action %s in %s", fsa_action2string(action), + __func__); } } @@ -116,8 +117,8 @@ do_shutdown_req(long long action, controld_set_fsa_input_flags(R_SHUTDOWN); //controld_set_fsa_input_flags(R_STAYDOWN); - crm_info("Sending shutdown request to all peers (DC is %s)", - pcmk__s(controld_globals.dc_name, "not set")); + pcmk__info("Sending shutdown request to all peers (DC is %s)", + pcmk__s(controld_globals.dc_name, "not set")); msg = pcmk__new_request(pcmk_ipc_controld, CRM_SYSTEM_CRMD, NULL, CRM_SYSTEM_CRMD, CRM_OP_SHUTDOWN_REQ, NULL); @@ -130,15 +131,15 @@ do_shutdown_req(long long action, void crmd_fast_exit(crm_exit_t exit_code) { - if (pcmk_is_set(controld_globals.fsa_input_register, R_STAYDOWN)) { - crm_warn("Inhibiting respawn " QB_XS " remapping exit code %d to %d", - exit_code, CRM_EX_FATAL); + if (pcmk__is_set(controld_globals.fsa_input_register, R_STAYDOWN)) { + pcmk__warn("Inhibiting respawn " QB_XS " remapping exit code %d to %d", + exit_code, CRM_EX_FATAL); exit_code = CRM_EX_FATAL; } else if ((exit_code == CRM_EX_OK) - && pcmk_is_set(controld_globals.fsa_input_register, - R_IN_RECOVERY)) { - crm_err("Could not recover from internal error"); + && pcmk__is_set(controld_globals.fsa_input_register, + R_IN_RECOVERY)) { + pcmk__err("Could not recover from internal error"); exit_code = CRM_EX_ERROR; } @@ -160,19 +161,20 @@ crmd_exit(crm_exit_t exit_code) static bool in_progress = FALSE; if (in_progress && (exit_code == CRM_EX_OK)) { - crm_debug("Exit is already in progress"); + pcmk__debug("Exit is already in progress"); return exit_code; } else if(in_progress) { - crm_notice("Error during shutdown process, exiting now with status %d (%s)", - exit_code, crm_exit_str(exit_code)); + pcmk__notice("Error during shutdown process, exiting now with status " + "%d (%s)", + exit_code, crm_exit_str(exit_code)); crm_write_blackbox(SIGTRAP, NULL); crmd_fast_exit(exit_code); } in_progress = TRUE; - crm_trace("Preparing to exit with status %d (%s)", - exit_code, crm_exit_str(exit_code)); + pcmk__trace("Preparing to exit with status %d (%s)", exit_code, + crm_exit_str(exit_code)); /* Suppress secondary errors resulting from us disconnecting everything */ controld_set_fsa_input_flags(R_HA_DISCONNECTED); @@ -180,7 +182,7 @@ crmd_exit(crm_exit_t exit_code) /* Close all IPC servers and clients to ensure any and all shared memory files are cleaned up */ if(ipcs) { - crm_trace("Closing IPC server"); + pcmk__trace("Closing IPC server"); mainloop_del_ipc_server(ipcs); ipcs = NULL; } @@ -190,7 +192,7 @@ crmd_exit(crm_exit_t exit_code) controld_disconnect_fencer(TRUE); if ((exit_code == CRM_EX_OK) && (controld_globals.mainloop == NULL)) { - crm_debug("No mainloop detected"); + pcmk__debug("No mainloop detected"); exit_code = CRM_EX_ERROR; } @@ -201,8 +203,8 @@ crmd_exit(crm_exit_t exit_code) * to report on - allowing real errors stand out */ if (exit_code != CRM_EX_OK) { - crm_notice("Forcing immediate exit with status %d (%s)", - exit_code, crm_exit_str(exit_code)); + pcmk__notice("Forcing immediate exit with status %d (%s)", exit_code, + crm_exit_str(exit_code)); crm_write_blackbox(SIGTRAP, NULL); crmd_fast_exit(exit_code); } @@ -213,10 +215,10 @@ crmd_exit(crm_exit_t exit_code) iter = iter->next) { fsa_data_t *fsa_data = (fsa_data_t *) iter->data; - crm_info("Dropping %s: [ state=%s cause=%s origin=%s ]", - fsa_input2string(fsa_data->fsa_input), - fsa_state2string(controld_globals.fsa_state), - fsa_cause2string(fsa_data->fsa_cause), fsa_data->origin); + pcmk__info("Dropping %s: [ state=%s cause=%s origin=%s ]", + fsa_input2string(fsa_data->fsa_input), + fsa_state2string(controld_globals.fsa_state), + fsa_cause2string(fsa_data->fsa_cause), fsa_data->origin); delete_fsa_input(fsa_data); } @@ -285,19 +287,21 @@ crmd_exit(crm_exit_t exit_code) /* no signals on final draining anymore */ mainloop_destroy_signal(SIGCHLD); - crm_trace("Draining mainloop %d %d", g_main_loop_is_running(mloop), g_main_context_pending(ctx)); + pcmk__trace("Draining mainloop %d %d", g_main_loop_is_running(mloop), + g_main_context_pending(ctx)); { int lpc = 0; while((g_main_context_pending(ctx) && lpc < 10)) { lpc++; - crm_trace("Iteration %d", lpc); + pcmk__trace("Iteration %d", lpc); g_main_context_dispatch(ctx); } } - crm_trace("Closing mainloop %d %d", g_main_loop_is_running(mloop), g_main_context_pending(ctx)); + pcmk__trace("Closing mainloop %d %d", g_main_loop_is_running(mloop), + g_main_context_pending(ctx)); g_main_loop_quit(mloop); /* Won't do anything yet, since we're inside it now */ @@ -315,8 +319,8 @@ crmd_exit(crm_exit_t exit_code) controld_globals.cluster = NULL; /* Graceful */ - crm_trace("Done preparing for exit with status %d (%s)", - exit_code, crm_exit_str(exit_code)); + pcmk__trace("Done preparing for exit with status %d (%s)", exit_code, + crm_exit_str(exit_code)); return exit_code; } @@ -328,9 +332,9 @@ do_exit(long long action, { crm_exit_t exit_code = CRM_EX_OK; - if (pcmk_is_set(action, A_EXIT_1)) { + if (pcmk__is_set(action, A_EXIT_1)) { exit_code = CRM_EX_ERROR; - crm_err("Exiting now due to errors"); + pcmk__err("Exiting now due to errors"); } verify_stopped(cur_state, LOG_ERR); crmd_exit(exit_code); @@ -344,7 +348,7 @@ do_startup(long long action, enum crmd_fsa_cause cause, enum crmd_fsa_state cur_state, enum crmd_fsa_input current_input, fsa_data_t * msg_data) { - crm_debug("Registering Signal Handlers"); + pcmk__debug("Registering Signal Handlers"); mainloop_add_signal(SIGTERM, crm_shutdown); mainloop_add_signal(SIGPIPE, sigpipe_ignore); @@ -354,7 +358,7 @@ do_startup(long long action, controld_init_fsa_trigger(); controld_init_transition_trigger(); - crm_debug("Creating CIB manager and executor objects"); + pcmk__debug("Creating CIB manager and executor objects"); controld_globals.cib_conn = cib_new(); lrm_state_init_local(); @@ -367,7 +371,7 @@ do_startup(long long action, static int32_t accept_controller_client(qb_ipcs_connection_t *c, uid_t uid, gid_t gid) { - crm_trace("Accepting new IPC client connection"); + pcmk__trace("Accepting new IPC client connection"); if (pcmk__new_client(c, uid, gid) == NULL) { return -ENOMEM; } @@ -395,10 +399,10 @@ dispatch_controller_ipc(qb_ipcs_connection_t * c, void *data, size_t size) pcmk__assert(client->user != NULL); pcmk__update_acl_user(msg, PCMK__XA_CRM_USER, client->user); - crm_xml_add(msg, PCMK__XA_CRM_SYS_FROM, client->id); + pcmk__xe_set(msg, PCMK__XA_CRM_SYS_FROM, client->id); if (controld_authorize_ipc_message(msg, client, NULL)) { - crm_trace("Processing IPC message from client %s", - pcmk__client_name(client)); + pcmk__trace("Processing IPC message from client %s", + pcmk__client_name(client)); route_message(C_IPC_MESSAGE, msg); } @@ -413,9 +417,9 @@ ipc_client_disconnected(qb_ipcs_connection_t *c) pcmk__client_t *client = pcmk__find_client(c); if (client) { - crm_trace("Disconnecting %sregistered client %s (%p/%p)", - (client->userdata? "" : "un"), pcmk__client_name(client), - c, client); + pcmk__trace("Disconnecting %sregistered client %s (%p/%p)", + (client->userdata? "" : "un"), pcmk__client_name(client), + c, client); free(client->userdata); pcmk__free_client(client); controld_trigger_fsa(); @@ -426,7 +430,7 @@ ipc_client_disconnected(qb_ipcs_connection_t *c) static void ipc_connection_destroyed(qb_ipcs_connection_t *c) { - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); ipc_client_disconnected(c); } @@ -436,7 +440,7 @@ do_stop(long long action, enum crmd_fsa_cause cause, enum crmd_fsa_state cur_state, enum crmd_fsa_input current_input, fsa_data_t * msg_data) { - crm_trace("Closing IPC server"); + pcmk__trace("Closing IPC server"); mainloop_del_ipc_server(ipcs); ipcs = NULL; register_fsa_input(C_FSA_INTERNAL, I_TERMINATE, NULL); } @@ -456,51 +460,56 @@ do_started(long long action, }; if (cur_state != S_STARTING) { - crm_err("Start cancelled... %s", fsa_state2string(cur_state)); + pcmk__err("Start cancelled... %s", fsa_state2string(cur_state)); return; - } else if (!pcmk_is_set(controld_globals.fsa_input_register, - R_MEMBERSHIP)) { - crm_info("Delaying start, no membership data (%.16llx)", R_MEMBERSHIP); + } else if (!pcmk__is_set(controld_globals.fsa_input_register, + R_MEMBERSHIP)) { + pcmk__info("Delaying start, no membership data (%.16llx)", + R_MEMBERSHIP); crmd_fsa_stall(TRUE); return; - } else if (!pcmk_is_set(controld_globals.fsa_input_register, - R_LRM_CONNECTED)) { - crm_info("Delaying start, not connected to executor (%.16llx)", R_LRM_CONNECTED); + } else if (!pcmk__is_set(controld_globals.fsa_input_register, + R_LRM_CONNECTED)) { + pcmk__info("Delaying start, not connected to executor (%.16llx)", + R_LRM_CONNECTED); crmd_fsa_stall(TRUE); return; - } else if (!pcmk_is_set(controld_globals.fsa_input_register, - R_CIB_CONNECTED)) { - crm_info("Delaying start, CIB not connected (%.16llx)", R_CIB_CONNECTED); + } else if (!pcmk__is_set(controld_globals.fsa_input_register, + R_CIB_CONNECTED)) { + pcmk__info("Delaying start, CIB not connected (%.16llx)", + R_CIB_CONNECTED); crmd_fsa_stall(TRUE); return; - } else if (!pcmk_is_set(controld_globals.fsa_input_register, - R_READ_CONFIG)) { - crm_info("Delaying start, Config not read (%.16llx)", R_READ_CONFIG); + } else if (!pcmk__is_set(controld_globals.fsa_input_register, + R_READ_CONFIG)) { + pcmk__info("Delaying start, Config not read (%.16llx)", R_READ_CONFIG); crmd_fsa_stall(TRUE); return; - } else if (!pcmk_is_set(controld_globals.fsa_input_register, R_PEER_DATA)) { - - crm_info("Delaying start, No peer data (%.16llx)", R_PEER_DATA); + } else if (!pcmk__is_set(controld_globals.fsa_input_register, + R_PEER_DATA)) { + pcmk__info("Delaying start, No peer data (%.16llx)", R_PEER_DATA); crmd_fsa_stall(TRUE); return; } - crm_debug("Init server comms"); + pcmk__debug("Init server comms"); ipcs = pcmk__serve_controld_ipc(&crmd_callbacks); if (ipcs == NULL) { - crm_err("Failed to create IPC server: shutting down and inhibiting respawn"); + pcmk__err("Failed to create IPC server: shutting down and inhibiting " + "respawn"); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } else { - crm_notice("Pacemaker controller successfully started and accepting connections"); + pcmk__notice("Pacemaker controller successfully started and accepting " + "connections"); } controld_set_fsa_input_flags(R_ST_REQUIRED); controld_timer_fencer_connect(GINT_TO_POINTER(TRUE)); @@ -516,7 +525,7 @@ do_recover(long long action, enum crmd_fsa_state cur_state, enum crmd_fsa_input current_input, fsa_data_t * msg_data) { controld_set_fsa_input_flags(R_IN_RECOVERY); - crm_warn("Fast-tracking shutdown in response to errors"); + pcmk__warn("Fast-tracking shutdown in response to errors"); register_fsa_input(C_FSA_INTERNAL, I_TERMINATE, NULL); } @@ -536,11 +545,13 @@ config_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void if (rc != pcmk_ok) { fsa_data_t *msg_data = NULL; - crm_err("Local CIB query resulted in an error: %s", pcmk_strerror(rc)); + pcmk__err("Local CIB query resulted in an error: %s", + pcmk_strerror(rc)); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); if (rc == -EACCES || rc == -pcmk_err_schema_validation) { - crm_err("The cluster is mis-configured - shutting down and staying down"); + pcmk__err("The cluster is mis-configured - shutting down and " + "staying down"); controld_set_fsa_input_flags(R_STAYDOWN); } goto bail; @@ -554,12 +565,12 @@ config_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void if (!crmconfig) { fsa_data_t *msg_data = NULL; - crm_err("Local CIB query for " PCMK_XE_CRM_CONFIG " section failed"); + pcmk__err("Local CIB query for " PCMK_XE_CRM_CONFIG " section failed"); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); goto bail; } - crm_debug("Call %d : Parsing CIB options", call_id); + pcmk__debug("Call %d : Parsing CIB options", call_id); config_hash = pcmk__strkey_table(free, free); pcmk_unpack_nvpair_blocks(crmconfig, PCMK_XE_CLUSTER_PROPERTY_SET, PCMK_VALUE_CIB_BOOTSTRAP_OPTIONS, &rule_input, @@ -589,7 +600,7 @@ config_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void } value = g_hash_table_lookup(config_hash, PCMK_OPT_SHUTDOWN_LOCK); - if (crm_is_true(value)) { + if (pcmk__is_true(value)) { controld_set_global_flags(controld_shutdown_lock_enabled); } else { controld_clear_global_flags(controld_shutdown_lock_enabled); @@ -634,7 +645,7 @@ void controld_trigger_config_as(const char *fn, int line) { if (config_read_trigger != NULL) { - crm_trace("%s:%d - Triggered config processing", fn, line); + pcmk__trace("%s:%d - Triggered config processing", fn, line); mainloop_set_trigger(config_read_trigger); } } @@ -649,7 +660,7 @@ crm_read_options(gpointer user_data) NULL, cib_xpath); fsa_register_cib_callback(call_id, NULL, config_query_callback); - crm_trace("Querying the CIB... call %d", call_id); + pcmk__trace("Querying the CIB... call %d", call_id); return TRUE; } @@ -676,8 +687,8 @@ crm_shutdown(int nsig) return; } - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { - crm_err("Escalating shutdown"); + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + pcmk__err("Escalating shutdown"); register_fsa_input_before(C_SHUTDOWN, I_ERROR, NULL); return; } diff --git a/daemons/controld/controld_corosync.c b/daemons/controld/controld_corosync.c index 61cf6293cc5..de80f714485 100644 --- a/daemons/controld/controld_corosync.c +++ b/daemons/controld/controld_corosync.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -44,21 +44,21 @@ crmd_cs_dispatch(cpg_handle_t handle, const struct cpg_name *groupName, xml = pcmk__xml_parse(data); if (xml == NULL) { - crm_err("Could not parse message content: %.100s", data); + pcmk__err("Could not parse message content: %.100s", data); free(data); return; } - crm_xml_add(xml, PCMK__XA_SRC, from); + pcmk__xe_set(xml, PCMK__XA_SRC, from); peer = pcmk__get_node(0, from, NULL, pcmk__node_search_cluster_member); - if (!pcmk_is_set(peer->processes, crm_proc_cpg)) { + if (!pcmk__is_set(peer->processes, crm_proc_cpg)) { /* If we can still talk to our peer process on that node, then it must * be part of the corosync membership */ - crm_warn("Receiving messages from a node we think is dead: " - "%s[%" PRIu32 "]", - peer->name, peer->cluster_layer_id); + pcmk__warn("Receiving messages from a node we think is dead: " + "%s[%" PRIu32 "]", + peer->name, peer->cluster_layer_id); crm_update_peer_proc(__func__, peer, crm_proc_cpg, PCMK_VALUE_ONLINE); } @@ -78,8 +78,8 @@ crmd_quorum_callback(unsigned long long seq, gboolean quorate) static void crmd_cs_destroy(gpointer user_data) { - if (!pcmk_is_set(controld_globals.fsa_input_register, R_HA_DISCONNECTED)) { - crm_crit("Lost connection to cluster layer, shutting down"); + if (!pcmk__is_set(controld_globals.fsa_input_register, R_HA_DISCONNECTED)) { + pcmk__crit("Lost connection to cluster layer, shutting down"); crmd_exit(CRM_EX_DISCONNECT); } } diff --git a/daemons/controld/controld_election.c b/daemons/controld/controld_election.c index e8651b78c1d..220f036c6cf 100644 --- a/daemons/controld/controld_election.c +++ b/daemons/controld/controld_election.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -81,7 +81,8 @@ do_election_vote(long long action, case S_RECOVERY: case S_STOPPING: case S_TERMINATE: - crm_warn("Not voting in election, we're in state %s", fsa_state2string(cur_state)); + pcmk__warn("Not voting in election, we're in state %s", + fsa_state2string(cur_state)); not_voting = TRUE; break; case S_ELECTION: @@ -89,12 +90,12 @@ do_election_vote(long long action, case S_RELEASE_DC: break; default: - crm_err("Broken? Voting in state %s", fsa_state2string(cur_state)); + pcmk__err("Broken? Voting in state %s", fsa_state2string(cur_state)); break; } if (not_voting == FALSE) { - if (pcmk_is_set(controld_globals.fsa_input_register, R_STARTING)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_STARTING)) { not_voting = TRUE; } } @@ -122,7 +123,8 @@ do_election_check(long long action, if (controld_globals.fsa_state == S_ELECTION) { election_check(controld_globals.cluster); } else { - crm_debug("Ignoring election check because we are not in an election"); + pcmk__debug("Ignoring election check because we are not in an " + "election"); } } @@ -137,8 +139,8 @@ do_election_count_vote(long long action, ha_msg_input_t *vote = fsa_typed_data(fsa_dt_ha_msg); if (pcmk__peer_cache == NULL) { - if (!pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { - crm_err("Internal error, no peer cache"); + if (!pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + pcmk__err("Internal error, no peer cache"); } return; } @@ -154,7 +156,7 @@ do_election_count_vote(long long action, case election_lost: update_dc(NULL); - if (pcmk_is_set(controld_globals.fsa_input_register, R_THE_DC)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_THE_DC)) { cib_t *cib_conn = controld_globals.cib_conn; register_fsa_input(C_FSA_INTERNAL, I_RELEASE_DC, NULL); @@ -166,7 +168,7 @@ do_election_count_vote(long long action, break; default: - crm_trace("Election message resulted in state %d", rc); + pcmk__trace("Election message resulted in state %d", rc); } } @@ -176,8 +178,8 @@ feature_update_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, vo if (rc != pcmk_ok) { fsa_data_t *msg_data = NULL; - crm_notice("Feature update failed: %s " QB_XS " rc=%d", - pcmk_strerror(rc), rc); + pcmk__notice("Feature update failed: %s " QB_XS " rc=%d", + pcmk_strerror(rc), rc); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } } @@ -208,7 +210,7 @@ do_dc_takeover(long long action, const char *cluster_layer_s = pcmk_cluster_layer_text(cluster_layer); pid_t watchdog = pcmk__locate_sbd(); - crm_info("Taking over DC status for this partition"); + pcmk__info("Taking over DC status for this partition"); controld_set_fsa_input_flags(R_THE_DC); execute_stonith_cleanup(); @@ -219,7 +221,7 @@ do_dc_takeover(long long action, cib_none); cib = pcmk__xe_create(NULL, PCMK_XE_CIB); - crm_xml_add(cib, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(cib, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); controld_update_cib(PCMK_XE_CIB, cib, cib_none, feature_update_callback); dc_takeover_update_attr(PCMK_OPT_HAVE_WATCHDOG, pcmk__btoa(watchdog)); @@ -252,13 +254,13 @@ do_dc_release(long long action, enum crmd_fsa_input current_input, fsa_data_t * msg_data) { if (action & A_DC_RELEASE) { - crm_debug("Releasing the role of DC"); + pcmk__debug("Releasing the role of DC"); controld_clear_fsa_input_flags(R_THE_DC); controld_expect_sched_reply(NULL); } else if (action & A_DC_RELEASED) { - crm_info("DC role released"); - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + pcmk__info("DC role released"); + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { xmlNode *update = NULL; pcmk__node_status_t *node = controld_get_local_node_status(); @@ -272,8 +274,8 @@ do_dc_release(long long action, register_fsa_input(C_FSA_INTERNAL, I_RELEASE_SUCCESS, NULL); } else { - crm_err("Unknown DC action %s", fsa_action2string(action)); + pcmk__err("Unknown DC action %s", fsa_action2string(action)); } - crm_trace("Am I still the DC? %s", pcmk__btoa(AM_I_DC)); + pcmk__trace("Am I still the DC? %s", pcmk__btoa(AM_I_DC)); } diff --git a/daemons/controld/controld_execd.c b/daemons/controld/controld_execd.c index b05c4810f2a..fe425a3b10b 100644 --- a/daemons/controld/controld_execd.c +++ b/daemons/controld/controld_execd.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -17,6 +17,7 @@ #include #include // lrmd_event_data_t, lrmd_rsc_info_t, etc. #include +#include // crm_meta_name() #include #include @@ -49,8 +50,8 @@ static gboolean lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_ static void lrm_connection_destroy(void) { - if (pcmk_is_set(controld_globals.fsa_input_register, R_LRM_CONNECTED)) { - crm_crit("Lost connection to local executor"); + if (pcmk__is_set(controld_globals.fsa_input_register, R_LRM_CONNECTED)) { + pcmk__crit("Lost connection to local executor"); register_fsa_input(C_FSA_INTERNAL, I_ERROR, NULL); controld_clear_fsa_input_flags(R_LRM_CONNECTED); } @@ -59,7 +60,7 @@ lrm_connection_destroy(void) static char * make_stop_id(const char *rsc, int call_id) { - return crm_strdup_printf("%s:%d", rsc, call_id); + return pcmk__assert_asprintf("%s:%d", rsc, call_id); } static void @@ -159,7 +160,8 @@ update_history_cache(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, lrmd_event_ rsc_history_t *entry = NULL; if (op->rsc_deleted) { - crm_debug("Purged history for '%s' after %s", op->rsc_id, op->op_type); + pcmk__debug("Purged history for '%s' after %s", op->rsc_id, + op->op_type); controld_delete_resource_history(op->rsc_id, lrm_state->node_name, NULL, crmd_cib_smart_opt()); return; @@ -169,7 +171,8 @@ update_history_cache(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, lrmd_event_ return; } - crm_debug("Updating history for '%s' with %s op", op->rsc_id, op->op_type); + pcmk__debug("Updating history for '%s' with %s op", op->rsc_id, + op->op_type); entry = g_hash_table_lookup(lrm_state->resource_history, op->rsc_id); if (entry == NULL && rsc) { @@ -183,7 +186,8 @@ update_history_cache(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, lrmd_event_ entry->rsc.provider = pcmk__str_copy(rsc->provider); } else if (entry == NULL) { - crm_info("Resource %s no longer exists, not updating cache", op->rsc_id); + pcmk__info("Resource %s no longer exists, not updating cache", + op->rsc_id); return; } @@ -191,14 +195,14 @@ update_history_cache(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, lrmd_event_ target_rc = rsc_op_expected_rc(op); if (op->op_status == PCMK_EXEC_CANCELLED) { if (op->interval_ms > 0) { - crm_trace("Removing cancelled recurring op: " PCMK__OP_FMT, - op->rsc_id, op->op_type, op->interval_ms); + pcmk__trace("Removing cancelled recurring op: " PCMK__OP_FMT, + op->rsc_id, op->op_type, op->interval_ms); history_remove_recurring_op(entry, op); return; } else { - crm_trace("Skipping " PCMK__OP_FMT " rc=%d, status=%d", - op->rsc_id, op->op_type, op->interval_ms, op->rc, - op->op_status); + pcmk__trace("Skipping " PCMK__OP_FMT " rc=%d, status=%d", + op->rsc_id, op->op_type, op->interval_ms, op->rc, + op->op_status); } } else if (did_rsc_op_fail(op, target_rc)) { @@ -233,16 +237,16 @@ update_history_cache(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, lrmd_event_ /* Ensure there are no duplicates */ history_remove_recurring_op(entry, op); - crm_trace("Adding recurring op: " PCMK__OP_FMT, - op->rsc_id, op->op_type, op->interval_ms); + pcmk__trace("Adding recurring op: " PCMK__OP_FMT, op->rsc_id, + op->op_type, op->interval_ms); entry->recurring_op_list = g_list_prepend(entry->recurring_op_list, lrmd_copy_event(op)); } else if ((entry->recurring_op_list != NULL) && !pcmk__str_eq(op->op_type, PCMK_ACTION_MONITOR, pcmk__str_casei)) { - crm_trace("Dropping %d recurring ops because of: " PCMK__OP_FMT, - g_list_length(entry->recurring_op_list), op->rsc_id, - op->op_type, op->interval_ms); + pcmk__trace("Dropping %u recurring ops because of: " PCMK__OP_FMT, + g_list_length(entry->recurring_op_list), op->rsc_id, + op->op_type, op->interval_ms); history_free_recurring_ops(entry); } } @@ -313,32 +317,33 @@ try_local_executor_connect(long long action, fsa_data_t *msg_data, { int rc = pcmk_rc_ok; - crm_debug("Connecting to the local executor"); + pcmk__debug("Connecting to the local executor"); // If we can connect, great rc = controld_connect_local_executor(lrm_state); if (rc == pcmk_rc_ok) { controld_set_fsa_input_flags(R_LRM_CONNECTED); - crm_info("Connection to the local executor established"); + pcmk__info("Connection to the local executor established"); return; } // Otherwise, if we can try again, set a timer to do so if (lrm_state->num_lrm_register_fails < MAX_LRM_REG_FAILS) { - crm_warn("Failed to connect to the local executor %d time%s " - "(%d max): %s", lrm_state->num_lrm_register_fails, - pcmk__plural_s(lrm_state->num_lrm_register_fails), - MAX_LRM_REG_FAILS, pcmk_rc_str(rc)); + pcmk__warn("Failed to connect to the local executor %d time%s " + "(%d max): %s", + lrm_state->num_lrm_register_fails, + pcmk__plural_s(lrm_state->num_lrm_register_fails), + MAX_LRM_REG_FAILS, pcmk_rc_str(rc)); controld_start_wait_timer(); crmd_fsa_stall(FALSE); return; } // Otherwise give up - crm_err("Failed to connect to the executor the max allowed " - "%d time%s: %s", lrm_state->num_lrm_register_fails, - pcmk__plural_s(lrm_state->num_lrm_register_fails), - pcmk_rc_str(rc)); + pcmk__err("Failed to connect to the executor the max allowed %d time%s: %s", + lrm_state->num_lrm_register_fails, + pcmk__plural_s(lrm_state->num_lrm_register_fails), + pcmk_rc_str(rc)); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } @@ -383,8 +388,8 @@ do_lrm_control(long long action, } if (action & ~(A_LRM_CONNECT | A_LRM_DISCONNECT)) { - crm_err("Unexpected action %s in %s", fsa_action2string(action), - __func__); + pcmk__err("Unexpected action %s in %s", fsa_action2string(action), + __func__); } } @@ -400,13 +405,13 @@ lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state, rsc_history_t *entry = NULL; active_op_t *pending = NULL; - crm_debug("Checking for active resources before exit"); + pcmk__debug("Checking for active resources before exit"); if (cur_state == S_TERMINATE) { log_level = LOG_ERR; when = "shutdown"; - } else if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + } else if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { when = "shutdown... waiting"; } @@ -417,8 +422,9 @@ lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state, guint nremaining = g_hash_table_size(lrm_state->active_ops); if (removed || nremaining) { - crm_notice("Stopped %u recurring operation%s at %s (%u remaining)", - removed, pcmk__plural_s(removed), when, nremaining); + pcmk__notice("Stopped %u recurring operation%s at %s (%u " + "remaining)", + removed, pcmk__plural_s(removed), when, nremaining); } } @@ -437,8 +443,8 @@ lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state, counter, pcmk__plural_s(counter), when); if ((cur_state == S_TERMINATE) - || !pcmk_is_set(controld_globals.fsa_input_register, - R_SENT_RSC_STOP)) { + || !pcmk__is_set(controld_globals.fsa_input_register, + R_SENT_RSC_STOP)) { g_hash_table_iter_init(&gIter, lrm_state->active_ops); while (g_hash_table_iter_next(&gIter, (gpointer*)&key, (gpointer*)&pending)) { do_crm_log(log_level, "Pending action: %s (%s)", key, pending->op_key); @@ -454,7 +460,7 @@ lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state, return rc; } - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { /* At this point we're not waiting, we're just shutting down */ when = "shutdown"; } @@ -468,9 +474,9 @@ lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state, counter++; if (log_level == LOG_ERR) { - crm_info("Found %s active at %s", entry->id, when); + pcmk__info("Found %s active at %s", entry->id, when); } else { - crm_trace("Found %s active at %s", entry->id, when); + pcmk__trace("Found %s active at %s", entry->id, when); } if (lrm_state->active_ops != NULL) { GHashTableIter hIter; @@ -478,17 +484,19 @@ lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state, g_hash_table_iter_init(&hIter, lrm_state->active_ops); while (g_hash_table_iter_next(&hIter, (gpointer*)&key, (gpointer*)&pending)) { if (pcmk__str_eq(entry->id, pending->rsc_id, pcmk__str_none)) { - crm_notice("%sction %s (%s) incomplete at %s", - pending->interval_ms == 0 ? "A" : "Recurring a", - key, pending->op_key, when); + const bool recurring = (pending->interval_ms != 0); + + pcmk__notice("%s %s (%s) incomplete at %s", + (recurring? "Recurring action" : "Action"), + key, pending->op_key, when); } } } } if (counter) { - crm_err("%d resource%s active at %s", - counter, (counter == 1)? " was" : "s were", when); + pcmk__err("%d resource%s active at %s", + counter, ((counter == 1)? " was" : "s were"), when); } return rc; @@ -504,8 +512,8 @@ is_rsc_active(lrm_state_t * lrm_state, const char *rsc_id) return FALSE; } - crm_trace("Processing %s: %s.%d=%d", rsc_id, entry->last->op_type, - entry->last->interval_ms, entry->last->rc); + pcmk__trace("Processing %s: %s.%d=%d", rsc_id, entry->last->op_type, + entry->last->interval_ms, entry->last->rc); if ((entry->last->rc == PCMK_OCF_OK) && pcmk__str_eq(entry->last->op_type, PCMK_ACTION_STOP, pcmk__str_casei)) { @@ -541,10 +549,10 @@ build_active_RAs(lrm_state_t * lrm_state, xmlNode * rsc_list) GList *gIter = NULL; xmlNode *xml_rsc = pcmk__xe_create(rsc_list, PCMK__XE_LRM_RESOURCE); - crm_xml_add(xml_rsc, PCMK_XA_ID, entry->id); - crm_xml_add(xml_rsc, PCMK_XA_TYPE, entry->rsc.type); - crm_xml_add(xml_rsc, PCMK_XA_CLASS, entry->rsc.standard); - crm_xml_add(xml_rsc, PCMK_XA_PROVIDER, entry->rsc.provider); + pcmk__xe_set(xml_rsc, PCMK_XA_ID, entry->id); + pcmk__xe_set(xml_rsc, PCMK_XA_TYPE, entry->rsc.type); + pcmk__xe_set(xml_rsc, PCMK_XA_CLASS, entry->rsc.standard); + pcmk__xe_set(xml_rsc, PCMK_XA_PROVIDER, entry->rsc.provider); if (entry->last && entry->last->params) { static const char *name = CRM_META "_" PCMK__META_CONTAINER; @@ -552,8 +560,9 @@ build_active_RAs(lrm_state_t * lrm_state, xmlNode * rsc_list) name); if (container) { - crm_trace("Resource %s is a part of container resource %s", entry->id, container); - crm_xml_add(xml_rsc, PCMK__META_CONTAINER, container); + pcmk__trace("Resource %s is a part of container resource %s", + entry->id, container); + pcmk__xe_set(xml_rsc, PCMK__META_CONTAINER, container); } } controld_add_resource_history_xml(xml_rsc, &(entry->rsc), entry->failed, @@ -580,7 +589,7 @@ controld_query_executor_state(void) lrm_state_t *lrm_state = controld_get_executor_state(NULL, false); if (!lrm_state) { - crm_err("Could not get executor state for local node"); + pcmk__err("Could not get executor state for local node"); return NULL; } @@ -595,13 +604,13 @@ controld_query_executor_state(void) } xml_data = pcmk__xe_create(xml_state, PCMK__XE_LRM); - crm_xml_add(xml_data, PCMK_XA_ID, peer->xml_id); + pcmk__xe_set(xml_data, PCMK_XA_ID, peer->xml_id); rsc_list = pcmk__xe_create(xml_data, PCMK__XE_LRM_RESOURCES); // Build a list of active (not necessarily running) resources build_active_RAs(lrm_state, rsc_list); - crm_log_xml_trace(xml_state, "Current executor state"); + pcmk__log_xml_trace(xml_state, "Current executor state"); return xml_state; } @@ -649,9 +658,10 @@ void controld_trigger_delete_refresh(const char *from_sys, const char *rsc_id) { if (!pcmk__str_eq(from_sys, CRM_SYSTEM_TENGINE, pcmk__str_casei)) { - char *now_s = crm_strdup_printf("%lld", (long long) time(NULL)); + char *now_s = pcmk__assert_asprintf("%lld", (long long) time(NULL)); - crm_debug("Triggering a refresh after %s cleaned %s", from_sys, rsc_id); + pcmk__debug("Triggering a refresh after %s cleaned %s", from_sys, + rsc_id); cib__update_node_attr(controld_globals.logger_out, controld_globals.cib_conn, cib_none, PCMK_XE_CRM_CONFIG, NULL, NULL, NULL, NULL, @@ -664,12 +674,12 @@ static void notify_deleted(lrm_state_t * lrm_state, ha_msg_input_t * input, const char *rsc_id, int rc) { lrmd_event_data_t *op = NULL; - const char *from_sys = crm_element_value(input->msg, PCMK__XA_CRM_SYS_FROM); - const char *from_host = crm_element_value(input->msg, PCMK__XA_SRC); + const char *from_sys = pcmk__xe_get(input->msg, PCMK__XA_CRM_SYS_FROM); + const char *from_host = pcmk__xe_get(input->msg, PCMK__XA_SRC); - crm_info("Notifying %s on %s that %s was%s deleted", - from_sys, (from_host? from_host : "localhost"), rsc_id, - ((rc == pcmk_ok)? "" : " not")); + pcmk__info("Notifying %s on %s that %s was%s deleted", from_sys, + pcmk__s(from_host, "localhost"), rsc_id, + ((rc == pcmk_ok)? "" : " not")); op = construct_op(lrm_state, input->xml, rsc_id, PCMK_ACTION_DELETE); controld_rc2event(op, pcmk_legacy2rc(rc)); controld_ack_event_directly(from_host, from_sys, NULL, op, rsc_id); @@ -697,8 +707,8 @@ lrm_remove_deleted_op(gpointer key, gpointer value, gpointer user_data) active_op_t *pending = value; if (pcmk__str_eq(rsc, pending->rsc_id, pcmk__str_none)) { - crm_info("Removing op %s:%d for deleted resource %s", - pending->op_key, pending->call_id, rsc); + pcmk__info("Removing op %s:%d for deleted resource %s", pending->op_key, + pending->call_id, rsc); return TRUE; } return FALSE; @@ -804,34 +814,34 @@ cancel_op(lrm_state_t * lrm_state, const char *rsc_id, const char *key, int op, pending = g_hash_table_lookup(lrm_state->active_ops, key); if (pending) { - if (remove && !pcmk_is_set(pending->flags, active_op_remove)) { + if (remove && !pcmk__is_set(pending->flags, active_op_remove)) { controld_set_active_op_flags(pending, active_op_remove); - crm_debug("Scheduling %s for removal", key); + pcmk__debug("Scheduling %s for removal", key); } - if (pcmk_is_set(pending->flags, active_op_cancelled)) { - crm_debug("Operation %s already cancelled", key); + if (pcmk__is_set(pending->flags, active_op_cancelled)) { + pcmk__debug("Operation %s already cancelled", key); free(local_key); return FALSE; } controld_set_active_op_flags(pending, active_op_cancelled); } else { - crm_info("No pending op found for %s", key); + pcmk__info("No pending op found for %s", key); free(local_key); return FALSE; } - crm_debug("Cancelling op %d for %s (%s)", op, rsc_id, key); + pcmk__debug("Cancelling op %d for %s (%s)", op, rsc_id, key); rc = lrm_state_cancel(lrm_state, pending->rsc_id, pending->op_type, pending->interval_ms); if (rc == pcmk_ok) { - crm_debug("Op %d for %s (%s): cancelled", op, rsc_id, key); + pcmk__debug("Op %d for %s (%s): cancelled", op, rsc_id, key); free(local_key); return TRUE; } - crm_debug("Op %d for %s (%s): Nothing to cancel", op, rsc_id, key); + pcmk__debug("Op %d for %s (%s): Nothing to cancel", op, rsc_id, key); /* The caller needs to make sure the entry is * removed from the active operations list * @@ -884,8 +894,8 @@ cancel_op_key(lrm_state_t * lrm_state, lrmd_rsc_info_t * rsc, const char *key, g removed = g_hash_table_foreach_remove(lrm_state->active_ops, cancel_action_by_key, &data); - crm_trace("Removed %u op cache entries, new size: %u", - removed, g_hash_table_size(lrm_state->active_ops)); + pcmk__trace("Removed %u op cache entries, new size: %u", + removed, g_hash_table_size(lrm_state->active_ops)); return data.done; } @@ -919,12 +929,13 @@ get_lrm_resource(lrm_state_t *lrm_state, const xmlNode *rsc_xml, return -ENOTCONN; } - crm_trace("Retrieving resource information for %s from the executor", id); + pcmk__trace("Retrieving resource information for %s from the executor", + id); *rsc_info = lrm_state_get_rsc_info(lrm_state, id, 0); // If resource isn't known by ID, try clone name, if provided if (!*rsc_info) { - const char *long_id = crm_element_value(rsc_xml, PCMK__XA_LONG_ID); + const char *long_id = pcmk__xe_get(rsc_xml, PCMK__XA_LONG_ID); if (long_id) { *rsc_info = lrm_state_get_rsc_info(lrm_state, long_id, 0); @@ -932,20 +943,20 @@ get_lrm_resource(lrm_state_t *lrm_state, const xmlNode *rsc_xml, } if ((*rsc_info == NULL) && do_create) { - const char *class = crm_element_value(rsc_xml, PCMK_XA_CLASS); - const char *provider = crm_element_value(rsc_xml, PCMK_XA_PROVIDER); - const char *type = crm_element_value(rsc_xml, PCMK_XA_TYPE); + const char *class = pcmk__xe_get(rsc_xml, PCMK_XA_CLASS); + const char *provider = pcmk__xe_get(rsc_xml, PCMK_XA_PROVIDER); + const char *type = pcmk__xe_get(rsc_xml, PCMK_XA_TYPE); int rc; - crm_trace("Registering resource %s with the executor", id); + pcmk__trace("Registering resource %s with the executor", id); rc = lrm_state_register_rsc(lrm_state, id, class, provider, type, lrmd_opt_drop_recurring); if (rc != pcmk_ok) { fsa_data_t *msg_data = NULL; - crm_err("Could not register resource %s with the executor on %s: %s " - QB_XS " rc=%d", - id, lrm_state->node_name, pcmk_strerror(rc), rc); + pcmk__err("Could not register resource %s with the executor on %s: " + "%s " QB_XS " rc=%d", + id, lrm_state->node_name, pcmk_strerror(rc), rc); /* Register this as an internal error if this involves the local * executor. Otherwise, we're likely dealing with an unresponsive @@ -969,20 +980,20 @@ delete_resource(lrm_state_t *lrm_state, const char *id, lrmd_rsc_info_t *rsc, { int rc = pcmk_ok; - crm_info("Removing resource %s from executor for %s%s%s", - id, sys, (user? " as " : ""), (user? user : "")); + pcmk__info("Removing resource %s from executor for %s%s%s", id, sys, + ((user != NULL)? " as " : ""), pcmk__s(user, "")); if (rsc && unregister) { rc = lrm_state_unregister_rsc(lrm_state, id, 0); } if (rc == pcmk_ok) { - crm_trace("Resource %s deleted from executor", id); + pcmk__trace("Resource %s deleted from executor", id); } else if (rc == -EINPROGRESS) { - crm_info("Deletion of resource '%s' from executor is pending", id); + pcmk__info("Deletion of resource '%s' from executor is pending", id); if (request) { struct pending_deletion_op_s *op = NULL; - char *ref = crm_element_value_copy(request->msg, PCMK_XA_REFERENCE); + char *ref = pcmk__xe_get_copy(request->msg, PCMK_XA_REFERENCE); op = pcmk__assert_alloc(1, sizeof(struct pending_deletion_op_s)); op->rsc = pcmk__str_copy(rsc->id); @@ -991,9 +1002,10 @@ delete_resource(lrm_state_t *lrm_state, const char *id, lrmd_rsc_info_t *rsc, } return; } else { - crm_warn("Could not delete '%s' from executor for %s%s%s: %s " - QB_XS " rc=%d", id, sys, (user? " as " : ""), - (user? user : ""), pcmk_strerror(rc), rc); + pcmk__warn("Could not delete '%s' from executor for %s%s%s: %s " + QB_XS " rc=%d", + id, sys, ((user != NULL)? " as " : ""), pcmk__s(user, ""), + pcmk_strerror(rc), rc); } delete_rsc_entry(lrm_state, request, id, iter, rc, user, from_cib); @@ -1040,7 +1052,7 @@ force_reprobe(lrm_state_t *lrm_state, const char *from_sys, GHashTableIter gIter; rsc_history_t *entry = NULL; - crm_info("Clearing resource history on node %s", lrm_state->node_name); + pcmk__info("Clearing resource history on node %s", lrm_state->node_name); g_hash_table_iter_init(&gIter, lrm_state->resource_history); while (g_hash_table_iter_next(&gIter, NULL, (void **)&entry)) { /* only unregister the resource during a reprobe if it is not a remote connection @@ -1097,22 +1109,23 @@ synthesize_lrmd_failure(lrm_state_t *lrm_state, const xmlNode *action, const char *exit_reason) { lrmd_event_data_t *op = NULL; - const char *operation = crm_element_value(action, PCMK_XA_OPERATION); - const char *target_node = crm_element_value(action, PCMK__META_ON_NODE); + const char *operation = pcmk__xe_get(action, PCMK_XA_OPERATION); + const char *target_node = pcmk__xe_get(action, PCMK__META_ON_NODE); xmlNode *xml_rsc = pcmk__xe_first_child(action, PCMK_XE_PRIMITIVE, NULL, NULL); if ((xml_rsc == NULL) || (pcmk__xe_id(xml_rsc) == NULL)) { /* @TODO Should we do something else, like direct ack? */ - crm_info("Can't fake %s failure (%d) on %s without resource configuration", - crm_element_value(action, PCMK__XA_OPERATION_KEY), rc, - target_node); + pcmk__info("Can't fake %s failure (%d) on %s without resource " + "configuration", + pcmk__xe_get(action, PCMK__XA_OPERATION_KEY), rc, + target_node); return; } else if(operation == NULL) { /* This probably came from crm_resource -C, nothing to do */ - crm_info("Can't fake %s failure (%d) on %s without operation", - pcmk__xe_id(xml_rsc), rc, target_node); + pcmk__info("Can't fake %s failure (%d) on %s without operation", + pcmk__xe_id(xml_rsc), rc, target_node); return; } @@ -1125,8 +1138,8 @@ synthesize_lrmd_failure(lrm_state_t *lrm_state, const xmlNode *action, fake_op_status(lrm_state, op, op_status, rc, exit_reason); } - crm_info("Faking " PCMK__OP_FMT " result (%d) on %s", - op->rsc_id, op->op_type, op->interval_ms, op->rc, target_node); + pcmk__info("Faking " PCMK__OP_FMT " result (%d) on %s", op->rsc_id, + op->op_type, op->interval_ms, op->rc, target_node); // Process the result as if it came from the LRM process_lrm_event(lrm_state, op, NULL, action); @@ -1148,7 +1161,7 @@ lrm_op_target(const xmlNode *xml) const char *target = NULL; if (xml) { - target = crm_element_value(xml, PCMK__META_ON_NODE); + target = pcmk__xe_get(xml, PCMK__META_ON_NODE); } if (target == NULL) { target = controld_globals.cluster->priv->node_name; @@ -1181,8 +1194,8 @@ fail_lrm_resource(xmlNode *xml, lrm_state_t *lrm_state, const char *user_name, op->interval_ms = 0; if (user_name && !pcmk__is_privileged(user_name)) { - crm_err("%s does not have permission to fail %s", - user_name, pcmk__xe_id(xml_rsc)); + pcmk__err("%s does not have permission to fail %s", user_name, + pcmk__xe_id(xml_rsc)); fake_op_status(lrm_state, op, PCMK_EXEC_ERROR, PCMK_OCF_INSUFFICIENT_PRIV, "Unprivileged user cannot fail resources"); @@ -1194,7 +1207,7 @@ fail_lrm_resource(xmlNode *xml, lrm_state_t *lrm_state, const char *user_name, if (get_lrm_resource(lrm_state, xml_rsc, TRUE, &rsc) == pcmk_ok) { - crm_info("Failing resource %s...", rsc->id); + pcmk__info("Failing resource %s...", rsc->id); fake_op_status(lrm_state, op, PCMK_EXEC_DONE, PCMK_OCF_UNKNOWN_ERROR, "Simulated failure"); process_lrm_event(lrm_state, op, NULL, xml); @@ -1202,8 +1215,8 @@ fail_lrm_resource(xmlNode *xml, lrm_state_t *lrm_state, const char *user_name, lrmd_free_rsc_info(rsc); } else { - crm_info("Cannot find/create resource in order to fail it..."); - crm_log_xml_warn(xml, "bad input"); + pcmk__info("Cannot find/create resource in order to fail it..."); + pcmk__log_xml_warn(xml, "bad input"); fake_op_status(lrm_state, op, PCMK_EXEC_ERROR, PCMK_OCF_UNKNOWN_ERROR, "Cannot fail unknown resource"); } @@ -1218,17 +1231,17 @@ handle_reprobe_op(lrm_state_t *lrm_state, xmlNode *msg, const char *from_sys, const char *from_host, const char *user_name, gboolean is_remote_node, bool reprobe_all_nodes) { - crm_notice("Forcing the status of all resources to be redetected"); + pcmk__notice("Forcing the status of all resources to be redetected"); force_reprobe(lrm_state, from_sys, from_host, user_name, is_remote_node, reprobe_all_nodes); if (!pcmk__strcase_any_of(from_sys, CRM_SYSTEM_PENGINE, CRM_SYSTEM_TENGINE, NULL)) { xmlNode *reply = pcmk__new_reply(msg, NULL); - crm_debug("ACK'ing re-probe from %s (%s)", from_sys, from_host); + pcmk__debug("ACK'ing re-probe from %s (%s)", from_sys, from_host); if (relay_message(reply, TRUE) == FALSE) { - crm_log_xml_err(reply, "Unable to route reply"); + pcmk__log_xml_err(reply, "Unable to route reply"); } pcmk__xml_free(reply); } @@ -1250,12 +1263,12 @@ static bool do_lrm_cancel(ha_msg_input_t *input, lrm_state_t *lrm_state, CRM_CHECK(params != NULL, return FALSE); meta_key = crm_meta_name(PCMK_XA_OPERATION); - op_task = crm_element_value(params, meta_key); + op_task = pcmk__xe_get(params, meta_key); free(meta_key); CRM_CHECK(op_task != NULL, return FALSE); meta_key = crm_meta_name(PCMK_META_INTERVAL); - if (crm_element_value_ms(params, meta_key, &interval_ms) != pcmk_ok) { + if (pcmk__xe_get_guint(params, meta_key, &interval_ms) != pcmk_rc_ok) { free(meta_key); return FALSE; } @@ -1264,11 +1277,11 @@ static bool do_lrm_cancel(ha_msg_input_t *input, lrm_state_t *lrm_state, op_key = pcmk__op_key(rsc->id, op_task, interval_ms); meta_key = crm_meta_name(PCMK__XA_CALL_ID); - call_id = crm_element_value(params, meta_key); + call_id = pcmk__xe_get(params, meta_key); free(meta_key); - crm_debug("Scheduler requested op %s (call=%s) be cancelled", - op_key, (call_id? call_id : "NA")); + pcmk__debug("Scheduler requested op %s (call=%s) be cancelled", op_key, + pcmk__s(call_id, "NA")); pcmk__scan_min_int(call_id, &call, 0); if (call == 0) { // Normal case when the scheduler cancels a recurring op @@ -1284,7 +1297,7 @@ static bool do_lrm_cancel(ha_msg_input_t *input, lrm_state_t *lrm_state, char *op_id = make_stop_id(rsc->id, call); if (is_remote_lrmd_ra(NULL, NULL, rsc->id) == FALSE) { - crm_info("Nothing known about operation %d for %s", call, op_key); + pcmk__info("Nothing known about operation %d for %s", call, op_key); } controld_delete_action_history_by_key(rsc->id, lrm_state->node_name, op_key, call); @@ -1380,7 +1393,7 @@ 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); } - if (!pcmk_is_set(controld_globals.fsa_input_register, R_HA_DISCONNECTED)) { + if (!pcmk__is_set(controld_globals.fsa_input_register, R_HA_DISCONNECTED)) { do_lrm_rsc_op(lrm_state, data->rsc, data->input_xml, md); } free_metadata_cb_data(data); @@ -1409,8 +1422,9 @@ do_lrm_invoke(long long action, lrm_state = controld_get_executor_state(target_node, false); if ((lrm_state == NULL) && is_remote_node) { - crm_err("Failing action because local node has never had connection to remote node %s", - target_node); + pcmk__err("Failing action because local node has never had connection " + "to remote node %s", + target_node); synthesize_lrmd_failure(NULL, input->xml, PCMK_EXEC_NOT_CONNECTED, PCMK_OCF_UNKNOWN_ERROR, "Local node has no connection to remote"); @@ -1419,10 +1433,10 @@ do_lrm_invoke(long long action, pcmk__assert(lrm_state != NULL); user_name = pcmk__update_acl_user(input->msg, PCMK__XA_CRM_USER, NULL); - crm_op = crm_element_value(input->msg, PCMK__XA_CRM_TASK); - from_sys = crm_element_value(input->msg, PCMK__XA_CRM_SYS_FROM); + crm_op = pcmk__xe_get(input->msg, PCMK__XA_CRM_TASK); + from_sys = pcmk__xe_get(input->msg, PCMK__XA_CRM_SYS_FROM); if (!pcmk__str_eq(from_sys, CRM_SYSTEM_TENGINE, pcmk__str_none)) { - from_host = crm_element_value(input->msg, PCMK__XA_SRC); + from_host = pcmk__xe_get(input->msg, PCMK__XA_SRC); } if (pcmk__str_eq(crm_op, PCMK_ACTION_LRM_DELETE, pcmk__str_none)) { @@ -1432,15 +1446,15 @@ do_lrm_invoke(long long action, operation = PCMK_ACTION_DELETE; } else if (input->xml != NULL) { - operation = crm_element_value(input->xml, PCMK_XA_OPERATION); + operation = pcmk__xe_get(input->xml, PCMK_XA_OPERATION); } CRM_CHECK(!pcmk__str_empty(crm_op) || !pcmk__str_empty(operation), return); - crm_trace("'%s' execution request from %s as %s user", - pcmk__s(crm_op, operation), - pcmk__s(from_sys, "unknown subsystem"), - pcmk__s(user_name, "current")); + pcmk__trace("'%s' execution request from %s as %s user", + pcmk__s(crm_op, operation), + pcmk__s(from_sys, "unknown subsystem"), + pcmk__s(user_name, "current")); if (pcmk__str_eq(crm_op, CRM_OP_LRM_FAIL, pcmk__str_none)) { fail_lrm_resource(input->xml, lrm_state, user_name, from_host, @@ -1452,7 +1466,7 @@ do_lrm_invoke(long long action, if (input->xml != NULL) { // For CRM_OP_REPROBE, a NULL target means we're targeting all nodes - raw_target = crm_element_value(input->xml, PCMK__META_ON_NODE); + raw_target = pcmk__xe_get(input->xml, PCMK__META_ON_NODE); } handle_reprobe_op(lrm_state, input->msg, from_sys, from_host, user_name, is_remote_node, (raw_target == NULL)); @@ -1480,18 +1494,19 @@ do_lrm_invoke(long long action, /* Delete of malformed or nonexistent resource * (deleting something that does not exist is a success) */ - crm_debug("Not registering resource '%s' for a %s event " - QB_XS " get-rc=%d (%s) transition-key=%s", - pcmk__xe_id(xml_rsc), operation, - rc, pcmk_strerror(rc), pcmk__xe_id(input->xml)); + pcmk__debug("Not registering resource '%s' for a %s event " + QB_XS " get-rc=%d (%s) transition-key=%s", + pcmk__xe_id(xml_rsc), operation, rc, pcmk_strerror(rc), + pcmk__xe_id(input->xml)); delete_rsc_entry(lrm_state, input, pcmk__xe_id(xml_rsc), NULL, pcmk_ok, user_name, true); return; } else if (rc == -EINVAL) { // Resource operation on malformed resource - crm_err("Invalid resource definition for %s", pcmk__xe_id(xml_rsc)); - crm_log_xml_warn(input->msg, "invalid resource"); + pcmk__err("Invalid resource definition for %s", + pcmk__xe_id(xml_rsc)); + pcmk__log_xml_warn(input->msg, "invalid resource"); synthesize_lrmd_failure(lrm_state, input->xml, PCMK_EXEC_ERROR, PCMK_OCF_NOT_CONFIGURED, // fatal error "Invalid resource definition"); @@ -1499,10 +1514,10 @@ do_lrm_invoke(long long action, } else if (rc < 0) { // Error communicating with the executor - crm_err("Could not register resource '%s' with executor: %s " - QB_XS " rc=%d", - pcmk__xe_id(xml_rsc), pcmk_strerror(rc), rc); - crm_log_xml_warn(input->msg, "failed registration"); + pcmk__err("Could not register resource '%s' with executor: %s " + QB_XS " rc=%d", + pcmk__xe_id(xml_rsc), pcmk_strerror(rc), rc); + pcmk__log_xml_warn(input->msg, "failed registration"); synthesize_lrmd_failure(lrm_state, input->xml, PCMK_EXEC_ERROR, PCMK_OCF_INVALID_PARAM, // hard error "Could not register resource with executor"); @@ -1511,7 +1526,7 @@ do_lrm_invoke(long long action, if (pcmk__str_eq(operation, PCMK_ACTION_CANCEL, pcmk__str_none)) { if (!do_lrm_cancel(input, lrm_state, rsc, from_host, from_sys)) { - crm_log_xml_warn(input->xml, "Bad command"); + pcmk__log_xml_warn(input->xml, "Bad command"); } } else if (pcmk__str_eq(operation, PCMK_ACTION_DELETE, @@ -1551,11 +1566,11 @@ do_lrm_invoke(long long action, struct metadata_cb_data *data = NULL; data = new_metadata_cb_data(rsc, input->xml); - crm_info("Retrieving metadata for %s (%s%s%s:%s) asynchronously", - rsc->id, rsc->standard, - ((rsc->provider == NULL)? "" : ":"), - ((rsc->provider == NULL)? "" : rsc->provider), - rsc->type); + pcmk__info("Retrieving metadata for %s (%s%s%s:%s) " + "asynchronously", + rsc->id, rsc->standard, + ((rsc->provider != NULL)? ":" : ""), + pcmk__s(rsc->provider, ""), rsc->type); (void) lrmd__metadata_async(rsc, metadata_complete, (void *) data); } else { @@ -1566,8 +1581,8 @@ do_lrm_invoke(long long action, lrmd_free_rsc_info(rsc); } else { - crm_err("Invalid execution request: unknown command '%s' (bug?)", - crm_op); + pcmk__err("Invalid execution request: unknown command '%s' (bug?)", + crm_op); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } } @@ -1607,7 +1622,7 @@ construct_op(const lrm_state_t *lrm_state, const xmlNode *rsc_op, pcmk__insert_dup(op->params, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); - crm_trace("Constructed %s op for %s", operation, rsc_id); + pcmk__trace("Constructed %s op for %s", operation, rsc_id); return op; } @@ -1628,17 +1643,21 @@ construct_op(const lrm_state_t *lrm_state, const xmlNode *rsc_op, /* Use pcmk_monitor_timeout instead of meta timeout for stonith recurring monitor, if set */ primitive = pcmk__xe_first_child(rsc_op, PCMK_XE_PRIMITIVE, NULL, NULL); - class = crm_element_value(primitive, PCMK_XA_CLASS); + class = pcmk__xe_get(primitive, PCMK_XA_CLASS); - if (pcmk_is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_fence_params) - && pcmk__str_eq(operation, PCMK_ACTION_MONITOR, pcmk__str_casei) - && (op->interval_ms > 0)) { + if (pcmk__is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_fence_params) + && pcmk__str_eq(operation, PCMK_ACTION_MONITOR, pcmk__str_casei) + && (op->interval_ms > 0)) { op_timeout = g_hash_table_lookup(params, "pcmk_monitor_timeout"); if (op_timeout != NULL) { - long long timeout_ms = crm_get_msec(op_timeout); + long long timeout_ms = 0; + + if ((pcmk__parse_ms(op_timeout, &timeout_ms) == pcmk_rc_ok) + && (timeout_ms >= 0)) { - op->timeout = (int) QB_MIN(timeout_ms, INT_MAX); + op->timeout = (int) QB_MIN(timeout_ms, INT_MAX); + } } } @@ -1676,7 +1695,7 @@ construct_op(const lrm_state_t *lrm_state, const xmlNode *rsc_op, op->start_delay = 0; } - transition = crm_element_value(rsc_op, PCMK__XA_TRANSITION_KEY); + transition = pcmk__xe_get(rsc_op, PCMK__XA_TRANSITION_KEY); CRM_CHECK(transition != NULL, return op); op->user_data = pcmk__str_copy(transition); @@ -1684,14 +1703,14 @@ construct_op(const lrm_state_t *lrm_state, const xmlNode *rsc_op, if (op->interval_ms != 0) { if (pcmk__strcase_any_of(operation, PCMK_ACTION_START, PCMK_ACTION_STOP, NULL)) { - crm_err("Start and Stop actions cannot have an interval: %u", - op->interval_ms); + pcmk__err("Start and stop actions cannot have an interval: %u", + op->interval_ms); op->interval_ms = 0; } } - crm_trace("Constructed %s op for %s: interval=%u", - operation, rsc_id, op->interval_ms); + pcmk__trace("Constructed %s op for %s: interval=%u", operation, rsc_id, + op->interval_ms); return op; } @@ -1733,11 +1752,11 @@ controld_ack_event_directly(const char *to_host, const char *to_sys, __func__); iter = pcmk__xe_create(update, PCMK__XE_LRM); - crm_xml_add(iter, PCMK_XA_ID, controld_globals.our_uuid); + pcmk__xe_set(iter, PCMK_XA_ID, controld_globals.our_uuid); iter = pcmk__xe_create(iter, PCMK__XE_LRM_RESOURCES); iter = pcmk__xe_create(iter, PCMK__XE_LRM_RESOURCE); - crm_xml_add(iter, PCMK_XA_ID, op->rsc_id); + pcmk__xe_set(iter, PCMK_XA_ID, op->rsc_id); controld_add_resource_history_xml(iter, rsc, op, controld_globals.cluster->priv->node_name); @@ -1751,14 +1770,14 @@ controld_ack_event_directly(const char *to_host, const char *to_sys, reply = pcmk__new_message(pcmk_ipc_controld, "direct-ack", CRM_SYSTEM_LRMD, to_host, to_sys, CRM_OP_INVOKE_LRM, update); - crm_log_xml_trace(update, "[direct ACK]"); + pcmk__log_xml_trace(update, "[direct ACK]"); - crm_debug("ACK'ing resource op " PCMK__OP_FMT " from %s: %s", - op->rsc_id, op->op_type, op->interval_ms, op->user_data, - crm_element_value(reply, PCMK_XA_REFERENCE)); + pcmk__debug("ACK'ing resource op " PCMK__OP_FMT " from %s: %s", op->rsc_id, + op->op_type, op->interval_ms, op->user_data, + pcmk__xe_get(reply, PCMK_XA_REFERENCE)); if (relay_message(reply, TRUE) == FALSE) { - crm_log_xml_err(reply, "Unable to route reply"); + pcmk__log_xml_err(reply, "Unable to route reply"); } pcmk__xml_free(update); @@ -1801,7 +1820,8 @@ stop_recurring_action_by_rsc(gpointer key, gpointer value, gpointer user_data) if ((op->interval_ms != 0) && pcmk__str_eq(op->rsc_id, event->rsc->id, pcmk__str_none)) { - crm_debug("Cancelling op %d for %s (%s)", op->call_id, op->rsc_id, (char*)key); + pcmk__debug("Cancelling op %d for %s (%s)", op->call_id, op->rsc_id, + (const char *) key); remove = !cancel_op(event->lrm_state, event->rsc->id, key, op->call_id, FALSE); } @@ -1816,8 +1836,8 @@ stop_recurring_actions(gpointer key, gpointer value, gpointer user_data) active_op_t *op = value; if (op->interval_ms != 0) { - crm_info("Cancelling op %d for %s (%s)", op->call_id, op->rsc_id, - (const char *) key); + pcmk__info("Cancelling op %d for %s (%s)", op->call_id, op->rsc_id, + (const char *) key); remove = !cancel_op(lrm_state, op->rsc_id, key, op->call_id, FALSE); } @@ -1864,7 +1884,7 @@ should_cancel_recurring(const char *rsc_id, const char *action, guint interval_m static const char * should_nack_action(const char *action) { - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN) + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN) && pcmk__str_eq(action, PCMK_ACTION_START, pcmk__str_none)) { register_fsa_input(C_SHUTDOWN, I_SHUTDOWN, NULL); @@ -1900,19 +1920,19 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc, xmlNode *msg, CRM_CHECK((rsc != NULL) && (msg != NULL), return); - operation = crm_element_value(msg, PCMK_XA_OPERATION); + operation = pcmk__xe_get(msg, PCMK_XA_OPERATION); CRM_CHECK(!pcmk__str_empty(operation), return); - transition = crm_element_value(msg, PCMK__XA_TRANSITION_KEY); + transition = pcmk__xe_get(msg, PCMK__XA_TRANSITION_KEY); if (pcmk__str_empty(transition)) { - crm_log_xml_err(msg, "Missing transition number"); + pcmk__log_xml_err(msg, "Missing transition number"); } if (lrm_state == NULL) { // This shouldn't be possible, but provide a failsafe just in case - crm_err("Cannot execute %s of %s: No executor connection " - QB_XS " transition_key=%s", - operation, rsc->id, pcmk__s(transition, "")); + pcmk__err("Cannot execute %s of %s: No executor connection " + QB_XS " transition_key=%s", + operation, rsc->id, pcmk__s(transition, "")); synthesize_lrmd_failure(NULL, msg, PCMK_EXEC_INVALID, PCMK_OCF_UNKNOWN_ERROR, "No executor connection"); @@ -1927,7 +1947,7 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc, xmlNode *msg, * Default to the OCF 1.1 name. */ if ((md != NULL) - && pcmk_is_set(md->ra_flags, ra_supports_legacy_reload)) { + && pcmk__is_set(md->ra_flags, ra_supports_legacy_reload)) { operation = PCMK_ACTION_RELOAD; } else { operation = PCMK_ACTION_RELOAD_AGENT; @@ -1948,19 +1968,20 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc, xmlNode *msg, &data); if (removed) { - crm_debug("Stopped %u recurring operation%s in preparation for " - PCMK__OP_FMT, removed, pcmk__plural_s(removed), - rsc->id, operation, op->interval_ms); + pcmk__debug("Stopped %u recurring operation%s in preparation for " + PCMK__OP_FMT, + removed, pcmk__plural_s(removed), rsc->id, operation, + op->interval_ms); } } nack_reason = should_nack_action(operation); if (nack_reason != NULL) { - crm_notice("Not requesting local execution of %s operation for %s on %s" - " in state %s: %s", - pcmk__readable_action(op->op_type, op->interval_ms), rsc->id, - lrm_state->node_name, - fsa_state2string(controld_globals.fsa_state), nack_reason); + pcmk__notice("Not requesting local execution of %s operation for %s on " + "%s in state %s: %s", + pcmk__readable_action(op->op_type, op->interval_ms), + rsc->id, lrm_state->node_name, + fsa_state2string(controld_globals.fsa_state), nack_reason); lrmd__set_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_INVALID, nack_reason); @@ -1970,10 +1991,10 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc, xmlNode *msg, return; } - crm_notice("Requesting local execution of %s operation for %s on %s " - QB_XS " transition %s", - pcmk__readable_action(op->op_type, op->interval_ms), rsc->id, - lrm_state->node_name, pcmk__s(transition, "")); + pcmk__notice("Requesting local execution of %s operation for %s on %s " + QB_XS " transition %s", + pcmk__readable_action(op->op_type, op->interval_ms), rsc->id, + lrm_state->node_name, pcmk__s(transition, "")); controld_record_pending_op(lrm_state->node_name, rsc, op); @@ -1996,7 +2017,8 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc, xmlNode *msg, active_op_t *pending = NULL; pending = pcmk__assert_alloc(1, sizeof(active_op_t)); - crm_trace("Recording pending op: %d - %s %s", call_id, op_id, call_id_s); + pcmk__trace("Recording pending op: %d - %s %s", call_id, op_id, + call_id_s); pending->call_id = call_id; pending->interval_ms = op->interval_ms; @@ -2005,17 +2027,16 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc, xmlNode *msg, pending->rsc_id = pcmk__str_copy(rsc->id); pending->start_time = time(NULL); pending->user_data = pcmk__str_copy(op->user_data); - if (crm_element_value_epoch(msg, PCMK_OPT_SHUTDOWN_LOCK, - &(pending->lock_time)) != pcmk_ok) { - pending->lock_time = 0; - } + pcmk__xe_get_time(msg, PCMK_OPT_SHUTDOWN_LOCK, &(pending->lock_time)); g_hash_table_replace(lrm_state->active_ops, call_id_s, pending); if ((op->interval_ms > 0) && (op->start_delay > START_DELAY_THRESHOLD)) { int target_rc = PCMK_OCF_OK; - crm_info("Faking confirmation of %s: execution postponed for over 5 minutes", op_id); + pcmk__info("Faking confirmation of %s: execution postponed for " + "over 5 minutes", + op_id); decode_transition_key(op->user_data, NULL, NULL, NULL, &target_rc); lrmd__set_result(op, target_rc, PCMK_EXEC_DONE, NULL); controld_ack_event_directly(NULL, NULL, rsc, op, rsc->id); @@ -2025,17 +2046,19 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc, xmlNode *msg, op->params = NULL; } else if (lrm_state_is_local(lrm_state)) { - crm_err("Could not initiate %s action for resource %s locally: %s " - QB_XS " rc=%d", operation, rsc->id, pcmk_rc_str(rc), rc); + pcmk__err("Could not initiate %s action for resource %s locally: %s " + QB_XS " rc=%d", + operation, rsc->id, pcmk_rc_str(rc), rc); fake_op_status(lrm_state, op, PCMK_EXEC_NOT_CONNECTED, PCMK_OCF_UNKNOWN_ERROR, pcmk_rc_str(rc)); process_lrm_event(lrm_state, op, NULL, NULL); register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL); } else { - crm_err("Could not initiate %s action for resource %s remotely on %s: " - "%s " QB_XS " rc=%d", - operation, rsc->id, lrm_state->node_name, pcmk_rc_str(rc), rc); + pcmk__err("Could not initiate %s action for resource %s remotely on " + "%s: %s " QB_XS " rc=%d", + operation, rsc->id, lrm_state->node_name, pcmk_rc_str(rc), + rc); fake_op_status(lrm_state, op, PCMK_EXEC_NOT_CONNECTED, PCMK_OCF_UNKNOWN_ERROR, pcmk_rc_str(rc)); process_lrm_event(lrm_state, op, NULL, NULL); @@ -2163,9 +2186,9 @@ log_executor_event(const lrmd_event_data_t *op, const char *op_key, * level, so just raise to notice if it looks like a failure. */ if ((op->output != NULL) && (op->rc != PCMK_OCF_OK)) { - char *prefix = crm_strdup_printf(PCMK__OP_FMT "@%s output", - op->rsc_id, op->op_type, - op->interval_ms, node_name); + char *prefix = pcmk__assert_asprintf(PCMK__OP_FMT "@%s output", + op->rsc_id, op->op_type, + op->interval_ms, node_name); crm_log_output(LOG_NOTICE, prefix, op->output); free(prefix); @@ -2189,7 +2212,7 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op, CRM_CHECK(op->rsc_id != NULL, return); // Remap new status codes for older DCs - if (compare_version(controld_globals.dc_version, "3.2.0") < 0) { + if (pcmk__compare_versions(controld_globals.dc_version, "3.2.0") < 0) { switch (op->op_status) { case PCMK_EXEC_NOT_CONNECTED: lrmd__set_result(op, PCMK_OCF_CONNECTION_DIED, @@ -2215,18 +2238,20 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op, xmlNode *xml = pcmk__xe_first_child(action_xml, PCMK_XE_PRIMITIVE, NULL, NULL); - const char *standard = crm_element_value(xml, PCMK_XA_CLASS); - const char *provider = crm_element_value(xml, PCMK_XA_PROVIDER); - const char *type = crm_element_value(xml, PCMK_XA_TYPE); + const char *standard = pcmk__xe_get(xml, PCMK_XA_CLASS); + const char *provider = pcmk__xe_get(xml, PCMK_XA_PROVIDER); + const char *type = pcmk__xe_get(xml, PCMK_XA_TYPE); if (standard && type) { - crm_info("%s agent information not cached, using %s%s%s:%s from action XML", - op->rsc_id, standard, - (provider? ":" : ""), (provider? provider : ""), type); + pcmk__info("%s agent information not cached, using %s%s%s:%s from " + "action XML", + op->rsc_id, standard, (provider? ":" : ""), + pcmk__s(provider, ""), type); rsc = lrmd_new_rsc_info(op->rsc_id, standard, provider, type); } else { - crm_err("Can't process %s result because %s agent information not cached or in XML", - op_key, op->rsc_id); + pcmk__err("Can't process %s result because %s agent information " + "not cached or in XML", + op_key, op->rsc_id); } } @@ -2234,7 +2259,7 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op, if (lrm_state) { node_name = lrm_state->node_name; } else if (action_xml) { - node_name = crm_element_value(action_xml, PCMK__META_ON_NODE); + node_name = pcmk__xe_get(action_xml, PCMK__META_ON_NODE); } if(pending == NULL) { @@ -2279,16 +2304,21 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op, * refreshed, cleaned, or removed while this operation was * in flight). */ - crm_notice("Not recording %s result in CIB because " - "resource information was removed since it was initiated", - op_key); + pcmk__notice("Not recording %s result in CIB because resource " + "information was removed since it was initiated", + op_key); } else { /* This shouldn't be possible; the executor didn't consider the * resource deleted, but we couldn't find resource or node * information. */ - crm_err("Unable to record %s result in CIB: %s", op_key, - (node_name? "No resource information" : "No node name")); + const char *missing = "node name"; + + if (node_name != NULL) { + missing = "resource information"; + } + pcmk__err("Unable to record %s result in CIB: No %s", op_key, + missing); } } @@ -2308,10 +2338,11 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op, /* This recurring operation was cancelled and pending, but we don't * have a transition key. This should never happen. */ - crm_err("Recurring operation %s was cancelled without transition information", - op_key); + pcmk__err("Recurring operation %s was cancelled without transition " + "information", + op_key); - } else if (pcmk_is_set(pending->flags, active_op_remove)) { + } else if (pcmk__is_set(pending->flags, active_op_remove)) { /* This recurring operation was cancelled (by us) and pending, and we * have been waiting for it to finish. */ @@ -2335,8 +2366,8 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op, * executor does not have resource information, likely due to resource * cleanup, refresh, or removal) and pending. */ - crm_debug("Recurring op %s was cancelled due to resource deletion", - op_key); + pcmk__debug("Recurring op %s was cancelled due to resource deletion", + op_key); need_direct_ack = TRUE; } else { @@ -2363,9 +2394,9 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op, removed = TRUE; } else if (found) { removed = TRUE; - crm_trace("Op %s (call=%d, stop-id=%s, remaining=%u): Confirmed", - op_key, op->call_id, op_id, - g_hash_table_size(lrm_state->active_ops)); + pcmk__trace("Op %s (call=%d, stop-id=%s, remaining=%u): Confirmed", + op_key, op->call_id, op_id, + g_hash_table_size(lrm_state->active_ops)); } } @@ -2384,7 +2415,8 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op, } if (op->rsc_deleted) { - crm_info("Deletion of resource '%s' complete after %s", op->rsc_id, op_key); + pcmk__info("Deletion of resource '%s' complete after %s", op->rsc_id, + op_key); if (lrm_state) { delete_rsc_entry(lrm_state, NULL, op->rsc_id, NULL, pcmk_ok, NULL, true); diff --git a/daemons/controld/controld_execd_state.c b/daemons/controld/controld_execd_state.c index 99aac814240..7af912d71cc 100644 --- a/daemons/controld/controld_execd_state.c +++ b/daemons/controld/controld_execd_state.c @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the Pacemaker project contributors + * Copyright 2012-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,7 @@ #include #include +#include // pcmk_unpack_nvpair_blocks() #include #include @@ -64,9 +65,9 @@ fail_pending_op(gpointer key, gpointer value, gpointer user_data) lrm_state_t *lrm_state = user_data; active_op_t *op = value; - crm_trace("Pre-emptively failing " PCMK__OP_FMT " on %s (call=%s, %s)", - op->rsc_id, op->op_type, op->interval_ms, - lrm_state->node_name, (char*)key, op->user_data); + pcmk__trace("Pre-emptively failing " PCMK__OP_FMT " on %s (call=%s, %s)", + op->rsc_id, op->op_type, op->interval_ms, + lrm_state->node_name, (const char *) key, op->user_data); event.type = lrmd_event_exec_complete; event.rsc_id = op->rsc_id; @@ -108,7 +109,7 @@ lrm_state_create(const char *node_name) lrm_state_t *state = NULL; if (!node_name) { - crm_err("No node name given for lrm state object"); + pcmk__err("No node name given for lrm state object"); return NULL; } @@ -193,31 +194,31 @@ internal_lrm_state_destroy(gpointer data) */ remote_proxy_disconnect_by_node(lrm_state->node_name); - crm_trace("Destroying proxy table %s with %u members", - lrm_state->node_name, g_hash_table_size(proxy_table)); + pcmk__trace("Destroying proxy table %s with %u members", + lrm_state->node_name, g_hash_table_size(proxy_table)); // Just in case there's still any leftovers in proxy_table g_hash_table_foreach_remove(proxy_table, remote_proxy_remove_by_node, (char *) lrm_state->node_name); remote_ra_cleanup(lrm_state); lrmd_api_delete(lrm_state->conn); if (lrm_state->rsc_info_cache) { - crm_trace("Destroying rsc info cache with %u members", - g_hash_table_size(lrm_state->rsc_info_cache)); + pcmk__trace("Destroying rsc info cache with %u members", + g_hash_table_size(lrm_state->rsc_info_cache)); g_hash_table_destroy(lrm_state->rsc_info_cache); } if (lrm_state->resource_history) { - crm_trace("Destroying history op cache with %u members", - g_hash_table_size(lrm_state->resource_history)); + pcmk__trace("Destroying history op cache with %u members", + g_hash_table_size(lrm_state->resource_history)); g_hash_table_destroy(lrm_state->resource_history); } if (lrm_state->deletion_ops) { - crm_trace("Destroying deletion op cache with %u members", - g_hash_table_size(lrm_state->deletion_ops)); + pcmk__trace("Destroying deletion op cache with %u members", + g_hash_table_size(lrm_state->deletion_ops)); g_hash_table_destroy(lrm_state->deletion_ops); } if (lrm_state->active_ops != NULL) { - crm_trace("Destroying pending op cache with %u members", - g_hash_table_size(lrm_state->active_ops)); + pcmk__trace("Destroying pending op cache with %u members", + g_hash_table_size(lrm_state->active_ops)); g_hash_table_destroy(lrm_state->active_ops); } metadata_cache_free(lrm_state->metadata_cache); @@ -230,23 +231,23 @@ void lrm_state_reset_tables(lrm_state_t * lrm_state, gboolean reset_metadata) { if (lrm_state->resource_history) { - crm_trace("Resetting resource history cache with %u members", - g_hash_table_size(lrm_state->resource_history)); + pcmk__trace("Resetting resource history cache with %u members", + g_hash_table_size(lrm_state->resource_history)); g_hash_table_remove_all(lrm_state->resource_history); } if (lrm_state->deletion_ops) { - crm_trace("Resetting deletion operations cache with %u members", - g_hash_table_size(lrm_state->deletion_ops)); + pcmk__trace("Resetting deletion operations cache with %u members", + g_hash_table_size(lrm_state->deletion_ops)); g_hash_table_remove_all(lrm_state->deletion_ops); } if (lrm_state->active_ops != NULL) { - crm_trace("Resetting active operations cache with %u members", - g_hash_table_size(lrm_state->active_ops)); + pcmk__trace("Resetting active operations cache with %u members", + g_hash_table_size(lrm_state->active_ops)); g_hash_table_remove_all(lrm_state->active_ops); } if (lrm_state->rsc_info_cache) { - crm_trace("Resetting resource information cache with %u members", - g_hash_table_size(lrm_state->rsc_info_cache)); + pcmk__trace("Resetting resource information cache with %u members", + g_hash_table_size(lrm_state->rsc_info_cache)); g_hash_table_remove_all(lrm_state->rsc_info_cache); } if (reset_metadata) { @@ -280,13 +281,13 @@ void lrm_state_destroy_all(void) { if (lrm_state_table) { - crm_trace("Destroying state table with %u members", - g_hash_table_size(lrm_state_table)); + pcmk__trace("Destroying state table with %u members", + g_hash_table_size(lrm_state_table)); g_hash_table_destroy(lrm_state_table); lrm_state_table = NULL; } if(proxy_table) { - crm_trace("Destroying proxy table with %u members", - g_hash_table_size(proxy_table)); + pcmk__trace("Destroying proxy table with %u members", + g_hash_table_size(proxy_table)); g_hash_table_destroy(proxy_table); proxy_table = NULL; } } @@ -334,21 +335,22 @@ lrm_state_get_list(void) void lrm_state_disconnect_only(lrm_state_t * lrm_state) { - int removed = 0; + guint removed = 0; if (!lrm_state->conn) { return; } - crm_trace("Disconnecting %s", lrm_state->node_name); + pcmk__trace("Disconnecting %s", lrm_state->node_name); remote_proxy_disconnect_by_node(lrm_state->node_name); ((lrmd_t *) lrm_state->conn)->cmds->disconnect(lrm_state->conn); - if (!pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + if (!pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { removed = g_hash_table_foreach_remove(lrm_state->active_ops, fail_pending_op, lrm_state); - crm_trace("Synthesized %d operation failures for %s", removed, lrm_state->node_name); + pcmk__trace("Synthesized %u operation failures for %s", removed, + lrm_state->node_name); } } @@ -440,10 +442,11 @@ crmd_proxy_send(const char *session, xmlNode *msg) if (!proxy) { return; } - crm_log_xml_trace(msg, "to-proxy"); + pcmk__log_xml_trace(msg, "to-proxy"); lrm_state = controld_get_executor_state(proxy->node_name, false); if (lrm_state) { - crm_trace("Sending event to %.8s on %s", proxy->session_id, proxy->node_name); + pcmk__trace("Sending event to %.8s on %s", proxy->session_id, + proxy->node_name); remote_proxy_relay_event(proxy, msg); } } @@ -451,9 +454,9 @@ crmd_proxy_send(const char *session, xmlNode *msg) static void crmd_proxy_dispatch(const char *session, xmlNode *msg) { - crm_trace("Processing proxied IPC message from session %s", session); - crm_log_xml_trace(msg, "controller[inbound]"); - crm_xml_add(msg, PCMK__XA_CRM_SYS_FROM, session); + pcmk__trace("Processing proxied IPC message from session %s", session); + pcmk__log_xml_trace(msg, "controller[inbound]"); + pcmk__xe_set(msg, PCMK__XA_CRM_SYS_FROM, session); if (controld_authorize_ipc_message(msg, NULL, session)) { route_message(C_IPC_MESSAGE, msg); } @@ -464,10 +467,11 @@ static void remote_config_check(xmlNode * msg, int call_id, int rc, xmlNode * output, void *user_data) { if (rc != pcmk_ok) { - crm_err("Query resulted in an error: %s", pcmk_strerror(rc)); + pcmk__err("Query resulted in an error: %s", pcmk_strerror(rc)); if (rc == -EACCES || rc == -pcmk_err_schema_validation) { - crm_err("The cluster is mis-configured - shutting down and staying down"); + pcmk__err("The cluster is mis-configured - shutting down and " + "staying down"); } } else { @@ -478,7 +482,7 @@ remote_config_check(xmlNode * msg, int call_id, int rc, xmlNode * output, void * .now = now, }; - crm_debug("Call %d : Parsing CIB options", call_id); + pcmk__debug("Call %d : Parsing CIB options", call_id); pcmk_unpack_nvpair_blocks(output, PCMK_XE_CLUSTER_PROPERTY_SET, PCMK_VALUE_CIB_BOOTSTRAP_OPTIONS, &rule_input, config_hash, NULL); @@ -495,12 +499,12 @@ static void crmd_remote_proxy_cb(lrmd_t *lrmd, void *userdata, xmlNode *msg) { lrm_state_t *lrm_state = userdata; - const char *session = crm_element_value(msg, PCMK__XA_LRMD_IPC_SESSION); + const char *session = pcmk__xe_get(msg, PCMK__XA_LRMD_IPC_SESSION); remote_proxy_t *proxy = g_hash_table_lookup(proxy_table, session); - const char *op = crm_element_value(msg, PCMK__XA_LRMD_IPC_OP); + const char *op = pcmk__xe_get(msg, PCMK__XA_LRMD_IPC_OP); if (pcmk__str_eq(op, LRMD_IPC_OP_NEW, pcmk__str_casei)) { - const char *channel = crm_element_value(msg, PCMK__XA_LRMD_IPC_SERVER); + const char *channel = pcmk__xe_get(msg, PCMK__XA_LRMD_IPC_SERVER); proxy = crmd_remote_proxy_new(lrmd, lrm_state->node_name, session, channel); if (!remote_ra_controlling_guest(lrm_state)) { @@ -519,14 +523,14 @@ crmd_remote_proxy_cb(lrmd_t *lrmd, void *userdata, xmlNode *msg) NULL); } } else { - crm_debug("Skipping remote_config_check for guest-nodes"); + pcmk__debug("Skipping remote_config_check for guest-nodes"); } } else if (pcmk__str_eq(op, LRMD_IPC_OP_SHUTDOWN_REQ, pcmk__str_casei)) { char *now_s = NULL; - crm_notice("%s requested shutdown of its remote connection", - lrm_state->node_name); + pcmk__notice("%s requested shutdown of its remote connection", + lrm_state->node_name); if (!remote_ra_is_in_maintenance(lrm_state)) { now_s = pcmk__ttoa(time(NULL)); @@ -536,13 +540,15 @@ crmd_remote_proxy_cb(lrmd_t *lrmd, void *userdata, xmlNode *msg) remote_proxy_ack_shutdown(lrmd); - crm_warn("Reconnection attempts to %s may result in failures that must be cleared", - lrm_state->node_name); + pcmk__warn("Reconnection attempts to %s may result in failures " + "that must be cleared", + lrm_state->node_name); } else { remote_proxy_nack_shutdown(lrmd); - crm_notice("Remote resource for %s is not managed so no ordered shutdown happening", - lrm_state->node_name); + pcmk__notice("Remote resource for %s is not managed so no ordered " + "shutdown happening", + lrm_state->node_name); } return; @@ -558,7 +564,7 @@ crmd_remote_proxy_cb(lrmd_t *lrmd, void *userdata, xmlNode *msg) CRM_CHECK(request != NULL, return); CRM_CHECK(lrm_state->node_name, return); - crm_xml_add(request, PCMK_XE_ACL_ROLE, "pacemaker-remote"); + pcmk__xe_set(request, PCMK_XE_ACL_ROLE, "pacemaker-remote"); pcmk__update_acl_user(request, PCMK__XA_LRMD_IPC_USER, lrm_state->node_name); @@ -567,14 +573,14 @@ crmd_remote_proxy_cb(lrmd_t *lrmd, void *userdata, xmlNode *msg) * the name, so we don't return info for ourselves instead of the * Pacemaker Remote node. */ - if (pcmk__str_eq(crm_element_value(request, PCMK__XA_CRM_TASK), + if (pcmk__str_eq(pcmk__xe_get(request, PCMK__XA_CRM_TASK), CRM_OP_NODE_INFO, pcmk__str_none)) { int node_id = 0; - crm_element_value_int(request, PCMK_XA_ID, &node_id); + pcmk__xe_get_int(request, PCMK_XA_ID, &node_id); if ((node_id <= 0) - && (crm_element_value(request, PCMK_XA_UNAME) == NULL)) { - crm_xml_add(request, PCMK_XA_UNAME, lrm_state->node_name); + && (pcmk__xe_get(request, PCMK_XA_UNAME) == NULL)) { + pcmk__xe_set(request, PCMK_XA_UNAME, lrm_state->node_name); } } @@ -582,17 +588,18 @@ crmd_remote_proxy_cb(lrmd_t *lrmd, void *userdata, xmlNode *msg) rc = pcmk__xe_get_flags(msg, PCMK__XA_LRMD_IPC_MSG_FLAGS, &flags, 0U); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse controller flags from remote request: %s", - pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse controller flags from remote request: " + "%s", + pcmk_rc_str(rc)); } - if (pcmk_is_set(flags, crm_ipc_client_response)) { + if (pcmk__is_set(flags, crm_ipc_client_response)) { int msg_id = 0; xmlNode *op_reply = pcmk__xe_create(NULL, PCMK__XE_ACK); - crm_xml_add(op_reply, PCMK_XA_FUNCTION, __func__); - crm_xml_add_int(op_reply, PCMK__XA_LINE, __LINE__); + pcmk__xe_set(op_reply, PCMK_XA_FUNCTION, __func__); + pcmk__xe_set_int(op_reply, PCMK__XA_LINE, __LINE__); - crm_element_value_int(msg, PCMK__XA_LRMD_IPC_MSG_ID, &msg_id); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_IPC_MSG_ID, &msg_id); remote_proxy_relay_response(proxy, op_reply, msg_id); pcmk__xml_free(op_reply); @@ -616,8 +623,9 @@ controld_connect_remote_executor(lrm_state_t *lrm_state, const char *server, rc = lrmd__new(&api, lrm_state->node_name, server, port); if (rc != pcmk_rc_ok) { - crm_warn("Pacemaker Remote connection to %s:%s failed: %s " - QB_XS " rc=%d", server, port, pcmk_rc_str(rc), rc); + pcmk__warn("Pacemaker Remote connection to %s:%s failed: %s " + QB_XS " rc=%d", + server, port, pcmk_rc_str(rc), rc); return rc; } @@ -626,8 +634,8 @@ controld_connect_remote_executor(lrm_state_t *lrm_state, const char *server, lrmd_internal_set_proxy_callback(api, lrm_state, crmd_remote_proxy_cb); } - crm_trace("Initiating remote connection to %s:%d with timeout %dms", - server, port, timeout_ms); + pcmk__trace("Initiating remote connection to %s:%d with timeout %dms", + server, port, timeout_ms); rc = ((lrmd_t *) lrm_state->conn)->cmds->connect_async(lrm_state->conn, lrm_state->node_name, timeout_ms); diff --git a/daemons/controld/controld_fencing.c b/daemons/controld/controld_fencing.c index 49d1142cb36..9303df08f51 100644 --- a/daemons/controld/controld_fencing.c +++ b/daemons/controld/controld_fencing.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,8 @@ #include #include +#include // crm_meta_value() +#include // PCMK_SCORE_INFINITY #include #include #include @@ -52,8 +54,9 @@ update_stonith_max_attempts(const char *value) CRM_CHECK((rc == pcmk_rc_ok) && (score > 0), return); if (stonith_max_attempts != score) { - crm_debug("Maximum fencing attempts per transition is now %d (was %lu)", - score, stonith_max_attempts); + pcmk__debug("Maximum fencing attempts per transition is now %d (was " + "%lu)", + score, stonith_max_attempts); } stonith_max_attempts = score; } @@ -72,8 +75,9 @@ set_fence_reaction(const char *reaction_s) } else { if (!pcmk__str_eq(reaction_s, PCMK_VALUE_STOP, pcmk__str_casei)) { - crm_warn("Invalid value '%s' for %s, using 'stop'", - reaction_s, PCMK_OPT_FENCE_REACTION); + pcmk__warn("Invalid value '%s' for " PCMK_OPT_FENCE_REACTION + ", using '" PCMK_VALUE_STOP "'", + reaction_s); } fence_reaction_panic = false; } @@ -127,8 +131,8 @@ too_many_st_failures(const char *target) return FALSE; too_many: - crm_warn("Too many failures (%d) to fence %s, giving up", - value->count, target); + pcmk__warn("Too many failures (%d) to fence %s, giving up", value->count, + target); return TRUE; } @@ -196,14 +200,15 @@ cib_fencing_updated(xmlNode *msg, int call_id, int rc, xmlNode *output, void *user_data) { if (rc < pcmk_ok) { - crm_err("Fencing update %d for %s: failed - %s (%d)", - call_id, (char *)user_data, pcmk_strerror(rc), rc); - crm_log_xml_warn(msg, "Failed update"); + pcmk__err("Fencing update %d for %s: failed - %s (%d)", + call_id, (char *)user_data, pcmk_strerror(rc), rc); + pcmk__log_xml_warn(msg, "Failed update"); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_shutdown, "CIB update failed", NULL); } else { - crm_info("Fencing update %d for %s: complete", call_id, (char *)user_data); + pcmk__info("Fencing update %d for %s: complete", call_id, + (const char *) user_data); } } @@ -242,19 +247,20 @@ update_node_state_after_fencing(const char *target, const char *target_xml_id) } if (peer->xml_id == NULL) { - crm_info("Recording XML ID '%s' for node '%s'", target_xml_id, target); + pcmk__info("Recording XML ID '%s' for node '%s'", target_xml_id, + target); peer->xml_id = pcmk__str_copy(target_xml_id); } crmd_peer_down(peer, TRUE); node_state = create_node_state_update(peer, flags, NULL, __func__); - crm_xml_add(node_state, PCMK_XA_ID, target_xml_id); + pcmk__xe_set(node_state, PCMK_XA_ID, target_xml_id); - if (pcmk_is_set(peer->flags, pcmk__node_status_remote)) { + if (pcmk__is_set(peer->flags, pcmk__node_status_remote)) { char *now_s = pcmk__ttoa(time(NULL)); - crm_xml_add(node_state, PCMK__XA_NODE_FENCED, now_s); + pcmk__xe_set(node_state, PCMK__XA_NODE_FENCED, now_s); free(now_s); } @@ -263,7 +269,8 @@ update_node_state_after_fencing(const char *target, const char *target_xml_id) cib_can_create); pcmk__xml_free(node_state); - crm_debug("Updating node state for %s after fencing (call %d)", target, rc); + pcmk__debug("Updating node state for %s after fencing (call %d)", target, + rc); fsa_register_cib_callback(rc, pcmk__str_copy(target), cib_fencing_updated); controld_delete_node_state(peer->name, controld_section_all, cib_none); @@ -331,7 +338,7 @@ remove_stonith_cleanup(const char *target) iter = iter->next; if (pcmk__str_eq(target, iter_name, pcmk__str_casei)) { - crm_trace("Removing %s from the cleanup list", iter_name); + pcmk__trace("Removing %s from the cleanup list", iter_name); stonith_cleanup_list = g_list_delete_link(stonith_cleanup_list, tmp); free(iter_name); } @@ -351,7 +358,7 @@ purge_stonith_cleanup(void) for (iter = stonith_cleanup_list; iter != NULL; iter = iter->next) { char *target = iter->data; - crm_info("Purging %s from stonith cleanup list", target); + pcmk__info("Purging %s from stonith cleanup list", target); free(target); } g_list_free(stonith_cleanup_list); @@ -374,7 +381,9 @@ execute_stonith_cleanup(void) pcmk__get_node(0, target, NULL, pcmk__node_search_cluster_member); const char *uuid = pcmk__cluster_get_xml_id(target_node); - crm_notice("Marking %s, target of a previous stonith action, as clean", target); + pcmk__notice("Marking %s, target of a previous stonith action, as " + "clean", + target); update_node_state_after_fencing(target, uuid); free(target); } @@ -409,7 +418,7 @@ fail_incompletable_stonith(pcmk__graph_t *graph) GList *lpc2 = NULL; pcmk__graph_synapse_t *synapse = (pcmk__graph_synapse_t *) lpc->data; - if (pcmk_is_set(synapse->flags, pcmk__synapse_confirmed)) { + if (pcmk__is_set(synapse->flags, pcmk__synapse_confirmed)) { continue; } @@ -417,23 +426,23 @@ fail_incompletable_stonith(pcmk__graph_t *graph) pcmk__graph_action_t *action = (pcmk__graph_action_t *) lpc2->data; if ((action->type != pcmk__cluster_graph_action) - || pcmk_is_set(action->flags, pcmk__graph_action_confirmed)) { + || pcmk__is_set(action->flags, pcmk__graph_action_confirmed)) { continue; } - task = crm_element_value(action->xml, PCMK_XA_OPERATION); + task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); if (pcmk__str_eq(task, PCMK_ACTION_STONITH, pcmk__str_casei)) { pcmk__set_graph_action_flags(action, pcmk__graph_action_failed); last_action = action->xml; pcmk__update_graph(graph, action); - crm_notice("Failing action %d (%s): fencer terminated", - action->id, pcmk__xe_id(action->xml)); + pcmk__notice("Failing action %d (%s): fencer terminated", + action->id, pcmk__xe_id(action->xml)); } } } if (last_action != NULL) { - crm_warn("Fencer failure resulted in unrunnable actions"); + pcmk__warn("Fencer failure resulted in unrunnable actions"); abort_for_stonith_failure(pcmk__graph_restart, NULL, last_action); return TRUE; } @@ -446,13 +455,13 @@ tengine_stonith_connection_destroy(stonith_t *st, stonith_event_t *e) { te_cleanup_stonith_history_sync(st, FALSE); - if (pcmk_is_set(controld_globals.fsa_input_register, R_ST_REQUIRED)) { - crm_err("Lost fencer connection (will attempt to reconnect)"); + if (pcmk__is_set(controld_globals.fsa_input_register, R_ST_REQUIRED)) { + pcmk__err("Lost fencer connection (will attempt to reconnect)"); if (!mainloop_timer_running(controld_fencer_connect_timer)) { mainloop_timer_start(controld_fencer_connect_timer); } } else { - crm_info("Disconnected from fencer"); + pcmk__info("Disconnected from fencer"); } if (stonith_api) { @@ -488,12 +497,12 @@ handle_fence_notification(stonith_t *st, stonith_event_t *event) int exec_status; if (te_client_id == NULL) { - te_client_id = crm_strdup_printf("%s.%lu", crm_system_name, - (unsigned long) getpid()); + te_client_id = pcmk__assert_asprintf("%s.%lu", crm_system_name, + (unsigned long) getpid()); } if (event == NULL) { - crm_err("Notify data not found"); + pcmk__err("Notify data not found"); return; } @@ -519,15 +528,15 @@ handle_fence_notification(stonith_t *st, stonith_event_t *event) if (pcmk__str_eq(PCMK_ACTION_ON, event->action, pcmk__str_none)) { // Unfencing doesn't need special handling, just a log message if (succeeded) { - crm_notice("%s was unfenced by %s at the request of %s@%s", - event->target, executioner, client, event->origin); + pcmk__notice("%s was unfenced by %s at the request of %s@%s", + event->target, executioner, client, event->origin); } else { - crm_err("Unfencing of %s by %s failed (%s%s%s) with exit status %d", - event->target, executioner, - pcmk_exec_status_str(exec_status), - ((reason == NULL)? "" : ": "), - ((reason == NULL)? "" : reason), - stonith__event_exit_status(event)); + pcmk__err("Unfencing of %s by %s failed (%s%s%s) with exit status " + "%d", + event->target, executioner, + pcmk_exec_status_str(exec_status), + ((reason == NULL)? "" : ": "), + pcmk__s(reason, ""), stonith__event_exit_status(event)); } return; } @@ -542,8 +551,8 @@ handle_fence_notification(stonith_t *st, stonith_event_t *event) * set our status to lost because of the fencing callback and discard * our subsequent election votes as "not part of our cluster". */ - crm_crit("We were allegedly just fenced by %s for %s!", - executioner, event->origin); // Dumps blackbox if enabled + pcmk__crit("We were allegedly just fenced by %s for %s!", executioner, + event->origin); // Dumps blackbox if enabled if (fence_reaction_panic) { pcmk__panic("Notified of own fencing"); } else { @@ -564,15 +573,13 @@ handle_fence_notification(stonith_t *st, stonith_event_t *event) } } - crm_notice("Peer %s was%s terminated (%s) by %s on behalf of %s@%s: " - "%s%s%s%s " QB_XS " event=%s", - event->target, (succeeded? "" : " not"), - event->action, executioner, client, event->origin, - (succeeded? "OK" : pcmk_exec_status_str(exec_status)), - ((reason == NULL)? "" : " ("), - ((reason == NULL)? "" : reason), - ((reason == NULL)? "" : ")"), - event->id); + pcmk__notice("Peer %s was%s terminated (%s) by %s on behalf of %s@%s: " + "%s%s%s%s " QB_XS " event=%s", + event->target, (succeeded? "" : " not"), event->action, + executioner, client, event->origin, + (succeeded? "OK" : pcmk_exec_status_str(exec_status)), + ((reason != NULL)? " (" : ""), pcmk__s(reason, ""), + ((reason != NULL)? ")" : ""), event->id); if (succeeded) { const uint32_t flags = pcmk__node_search_any @@ -604,22 +611,22 @@ handle_fence_notification(stonith_t *st, stonith_event_t *event) /* Abort the current transition if it wasn't the cluster that * initiated fencing. */ - crm_info("External fencing operation from %s fenced %s", - client, event->target); + pcmk__info("External fencing operation from %s fenced %s", + client, event->target); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, "External Fencing Operation", NULL); } } else if (pcmk__str_eq(controld_globals.dc_name, event->target, pcmk__str_null_matches|pcmk__str_casei) - && !pcmk_is_set(peer->flags, pcmk__node_status_remote)) { + && !pcmk__is_set(peer->flags, pcmk__node_status_remote)) { // Assume the target was our DC if we don't currently have one if (controld_globals.dc_name != NULL) { - crm_notice("Fencing target %s was our DC", event->target); + pcmk__notice("Fencing target %s was our DC", event->target); } else { - crm_notice("Fencing target %s may have been our DC", - event->target); + pcmk__notice("Fencing target %s may have been our DC", + event->target); } /* Given the CIB resyncing that occurs around elections, @@ -637,7 +644,7 @@ handle_fence_notification(stonith_t *st, stonith_event_t *event) * The connection won't necessarily drop when a remote node is fenced, * so the failure might not otherwise be detected until the next poke. */ - if (pcmk_is_set(peer->flags, pcmk__node_status_remote)) { + if (pcmk__is_set(peer->flags, pcmk__node_status_remote)) { remote_ra_fail(event->target); } @@ -662,13 +669,14 @@ controld_timer_fencer_connect(gpointer user_data) if (stonith_api == NULL) { stonith_api = stonith_api_new(); if (stonith_api == NULL) { - crm_err("Could not connect to fencer: API memory allocation failed"); + pcmk__err("Could not connect to fencer: API memory allocation " + "failed"); return G_SOURCE_REMOVE; } } if (stonith_api->state != stonith_disconnected) { - crm_trace("Already connected to fencer, no need to retry"); + pcmk__trace("Already connected to fencer, no need to retry"); return G_SOURCE_REMOVE; } @@ -676,8 +684,9 @@ controld_timer_fencer_connect(gpointer user_data) // 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 " - QB_XS " rc=%d", pcmk_strerror(rc), rc); + pcmk__err("Could not connect to fencer in 30 attempts: %s " + QB_XS " rc=%d", + pcmk_strerror(rc), rc); } } else { // Non-blocking (retry failures later in main loop) @@ -691,10 +700,11 @@ controld_timer_fencer_connect(gpointer user_data) } if (rc != pcmk_ok) { - if (pcmk_is_set(controld_globals.fsa_input_register, - R_ST_REQUIRED)) { - crm_notice("Fencer connection failed (will retry): %s " - QB_XS " rc=%d", pcmk_strerror(rc), rc); + if (pcmk__is_set(controld_globals.fsa_input_register, + R_ST_REQUIRED)) { + pcmk__notice("Fencer connection failed (will retry): %s " + QB_XS " rc=%d", + pcmk_strerror(rc), rc); if (!mainloop_timer_running(controld_fencer_connect_timer)) { mainloop_timer_start(controld_fencer_connect_timer); @@ -702,8 +712,9 @@ controld_timer_fencer_connect(gpointer user_data) return G_SOURCE_CONTINUE; } else { - crm_info("Fencer connection failed (ignoring because no longer required): %s " - QB_XS " rc=%d", pcmk_strerror(rc), rc); + pcmk__info("Fencer connection failed (ignoring because no " + "longer required): %s " QB_XS " rc=%d", + pcmk_strerror(rc), rc); } return G_SOURCE_REMOVE; } @@ -721,7 +732,7 @@ controld_timer_fencer_connect(gpointer user_data) PCMK__VALUE_ST_NOTIFY_HISTORY_SYNCED, tengine_stonith_history_synced); te_trigger_stonith_history_sync(TRUE); - crm_notice("Fencer successfully connected"); + pcmk__notice("Fencer successfully connected"); } return G_SOURCE_REMOVE; @@ -768,7 +779,8 @@ do_stonith_history_sync(gpointer user_data) stonith_history_free(history); return TRUE; } else { - crm_info("Skip triggering stonith history-sync as stonith is disconnected"); + pcmk__info("Skip triggering stonith history-sync as stonith is " + "disconnected"); return FALSE; } } @@ -783,9 +795,9 @@ tengine_stonith_callback(stonith_t *stonith, stonith_callback_data_t *data) const char *target = NULL; if ((data == NULL) || (data->userdata == NULL)) { - crm_err("Ignoring fence operation %d result: " - "No transition key given (bug?)", - ((data == NULL)? -1 : data->call_id)); + pcmk__err("Ignoring fence operation %d result: No transition key given " + "(bug?)", + ((data == NULL)? -1 : data->call_id)); return; } @@ -795,9 +807,9 @@ tengine_stonith_callback(stonith_t *stonith, stonith_callback_data_t *data) if (reason == NULL) { reason = pcmk_exec_status_str(stonith__execution_status(data)); } - crm_notice("Result of fence operation %d: %d (%s) " QB_XS " key=%s", - data->call_id, stonith__exit_status(data), reason, - (const char *) data->userdata); + pcmk__notice("Result of fence operation %d: %d (%s) " QB_XS " key=%s", + data->call_id, stonith__exit_status(data), reason, + (const char *) data->userdata); return; } @@ -808,41 +820,40 @@ tengine_stonith_callback(stonith_t *stonith, stonith_callback_data_t *data) if (controld_globals.transition_graph->complete || (stonith_id < 0) || !pcmk__str_eq(uuid, controld_globals.te_uuid, pcmk__str_none) || (controld_globals.transition_graph->id != transition_id)) { - crm_info("Ignoring fence operation %d result: " - "Not from current transition " QB_XS - " complete=%s action=%d uuid=%s (vs %s) transition=%d (vs %d)", - data->call_id, - pcmk__btoa(controld_globals.transition_graph->complete), - stonith_id, uuid, controld_globals.te_uuid, transition_id, - controld_globals.transition_graph->id); + pcmk__info("Ignoring fence operation %d result: Not from current " + "transition " QB_XS " complete=%s action=%d uuid=%s (vs %s) " + "transition=%d (vs %d)", + data->call_id, + pcmk__btoa(controld_globals.transition_graph->complete), + stonith_id, uuid, controld_globals.te_uuid, transition_id, + controld_globals.transition_graph->id); goto bail; } action = controld_get_action(stonith_id); if (action == NULL) { - crm_err("Ignoring fence operation %d result: " - "Action %d not found in transition graph (bug?) " - QB_XS " uuid=%s transition=%d", - data->call_id, stonith_id, uuid, transition_id); + pcmk__err("Ignoring fence operation %d result: Action %d not found in " + "transition graph (bug?) " QB_XS " uuid=%s transition=%d", + data->call_id, stonith_id, uuid, transition_id); goto bail; } - target = crm_element_value(action->xml, PCMK__META_ON_NODE); + target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); if (target == NULL) { - crm_err("Ignoring fence operation %d result: No target given (bug?)", - data->call_id); + pcmk__err("Ignoring fence operation %d result: No target given (bug?)", + data->call_id); goto bail; } stop_te_timer(action); if (stonith__exit_status(data) == CRM_EX_OK) { - const char *uuid = crm_element_value(action->xml, - PCMK__META_ON_NODE_UUID); + const char *uuid = pcmk__xe_get(action->xml, PCMK__META_ON_NODE_UUID); const char *op = crm_meta_value(action->params, PCMK__META_STONITH_ACTION); - crm_info("Fence operation %d for %s succeeded", data->call_id, target); - if (!(pcmk_is_set(action->flags, pcmk__graph_action_confirmed))) { + pcmk__info("Fence operation %d for %s succeeded", data->call_id, + target); + if (!(pcmk__is_set(action->flags, pcmk__graph_action_confirmed))) { te_action_confirmed(action, NULL); if (pcmk__str_eq(PCMK_ACTION_ON, op, pcmk__str_casei)) { const char *value = NULL; @@ -874,7 +885,8 @@ tengine_stonith_callback(stonith_t *stonith, stonith_callback_data_t *data) update_attrd(target, CRM_ATTR_DIGESTS_SECURE, value, NULL, is_remote_node); - } else if (!(pcmk_is_set(action->flags, pcmk__graph_action_sent_update))) { + } else if (!pcmk__is_set(action->flags, + pcmk__graph_action_sent_update)) { update_node_state_after_fencing(target, uuid); pcmk__set_graph_action_flags(action, pcmk__graph_action_sent_update); @@ -900,13 +912,14 @@ tengine_stonith_callback(stonith_t *stonith, stonith_callback_data_t *data) * checking again, so don't start a new transition in that case. */ if (status == PCMK_EXEC_NO_FENCE_DEVICE) { - crm_warn("Fence operation %d for %s failed: %s " - "(aborting transition and giving up for now)", - data->call_id, target, reason); + pcmk__warn("Fence operation %d for %s failed: %s (aborting " + "transition and giving up for now)", + data->call_id, target, reason); abort_action = pcmk__graph_wait; } else { - crm_notice("Fence operation %d for %s failed: %s " - "(aborting transition)", data->call_id, target, reason); + pcmk__notice("Fence operation %d for %s failed: %s (aborting " + "transition)", + data->call_id, target, reason); } /* Increment the fail count now, so abort_for_stonith_failure() can @@ -954,8 +967,8 @@ controld_execute_fence_action(pcmk__graph_t *graph, { int rc = 0; const char *id = pcmk__xe_id(action->xml); - const char *uuid = crm_element_value(action->xml, PCMK__META_ON_NODE_UUID); - const char *target = crm_element_value(action->xml, PCMK__META_ON_NODE); + const char *uuid = pcmk__xe_get(action->xml, PCMK__META_ON_NODE_UUID); + const char *target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); const char *type = crm_meta_value(action->params, PCMK__META_STONITH_ACTION); char *transition_key = NULL; @@ -970,18 +983,18 @@ controld_execute_fence_action(pcmk__graph_t *graph, CRM_CHECK(target != NULL, invalid_action = TRUE); if (invalid_action) { - crm_log_xml_warn(action->xml, "BadAction"); + pcmk__log_xml_warn(action->xml, "BadAction"); return EPROTO; } priority_delay = crm_meta_value(action->params, PCMK_OPT_PRIORITY_FENCING_DELAY); - crm_notice("Requesting fencing (%s) targeting node %s " - QB_XS " action=%s timeout=%i%s%s", - type, target, id, stonith_timeout, - priority_delay ? " priority_delay=" : "", - priority_delay ? priority_delay : ""); + pcmk__notice("Requesting fencing (%s) targeting node %s " + QB_XS " action=%s timeout=%i%s%s", + type, target, id, stonith_timeout, + ((priority_delay != NULL)? " priority_delay=" : ""), + pcmk__s(priority_delay, "")); /* Passing NULL means block until we can connect... */ controld_timer_fencer_connect(NULL); @@ -1003,16 +1016,16 @@ controld_execute_fence_action(pcmk__graph_t *graph, bool controld_verify_stonith_watchdog_timeout(const char *value) { - long long st_timeout = (value != NULL)? crm_get_msec(value) : 0; const char *our_nodename = controld_globals.cluster->priv->node_name; - if (st_timeout == 0 - || (stonith_api && (stonith_api->state != stonith_disconnected) && - stonith__watchdog_fencing_enabled_for_node_api(stonith_api, - our_nodename))) { - return pcmk__valid_stonith_watchdog_timeout(value); + if ((stonith_api == NULL) || (stonith_api->state == stonith_disconnected) + || !stonith__watchdog_fencing_enabled_for_node_api(stonith_api, + our_nodename)) { + // Anything is valid since it won't be used + return true; } - return true; + + return pcmk__valid_stonith_watchdog_timeout(value); } /* end stonith API client functions */ @@ -1051,7 +1064,7 @@ static void tengine_stonith_history_synced(stonith_t *st, stonith_event_t *st_event) { te_cleanup_stonith_history_sync(st, FALSE); - crm_debug("Fence-history synced - cancel all timers"); + pcmk__debug("Fence-history synced - cancel all timers"); } static gboolean @@ -1094,7 +1107,8 @@ te_trigger_stonith_history_sync(bool long_timeout) FALSE, stonith_history_sync_set_trigger, NULL); } - crm_info("Fence history will be synchronized cluster-wide within 30 seconds"); + pcmk__info("Fence history will be synchronized cluster-wide within 30 " + "seconds"); mainloop_timer_start(stonith_history_sync_timer_long); } else { if(stonith_history_sync_timer_short == NULL) { @@ -1103,7 +1117,8 @@ te_trigger_stonith_history_sync(bool long_timeout) FALSE, stonith_history_sync_set_trigger, NULL); } - crm_info("Fence history will be synchronized cluster-wide within 5 seconds"); + pcmk__info("Fence history will be synchronized cluster-wide within 5 " + "seconds"); mainloop_timer_start(stonith_history_sync_timer_short); } diff --git a/daemons/controld/controld_fsa.c b/daemons/controld/controld_fsa.c index b0d2e1dd49b..fd0282cd43b 100644 --- a/daemons/controld/controld_fsa.c +++ b/daemons/controld/controld_fsa.c @@ -57,7 +57,7 @@ do_log(long long action, enum crmd_fsa_cause cause, enum crmd_fsa_state cur_state, enum crmd_fsa_input current_input, fsa_data_t *msg_data) { - unsigned log_type = LOG_TRACE; + unsigned log_type = PCMK__LOG_TRACE; if (action & A_LOG) { log_type = LOG_INFO; @@ -74,12 +74,12 @@ do_log(long long action, enum crmd_fsa_cause cause, if (msg_data->data_type == fsa_dt_ha_msg) { ha_msg_input_t *input = fsa_typed_data(msg_data->data_type); - crm_log_xml_debug(input->msg, __func__); + pcmk__log_xml_debug(input->msg, __func__); } else if (msg_data->data_type == fsa_dt_xml) { xmlNode *input = fsa_typed_data(msg_data->data_type); - crm_log_xml_debug(input, __func__); + pcmk__log_xml_debug(input, __func__); } else if (msg_data->data_type == fsa_dt_lrm) { lrmd_event_data_t *input = fsa_typed_data(msg_data->data_type); @@ -125,7 +125,7 @@ void controld_trigger_fsa_as(const char *fn, int line) { if (fsa_trigger != NULL) { - crm_trace("%s:%d - Triggered FSA invocation", fn, line); + pcmk__trace("%s:%d - Triggered FSA invocation", fn, line); mainloop_set_trigger(fsa_trigger); } } @@ -139,9 +139,9 @@ s_crmd_fsa(enum crmd_fsa_cause cause) uint64_t new_actions = A_NOTHING; enum crmd_fsa_state last_state; - crm_trace("FSA invoked with Cause: %s\tState: %s", - fsa_cause2string(cause), - fsa_state2string(globals->fsa_state)); + pcmk__trace("FSA invoked with Cause: %s\tState: %s", + fsa_cause2string(cause), + fsa_state2string(globals->fsa_state)); fsa_dump_actions(controld_globals.fsa_actions, "Initial"); @@ -158,9 +158,9 @@ s_crmd_fsa(enum crmd_fsa_cause cause) = g_list_append(controld_globals.fsa_message_queue, fsa_data); } while ((controld_globals.fsa_message_queue != NULL) - && !pcmk_is_set(controld_globals.flags, controld_fsa_is_stalled)) { - crm_trace("Checking messages (%d remaining)", - g_list_length(controld_globals.fsa_message_queue)); + && !pcmk__is_set(controld_globals.flags, controld_fsa_is_stalled)) { + pcmk__trace("Checking messages (%u remaining)", + g_list_length(controld_globals.fsa_message_queue)); fsa_data = get_message(); if(fsa_data == NULL) { @@ -179,20 +179,21 @@ s_crmd_fsa(enum crmd_fsa_cause cause) fsa_dump_actions(new_actions, "New actions"); if (fsa_data->fsa_input != I_NULL && fsa_data->fsa_input != I_ROUTER) { - crm_debug("Processing %s: [ state=%s cause=%s origin=%s ]", - fsa_input2string(fsa_data->fsa_input), - fsa_state2string(globals->fsa_state), - fsa_cause2string(fsa_data->fsa_cause), fsa_data->origin); + pcmk__debug("Processing %s: [ state=%s cause=%s origin=%s ]", + fsa_input2string(fsa_data->fsa_input), + fsa_state2string(globals->fsa_state), + fsa_cause2string(fsa_data->fsa_cause), + fsa_data->origin); } /* logging : *before* the state is changed */ - if (pcmk_is_set(controld_globals.fsa_actions, A_ERROR)) { + if (pcmk__is_set(controld_globals.fsa_actions, A_ERROR)) { do_fsa_action(fsa_data, A_ERROR, do_log); } - if (pcmk_is_set(controld_globals.fsa_actions, A_WARN)) { + if (pcmk__is_set(controld_globals.fsa_actions, A_WARN)) { do_fsa_action(fsa_data, A_WARN, do_log); } - if (pcmk_is_set(controld_globals.fsa_actions, A_LOG)) { + if (pcmk__is_set(controld_globals.fsa_actions, A_LOG)) { do_fsa_action(fsa_data, A_LOG, do_log); } @@ -204,7 +205,7 @@ s_crmd_fsa(enum crmd_fsa_cause cause) * Remove certain actions during shutdown */ if ((globals->fsa_state == S_STOPPING) - || pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + || pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { controld_clear_fsa_action_flags(startup_actions); } @@ -223,16 +224,16 @@ s_crmd_fsa(enum crmd_fsa_cause cause) if ((controld_globals.fsa_message_queue != NULL) || (controld_globals.fsa_actions != A_NOTHING) - || pcmk_is_set(controld_globals.flags, controld_fsa_is_stalled)) { - - crm_debug("Exiting the FSA: queue=%d, fsa_actions=%" PRIx64 - ", stalled=%s", - g_list_length(controld_globals.fsa_message_queue), - controld_globals.fsa_actions, - pcmk__flag_text(controld_globals.flags, - controld_fsa_is_stalled)); + || pcmk__is_set(controld_globals.flags, controld_fsa_is_stalled)) { + + pcmk__debug("Exiting the FSA: queue=%d, fsa_actions=%" PRIx64 + ", stalled=%s", + g_list_length(controld_globals.fsa_message_queue), + controld_globals.fsa_actions, + pcmk__flag_text(controld_globals.flags, + controld_fsa_is_stalled)); } else { - crm_trace("Exiting the FSA"); + pcmk__trace("Exiting the FSA"); } /* cleanup inputs? */ @@ -259,152 +260,156 @@ s_crmd_fsa_actions(fsa_data_t * fsa_data) */ CRM_CHECK(fsa_data != NULL, return); while ((controld_globals.fsa_actions != A_NOTHING) - && !pcmk_is_set(controld_globals.flags, controld_fsa_is_stalled)) { + && !pcmk__is_set(controld_globals.flags, controld_fsa_is_stalled)) { /* regular action processing in order of action priority * * Make sure all actions that connect to required systems * are performed first */ - if (pcmk_is_set(controld_globals.fsa_actions, A_ERROR)) { + if (pcmk__is_set(controld_globals.fsa_actions, A_ERROR)) { do_fsa_action(fsa_data, A_ERROR, do_log); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_WARN)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_WARN)) { do_fsa_action(fsa_data, A_WARN, do_log); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_LOG)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_LOG)) { do_fsa_action(fsa_data, A_LOG, do_log); /* get out of here NOW! before anything worse happens */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_EXIT_1)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_EXIT_1)) { do_fsa_action(fsa_data, A_EXIT_1, do_exit); /* sub-system restart */ - } else if (pcmk_all_flags_set(controld_globals.fsa_actions, - O_LRM_RECONNECT)) { + } else if (pcmk__all_flags_set(controld_globals.fsa_actions, + O_LRM_RECONNECT)) { do_fsa_action(fsa_data, O_LRM_RECONNECT, do_lrm_control); - } else if (pcmk_all_flags_set(controld_globals.fsa_actions, - O_CIB_RESTART)) { + } else if (pcmk__all_flags_set(controld_globals.fsa_actions, + O_CIB_RESTART)) { do_fsa_action(fsa_data, O_CIB_RESTART, do_cib_control); - } else if (pcmk_all_flags_set(controld_globals.fsa_actions, - O_PE_RESTART)) { + } else if (pcmk__all_flags_set(controld_globals.fsa_actions, + O_PE_RESTART)) { do_fsa_action(fsa_data, O_PE_RESTART, do_pe_control); - } else if (pcmk_all_flags_set(controld_globals.fsa_actions, - O_TE_RESTART)) { + } else if (pcmk__all_flags_set(controld_globals.fsa_actions, + O_TE_RESTART)) { do_fsa_action(fsa_data, O_TE_RESTART, do_te_control); /* essential start tasks */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_STARTUP)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_STARTUP)) { do_fsa_action(fsa_data, A_STARTUP, do_startup); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_CIB_START)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_CIB_START)) { do_fsa_action(fsa_data, A_CIB_START, do_cib_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_HA_CONNECT)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_HA_CONNECT)) { do_fsa_action(fsa_data, A_HA_CONNECT, do_ha_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_READCONFIG)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_READCONFIG)) { do_fsa_action(fsa_data, A_READCONFIG, do_read_config); /* sub-system start/connect */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_LRM_CONNECT)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_LRM_CONNECT)) { do_fsa_action(fsa_data, A_LRM_CONNECT, do_lrm_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_TE_START)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_TE_START)) { do_fsa_action(fsa_data, A_TE_START, do_te_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_PE_START)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_PE_START)) { do_fsa_action(fsa_data, A_PE_START, do_pe_control); /* Timers */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_DC_TIMER_STOP)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_DC_TIMER_STOP)) { do_fsa_action(fsa_data, A_DC_TIMER_STOP, do_timer_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_INTEGRATE_TIMER_STOP)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_INTEGRATE_TIMER_STOP)) { do_fsa_action(fsa_data, A_INTEGRATE_TIMER_STOP, do_timer_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_INTEGRATE_TIMER_START)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_INTEGRATE_TIMER_START)) { do_fsa_action(fsa_data, A_INTEGRATE_TIMER_START, do_timer_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_FINALIZE_TIMER_STOP)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_FINALIZE_TIMER_STOP)) { do_fsa_action(fsa_data, A_FINALIZE_TIMER_STOP, do_timer_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_FINALIZE_TIMER_START)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_FINALIZE_TIMER_START)) { do_fsa_action(fsa_data, A_FINALIZE_TIMER_START, do_timer_control); /* * Highest priority actions */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_MSG_ROUTE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_MSG_ROUTE)) { do_fsa_action(fsa_data, A_MSG_ROUTE, do_msg_route); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_RECOVER)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_RECOVER)) { do_fsa_action(fsa_data, A_RECOVER, do_recover); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_CL_JOIN_RESULT)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_CL_JOIN_RESULT)) { do_fsa_action(fsa_data, A_CL_JOIN_RESULT, do_cl_join_finalize_respond); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_CL_JOIN_REQUEST)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_CL_JOIN_REQUEST)) { do_fsa_action(fsa_data, A_CL_JOIN_REQUEST, do_cl_join_offer_respond); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_SHUTDOWN_REQ)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_SHUTDOWN_REQ)) { do_fsa_action(fsa_data, A_SHUTDOWN_REQ, do_shutdown_req); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_ELECTION_VOTE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_ELECTION_VOTE)) { do_fsa_action(fsa_data, A_ELECTION_VOTE, do_election_vote); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_ELECTION_COUNT)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_ELECTION_COUNT)) { do_fsa_action(fsa_data, A_ELECTION_COUNT, do_election_count_vote); /* * High priority actions */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_STARTED)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_STARTED)) { do_fsa_action(fsa_data, A_STARTED, do_started); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_CL_JOIN_QUERY)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_CL_JOIN_QUERY)) { do_fsa_action(fsa_data, A_CL_JOIN_QUERY, do_cl_join_query); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_DC_TIMER_START)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_DC_TIMER_START)) { do_fsa_action(fsa_data, A_DC_TIMER_START, do_timer_control); /* * Medium priority actions * - Membership */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_DC_TAKEOVER)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_DC_TAKEOVER)) { do_fsa_action(fsa_data, A_DC_TAKEOVER, do_dc_takeover); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_DC_RELEASE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_DC_RELEASE)) { do_fsa_action(fsa_data, A_DC_RELEASE, do_dc_release); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_DC_JOIN_FINAL)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_DC_JOIN_FINAL)) { do_fsa_action(fsa_data, A_DC_JOIN_FINAL, do_dc_join_final); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_ELECTION_CHECK)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_ELECTION_CHECK)) { do_fsa_action(fsa_data, A_ELECTION_CHECK, do_election_check); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_ELECTION_START)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_ELECTION_START)) { do_fsa_action(fsa_data, A_ELECTION_START, do_election_vote); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_DC_JOIN_OFFER_ALL)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_DC_JOIN_OFFER_ALL)) { do_fsa_action(fsa_data, A_DC_JOIN_OFFER_ALL, do_dc_join_offer_all); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_DC_JOIN_OFFER_ONE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_DC_JOIN_OFFER_ONE)) { do_fsa_action(fsa_data, A_DC_JOIN_OFFER_ONE, do_dc_join_offer_one); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_DC_JOIN_PROCESS_REQ)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_DC_JOIN_PROCESS_REQ)) { do_fsa_action(fsa_data, A_DC_JOIN_PROCESS_REQ, do_dc_join_filter_offer); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_DC_JOIN_PROCESS_ACK)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_DC_JOIN_PROCESS_ACK)) { do_fsa_action(fsa_data, A_DC_JOIN_PROCESS_ACK, do_dc_join_ack); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_DC_JOIN_FINALIZE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_DC_JOIN_FINALIZE)) { do_fsa_action(fsa_data, A_DC_JOIN_FINALIZE, do_dc_join_finalize); - } else if (pcmk_is_set(controld_globals.fsa_actions, - A_CL_JOIN_ANNOUNCE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_CL_JOIN_ANNOUNCE)) { do_fsa_action(fsa_data, A_CL_JOIN_ANNOUNCE, do_cl_join_announce); /* @@ -412,46 +417,47 @@ s_crmd_fsa_actions(fsa_data_t * fsa_data) * Make sure the CIB is always updated before invoking the * scheduler, and the scheduler before the transition engine. */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_TE_HALT)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_TE_HALT)) { do_fsa_action(fsa_data, A_TE_HALT, do_te_invoke); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_TE_CANCEL)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_TE_CANCEL)) { do_fsa_action(fsa_data, A_TE_CANCEL, do_te_invoke); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_LRM_INVOKE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_LRM_INVOKE)) { do_fsa_action(fsa_data, A_LRM_INVOKE, do_lrm_invoke); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_PE_INVOKE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_PE_INVOKE)) { do_fsa_action(fsa_data, A_PE_INVOKE, do_pe_invoke); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_TE_INVOKE)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_TE_INVOKE)) { do_fsa_action(fsa_data, A_TE_INVOKE, do_te_invoke); /* Shutdown actions */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_DC_RELEASED)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_DC_RELEASED)) { do_fsa_action(fsa_data, A_DC_RELEASED, do_dc_release); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_PE_STOP)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_PE_STOP)) { do_fsa_action(fsa_data, A_PE_STOP, do_pe_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_TE_STOP)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_TE_STOP)) { do_fsa_action(fsa_data, A_TE_STOP, do_te_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_SHUTDOWN)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_SHUTDOWN)) { do_fsa_action(fsa_data, A_SHUTDOWN, do_shutdown); - } else if (pcmk_is_set(controld_globals.fsa_actions, + } else if (pcmk__is_set(controld_globals.fsa_actions, A_LRM_DISCONNECT)) { do_fsa_action(fsa_data, A_LRM_DISCONNECT, do_lrm_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_HA_DISCONNECT)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, + A_HA_DISCONNECT)) { do_fsa_action(fsa_data, A_HA_DISCONNECT, do_ha_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_CIB_STOP)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_CIB_STOP)) { do_fsa_action(fsa_data, A_CIB_STOP, do_cib_control); - } else if (pcmk_is_set(controld_globals.fsa_actions, A_STOP)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_STOP)) { do_fsa_action(fsa_data, A_STOP, do_stop); /* exit gracefully */ - } else if (pcmk_is_set(controld_globals.fsa_actions, A_EXIT_0)) { + } else if (pcmk__is_set(controld_globals.fsa_actions, A_EXIT_0)) { do_fsa_action(fsa_data, A_EXIT_0, do_exit); /* Error checking and reporting */ } else { - crm_err("Action %s not supported " QB_XS " %" PRIx64, - fsa_action2string(controld_globals.fsa_actions), - controld_globals.fsa_actions); + pcmk__err("Action %s not supported " QB_XS " %" PRIx64, + fsa_action2string(controld_globals.fsa_actions), + controld_globals.fsa_actions); register_fsa_error_adv(C_FSA_INTERNAL, I_ERROR, fsa_data, NULL, __func__); } @@ -462,19 +468,19 @@ void log_fsa_input(fsa_data_t * stored_msg) { pcmk__assert(stored_msg != NULL); - crm_trace("Processing queued input %d", stored_msg->id); + pcmk__trace("Processing queued input %d", stored_msg->id); if (stored_msg->fsa_cause == C_LRM_OP_CALLBACK) { - crm_trace("FSA processing LRM callback from %s", stored_msg->origin); + pcmk__trace("FSA processing LRM callback from %s", stored_msg->origin); } else if (stored_msg->data == NULL) { - crm_trace("FSA processing input from %s", stored_msg->origin); + pcmk__trace("FSA processing input from %s", stored_msg->origin); } else { ha_msg_input_t *ha_input = fsa_typed_data_adv(stored_msg, fsa_dt_ha_msg, __func__); - crm_trace("FSA processing XML message from %s", stored_msg->origin); - crm_log_xml_trace(ha_input->xml, "FSA message data"); + pcmk__trace("FSA processing XML message from %s", stored_msg->origin); + pcmk__log_xml_trace(ha_input->xml, "FSA message data"); } } @@ -486,8 +492,8 @@ check_join_counts(fsa_data_t *msg_data) count = crmd_join_phase_count(controld_join_finalized); if (count > 0) { - crm_err("%d cluster node%s failed to confirm join", - count, pcmk__plural_s(count)); + pcmk__err("%d cluster node%s failed to confirm join", count, + pcmk__plural_s(count)); crmd_join_phase_log(LOG_NOTICE); return; } @@ -496,25 +502,27 @@ check_join_counts(fsa_data_t *msg_data) count = crmd_join_phase_count(controld_join_confirmed); if (count == npeers) { if (npeers == 1) { - crm_debug("Sole active cluster node is fully joined"); + pcmk__debug("Sole active cluster node is fully joined"); } else { - crm_debug("All %d active cluster nodes are fully joined", count); + pcmk__debug("All %d active cluster nodes are fully joined", count); } } else if (count > npeers) { - crm_err("New election needed because more nodes confirmed join " - "than are in membership (%d > %u)", count, npeers); + pcmk__err("New election needed because more nodes confirmed join " + "than are in membership (%d > %u)", + count, npeers); register_fsa_input(C_FSA_INTERNAL, I_ELECTION, NULL); } else if (controld_globals.membership_id != controld_globals.peer_seq) { - crm_info("New join needed because membership changed (%llu -> %llu)", - controld_globals.membership_id, controld_globals.peer_seq); + pcmk__info("New join needed because membership changed (%llu -> %llu)", + controld_globals.membership_id, controld_globals.peer_seq); register_fsa_input_before(C_FSA_INTERNAL, I_NODE_JOIN, NULL); } else { - crm_warn("Only %d of %u active cluster nodes fully joined " - "(%d did not respond to offer)", - count, npeers, crmd_join_phase_count(controld_join_welcomed)); + pcmk__warn("Only %d of %u active cluster nodes fully joined (%d did " + "not respond to offer)", + count, npeers, + crmd_join_phase_count(controld_join_welcomed)); } } @@ -598,13 +606,14 @@ do_state_transition(enum crmd_fsa_state cur_state, controld_reset_counter_election_timer(); purge_stonith_cleanup(); - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { - crm_info("(Re)Issuing shutdown request now" " that we have a new DC"); + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + pcmk__info("(Re)Issuing shutdown request now" " that we have a " + "new DC"); controld_set_fsa_action_flags(A_SHUTDOWN_REQ); } CRM_LOG_ASSERT(controld_globals.dc_name != NULL); if (controld_globals.dc_name == NULL) { - crm_err("Reached S_NOT_DC without a DC" " being recorded"); + pcmk__err("Reached S_NOT_DC without a DC" " being recorded"); } break; @@ -615,18 +624,19 @@ do_state_transition(enum crmd_fsa_state cur_state, case S_FINALIZE_JOIN: CRM_LOG_ASSERT(AM_I_DC); if (cause == C_TIMER_POPPED) { - crm_warn("Progressed to state %s after %s", - fsa_state2string(next_state), fsa_cause2string(cause)); + pcmk__warn("Progressed to state %s after %s", + fsa_state2string(next_state), + fsa_cause2string(cause)); } count = crmd_join_phase_count(controld_join_welcomed); if (count > 0) { - crm_warn("%d cluster node%s failed to respond to join offer", - count, pcmk__plural_s(count)); + pcmk__warn("%d cluster node%s failed to respond to join offer", + count, pcmk__plural_s(count)); crmd_join_phase_log(LOG_NOTICE); } else { - crm_debug("All cluster nodes (%d) responded to join offer", - crmd_join_phase_count(controld_join_integrated)); + pcmk__debug("All cluster nodes (%d) responded to join offer", + crmd_join_phase_count(controld_join_integrated)); } break; @@ -634,8 +644,9 @@ do_state_transition(enum crmd_fsa_state cur_state, controld_reset_counter_election_timer(); CRM_LOG_ASSERT(AM_I_DC); if (cause == C_TIMER_POPPED) { - crm_info("Progressed to state %s after %s", - fsa_state2string(next_state), fsa_cause2string(cause)); + pcmk__info("Progressed to state %s after %s", + fsa_state2string(next_state), + fsa_cause2string(cause)); } check_join_counts(msg_data); break; @@ -648,8 +659,9 @@ do_state_transition(enum crmd_fsa_state cur_state, case S_IDLE: CRM_LOG_ASSERT(AM_I_DC); - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { - crm_info("(Re)Issuing shutdown request now" " that we are the DC"); + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + pcmk__info("(Re)Issuing shutdown request now" " that we are " + "the DC"); controld_set_fsa_action_flags(A_SHUTDOWN_REQ); } controld_start_recheck_timer(); diff --git a/daemons/controld/controld_fsa.h b/daemons/controld/controld_fsa.h index 29cad93e795..b6b9408af8a 100644 --- a/daemons/controld/controld_fsa.h +++ b/daemons/controld/controld_fsa.h @@ -16,6 +16,7 @@ # include # include # include +# include // PCMK__LOG_TRACE # include /*! States the controller can be in */ @@ -446,7 +447,7 @@ struct fsa_data_s { #define controld_set_fsa_input_flags(flags_to_set) do { \ controld_globals.fsa_input_register \ - = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \ + = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, \ "FSA input", "controller", \ controld_globals.fsa_input_register, \ (flags_to_set), #flags_to_set); \ @@ -454,7 +455,7 @@ struct fsa_data_s { #define controld_clear_fsa_input_flags(flags_to_clear) do { \ controld_globals.fsa_input_register \ - = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ + = pcmk__clear_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, \ "FSA input", "controller", \ controld_globals.fsa_input_register, \ (flags_to_clear), \ @@ -496,8 +497,8 @@ void controld_destroy_fsa_trigger(void); void free_max_generation(void); -# define AM_I_DC pcmk_is_set(controld_globals.fsa_input_register, R_THE_DC) -# define controld_trigger_fsa() controld_trigger_fsa_as(__func__, __LINE__) +#define AM_I_DC pcmk__is_set(controld_globals.fsa_input_register, R_THE_DC) +#define controld_trigger_fsa() controld_trigger_fsa_as(__func__, __LINE__) void controld_trigger_fsa_as(const char *fn, int line); diff --git a/daemons/controld/controld_globals.h b/daemons/controld/controld_globals.h index 8f64f531cb6..6b41460f917 100644 --- a/daemons/controld/controld_globals.h +++ b/daemons/controld/controld_globals.h @@ -134,18 +134,20 @@ enum controld_flags { # define controld_set_global_flags(flags_to_set) do { \ controld_globals.flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ + PCMK__LOG_TRACE, \ "Global", "controller", \ controld_globals.flags, \ (flags_to_set), \ #flags_to_set); \ } while (0) -# define controld_clear_global_flags(flags_to_clear) do { \ - controld_globals.flags \ - = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Global", \ - "controller", controld_globals.flags, \ - (flags_to_clear), #flags_to_clear); \ +# define controld_clear_global_flags(flags_to_clear) do { \ + controld_globals.flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Global", "controller", \ + controld_globals.flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) #endif // ifndef CONTROLD_GLOBALS__H diff --git a/daemons/controld/controld_join_client.c b/daemons/controld/controld_join_client.c index da6cbd3bd8f..43144898688 100644 --- a/daemons/controld/controld_join_client.c +++ b/daemons/controld/controld_join_client.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -55,7 +55,7 @@ do_cl_join_query(long long action, sleep(1); // Give the cluster layer time to propagate to the DC update_dc(NULL); /* Unset any existing value so that the result is not discarded */ - crm_debug("Querying for a DC"); + pcmk__debug("Querying for a DC"); pcmk__cluster_send_message(NULL, pcmk_ipc_controld, req); pcmk__xml_free(req); } @@ -73,25 +73,26 @@ do_cl_join_announce(long long action, { /* don't announce if we're in one of these states */ if (cur_state != S_PENDING) { - crm_warn("Not announcing cluster join because in state %s", - fsa_state2string(cur_state)); + pcmk__warn("Not announcing cluster join because in state %s", + fsa_state2string(cur_state)); return; } - if (!pcmk_is_set(controld_globals.fsa_input_register, R_STARTING)) { + if (!pcmk__is_set(controld_globals.fsa_input_register, R_STARTING)) { /* send as a broadcast */ xmlNode *req = pcmk__new_request(pcmk_ipc_controld, CRM_SYSTEM_CRMD, NULL, CRM_SYSTEM_DC, CRM_OP_JOIN_ANNOUNCE, NULL); - crm_debug("Announcing availability"); + pcmk__debug("Announcing availability"); update_dc(NULL); pcmk__cluster_send_message(NULL, pcmk_ipc_controld, req); pcmk__xml_free(req); } else { /* Delay announce until we have finished local startup */ - crm_warn("Delaying announce of cluster join until local startup is complete"); + pcmk__warn("Delaying announce of cluster join until local startup is " + "complete"); return; } } @@ -114,21 +115,21 @@ do_cl_join_offer_respond(long long action, CRM_CHECK(input != NULL, return); - welcome_from = crm_element_value(input->msg, PCMK__XA_SRC); - join_id = crm_element_value(input->msg, PCMK__XA_JOIN_ID); - crm_trace("Accepting cluster join offer from node %s " QB_XS " join-%s", - welcome_from, crm_element_value(input->msg, PCMK__XA_JOIN_ID)); + welcome_from = pcmk__xe_get(input->msg, PCMK__XA_SRC); + join_id = pcmk__xe_get(input->msg, PCMK__XA_JOIN_ID); + pcmk__trace("Accepting cluster join offer from node %s " QB_XS " join-%s", + welcome_from, pcmk__xe_get(input->msg, PCMK__XA_JOIN_ID)); /* we only ever want the last one */ if (query_call_id > 0) { - crm_trace("Cancelling previous join query: %d", query_call_id); + pcmk__trace("Cancelling previous join query: %d", query_call_id); remove_cib_op_callback(query_call_id, FALSE); query_call_id = 0; } if (update_dc(input->msg) == FALSE) { - crm_warn("Discarding cluster join offer from node %s (expected %s)", - welcome_from, controld_globals.dc_name); + pcmk__warn("Discarding cluster join offer from node %s (expected %s)", + welcome_from, controld_globals.dc_name); return; } @@ -138,7 +139,7 @@ do_cl_join_offer_respond(long long action, cib_no_children); fsa_register_cib_callback(query_call_id, pcmk__str_copy(join_id), join_query_callback); - crm_trace("Registered join query callback: %d", query_call_id); + pcmk__trace("Registered join query callback: %d", query_call_id); controld_set_fsa_action_flags(A_DC_TIMER_STOP); controld_trigger_fsa(); @@ -153,18 +154,18 @@ join_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void * CRM_LOG_ASSERT(join_id != NULL); if (query_call_id != call_id) { - crm_trace("Query %d superseded", call_id); + pcmk__trace("Query %d superseded", call_id); goto done; } query_call_id = 0; if(rc != pcmk_ok || output == NULL) { - crm_err("Could not retrieve version details for join-%s: %s (%d)", - join_id, pcmk_strerror(rc), rc); + pcmk__err("Could not retrieve version details for join-%s: %s (%d)", + join_id, pcmk_strerror(rc), rc); register_fsa_error_adv(C_FSA_INTERNAL, I_ERROR, NULL, NULL, __func__); } else if (controld_globals.dc_name == NULL) { - crm_debug("Membership is in flux, not continuing join-%s", join_id); + pcmk__debug("Membership is in flux, not continuing join-%s", join_id); } else { xmlNode *join_request = NULL; @@ -172,8 +173,8 @@ join_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void * pcmk__get_node(0, controld_globals.dc_name, NULL, pcmk__node_search_cluster_member); - crm_debug("Respond to join offer join-%s from %s", - join_id, controld_globals.dc_name); + pcmk__debug("Respond to join offer join-%s from %s", join_id, + controld_globals.dc_name); pcmk__xe_copy_attrs(generation, output, pcmk__xaf_none); join_request = pcmk__new_request(pcmk_ipc_controld, CRM_SYSTEM_CRMD, @@ -181,8 +182,8 @@ join_query_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void * CRM_SYSTEM_DC, CRM_OP_JOIN_REQUEST, generation); - crm_xml_add(join_request, PCMK__XA_JOIN_ID, join_id); - crm_xml_add(join_request, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(join_request, PCMK__XA_JOIN_ID, join_id); + pcmk__xe_set(join_request, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); pcmk__cluster_send_message(dc_node, pcmk_ipc_controld, join_request); pcmk__xml_free(join_request); } @@ -196,8 +197,9 @@ set_join_state(const char *start_state, const char *node_name, const char *node_ bool remote) { if (pcmk__str_eq(start_state, PCMK_VALUE_STANDBY, pcmk__str_casei)) { - crm_notice("Forcing node %s to join in %s state per configured " - "environment", node_name, start_state); + pcmk__notice("Forcing node %s to join in %s state per configured " + "environment", + node_name, start_state); cib__update_node_attr(controld_globals.logger_out, controld_globals.cib_conn, cib_sync_call, PCMK_XE_NODES, node_uuid, @@ -206,8 +208,9 @@ set_join_state(const char *start_state, const char *node_name, const char *node_ (remote? PCMK_VALUE_REMOTE : NULL)); } else if (pcmk__str_eq(start_state, PCMK_VALUE_ONLINE, pcmk__str_casei)) { - crm_notice("Forcing node %s to join in %s state per configured " - "environment", node_name, start_state); + pcmk__notice("Forcing node %s to join in %s state per configured " + "environment", + node_name, start_state); cib__update_node_attr(controld_globals.logger_out, controld_globals.cib_conn, cib_sync_call, PCMK_XE_NODES, node_uuid, @@ -216,21 +219,21 @@ set_join_state(const char *start_state, const char *node_name, const char *node_ (remote? PCMK_VALUE_REMOTE : NULL)); } else if (pcmk__str_eq(start_state, PCMK_VALUE_DEFAULT, pcmk__str_casei)) { - crm_debug("Not forcing a starting state on node %s", node_name); + pcmk__debug("Not forcing a starting state on node %s", node_name); } else { - crm_warn("Unrecognized start state '%s', using " - "'" PCMK_VALUE_DEFAULT "' (%s)", - start_state, node_name); + pcmk__warn("Unrecognized start state '%s', using " + "'" PCMK_VALUE_DEFAULT "' (%s)", + start_state, node_name); } } static int update_conn_host_cache(xmlNode *node, void *userdata) { - const char *remote = crm_element_value(node, PCMK_XA_ID); - const char *conn_host = crm_element_value(node, PCMK__XA_CONNECTION_HOST); - const char *state = crm_element_value(node, PCMK__XA_NODE_STATE); + const char *remote = pcmk__xe_get(node, PCMK_XA_ID); + const char *conn_host = pcmk__xe_get(node, PCMK__XA_CONNECTION_HOST); + const char *state = pcmk__xe_get(node, PCMK__XA_NODE_STATE); pcmk__node_status_t *remote_peer = pcmk__cluster_lookup_remote_node(remote); @@ -265,11 +268,11 @@ do_cl_join_finalize_respond(long long action, const char *start_state = pcmk__env_option(PCMK__ENV_NODE_START_STATE); int join_id = -1; - const char *op = crm_element_value(input->msg, PCMK__XA_CRM_TASK); - const char *welcome_from = crm_element_value(input->msg, PCMK__XA_SRC); + const char *op = pcmk__xe_get(input->msg, PCMK__XA_CRM_TASK); + const char *welcome_from = pcmk__xe_get(input->msg, PCMK__XA_SRC); if (!pcmk__str_eq(op, CRM_OP_JOIN_ACKNAK, pcmk__str_casei)) { - crm_trace("Ignoring op=%s message", op); + pcmk__trace("Ignoring op=%s message", op); return; } @@ -278,24 +281,25 @@ do_cl_join_finalize_respond(long long action, was_nack = FALSE; } - crm_element_value_int(input->msg, PCMK__XA_JOIN_ID, &join_id); + pcmk__xe_get_int(input->msg, PCMK__XA_JOIN_ID, &join_id); if (was_nack) { - crm_err("Shutting down because cluster join with leader %s failed " - QB_XS " join-%d NACK'd", welcome_from, join_id); + pcmk__err("Shutting down because cluster join with leader %s failed " + QB_XS " join-%d NACK'd", + welcome_from, join_id); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); controld_set_fsa_input_flags(R_STAYDOWN); return; } if (!AM_I_DC && controld_is_local_node(welcome_from)) { - crm_warn("Discarding our own welcome - we're no longer the DC"); + pcmk__warn("Discarding our own welcome - we're no longer the DC"); return; } if (update_dc(input->msg) == FALSE) { - crm_warn("Discarding %s from node %s (expected from %s)", - op, welcome_from, controld_globals.dc_name); + pcmk__warn("Discarding %s from node %s (expected from %s)", op, + welcome_from, controld_globals.dc_name); return; } @@ -318,10 +322,10 @@ do_cl_join_finalize_respond(long long action, pcmk__get_node(0, controld_globals.dc_name, NULL, pcmk__node_search_cluster_member); - crm_xml_add_int(join_confirm, PCMK__XA_JOIN_ID, join_id); + pcmk__xe_set_int(join_confirm, PCMK__XA_JOIN_ID, join_id); - crm_debug("Confirming join-%d: sending local operation history to %s", - join_id, controld_globals.dc_name); + pcmk__debug("Confirming join-%d: sending local operation history to %s", + join_id, controld_globals.dc_name); /* * If this is the node's first join since the controller started on it, @@ -336,7 +340,7 @@ do_cl_join_finalize_respond(long long action, * clones and end up with multiple active instances on the machine. */ if (first_join - && !pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + && !pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { first_join = FALSE; if (start_state) { @@ -366,8 +370,8 @@ do_cl_join_finalize_respond(long long action, } } else { - crm_err("Could not confirm join-%d with %s: Local operation history " - "failed", join_id, controld_globals.dc_name); + pcmk__err("Could not confirm join-%d with %s: Local operation history " + "failed", join_id, controld_globals.dc_name); register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL); } } diff --git a/daemons/controld/controld_join_dc.c b/daemons/controld/controld_join_dc.c index a91fbfa3a74..a7a2351931a 100644 --- a/daemons/controld/controld_join_dc.c +++ b/daemons/controld/controld_join_dc.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -19,6 +19,7 @@ #include +#include // PCMK_SCORE_INFINITY #include #include @@ -161,15 +162,15 @@ crm_update_peer_join(const char *source, pcmk__node_status_t *node, CRM_CHECK(node != NULL, return); /* Remote nodes do not participate in joins */ - if (pcmk_is_set(node->flags, pcmk__node_status_remote)) { + if (pcmk__is_set(node->flags, pcmk__node_status_remote)) { return; } if (phase == last) { - crm_trace("Node %s join-%d phase is still %s " - QB_XS " nodeid=%" PRIu32 " source=%s", - node->name, current_join_id, join_phase_text(last), - node->cluster_layer_id, source); + pcmk__trace("Node %s join-%d phase is still %s " + QB_XS " nodeid=%" PRIu32 " source=%s", + node->name, current_join_id, join_phase_text(last), + node->cluster_layer_id, source); return; } @@ -183,18 +184,18 @@ crm_update_peer_join(const char *source, pcmk__node_status_t *node, data = node->user_data; data->join_phase = phase; - crm_trace("Node %s join-%d phase is now %s (was %s) " - QB_XS " nodeid=%" PRIu32 " source=%s", - node->name, current_join_id, join_phase_text(phase), - join_phase_text(last), node->cluster_layer_id, - source); + pcmk__trace("Node %s join-%d phase is now %s (was %s) " + QB_XS " nodeid=%" PRIu32 " source=%s", + node->name, current_join_id, join_phase_text(phase), + join_phase_text(last), node->cluster_layer_id, + source); return; } - crm_warn("Rejecting join-%d phase update for node %s because can't go from " - "%s to %s " QB_XS " nodeid=%" PRIu32 " source=%s", - current_join_id, node->name, join_phase_text(last), - join_phase_text(phase), node->cluster_layer_id, source); + pcmk__warn("Rejecting join-%d phase update for node %s because can't go " + "from %s to %s " QB_XS " nodeid=%" PRIu32 " source=%s", + current_join_id, node->name, join_phase_text(last), + join_phase_text(phase), node->cluster_layer_id, source); } static void @@ -203,7 +204,7 @@ start_join_round(void) GHashTableIter iter; pcmk__node_status_t *peer = NULL; - crm_debug("Starting new join round join-%d", current_join_id); + pcmk__debug("Starting new join round join-%d", current_join_id); g_hash_table_iter_init(&iter, pcmk__peer_cache); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &peer)) { @@ -234,14 +235,14 @@ create_dc_message(const char *join_op, const char *host_to) CRM_SYSTEM_CRMD, join_op, NULL); /* Identify which election this is a part of */ - crm_xml_add_int(msg, PCMK__XA_JOIN_ID, current_join_id); + pcmk__xe_set_int(msg, PCMK__XA_JOIN_ID, current_join_id); /* Add a field specifying whether the DC is shutting down. This keeps the * joining node from fencing the old DC if it becomes the new DC. */ pcmk__xe_set_bool_attr(msg, PCMK__XA_DC_LEAVING, - pcmk_is_set(controld_globals.fsa_input_register, - R_SHUTDOWN)); + pcmk__is_set(controld_globals.fsa_input_register, + R_SHUTDOWN)); return msg; } @@ -256,8 +257,8 @@ join_make_offer(gpointer key, gpointer value, gpointer user_data) pcmk__assert(member != NULL); if (!pcmk__cluster_is_node_active(member)) { - crm_info("Not making join-%d offer to inactive node %s", - current_join_id, pcmk__s(member->name, "with unknown name")); + pcmk__info("Not making join-%d offer to inactive node %s", + current_join_id, pcmk__s(member->name, "with unknown name")); if ((member->expected == NULL) && pcmk__str_eq(member->state, PCMK__VALUE_LOST, pcmk__str_none)) { /* You would think this unsafe, but in fact this plus an @@ -275,23 +276,23 @@ join_make_offer(gpointer key, gpointer value, gpointer user_data) } if (member->name == NULL) { - crm_info("Not making join-%d offer to node uuid %s with unknown name", - current_join_id, member->xml_id); + pcmk__info("Not making join-%d offer to node uuid %s with unknown name", + current_join_id, member->xml_id); return; } if (controld_globals.membership_id != controld_globals.peer_seq) { controld_globals.membership_id = controld_globals.peer_seq; - crm_info("Making join-%d offers based on membership event %llu", - current_join_id, controld_globals.peer_seq); + pcmk__info("Making join-%d offers based on membership event %llu", + current_join_id, controld_globals.peer_seq); } if (user_data != NULL) { enum controld_join_phase phase = controld_get_join_phase(member); if (phase > controld_join_none) { - crm_info("Not making join-%d offer to already known node %s (%s)", - current_join_id, member->name, join_phase_text(phase)); + pcmk__info("Not making join-%d offer to already known node %s (%s)", + current_join_id, member->name, join_phase_text(phase)); return; } } @@ -302,9 +303,9 @@ join_make_offer(gpointer key, gpointer value, gpointer user_data) offer = create_dc_message(CRM_OP_JOIN_OFFER, member->name); // Advertise our feature set so the joining node can bail if not compatible - crm_xml_add(offer, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(offer, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); - crm_info("Sending join-%d offer to %s", current_join_id, member->name); + pcmk__info("Sending join-%d offer to %s", current_join_id, member->name); pcmk__cluster_send_message(member, pcmk_ipc_controld, offer); pcmk__xml_free(offer); @@ -329,13 +330,13 @@ do_dc_join_offer_all(long long action, update_dc(NULL); if (cause == C_HA_MESSAGE && current_input == I_NODE_JOIN) { - crm_info("A new node joined the cluster"); + pcmk__info("A new node joined the cluster"); } g_hash_table_foreach(pcmk__peer_cache, join_make_offer, NULL); count = crmd_join_phase_count(controld_join_welcomed); - crm_info("Waiting on join-%d requests from %d outstanding node%s", - current_join_id, count, pcmk__plural_s(count)); + pcmk__info("Waiting on join-%d requests from %d outstanding node%s", + current_join_id, count, pcmk__plural_s(count)); // Don't waste time by invoking the scheduler yet } @@ -353,8 +354,9 @@ do_dc_join_offer_one(long long action, const char *join_to = NULL; if (msg_data->data == NULL) { - crm_info("Making join-%d offers to any unconfirmed nodes " - "because an unknown node joined", current_join_id); + pcmk__info("Making join-%d offers to any unconfirmed nodes because an " + "unknown node joined", + current_join_id); g_hash_table_foreach(pcmk__peer_cache, join_make_offer, &member); check_join_state(cur_state, __func__); return; @@ -366,9 +368,9 @@ do_dc_join_offer_one(long long action, return; } - join_to = crm_element_value(welcome->msg, PCMK__XA_SRC); + join_to = pcmk__xe_get(welcome->msg, PCMK__XA_SRC); if (join_to == NULL) { - crm_err("Can't make join-%d offer to unknown node", current_join_id); + pcmk__err("Can't make join-%d offer to unknown node", current_join_id); return; } member = pcmk__get_node(0, join_to, NULL, pcmk__node_search_cluster_member); @@ -396,8 +398,8 @@ do_dc_join_offer_one(long long action, NULL); count = crmd_join_phase_count(controld_join_welcomed); - crm_info("Waiting on join-%d requests from %d outstanding node%s", - current_join_id, count, pcmk__plural_s(count)); + pcmk__info("Waiting on join-%d requests from %d outstanding node%s", + current_join_id, count, pcmk__plural_s(count)); // Don't waste time by invoking the scheduler yet } @@ -405,8 +407,8 @@ do_dc_join_offer_one(long long action, static int compare_int_fields(xmlNode * left, xmlNode * right, const char *field) { - const char *elem_l = crm_element_value(left, field); - const char *elem_r = crm_element_value(right, field); + const char *elem_l = pcmk__xe_get(left, field); + const char *elem_r = pcmk__xe_get(right, field); long long int_elem_l; long long int_elem_r; @@ -415,14 +417,16 @@ compare_int_fields(xmlNode * left, xmlNode * right, const char *field) rc = pcmk__scan_ll(elem_l, &int_elem_l, -1LL); if (rc != pcmk_rc_ok) { // Shouldn't be possible - crm_warn("Comparing current CIB %s as -1 " - "because '%s' is not an integer", field, elem_l); + pcmk__warn("Comparing current CIB %s as -1 because '%s' is not an " + "integer", + field, elem_l); } rc = pcmk__scan_ll(elem_r, &int_elem_r, -1LL); if (rc != pcmk_rc_ok) { // Shouldn't be possible - crm_warn("Comparing joining node's CIB %s as -1 " - "because '%s' is not an integer", field, elem_r); + pcmk__warn("Comparing joining node's CIB %s as -1 because '%s' is not " + "an integer", + field, elem_r); } if (int_elem_l < int_elem_r) { @@ -451,23 +455,24 @@ do_dc_join_filter_offer(long long action, gboolean ack_nack_bool = TRUE; ha_msg_input_t *join_ack = fsa_typed_data(fsa_dt_ha_msg); - const char *join_from = crm_element_value(join_ack->msg, PCMK__XA_SRC); - const char *ref = crm_element_value(join_ack->msg, PCMK_XA_REFERENCE); - const char *join_version = crm_element_value(join_ack->msg, - PCMK_XA_CRM_FEATURE_SET); + const char *join_from = pcmk__xe_get(join_ack->msg, PCMK__XA_SRC); + const char *ref = pcmk__xe_get(join_ack->msg, PCMK_XA_REFERENCE); + const char *join_version = pcmk__xe_get(join_ack->msg, + PCMK_XA_CRM_FEATURE_SET); pcmk__node_status_t *join_node = NULL; if (join_from == NULL) { - crm_err("Ignoring invalid join request without node name"); + pcmk__err("Ignoring invalid join request without node name"); return; } join_node = pcmk__get_node(0, join_from, NULL, pcmk__node_search_cluster_member); - crm_element_value_int(join_ack->msg, PCMK__XA_JOIN_ID, &join_id); + pcmk__xe_get_int(join_ack->msg, PCMK__XA_JOIN_ID, &join_id); if (join_id != current_join_id) { - crm_debug("Ignoring join-%d request from %s because we are on join-%d", - join_id, join_from, current_join_id); + pcmk__debug("Ignoring join-%d request from %s because we are on " + "join-%d", + join_id, join_from, current_join_id); check_join_state(cur_state, __func__); return; } @@ -501,9 +506,9 @@ do_dc_join_filter_offer(long long action, } if (lookup_failed_sync_node(join_from, &value) == pcmk_rc_ok) { - crm_err("Rejecting join-%d request from node %s because we failed to " - "sync its CIB in join-%d " QB_XS " ref=%s", - join_id, join_from, value, ref); + pcmk__err("Rejecting join-%d request from node %s because we failed to " + "sync its CIB in join-%d " QB_XS " ref=%s", + join_id, join_from, value, ref); ack_nack_bool = FALSE; } else if (!pcmk__cluster_is_node_active(join_node)) { @@ -514,68 +519,71 @@ do_dc_join_filter_offer(long long action, * shut down, and receiving a lingering in-flight request is not * cause for alarm. */ - crm_debug("Rejecting join-%d request from inactive node %s " - QB_XS " ref=%s", join_id, join_from, ref); + pcmk__debug("Rejecting join-%d request from inactive node %s " + QB_XS " ref=%s", + join_id, join_from, ref); } else { - crm_err("Rejecting join-%d request from inactive node %s " - QB_XS " ref=%s", join_id, join_from, ref); + pcmk__err("Rejecting join-%d request from inactive node %s " + QB_XS " ref=%s", + join_id, join_from, ref); } ack_nack_bool = FALSE; } else if (generation == NULL) { - crm_err("Rejecting invalid join-%d request from node %s " - "missing CIB generation " QB_XS " ref=%s", - join_id, join_from, ref); + pcmk__err("Rejecting invalid join-%d request from node %s missing CIB " + "generation " QB_XS " ref=%s", + join_id, join_from, ref); ack_nack_bool = FALSE; } else if ((join_version == NULL) || !feature_set_compatible(CRM_FEATURE_SET, join_version)) { - crm_err("Rejecting join-%d request from node %s because feature set %s" - " is incompatible with ours (%s) " QB_XS " ref=%s", - join_id, join_from, (join_version? join_version : "pre-3.1.0"), - CRM_FEATURE_SET, ref); + pcmk__err("Rejecting join-%d request from node %s because feature set " + "%s is incompatible with ours (%s) " QB_XS " ref=%s", + join_id, join_from, pcmk__s(join_version, "pre-3.1.0"), + CRM_FEATURE_SET, ref); ack_nack_bool = FALSE; } else if (max_generation_xml == NULL) { - const char *validation = crm_element_value(generation, - PCMK_XA_VALIDATE_WITH); + const char *validation = pcmk__xe_get(generation, + PCMK_XA_VALIDATE_WITH); if (pcmk__get_schema(validation) == NULL) { - crm_err("Rejecting join-%d request from %s (with first CIB " - "generation) due to %s schema version %s " QB_XS " ref=%s", - join_id, join_from, - ((validation == NULL)? "missing" : "unknown"), - pcmk__s(validation, ""), ref); + pcmk__err("Rejecting join-%d request from %s (with first CIB " + "generation) due to %s schema version %s " + QB_XS " ref=%s", + join_id, join_from, + ((validation == NULL)? "missing" : "unknown"), + pcmk__s(validation, ""), ref); ack_nack_bool = FALSE; } else { - crm_debug("Accepting join-%d request from %s (with first CIB " - "generation) " QB_XS " ref=%s", - join_id, join_from, ref); + pcmk__debug("Accepting join-%d request from %s (with first CIB " + "generation) " QB_XS " ref=%s", + join_id, join_from, ref); max_generation_xml = pcmk__xml_copy(NULL, generation); pcmk__str_update(&max_generation_from, join_from); } } else if ((cmp < 0) || ((cmp == 0) && controld_is_local_node(join_from))) { - const char *validation = crm_element_value(generation, - PCMK_XA_VALIDATE_WITH); + const char *validation = pcmk__xe_get(generation, + PCMK_XA_VALIDATE_WITH); if (pcmk__get_schema(validation) == NULL) { - crm_err("Rejecting join-%d request from %s (with better CIB " - "generation than current best from %s) due to %s " - "schema version %s " QB_XS " ref=%s", - join_id, join_from, max_generation_from, - ((validation == NULL)? "missing" : "unknown"), - pcmk__s(validation, ""), ref); + pcmk__err("Rejecting join-%d request from %s (with better CIB " + "generation than current best from %s) due to %s schema " + "version %s " QB_XS " ref=%s", + join_id, join_from, max_generation_from, + ((validation == NULL)? "missing" : "unknown"), + pcmk__s(validation, ""), ref); ack_nack_bool = FALSE; } else { - crm_debug("Accepting join-%d request from %s (with better CIB " - "generation than current best from %s) " QB_XS " ref=%s", - join_id, join_from, max_generation_from, ref); - crm_log_xml_debug(max_generation_xml, "Old max generation"); - crm_log_xml_debug(generation, "New max generation"); + pcmk__debug("Accepting join-%d request from %s (with better CIB " + "generation than current best from %s) " QB_XS " ref=%s", + join_id, join_from, max_generation_from, ref); + pcmk__log_xml_debug(max_generation_xml, "Old max generation"); + pcmk__log_xml_debug(generation, "New max generation"); pcmk__xml_free(max_generation_xml); max_generation_xml = pcmk__xml_copy(NULL, join_ack->xml); @@ -583,8 +591,8 @@ do_dc_join_filter_offer(long long action, } } else { - crm_debug("Accepting join-%d request from %s " QB_XS " ref=%s", - join_id, join_from, ref); + pcmk__debug("Accepting join-%d request from %s " QB_XS " ref=%s", + join_id, join_from, ref); } if (!ack_nack_bool) { @@ -597,14 +605,14 @@ do_dc_join_filter_offer(long long action, } count = crmd_join_phase_count(controld_join_integrated); - crm_debug("%d node%s currently integrated in join-%d", - count, pcmk__plural_s(count), join_id); + pcmk__debug("%d node%s currently integrated in join-%d", count, + pcmk__plural_s(count), join_id); if (check_join_state(cur_state, __func__) == FALSE) { // Don't waste time by invoking the scheduler yet count = crmd_join_phase_count(controld_join_welcomed); - crm_debug("Waiting on join-%d requests from %d outstanding node%s", - join_id, count, pcmk__plural_s(count)); + pcmk__debug("Waiting on join-%d requests from %d outstanding node%s", + join_id, count, pcmk__plural_s(count)); } } @@ -625,16 +633,17 @@ do_dc_join_finalize(long long action, * while we compute the latest CIB */ if (count_welcomed != 0) { - crm_debug("Waiting on join-%d requests from %d outstanding node%s " - "before finalizing join", current_join_id, count_welcomed, - pcmk__plural_s(count_welcomed)); + pcmk__debug("Waiting on join-%d requests from %d outstanding node%s " + "before finalizing join", + current_join_id, count_welcomed, + pcmk__plural_s(count_welcomed)); crmd_join_phase_log(LOG_DEBUG); /* crmd_fsa_stall(FALSE); Needed? */ return; } else if (count_finalizable == 0) { - crm_debug("Finalization not needed for join-%d at the current time", - current_join_id); + pcmk__debug("Finalization not needed for join-%d at the current time", + current_join_id); crmd_join_phase_log(LOG_DEBUG); check_join_state(controld_globals.fsa_state, __func__); return; @@ -647,30 +656,30 @@ do_dc_join_finalize(long long action, } if (!controld_globals.transition_graph->complete) { - crm_warn("Delaying join-%d finalization while transition in progress", - current_join_id); + pcmk__warn("Delaying join-%d finalization while transition in progress", + current_join_id); crmd_join_phase_log(LOG_DEBUG); crmd_fsa_stall(FALSE); return; } - if (pcmk_is_set(controld_globals.fsa_input_register, R_HAVE_CIB)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_HAVE_CIB)) { // Send our CIB out to everyone sync_from = pcmk__str_copy(controld_globals.cluster->priv->node_name); } else { // Ask for the agreed best CIB sync_from = pcmk__str_copy(max_generation_from); } - crm_notice("Finalizing join-%d for %d node%s (sync'ing CIB %s.%s.%s " - "with schema %s and feature set %s from %s)", - current_join_id, count_finalizable, - pcmk__plural_s(count_finalizable), - crm_element_value(max_generation_xml, PCMK_XA_ADMIN_EPOCH), - crm_element_value(max_generation_xml, PCMK_XA_EPOCH), - crm_element_value(max_generation_xml, PCMK_XA_NUM_UPDATES), - crm_element_value(max_generation_xml, PCMK_XA_VALIDATE_WITH), - crm_element_value(max_generation_xml, PCMK_XA_CRM_FEATURE_SET), - sync_from); + pcmk__notice("Finalizing join-%d for %d node%s (sync'ing CIB %s.%s.%s with " + "schema %s and feature set %s from %s)", + current_join_id, count_finalizable, + pcmk__plural_s(count_finalizable), + pcmk__xe_get(max_generation_xml, PCMK_XA_ADMIN_EPOCH), + pcmk__xe_get(max_generation_xml, PCMK_XA_EPOCH), + pcmk__xe_get(max_generation_xml, PCMK_XA_NUM_UPDATES), + pcmk__xe_get(max_generation_xml, PCMK_XA_VALIDATE_WITH), + pcmk__xe_get(max_generation_xml, PCMK_XA_CRM_FEATURE_SET), + sync_from); crmd_join_phase_log(LOG_DEBUG); rc = controld_globals.cib_conn->cmds->sync_from(controld_globals.cib_conn, @@ -709,12 +718,14 @@ finalize_sync_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, voi __func__); } else if (!AM_I_DC) { - crm_debug("Sync'ed CIB for join-%d but no longer DC", current_join_id); + pcmk__debug("Sync'ed CIB for join-%d but no longer DC", + current_join_id); } else if (controld_globals.fsa_state != S_FINALIZE_JOIN) { - crm_debug("Sync'ed CIB for join-%d but no longer in S_FINALIZE_JOIN " - "(%s)", current_join_id, - fsa_state2string(controld_globals.fsa_state)); + pcmk__debug("Sync'ed CIB for join-%d but no longer in S_FINALIZE_JOIN " + "(%s)", + current_join_id, + fsa_state2string(controld_globals.fsa_state)); } else { controld_set_fsa_input_flags(R_HAVE_CIB); @@ -726,9 +737,9 @@ finalize_sync_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, voi count_finalizable = crmd_join_phase_count(controld_join_integrated) + crmd_join_phase_count(controld_join_nack); - crm_debug("Notifying %d node%s of join-%d results", - count_finalizable, pcmk__plural_s(count_finalizable), - current_join_id); + pcmk__debug("Notifying %d node%s of join-%d results", + count_finalizable, pcmk__plural_s(count_finalizable), + current_join_id); g_hash_table_foreach(pcmk__peer_cache, finalize_join_for, NULL); } } @@ -743,16 +754,16 @@ join_node_state_commit_callback(xmlNode *msg, int call_id, int rc, if (rc != pcmk_ok) { fsa_data_t *msg_data = NULL; // for register_fsa_error() macro - crm_crit("join-%d node history update (via CIB call %d) for node %s " - "failed: %s", - current_join_id, call_id, node, pcmk_strerror(rc)); - crm_log_xml_debug(msg, "failed"); + pcmk__crit("join-%d node history update (via CIB call %d) for node %s " + "failed: %s", + current_join_id, call_id, node, pcmk_strerror(rc)); + pcmk__log_xml_debug(msg, "failed"); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } - crm_debug("join-%d node history update (via CIB call %d) for node %s " - "complete", - current_join_id, call_id, node); + pcmk__debug("join-%d node history update (via CIB call %d) for node %s " + "complete", + current_join_id, call_id, node); check_join_state(controld_globals.fsa_state, __func__); } @@ -766,8 +777,8 @@ do_dc_join_ack(long long action, int join_id = -1; ha_msg_input_t *join_ack = fsa_typed_data(fsa_dt_ha_msg); - const char *op = crm_element_value(join_ack->msg, PCMK__XA_CRM_TASK); - char *join_from = crm_element_value_copy(join_ack->msg, PCMK__XA_SRC); + const char *op = pcmk__xe_get(join_ack->msg, PCMK__XA_CRM_TASK); + char *join_from = pcmk__xe_get_copy(join_ack->msg, PCMK__XA_SRC); pcmk__node_status_t *peer = NULL; enum controld_join_phase phase = controld_join_none; @@ -781,40 +792,41 @@ do_dc_join_ack(long long action, // Sanity checks if (join_from == NULL) { - crm_warn("Ignoring message received without node identification"); + pcmk__warn("Ignoring message received without node identification"); goto done; } if (op == NULL) { - crm_warn("Ignoring message received from %s without task", join_from); + pcmk__warn("Ignoring message received from %s without task", join_from); goto done; } if (strcmp(op, CRM_OP_JOIN_CONFIRM)) { - crm_debug("Ignoring '%s' message from %s while waiting for '%s'", - op, join_from, CRM_OP_JOIN_CONFIRM); + pcmk__debug("Ignoring '%s' message from %s while waiting for '%s'", op, + join_from, CRM_OP_JOIN_CONFIRM); goto done; } - if (crm_element_value_int(join_ack->msg, PCMK__XA_JOIN_ID, &join_id) != 0) { - crm_warn("Ignoring join confirmation from %s without valid join ID", - join_from); + if (pcmk__xe_get_int(join_ack->msg, PCMK__XA_JOIN_ID, + &join_id) != pcmk_rc_ok) { + pcmk__warn("Ignoring join confirmation from %s without valid join ID", + join_from); goto done; } peer = pcmk__get_node(0, join_from, NULL, pcmk__node_search_cluster_member); phase = controld_get_join_phase(peer); if (phase != controld_join_finalized) { - crm_info("Ignoring out-of-sequence join-%d confirmation from %s " - "(currently %s not %s)", - join_id, join_from, join_phase_text(phase), - join_phase_text(controld_join_finalized)); + pcmk__info("Ignoring out-of-sequence join-%d confirmation from %s " + "(currently %s not %s)", + join_id, join_from, join_phase_text(phase), + join_phase_text(controld_join_finalized)); goto done; } if (join_id != current_join_id) { - crm_err("Rejecting join-%d confirmation from %s " - "because currently on join-%d", - join_id, join_from, current_join_id); + pcmk__err("Rejecting join-%d confirmation from %s because currently on " + "join-%d", + join_id, join_from, current_join_id); crm_update_peer_join(__func__, peer, controld_join_nack); goto done; } @@ -832,7 +844,7 @@ do_dc_join_ack(long long action, } // Delete relevant parts of node's current executor state from CIB - if (pcmk_is_set(controld_globals.flags, controld_shutdown_lock_enabled)) { + if (pcmk__is_set(controld_globals.flags, controld_shutdown_lock_enabled)) { section = controld_section_lrm_unlocked; } controld_node_state_deletion_strings(join_from, section, &xpath, NULL); @@ -850,20 +862,20 @@ do_dc_join_ack(long long action, execd_state = controld_query_executor_state(); if (execd_state != NULL) { - crm_debug("Updating local node history for join-%d from query " - "result", - current_join_id); + pcmk__debug("Updating local node history for join-%d from query " + "result", + current_join_id); state = execd_state; } else { - crm_warn("Updating local node history from join-%d confirmation " - "because query failed", - current_join_id); + pcmk__warn("Updating local node history from join-%d confirmation " + "because query failed", + current_join_id); } } else { - crm_debug("Updating node history for %s from join-%d confirmation", - join_from, current_join_id); + pcmk__debug("Updating node history for %s from join-%d confirmation", + join_from, current_join_id); } rc = cib->cmds->modify(cib, PCMK_XE_STATUS, state, @@ -885,8 +897,8 @@ do_dc_join_ack(long long action, done: if (rc != pcmk_ok) { - crm_crit("join-%d node history update for node %s failed: %s", - current_join_id, join_from, pcmk_strerror(rc)); + pcmk__crit("join-%d node history update for node %s failed: %s", + current_join_id, join_from, pcmk_strerror(rc)); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } free(join_from); @@ -910,19 +922,19 @@ finalize_join_for(gpointer key, gpointer value, gpointer user_data) case controld_join_nack: break; default: - crm_trace("Not updating non-integrated and non-nacked node %s (%s) " - "for join-%d", - join_to, join_phase_text(phase), current_join_id); + pcmk__trace("Not updating non-integrated and non-nacked node %s " + "(%s) for join-%d", + join_to, join_phase_text(phase), current_join_id); return; } /* Update the element with the node's name and UUID, in case they * weren't known before */ - crm_trace("Updating node name and UUID in CIB for %s", join_to); + pcmk__trace("Updating node name and UUID in CIB for %s", join_to); tmp1 = pcmk__xe_create(NULL, PCMK_XE_NODE); - crm_xml_add(tmp1, PCMK_XA_ID, pcmk__cluster_get_xml_id(join_node)); - crm_xml_add(tmp1, PCMK_XA_UNAME, join_to); + pcmk__xe_set(tmp1, PCMK_XA_ID, pcmk__cluster_get_xml_id(join_node)); + pcmk__xe_set(tmp1, PCMK_XA_UNAME, join_to); fsa_cib_anon_update(PCMK_XE_NODES, tmp1); pcmk__xml_free(tmp1); @@ -943,8 +955,8 @@ finalize_join_for(gpointer key, gpointer value, gpointer user_data) } // Acknowledge or nack node's join request - crm_debug("%sing join-%d request from %s", - integrated? "Acknowledg" : "Nack", current_join_id, join_to); + pcmk__debug("%sing join-%d request from %s", + (integrated? "Acknowledg" : "Nack"), current_join_id, join_to); acknak = create_dc_message(CRM_OP_JOIN_ACKNAK, join_to); pcmk__xe_set_bool_attr(acknak, CRM_OP_JOIN_ACKNAK, integrated); @@ -990,11 +1002,11 @@ check_join_state(enum crmd_fsa_state cur_state, const char *source) static unsigned long long highest_seq = 0; if (controld_globals.membership_id != controld_globals.peer_seq) { - crm_debug("join-%d: Membership changed from %llu to %llu " - QB_XS " highest=%llu state=%s for=%s", - current_join_id, controld_globals.membership_id, - controld_globals.peer_seq, highest_seq, - fsa_state2string(cur_state), source); + pcmk__debug("join-%d: Membership changed from %llu to %llu " + QB_XS " highest=%llu state=%s for=%s", + current_join_id, controld_globals.membership_id, + controld_globals.peer_seq, highest_seq, + fsa_state2string(cur_state), source); if (highest_seq < controld_globals.peer_seq) { /* Don't spam the FSA with duplicates */ highest_seq = controld_globals.peer_seq; @@ -1005,51 +1017,51 @@ check_join_state(enum crmd_fsa_state cur_state, const char *source) if (crmd_join_phase_count(controld_join_welcomed) == 0) { int count = crmd_join_phase_count(controld_join_integrated); - crm_debug("join-%d: Integration of %d peer%s complete " - QB_XS " state=%s for=%s", - current_join_id, count, pcmk__plural_s(count), - fsa_state2string(cur_state), source); + pcmk__debug("join-%d: Integration of %d peer%s complete " + QB_XS " state=%s for=%s", + current_join_id, count, pcmk__plural_s(count), + fsa_state2string(cur_state), source); register_fsa_input_before(C_FSA_INTERNAL, I_INTEGRATED, NULL); return TRUE; } } else if (cur_state == S_FINALIZE_JOIN) { - if (!pcmk_is_set(controld_globals.fsa_input_register, R_HAVE_CIB)) { - crm_debug("join-%d: Delaying finalization until we have CIB " - QB_XS " state=%s for=%s", - current_join_id, fsa_state2string(cur_state), source); + if (!pcmk__is_set(controld_globals.fsa_input_register, R_HAVE_CIB)) { + pcmk__debug("join-%d: Delaying finalization until we have CIB " + QB_XS " state=%s for=%s", + current_join_id, fsa_state2string(cur_state), source); return TRUE; } else if (crmd_join_phase_count(controld_join_welcomed) != 0) { int count = crmd_join_phase_count(controld_join_welcomed); - crm_debug("join-%d: Still waiting on %d welcomed node%s " - QB_XS " state=%s for=%s", - current_join_id, count, pcmk__plural_s(count), - fsa_state2string(cur_state), source); + pcmk__debug("join-%d: Still waiting on %d welcomed node%s " + QB_XS " state=%s for=%s", + current_join_id, count, pcmk__plural_s(count), + fsa_state2string(cur_state), source); crmd_join_phase_log(LOG_DEBUG); } else if (crmd_join_phase_count(controld_join_integrated) != 0) { int count = crmd_join_phase_count(controld_join_integrated); - crm_debug("join-%d: Still waiting on %d integrated node%s " - QB_XS " state=%s for=%s", - current_join_id, count, pcmk__plural_s(count), - fsa_state2string(cur_state), source); + pcmk__debug("join-%d: Still waiting on %d integrated node%s " + QB_XS " state=%s for=%s", + current_join_id, count, pcmk__plural_s(count), + fsa_state2string(cur_state), source); crmd_join_phase_log(LOG_DEBUG); } else if (crmd_join_phase_count(controld_join_finalized) != 0) { int count = crmd_join_phase_count(controld_join_finalized); - crm_debug("join-%d: Still waiting on %d finalized node%s " - QB_XS " state=%s for=%s", - current_join_id, count, pcmk__plural_s(count), - fsa_state2string(cur_state), source); + pcmk__debug("join-%d: Still waiting on %d finalized node%s " + QB_XS " state=%s for=%s", + current_join_id, count, pcmk__plural_s(count), + fsa_state2string(cur_state), source); crmd_join_phase_log(LOG_DEBUG); } else { - crm_debug("join-%d: Complete " QB_XS " state=%s for=%s", - current_join_id, fsa_state2string(cur_state), source); + pcmk__debug("join-%d: Complete " QB_XS " state=%s for=%s", + current_join_id, fsa_state2string(cur_state), source); register_fsa_input_later(C_FSA_INTERNAL, I_FINALIZED, NULL); return TRUE; } @@ -1064,7 +1076,7 @@ do_dc_join_final(long long action, enum crmd_fsa_state cur_state, enum crmd_fsa_input current_input, fsa_data_t * msg_data) { - crm_debug("Ensuring DC, quorum and node attributes are up-to-date"); + pcmk__debug("Ensuring DC, quorum and node attributes are up-to-date"); crm_update_quorum(pcmk__cluster_has_quorum(), TRUE); } diff --git a/daemons/controld/controld_lrm.h b/daemons/controld/controld_lrm.h index c003371a2b6..b2cee74ebc5 100644 --- a/daemons/controld/controld_lrm.h +++ b/daemons/controld/controld_lrm.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,7 +9,8 @@ #ifndef CONTROLD_LRM__H # define CONTROLD_LRM__H -#include +#include // PCMK__LOG_TRACE +#include "controld_messages.h" extern gboolean verify_stopped(enum crmd_fsa_state cur_state, int log_level); void lrm_clear_last_failure(const char *rsc_id, const char *node_name, @@ -55,14 +56,22 @@ typedef struct active_op_s { #define controld_set_active_op_flags(active_op, flags_to_set) do { \ (active_op)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Active operation", (active_op)->op_key, \ - (active_op)->flags, (flags_to_set), #flags_to_set); \ + PCMK__LOG_TRACE, \ + "Active operation", \ + (active_op)->op_key, \ + (active_op)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) #define controld_clear_active_op_flags(active_op, flags_to_clear) do { \ (active_op)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Active operation", (active_op)->op_key, \ - (active_op)->flags, (flags_to_clear), #flags_to_clear); \ + PCMK__LOG_TRACE, \ + "Active operation", \ + (active_op)->op_key, \ + (active_op)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) typedef struct lrm_state_s { diff --git a/daemons/controld/controld_membership.c b/daemons/controld/controld_membership.c index daf0c5fd439..ccc37c97fae 100644 --- a/daemons/controld/controld_membership.c +++ b/daemons/controld/controld_membership.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,7 @@ #include #include +#include // PCMK_SCORE_INFINITY #include #include #include @@ -36,13 +37,13 @@ reap_dead_nodes(gpointer key, gpointer value, gpointer user_data) if ((node != NULL) && (node->name != NULL)) { if (controld_is_local_node(node->name)) { - crm_err("We're not part of the cluster anymore"); + pcmk__err("We're not part of the cluster anymore"); register_fsa_input(C_FSA_INTERNAL, I_ERROR, NULL); } else if (!AM_I_DC && pcmk__str_eq(node->name, controld_globals.dc_name, pcmk__str_casei)) { - crm_warn("Our DC node (%s) left the cluster", node->name); + pcmk__warn("Our DC node (%s) left the cluster", node->name); register_fsa_input(C_FSA_INTERNAL, I_ELECTION, NULL); } } @@ -63,7 +64,7 @@ post_cache_update(int instance) xmlNode *no_op = NULL; controld_globals.peer_seq = instance; - crm_debug("Updated cache after membership event %d.", instance); + pcmk__debug("Updated cache after membership event %d", instance); g_hash_table_foreach(pcmk__peer_cache, reap_dead_nodes, NULL); controld_set_fsa_input_flags(R_MEMBERSHIP); @@ -96,16 +97,18 @@ crmd_node_update_complete(xmlNode * msg, int call_id, int rc, xmlNode * output, fsa_data_t *msg_data = NULL; if (rc == pcmk_ok) { - crm_trace("Node update %d complete", call_id); + pcmk__trace("Node update %d complete", call_id); } else if(call_id < pcmk_ok) { - crm_err("Node update failed: %s (%d)", pcmk_strerror(call_id), call_id); - crm_log_xml_debug(msg, "failed"); + pcmk__err("Node update failed: %s (%d)", pcmk_strerror(call_id), + call_id); + pcmk__log_xml_debug(msg, "failed"); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } else { - crm_err("Node update %d failed: %s (%d)", call_id, pcmk_strerror(rc), rc); - crm_log_xml_debug(msg, "failed"); + pcmk__err("Node update %d failed: %s (%d)", call_id, pcmk_strerror(rc), + rc); + pcmk__log_xml_debug(msg, "failed"); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } } @@ -126,34 +129,38 @@ create_node_state_update(pcmk__node_status_t *node, int flags, xmlNode *parent, const char *source) { // @TODO Ensure all callers handle NULL returns + const char *id = NULL; const char *value = NULL; xmlNode *node_state; if (!node->state) { - crm_info("Node update for %s cancelled: no state, not seen yet", - node->name); + pcmk__info("Node update for %s cancelled: no state, not seen yet", + node->name); return NULL; } node_state = pcmk__xe_create(parent, PCMK__XE_NODE_STATE); - if (pcmk_is_set(node->flags, pcmk__node_status_remote)) { + if (pcmk__is_set(node->flags, pcmk__node_status_remote)) { pcmk__xe_set_bool_attr(node_state, PCMK_XA_REMOTE_NODE, true); } - if (crm_xml_add(node_state, PCMK_XA_ID, - pcmk__cluster_get_xml_id(node)) == NULL) { - crm_info("Node update for %s cancelled: no ID", node->name); + id = pcmk__cluster_get_xml_id(node); + if ((id == NULL) + || (pcmk__xe_set(node_state, PCMK_XA_ID, id) != pcmk_rc_ok)) { + + pcmk__info("Node update for %s cancelled: no ID", node->name); pcmk__xml_free(node_state); return NULL; } - crm_xml_add(node_state, PCMK_XA_UNAME, node->name); + pcmk__xe_set(node_state, PCMK_XA_UNAME, node->name); if ((flags & node_update_cluster) && node->state) { - if (compare_version(controld_globals.dc_version, "3.18.0") >= 0) { + if (pcmk__compare_versions(controld_globals.dc_version, + "3.18.0") >= 0) { // A value 0 means the node is not a cluster member. - crm_xml_add_ll(node_state, PCMK__XA_IN_CCM, node->when_member); + pcmk__xe_set_ll(node_state, PCMK__XA_IN_CCM, node->when_member); } else { pcmk__xe_set_bool_attr(node_state, PCMK__XA_IN_CCM, @@ -162,19 +169,20 @@ create_node_state_update(pcmk__node_status_t *node, int flags, } } - if (!pcmk_is_set(node->flags, pcmk__node_status_remote)) { + if (!pcmk__is_set(node->flags, pcmk__node_status_remote)) { if (flags & node_update_peer) { - if (compare_version(controld_globals.dc_version, "3.18.0") >= 0) { + if (pcmk__compare_versions(controld_globals.dc_version, + "3.18.0") >= 0) { // A value 0 means the peer is offline in CPG. - crm_xml_add_ll(node_state, PCMK_XA_CRMD, node->when_online); + pcmk__xe_set_ll(node_state, PCMK_XA_CRMD, node->when_online); } else { // @COMPAT DCs < 2.1.7 use online/offline rather than timestamp value = PCMK_VALUE_OFFLINE; - if (pcmk_is_set(node->processes, crm_get_cluster_proc())) { + if (pcmk__is_set(node->processes, crm_get_cluster_proc())) { value = PCMK_VALUE_ONLINE; } - crm_xml_add(node_state, PCMK_XA_CRMD, value); + pcmk__xe_set(node_state, PCMK_XA_CRMD, value); } } @@ -184,15 +192,15 @@ create_node_state_update(pcmk__node_status_t *node, int flags, } else { value = CRMD_JOINSTATE_MEMBER; } - crm_xml_add(node_state, PCMK__XA_JOIN, value); + pcmk__xe_set(node_state, PCMK__XA_JOIN, value); } if (flags & node_update_expected) { - crm_xml_add(node_state, PCMK_XA_EXPECTED, node->expected); + pcmk__xe_set(node_state, PCMK_XA_EXPECTED, node->expected); } } - crm_xml_add(node_state, PCMK_XA_CRM_DEBUG_ORIGIN, source); + pcmk__xe_set(node_state, PCMK_XA_CRM_DEBUG_ORIGIN, source); return node_state; } @@ -217,8 +225,8 @@ search_conflicting_node_callback(xmlNode * msg, int call_id, int rc, if (rc != pcmk_ok) { if (rc != -ENXIO) { - crm_notice("Searching conflicting nodes for %s failed: %s (%d)", - new_node_uuid, pcmk_strerror(rc), rc); + pcmk__notice("Searching conflicting nodes for %s failed: %s (%d)", + new_node_uuid, pcmk_strerror(rc), rc); } return; @@ -240,8 +248,8 @@ search_conflicting_node_callback(xmlNode * msg, int call_id, int rc, pcmk__node_status_t *node = NULL; gboolean known = FALSE; - node_uuid = crm_element_value(node_xml, PCMK_XA_ID); - node_uname = crm_element_value(node_xml, PCMK_XA_UNAME); + node_uuid = pcmk__xe_get(node_xml, PCMK_XA_ID); + node_uname = pcmk__xe_get(node_xml, PCMK_XA_UNAME); if (node_uuid == NULL || node_uname == NULL) { continue; @@ -263,8 +271,9 @@ search_conflicting_node_callback(xmlNode * msg, int call_id, int rc, int delete_call_id = 0; xmlNode *node_state_xml = NULL; - crm_notice("Deleting unknown node %s/%s which has conflicting uname with %s", - node_uuid, node_uname, new_node_uuid); + pcmk__notice("Deleting unknown node %s/%s which has conflicting " + "uname with %s", + node_uuid, node_uname, new_node_uuid); delete_call_id = cib_conn->cmds->remove(cib_conn, PCMK_XE_NODES, node_xml, cib_none); @@ -272,8 +281,8 @@ search_conflicting_node_callback(xmlNode * msg, int call_id, int rc, remove_conflicting_node_callback); node_state_xml = pcmk__xe_create(NULL, PCMK__XE_NODE_STATE); - crm_xml_add(node_state_xml, PCMK_XA_ID, node_uuid); - crm_xml_add(node_state_xml, PCMK_XA_UNAME, node_uname); + pcmk__xe_set(node_state_xml, PCMK_XA_ID, node_uuid); + pcmk__xe_set(node_state_xml, PCMK_XA_UNAME, node_uname); delete_call_id = cib_conn->cmds->remove(cib_conn, PCMK_XE_STATUS, node_state_xml, cib_none); @@ -290,13 +299,15 @@ node_list_update_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, fsa_data_t *msg_data = NULL; if(call_id < pcmk_ok) { - crm_err("Node list update failed: %s (%d)", pcmk_strerror(call_id), call_id); - crm_log_xml_debug(msg, "update:failed"); + pcmk__err("Node list update failed: %s (%d)", pcmk_strerror(call_id), + call_id); + pcmk__log_xml_debug(msg, "update:failed"); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } else if(rc < pcmk_ok) { - crm_err("Node update %d failed: %s (%d)", call_id, pcmk_strerror(rc), rc); - crm_log_xml_debug(msg, "update:failed"); + pcmk__err("Node update %d failed: %s (%d)", call_id, pcmk_strerror(rc), + rc); + pcmk__log_xml_debug(msg, "update:failed"); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } } @@ -311,7 +322,7 @@ populate_cib_nodes(enum node_update_flags flags, const char *source) xmlNode *node_list = pcmk__xe_create(NULL, PCMK_XE_NODES); #if SUPPORT_COROSYNC - if (!pcmk_is_set(flags, node_update_quick) + if (!pcmk__is_set(flags, node_update_quick) && (pcmk_get_cluster_layer() == pcmk_cluster_layer_corosync)) { from_hashtable = pcmk__corosync_add_nodes(node_list); @@ -328,8 +339,8 @@ populate_cib_nodes(enum node_update_flags flags, const char *source) xmlNode *new_node = NULL; if ((node->xml_id != NULL) && (node->name != NULL)) { - crm_trace("Creating node entry for %s/%s", - node->name, node->xml_id); + pcmk__trace("Creating node entry for %s/%s", node->name, + node->xml_id); if (xpath == NULL) { xpath = g_string_sized_new(512); } else { @@ -338,8 +349,8 @@ populate_cib_nodes(enum node_update_flags flags, const char *source) /* We need both to be valid */ new_node = pcmk__xe_create(node_list, PCMK_XE_NODE); - crm_xml_add(new_node, PCMK_XA_ID, node->xml_id); - crm_xml_add(new_node, PCMK_XA_UNAME, node->name); + pcmk__xe_set(new_node, PCMK_XA_ID, node->xml_id); + pcmk__xe_set(new_node, PCMK_XA_UNAME, node->name); /* Search and remove unknown nodes with the conflicting uname from CIB */ pcmk__g_strcat(xpath, @@ -361,7 +372,8 @@ populate_cib_nodes(enum node_update_flags flags, const char *source) } } - crm_trace("Populating section from %s", from_hashtable ? "hashtable" : "cluster"); + pcmk__trace("Populating section from %s", + (from_hashtable? "hashtable" : "cluster")); if ((controld_update_cib(PCMK_XE_NODES, node_list, cib_none, node_list_update_callback) == pcmk_rc_ok) @@ -400,11 +412,12 @@ cib_quorum_update_complete(xmlNode * msg, int call_id, int rc, xmlNode * output, fsa_data_t *msg_data = NULL; if (rc == pcmk_ok) { - crm_trace("Quorum update %d complete", call_id); + pcmk__trace("Quorum update %d complete", call_id); } else { - crm_err("Quorum update %d failed: %s (%d)", call_id, pcmk_strerror(rc), rc); - crm_log_xml_debug(msg, "failed"); + pcmk__err("Quorum update %d failed: %s (%d)", call_id, + pcmk_strerror(rc), rc); + pcmk__log_xml_debug(msg, "failed"); register_fsa_error(C_FSA_INTERNAL, I_ERROR, NULL); } } @@ -412,14 +425,14 @@ cib_quorum_update_complete(xmlNode * msg, int call_id, int rc, xmlNode * output, void crm_update_quorum(gboolean quorum, gboolean force_update) { - bool has_quorum = pcmk_is_set(controld_globals.flags, controld_has_quorum); + bool has_quorum = pcmk__is_set(controld_globals.flags, controld_has_quorum); if (quorum) { controld_set_global_flags(controld_ever_had_quorum); - } else if (pcmk_all_flags_set(controld_globals.flags, - controld_ever_had_quorum - |controld_no_quorum_panic)) { + } else if (pcmk__all_flags_set(controld_globals.flags, + controld_ever_had_quorum + |controld_no_quorum_panic)) { pcmk__panic("Quorum lost"); } @@ -429,10 +442,10 @@ crm_update_quorum(gboolean quorum, gboolean force_update) xmlNode *update = NULL; update = pcmk__xe_create(NULL, PCMK_XE_CIB); - crm_xml_add_int(update, PCMK_XA_HAVE_QUORUM, quorum); - crm_xml_add(update, PCMK_XA_DC_UUID, controld_globals.our_uuid); + pcmk__xe_set_int(update, PCMK_XA_HAVE_QUORUM, quorum); + pcmk__xe_set(update, PCMK_XA_DC_UUID, controld_globals.our_uuid); - crm_debug("Updating quorum status to %s", pcmk__btoa(quorum)); + pcmk__debug("Updating quorum status to %s", pcmk__btoa(quorum)); controld_update_cib(PCMK_XE_CIB, update, cib_none, cib_quorum_update_complete); pcmk__xml_free(update); diff --git a/daemons/controld/controld_messages.c b/daemons/controld/controld_messages.c index df215e69dd4..613df46ca32 100644 --- a/daemons/controld/controld_messages.c +++ b/daemons/controld/controld_messages.c @@ -47,7 +47,7 @@ register_fsa_error_adv(enum crmd_fsa_cause cause, enum crmd_fsa_input input, } /* reset the action list */ - crm_info("Resetting the current action list"); + pcmk__info("Resetting the current action list"); fsa_dump_actions(controld_globals.fsa_actions, "Drop"); controld_globals.fsa_actions = A_NOTHING; @@ -69,17 +69,18 @@ register_fsa_input_adv(enum crmd_fsa_cause cause, enum crmd_fsa_input input, if (input == I_NULL && with_actions == A_NOTHING /* && data == NULL */ ) { /* no point doing anything */ - crm_err("Cannot add entry to queue: no input and no action"); + pcmk__err("Cannot add entry to queue: no input and no action"); return; } if (input == I_WAIT_FOR_EVENT) { controld_set_global_flags(controld_fsa_is_stalled); - crm_debug("Stalling the FSA pending further input: source=%s cause=%s data=%p queue=%d", - raised_from, fsa_cause2string(cause), data, old_len); + pcmk__debug("Stalling the FSA pending further input: source=%s " + "cause=%s data=%p queue=%d", + raised_from, fsa_cause2string(cause), data, old_len); if (old_len > 0) { - fsa_dump_queue(LOG_TRACE); + fsa_dump_queue(PCMK__LOG_TRACE); prepend = FALSE; } @@ -97,10 +98,10 @@ register_fsa_input_adv(enum crmd_fsa_cause cause, enum crmd_fsa_input input, } last_data_id++; - crm_trace("%s %s FSA input %d (%s) due to %s, %s data", - raised_from, (prepend? "prepended" : "appended"), last_data_id, - fsa_input2string(input), fsa_cause2string(cause), - (data? "with" : "without")); + pcmk__trace("%s %s FSA input %d (%s) due to %s, %s data", raised_from, + (prepend? "prepended" : "appended"), last_data_id, + fsa_input2string(input), fsa_cause2string(cause), + ((data != NULL)? "with" : "without")); fsa_data = pcmk__assert_alloc(1, sizeof(fsa_data_t)); fsa_data->id = last_data_id; @@ -112,7 +113,7 @@ register_fsa_input_adv(enum crmd_fsa_cause cause, enum crmd_fsa_input input, fsa_data->actions = with_actions; if (with_actions != A_NOTHING) { - crm_trace("Adding actions %.16" PRIx64 " to input", with_actions); + pcmk__trace("Adding actions %.16" PRIx64 " to input", with_actions); } if (data != NULL) { @@ -122,16 +123,16 @@ register_fsa_input_adv(enum crmd_fsa_cause cause, enum crmd_fsa_input input, case C_IPC_MESSAGE: case C_HA_MESSAGE: CRM_CHECK(((ha_msg_input_t *) data)->msg != NULL, - crm_err("Bogus data from %s", raised_from)); - crm_trace("Copying %s data from %s as cluster message data", - fsa_cause2string(cause), raised_from); + pcmk__err("Bogus data from %s", raised_from)); + pcmk__trace("Copying %s data from %s as cluster message data", + fsa_cause2string(cause), raised_from); fsa_data->data = copy_ha_msg_input(data); fsa_data->data_type = fsa_dt_ha_msg; break; case C_LRM_OP_CALLBACK: - crm_trace("Copying %s data from %s as lrmd_event_data_t", - fsa_cause2string(cause), raised_from); + pcmk__trace("Copying %s data from %s as lrmd_event_data_t", + fsa_cause2string(cause), raised_from); fsa_data->data = lrmd_copy_event((lrmd_event_data_t *) data); fsa_data->data_type = fsa_dt_lrm; break; @@ -140,8 +141,8 @@ register_fsa_input_adv(enum crmd_fsa_cause cause, enum crmd_fsa_input input, case C_SHUTDOWN: case C_UNKNOWN: case C_STARTUP: - crm_crit("Copying %s data (from %s) is not yet implemented", - fsa_cause2string(cause), raised_from); + pcmk__crit("Copying %s data (from %s) is not yet implemented", + fsa_cause2string(cause), raised_from); crmd_exit(CRM_EX_SOFTWARE); break; } @@ -156,13 +157,13 @@ register_fsa_input_adv(enum crmd_fsa_cause cause, enum crmd_fsa_input input, = g_list_append(controld_globals.fsa_message_queue, fsa_data); } - crm_trace("FSA message queue length is %d", - g_list_length(controld_globals.fsa_message_queue)); + pcmk__trace("FSA message queue length is %u", + g_list_length(controld_globals.fsa_message_queue)); - /* fsa_dump_queue(LOG_TRACE); */ + /* fsa_dump_queue(PCMK__LOG_TRACE); */ if (old_len == g_list_length(controld_globals.fsa_message_queue)) { - crm_err("Couldn't add message to the queue"); + pcmk__err("Couldn't add message to the queue"); } if (input != I_WAIT_FOR_EVENT) { @@ -210,7 +211,7 @@ delete_fsa_input(fsa_data_t * fsa_data) if (fsa_data == NULL) { return; } - crm_trace("About to free %s data", fsa_cause2string(fsa_data->fsa_cause)); + pcmk__trace("About to free %s data", fsa_cause2string(fsa_data->fsa_cause)); if (fsa_data->data != NULL) { switch (fsa_data->data_type) { @@ -230,13 +231,14 @@ delete_fsa_input(fsa_data_t * fsa_data) case fsa_dt_none: if (fsa_data->data != NULL) { - crm_err("Don't know how to free %s data from %s", - fsa_cause2string(fsa_data->fsa_cause), fsa_data->origin); + pcmk__err("Don't know how to free %s data from %s", + fsa_cause2string(fsa_data->fsa_cause), + fsa_data->origin); crmd_exit(CRM_EX_SOFTWARE); } break; } - crm_trace("%s data freed", fsa_cause2string(fsa_data->fsa_cause)); + pcmk__trace("%s data freed", fsa_cause2string(fsa_data->fsa_cause)); } free(fsa_data); @@ -251,7 +253,7 @@ get_message(void) controld_globals.fsa_message_queue = g_list_remove(controld_globals.fsa_message_queue, message); - crm_trace("Processing input %d", message->id); + pcmk__trace("Processing input %d", message->id); return message; } @@ -261,14 +263,16 @@ fsa_typed_data_adv(fsa_data_t * fsa_data, enum fsa_data_type a_type, const char void *ret_val = NULL; if (fsa_data == NULL) { - crm_err("%s: No FSA data available", caller); + pcmk__err("%s: No FSA data available", caller); } else if (fsa_data->data == NULL) { - crm_err("%s: No message data available. Origin: %s", caller, fsa_data->origin); + pcmk__err("%s: No message data available. Origin: %s", caller, + fsa_data->origin); } else if (fsa_data->data_type != a_type) { - crm_crit("%s: Message data was the wrong type! %d vs. requested=%d. Origin: %s", - caller, fsa_data->data_type, a_type, fsa_data->origin); + pcmk__crit("%s: Message data was the wrong type! %d vs. requested=%d. " + "Origin: %s", + caller, fsa_data->data_type, a_type, fsa_data->origin); pcmk__assert(fsa_data->data_type == a_type); } else { ret_val = fsa_data->data; @@ -347,12 +351,12 @@ relay_message(xmlNode * msg, gboolean originated_locally) CRM_CHECK(msg != NULL, return TRUE); - host_to = crm_element_value(msg, PCMK__XA_CRM_HOST_TO); - sys_to = crm_element_value(msg, PCMK__XA_CRM_SYS_TO); - sys_from = crm_element_value(msg, PCMK__XA_CRM_SYS_FROM); - type = crm_element_value(msg, PCMK__XA_T); - task = crm_element_value(msg, PCMK__XA_CRM_TASK); - ref = crm_element_value(msg, PCMK_XA_REFERENCE); + host_to = pcmk__xe_get(msg, PCMK__XA_CRM_HOST_TO); + sys_to = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_TO); + sys_from = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_FROM); + type = pcmk__xe_get(msg, PCMK__XA_T); + task = pcmk__xe_get(msg, PCMK__XA_CRM_TASK); + ref = pcmk__xe_get(msg, PCMK_XA_REFERENCE); broadcast = pcmk__str_empty(host_to); @@ -361,26 +365,26 @@ relay_message(xmlNode * msg, gboolean originated_locally) } if (pcmk__str_eq(task, CRM_OP_HELLO, pcmk__str_casei)) { - crm_trace("Received hello %s from %s (no processing needed)", - ref, pcmk__s(sys_from, "unidentified source")); - crm_log_xml_trace(msg, "hello"); + pcmk__trace("Received hello %s from %s (no processing needed)", ref, + pcmk__s(sys_from, "unidentified source")); + pcmk__log_xml_trace(msg, "hello"); return TRUE; } // Require message type (set by pcmk__new_request()) if (!pcmk__str_eq(type, PCMK__VALUE_CRMD, pcmk__str_none)) { - crm_warn("Ignoring invalid message %s with type '%s' " - "(not '" PCMK__VALUE_CRMD "')", - ref, pcmk__s(type, "")); - crm_log_xml_trace(msg, "ignored"); + pcmk__warn("Ignoring invalid message %s with type '%s' " + "(not '" PCMK__VALUE_CRMD "')", + ref, pcmk__s(type, "")); + pcmk__log_xml_trace(msg, "ignored"); return TRUE; } // Require a destination subsystem (also set by pcmk__new_request()) if (sys_to == NULL) { - crm_warn("Ignoring invalid message %s with no " PCMK__XA_CRM_SYS_TO, - ref); - crm_log_xml_trace(msg, "ignored"); + pcmk__warn("Ignoring invalid message %s with no " PCMK__XA_CRM_SYS_TO, + ref); + pcmk__log_xml_trace(msg, "ignored"); return TRUE; } @@ -432,7 +436,7 @@ relay_message(xmlNode * msg, gboolean originated_locally) xmlNode *wrapper = pcmk__xe_first_child(msg, PCMK__XE_CRM_XML, NULL, NULL); xmlNode *msg_data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); - const char *mode = crm_element_value(msg_data, PCMK__XA_MODE); + const char *mode = pcmk__xe_get(msg_data, PCMK__XA_MODE); if (pcmk__str_eq(mode, PCMK__VALUE_CIB, pcmk__str_none)) { // Local delete of an offline node's resource history @@ -445,7 +449,7 @@ relay_message(xmlNode * msg, gboolean originated_locally) && (controld_globals.dc_name == NULL)) { xmlNode *reply = create_ping_reply(msg); - sys_to = crm_element_value(reply, PCMK__XA_CRM_SYS_TO); + sys_to = pcmk__xe_get(reply, PCMK__XA_CRM_SYS_TO); // Explicitly leave src empty. It indicates that dc is "not yet selected" send_msg_via_ipc(reply, sys_to, NULL); pcmk__xml_free(reply); @@ -457,23 +461,23 @@ relay_message(xmlNode * msg, gboolean originated_locally) if (is_for_dc || is_for_dcib || is_for_te) { if (AM_I_DC) { if (is_for_te) { - crm_trace("Route message %s locally as transition request", - ref); - crm_log_xml_trace(msg, sys_to); + pcmk__trace("Route message %s locally as transition request", + ref); + pcmk__log_xml_trace(msg, sys_to); send_msg_via_ipc(msg, sys_to, controld_globals.cluster->priv->node_name); return TRUE; // No further processing of message is needed } - crm_trace("Route message %s locally as DC request", ref); + pcmk__trace("Route message %s locally as DC request", ref); return FALSE; // More to be done by caller } if (originated_locally && !pcmk__strcase_any_of(sys_from, CRM_SYSTEM_PENGINE, CRM_SYSTEM_TENGINE, NULL)) { - crm_trace("Relay message %s to DC (via %s)", - ref, pcmk__s(host_to, "broadcast")); - crm_log_xml_trace(msg, "relayed"); + pcmk__trace("Relay message %s to DC (via %s)", ref, + pcmk__s(host_to, "broadcast")); + pcmk__log_xml_trace(msg, "relayed"); if (!broadcast) { node_to = pcmk__get_node(0, host_to, NULL, pcmk__node_search_cluster_member); @@ -485,18 +489,18 @@ relay_message(xmlNode * msg, gboolean originated_locally) /* Transition engine and scheduler messages are sent only to the DC on * the same node. If we are no longer the DC, discard this message. */ - crm_trace("Ignoring message %s because we are no longer DC", ref); - crm_log_xml_trace(msg, "ignored"); + pcmk__trace("Ignoring message %s because we are no longer DC", ref); + pcmk__log_xml_trace(msg, "ignored"); return TRUE; // No further processing of message is needed } if (is_local) { if (is_for_crm || is_for_cib) { - crm_trace("Route message %s locally as controller request", ref); + pcmk__trace("Route message %s locally as controller request", ref); return FALSE; // More to be done by caller } - crm_trace("Relay message %s locally to %s", ref, sys_to); - crm_log_xml_trace(msg, "IPC-relay"); + pcmk__trace("Relay message %s locally to %s", ref, sys_to); + pcmk__log_xml_trace(msg, "IPC-relay"); send_msg_via_ipc(msg, sys_to, controld_globals.cluster->priv->node_name); return TRUE; } @@ -505,16 +509,15 @@ relay_message(xmlNode * msg, gboolean originated_locally) node_to = pcmk__search_node_caches(0, host_to, NULL, pcmk__node_search_cluster_member); if (node_to == NULL) { - crm_warn("Ignoring message %s because node %s is unknown", - ref, host_to); - crm_log_xml_trace(msg, "ignored"); + pcmk__warn("Ignoring message %s because node %s is unknown", + ref, host_to); + pcmk__log_xml_trace(msg, "ignored"); return TRUE; } } - crm_trace("Relay message %s to %s", - ref, pcmk__s(host_to, "all peers")); - crm_log_xml_trace(msg, "relayed"); + pcmk__trace("Relay message %s to %s", ref, pcmk__s(host_to, "all peers")); + pcmk__log_xml_trace(msg, "relayed"); pcmk__cluster_send_message(node_to, dest, msg); return TRUE; } @@ -524,16 +527,16 @@ static bool authorize_version(xmlNode *message_data, const char *field, const char *client_name, const char *ref, const char *uuid) { - const char *version = crm_element_value(message_data, field); + const char *version = pcmk__xe_get(message_data, field); long long version_num; if ((pcmk__scan_ll(version, &version_num, -1LL) != pcmk_rc_ok) || (version_num < 0LL)) { - crm_warn("Rejected IPC hello from %s: '%s' is not a valid protocol %s " - QB_XS " ref=%s uuid=%s", - client_name, ((version == NULL)? "" : version), - field, (ref? ref : "none"), uuid); + pcmk__warn("Rejected IPC hello from %s: '%s' is not a valid protocol %s " + QB_XS " ref=%s uuid=%s", + client_name, pcmk__s(version, ""), field, + pcmk__s(ref, "none"), uuid); return false; } return true; @@ -561,13 +564,14 @@ controld_authorize_ipc_message(const xmlNode *client_msg, pcmk__client_t *curr_c xmlNode *wrapper = NULL; xmlNode *message_data = NULL; const char *client_name = NULL; - const char *op = crm_element_value(client_msg, PCMK__XA_CRM_TASK); - const char *ref = crm_element_value(client_msg, PCMK_XA_REFERENCE); + const char *op = pcmk__xe_get(client_msg, PCMK__XA_CRM_TASK); + const char *ref = pcmk__xe_get(client_msg, PCMK_XA_REFERENCE); const char *uuid = (curr_client? curr_client->id : proxy_session); if (uuid == NULL) { - crm_warn("IPC message from client rejected: No client identifier " - QB_XS " ref=%s", (ref? ref : "none")); + pcmk__warn("IPC message from client rejected: No client identifier " + QB_XS " ref=%s", + pcmk__s(ref, "none")); goto rejected; } @@ -579,10 +583,11 @@ controld_authorize_ipc_message(const xmlNode *client_msg, pcmk__client_t *curr_c wrapper = pcmk__xe_first_child(client_msg, PCMK__XE_CRM_XML, NULL, NULL); message_data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); - client_name = crm_element_value(message_data, PCMK__XA_CLIENT_NAME); + client_name = pcmk__xe_get(message_data, PCMK__XA_CLIENT_NAME); if (pcmk__str_empty(client_name)) { - crm_warn("IPC hello from client rejected: No client name", - QB_XS " ref=%s uuid=%s", (ref? ref : "none"), uuid); + pcmk__warn("IPC hello from client rejected: No client name", + QB_XS " ref=%s uuid=%s", + pcmk__s(ref, "none"), uuid); goto rejected; } if (!authorize_version(message_data, PCMK__XA_MAJOR_VERSION, client_name, @@ -594,8 +599,8 @@ controld_authorize_ipc_message(const xmlNode *client_msg, pcmk__client_t *curr_c goto rejected; } - crm_trace("Validated IPC hello from client %s", client_name); - crm_log_xml_trace(client_msg, "hello"); + pcmk__trace("Validated IPC hello from client %s", client_name); + pcmk__log_xml_trace(client_msg, "hello"); if (curr_client) { curr_client->userdata = pcmk__str_copy(client_name); } @@ -603,7 +608,7 @@ controld_authorize_ipc_message(const xmlNode *client_msg, pcmk__client_t *curr_c return false; rejected: - crm_log_xml_trace(client_msg, "rejected"); + pcmk__log_xml_trace(client_msg, "rejected"); if (curr_client) { qb_ipcs_disconnect(curr_client->ipcs); } @@ -617,7 +622,7 @@ handle_message(xmlNode *msg, enum crmd_fsa_cause cause) CRM_CHECK(msg != NULL, return I_NULL); - type = crm_element_value(msg, PCMK__XA_SUBT); + type = pcmk__xe_get(msg, PCMK__XA_SUBT); if (pcmk__str_eq(type, PCMK__VALUE_REQUEST, pcmk__str_none)) { return handle_request(msg, cause); } @@ -627,9 +632,9 @@ handle_message(xmlNode *msg, enum crmd_fsa_cause cause) return I_NULL; } - crm_warn("Ignoring message with unknown " PCMK__XA_SUBT" '%s'", - pcmk__s(type, "")); - crm_log_xml_trace(msg, "bad"); + pcmk__warn("Ignoring message with unknown " PCMK__XA_SUBT" '%s'", + pcmk__s(type, "")); + pcmk__log_xml_trace(msg, "bad"); return I_NULL; } @@ -657,30 +662,30 @@ handle_failcount_op(xmlNode * stored_msg) rsc = pcmk__xe_id(xml_rsc); } if (xml_attrs) { - op = crm_element_value(xml_attrs, - CRM_META "_" PCMK__META_CLEAR_FAILURE_OP); - crm_element_value_ms(xml_attrs, - CRM_META "_" PCMK__META_CLEAR_FAILURE_INTERVAL, - &interval_ms); + op = pcmk__xe_get(xml_attrs, + CRM_META "_" PCMK__META_CLEAR_FAILURE_OP); + pcmk__xe_get_guint(xml_attrs, + CRM_META "_" PCMK__META_CLEAR_FAILURE_INTERVAL, + &interval_ms); } } - uname = crm_element_value(xml_op, PCMK__META_ON_NODE); + uname = pcmk__xe_get(xml_op, PCMK__META_ON_NODE); if ((rsc == NULL) || (uname == NULL)) { - crm_log_xml_warn(stored_msg, "invalid failcount op"); + pcmk__log_xml_warn(stored_msg, "invalid failcount op"); return I_NULL; } - if (crm_element_value(xml_op, PCMK__XA_ROUTER_NODE)) { + if (pcmk__xe_get(xml_op, PCMK__XA_ROUTER_NODE)) { is_remote_node = TRUE; } - crm_debug("Clearing failures for %s-interval %s on %s " - "from attribute manager, CIB, and executor state", - pcmk__readable_interval(interval_ms), rsc, uname); + pcmk__debug("Clearing failures for %s-interval %s on %s from attribute " + "manager, CIB, and executor state", + pcmk__readable_interval(interval_ms), rsc, uname); if (interval_ms) { - interval_spec = crm_strdup_printf("%ums", interval_ms); + interval_spec = pcmk__assert_asprintf("%ums", interval_ms); } update_attrd_clear_failures(uname, rsc, op, interval_spec, is_remote_node); free(interval_spec); @@ -712,10 +717,10 @@ handle_lrm_delete(xmlNode *stored_msg) * should clear the resource's history from the CIB and nothing else. This * is used to clear shutdown locks. */ - mode = crm_element_value(msg_data, PCMK__XA_MODE); + mode = pcmk__xe_get(msg_data, PCMK__XA_MODE); if (!pcmk__str_eq(mode, PCMK__VALUE_CIB, pcmk__str_none)) { // Relay to affected node - crm_xml_add(stored_msg, PCMK__XA_CRM_SYS_TO, CRM_SYSTEM_LRMD); + pcmk__xe_set(stored_msg, PCMK__XA_CRM_SYS_TO, CRM_SYSTEM_LRMD); return I_ROUTER; } else { @@ -731,12 +736,13 @@ handle_lrm_delete(xmlNode *stored_msg) CRM_CHECK(rsc_xml != NULL, return I_NULL); rsc_id = pcmk__xe_id(rsc_xml); - from_sys = crm_element_value(stored_msg, PCMK__XA_CRM_SYS_FROM); - node = crm_element_value(msg_data, PCMK__META_ON_NODE); + from_sys = pcmk__xe_get(stored_msg, PCMK__XA_CRM_SYS_FROM); + node = pcmk__xe_get(msg_data, PCMK__META_ON_NODE); user_name = pcmk__update_acl_user(stored_msg, PCMK__XA_CRM_USER, NULL); - crm_debug("Handling " CRM_OP_LRM_DELETE " for %s on %s locally%s%s " - "(clearing CIB resource history only)", rsc_id, node, - (user_name? " for user " : ""), (user_name? user_name : "")); + pcmk__debug("Handling " CRM_OP_LRM_DELETE " for %s on %s locally%s%s " + "(clearing CIB resource history only)", + rsc_id, node, ((user_name != NULL)? " for user " : ""), + pcmk__s(user_name, "")); rc = controld_delete_resource_history(rsc_id, node, user_name, cib_dryrun|cib_sync_call); if (rc == pcmk_rc_ok) { @@ -749,20 +755,18 @@ handle_lrm_delete(xmlNode *stored_msg) */ if (from_sys) { lrmd_event_data_t *op = NULL; - const char *from_host = crm_element_value(stored_msg, PCMK__XA_SRC); + const char *from_host = pcmk__xe_get(stored_msg, PCMK__XA_SRC); const char *transition; if (strcmp(from_sys, CRM_SYSTEM_TENGINE)) { - transition = crm_element_value(msg_data, - PCMK__XA_TRANSITION_KEY); + transition = pcmk__xe_get(msg_data, PCMK__XA_TRANSITION_KEY); } else { - transition = crm_element_value(stored_msg, - PCMK__XA_TRANSITION_KEY); + transition = pcmk__xe_get(stored_msg, PCMK__XA_TRANSITION_KEY); } - crm_info("Notifying %s on %s that %s was%s deleted", - from_sys, (from_host? from_host : "local node"), rsc_id, - ((rc == pcmk_rc_ok)? "" : " not")); + pcmk__info("Notifying %s on %s that %s was%s deleted", from_sys, + pcmk__s(from_host, "local node"), rsc_id, + ((rc == pcmk_rc_ok)? "" : " not")); op = lrmd_new_event(rsc_id, PCMK_ACTION_DELETE, 0); op->type = lrmd_event_exec_complete; op->user_data = pcmk__str_copy(pcmk__s(transition, FAKE_TE_ID)); @@ -805,7 +809,7 @@ handle_remote_state(const xmlNode *msg) remote_is_up ? PCMK_VALUE_MEMBER : PCMK__VALUE_LOST, 0); - conn_host = crm_element_value(msg, PCMK__XA_CONNECTION_HOST); + conn_host = pcmk__xe_get(msg, PCMK__XA_CONNECTION_HOST); if (conn_host) { pcmk__str_update(&remote_peer->conn_host, conn_host); } else if (remote_peer->conn_host) { @@ -833,17 +837,17 @@ create_ping_reply(const xmlNode *msg) // Build reply ping = pcmk__xe_create(NULL, PCMK__XE_PING_RESPONSE); - value = crm_element_value(msg, PCMK__XA_CRM_SYS_TO); - crm_xml_add(ping, PCMK__XA_CRM_SUBSYSTEM, value); + value = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_TO); + pcmk__xe_set(ping, PCMK__XA_CRM_SUBSYSTEM, value); // Add controller state value = fsa_state2string(controld_globals.fsa_state); - crm_xml_add(ping, PCMK__XA_CRMD_STATE, value); - crm_notice("Current ping state: %s", value); // CTS needs this + pcmk__xe_set(ping, PCMK__XA_CRMD_STATE, value); + pcmk__notice("Current ping state: %s", value); // CTS needs this // Add controller health // @TODO maybe do some checks to determine meaningful status - crm_xml_add(ping, PCMK_XA_RESULT, "ok"); + pcmk__xe_set(ping, PCMK_XA_RESULT, "ok"); reply = pcmk__new_reply(msg, ping); pcmk__xml_free(ping); @@ -884,10 +888,10 @@ handle_node_list(const xmlNode *request) while (g_hash_table_iter_next(&iter, NULL, (gpointer *) & node)) { xmlNode *xml = pcmk__xe_create(reply_data, PCMK_XE_NODE); - crm_xml_add_ll(xml, PCMK_XA_ID, - (long long) node->cluster_layer_id); // uint32_t - crm_xml_add(xml, PCMK_XA_UNAME, node->name); - crm_xml_add(xml, PCMK__XA_IN_CCM, node->state); + pcmk__xe_set_ll(xml, PCMK_XA_ID, + (long long) node->cluster_layer_id); // uint32_t + pcmk__xe_set(xml, PCMK_XA_UNAME, node->name); + pcmk__xe_set(xml, PCMK__XA_IN_CCM, node->state); } // Create and send reply @@ -921,23 +925,23 @@ handle_node_info_request(const xmlNode *msg) // Build reply reply_data = pcmk__xe_create(NULL, PCMK_XE_NODE); - crm_xml_add(reply_data, PCMK__XA_CRM_SUBSYSTEM, CRM_SYSTEM_CRMD); + pcmk__xe_set(reply_data, PCMK__XA_CRM_SUBSYSTEM, CRM_SYSTEM_CRMD); // Add whether current partition has quorum pcmk__xe_set_bool_attr(reply_data, PCMK_XA_HAVE_QUORUM, - pcmk_is_set(controld_globals.flags, - controld_has_quorum)); + pcmk__is_set(controld_globals.flags, + controld_has_quorum)); /* Check whether client requested node info by ID and/or name * * @TODO A Corosync-layer node ID is of type uint32_t. We should be able to * handle legitimate node IDs greater than INT_MAX, but currently we do not. */ - crm_element_value_int(msg, PCMK_XA_ID, &node_id); + pcmk__xe_get_int(msg, PCMK_XA_ID, &node_id); if (node_id < 0) { node_id = 0; } - value = crm_element_value(msg, PCMK_XA_UNAME); + value = pcmk__xe_get(msg, PCMK_XA_UNAME); // Default to local node if none given if ((node_id == 0) && (value == NULL)) { @@ -947,12 +951,12 @@ handle_node_info_request(const xmlNode *msg) node = pcmk__search_node_caches(node_id, value, NULL, pcmk__node_search_any); if (node) { - crm_xml_add(reply_data, PCMK_XA_ID, node->xml_id); - crm_xml_add(reply_data, PCMK_XA_UNAME, node->name); - crm_xml_add(reply_data, PCMK_XA_CRMD, node->state); + pcmk__xe_set(reply_data, PCMK_XA_ID, node->xml_id); + pcmk__xe_set(reply_data, PCMK_XA_UNAME, node->name); + pcmk__xe_set(reply_data, PCMK_XA_CRMD, node->state); pcmk__xe_set_bool_attr(reply_data, PCMK_XA_REMOTE_NODE, - pcmk_is_set(node->flags, - pcmk__node_status_remote)); + pcmk__is_set(node->flags, + pcmk__node_status_remote)); } // Send reply @@ -970,7 +974,7 @@ handle_node_info_request(const xmlNode *msg) static void verify_feature_set(xmlNode *msg) { - const char *dc_version = crm_element_value(msg, PCMK_XA_CRM_FEATURE_SET); + const char *dc_version = pcmk__xe_get(msg, PCMK_XA_CRM_FEATURE_SET); if (dc_version == NULL) { /* All we really know is that the DC feature set is older than 3.1.0, @@ -980,11 +984,11 @@ verify_feature_set(xmlNode *msg) } if (feature_set_compatible(dc_version, CRM_FEATURE_SET)) { - crm_trace("Local feature set (%s) is compatible with DC's (%s)", - CRM_FEATURE_SET, dc_version); + pcmk__trace("Local feature set (%s) is compatible with DC's (%s)", + CRM_FEATURE_SET, dc_version); } else { - crm_err("Local feature set (%s) is incompatible with DC's (%s)", - CRM_FEATURE_SET, dc_version); + pcmk__err("Local feature set (%s) is incompatible with DC's (%s)", + CRM_FEATURE_SET, dc_version); // Nothing is likely to improve without administrator involvement controld_set_fsa_input_flags(R_STAYDOWN); @@ -996,32 +1000,32 @@ verify_feature_set(xmlNode *msg) static enum crmd_fsa_input handle_shutdown_self_ack(xmlNode *stored_msg) { - const char *host_from = crm_element_value(stored_msg, PCMK__XA_SRC); + const char *host_from = pcmk__xe_get(stored_msg, PCMK__XA_SRC); - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { // The expected case -- we initiated own shutdown sequence - crm_info("Shutting down controller"); + pcmk__info("Shutting down controller"); return I_STOP; } if (pcmk__str_eq(host_from, controld_globals.dc_name, pcmk__str_casei)) { // Must be logic error -- DC confirming its own unrequested shutdown - crm_err("Shutting down controller immediately due to " - "unexpected shutdown confirmation"); + pcmk__err("Shutting down controller immediately due to unexpected " + "shutdown confirmation"); return I_TERMINATE; } if (controld_globals.fsa_state != S_STOPPING) { // Shouldn't happen -- non-DC confirming unrequested shutdown - crm_err("Starting new DC election because %s is " - "confirming shutdown we did not request", - (host_from? host_from : "another node")); + pcmk__err("Starting new DC election because %s is confirming shutdown " + "we did not request", + pcmk__s(host_from, "another node")); return I_ELECTION; } // Shouldn't happen, but we are already stopping anyway - crm_debug("Ignoring unexpected shutdown confirmation from %s", - (host_from? host_from : "another node")); + pcmk__debug("Ignoring unexpected shutdown confirmation from %s", + pcmk__s(host_from, "another node")); return I_NULL; } @@ -1029,29 +1033,30 @@ handle_shutdown_self_ack(xmlNode *stored_msg) static enum crmd_fsa_input handle_shutdown_ack(xmlNode *stored_msg) { - const char *host_from = crm_element_value(stored_msg, PCMK__XA_SRC); + const char *host_from = pcmk__xe_get(stored_msg, PCMK__XA_SRC); if (host_from == NULL) { - crm_warn("Ignoring shutdown request without origin specified"); + pcmk__warn("Ignoring shutdown request without origin specified"); return I_NULL; } if (pcmk__str_eq(host_from, controld_globals.dc_name, pcmk__str_null_matches|pcmk__str_casei)) { - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { - crm_info("Shutting down controller after confirmation from %s", - host_from); + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + pcmk__info("Shutting down controller after confirmation from %s", + host_from); } else { - crm_err("Shutting down controller after unexpected " - "shutdown request from %s", host_from); + pcmk__err("Shutting down controller after unexpected " + "shutdown request from %s", + host_from); controld_set_fsa_input_flags(R_STAYDOWN); } return I_STOP; } - crm_warn("Ignoring shutdown request from %s because DC is %s", - host_from, controld_globals.dc_name); + pcmk__warn("Ignoring shutdown request from %s because DC is %s", + host_from, controld_globals.dc_name); return I_NULL; } @@ -1059,18 +1064,18 @@ static enum crmd_fsa_input handle_request(xmlNode *stored_msg, enum crmd_fsa_cause cause) { xmlNode *msg = NULL; - const char *op = crm_element_value(stored_msg, PCMK__XA_CRM_TASK); + const char *op = pcmk__xe_get(stored_msg, PCMK__XA_CRM_TASK); /* Optimize this for the DC - it has the most to do */ - crm_log_xml_trace(stored_msg, "request"); + pcmk__log_xml_trace(stored_msg, "request"); if (op == NULL) { - crm_warn("Ignoring request without " PCMK__XA_CRM_TASK); + pcmk__warn("Ignoring request without " PCMK__XA_CRM_TASK); return I_NULL; } if (strcmp(op, CRM_OP_SHUTDOWN_REQ) == 0) { - const char *from = crm_element_value(stored_msg, PCMK__XA_SRC); + const char *from = pcmk__xe_get(stored_msg, PCMK__XA_SRC); pcmk__node_status_t *node = pcmk__search_node_caches(0, from, NULL, pcmk__node_search_cluster_member); @@ -1119,7 +1124,7 @@ handle_request(xmlNode *stored_msg, enum crmd_fsa_cause cause) if (AM_I_DC && (controld_globals.transition_graph != NULL) && !controld_globals.transition_graph->complete) { - crm_debug("The throttle changed. Trigger a graph."); + pcmk__debug("The throttle changed. Trigger a graph"); trigger_graph(); } return I_NULL; @@ -1138,19 +1143,19 @@ handle_request(xmlNode *stored_msg, enum crmd_fsa_cause cause) /* Sometimes we _must_ go into S_ELECTION */ if (controld_globals.fsa_state == S_HALT) { - crm_debug("Forcing an election from S_HALT"); + pcmk__debug("Forcing an election from S_HALT"); return I_ELECTION; } } else if (strcmp(op, CRM_OP_JOIN_OFFER) == 0) { verify_feature_set(stored_msg); - crm_debug("Raising I_JOIN_OFFER: join-%s", - crm_element_value(stored_msg, PCMK__XA_JOIN_ID)); + pcmk__debug("Raising I_JOIN_OFFER: join-%s", + pcmk__xe_get(stored_msg, PCMK__XA_JOIN_ID)); return I_JOIN_OFFER; } else if (strcmp(op, CRM_OP_JOIN_ACKNAK) == 0) { - crm_debug("Raising I_JOIN_RESULT: join-%s", - crm_element_value(stored_msg, PCMK__XA_JOIN_ID)); + pcmk__debug("Raising I_JOIN_RESULT: join-%s", + pcmk__xe_get(stored_msg, PCMK__XA_JOIN_ID)); return I_JOIN_RESULT; } else if (strcmp(op, CRM_OP_LRM_DELETE) == 0) { @@ -1159,7 +1164,7 @@ handle_request(xmlNode *stored_msg, enum crmd_fsa_cause cause) } else if ((strcmp(op, CRM_OP_LRM_FAIL) == 0) || (strcmp(op, CRM_OP_REPROBE) == 0)) { - crm_xml_add(stored_msg, PCMK__XA_CRM_SYS_TO, CRM_SYSTEM_LRMD); + pcmk__xe_set(stored_msg, PCMK__XA_CRM_SYS_TO, CRM_SYSTEM_LRMD); return I_ROUTER; } else if (strcmp(op, CRM_OP_NOOP) == 0) { @@ -1175,17 +1180,21 @@ handle_request(xmlNode *stored_msg, enum crmd_fsa_cause cause) int id = 0; const char *name = NULL; - crm_element_value_int(stored_msg, PCMK_XA_ID, &id); - name = crm_element_value(stored_msg, PCMK_XA_UNAME); + pcmk__xe_get_int(stored_msg, PCMK_XA_ID, &id); + name = pcmk__xe_get(stored_msg, PCMK_XA_UNAME); if(cause == C_IPC_MESSAGE) { msg = pcmk__new_request(pcmk_ipc_controld, CRM_SYSTEM_CRMD, NULL, CRM_SYSTEM_CRMD, CRM_OP_RM_NODE_CACHE, NULL); if (!pcmk__cluster_send_message(NULL, pcmk_ipc_controld, msg)) { - crm_err("Could not instruct peers to remove references to node %s/%u", name, id); + pcmk__err("Could not instruct peers to remove references to " + "node %s/%u", + name, id); } else { - crm_notice("Instructing peers to remove references to node %s/%u", name, id); + pcmk__notice("Instructing peers to remove references to node " + "%s/%u", + name, id); } pcmk__xml_free(msg); @@ -1217,8 +1226,9 @@ handle_request(xmlNode *stored_msg, enum crmd_fsa_cause cause) } } else { - crm_err("Unexpected request (%s) sent to %s", op, AM_I_DC ? "the DC" : "non-DC node"); - crm_log_xml_err(stored_msg, "Unexpected"); + pcmk__err("Unexpected request (%s) sent to %s", op, + (AM_I_DC ? "the DC" : "non-DC node")); + pcmk__log_xml_err(stored_msg, "Unexpected"); } return I_NULL; @@ -1227,18 +1237,18 @@ handle_request(xmlNode *stored_msg, enum crmd_fsa_cause cause) static void handle_response(xmlNode *stored_msg) { - const char *op = crm_element_value(stored_msg, PCMK__XA_CRM_TASK); + const char *op = pcmk__xe_get(stored_msg, PCMK__XA_CRM_TASK); - crm_log_xml_trace(stored_msg, "reply"); + pcmk__log_xml_trace(stored_msg, "reply"); if (op == NULL) { - crm_warn("Ignoring reply without " PCMK__XA_CRM_TASK); + pcmk__warn("Ignoring reply without " PCMK__XA_CRM_TASK); } else if (AM_I_DC && strcmp(op, CRM_OP_PECALC) == 0) { // Check whether scheduler answer been superseded by subsequent request - const char *msg_ref = crm_element_value(stored_msg, PCMK_XA_REFERENCE); + const char *msg_ref = pcmk__xe_get(stored_msg, PCMK_XA_REFERENCE); if (msg_ref == NULL) { - crm_err("%s - Ignoring calculation with no reference", op); + pcmk__err("%s - Ignoring calculation with no reference", op); } else if (pcmk__str_eq(msg_ref, controld_globals.fsa_pe_ref, pcmk__str_none)) { @@ -1249,17 +1259,17 @@ handle_response(xmlNode *stored_msg) register_fsa_input_later(C_IPC_MESSAGE, I_PE_SUCCESS, &fsa_input); } else { - crm_info("%s calculation %s is obsolete", op, msg_ref); + pcmk__info("%s calculation %s is obsolete", op, msg_ref); } } else if (strcmp(op, CRM_OP_VOTE) == 0 || strcmp(op, CRM_OP_SHUTDOWN_REQ) == 0 || strcmp(op, CRM_OP_SHUTDOWN) == 0) { } else { - const char *host_from = crm_element_value(stored_msg, PCMK__XA_SRC); + const char *host_from = pcmk__xe_get(stored_msg, PCMK__XA_SRC); - crm_err("Unexpected response (op=%s, src=%s) sent to the %s", - op, host_from, AM_I_DC ? "DC" : "controller"); + pcmk__err("Unexpected response (op=%s, src=%s) sent to the %s", op, + host_from, (AM_I_DC ? "DC" : "controller")); } } @@ -1274,16 +1284,16 @@ handle_shutdown_request(xmlNode * stored_msg) */ char *now_s = NULL; - const char *host_from = crm_element_value(stored_msg, PCMK__XA_SRC); + const char *host_from = pcmk__xe_get(stored_msg, PCMK__XA_SRC); if (host_from == NULL) { /* we're shutting down and the DC */ host_from = controld_globals.cluster->priv->node_name; } - crm_info("Creating shutdown request for %s (state=%s)", host_from, - fsa_state2string(controld_globals.fsa_state)); - crm_log_xml_trace(stored_msg, "message"); + pcmk__info("Creating shutdown request for %s (state=%s)", host_from, + fsa_state2string(controld_globals.fsa_state)); + pcmk__log_xml_trace(stored_msg, "message"); now_s = pcmk__ttoa(time(NULL)); update_attrd(host_from, PCMK__NODE_ATTR_SHUTDOWN, now_s, NULL, FALSE); @@ -1302,8 +1312,8 @@ send_msg_via_ipc(xmlNode * msg, const char *sys, const char *src) client_channel = pcmk__find_client_by_id(sys); - if (crm_element_value(msg, PCMK__XA_SRC) == NULL) { - crm_xml_add(msg, PCMK__XA_SRC, src); + if (pcmk__xe_get(msg, PCMK__XA_SRC) == NULL) { + pcmk__xe_set(msg, PCMK__XA_SRC, src); } if (client_channel != NULL) { @@ -1342,7 +1352,7 @@ send_msg_via_ipc(xmlNode * msg, const char *sys, const char *src) crmd_proxy_send(sys, msg); } else { - crm_info("Received invalid request: unknown subsystem '%s'", sys); + pcmk__info("Received invalid request: unknown subsystem '%s'", sys); } } @@ -1370,15 +1380,15 @@ broadcast_remote_state_message(const char *node_name, bool node_up) CRM_SYSTEM_CRMD, CRM_OP_REMOTE_STATE, NULL); - crm_info("Notifying cluster of Pacemaker Remote node %s %s", - node_name, node_up? "coming up" : "going down"); + pcmk__info("Notifying cluster of Pacemaker Remote node %s %s", node_name, + (node_up? "coming up" : "going down")); - crm_xml_add(msg, PCMK_XA_ID, node_name); + pcmk__xe_set(msg, PCMK_XA_ID, node_name); pcmk__xe_set_bool_attr(msg, PCMK__XA_IN_CCM, node_up); if (node_up) { - crm_xml_add(msg, PCMK__XA_CONNECTION_HOST, - controld_globals.cluster->priv->node_name); + pcmk__xe_set(msg, PCMK__XA_CONNECTION_HOST, + controld_globals.cluster->priv->node_name); } pcmk__cluster_send_message(NULL, pcmk_ipc_controld, msg); diff --git a/daemons/controld/controld_metadata.c b/daemons/controld/controld_metadata.c index 748e834cc6f..dd9031eca27 100644 --- a/daemons/controld/controld_metadata.c +++ b/daemons/controld/controld_metadata.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2024 the Pacemaker project contributors + * Copyright 2017-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -52,7 +52,8 @@ void metadata_cache_free(GHashTable *mdc) { if (mdc) { - crm_trace("Destroying metadata cache with %d members", g_hash_table_size(mdc)); + pcmk__trace("Destroying metadata cache with %u members", + g_hash_table_size(mdc)); g_hash_table_destroy(mdc); } } @@ -61,8 +62,8 @@ void metadata_cache_reset(GHashTable *mdc) { if (mdc) { - crm_trace("Resetting metadata cache with %d members", - g_hash_table_size(mdc)); + pcmk__trace("Resetting metadata cache with %u members", + g_hash_table_size(mdc)); g_hash_table_remove_all(mdc); } } @@ -70,7 +71,7 @@ metadata_cache_reset(GHashTable *mdc) static struct ra_param_s * ra_param_from_xml(xmlNode *param_xml) { - const char *param_name = crm_element_value(param_xml, PCMK_XA_NAME); + const char *param_name = pcmk__xe_get(param_xml, PCMK_XA_NAME); struct ra_param_s *p; p = pcmk__assert_alloc(1, sizeof(struct ra_param_s)); @@ -95,20 +96,22 @@ static void log_ra_ocf_version(const char *ra_key, const char *ra_ocf_version) { if (pcmk__str_empty(ra_ocf_version)) { - crm_warn("%s does not advertise OCF version supported", ra_key); + pcmk__warn("%s does not advertise OCF version supported", ra_key); - } else if (compare_version(ra_ocf_version, "2") >= 0) { - crm_warn("%s supports OCF version %s (this Pacemaker version supports " - PCMK_OCF_VERSION " and might not work properly with agent)", - ra_key, ra_ocf_version); + } else if (pcmk__compare_versions(ra_ocf_version, "2") >= 0) { + pcmk__warn("%s supports OCF version %s (this Pacemaker version " + "supports " PCMK_OCF_VERSION " and might not work properly " + "with agent)", + ra_key, ra_ocf_version); - } else if (compare_version(ra_ocf_version, PCMK_OCF_VERSION) > 0) { - crm_info("%s supports OCF version %s (this Pacemaker version supports " - PCMK_OCF_VERSION " and might not use all agent features)", - ra_key, ra_ocf_version); + } else if (pcmk__compare_versions(ra_ocf_version, PCMK_OCF_VERSION) > 0) { + pcmk__info("%s supports OCF version %s (this Pacemaker version " + "supports " PCMK_OCF_VERSION " and might not use all agent " + "features)", + ra_key, ra_ocf_version); } else { - crm_debug("%s supports OCF version %s", ra_key, ra_ocf_version); + pcmk__debug("%s supports OCF version %s", ra_key, ra_ocf_version); } } @@ -151,7 +154,8 @@ controld_cache_metadata(GHashTable *mdc, const lrmd_rsc_info_t *rsc, } log_ra_ocf_version(key, (const char *) content); if (content != NULL) { - ocf1_1 = (compare_version((const char *) content, "1.1") >= 0); + ocf1_1 = (pcmk__compare_versions((const char *) content, + "1.1") >= 0); xmlFree(content); } } @@ -161,15 +165,16 @@ controld_cache_metadata(GHashTable *mdc, const lrmd_rsc_info_t *rsc, for (match = pcmk__xe_first_child(match, PCMK_XE_ACTION, NULL, NULL); match != NULL; match = pcmk__xe_next(match, PCMK_XE_ACTION)) { - const char *action_name = crm_element_value(match, PCMK_XA_NAME); + const char *action_name = pcmk__xe_get(match, PCMK_XA_NAME); if (pcmk__str_eq(action_name, PCMK_ACTION_RELOAD_AGENT, pcmk__str_none)) { if (ocf1_1) { controld_set_ra_flags(md, key, ra_supports_reload_agent); } else { - crm_notice("reload-agent action will not be used with %s " - "because it does not support OCF 1.1 or later", key); + pcmk__notice("reload-agent action will not be used with %s " + "because it does not support OCF 1.1 or later", + key); } } else if (!ocf1_1 && pcmk__str_eq(action_name, PCMK_ACTION_RELOAD, @@ -183,11 +188,12 @@ controld_cache_metadata(GHashTable *mdc, const lrmd_rsc_info_t *rsc, for (match = pcmk__xe_first_child(match, PCMK_XE_PARAMETER, NULL, NULL); match != NULL; match = pcmk__xe_next(match, PCMK_XE_PARAMETER)) { - const char *param_name = crm_element_value(match, PCMK_XA_NAME); + const char *param_name = pcmk__xe_get(match, PCMK_XA_NAME); if (param_name == NULL) { - crm_warn("Metadata for %s:%s:%s has parameter without a " - PCMK_XA_NAME, rsc->standard, rsc->provider, rsc->type); + pcmk__warn("Metadata for %s:%s:%s has parameter without a " + PCMK_XA_NAME, + rsc->standard, rsc->provider, rsc->type); } else { struct ra_param_s *p = ra_param_from_xml(match); @@ -195,7 +201,7 @@ controld_cache_metadata(GHashTable *mdc, const lrmd_rsc_info_t *rsc, reason = "Could not allocate memory"; goto err; } - if (pcmk_is_set(p->rap_flags, ra_param_private)) { + if (pcmk__is_set(p->rap_flags, ra_param_private)) { any_private_params = true; } md->ra_params = g_list_prepend(md->ra_params, p); @@ -223,9 +229,9 @@ controld_cache_metadata(GHashTable *mdc, const lrmd_rsc_info_t *rsc, return md; err: - crm_warn("Unable to update metadata for %s (%s%s%s:%s): %s", - rsc->id, rsc->standard, ((rsc->provider == NULL)? "" : ":"), - pcmk__s(rsc->provider, ""), rsc->type, reason); + pcmk__warn("Unable to update metadata for %s (%s%s%s:%s): %s", rsc->id, + rsc->standard, ((rsc->provider == NULL)? "" : ":"), + pcmk__s(rsc->provider, ""), rsc->type, reason); free(key); pcmk__xml_free(metadata); metadata_free(md); @@ -254,23 +260,22 @@ controld_get_rsc_metadata(lrm_state_t *lrm_state, const lrmd_rsc_info_t *rsc, CRM_CHECK((lrm_state != NULL) && (rsc != NULL), return NULL); - if (pcmk_is_set(source, controld_metadata_from_cache)) { + if (pcmk__is_set(source, controld_metadata_from_cache)) { key = crm_generate_ra_key(rsc->standard, rsc->provider, rsc->type); if (key != NULL) { metadata = g_hash_table_lookup(lrm_state->metadata_cache, key); free(key); } if (metadata != NULL) { - crm_debug("Retrieved metadata for %s (%s%s%s:%s) from cache", - rsc->id, rsc->standard, - ((rsc->provider == NULL)? "" : ":"), - ((rsc->provider == NULL)? "" : rsc->provider), - rsc->type); + pcmk__debug("Retrieved metadata for %s (%s%s%s:%s) from cache", + rsc->id, rsc->standard, + ((rsc->provider != NULL)? ":" : ""), + pcmk__s(rsc->provider, ""), rsc->type); return metadata; } } - if (!pcmk_is_set(source, controld_metadata_from_agent)) { + if (!pcmk__is_set(source, controld_metadata_from_agent)) { return NULL; } @@ -288,19 +293,16 @@ controld_get_rsc_metadata(lrm_state_t *lrm_state, const lrmd_rsc_info_t *rsc, * means that if the metadata action tries to contact the controller, * everything will hang until the timeout). */ - crm_debug("Retrieving metadata for %s (%s%s%s:%s) synchronously", - rsc->id, rsc->standard, - ((rsc->provider == NULL)? "" : ":"), - ((rsc->provider == NULL)? "" : rsc->provider), - rsc->type); + pcmk__debug("Retrieving metadata for %s (%s%s%s:%s) synchronously", rsc->id, + rsc->standard, ((rsc->provider != NULL)? ":" : ""), + pcmk__s(rsc->provider, ""), rsc->type); rc = lrm_state_get_metadata(lrm_state, rsc->standard, rsc->provider, rsc->type, &metadata_str, 0); if (rc != pcmk_ok) { - crm_warn("Failed to get metadata for %s (%s%s%s:%s): %s", - rsc->id, rsc->standard, - ((rsc->provider == NULL)? "" : ":"), - ((rsc->provider == NULL)? "" : rsc->provider), - rsc->type, pcmk_strerror(rc)); + pcmk__warn("Failed to get metadata for %s (%s%s%s:%s): %s", rsc->id, + rsc->standard, ((rsc->provider == NULL)? "" : ":"), + ((rsc->provider == NULL)? "" : rsc->provider), rsc->type, + pcmk_strerror(rc)); return NULL; } diff --git a/daemons/controld/controld_metadata.h b/daemons/controld/controld_metadata.h index 12ea327e4ed..1fb788df855 100644 --- a/daemons/controld/controld_metadata.h +++ b/daemons/controld/controld_metadata.h @@ -1,5 +1,5 @@ /* - * Copyright 2017-2022 the Pacemaker project contributors + * Copyright 2017-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,6 +12,8 @@ #include // uint32_t #include // GList, GHashTable + +#include // PCMK__LOG_TRACE #include "controld_lrm.h" // lrm_state_t, lrm_rsc_info_t /* @@ -57,14 +59,21 @@ struct ra_metadata_s { #define controld_set_ra_flags(ra_md, ra_key, flags_to_set) do { \ (ra_md)->ra_flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Resource agent", ra_key, \ - (ra_md)->ra_flags, (flags_to_set), #flags_to_set); \ + PCMK__LOG_TRACE, \ + "Resource agent", ra_key, \ + (ra_md)->ra_flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) -#define controld_set_ra_param_flags(ra_param, flags_to_set) do { \ - (ra_param)->rap_flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Resource agent parameter", (ra_param)->rap_name, \ - (ra_param)->rap_flags, (flags_to_set), #flags_to_set); \ +#define controld_set_ra_param_flags(ra_param, flags_to_set) do { \ + (ra_param)->rap_flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Resource agent parameter", \ + (ra_param)->rap_name, \ + (ra_param)->rap_flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) GHashTable *metadata_cache_new(void); diff --git a/daemons/controld/controld_remote_ra.c b/daemons/controld/controld_remote_ra.c index a5e63ff092f..3cf223b7b66 100644 --- a/daemons/controld/controld_remote_ra.c +++ b/daemons/controld/controld_remote_ra.c @@ -26,16 +26,21 @@ #define MAX_START_TIMEOUT_MS 10000 #define cmd_set_flags(cmd, flags_to_set) do { \ - (cmd)->status = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Remote command", (cmd)->rsc_id, (cmd)->status, \ - (flags_to_set), #flags_to_set); \ - } while (0) + (cmd)->status = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Remote command", (cmd)->rsc_id, \ + (cmd)->status, (flags_to_set), \ + #flags_to_set); \ + } while (0) #define cmd_clear_flags(cmd, flags_to_clear) do { \ - (cmd)->status = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Remote command", (cmd)->rsc_id, (cmd)->status, \ - (flags_to_clear), #flags_to_clear); \ - } while (0) + (cmd)->status = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Remote command", \ + (cmd)->rsc_id, (cmd)->status, \ + (flags_to_clear), \ + #flags_to_clear); \ + } while (0) enum remote_cmd_status { cmd_reported_success = (1 << 0), @@ -71,21 +76,26 @@ typedef struct remote_ra_cmd_s { uint32_t status; } remote_ra_cmd_t; -#define lrm_remote_set_flags(lrm_state, flags_to_set) do { \ - lrm_state_t *lrm = (lrm_state); \ - remote_ra_data_t *ra = lrm->remote_ra_data; \ - ra->status = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, "Remote", \ - lrm->node_name, ra->status, \ - (flags_to_set), #flags_to_set); \ - } while (0) - -#define lrm_remote_clear_flags(lrm_state, flags_to_clear) do { \ - lrm_state_t *lrm = (lrm_state); \ - remote_ra_data_t *ra = lrm->remote_ra_data; \ - ra->status = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Remote", \ - lrm->node_name, ra->status, \ - (flags_to_clear), #flags_to_clear); \ - } while (0) +#define lrm_remote_set_flags(lrm_state, flags_to_set) do { \ + lrm_state_t *lrm = (lrm_state); \ + remote_ra_data_t *ra = lrm->remote_ra_data; \ + \ + ra->status = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Remote", \ + lrm->node_name, ra->status, \ + (flags_to_set), #flags_to_set); \ + } while (0) + +#define lrm_remote_clear_flags(lrm_state, flags_to_clear) do { \ + lrm_state_t *lrm = (lrm_state); \ + remote_ra_data_t *ra = lrm->remote_ra_data; \ + \ + ra->status = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Remote", \ + lrm->node_name, ra->status, \ + (flags_to_clear), \ + #flags_to_clear); \ + } while (0) enum remote_status { expect_takeover = (1 << 0), @@ -240,7 +250,7 @@ should_purge_attributes(pcmk__node_status_t *node) static enum controld_section_e section_to_delete(bool purge) { - if (pcmk_is_set(controld_globals.flags, controld_shutdown_lock_enabled)) { + if (pcmk__is_set(controld_globals.flags, controld_shutdown_lock_enabled)) { if (purge) { return controld_section_all_unlocked; } else { @@ -284,7 +294,7 @@ remote_node_up(const char *node_name) lrm_state_t *connection_rsc = NULL; CRM_CHECK(node_name != NULL, return); - crm_info("Announcing Pacemaker Remote node %s", node_name); + pcmk__info("Announcing Pacemaker Remote node %s", node_name); call_opt = crmd_cib_smart_opt(); @@ -335,7 +345,7 @@ remote_node_up(const char *node_name) * needs to be fenced, this flag will allow various actions to determine * whether the fencing has happened yet. */ - crm_xml_add(state, PCMK__XA_NODE_FENCED, "0"); + pcmk__xe_set(state, PCMK__XA_NODE_FENCED, "0"); /* TODO: If the remote connection drops, and this (async) CIB update either * failed or has not yet completed, later actions could mistakenly think the @@ -434,7 +444,7 @@ check_remote_node_state(const remote_ra_cmd_t *cmd) remote_ra_data_t *ra_data = lrm_state? lrm_state->remote_ra_data : NULL; if (ra_data) { - if (!pcmk_is_set(ra_data->status, takeover_complete)) { + if (!pcmk__is_set(ra_data->status, takeover_complete)) { /* Stop means down if we didn't successfully migrate elsewhere */ remote_node_down(cmd->rsc_id, DOWN_KEEP_LRM); } else if (AM_I_DC == FALSE) { @@ -477,7 +487,9 @@ report_remote_ra_result(remote_ra_cmd_t * cmd) lrmd__set_result(&op, cmd->result.exit_status, cmd->result.execution_status, cmd->result.exit_reason); - if (pcmk_is_set(cmd->status, cmd_reported_success) && !pcmk__result_ok(&(cmd->result))) { + if (pcmk__is_set(cmd->status, cmd_reported_success) + && !pcmk__result_ok(&(cmd->result))) { + op.t_rcchange = time(NULL); /* This edge case will likely never ever occur, but if it does the * result is that a failure will not be processed correctly. This is only @@ -575,7 +587,7 @@ connection_takeover_timeout_cb(gpointer data) lrm_state_t *lrm_state = NULL; remote_ra_cmd_t *cmd = data; - crm_info("takeover event timed out for node %s", cmd->rsc_id); + pcmk__info("takeover event timed out for node %s", cmd->rsc_id); cmd->takeover_timeout_id = 0; lrm_state = controld_get_executor_state(cmd->rsc_id, false); @@ -594,8 +606,8 @@ monitor_timeout_cb(gpointer data) lrm_state = controld_get_executor_state(cmd->rsc_id, false); - crm_info("Timed out waiting for remote poke response from %s%s", - cmd->rsc_id, (lrm_state? "" : " (no LRM state)")); + pcmk__info("Timed out waiting for remote poke response from %s%s", + cmd->rsc_id, ((lrm_state != NULL)? "" : " (no LRM state)")); cmd->monitor_timeout_id = 0; pcmk__set_result(&(cmd->result), PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_TIMEOUT, "Remote executor did not respond"); @@ -652,16 +664,16 @@ remote_lrm_op_callback(lrmd_event_data_t * op) CRM_CHECK((op != NULL) && (op->remote_nodename != NULL), return); - crm_debug("Processing '%s%s%s' event on remote connection to %s: %s " - "(%d) status=%s (%d)", - (op->op_type? op->op_type : ""), (op->op_type? " " : ""), - lrmd_event_type2str(op->type), op->remote_nodename, - crm_exit_str((crm_exit_t) op->rc), op->rc, - pcmk_exec_status_str(op->op_status), op->op_status); + pcmk__debug("Processing '%s%s%s' event on remote connection to %s: %s " + "(%d) status=%s (%d)", + pcmk__s(op->op_type, ""), ((op->op_type != NULL)? " " : ""), + lrmd_event_type2str(op->type), op->remote_nodename, + crm_exit_str((crm_exit_t) op->rc), op->rc, + pcmk_exec_status_str(op->op_status), op->op_status); lrm_state = controld_get_executor_state(op->remote_nodename, false); if (!lrm_state || !lrm_state->remote_ra_data) { - crm_debug("No state information found for remote connection event"); + pcmk__debug("No state information found for remote connection event"); return; } ra_data = lrm_state->remote_ra_data; @@ -669,14 +681,15 @@ remote_lrm_op_callback(lrmd_event_data_t * op) if (op->type == lrmd_event_new_client) { // Another client has connected to the remote daemon - if (pcmk_is_set(ra_data->status, expect_takeover)) { + if (pcmk__is_set(ra_data->status, expect_takeover)) { // Great, we knew this was coming lrm_remote_clear_flags(lrm_state, expect_takeover); lrm_remote_set_flags(lrm_state, takeover_complete); } else { - crm_err("Disconnecting from Pacemaker Remote node %s due to " - "unexpected client takeover", op->remote_nodename); + pcmk__err("Disconnecting from Pacemaker Remote node %s due to " + "unexpected client takeover", + op->remote_nodename); /* In this case, lrmd_tls_connection_destroy() will be called under the control of mainloop. */ /* Do not free lrm_state->conn yet. */ /* It'll be freed in the following stop action. */ @@ -687,8 +700,9 @@ remote_lrm_op_callback(lrmd_event_data_t * op) /* filter all EXEC events up */ if (op->type == lrmd_event_exec_complete) { - if (pcmk_is_set(ra_data->status, takeover_complete)) { - crm_debug("ignoring event, this connection is taken over by another node"); + if (pcmk__is_set(ra_data->status, takeover_complete)) { + pcmk__debug("ignoring event, this connection is taken over by " + "another node"); } else { lrm_op_callback(op); } @@ -697,19 +711,19 @@ remote_lrm_op_callback(lrmd_event_data_t * op) if ((op->type == lrmd_event_disconnect) && (ra_data->cur_cmd == NULL)) { - if (!pcmk_is_set(ra_data->status, remote_active)) { - crm_debug("Disconnection from Pacemaker Remote node %s complete", - lrm_state->node_name); + if (!pcmk__is_set(ra_data->status, remote_active)) { + pcmk__debug("Disconnection from Pacemaker Remote node %s complete", + lrm_state->node_name); } else if (!remote_ra_is_in_maintenance(lrm_state)) { - crm_err("Lost connection to Pacemaker Remote node %s", - lrm_state->node_name); + pcmk__err("Lost connection to Pacemaker Remote node %s", + lrm_state->node_name); ra_data->recurring_cmds = fail_all_monitor_cmds(ra_data->recurring_cmds); ra_data->cmds = fail_all_monitor_cmds(ra_data->cmds); } else { - crm_notice("Unmanaged Pacemaker Remote node %s disconnected", - lrm_state->node_name); + pcmk__notice("Unmanaged Pacemaker Remote node %s disconnected", + lrm_state->node_name); /* Do roughly what a 'stop' on the remote-resource would do */ handle_remote_ra_stop(lrm_state, NULL); remote_node_down(lrm_state->node_name, DOWN_KEEP_LRM); @@ -721,7 +735,7 @@ remote_lrm_op_callback(lrmd_event_data_t * op) } if (!ra_data->cur_cmd) { - crm_debug("no event to match"); + pcmk__debug("no event to match"); return; } @@ -741,14 +755,15 @@ remote_lrm_op_callback(lrmd_event_data_t * op) pcmk_strerror(op->connection_rc)); } else if (remaining > 3) { - crm_trace("Rescheduling start (%ds remains before timeout)", - remaining); + pcmk__trace("Rescheduling start (%ds remains before timeout)", + remaining); pcmk__create_timer(1000, retry_start_cmd_cb, lrm_state); return; } else { - crm_trace("Not enough time before timeout (%ds) " - "to reschedule start", remaining); + pcmk__trace("Not enough time before timeout (%ds) to " + "reschedule start", + remaining); pcmk__format_result(&(cmd->result), PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_TIMEOUT, "%s without enough time to retry", @@ -761,7 +776,7 @@ remote_lrm_op_callback(lrmd_event_data_t * op) lrm_remote_set_flags(lrm_state, remote_active); } - crm_debug("Remote connection event matched %s action", cmd->action); + pcmk__debug("Remote connection event matched %s action", cmd->action); report_remote_ra_result(cmd); cmd_handled = TRUE; @@ -777,16 +792,16 @@ remote_lrm_op_callback(lrmd_event_data_t * op) /* Only report success the first time, after that only worry about failures. * For this function, if we get the poke pack, it is always a success. Pokes * only fail if the send fails, or the response times out. */ - if (!pcmk_is_set(cmd->status, cmd_reported_success)) { + if (!pcmk__is_set(cmd->status, cmd_reported_success)) { pcmk__set_result(&(cmd->result), PCMK_OCF_OK, PCMK_EXEC_DONE, NULL); report_remote_ra_result(cmd); cmd_set_flags(cmd, cmd_reported_success); } - crm_debug("Remote poke event matched %s action", cmd->action); + pcmk__debug("Remote poke event matched %s action", cmd->action); /* success, keep rescheduling if interval is present. */ - if (cmd->interval_ms && !pcmk_is_set(cmd->status, cmd_cancel)) { + if (cmd->interval_ms && !pcmk__is_set(cmd->status, cmd_cancel)) { ra_data->recurring_cmds = g_list_append(ra_data->recurring_cmds, cmd); cmd->interval_id = pcmk__create_timer(cmd->interval_ms, recurring_helper, cmd); @@ -797,20 +812,22 @@ remote_lrm_op_callback(lrmd_event_data_t * op) } else if ((op->type == lrmd_event_disconnect) && pcmk__str_eq(cmd->action, PCMK_ACTION_MONITOR, pcmk__str_casei)) { - if (pcmk_is_set(ra_data->status, remote_active) && - !pcmk_is_set(cmd->status, cmd_cancel)) { + if (pcmk__is_set(ra_data->status, remote_active) + && !pcmk__is_set(cmd->status, cmd_cancel)) { + pcmk__set_result(&(cmd->result), PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_ERROR, "Remote connection unexpectedly dropped " "during monitor"); report_remote_ra_result(cmd); - crm_err("Remote connection to %s unexpectedly dropped during monitor", - lrm_state->node_name); + pcmk__err("Remote connection to %s unexpectedly dropped during " + "monitor", + lrm_state->node_name); } cmd_handled = TRUE; } else { - crm_debug("Event did not match %s action", ra_data->cur_cmd->action); + pcmk__debug("Event did not match %s action", ra_data->cur_cmd->action); } if (cmd_handled) { @@ -830,7 +847,7 @@ handle_remote_ra_stop(lrm_state_t * lrm_state, remote_ra_cmd_t * cmd) pcmk__assert(lrm_state != NULL); ra_data = lrm_state->remote_ra_data; - if (!pcmk_is_set(ra_data->status, takeover_complete)) { + if (!pcmk__is_set(ra_data->status, takeover_complete)) { /* delete pending ops when ever the remote connection is intentionally stopped */ g_hash_table_remove_all(lrm_state->active_ops); } else { @@ -926,8 +943,9 @@ handle_remote_ra_exec(gpointer user_data) if (handle_remote_ra_start(lrm_state, cmd, cmd->timeout) == pcmk_rc_ok) { /* take care of this later when we get async connection result */ - crm_debug("Initiated async remote connection, %s action will complete after connect event", - cmd->action); + pcmk__debug("Initiated async remote connection, %s action will " + "complete after connect event", + cmd->action); ra_data->cur_cmd = cmd; return TRUE; } @@ -948,8 +966,9 @@ handle_remote_ra_exec(gpointer user_data) } if (rc == 0) { - crm_debug("Poked Pacemaker Remote at node %s, waiting for async response", - cmd->rsc_id); + pcmk__debug("Poked Pacemaker Remote at node %s, waiting for " + "async response", + cmd->rsc_id); ra_data->cur_cmd = cmd; cmd->monitor_timeout_id = pcmk__create_timer(cmd->timeout, monitor_timeout_cb, cmd); return TRUE; @@ -958,7 +977,7 @@ handle_remote_ra_exec(gpointer user_data) } else if (!strcmp(cmd->action, PCMK_ACTION_STOP)) { - if (pcmk_is_set(ra_data->status, expect_takeover)) { + if (pcmk__is_set(ra_data->status, expect_takeover)) { /* Briefly wait on stop for an expected takeover to occur. If * the takeover does not occur during the wait, that's fine; it * just means that the remote node's resource history will be @@ -1101,8 +1120,8 @@ fail_all_monitor_cmds(GList * list) pcmk__set_result(&(cmd->result), PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_ERROR, "Lost connection to remote executor"); - crm_trace("Pre-emptively failing %s %s (interval=%u, %s)", - cmd->action, cmd->rsc_id, cmd->interval_ms, cmd->userdata); + pcmk__trace("Pre-emptively failing %s %s (interval=%u, %s)", + cmd->action, cmd->rsc_id, cmd->interval_ms, cmd->userdata); report_remote_ra_result(cmd); list = g_list_remove(list, cmd); @@ -1181,8 +1200,8 @@ handle_dup_monitor(remote_ra_data_t *ra_data, guint interval_ms, } if (ra_data->cur_cmd && - !pcmk_is_set(ra_data->cur_cmd->status, cmd_cancel) && - (ra_data->cur_cmd->interval_ms == interval_ms) + !pcmk__is_set(ra_data->cur_cmd->status, cmd_cancel) + && (ra_data->cur_cmd->interval_ms == interval_ms) && pcmk__str_eq(ra_data->cur_cmd->action, PCMK_ACTION_MONITOR, pcmk__str_casei)) { @@ -1212,8 +1231,8 @@ handle_dup_monitor(remote_ra_data_t *ra_data, guint interval_ms, handle_dup: - crm_trace("merging duplicate monitor cmd " PCMK__OP_FMT, - cmd->rsc_id, PCMK_ACTION_MONITOR, interval_ms); + pcmk__trace("merging duplicate monitor cmd " PCMK__OP_FMT, cmd->rsc_id, + PCMK_ACTION_MONITOR, interval_ms); /* update the userdata */ if (userdata) { @@ -1222,7 +1241,7 @@ handle_dup_monitor(remote_ra_data_t *ra_data, guint interval_ms, } /* if we've already reported success, generate a new call id */ - if (pcmk_is_set(cmd->status, cmd_reported_success)) { + if (pcmk__is_set(cmd->status, cmd_reported_success)) { cmd->start_time = time(NULL); cmd->call_id = generate_callid(); cmd_clear_flags(cmd, cmd_reported_success); @@ -1338,7 +1357,7 @@ remote_ra_fail(const char *node_name) if (lrm_state && lrm_state_is_connected(lrm_state)) { remote_ra_data_t *ra_data = lrm_state->remote_ra_data; - crm_info("Failing monitors on Pacemaker Remote node %s", node_name); + pcmk__info("Failing monitors on Pacemaker Remote node %s", node_name); ra_data->recurring_cmds = fail_all_monitor_cmds(ra_data->recurring_cmds); ra_data->cmds = fail_all_monitor_cmds(ra_data->cmds); } @@ -1410,7 +1429,7 @@ remote_ra_maintenance(lrm_state_t * lrm_state, gboolean maintenance) update = pcmk__xe_create(NULL, PCMK_XE_STATUS); state = create_node_state_update(node, node_update_none, update, __func__); - crm_xml_add(state, PCMK__XA_NODE_IN_MAINTENANCE, (maintenance? "1" : "0")); + pcmk__xe_set(state, PCMK__XA_NODE_IN_MAINTENANCE, (maintenance? "1" : "0")); if (controld_update_cib(PCMK_XE_STATUS, update, call_opt, NULL) == pcmk_rc_ok) { /* TODO: still not 100% sure that async update will succeed ... */ @@ -1448,6 +1467,7 @@ remote_ra_process_maintenance_nodes(xmlNode *xml) node != NULL; node = pcmk__xe_next(node, PCMK_XE_NODE)) { lrm_state_t *lrm_state = NULL; + const remote_ra_data_t *ra_data = NULL; const char *id = pcmk__xe_id(node); cnt++; @@ -1456,23 +1476,23 @@ remote_ra_process_maintenance_nodes(xmlNode *xml) } lrm_state = controld_get_executor_state(id, false); + ra_data = (const remote_ra_data_t *) lrm_state->remote_ra_data; - if (lrm_state && lrm_state->remote_ra_data && - pcmk_is_set(((remote_ra_data_t *) lrm_state->remote_ra_data)->status, remote_active)) { + if ((lrm_state != NULL) && (lrm_state->remote_ra_data != NULL) + && pcmk__is_set(ra_data->status, remote_active)) { const char *in_maint_s = NULL; int in_maint; cnt_remote++; - in_maint_s = crm_element_value(node, - PCMK__XA_NODE_IN_MAINTENANCE); + in_maint_s = pcmk__xe_get(node, PCMK__XA_NODE_IN_MAINTENANCE); pcmk__scan_min_int(in_maint_s, &in_maint, 0); remote_ra_maintenance(lrm_state, in_maint); } } - crm_trace("Action holds %d nodes (%d remotes found) adjusting " - PCMK_OPT_MAINTENANCE_MODE, - cnt, cnt_remote); + pcmk__trace("Action holds %d nodes (%d remotes found) adjusting " + PCMK_OPT_MAINTENANCE_MODE, + cnt, cnt_remote); } xmlXPathFreeObject(search); } @@ -1481,12 +1501,12 @@ gboolean remote_ra_is_in_maintenance(lrm_state_t * lrm_state) { remote_ra_data_t *ra_data = lrm_state->remote_ra_data; - return pcmk_is_set(ra_data->status, remote_in_maint); + return pcmk__is_set(ra_data->status, remote_in_maint); } gboolean remote_ra_controlling_guest(lrm_state_t * lrm_state) { remote_ra_data_t *ra_data = lrm_state->remote_ra_data; - return pcmk_is_set(ra_data->status, controlling_guest); + return pcmk__is_set(ra_data->status, controlling_guest); } diff --git a/daemons/controld/controld_schedulerd.c b/daemons/controld/controld_schedulerd.c index 88f7ac14899..bb085c45255 100644 --- a/daemons/controld/controld_schedulerd.c +++ b/daemons/controld/controld_schedulerd.c @@ -64,14 +64,18 @@ save_cib_contents(xmlNode *msg, int call_id, int rc, xmlNode *output, CRM_CHECK(id != NULL, return); if (rc == pcmk_ok) { - char *filename = crm_strdup_printf(PCMK_SCHEDULER_INPUT_DIR "/pe-core-%s.bz2", id); + char *filename = pcmk__assert_asprintf(PCMK_SCHEDULER_INPUT_DIR + "/pe-core-%s.bz2", + id); if (pcmk__xml_write_file(output, filename, true) != pcmk_rc_ok) { - crm_err("Could not save Cluster Information Base to %s after scheduler crash", - filename); + pcmk__err("Could not save Cluster Information Base to %s after " + "scheduler crash", + filename); } else { - crm_notice("Saved Cluster Information Base to %s after scheduler crash", - filename); + pcmk__notice("Saved Cluster Information Base to %s after scheduler " + "crash", + filename); } free(filename); } @@ -87,13 +91,14 @@ handle_disconnect(void) // If we aren't connected to the scheduler, we can't expect a reply controld_expect_sched_reply(NULL); - if (pcmk_is_set(controld_globals.fsa_input_register, R_PE_REQUIRED)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_PE_REQUIRED)) { int rc = pcmk_ok; - char *uuid_str = crm_generate_uuid(); + char *uuid_str = pcmk__generate_uuid(); - crm_crit("Lost connection to the scheduler " - QB_XS " CIB will be saved to " PCMK_SCHEDULER_INPUT_DIR "/pe-core-%s.bz2", - uuid_str); + pcmk__crit("Lost connection to the scheduler " + QB_XS " CIB will be saved to " + PCMK_SCHEDULER_INPUT_DIR "/pe-core-%s.bz2", + uuid_str); /* * The scheduler died... @@ -127,7 +132,7 @@ handle_reply(pcmk_schedulerd_api_reply_t *reply) msg_ref = reply->data.graph.reference; if (msg_ref == NULL) { - crm_err("%s - Ignoring calculation with no reference", CRM_OP_PECALC); + pcmk__err(CRM_OP_PECALC " - Ignoring calculation with no reference"); } else if (pcmk__str_eq(msg_ref, controld_globals.fsa_pe_ref, pcmk__str_none)) { @@ -145,9 +150,9 @@ handle_reply(pcmk_schedulerd_api_reply_t *reply) * The name of the top level element here is irrelevant. Nothing checks it. */ fsa_input.msg = pcmk__xe_create(NULL, "dummy-reply"); - crm_xml_add(fsa_input.msg, PCMK_XA_REFERENCE, msg_ref); - crm_xml_add(fsa_input.msg, PCMK__XA_CRM_TGRAPH_IN, - reply->data.graph.input); + pcmk__xe_set(fsa_input.msg, PCMK_XA_REFERENCE, msg_ref); + pcmk__xe_set(fsa_input.msg, PCMK__XA_CRM_TGRAPH_IN, + reply->data.graph.input); crm_data_node = pcmk__xe_create(fsa_input.msg, PCMK__XE_CRM_XML); pcmk__xml_copy(crm_data_node, reply->data.graph.tgraph); @@ -156,7 +161,7 @@ handle_reply(pcmk_schedulerd_api_reply_t *reply) pcmk__xml_free(fsa_input.msg); } else { - crm_info("%s calculation %s is obsolete", CRM_OP_PECALC, msg_ref); + pcmk__info("%s calculation %s is obsolete", CRM_OP_PECALC, msg_ref); } } @@ -191,7 +196,7 @@ new_schedulerd_ipc_connection(void) rc = pcmk_new_ipc_api(&schedulerd_api, pcmk_ipc_schedulerd); if (rc != pcmk_rc_ok) { - crm_err("Error connecting to the scheduler: %s", pcmk_rc_str(rc)); + pcmk__err("Error connecting to the scheduler: %s", pcmk_rc_str(rc)); return false; } } @@ -200,8 +205,8 @@ new_schedulerd_ipc_connection(void) rc = pcmk__connect_ipc(schedulerd_api, pcmk_ipc_dispatch_main, 3); if (rc != pcmk_rc_ok) { - crm_err("Error connecting to %s: %s", - pcmk_ipc_name(schedulerd_api, true), pcmk_rc_str(rc)); + pcmk__err("Error connecting to %s: %s", + pcmk_ipc_name(schedulerd_api, true), pcmk_rc_str(rc)); return false; } @@ -219,19 +224,20 @@ do_pe_control(long long action, enum crmd_fsa_state cur_state, enum crmd_fsa_input current_input, fsa_data_t * msg_data) { - if (pcmk_is_set(action, A_PE_STOP)) { + if (pcmk__is_set(action, A_PE_STOP)) { controld_clear_fsa_input_flags(R_PE_REQUIRED); pcmk_disconnect_ipc(schedulerd_api); handle_disconnect(); } - if (pcmk_is_set(action, A_PE_START) - && !pcmk_is_set(controld_globals.fsa_input_register, R_PE_CONNECTED)) { + if (pcmk__is_set(action, A_PE_START) + && !pcmk__is_set(controld_globals.fsa_input_register, R_PE_CONNECTED)) { if (cur_state == S_STOPPING) { - crm_info("Ignoring request to connect to scheduler while shutting down"); + pcmk__info("Ignoring request to connect to scheduler while " + "shutting down"); } else if (!new_schedulerd_ipc_connection()) { - crm_warn("Could not connect to scheduler"); + pcmk__warn("Could not connect to scheduler"); register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL); } } @@ -274,8 +280,8 @@ controld_stop_sched_timer(void) { if ((controld_sched_timer != NULL) && (controld_globals.fsa_pe_ref != NULL)) { - crm_trace("Stopping timer for scheduler reply %s", - controld_globals.fsa_pe_ref); + pcmk__trace("Stopping timer for scheduler reply %s", + controld_globals.fsa_pe_ref); } mainloop_timer_stop(controld_sched_timer); } @@ -329,18 +335,18 @@ do_pe_invoke(long long action, cib_t *cib_conn = controld_globals.cib_conn; if (AM_I_DC == FALSE) { - crm_err("Not invoking scheduler because not DC: %s", - fsa_action2string(action)); + pcmk__err("Not invoking scheduler because not DC: %s", + fsa_action2string(action)); return; } - if (!pcmk_is_set(controld_globals.fsa_input_register, R_PE_CONNECTED)) { - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { - crm_err("Cannot shut down gracefully without the scheduler"); + if (!pcmk__is_set(controld_globals.fsa_input_register, R_PE_CONNECTED)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + pcmk__err("Cannot shut down gracefully without the scheduler"); register_fsa_input_before(C_FSA_INTERNAL, I_TERMINATE, NULL); } else { - crm_info("Waiting for the scheduler to connect"); + pcmk__info("Waiting for the scheduler to connect"); crmd_fsa_stall(FALSE); controld_set_fsa_action_flags(A_PE_START); controld_trigger_fsa(); @@ -349,12 +355,13 @@ do_pe_invoke(long long action, } if (cur_state != S_POLICY_ENGINE) { - crm_notice("Not invoking scheduler because in state %s", - fsa_state2string(cur_state)); + pcmk__notice("Not invoking scheduler because in state %s", + fsa_state2string(cur_state)); return; } - if (!pcmk_is_set(controld_globals.fsa_input_register, R_HAVE_CIB)) { - crm_err("Attempted to invoke scheduler without consistent Cluster Information Base!"); + if (!pcmk__is_set(controld_globals.fsa_input_register, R_HAVE_CIB)) { + pcmk__err("Attempted to invoke scheduler without consistent Cluster " + "Information Base!"); /* start the join from scratch */ register_fsa_input_before(C_FSA_INTERNAL, I_ELECTION, NULL); @@ -363,8 +370,8 @@ do_pe_invoke(long long action, fsa_pe_query = cib_conn->cmds->query(cib_conn, NULL, NULL, cib_none); - crm_debug("Query %d: Requesting the current CIB: %s", fsa_pe_query, - fsa_state2string(controld_globals.fsa_state)); + pcmk__debug("Query %d: Requesting the current CIB: %s", fsa_pe_query, + fsa_state2string(controld_globals.fsa_state)); controld_expect_sched_reply(NULL); fsa_register_cib_callback(fsa_pe_query, NULL, do_pe_invoke_callback); @@ -381,13 +388,14 @@ force_local_option(xmlNode *xml, const char *attr_name, const char *attr_value) xpath_base = pcmk_cib_xpath_for(PCMK_XE_CRM_CONFIG); if (xpath_base == NULL) { - crm_err(PCMK_XE_CRM_CONFIG " CIB element not known (bug?)"); + pcmk__err(PCMK_XE_CRM_CONFIG " CIB element not known (bug?)"); return; } - xpath_string = crm_strdup_printf("%s//%s//nvpair[@name='%s']", - xpath_base, PCMK_XE_CLUSTER_PROPERTY_SET, - attr_name); + xpath_string = pcmk__assert_asprintf("%s//%s//nvpair[@name='%s']", + xpath_base, + PCMK_XE_CLUSTER_PROPERTY_SET, + attr_name); xpathObj = pcmk__xpath_search(xml->doc, xpath_string); max = pcmk__xpath_num_results(xpathObj); free(xpath_string); @@ -398,9 +406,9 @@ force_local_option(xmlNode *xml, const char *attr_name, const char *attr_value) if (match == NULL) { continue; } - crm_trace("Forcing %s/%s = %s", - pcmk__xe_id(match), attr_name, attr_value); - crm_xml_add(match, PCMK_XA_VALUE, attr_value); + pcmk__trace("Forcing %s/%s = %s", pcmk__xe_id(match), attr_name, + attr_value); + pcmk__xe_set(match, PCMK_XA_VALUE, attr_value); } if(max == 0) { @@ -408,9 +416,9 @@ force_local_option(xmlNode *xml, const char *attr_name, const char *attr_value) xmlNode *crm_config = NULL; xmlNode *cluster_property_set = NULL; - crm_trace("Creating %s-%s for %s=%s", - PCMK_VALUE_CIB_BOOTSTRAP_OPTIONS, attr_name, attr_name, - attr_value); + pcmk__trace("Creating " PCMK_VALUE_CIB_BOOTSTRAP_OPTIONS "-%s for " + "%s=%s", + attr_name, attr_name, attr_value); configuration = pcmk__xe_first_child(xml, PCMK_XE_CONFIGURATION, NULL, NULL); @@ -430,16 +438,16 @@ force_local_option(xmlNode *xml, const char *attr_name, const char *attr_value) if (cluster_property_set == NULL) { cluster_property_set = pcmk__xe_create(crm_config, PCMK_XE_CLUSTER_PROPERTY_SET); - crm_xml_add(cluster_property_set, PCMK_XA_ID, - PCMK_VALUE_CIB_BOOTSTRAP_OPTIONS); + pcmk__xe_set(cluster_property_set, PCMK_XA_ID, + PCMK_VALUE_CIB_BOOTSTRAP_OPTIONS); } xml = pcmk__xe_create(cluster_property_set, PCMK_XE_NVPAIR); pcmk__xe_set_id(xml, "%s-%s", PCMK_VALUE_CIB_BOOTSTRAP_OPTIONS, attr_name); - crm_xml_add(xml, PCMK_XA_NAME, attr_name); - crm_xml_add(xml, PCMK_XA_VALUE, attr_value); + pcmk__xe_set(xml, PCMK_XA_NAME, attr_name); + pcmk__xe_set(xml, PCMK_XA_VALUE, attr_value); } xmlXPathFreeObject(xpathObj); } @@ -451,30 +459,33 @@ do_pe_invoke_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void pid_t watchdog = pcmk__locate_sbd(); if (rc != pcmk_ok) { - crm_err("Could not retrieve the Cluster Information Base: %s " - QB_XS " rc=%d call=%d", pcmk_strerror(rc), rc, call_id); + pcmk__err("Could not retrieve the Cluster Information Base: %s " + QB_XS " rc=%d call=%d", + pcmk_strerror(rc), rc, call_id); register_fsa_error_adv(C_FSA_INTERNAL, I_ERROR, NULL, NULL, __func__); return; } else if (call_id != fsa_pe_query) { - crm_trace("Skipping superseded CIB query: %d (current=%d)", call_id, fsa_pe_query); + pcmk__trace("Skipping superseded CIB query: %d (current=%d)", call_id, + fsa_pe_query); return; } else if (!AM_I_DC - || !pcmk_is_set(controld_globals.fsa_input_register, - R_PE_CONNECTED)) { - crm_debug("No need to invoke the scheduler anymore"); + || !pcmk__is_set(controld_globals.fsa_input_register, + R_PE_CONNECTED)) { + pcmk__debug("No need to invoke the scheduler anymore"); return; } else if (controld_globals.fsa_state != S_POLICY_ENGINE) { - crm_debug("Discarding scheduler request in state: %s", - fsa_state2string(controld_globals.fsa_state)); + pcmk__debug("Discarding scheduler request in state: %s", + fsa_state2string(controld_globals.fsa_state)); return; /* this callback counts as 1 */ } else if (num_cib_op_callbacks() > 1) { - crm_debug("Re-asking for the CIB: %d other peer updates still pending", - (num_cib_op_callbacks() - 1)); + pcmk__debug("Re-asking for the CIB: %d other peer updates still " + "pending", + (num_cib_op_callbacks() - 1)); sleep(1); controld_set_fsa_action_flags(A_PE_INVOKE); controld_trigger_fsa(); @@ -487,32 +498,33 @@ do_pe_invoke_callback(xmlNode * msg, int call_id, int rc, xmlNode * output, void * scheduler is invoked */ pcmk__refresh_node_caches_from_cib(output); - crm_xml_add(output, PCMK_XA_DC_UUID, controld_globals.our_uuid); + pcmk__xe_set(output, PCMK_XA_DC_UUID, controld_globals.our_uuid); pcmk__xe_set_bool_attr(output, PCMK_XA_HAVE_QUORUM, - pcmk_is_set(controld_globals.flags, - controld_has_quorum)); + pcmk__is_set(controld_globals.flags, + controld_has_quorum)); force_local_option(output, PCMK_OPT_HAVE_WATCHDOG, pcmk__btoa(watchdog)); - if (pcmk_is_set(controld_globals.flags, controld_ever_had_quorum) + if (pcmk__is_set(controld_globals.flags, controld_ever_had_quorum) && !pcmk__cluster_has_quorum()) { - crm_xml_add_int(output, PCMK_XA_NO_QUORUM_PANIC, 1); + pcmk__xe_set_int(output, PCMK_XA_NO_QUORUM_PANIC, 1); } rc = pcmk_schedulerd_api_graph(schedulerd_api, output, &ref); if (rc != pcmk_rc_ok) { free(ref); - crm_err("Could not contact the scheduler: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__err("Could not contact the scheduler: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); register_fsa_error_adv(C_FSA_INTERNAL, I_ERROR, NULL, NULL, __func__); } else { pcmk__assert(ref != NULL); controld_expect_sched_reply(ref); - crm_debug("Invoking the scheduler: query=%d, ref=%s, seq=%llu, " - "quorate=%s", - fsa_pe_query, controld_globals.fsa_pe_ref, - controld_globals.peer_seq, - pcmk__flag_text(controld_globals.flags, controld_has_quorum)); + pcmk__debug("Invoking the scheduler: query=%d, ref=%s, seq=%llu, " + "quorate=%s", + fsa_pe_query, controld_globals.fsa_pe_ref, + controld_globals.peer_seq, + pcmk__flag_text(controld_globals.flags, + controld_has_quorum)); } } diff --git a/daemons/controld/controld_te_actions.c b/daemons/controld/controld_te_actions.c index 1df83e82b08..8d9c9ae7bf6 100644 --- a/daemons/controld/controld_te_actions.c +++ b/daemons/controld/controld_te_actions.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,7 @@ #include #include #include // lrmd_event_data_t, lrmd_free_event() +#include // crm_meta_value() #include #include @@ -43,7 +44,7 @@ te_start_action_timer(const pcmk__graph_t *graph, pcmk__graph_action_t *action) static int execute_pseudo_action(pcmk__graph_t *graph, pcmk__graph_action_t *pseudo) { - const char *task = crm_element_value(pseudo->xml, PCMK_XA_OPERATION); + const char *task = pcmk__xe_get(pseudo->xml, PCMK_XA_OPERATION); /* send to peers as well? */ if (pcmk__str_eq(task, PCMK_ACTION_MAINTENANCE_NODES, pcmk__str_casei)) { @@ -71,8 +72,8 @@ execute_pseudo_action(pcmk__graph_t *graph, pcmk__graph_action_t *pseudo) remote_ra_process_pseudo(pseudo->xml); } - crm_debug("Pseudo-action %d (%s) fired and confirmed", pseudo->id, - crm_element_value(pseudo->xml, PCMK__XA_OPERATION_KEY)); + pcmk__debug("Pseudo-action %d (%s) fired and confirmed", pseudo->id, + pcmk__xe_get(pseudo->xml, PCMK__XA_OPERATION_KEY)); te_action_confirmed(pseudo, graph); return pcmk_rc_ok; } @@ -117,17 +118,17 @@ execute_cluster_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) id = pcmk__xe_id(action->xml); CRM_CHECK(!pcmk__str_empty(id), return EPROTO); - task = crm_element_value(action->xml, PCMK_XA_OPERATION); + task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); CRM_CHECK(!pcmk__str_empty(task), return EPROTO); - on_node = crm_element_value(action->xml, PCMK__META_ON_NODE); + on_node = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); CRM_CHECK(!pcmk__str_empty(on_node), return pcmk_rc_node_unknown); - router_node = crm_element_value(action->xml, PCMK__XA_ROUTER_NODE); + router_node = pcmk__xe_get(action->xml, PCMK__XA_ROUTER_NODE); if (router_node == NULL) { router_node = on_node; if (pcmk__str_eq(task, PCMK_ACTION_LRM_DELETE, pcmk__str_none)) { - const char *mode = crm_element_value(action->xml, PCMK__XA_MODE); + const char *mode = pcmk__xe_get(action->xml, PCMK__XA_MODE); if (pcmk__str_eq(mode, PCMK__VALUE_CIB, pcmk__str_none)) { router_node = controld_globals.cluster->priv->node_name; @@ -140,18 +141,18 @@ execute_cluster_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) } value = crm_meta_value(action->params, PCMK__META_OP_NO_WAIT); - if (crm_is_true(value)) { + if (pcmk__is_true(value)) { no_wait = TRUE; } - crm_info("Handling controller request '%s' (%s on %s)%s%s", - id, task, on_node, (is_local? " locally" : ""), - (no_wait? " without waiting" : "")); + pcmk__info("Handling controller request '%s' (%s on %s)%s%s", id, task, + on_node, (is_local? " locally" : ""), + (no_wait? " without waiting" : "")); if (is_local && pcmk__str_eq(task, PCMK_ACTION_DO_SHUTDOWN, pcmk__str_none)) { /* defer until everything else completes */ - crm_info("Controller request '%s' is a local shutdown", id); + pcmk__info("Controller request '%s' is a local shutdown", id); graph->completion_action = pcmk__graph_shutdown; graph->abort_reason = "local shutdown"; te_action_confirmed(action, graph); @@ -171,7 +172,7 @@ execute_cluster_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) counter = pcmk__transition_key(controld_globals.transition_graph->id, action->id, get_target_rc(action), controld_globals.te_uuid); - crm_xml_add(cmd, PCMK__XA_TRANSITION_KEY, counter); + pcmk__xe_set(cmd, PCMK__XA_TRANSITION_KEY, counter); node = pcmk__get_node(0, router_node, NULL, pcmk__node_search_cluster_member); @@ -180,7 +181,7 @@ execute_cluster_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) pcmk__xml_free(cmd); if (rc == FALSE) { - crm_err("Action %d failed: send", action->id); + pcmk__err("Action %d failed: send", action->id); return ECOMM; } else if (no_wait) { @@ -188,8 +189,10 @@ execute_cluster_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) } else { if (action->timeout <= 0) { - crm_err("Action %d: %s on %s had an invalid timeout (%dms). Using %ums instead", - action->id, task, on_node, action->timeout, graph->network_delay); + pcmk__err("Action %d: %s on %s had an invalid timeout (%dms). " + "Using %ums instead", + action->id, task, on_node, action->timeout, + graph->network_delay); action->timeout = (int) graph->network_delay; } te_start_action_timer(graph, action); @@ -218,7 +221,7 @@ static lrmd_event_data_t * synthesize_timeout_event(const pcmk__graph_action_t *action, int target_rc) { lrmd_event_data_t *op = NULL; - const char *target = crm_element_value(action->xml, PCMK__META_ON_NODE); + const char *target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); const char *reason = NULL; char *dynamic_reason = NULL; @@ -228,12 +231,13 @@ synthesize_timeout_event(const pcmk__graph_action_t *action, int target_rc) } else { const char *router_node = NULL; - router_node = crm_element_value(action->xml, PCMK__XA_ROUTER_NODE); + router_node = pcmk__xe_get(action->xml, PCMK__XA_ROUTER_NODE); if (router_node == NULL) { router_node = target; } - dynamic_reason = crm_strdup_printf("Controller on %s did not return " - "result in time", router_node); + dynamic_reason = pcmk__assert_asprintf("Controller on %s did not " + "return result in time", + router_node); reason = dynamic_reason; } @@ -260,11 +264,10 @@ controld_record_action_event(pcmk__graph_action_t *action, int rc = pcmk_ok; const char *rsc_id = NULL; - const char *target = crm_element_value(action->xml, PCMK__META_ON_NODE); - const char *task_uuid = crm_element_value(action->xml, - PCMK__XA_OPERATION_KEY); - const char *target_uuid = crm_element_value(action->xml, - PCMK__META_ON_NODE_UUID); + const char *target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); + const char *task_uuid = pcmk__xe_get(action->xml, PCMK__XA_OPERATION_KEY); + const char *target_uuid = pcmk__xe_get(action->xml, + PCMK__META_ON_NODE_UUID); int target_rc = get_target_rc(action); @@ -276,7 +279,7 @@ controld_record_action_event(pcmk__graph_action_t *action, rsc_id = pcmk__xe_id(action_rsc); CRM_CHECK(rsc_id != NULL, - crm_log_xml_err(action->xml, "Bad:action"); return); + pcmk__log_xml_err(action->xml, "Bad:action"); return); /* update the CIB @@ -289,20 +292,20 @@ controld_record_action_event(pcmk__graph_action_t *action, state = pcmk__xe_create(NULL, PCMK__XE_NODE_STATE); - crm_xml_add(state, PCMK_XA_ID, target_uuid); - crm_xml_add(state, PCMK_XA_UNAME, target); + pcmk__xe_set(state, PCMK_XA_ID, target_uuid); + pcmk__xe_set(state, PCMK_XA_UNAME, target); rsc = pcmk__xe_create(state, PCMK__XE_LRM); - crm_xml_add(rsc, PCMK_XA_ID, target_uuid); + pcmk__xe_set(rsc, PCMK_XA_ID, target_uuid); rsc = pcmk__xe_create(rsc, PCMK__XE_LRM_RESOURCES); rsc = pcmk__xe_create(rsc, PCMK__XE_LRM_RESOURCE); - crm_xml_add(rsc, PCMK_XA_ID, rsc_id); + pcmk__xe_set(rsc, PCMK_XA_ID, rsc_id); - - crm_copy_xml_element(action_rsc, rsc, PCMK_XA_TYPE); - crm_copy_xml_element(action_rsc, rsc, PCMK_XA_CLASS); - crm_copy_xml_element(action_rsc, rsc, PCMK_XA_PROVIDER); + pcmk__xe_set(rsc, PCMK_XA_TYPE, pcmk__xe_get(action_rsc, PCMK_XA_TYPE)); + pcmk__xe_set(rsc, PCMK_XA_CLASS, pcmk__xe_get(action_rsc, PCMK_XA_CLASS)); + pcmk__xe_set(rsc, PCMK_XA_PROVIDER, + pcmk__xe_get(action_rsc, PCMK_XA_PROVIDER)); pcmk__create_history_xml(rsc, op, CRM_FEATURE_SET, target_rc, target, __func__); @@ -311,8 +314,9 @@ controld_record_action_event(pcmk__graph_action_t *action, fsa_register_cib_callback(rc, NULL, cib_action_updated); pcmk__xml_free(state); - crm_trace("Sent CIB update (call ID %d) for synthesized event of action %d (%s on %s)", - rc, action->id, task_uuid, target); + pcmk__trace("Sent CIB update (call ID %d) for synthesized event of action " + "%d (%s on %s)", + rc, action->id, task_uuid, target); pcmk__set_graph_action_flags(action, pcmk__graph_action_sent_update); } @@ -321,14 +325,13 @@ controld_record_action_timeout(pcmk__graph_action_t *action) { lrmd_event_data_t *op = NULL; - const char *target = crm_element_value(action->xml, PCMK__META_ON_NODE); - const char *task_uuid = crm_element_value(action->xml, - PCMK__XA_OPERATION_KEY); + const char *target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); + const char *task_uuid = pcmk__xe_get(action->xml, PCMK__XA_OPERATION_KEY); int target_rc = get_target_rc(action); - crm_warn("%s %d: %s on %s timed out", - action->xml->name, action->id, task_uuid, target); + pcmk__warn("%s %d: %s on %s timed out", action->xml->name, action->id, + task_uuid, target); op = synthesize_timeout_event(action, target_rc); controld_record_action_event(action, op); @@ -370,14 +373,14 @@ execute_rsc_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) pcmk__assert((action != NULL) && (action->xml != NULL)); pcmk__clear_graph_action_flags(action, pcmk__graph_action_executed); - on_node = crm_element_value(action->xml, PCMK__META_ON_NODE); + on_node = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); CRM_CHECK(!pcmk__str_empty(on_node), return pcmk_rc_node_unknown); rsc_op = action->xml; - task = crm_element_value(rsc_op, PCMK_XA_OPERATION); - task_uuid = crm_element_value(action->xml, PCMK__XA_OPERATION_KEY); - router_node = crm_element_value(rsc_op, PCMK__XA_ROUTER_NODE); + task = pcmk__xe_get(rsc_op, PCMK_XA_OPERATION); + task_uuid = pcmk__xe_get(action->xml, PCMK__XA_OPERATION_KEY); + router_node = pcmk__xe_get(rsc_op, PCMK__XA_ROUTER_NODE); if (!router_node) { router_node = on_node; @@ -386,14 +389,14 @@ execute_rsc_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) counter = pcmk__transition_key(controld_globals.transition_graph->id, action->id, get_target_rc(action), controld_globals.te_uuid); - crm_xml_add(rsc_op, PCMK__XA_TRANSITION_KEY, counter); + pcmk__xe_set(rsc_op, PCMK__XA_TRANSITION_KEY, counter); if (controld_is_local_node(router_node)) { is_local = TRUE; } value = crm_meta_value(action->params, PCMK__META_OP_NO_WAIT); - if (crm_is_true(value)) { + if (pcmk__is_true(value)) { no_wait = TRUE; } @@ -425,10 +428,10 @@ execute_rsc_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) pcmk__get_node(0, router_node, NULL, pcmk__node_search_cluster_member); - crm_notice("Asking %s to execute %s on %s%s " - QB_XS " transition %s action %d", - router_node, task_uuid, on_node, - (no_wait? " without waiting" : ""), counter, action->id); + pcmk__notice("Asking %s to execute %s on %s%s " + QB_XS " transition %s action %d", + router_node, task_uuid, on_node, + (no_wait? " without waiting" : ""), counter, action->id); rc = pcmk__cluster_send_message(node, pcmk_ipc_execd, cmd); } @@ -438,25 +441,28 @@ execute_rsc_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) pcmk__set_graph_action_flags(action, pcmk__graph_action_executed); if (rc == FALSE) { - crm_err("Action %d failed: send", action->id); + pcmk__err("Action %d failed: send", action->id); return ECOMM; } else if (no_wait) { /* Just mark confirmed. Don't bump the job count only to immediately * decrement it. */ - crm_info("Action %d confirmed - no wait", action->id); + pcmk__info("Action %d confirmed - no wait", action->id); pcmk__set_graph_action_flags(action, pcmk__graph_action_confirmed); pcmk__update_graph(controld_globals.transition_graph, action); trigger_graph(); - } else if (pcmk_is_set(action->flags, pcmk__graph_action_confirmed)) { - crm_debug("Action %d: %s %s on %s(timeout %dms) was already confirmed.", - action->id, task, task_uuid, on_node, action->timeout); + } else if (pcmk__is_set(action->flags, pcmk__graph_action_confirmed)) { + pcmk__debug("Action %d: %s %s on %s (timeout %dms) was already " + "confirmed", + action->id, task, task_uuid, on_node, action->timeout); } else { if (action->timeout <= 0) { - crm_err("Action %d: %s %s on %s had an invalid timeout (%dms). Using %ums instead", - action->id, task, task_uuid, on_node, action->timeout, graph->network_delay); + pcmk__err("Action %d: %s %s on %s had an invalid timeout (%dms). " + "Using %ums instead", + action->id, task, task_uuid, on_node, action->timeout, + graph->network_delay); action->timeout = (int) graph->network_delay; } te_update_job_count(action, 1); @@ -517,14 +523,14 @@ te_update_job_count_on(const char *target, int offset, bool migrate) if(migrate) { r->migrate_jobs += offset; } - crm_trace("jobs[%s] = %d", target, r->jobs); + pcmk__trace("jobs[%s] = %d", target, r->jobs); } static void te_update_job_count(pcmk__graph_action_t *action, int offset) { - const char *task = crm_element_value(action->xml, PCMK_XA_OPERATION); - const char *target = crm_element_value(action->xml, PCMK__META_ON_NODE); + const char *task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); + const char *target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); if ((action->type != pcmk__rsc_graph_action) || (target == NULL)) { /* No limit on these */ @@ -535,7 +541,7 @@ te_update_job_count(pcmk__graph_action_t *action, int offset) * on a remote node. For now, we count all actions occurring on a * remote node against the job list on the cluster node hosting * the connection resources */ - target = crm_element_value(action->xml, PCMK__XA_ROUTER_NODE); + target = pcmk__xe_get(action->xml, PCMK__XA_ROUTER_NODE); if ((target == NULL) && pcmk__strcase_any_of(task, PCMK_ACTION_MIGRATE_TO, @@ -550,7 +556,7 @@ te_update_job_count(pcmk__graph_action_t *action, int offset) te_update_job_count_on(t2, offset, TRUE); return; } else if (target == NULL) { - target = crm_element_value(action->xml, PCMK__META_ON_NODE); + target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); } te_update_job_count_on(target, offset, FALSE); @@ -572,8 +578,8 @@ allowed_on_node(const pcmk__graph_t *graph, const pcmk__graph_action_t *action, { int limit = 0; struct te_peer_s *r = NULL; - const char *task = crm_element_value(action->xml, PCMK_XA_OPERATION); - const char *id = crm_element_value(action->xml, PCMK__XA_OPERATION_KEY); + const char *task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); + const char *id = pcmk__xe_get(action->xml, PCMK__XA_OPERATION_KEY); if(target == NULL) { /* No limit on these */ @@ -593,20 +599,23 @@ allowed_on_node(const pcmk__graph_t *graph, const pcmk__graph_action_t *action, } if(limit <= r->jobs) { - crm_trace("Peer %s is over their job limit of %d (%d): deferring %s", - target, limit, r->jobs, id); + pcmk__trace("Peer %s is over their job limit of %d (%d): deferring %s", + target, limit, r->jobs, id); return false; } else if(graph->migration_limit > 0 && r->migrate_jobs >= graph->migration_limit) { if (pcmk__strcase_any_of(task, PCMK_ACTION_MIGRATE_TO, PCMK_ACTION_MIGRATE_FROM, NULL)) { - crm_trace("Peer %s is over their migration job limit of %d (%d): deferring %s", - target, graph->migration_limit, r->migrate_jobs, id); + pcmk__trace("Peer %s is over their migration job limit of %d (%d): " + "deferring %s", + target, graph->migration_limit, r->migrate_jobs, id); return false; } } - crm_trace("Peer %s has not hit their limit yet. current jobs = %d limit= %d limit", target, r->jobs, limit); + pcmk__trace("Peer %s has not hit their limit yet. current jobs = %d " + "limit= %d limit", + target, r->jobs, limit); return true; } @@ -624,7 +633,7 @@ static bool graph_action_allowed(pcmk__graph_t *graph, pcmk__graph_action_t *action) { const char *target = NULL; - const char *task = crm_element_value(action->xml, PCMK_XA_OPERATION); + const char *task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); if (action->type != pcmk__rsc_graph_action) { /* No limit on these */ @@ -635,7 +644,7 @@ graph_action_allowed(pcmk__graph_t *graph, pcmk__graph_action_t *action) * on a remote node. For now, we count all actions occurring on a * remote node against the job list on the cluster node hosting * the connection resources */ - target = crm_element_value(action->xml, PCMK__XA_ROUTER_NODE); + target = pcmk__xe_get(action->xml, PCMK__XA_ROUTER_NODE); if ((target == NULL) && pcmk__strcase_any_of(task, PCMK_ACTION_MIGRATE_TO, @@ -648,7 +657,7 @@ graph_action_allowed(pcmk__graph_t *graph, pcmk__graph_action_t *action) target = crm_meta_value(action->params, PCMK__META_MIGRATE_TARGET); } else if (target == NULL) { - target = crm_element_value(action->xml, PCMK__META_ON_NODE); + target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); } return allowed_on_node(graph, action, target); @@ -663,9 +672,9 @@ graph_action_allowed(pcmk__graph_t *graph, pcmk__graph_action_t *action) void te_action_confirmed(pcmk__graph_action_t *action, pcmk__graph_t *graph) { - if (!pcmk_is_set(action->flags, pcmk__graph_action_confirmed)) { + if (!pcmk__is_set(action->flags, pcmk__graph_action_confirmed)) { if ((action->type == pcmk__rsc_graph_action) - && (crm_element_value(action->xml, PCMK__META_ON_NODE) != NULL)) { + && (pcmk__xe_get(action->xml, PCMK__META_ON_NODE) != NULL)) { te_update_job_count(action, -1); } pcmk__set_graph_action_flags(action, pcmk__graph_action_confirmed); @@ -700,8 +709,8 @@ notify_crmd(pcmk__graph_t *graph) const char *type = "unknown"; enum crmd_fsa_input event = I_NULL; - crm_debug("Processing transition completion in state %s", - fsa_state2string(controld_globals.fsa_state)); + pcmk__debug("Processing transition completion in state %s", + fsa_state2string(controld_globals.fsa_state)); CRM_CHECK(graph->complete, graph->complete = true); @@ -737,17 +746,18 @@ notify_crmd(pcmk__graph_t *graph) case pcmk__graph_shutdown: type = "shutdown"; - if (pcmk_is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { + if (pcmk__is_set(controld_globals.fsa_input_register, R_SHUTDOWN)) { event = I_STOP; } else { - crm_err("We didn't ask to be shut down, yet the scheduler is telling us to"); + pcmk__err("We didn't ask to be shut down, yet the scheduler is " + "telling us to"); event = I_TERMINATE; } } - crm_debug("Transition %d status: %s - %s", graph->id, type, - pcmk__s(graph->abort_reason, "unspecified reason")); + pcmk__debug("Transition %d status: %s - %s", graph->id, type, + pcmk__s(graph->abort_reason, "unspecified reason")); graph->abort_reason = NULL; graph->completion_action = pcmk__graph_done; diff --git a/daemons/controld/controld_te_callbacks.c b/daemons/controld/controld_te_callbacks.c index b74da0ffb51..ae1c966cd9c 100644 --- a/daemons/controld/controld_te_callbacks.c +++ b/daemons/controld/controld_te_callbacks.c @@ -12,6 +12,7 @@ #include #include +#include // PCMK_SCORE_INFINITY #include #include @@ -25,8 +26,8 @@ shutdown_lock_cleared(xmlNode *lrm_resource) { time_t shutdown_lock = 0; - return (crm_element_value_epoch(lrm_resource, PCMK_OPT_SHUTDOWN_LOCK, - &shutdown_lock) == pcmk_ok) + return (pcmk__xe_get_time(lrm_resource, PCMK_OPT_SHUTDOWN_LOCK, + &shutdown_lock) == pcmk_rc_ok) && (shutdown_lock == 0); } @@ -76,7 +77,7 @@ process_resource_updates(const char *node, xmlNode *xml, xmlNode *change, if ((controld_globals.transition_graph->pending == 0) && (xml->children != NULL) && (xml->children->next != NULL)) { - crm_log_xml_trace(change, "lrm-refresh"); + pcmk__log_xml_trace(change, "lrm-refresh"); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, "History refresh", NULL); return; @@ -84,7 +85,7 @@ process_resource_updates(const char *node, xmlNode *xml, xmlNode *change, for (rsc = pcmk__xe_first_child(xml, NULL, NULL, NULL); rsc != NULL; rsc = pcmk__xe_next(rsc, NULL)) { - crm_trace("Processing %s", pcmk__xe_id(rsc)); + pcmk__trace("Processing %s", pcmk__xe_id(rsc)); process_lrm_resource_diff(rsc, node); } } @@ -130,7 +131,7 @@ abort_unless_down(const char *xpath, const char *op, xmlNode *change, node_uuid = extract_node_uuid(xpath); if(node_uuid == NULL) { - crm_err("Could not extract node ID from %s", xpath); + pcmk__err("Could not extract node ID from %s", xpath); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, reason, change); return; @@ -138,11 +139,11 @@ abort_unless_down(const char *xpath, const char *op, xmlNode *change, down = match_down_event(node_uuid); if (down == NULL) { - crm_trace("Not expecting %s to be down (%s)", node_uuid, xpath); + pcmk__trace("Not expecting %s to be down (%s)", node_uuid, xpath); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, reason, change); } else { - crm_trace("Expecting changes to %s (%s)", node_uuid, xpath); + pcmk__trace("Expecting changes to %s (%s)", node_uuid, xpath); } free(node_uuid); } @@ -161,8 +162,8 @@ process_op_deletion(const char *xpath, xmlNode *change) key = strrchr(mutable_key, '\''); } if (key == NULL) { - crm_warn("Ignoring malformed CIB update (resource deletion of %s)", - xpath); + pcmk__warn("Ignoring malformed CIB update (resource deletion of %s)", + xpath); free(mutable_key); return; } @@ -190,7 +191,7 @@ process_delete_diff(const char *xpath, const char *op, xmlNode *change) abort_unless_down(xpath, op, change, "Node state removal"); } else { - crm_trace("Ignoring delete of %s", xpath); + pcmk__trace("Ignoring delete of %s", xpath); } } @@ -236,17 +237,17 @@ te_update_diff_element(xmlNode *change, void *userdata) { xmlNode *match = NULL; const char *name = NULL; - const char *xpath = crm_element_value(change, PCMK_XA_PATH); + const char *xpath = pcmk__xe_get(change, PCMK_XA_PATH); // Possible ops: create, modify, delete, move - const char *op = crm_element_value(change, PCMK_XA_OPERATION); + const char *op = pcmk__xe_get(change, PCMK_XA_OPERATION); // Ignore uninteresting updates if (op == NULL) { return pcmk_rc_ok; } else if (xpath == NULL) { - crm_trace("Ignoring %s change for version field", op); + pcmk__trace("Ignoring %s change for version field", op); return pcmk_rc_ok; } else if ((strcmp(op, PCMK_VALUE_MOVE) == 0) @@ -256,7 +257,7 @@ te_update_diff_element(xmlNode *change, void *userdata) /* We still need to consider moves within the resources section, * since they affect placement order. */ - crm_trace("Ignoring move change at %s", xpath); + pcmk__trace("Ignoring move change at %s", xpath); return pcmk_rc_ok; } @@ -273,22 +274,22 @@ te_update_diff_element(xmlNode *change, void *userdata) } else if (!pcmk__str_any_of(op, PCMK_VALUE_DELETE, PCMK_VALUE_MOVE, NULL)) { - crm_warn("Ignoring malformed CIB update (%s operation on %s is unrecognized)", - op, xpath); + pcmk__warn("Ignoring malformed CIB update (%s operation on %s is " + "unrecognized)", + op, xpath); return pcmk_rc_ok; } if (match) { if (match->type == XML_COMMENT_NODE) { - crm_trace("Ignoring %s operation for comment at %s", op, xpath); + pcmk__trace("Ignoring %s operation for comment at %s", op, xpath); return pcmk_rc_ok; } name = (const char *)match->name; } - crm_trace("Handling %s operation for %s%s%s", - op, (xpath? xpath : "CIB"), - (name? " matched by " : ""), (name? name : "")); + pcmk__trace("Handling %s operation for %s%s%s", op, pcmk__s(xpath, "CIB"), + ((name != NULL)? " matched by " : ""), pcmk__s(name, "")); if (strstr(xpath, "/" PCMK_XE_CIB "/" PCMK_XE_CONFIGURATION)) { abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, @@ -311,8 +312,8 @@ te_update_diff_element(xmlNode *change, void *userdata) process_delete_diff(xpath, op, change); } else if (name == NULL) { - crm_warn("Ignoring malformed CIB update (%s at %s has no result)", - op, xpath); + pcmk__warn("Ignoring malformed CIB update (%s at %s has no result)", op, + xpath); } else if (strcmp(name, PCMK_XE_CIB) == 0) { process_cib_diff(match, change, op, xpath); @@ -346,8 +347,9 @@ te_update_diff_element(xmlNode *change, void *userdata) free(local_node); } else { - crm_warn("Ignoring malformed CIB update (%s at %s has unrecognized result %s)", - op, xpath, name); + pcmk__warn("Ignoring malformed CIB update (%s at %s has unrecognized " + "result %s)", + op, xpath, name); } return pcmk_rc_ok; @@ -365,44 +367,44 @@ te_update_diff(const char *event, xmlNode * msg) int p_del[] = { 0, 0, 0 }; CRM_CHECK(msg != NULL, return); - crm_element_value_int(msg, PCMK__XA_CIB_RC, &rc); + pcmk__xe_get_int(msg, PCMK__XA_CIB_RC, &rc); if (controld_globals.transition_graph == NULL) { - crm_trace("No graph"); + pcmk__trace("No graph"); return; } else if (rc < pcmk_ok) { - crm_trace("Filter rc=%d (%s)", rc, pcmk_strerror(rc)); + pcmk__trace("Filter rc=%d (%s)", rc, pcmk_strerror(rc)); return; } else if (controld_globals.transition_graph->complete && (controld_globals.fsa_state != S_IDLE) && (controld_globals.fsa_state != S_TRANSITION_ENGINE) && (controld_globals.fsa_state != S_POLICY_ENGINE)) { - crm_trace("Filter state=%s (complete)", - fsa_state2string(controld_globals.fsa_state)); + pcmk__trace("Filter state=%s (complete)", + fsa_state2string(controld_globals.fsa_state)); return; } - op = crm_element_value(msg, PCMK__XA_CIB_OP); + op = pcmk__xe_get(msg, PCMK__XA_CIB_OP); wrapper = pcmk__xe_first_child(msg, PCMK__XE_CIB_UPDATE_RESULT, NULL, NULL); diff = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); - xml_patch_versions(diff, p_add, p_del); - crm_debug("Processing (%s) diff: %d.%d.%d -> %d.%d.%d (%s)", op, - p_del[0], p_del[1], p_del[2], p_add[0], p_add[1], p_add[2], - fsa_state2string(controld_globals.fsa_state)); + pcmk__xml_patchset_versions(diff, p_del, p_add); + pcmk__debug("Processing (%s) diff: %d.%d.%d -> %d.%d.%d (%s)", op, + p_del[0], p_del[1], p_del[2], p_add[0], p_add[1], p_add[2], + fsa_state2string(controld_globals.fsa_state)); - crm_element_value_int(diff, PCMK_XA_FORMAT, &format); + pcmk__xe_get_int(diff, PCMK_XA_FORMAT, &format); if (format == 2) { - crm_log_xml_trace(diff, "patch"); + pcmk__log_xml_trace(diff, "patch"); pcmk__xe_foreach_child(diff, NULL, te_update_diff_element, NULL); } else { - crm_warn("Ignoring malformed CIB update (unknown patch format %d)", - format); + pcmk__warn("Ignoring malformed CIB update (unknown patch format %d)", + format); } controld_remove_all_outside_events(); } @@ -417,38 +419,41 @@ process_te_message(xmlNode * msg, xmlNode * xml_data) CRM_CHECK(msg != NULL, return); // Transition requests must specify transition engine as subsystem - value = crm_element_value(msg, PCMK__XA_CRM_SYS_TO); + value = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_TO); if (pcmk__str_empty(value) || !pcmk__str_eq(value, CRM_SYSTEM_TENGINE, pcmk__str_none)) { - crm_info("Received invalid transition request: subsystem '%s' not '" - CRM_SYSTEM_TENGINE "'", pcmk__s(value, "")); + pcmk__info("Received invalid transition request: subsystem '%s' not '" + CRM_SYSTEM_TENGINE "'", + pcmk__s(value, "")); return; } // Only the lrm_invoke command is supported as a transition request - value = crm_element_value(msg, PCMK__XA_CRM_TASK); + value = pcmk__xe_get(msg, PCMK__XA_CRM_TASK); if (!pcmk__str_eq(value, CRM_OP_INVOKE_LRM, pcmk__str_none)) { - crm_info("Received invalid transition request: command '%s' not '" - CRM_OP_INVOKE_LRM "'", pcmk__s(value, "")); + pcmk__info("Received invalid transition request: command '%s' not '" + CRM_OP_INVOKE_LRM "'", + pcmk__s(value, "")); return; } // Transition requests must be marked as coming from the executor - value = crm_element_value(msg, PCMK__XA_CRM_SYS_FROM); + value = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_FROM); if (!pcmk__str_eq(value, CRM_SYSTEM_LRMD, pcmk__str_none)) { - crm_info("Received invalid transition request: from '%s' not '" - CRM_SYSTEM_LRMD "'", pcmk__s(value, "")); + pcmk__info("Received invalid transition request: from '%s' not '" + CRM_SYSTEM_LRMD "'", + pcmk__s(value, "")); return; } - crm_debug("Processing transition request with ref='%s' origin='%s'", - pcmk__s(crm_element_value(msg, PCMK_XA_REFERENCE), ""), - pcmk__s(crm_element_value(msg, PCMK__XA_SRC), "")); + pcmk__debug("Processing transition request with ref='%s' origin='%s'", + pcmk__s(pcmk__xe_get(msg, PCMK_XA_REFERENCE), ""), + pcmk__s(pcmk__xe_get(msg, PCMK__XA_SRC), "")); xpathObj = pcmk__xpath_search(xml_data->doc, "//" PCMK__XE_LRM_RSC_OP); nmatches = pcmk__xpath_num_results(xpathObj); if (nmatches == 0) { - crm_err("Received transition request with no results (bug?)"); + pcmk__err("Received transition request with no results (bug?)"); } else { for (int lpc = 0; lpc < nmatches; lpc++) { xmlNode *rsc_op = pcmk__xpath_result(xpathObj, lpc); @@ -467,7 +472,7 @@ void cib_action_updated(xmlNode * msg, int call_id, int rc, xmlNode * output, void *user_data) { if (rc < pcmk_ok) { - crm_err("Update %d FAILED: %s", call_id, pcmk_strerror(rc)); + pcmk__err("Update %d FAILED: %s", call_id, pcmk_strerror(rc)); } } @@ -490,24 +495,24 @@ action_timer_callback(gpointer data) stop_te_timer(action); - task = crm_element_value(action->xml, PCMK_XA_OPERATION); - on_node = crm_element_value(action->xml, PCMK__META_ON_NODE); - via_node = crm_element_value(action->xml, PCMK__XA_ROUTER_NODE); + task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); + on_node = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); + via_node = pcmk__xe_get(action->xml, PCMK__XA_ROUTER_NODE); if (controld_globals.transition_graph->complete) { - crm_notice("Node %s did not send %s result (via %s) within %dms " - "(ignoring because transition not in progress)", - (on_node? on_node : ""), (task? task : "unknown action"), - (via_node? via_node : "controller"), action->timeout); + pcmk__notice("Node %s did not send %s result (via %s) within %dms " + "(ignoring because transition not in progress)", + pcmk__s(on_node, ""), pcmk__s(task, "unknown action"), + pcmk__s(via_node, "controller"), action->timeout); } else { /* fail the action */ - crm_err("Node %s did not send %s result (via %s) within %dms " - "(action timeout plus " PCMK_OPT_CLUSTER_DELAY ")", - (on_node? on_node : ""), (task? task : "unknown action"), - (via_node? via_node : "controller"), - (action->timeout - + controld_globals.transition_graph->network_delay)); + pcmk__err("Node %s did not send %s result (via %s) within %dms " + "(action timeout plus " PCMK_OPT_CLUSTER_DELAY ")", + pcmk__s(on_node, ""), pcmk__s(task, "unknown action"), + pcmk__s(via_node, "controller"), + (action->timeout + + controld_globals.transition_graph->network_delay)); pcmk__log_graph_action(LOG_ERR, action); pcmk__set_graph_action_flags(action, pcmk__graph_action_failed); diff --git a/daemons/controld/controld_te_events.c b/daemons/controld/controld_te_events.c index c5b8c604ee7..ad0e04d5a0f 100644 --- a/daemons/controld/controld_te_events.c +++ b/daemons/controld/controld_te_events.c @@ -15,6 +15,8 @@ #include #include +#include // crm_meta_value() +#include // PCMK_SCORE_INFINITY #include #include @@ -98,7 +100,8 @@ fail_incompletable_actions(pcmk__graph_t *graph, const char *down_node) for (; gIter != NULL; gIter = gIter->next) { pcmk__graph_synapse_t *synapse = (pcmk__graph_synapse_t *) gIter->data; - if (pcmk_any_flags_set(synapse->flags, pcmk__synapse_confirmed|pcmk__synapse_failed)) { + if (pcmk__any_flags_set(synapse->flags, + pcmk__synapse_confirmed|pcmk__synapse_failed)) { /* We've already been here */ continue; } @@ -108,20 +111,18 @@ fail_incompletable_actions(pcmk__graph_t *graph, const char *down_node) pcmk__graph_action_t *action = (pcmk__graph_action_t *) gIter2->data; if ((action->type == pcmk__pseudo_graph_action) - || pcmk_is_set(action->flags, pcmk__graph_action_confirmed)) { + || pcmk__is_set(action->flags, pcmk__graph_action_confirmed)) { continue; } else if (action->type == pcmk__cluster_graph_action) { - const char *task = crm_element_value(action->xml, - PCMK_XA_OPERATION); + const char *task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); if (pcmk__str_eq(task, PCMK_ACTION_STONITH, pcmk__str_casei)) { continue; } } - target_uuid = crm_element_value(action->xml, - PCMK__META_ON_NODE_UUID); - router = crm_element_value(action->xml, PCMK__XA_ROUTER_NODE); + target_uuid = pcmk__xe_get(action->xml, PCMK__META_ON_NODE_UUID); + router = pcmk__xe_get(action->xml, PCMK__XA_ROUTER_NODE); if (router) { const pcmk__node_status_t *node = pcmk__get_node(0, router, NULL, @@ -139,24 +140,25 @@ fail_incompletable_actions(pcmk__graph_t *graph, const char *down_node) stop_te_timer(action); pcmk__update_graph(graph, action); - if (pcmk_is_set(synapse->flags, pcmk__synapse_executed)) { - crm_notice("Action %d (%s) was pending on %s (offline)", + if (pcmk__is_set(synapse->flags, pcmk__synapse_executed)) { + pcmk__notice("Action %d (%s) was pending on %s (offline)", + action->id, + pcmk__xe_get(action->xml, + PCMK__XA_OPERATION_KEY), + down_node); + } else { + pcmk__info("Action %d (%s) is scheduled for %s (offline)", action->id, - crm_element_value(action->xml, - PCMK__XA_OPERATION_KEY), + pcmk__xe_get(action->xml, PCMK__XA_OPERATION_KEY), down_node); - } else { - crm_info("Action %d (%s) is scheduled for %s (offline)", - action->id, - crm_element_value(action->xml, PCMK__XA_OPERATION_KEY), - down_node); } } } } if (last_action != NULL) { - crm_info("Node %s shutdown resulted in un-runnable actions", down_node); + pcmk__info("Node %s shutdown resulted in un-runnable actions", + down_node); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, "Node failure", last_action); return TRUE; @@ -188,23 +190,24 @@ update_failcount(const xmlNode *event, const char *event_node_uuid, int rc, char *rsc_id = NULL; const char *value = NULL; - const char *id = crm_element_value(event, PCMK__XA_OPERATION_KEY); + const char *id = pcmk__xe_get(event, PCMK__XA_OPERATION_KEY); const char *on_uname = pcmk__node_name_from_uuid(event_node_uuid); - const char *origin = crm_element_value(event, PCMK_XA_CRM_DEBUG_ORIGIN); + const char *origin = pcmk__xe_get(event, PCMK_XA_CRM_DEBUG_ORIGIN); // Nothing needs to be done for success or status refresh if (rc == target_rc) { return FALSE; } else if (pcmk__str_eq(origin, "build_active_RAs", pcmk__str_casei)) { - crm_debug("No update for %s (rc=%d) on %s: Old failure from lrm status refresh", - id, rc, on_uname); + pcmk__debug("No update for %s (rc=%d) on %s: Old failure from lrm " + "status refresh", + id, rc, on_uname); return FALSE; } /* Sanity check */ CRM_CHECK(on_uname != NULL, return TRUE); CRM_CHECK(parse_op_key(id, &rsc_id, &task, &interval_ms), - crm_err("Couldn't parse: %s", pcmk__xe_id(event)); goto bail); + pcmk__err("Couldn't parse: %s", pcmk__xe_id(event)); goto bail); /* Decide whether update is necessary and what value to use */ if ((interval_ms > 0) @@ -243,9 +246,10 @@ update_failcount(const xmlNode *event, const char *event_node_uuid, int rc, opts |= pcmk__node_attr_remote; } - crm_info("Updating %s for %s on %s after failed %s: rc=%d (update=%s, time=%s)", - (ignore_failures? "last failure" : "failcount"), - rsc_id, on_uname, task, rc, value, now); + pcmk__info("Updating %s for %s on %s after failed %s: rc=%d " + "(update=%s, time=%s)", + (ignore_failures? "last failure" : "failcount"), + rsc_id, on_uname, task, rc, value, now); /* Update the fail count, if we're not ignoring failures */ if (!ignore_failures) { @@ -323,23 +327,23 @@ get_cancel_action(const char *id, const char *node) const char *target = NULL; pcmk__graph_action_t *action = (pcmk__graph_action_t *) gIter2->data; - task = crm_element_value(action->xml, PCMK_XA_OPERATION); + task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); if (!pcmk__str_eq(PCMK_ACTION_CANCEL, task, pcmk__str_casei)) { continue; } - task = crm_element_value(action->xml, PCMK__XA_OPERATION_KEY); + task = pcmk__xe_get(action->xml, PCMK__XA_OPERATION_KEY); if (!pcmk__str_eq(task, id, pcmk__str_casei)) { continue; } - target = crm_element_value(action->xml, PCMK__META_ON_NODE_UUID); + target = pcmk__xe_get(action->xml, PCMK__META_ON_NODE_UUID); if (node && !pcmk__str_eq(target, node, pcmk__str_casei)) { - crm_trace("Wrong node %s for %s on %s", target, id, node); + pcmk__trace("Wrong node %s for %s on %s", target, id, node); continue; } - crm_trace("Found %s on %s", id, node); + pcmk__trace("Found %s on %s", id, node); return action; } } @@ -357,14 +361,14 @@ confirm_cancel_action(const char *id, const char *node_id) if (cancel == NULL) { return FALSE; } - op_key = crm_element_value(cancel->xml, PCMK__XA_OPERATION_KEY); - node_name = crm_element_value(cancel->xml, PCMK__META_ON_NODE); + op_key = pcmk__xe_get(cancel->xml, PCMK__XA_OPERATION_KEY); + node_name = pcmk__xe_get(cancel->xml, PCMK__META_ON_NODE); stop_te_timer(cancel); te_action_confirmed(cancel, controld_globals.transition_graph); - crm_info("Cancellation of %s on %s confirmed (action %d)", - op_key, node_name, cancel->id); + pcmk__info("Cancellation of %s on %s confirmed (action %d)", op_key, + node_name, cancel->id); return TRUE; } @@ -386,7 +390,7 @@ match_down_event(const char *target) xmlXPathObject *xpath_ret = NULL; GList *gIter, *gIter2; - char *xpath = crm_strdup_printf(XPATH_DOWNED, target); + char *xpath = pcmk__assert_asprintf(XPATH_DOWNED, target); for (gIter = controld_globals.transition_graph->synapses; gIter != NULL && match == NULL; @@ -397,7 +401,7 @@ match_down_event(const char *target) gIter2 = gIter2->next) { match = (pcmk__graph_action_t *) gIter2->data; - if (pcmk_is_set(match->flags, pcmk__graph_action_executed)) { + if (pcmk__is_set(match->flags, pcmk__graph_action_executed)) { xpath_ret = pcmk__xpath_search(match->xml->doc, xpath); if (pcmk__xpath_num_results(xpath_ret) == 0) { match = NULL; @@ -413,11 +417,10 @@ match_down_event(const char *target) free(xpath); if (match != NULL) { - crm_debug("Shutdown action %d (%s) found for node %s", match->id, - crm_element_value(match->xml, PCMK__XA_OPERATION_KEY), - target); + pcmk__debug("Shutdown action %d (%s) found for node %s", match->id, + pcmk__xe_get(match->xml, PCMK__XA_OPERATION_KEY), target); } else { - crm_debug("No reason to expect node %s to be down", target); + pcmk__debug("No reason to expect node %s to be down", target); } return match; } @@ -444,28 +447,29 @@ process_graph_event(xmlNode *event, const char *event_node) */ - magic = crm_element_value(event, PCMK__XA_TRANSITION_KEY); + magic = pcmk__xe_get(event, PCMK__XA_TRANSITION_KEY); if (magic == NULL) { /* non-change */ return; } - crm_element_value_int(event, PCMK__XA_OP_STATUS, &status); + pcmk__xe_get_int(event, PCMK__XA_OP_STATUS, &status); if (status == PCMK_EXEC_PENDING) { return; } - id = crm_element_value(event, PCMK__XA_OPERATION_KEY); - crm_element_value_int(event, PCMK__XA_RC_CODE, &rc); - crm_element_value_int(event, PCMK__XA_CALL_ID, &callid); + id = pcmk__xe_get(event, PCMK__XA_OPERATION_KEY); + pcmk__xe_get_int(event, PCMK__XA_RC_CODE, &rc); + pcmk__xe_get_int(event, PCMK__XA_CALL_ID, &callid); rc = pcmk__effective_rc(rc); if (decode_transition_key(magic, &update_te_uuid, &transition_num, &action_num, &target_rc) == FALSE) { // decode_transition_key() already logged the bad key - crm_err("Can't process action %s result: Incompatible versions? " - QB_XS " call-id=%d", id, callid); + pcmk__err("Can't process action %s result: Incompatible versions? " + QB_XS " call-id=%d", + id, callid); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, "Bad event", event); return; @@ -474,8 +478,9 @@ process_graph_event(xmlNode *event, const char *event_node) if (transition_num == -1) { // E.g. crm_resource --fail if (record_outside_event(action_num) != pcmk_rc_ok) { - crm_debug("Outside event with transition key '%s' has already been " - "processed", magic); + pcmk__debug("Outside event with transition key '%s' has already " + "been processed", + magic); goto bail; } desc = "initiated outside of the cluster"; @@ -531,14 +536,14 @@ process_graph_event(xmlNode *event, const char *event_node) abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, "Unknown event", event); - } else if (pcmk_is_set(action->flags, pcmk__graph_action_confirmed)) { + } else if (pcmk__is_set(action->flags, pcmk__graph_action_confirmed)) { /* Nothing further needs to be done if the action has already been * confirmed. This can happen e.g. when processing both an * "xxx_last_0" or "xxx_last_failure_0" record as well as the main * history record, which would otherwise result in incorrectly * bumping the fail count twice. */ - crm_log_xml_debug(event, "Event already confirmed:"); + pcmk__log_xml_debug(event, "Event already confirmed:"); goto bail; } else { @@ -557,7 +562,7 @@ process_graph_event(xmlNode *event, const char *event_node) stop_te_timer(action); te_action_confirmed(action, controld_globals.transition_graph); - if (pcmk_is_set(action->flags, pcmk__graph_action_failed)) { + if (pcmk__is_set(action->flags, pcmk__graph_action_failed)) { abort_transition(action->synapse->priority + 1, pcmk__graph_restart, "Event failed", event); } @@ -567,45 +572,45 @@ process_graph_event(xmlNode *event, const char *event_node) if (id == NULL) { id = "unknown action"; } - uname = crm_element_value(event, PCMK__META_ON_NODE); + uname = pcmk__xe_get(event, PCMK__META_ON_NODE); if (uname == NULL) { uname = "unknown node"; } if (status == PCMK_EXEC_INVALID) { // We couldn't attempt the action - crm_info("Transition %d action %d (%s on %s): %s", - transition_num, action_num, id, uname, - pcmk_exec_status_str(status)); + pcmk__info("Transition %d action %d (%s on %s): %s", transition_num, + action_num, id, uname, pcmk_exec_status_str(status)); } else if (desc && update_failcount(event, event_node, rc, target_rc, (transition_num == -1), FALSE)) { - crm_notice("Transition %d action %d (%s on %s): expected '%s' but got '%s' " - QB_XS " target-rc=%d rc=%d call-id=%d event='%s'", - transition_num, action_num, id, uname, - crm_exit_str(target_rc), crm_exit_str(rc), - target_rc, rc, callid, desc); + pcmk__notice("Transition %d action %d (%s on %s): expected '%s' but " + "got '%s' " + QB_XS " target-rc=%d rc=%d call-id=%d event='%s'", + transition_num, action_num, id, uname, + crm_exit_str(target_rc), crm_exit_str(rc), + target_rc, rc, callid, desc); } else if (desc) { - crm_info("Transition %d action %d (%s on %s): %s " - QB_XS " rc=%d target-rc=%d call-id=%d", - transition_num, action_num, id, uname, - desc, rc, target_rc, callid); + pcmk__info("Transition %d action %d (%s on %s): %s " + QB_XS " rc=%d target-rc=%d call-id=%d", + transition_num, action_num, id, uname, + desc, rc, target_rc, callid); } else if (rc == target_rc) { - crm_info("Transition %d action %d (%s on %s) confirmed: %s " - QB_XS " rc=%d call-id=%d", - transition_num, action_num, id, uname, - crm_exit_str(rc), rc, callid); + pcmk__info("Transition %d action %d (%s on %s) confirmed: %s " + QB_XS " rc=%d call-id=%d", + transition_num, action_num, id, uname, crm_exit_str(rc), + rc, callid); } else { update_failcount(event, event_node, rc, target_rc, (transition_num == -1), ignore_failures); - crm_notice("Transition %d action %d (%s on %s): expected '%s' but got '%s' " - QB_XS " target-rc=%d rc=%d call-id=%d", - transition_num, action_num, id, uname, - crm_exit_str(target_rc), crm_exit_str(rc), - target_rc, rc, callid); + pcmk__notice("Transition %d action %d (%s on %s): expected '%s' but " + "got '%s' " QB_XS " target-rc=%d rc=%d call-id=%d", + transition_num, action_num, id, uname, + crm_exit_str(target_rc), crm_exit_str(rc), + target_rc, rc, callid); } bail: diff --git a/daemons/controld/controld_te_utils.c b/daemons/controld/controld_te_utils.c index 80d3c9477aa..9d724c0de5d 100644 --- a/daemons/controld/controld_te_utils.c +++ b/daemons/controld/controld_te_utils.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,7 @@ #include #include +#include // PCMK_SCORE_INFINITY #include #include @@ -25,11 +26,11 @@ stop_te_timer(pcmk__graph_action_t *action) return FALSE; } if (action->timer != 0) { - crm_trace("Stopping action timer"); + pcmk__trace("Stopping action timer"); g_source_remove(action->timer); action->timer = 0; } else { - crm_trace("Action timer was already stopped"); + pcmk__trace("Action timer was already stopped"); return FALSE; } return TRUE; @@ -39,13 +40,13 @@ static gboolean te_graph_trigger(gpointer user_data) { if (controld_globals.transition_graph == NULL) { - crm_debug("Nothing to do"); + pcmk__debug("Nothing to do"); return TRUE; } - crm_trace("Invoking graph %d in state %s", - controld_globals.transition_graph->id, - fsa_state2string(controld_globals.fsa_state)); + pcmk__trace("Invoking graph %d in state %s", + controld_globals.transition_graph->id, + fsa_state2string(controld_globals.fsa_state)); switch (controld_globals.fsa_state) { case S_STARTING: @@ -70,23 +71,23 @@ te_graph_trigger(gpointer user_data) controld_globals.transition_graph->batch_limit = orig_limit; if (graph_rc == pcmk__graph_active) { - crm_trace("Transition not yet complete"); + pcmk__trace("Transition not yet complete"); return TRUE; } else if (graph_rc == pcmk__graph_pending) { - crm_trace("Transition not yet complete - no actions fired"); + pcmk__trace("Transition not yet complete - no actions fired"); return TRUE; } if (graph_rc != pcmk__graph_complete) { - crm_warn("Transition failed: %s", - pcmk__graph_status2text(graph_rc)); + pcmk__warn("Transition failed: %s", + pcmk__graph_status2text(graph_rc)); pcmk__log_graph(LOG_NOTICE, controld_globals.transition_graph); } } - crm_debug("Transition %d is now complete", - controld_globals.transition_graph->id); + pcmk__debug("Transition %d is now complete", + controld_globals.transition_graph->id); controld_globals.transition_graph->complete = true; notify_crmd(controld_globals.transition_graph); @@ -118,7 +119,7 @@ controld_destroy_transition_trigger(void) void controld_trigger_graph_as(const char *fn, int line) { - crm_trace("%s:%d - Triggered graph processing", fn, line); + pcmk__trace("%s:%d - Triggered graph processing", fn, line); mainloop_set_trigger(transition_trigger); } @@ -191,9 +192,9 @@ node_pending_timer_popped(gpointer key) return FALSE; } - crm_warn("Node with " PCMK_XA_ID " '%s' pending timed out (%us) " - "on joining the process group", - (const char *) key, controld_globals.node_pending_timeout); + pcmk__warn("Node with " PCMK_XA_ID " '%s' pending timed out (%us) on " + "joining the process group", + (const char *) key, controld_globals.node_pending_timeout); if (controld_globals.node_pending_timeout > 0) { abort_timer_popped(node_pending_timer); @@ -223,10 +224,10 @@ init_node_pending_timer(const pcmk__node_status_t *node, guint timeout) return; } - crm_notice("Waiting for pending %s with " PCMK_XA_ID " '%s' " - "to join the process group (timeout=%us)", - pcmk__s(node->name, "node"), node->xml_id, - controld_globals.node_pending_timeout); + pcmk__notice("Waiting for pending %s with " PCMK_XA_ID " '%s' to join the " + "process group (timeout=%us)", + pcmk__s(node->name, "node"), node->xml_id, + controld_globals.node_pending_timeout); key = pcmk__str_copy(node->xml_id); node_pending_timer = pcmk__assert_alloc(1, sizeof(struct abort_timer_s)); @@ -263,7 +264,7 @@ controld_node_pending_timer(const pcmk__node_status_t *node) * already part of CPG, or PCMK_OPT_NODE_PENDING_TIMEOUT is disabled, free * any node pending timer for it. */ - if (pcmk_is_set(node->flags, pcmk__node_status_remote) + if (pcmk__is_set(node->flags, pcmk__node_status_remote) || (node->when_member <= 1) || (node->when_online > 0) || (controld_globals.node_pending_timeout == 0)) { @@ -321,18 +322,21 @@ update_abort_priority(pcmk__graph_t *graph, int priority, } if (graph->abort_priority < priority) { - crm_debug("Abort priority upgraded from %d to %d", graph->abort_priority, priority); + pcmk__debug("Abort priority upgraded from %d to %d", + graph->abort_priority, priority); graph->abort_priority = priority; if (graph->abort_reason != NULL) { - crm_debug("'%s' abort superseded by %s", graph->abort_reason, abort_reason); + pcmk__debug("'%s' abort superseded by %s", graph->abort_reason, + abort_reason); } graph->abort_reason = abort_reason; change = TRUE; } if (graph->completion_action < action) { - crm_debug("Abort action %s superseded by %s: %s", - abort2text(graph->completion_action), abort2text(action), abort_reason); + pcmk__debug("Abort action %s superseded by %s: %s", + abort2text(graph->completion_action), abort2text(action), + abort_reason); graph->completion_action = action; change = TRUE; } @@ -350,6 +354,7 @@ abort_transition_graph(int abort_priority, enum pcmk__graph_next abort_action, int level = LOG_INFO; const xmlNode *diff = NULL; const xmlNode *change = NULL; + const bool complete = controld_globals.transition_graph->complete; CRM_CHECK(controld_globals.transition_graph != NULL, return); @@ -361,9 +366,9 @@ abort_transition_graph(int abort_priority, enum pcmk__graph_next abort_action, case S_ILLEGAL: case S_STOPPING: case S_TERMINATE: - crm_info("Abort %s suppressed: state=%s (%scomplete)", - abort_text, fsa_state2string(controld_globals.fsa_state), - (controld_globals.transition_graph->complete? "" : "in")); + pcmk__info("Abort %s suppressed: state=%s (%scomplete)", + abort_text, fsa_state2string(controld_globals.fsa_state), + (complete? "" : "in")); return; default: break; @@ -390,7 +395,7 @@ abort_transition_graph(int abort_priority, enum pcmk__graph_next abort_action, } if(diff) { - xml_patch_versions(diff, add, del); + pcmk__xml_patchset_versions(diff, del, add); for(search = reason; search; search = search->parent) { if (pcmk__xe_is(search, PCMK_XE_CHANGE)) { change = search; @@ -420,8 +425,8 @@ abort_transition_graph(int abort_priority, enum pcmk__graph_next abort_action, g_string_free(local_path, TRUE); } else { - const char *op = crm_element_value(change, PCMK_XA_OPERATION); - const char *path = crm_element_value(change, PCMK_XA_PATH); + const char *op = pcmk__xe_get(change, PCMK_XA_OPERATION); + const char *path = pcmk__xe_get(change, PCMK_XA_PATH); if(change == reason) { if (strcmp(op, PCMK_VALUE_CREATE) == 0) { @@ -451,22 +456,20 @@ abort_transition_graph(int abort_priority, enum pcmk__graph_next abort_action, do_crm_log(level, "Transition %d aborted by %s doing %s %s=%s: %s " QB_XS " cib=%d.%d.%d source=%s:%d path=%s complete=%s", controld_globals.transition_graph->id, - crm_element_value(reason, PCMK_XA_ID), op, - crm_element_value(reason, PCMK_XA_NAME), - crm_element_value(reason, PCMK_XA_VALUE), + pcmk__xe_get(reason, PCMK_XA_ID), op, + pcmk__xe_get(reason, PCMK_XA_NAME), + pcmk__xe_get(reason, PCMK_XA_VALUE), abort_text, add[0], add[1], add[2], fn, line, path, pcmk__btoa(controld_globals.transition_graph->complete)); } else if (pcmk__xe_is(reason, PCMK__XE_LRM_RSC_OP)) { - const char *magic = crm_element_value(reason, - PCMK__XA_TRANSITION_MAGIC); + const char *magic = pcmk__xe_get(reason, PCMK__XA_TRANSITION_MAGIC); do_crm_log(level, "Transition %d aborted by operation %s '%s' on %s: %s " QB_XS " magic=%s cib=%d.%d.%d source=%s:%d complete=%s", controld_globals.transition_graph->id, - crm_element_value(reason, PCMK__XA_OPERATION_KEY), op, - crm_element_value(reason, PCMK__META_ON_NODE), - abort_text, + pcmk__xe_get(reason, PCMK__XA_OPERATION_KEY), op, + pcmk__xe_get(reason, PCMK__META_ON_NODE), abort_text, magic, add[0], add[1], add[2], fn, line, pcmk__btoa(controld_globals.transition_graph->complete)); diff --git a/daemons/controld/controld_throttle.c b/daemons/controld/controld_throttle.c index d2ad9355e9e..5877b78adb3 100644 --- a/daemons/controld/controld_throttle.c +++ b/daemons/controld/controld_throttle.c @@ -1,5 +1,5 @@ /* - * Copyright 2013-2024 the Pacemaker project contributors + * Copyright 2013-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -77,23 +77,23 @@ throttle_check_thresholds(float load, const char *desc, const float thresholds[4]) { if (load > thresholds[3]) { - crm_notice("Extreme %s detected: %f", desc, load); + pcmk__notice("Extreme %s detected: %f", desc, load); return throttle_extreme; } else if (load > thresholds[2]) { - crm_notice("High %s detected: %f", desc, load); + pcmk__notice("High %s detected: %f", desc, load); return throttle_high; } else if (load > thresholds[1]) { - crm_info("Moderate %s detected: %f", desc, load); + pcmk__info("Moderate %s detected: %f", desc, load); return throttle_med; } else if (load > thresholds[0]) { - crm_debug("Noticeable %s detected: %f", desc, load); + pcmk__debug("Noticeable %s detected: %f", desc, load); return throttle_low; } - crm_trace("Negligible %s detected: %f", desc, load); + pcmk__trace("Negligible %s detected: %f", desc, load); return throttle_none; } @@ -171,7 +171,7 @@ throttle_mode(void) if (cpu_load > mode) { mode = cpu_load; } - crm_debug("Current load is %f across %u core(s)", load, cores); + pcmk__debug("Current load is %f across %u core(s)", load, cores); } return mode; @@ -184,14 +184,14 @@ throttle_send_command(enum throttle_state_e mode) static enum throttle_state_e last = -1; if(mode != last) { - crm_info("New throttle mode: %s load (was %s)", - load2str(mode), load2str(last)); + pcmk__info("New throttle mode: %s load (was %s)", load2str(mode), + load2str(last)); last = mode; xml = pcmk__new_request(pcmk_ipc_controld, CRM_SYSTEM_CRMD, NULL, CRM_SYSTEM_CRMD, CRM_OP_THROTTLE, NULL); - crm_xml_add_int(xml, PCMK__XA_CRM_LIMIT_MODE, mode); - crm_xml_add_int(xml, PCMK__XA_CRM_LIMIT_MAX, throttle_job_max); + pcmk__xe_set_int(xml, PCMK__XA_CRM_LIMIT_MODE, mode); + pcmk__xe_set_int(xml, PCMK__XA_CRM_LIMIT_MAX, throttle_job_max); pcmk__cluster_send_message(NULL, pcmk_ipc_controld, xml); pcmk__xml_free(xml); @@ -238,9 +238,9 @@ throttle_update_job_max(const char *preference) int rc = pcmk__scan_ll(env_limit, &max, 0LL); if (rc != pcmk_rc_ok) { - crm_warn("Ignoring local option PCMK_" PCMK__ENV_NODE_ACTION_LIMIT - " because '%s' is not a valid value: %s", - env_limit, pcmk_rc_str(rc)); + pcmk__warn("Ignoring local option PCMK_" PCMK__ENV_NODE_ACTION_LIMIT + " because '%s' is not a valid value: %s", + env_limit, pcmk_rc_str(rc)); env_limit = NULL; } } @@ -333,10 +333,11 @@ throttle_get_total_job_limit(int l) if(limit == l) { } else if(l == 0) { - crm_trace("Using " PCMK_OPT_BATCH_LIMIT "=%d", limit); + pcmk__trace("Using " PCMK_OPT_BATCH_LIMIT "=%d", limit); } else { - crm_trace("Using " PCMK_OPT_BATCH_LIMIT "=%d instead of %d", limit, l); + pcmk__trace("Using " PCMK_OPT_BATCH_LIMIT "=%d instead of %d", limit, + l); } return limit; } @@ -353,7 +354,7 @@ throttle_get_job_limit(const char *node) r->node = pcmk__str_copy(node); r->mode = throttle_low; r->max = throttle_job_max; - crm_trace("Defaulting to local values for unknown node %s", node); + pcmk__trace("Defaulting to local values for unknown node %s", node); g_hash_table_insert(throttle_records, r->node, r); } @@ -373,7 +374,7 @@ throttle_get_job_limit(const char *node) jobs = QB_MAX(1, r->max); break; default: - crm_err("Unknown throttle mode %.4x on %s", r->mode, node); + pcmk__err("Unknown throttle mode %.4x on %s", r->mode, node); break; } return jobs; @@ -385,10 +386,10 @@ throttle_update(xmlNode *xml) int max = 0; int mode = 0; struct throttle_record_s *r = NULL; - const char *from = crm_element_value(xml, PCMK__XA_SRC); + const char *from = pcmk__xe_get(xml, PCMK__XA_SRC); - crm_element_value_int(xml, PCMK__XA_CRM_LIMIT_MODE, &mode); - crm_element_value_int(xml, PCMK__XA_CRM_LIMIT_MAX, &max); + pcmk__xe_get_int(xml, PCMK__XA_CRM_LIMIT_MODE, &mode); + pcmk__xe_get_int(xml, PCMK__XA_CRM_LIMIT_MAX, &max); r = g_hash_table_lookup(throttle_records, from); @@ -401,7 +402,8 @@ throttle_update(xmlNode *xml) r->max = max; r->mode = (enum throttle_state_e) mode; - crm_debug("Node %s has %s load and supports at most %d jobs; new job limit %d", - from, load2str((enum throttle_state_e) mode), max, - throttle_get_job_limit(from)); + pcmk__debug("Node %s has %s load and supports at most %d jobs; new job " + "limit %d", + from, load2str((enum throttle_state_e) mode), max, + throttle_get_job_limit(from)); } diff --git a/daemons/controld/controld_timers.c b/daemons/controld/controld_timers.c index 0ac17bfc633..2b30c0cacef 100644 --- a/daemons/controld/controld_timers.c +++ b/daemons/controld/controld_timers.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -93,16 +93,17 @@ controld_stop_timer(fsa_timer_t *timer) CRM_CHECK(timer != NULL, return false); if (timer->source_id != 0) { - crm_trace("Stopping %s (would inject %s if popped after %ums, src=%d)", - get_timer_desc(timer), fsa_input2string(timer->fsa_input), - timer->period_ms, timer->source_id); + pcmk__trace("Stopping %s (would inject %s if popped after %ums, " + "src=%d)", + get_timer_desc(timer), fsa_input2string(timer->fsa_input), + timer->period_ms, timer->source_id); g_source_remove(timer->source_id); timer->source_id = 0; } else { - crm_trace("%s already stopped (would inject %s if popped after %ums)", - get_timer_desc(timer), fsa_input2string(timer->fsa_input), - timer->period_ms); + pcmk__trace("%s already stopped (would inject %s if popped after %ums)", + get_timer_desc(timer), fsa_input2string(timer->fsa_input), + timer->period_ms); return false; } return true; @@ -120,13 +121,14 @@ controld_start_timer(fsa_timer_t *timer) if (timer->source_id == 0 && timer->period_ms > 0) { timer->source_id = pcmk__create_timer(timer->period_ms, timer->callback, timer); pcmk__assert(timer->source_id != 0); - crm_debug("Started %s (inject %s if pops after %ums, source=%d)", - get_timer_desc(timer), fsa_input2string(timer->fsa_input), - timer->period_ms, timer->source_id); + pcmk__debug("Started %s (inject %s if pops after %ums, source=%d)", + get_timer_desc(timer), fsa_input2string(timer->fsa_input), + timer->period_ms, timer->source_id); } else { - crm_debug("%s already running (inject %s if pops after %ums, source=%d)", - get_timer_desc(timer), fsa_input2string(timer->fsa_input), - timer->period_ms, timer->source_id); + pcmk__debug("%s already running (inject %s if pops after %ums, " + "source=%d)", + get_timer_desc(timer), fsa_input2string(timer->fsa_input), + timer->period_ms, timer->source_id); } } @@ -174,19 +176,20 @@ crm_timer_popped(gpointer data) fsa_timer_t *timer = (fsa_timer_t *) data; if (timer->log_error) { - crm_err("%s just popped in state %s! " QB_XS " input=%s time=%ums", - get_timer_desc(timer), - fsa_state2string(controld_globals.fsa_state), - fsa_input2string(timer->fsa_input), timer->period_ms); + pcmk__err("%s just popped in state %s! " QB_XS " input=%s time=%ums", + get_timer_desc(timer), + fsa_state2string(controld_globals.fsa_state), + fsa_input2string(timer->fsa_input), timer->period_ms); } else { - crm_info("%s just popped " QB_XS " input=%s time=%ums", - get_timer_desc(timer), fsa_input2string(timer->fsa_input), - timer->period_ms); + pcmk__info("%s just popped " QB_XS " input=%s time=%ums", + get_timer_desc(timer), fsa_input2string(timer->fsa_input), + timer->period_ms); timer->counter++; } if ((timer == election_timer) && (election_timer->counter > 5)) { - crm_notice("We appear to be in an election loop, something may be wrong"); + pcmk__notice("We appear to be in an election loop, something may be " + "wrong"); crm_write_blackbox(0, NULL); election_timer->counter = 0; } @@ -194,9 +197,9 @@ crm_timer_popped(gpointer data) controld_stop_timer(timer); // Make timer _not_ go off again if (timer->fsa_input == I_INTEGRATED) { - crm_info("Welcomed: %d, Integrated: %d", - crmd_join_phase_count(controld_join_welcomed), - crmd_join_phase_count(controld_join_integrated)); + pcmk__info("Welcomed: %d, Integrated: %d", + crmd_join_phase_count(controld_join_welcomed), + crmd_join_phase_count(controld_join_integrated)); if (crmd_join_phase_count(controld_join_welcomed) == 0) { // If we don't even have ourselves, start again register_fsa_error_adv(C_FSA_INTERNAL, I_ELECTION, NULL, NULL, @@ -208,15 +211,15 @@ crm_timer_popped(gpointer data) } else if ((timer == recheck_timer) && (controld_globals.fsa_state != S_IDLE)) { - crm_debug("Discarding %s event in state: %s", - fsa_input2string(timer->fsa_input), - fsa_state2string(controld_globals.fsa_state)); + pcmk__debug("Discarding %s event in state: %s", + fsa_input2string(timer->fsa_input), + fsa_state2string(controld_globals.fsa_state)); } else if ((timer == finalization_timer) && (controld_globals.fsa_state != S_FINALIZE_JOIN)) { - crm_debug("Discarding %s event in state: %s", - fsa_input2string(timer->fsa_input), - fsa_state2string(controld_globals.fsa_state)); + pcmk__debug("Discarding %s event in state: %s", + fsa_input2string(timer->fsa_input), + fsa_state2string(controld_globals.fsa_state)); } else if (timer->fsa_input != I_NULL) { register_fsa_input(C_TIMER_POPPED, timer->fsa_input, NULL); @@ -320,8 +323,9 @@ controld_configure_fsa_timers(GHashTable *options) // Shutdown escalation timer value = g_hash_table_lookup(options, PCMK_OPT_SHUTDOWN_ESCALATION); pcmk_parse_interval_spec(value, &(shutdown_escalation_timer->period_ms)); - crm_debug("Shutdown escalation occurs if DC has not responded to request " - "in %ums", shutdown_escalation_timer->period_ms); + pcmk__debug("Shutdown escalation occurs if DC has not responded to request " + "in %ums", + shutdown_escalation_timer->period_ms); // Transition timer value = g_hash_table_lookup(options, PCMK_OPT_TRANSITION_DELAY); @@ -330,7 +334,8 @@ controld_configure_fsa_timers(GHashTable *options) // Recheck interval value = g_hash_table_lookup(options, PCMK_OPT_CLUSTER_RECHECK_INTERVAL); pcmk_parse_interval_spec(value, &recheck_interval_ms); - crm_debug("Re-run scheduler after %dms of inactivity", recheck_interval_ms); + pcmk__debug("Re-run scheduler after %dms of inactivity", + recheck_interval_ms); } void @@ -477,7 +482,7 @@ controld_shutdown_start_countdown(guint default_period_ms) shutdown_escalation_timer->period_ms = default_period_ms; } - crm_notice("Initiating controller shutdown sequence " QB_XS " limit=%ums", + pcmk__notice("Initiating controller shutdown sequence " QB_XS " limit=%ums", shutdown_escalation_timer->period_ms); controld_start_timer(shutdown_escalation_timer); } diff --git a/daemons/controld/controld_transition.c b/daemons/controld/controld_transition.c index 9f4685bbd27..e561ac8ee13 100644 --- a/daemons/controld/controld_transition.c +++ b/daemons/controld/controld_transition.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,6 +10,7 @@ #include #include +#include // PCMK_SCORE_INFINITY #include #include @@ -35,7 +36,7 @@ do_te_control(long long action, cib_t *cib_conn = controld_globals.cib_conn; gboolean init_ok = TRUE; - if (pcmk_is_set(action, A_TE_STOP)) { + if (pcmk__is_set(action, A_TE_STOP)) { pcmk__free_graph(controld_globals.transition_graph); controld_globals.transition_graph = NULL; @@ -46,35 +47,36 @@ do_te_control(long long action, } controld_clear_fsa_input_flags(R_TE_CONNECTED); - crm_info("Transitioner is now inactive"); + pcmk__info("Transitioner is now inactive"); } if ((action & A_TE_START) == 0) { return; - } else if (pcmk_is_set(controld_globals.fsa_input_register, - R_TE_CONNECTED)) { - crm_debug("The transitioner is already active"); + } else if (pcmk__is_set(controld_globals.fsa_input_register, + R_TE_CONNECTED)) { + pcmk__debug("The transitioner is already active"); return; } else if ((action & A_TE_START) && cur_state == S_STOPPING) { - crm_info("Ignoring request to start the transitioner while shutting down"); + pcmk__info("Ignoring request to start the transitioner while shutting " + "down"); return; } if (controld_globals.te_uuid == NULL) { - controld_globals.te_uuid = crm_generate_uuid(); - crm_info("Registering TE UUID: %s", controld_globals.te_uuid); + controld_globals.te_uuid = pcmk__generate_uuid(); + pcmk__info("Registering TE UUID: %s", controld_globals.te_uuid); } if (cib_conn == NULL) { - crm_err("Could not set CIB callbacks"); + pcmk__err("Could not set CIB callbacks"); init_ok = FALSE; } else if (cib_conn->cmds->add_notify_callback(cib_conn, PCMK__VALUE_CIB_DIFF_NOTIFY, te_update_diff) != pcmk_ok) { - crm_err("Could not set CIB notification callback"); + pcmk__err("Could not set CIB notification callback"); init_ok = FALSE; } @@ -83,7 +85,7 @@ do_te_control(long long action, pcmk__free_graph(controld_globals.transition_graph); /* create a blank one */ - crm_debug("Transitioner is now active"); + pcmk__debug("Transitioner is now active"); controld_globals.transition_graph = create_blank_graph(); controld_set_fsa_input_flags(R_TE_CONNECTED); } @@ -99,16 +101,16 @@ do_te_invoke(long long action, if (!AM_I_DC || ((controld_globals.fsa_state != S_TRANSITION_ENGINE) - && pcmk_is_set(action, A_TE_INVOKE))) { - crm_notice("No need to invoke the TE (%s) in state %s", - fsa_action2string(action), - fsa_state2string(controld_globals.fsa_state)); + && pcmk__is_set(action, A_TE_INVOKE))) { + pcmk__notice("No need to invoke the TE (%s) in state %s", + fsa_action2string(action), + fsa_state2string(controld_globals.fsa_state)); return; } if (action & A_TE_CANCEL) { - crm_debug("Cancelling the transition: %sactive", - controld_globals.transition_graph->complete? "in" : ""); + pcmk__debug("Cancelling the transition: %sactive", + (controld_globals.transition_graph->complete? "in" : "")); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, "Peer Cancelled", NULL); if (!controld_globals.transition_graph->complete) { @@ -125,18 +127,18 @@ do_te_invoke(long long action, } else if (action & A_TE_INVOKE) { ha_msg_input_t *input = fsa_typed_data(fsa_dt_ha_msg); xmlNode *graph_data = input->xml; - const char *ref = crm_element_value(input->msg, PCMK_XA_REFERENCE); - const char *graph_input = crm_element_value(input->msg, - PCMK__XA_CRM_TGRAPH_IN); + const char *ref = pcmk__xe_get(input->msg, PCMK_XA_REFERENCE); + const char *graph_input = pcmk__xe_get(input->msg, + PCMK__XA_CRM_TGRAPH_IN); if (graph_data == NULL) { - crm_log_xml_err(input->msg, "Bad command"); + pcmk__log_xml_err(input->msg, "Bad command"); register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL); return; } if (!controld_globals.transition_graph->complete) { - crm_info("Another transition is already active"); + pcmk__info("Another transition is already active"); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, "Transition Active", NULL); return; @@ -145,21 +147,21 @@ do_te_invoke(long long action, if ((controld_globals.fsa_pe_ref == NULL) || !pcmk__str_eq(controld_globals.fsa_pe_ref, ref, pcmk__str_none)) { - crm_info("Transition is redundant: %s expected but %s received", - pcmk__s(controld_globals.fsa_pe_ref, "no reference"), - pcmk__s(ref, "no reference")); + pcmk__info("Transition is redundant: %s expected but %s received", + pcmk__s(controld_globals.fsa_pe_ref, "no reference"), + pcmk__s(ref, "no reference")); abort_transition(PCMK_SCORE_INFINITY, pcmk__graph_restart, "Transition Redundant", NULL); } if (controld_is_started_transition_timer()) { - crm_debug("The transitioner wait for a transition timer"); + pcmk__debug("The transitioner wait for a transition timer"); return; } CRM_CHECK(graph_data != NULL, - crm_err("Input raised by %s is invalid", msg_data->origin); - crm_log_xml_err(input->msg, "Bad command"); + pcmk__err("Input raised by %s is invalid", msg_data->origin); + pcmk__log_xml_err(input->msg, "Bad command"); return); pcmk__free_graph(controld_globals.transition_graph); @@ -168,13 +170,13 @@ do_te_invoke(long long action, CRM_CHECK(controld_globals.transition_graph != NULL, controld_globals.transition_graph = create_blank_graph(); return); - crm_info("Processing graph %d (ref=%s) derived from %s", - controld_globals.transition_graph->id, ref, graph_input); + pcmk__info("Processing graph %d (ref=%s) derived from %s", + controld_globals.transition_graph->id, ref, graph_input); te_reset_job_counts(); trigger_graph(); - pcmk__log_graph(LOG_TRACE, controld_globals.transition_graph); + pcmk__log_graph(PCMK__LOG_TRACE, controld_globals.transition_graph); if (graph_data != input->xml) { pcmk__xml_free(graph_data); diff --git a/daemons/controld/controld_utils.c b/daemons/controld/controld_utils.c index d01e3dc6dd6..18a9d2848c9 100644 --- a/daemons/controld/controld_utils.c +++ b/daemons/controld/controld_utils.c @@ -154,7 +154,7 @@ fsa_input2string(enum crmd_fsa_input input) } if (inputAsText == NULL) { - crm_err("Input %d is unknown", input); + pcmk__err("Input %d is unknown", input); inputAsText = ""; } @@ -215,7 +215,7 @@ fsa_state2string(enum crmd_fsa_state state) } if (stateAsText == NULL) { - crm_err("State %d is unknown", state); + pcmk__err("State %d is unknown", state); stateAsText = ""; } @@ -258,7 +258,7 @@ fsa_cause2string(enum crmd_fsa_cause cause) } if (causeAsText == NULL) { - crm_err("Cause %d is unknown", cause); + pcmk__err("Cause %d is unknown", cause); causeAsText = ""; } @@ -459,7 +459,7 @@ fsa_action2string(long long action) } if (actionAsText == NULL) { - crm_err("Action %.16llx is unknown", action); + pcmk__err("Action %.16llx is unknown", action); actionAsText = ""; } @@ -476,229 +476,248 @@ fsa_dump_inputs(int log_level, const char *text, long long input_register) text = "Input register contents:"; } - if (pcmk_is_set(input_register, R_THE_DC)) { - crm_trace("%s %.16llx (R_THE_DC)", text, R_THE_DC); + if (pcmk__is_set(input_register, R_THE_DC)) { + pcmk__trace("%s %.16llx (R_THE_DC)", text, R_THE_DC); } - if (pcmk_is_set(input_register, R_STARTING)) { - crm_trace("%s %.16llx (R_STARTING)", text, R_STARTING); + if (pcmk__is_set(input_register, R_STARTING)) { + pcmk__trace("%s %.16llx (R_STARTING)", text, R_STARTING); } - if (pcmk_is_set(input_register, R_SHUTDOWN)) { - crm_trace("%s %.16llx (R_SHUTDOWN)", text, R_SHUTDOWN); + if (pcmk__is_set(input_register, R_SHUTDOWN)) { + pcmk__trace("%s %.16llx (R_SHUTDOWN)", text, R_SHUTDOWN); } - if (pcmk_is_set(input_register, R_STAYDOWN)) { - crm_trace("%s %.16llx (R_STAYDOWN)", text, R_STAYDOWN); + if (pcmk__is_set(input_register, R_STAYDOWN)) { + pcmk__trace("%s %.16llx (R_STAYDOWN)", text, R_STAYDOWN); } - if (pcmk_is_set(input_register, R_JOIN_OK)) { - crm_trace("%s %.16llx (R_JOIN_OK)", text, R_JOIN_OK); + if (pcmk__is_set(input_register, R_JOIN_OK)) { + pcmk__trace("%s %.16llx (R_JOIN_OK)", text, R_JOIN_OK); } - if (pcmk_is_set(input_register, R_READ_CONFIG)) { - crm_trace("%s %.16llx (R_READ_CONFIG)", text, R_READ_CONFIG); + if (pcmk__is_set(input_register, R_READ_CONFIG)) { + pcmk__trace("%s %.16llx (R_READ_CONFIG)", text, R_READ_CONFIG); } - if (pcmk_is_set(input_register, R_INVOKE_PE)) { - crm_trace("%s %.16llx (R_INVOKE_PE)", text, R_INVOKE_PE); + if (pcmk__is_set(input_register, R_INVOKE_PE)) { + pcmk__trace("%s %.16llx (R_INVOKE_PE)", text, R_INVOKE_PE); } - if (pcmk_is_set(input_register, R_CIB_CONNECTED)) { - crm_trace("%s %.16llx (R_CIB_CONNECTED)", text, R_CIB_CONNECTED); + if (pcmk__is_set(input_register, R_CIB_CONNECTED)) { + pcmk__trace("%s %.16llx (R_CIB_CONNECTED)", text, R_CIB_CONNECTED); } - if (pcmk_is_set(input_register, R_PE_CONNECTED)) { - crm_trace("%s %.16llx (R_PE_CONNECTED)", text, R_PE_CONNECTED); + if (pcmk__is_set(input_register, R_PE_CONNECTED)) { + pcmk__trace("%s %.16llx (R_PE_CONNECTED)", text, R_PE_CONNECTED); } - if (pcmk_is_set(input_register, R_TE_CONNECTED)) { - crm_trace("%s %.16llx (R_TE_CONNECTED)", text, R_TE_CONNECTED); + if (pcmk__is_set(input_register, R_TE_CONNECTED)) { + pcmk__trace("%s %.16llx (R_TE_CONNECTED)", text, R_TE_CONNECTED); } - if (pcmk_is_set(input_register, R_LRM_CONNECTED)) { - crm_trace("%s %.16llx (R_LRM_CONNECTED)", text, R_LRM_CONNECTED); + if (pcmk__is_set(input_register, R_LRM_CONNECTED)) { + pcmk__trace("%s %.16llx (R_LRM_CONNECTED)", text, R_LRM_CONNECTED); } - if (pcmk_is_set(input_register, R_CIB_REQUIRED)) { - crm_trace("%s %.16llx (R_CIB_REQUIRED)", text, R_CIB_REQUIRED); + if (pcmk__is_set(input_register, R_CIB_REQUIRED)) { + pcmk__trace("%s %.16llx (R_CIB_REQUIRED)", text, R_CIB_REQUIRED); } - if (pcmk_is_set(input_register, R_PE_REQUIRED)) { - crm_trace("%s %.16llx (R_PE_REQUIRED)", text, R_PE_REQUIRED); + if (pcmk__is_set(input_register, R_PE_REQUIRED)) { + pcmk__trace("%s %.16llx (R_PE_REQUIRED)", text, R_PE_REQUIRED); } - if (pcmk_is_set(input_register, R_TE_REQUIRED)) { - crm_trace("%s %.16llx (R_TE_REQUIRED)", text, R_TE_REQUIRED); + if (pcmk__is_set(input_register, R_TE_REQUIRED)) { + pcmk__trace("%s %.16llx (R_TE_REQUIRED)", text, R_TE_REQUIRED); } - if (pcmk_is_set(input_register, R_REQ_PEND)) { - crm_trace("%s %.16llx (R_REQ_PEND)", text, R_REQ_PEND); + if (pcmk__is_set(input_register, R_REQ_PEND)) { + pcmk__trace("%s %.16llx (R_REQ_PEND)", text, R_REQ_PEND); } - if (pcmk_is_set(input_register, R_PE_PEND)) { - crm_trace("%s %.16llx (R_PE_PEND)", text, R_PE_PEND); + if (pcmk__is_set(input_register, R_PE_PEND)) { + pcmk__trace("%s %.16llx (R_PE_PEND)", text, R_PE_PEND); } - if (pcmk_is_set(input_register, R_TE_PEND)) { - crm_trace("%s %.16llx (R_TE_PEND)", text, R_TE_PEND); + if (pcmk__is_set(input_register, R_TE_PEND)) { + pcmk__trace("%s %.16llx (R_TE_PEND)", text, R_TE_PEND); } - if (pcmk_is_set(input_register, R_RESP_PEND)) { - crm_trace("%s %.16llx (R_RESP_PEND)", text, R_RESP_PEND); + if (pcmk__is_set(input_register, R_RESP_PEND)) { + pcmk__trace("%s %.16llx (R_RESP_PEND)", text, R_RESP_PEND); } - if (pcmk_is_set(input_register, R_CIB_DONE)) { - crm_trace("%s %.16llx (R_CIB_DONE)", text, R_CIB_DONE); + if (pcmk__is_set(input_register, R_CIB_DONE)) { + pcmk__trace("%s %.16llx (R_CIB_DONE)", text, R_CIB_DONE); } - if (pcmk_is_set(input_register, R_HAVE_CIB)) { - crm_trace("%s %.16llx (R_HAVE_CIB)", text, R_HAVE_CIB); + if (pcmk__is_set(input_register, R_HAVE_CIB)) { + pcmk__trace("%s %.16llx (R_HAVE_CIB)", text, R_HAVE_CIB); } - if (pcmk_is_set(input_register, R_MEMBERSHIP)) { - crm_trace("%s %.16llx (R_MEMBERSHIP)", text, R_MEMBERSHIP); + if (pcmk__is_set(input_register, R_MEMBERSHIP)) { + pcmk__trace("%s %.16llx (R_MEMBERSHIP)", text, R_MEMBERSHIP); } - if (pcmk_is_set(input_register, R_PEER_DATA)) { - crm_trace("%s %.16llx (R_PEER_DATA)", text, R_PEER_DATA); + if (pcmk__is_set(input_register, R_PEER_DATA)) { + pcmk__trace("%s %.16llx (R_PEER_DATA)", text, R_PEER_DATA); } - if (pcmk_is_set(input_register, R_IN_RECOVERY)) { - crm_trace("%s %.16llx (R_IN_RECOVERY)", text, R_IN_RECOVERY); + if (pcmk__is_set(input_register, R_IN_RECOVERY)) { + pcmk__trace("%s %.16llx (R_IN_RECOVERY)", text, R_IN_RECOVERY); } } void fsa_dump_actions(uint64_t action, const char *text) { - if (pcmk_is_set(action, A_READCONFIG)) { - crm_trace("Action %.16llx (A_READCONFIG) %s", A_READCONFIG, text); + if (pcmk__is_set(action, A_READCONFIG)) { + pcmk__trace("Action %.16llx (A_READCONFIG) %s", A_READCONFIG, text); } - if (pcmk_is_set(action, A_STARTUP)) { - crm_trace("Action %.16llx (A_STARTUP) %s", A_STARTUP, text); + if (pcmk__is_set(action, A_STARTUP)) { + pcmk__trace("Action %.16llx (A_STARTUP) %s", A_STARTUP, text); } - if (pcmk_is_set(action, A_STARTED)) { - crm_trace("Action %.16llx (A_STARTED) %s", A_STARTED, text); + if (pcmk__is_set(action, A_STARTED)) { + pcmk__trace("Action %.16llx (A_STARTED) %s", A_STARTED, text); } - if (pcmk_is_set(action, A_HA_CONNECT)) { - crm_trace("Action %.16llx (A_CONNECT) %s", A_HA_CONNECT, text); + if (pcmk__is_set(action, A_HA_CONNECT)) { + pcmk__trace("Action %.16llx (A_CONNECT) %s", A_HA_CONNECT, text); } - if (pcmk_is_set(action, A_HA_DISCONNECT)) { - crm_trace("Action %.16llx (A_DISCONNECT) %s", A_HA_DISCONNECT, text); + if (pcmk__is_set(action, A_HA_DISCONNECT)) { + pcmk__trace("Action %.16llx (A_DISCONNECT) %s", A_HA_DISCONNECT, text); } - if (pcmk_is_set(action, A_LRM_CONNECT)) { - crm_trace("Action %.16llx (A_LRM_CONNECT) %s", A_LRM_CONNECT, text); + if (pcmk__is_set(action, A_LRM_CONNECT)) { + pcmk__trace("Action %.16llx (A_LRM_CONNECT) %s", A_LRM_CONNECT, text); } - if (pcmk_is_set(action, A_LRM_INVOKE)) { - crm_trace("Action %.16llx (A_LRM_INVOKE) %s", A_LRM_INVOKE, text); + if (pcmk__is_set(action, A_LRM_INVOKE)) { + pcmk__trace("Action %.16llx (A_LRM_INVOKE) %s", A_LRM_INVOKE, text); } - if (pcmk_is_set(action, A_LRM_DISCONNECT)) { - crm_trace("Action %.16llx (A_LRM_DISCONNECT) %s", A_LRM_DISCONNECT, text); + if (pcmk__is_set(action, A_LRM_DISCONNECT)) { + pcmk__trace("Action %.16llx (A_LRM_DISCONNECT) %s", A_LRM_DISCONNECT, + text); } - if (pcmk_is_set(action, A_DC_TIMER_STOP)) { - crm_trace("Action %.16llx (A_DC_TIMER_STOP) %s", A_DC_TIMER_STOP, text); + if (pcmk__is_set(action, A_DC_TIMER_STOP)) { + pcmk__trace("Action %.16llx (A_DC_TIMER_STOP) %s", A_DC_TIMER_STOP, + text); } - if (pcmk_is_set(action, A_DC_TIMER_START)) { - crm_trace("Action %.16llx (A_DC_TIMER_START) %s", A_DC_TIMER_START, text); + if (pcmk__is_set(action, A_DC_TIMER_START)) { + pcmk__trace("Action %.16llx (A_DC_TIMER_START) %s", A_DC_TIMER_START, + text); } - if (pcmk_is_set(action, A_INTEGRATE_TIMER_START)) { - crm_trace("Action %.16llx (A_INTEGRATE_TIMER_START) %s", A_INTEGRATE_TIMER_START, text); + if (pcmk__is_set(action, A_INTEGRATE_TIMER_START)) { + pcmk__trace("Action %.16llx (A_INTEGRATE_TIMER_START) %s", + A_INTEGRATE_TIMER_START, text); } - if (pcmk_is_set(action, A_INTEGRATE_TIMER_STOP)) { - crm_trace("Action %.16llx (A_INTEGRATE_TIMER_STOP) %s", A_INTEGRATE_TIMER_STOP, text); + if (pcmk__is_set(action, A_INTEGRATE_TIMER_STOP)) { + pcmk__trace("Action %.16llx (A_INTEGRATE_TIMER_STOP) %s", + A_INTEGRATE_TIMER_STOP, text); } - if (pcmk_is_set(action, A_FINALIZE_TIMER_START)) { - crm_trace("Action %.16llx (A_FINALIZE_TIMER_START) %s", A_FINALIZE_TIMER_START, text); + if (pcmk__is_set(action, A_FINALIZE_TIMER_START)) { + pcmk__trace("Action %.16llx (A_FINALIZE_TIMER_START) %s", + A_FINALIZE_TIMER_START, text); } - if (pcmk_is_set(action, A_FINALIZE_TIMER_STOP)) { - crm_trace("Action %.16llx (A_FINALIZE_TIMER_STOP) %s", A_FINALIZE_TIMER_STOP, text); + if (pcmk__is_set(action, A_FINALIZE_TIMER_STOP)) { + pcmk__trace("Action %.16llx (A_FINALIZE_TIMER_STOP) %s", + A_FINALIZE_TIMER_STOP, text); } - if (pcmk_is_set(action, A_ELECTION_COUNT)) { - crm_trace("Action %.16llx (A_ELECTION_COUNT) %s", A_ELECTION_COUNT, text); + if (pcmk__is_set(action, A_ELECTION_COUNT)) { + pcmk__trace("Action %.16llx (A_ELECTION_COUNT) %s", A_ELECTION_COUNT, + text); } - if (pcmk_is_set(action, A_ELECTION_VOTE)) { - crm_trace("Action %.16llx (A_ELECTION_VOTE) %s", A_ELECTION_VOTE, text); + if (pcmk__is_set(action, A_ELECTION_VOTE)) { + pcmk__trace("Action %.16llx (A_ELECTION_VOTE) %s", A_ELECTION_VOTE, + text); } - if (pcmk_is_set(action, A_ELECTION_CHECK)) { - crm_trace("Action %.16llx (A_ELECTION_CHECK) %s", A_ELECTION_CHECK, text); + if (pcmk__is_set(action, A_ELECTION_CHECK)) { + pcmk__trace("Action %.16llx (A_ELECTION_CHECK) %s", A_ELECTION_CHECK, + text); } - if (pcmk_is_set(action, A_CL_JOIN_ANNOUNCE)) { - crm_trace("Action %.16llx (A_CL_JOIN_ANNOUNCE) %s", A_CL_JOIN_ANNOUNCE, text); + if (pcmk__is_set(action, A_CL_JOIN_ANNOUNCE)) { + pcmk__trace("Action %.16llx (A_CL_JOIN_ANNOUNCE) %s", + A_CL_JOIN_ANNOUNCE, text); } - if (pcmk_is_set(action, A_CL_JOIN_REQUEST)) { - crm_trace("Action %.16llx (A_CL_JOIN_REQUEST) %s", A_CL_JOIN_REQUEST, text); + if (pcmk__is_set(action, A_CL_JOIN_REQUEST)) { + pcmk__trace("Action %.16llx (A_CL_JOIN_REQUEST) %s", A_CL_JOIN_REQUEST, + text); } - if (pcmk_is_set(action, A_CL_JOIN_RESULT)) { - crm_trace("Action %.16llx (A_CL_JOIN_RESULT) %s", A_CL_JOIN_RESULT, text); + if (pcmk__is_set(action, A_CL_JOIN_RESULT)) { + pcmk__trace("Action %.16llx (A_CL_JOIN_RESULT) %s", A_CL_JOIN_RESULT, + text); } - if (pcmk_is_set(action, A_DC_JOIN_OFFER_ALL)) { - crm_trace("Action %.16llx (A_DC_JOIN_OFFER_ALL) %s", A_DC_JOIN_OFFER_ALL, text); + if (pcmk__is_set(action, A_DC_JOIN_OFFER_ALL)) { + pcmk__trace("Action %.16llx (A_DC_JOIN_OFFER_ALL) %s", + A_DC_JOIN_OFFER_ALL, text); } - if (pcmk_is_set(action, A_DC_JOIN_OFFER_ONE)) { - crm_trace("Action %.16llx (A_DC_JOIN_OFFER_ONE) %s", A_DC_JOIN_OFFER_ONE, text); + if (pcmk__is_set(action, A_DC_JOIN_OFFER_ONE)) { + pcmk__trace("Action %.16llx (A_DC_JOIN_OFFER_ONE) %s", + A_DC_JOIN_OFFER_ONE, text); } - if (pcmk_is_set(action, A_DC_JOIN_PROCESS_REQ)) { - crm_trace("Action %.16llx (A_DC_JOIN_PROCESS_REQ) %s", A_DC_JOIN_PROCESS_REQ, text); + if (pcmk__is_set(action, A_DC_JOIN_PROCESS_REQ)) { + pcmk__trace("Action %.16llx (A_DC_JOIN_PROCESS_REQ) %s", + A_DC_JOIN_PROCESS_REQ, text); } - if (pcmk_is_set(action, A_DC_JOIN_PROCESS_ACK)) { - crm_trace("Action %.16llx (A_DC_JOIN_PROCESS_ACK) %s", A_DC_JOIN_PROCESS_ACK, text); + if (pcmk__is_set(action, A_DC_JOIN_PROCESS_ACK)) { + pcmk__trace("Action %.16llx (A_DC_JOIN_PROCESS_ACK) %s", + A_DC_JOIN_PROCESS_ACK, text); } - if (pcmk_is_set(action, A_DC_JOIN_FINALIZE)) { - crm_trace("Action %.16llx (A_DC_JOIN_FINALIZE) %s", A_DC_JOIN_FINALIZE, text); + if (pcmk__is_set(action, A_DC_JOIN_FINALIZE)) { + pcmk__trace("Action %.16llx (A_DC_JOIN_FINALIZE) %s", + A_DC_JOIN_FINALIZE, text); } - if (pcmk_is_set(action, A_MSG_PROCESS)) { - crm_trace("Action %.16llx (A_MSG_PROCESS) %s", A_MSG_PROCESS, text); + if (pcmk__is_set(action, A_MSG_PROCESS)) { + pcmk__trace("Action %.16llx (A_MSG_PROCESS) %s", A_MSG_PROCESS, text); } - if (pcmk_is_set(action, A_MSG_ROUTE)) { - crm_trace("Action %.16llx (A_MSG_ROUTE) %s", A_MSG_ROUTE, text); + if (pcmk__is_set(action, A_MSG_ROUTE)) { + pcmk__trace("Action %.16llx (A_MSG_ROUTE) %s", A_MSG_ROUTE, text); } - if (pcmk_is_set(action, A_RECOVER)) { - crm_trace("Action %.16llx (A_RECOVER) %s", A_RECOVER, text); + if (pcmk__is_set(action, A_RECOVER)) { + pcmk__trace("Action %.16llx (A_RECOVER) %s", A_RECOVER, text); } - if (pcmk_is_set(action, A_DC_RELEASE)) { - crm_trace("Action %.16llx (A_DC_RELEASE) %s", A_DC_RELEASE, text); + if (pcmk__is_set(action, A_DC_RELEASE)) { + pcmk__trace("Action %.16llx (A_DC_RELEASE) %s", A_DC_RELEASE, text); } - if (pcmk_is_set(action, A_DC_RELEASED)) { - crm_trace("Action %.16llx (A_DC_RELEASED) %s", A_DC_RELEASED, text); + if (pcmk__is_set(action, A_DC_RELEASED)) { + pcmk__trace("Action %.16llx (A_DC_RELEASED) %s", A_DC_RELEASED, text); } - if (pcmk_is_set(action, A_DC_TAKEOVER)) { - crm_trace("Action %.16llx (A_DC_TAKEOVER) %s", A_DC_TAKEOVER, text); + if (pcmk__is_set(action, A_DC_TAKEOVER)) { + pcmk__trace("Action %.16llx (A_DC_TAKEOVER) %s", A_DC_TAKEOVER, text); } - if (pcmk_is_set(action, A_SHUTDOWN)) { - crm_trace("Action %.16llx (A_SHUTDOWN) %s", A_SHUTDOWN, text); + if (pcmk__is_set(action, A_SHUTDOWN)) { + pcmk__trace("Action %.16llx (A_SHUTDOWN) %s", A_SHUTDOWN, text); } - if (pcmk_is_set(action, A_SHUTDOWN_REQ)) { - crm_trace("Action %.16llx (A_SHUTDOWN_REQ) %s", A_SHUTDOWN_REQ, text); + if (pcmk__is_set(action, A_SHUTDOWN_REQ)) { + pcmk__trace("Action %.16llx (A_SHUTDOWN_REQ) %s", A_SHUTDOWN_REQ, text); } - if (pcmk_is_set(action, A_STOP)) { - crm_trace("Action %.16llx (A_STOP ) %s", A_STOP, text); + if (pcmk__is_set(action, A_STOP)) { + pcmk__trace("Action %.16llx (A_STOP ) %s", A_STOP, text); } - if (pcmk_is_set(action, A_EXIT_0)) { - crm_trace("Action %.16llx (A_EXIT_0) %s", A_EXIT_0, text); + if (pcmk__is_set(action, A_EXIT_0)) { + pcmk__trace("Action %.16llx (A_EXIT_0) %s", A_EXIT_0, text); } - if (pcmk_is_set(action, A_EXIT_1)) { - crm_trace("Action %.16llx (A_EXIT_1) %s", A_EXIT_1, text); + if (pcmk__is_set(action, A_EXIT_1)) { + pcmk__trace("Action %.16llx (A_EXIT_1) %s", A_EXIT_1, text); } - if (pcmk_is_set(action, A_CIB_START)) { - crm_trace("Action %.16llx (A_CIB_START) %s", A_CIB_START, text); + if (pcmk__is_set(action, A_CIB_START)) { + pcmk__trace("Action %.16llx (A_CIB_START) %s", A_CIB_START, text); } - if (pcmk_is_set(action, A_CIB_STOP)) { - crm_trace("Action %.16llx (A_CIB_STOP) %s", A_CIB_STOP, text); + if (pcmk__is_set(action, A_CIB_STOP)) { + pcmk__trace("Action %.16llx (A_CIB_STOP) %s", A_CIB_STOP, text); } - if (pcmk_is_set(action, A_TE_INVOKE)) { - crm_trace("Action %.16llx (A_TE_INVOKE) %s", A_TE_INVOKE, text); + if (pcmk__is_set(action, A_TE_INVOKE)) { + pcmk__trace("Action %.16llx (A_TE_INVOKE) %s", A_TE_INVOKE, text); } - if (pcmk_is_set(action, A_TE_START)) { - crm_trace("Action %.16llx (A_TE_START) %s", A_TE_START, text); + if (pcmk__is_set(action, A_TE_START)) { + pcmk__trace("Action %.16llx (A_TE_START) %s", A_TE_START, text); } - if (pcmk_is_set(action, A_TE_STOP)) { - crm_trace("Action %.16llx (A_TE_STOP) %s", A_TE_STOP, text); + if (pcmk__is_set(action, A_TE_STOP)) { + pcmk__trace("Action %.16llx (A_TE_STOP) %s", A_TE_STOP, text); } - if (pcmk_is_set(action, A_TE_CANCEL)) { - crm_trace("Action %.16llx (A_TE_CANCEL) %s", A_TE_CANCEL, text); + if (pcmk__is_set(action, A_TE_CANCEL)) { + pcmk__trace("Action %.16llx (A_TE_CANCEL) %s", A_TE_CANCEL, text); } - if (pcmk_is_set(action, A_PE_INVOKE)) { - crm_trace("Action %.16llx (A_PE_INVOKE) %s", A_PE_INVOKE, text); + if (pcmk__is_set(action, A_PE_INVOKE)) { + pcmk__trace("Action %.16llx (A_PE_INVOKE) %s", A_PE_INVOKE, text); } - if (pcmk_is_set(action, A_PE_START)) { - crm_trace("Action %.16llx (A_PE_START) %s", A_PE_START, text); + if (pcmk__is_set(action, A_PE_START)) { + pcmk__trace("Action %.16llx (A_PE_START) %s", A_PE_START, text); } - if (pcmk_is_set(action, A_PE_STOP)) { - crm_trace("Action %.16llx (A_PE_STOP) %s", A_PE_STOP, text); + if (pcmk__is_set(action, A_PE_STOP)) { + pcmk__trace("Action %.16llx (A_PE_STOP) %s", A_PE_STOP, text); } - if (pcmk_is_set(action, A_NODE_BLOCK)) { - crm_trace("Action %.16llx (A_NODE_BLOCK) %s", A_NODE_BLOCK, text); + if (pcmk__is_set(action, A_NODE_BLOCK)) { + pcmk__trace("Action %.16llx (A_NODE_BLOCK) %s", A_NODE_BLOCK, text); } - if (pcmk_is_set(action, A_UPDATE_NODESTATUS)) { - crm_trace("Action %.16llx (A_UPDATE_NODESTATUS) %s", A_UPDATE_NODESTATUS, text); + if (pcmk__is_set(action, A_UPDATE_NODESTATUS)) { + pcmk__trace("Action %.16llx (A_UPDATE_NODESTATUS) %s", + A_UPDATE_NODESTATUS, text); } - if (pcmk_is_set(action, A_LOG)) { - crm_trace("Action %.16llx (A_LOG ) %s", A_LOG, text); + if (pcmk__is_set(action, A_LOG)) { + pcmk__trace("Action %.16llx (A_LOG ) %s", A_LOG, text); } - if (pcmk_is_set(action, A_ERROR)) { - crm_trace("Action %.16llx (A_ERROR ) %s", A_ERROR, text); + if (pcmk__is_set(action, A_ERROR)) { + pcmk__trace("Action %.16llx (A_ERROR ) %s", A_ERROR, text); } - if (pcmk_is_set(action, A_WARN)) { - crm_trace("Action %.16llx (A_WARN ) %s", A_WARN, text); + if (pcmk__is_set(action, A_WARN)) { + pcmk__trace("Action %.16llx (A_WARN ) %s", A_WARN, text); } } @@ -712,8 +731,8 @@ update_dc(xmlNode * msg) if (msg != NULL) { gboolean invalid = FALSE; - dc_version = crm_element_value(msg, PCMK_XA_VERSION); - welcome_from = crm_element_value(msg, PCMK__XA_SRC); + dc_version = pcmk__xe_get(msg, PCMK_XA_VERSION); + welcome_from = pcmk__xe_get(msg, PCMK__XA_SRC); CRM_CHECK(dc_version != NULL, return FALSE); CRM_CHECK(welcome_from != NULL, return FALSE); @@ -729,11 +748,11 @@ update_dc(xmlNode * msg) if (invalid) { if (AM_I_DC) { - crm_err("Not updating DC to %s (%s): we are also a DC", - welcome_from, dc_version); + pcmk__err("Not updating DC to %s (%s): we are also a DC", + welcome_from, dc_version); } else { - crm_warn("New DC %s is not %s", - welcome_from, controld_globals.dc_name); + pcmk__warn("New DC %s is not %s", welcome_from, + controld_globals.dc_name); } controld_set_fsa_action_flags(A_CL_JOIN_QUERY | A_DC_TIMER_START); @@ -754,13 +773,12 @@ update_dc(xmlNode * msg) pcmk__get_node(0, controld_globals.dc_name, NULL, pcmk__node_search_cluster_member); - crm_info("Set DC to %s (%s)", - controld_globals.dc_name, - pcmk__s(controld_globals.dc_version, "unknown version")); + pcmk__info("Set DC to %s (%s)", controld_globals.dc_name, + pcmk__s(controld_globals.dc_version, "unknown version")); pcmk__update_peer_expected(__func__, dc_node, CRMD_JOINSTATE_MEMBER); } else if (last_dc != NULL) { - crm_info("Unset DC (was %s)", last_dc); + pcmk__info("Unset DC (was %s)", last_dc); } free(last_dc); diff --git a/daemons/controld/pacemaker-controld.c b/daemons/controld/pacemaker-controld.c index a365443d984..f95e64b20d9 100644 --- a/daemons/controld/pacemaker-controld.c +++ b/daemons/controld/pacemaker-controld.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -121,11 +121,13 @@ main(int argc, char **argv) pcmk__cli_init_logging(PCMK__SERVER_CONTROLD, args->verbosity); crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE); - crm_notice("Starting Pacemaker controller"); + pcmk__notice("Starting Pacemaker controller"); old_instance = crm_ipc_new(CRM_SYSTEM_CRMD, 0); if (old_instance == NULL) { - /* crm_ipc_new will have already printed an error message with crm_err. */ + /* crm_ipc_new() will have already logged an error message with + * pcmk__err() + */ exit_code = CRM_EX_FATAL; goto done; } @@ -134,8 +136,8 @@ main(int argc, char **argv) /* IPC end-point already up */ crm_ipc_close(old_instance); crm_ipc_destroy(old_instance); - crm_crit("Aborting start-up because another controller instance is " - "already active"); + pcmk__crit("Aborting start-up because another controller instance is " + "already active"); initialize = false; goto done; @@ -147,7 +149,8 @@ main(int argc, char **argv) if (pcmk__daemon_can_write(PCMK_SCHEDULER_INPUT_DIR, NULL) == FALSE) { exit_code = CRM_EX_FATAL; - crm_err("Terminating due to bad permissions on " PCMK_SCHEDULER_INPUT_DIR); + pcmk__err("Terminating due to bad permissions on " + PCMK_SCHEDULER_INPUT_DIR); g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "Bad permissions on " PCMK_SCHEDULER_INPUT_DIR " (see logs for details)"); @@ -155,7 +158,7 @@ main(int argc, char **argv) } else if (pcmk__daemon_can_write(CRM_CONFIG_DIR, NULL) == FALSE) { exit_code = CRM_EX_FATAL; - crm_err("Terminating due to bad permissions on " CRM_CONFIG_DIR); + pcmk__err("Terminating due to bad permissions on " CRM_CONFIG_DIR); g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "Bad permissions on " CRM_CONFIG_DIR " (see logs for details)"); @@ -167,7 +170,7 @@ main(int argc, char **argv) goto done; } - pcmk__output_set_log_level(controld_globals.logger_out, LOG_TRACE); + pcmk__output_set_log_level(controld_globals.logger_out, PCMK__LOG_TRACE); done: g_strfreev(processed_args); @@ -191,16 +194,16 @@ main(int argc, char **argv) pcmk__cluster_init_node_caches(); state = s_crmd_fsa(C_STARTUP); if ((state != S_PENDING) && (state != S_STARTING)) { - crm_err("Controller startup failed " QB_XS " FSA state %s", - crm_system_name, fsa_state2string(state)); + pcmk__err("Controller startup failed " QB_XS " FSA state %s", + crm_system_name, fsa_state2string(state)); crmd_fast_exit(CRM_EX_ERROR); // Does not return } // Run mainloop controld_globals.mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(controld_globals.mainloop); - if (pcmk_is_set(controld_globals.fsa_input_register, R_STAYDOWN)) { - crm_info("Inhibiting automated respawn"); + if (pcmk__is_set(controld_globals.fsa_input_register, R_STAYDOWN)) { + pcmk__info("Inhibiting automated respawn"); exit_code = CRM_EX_FATAL; } crmd_fast_exit(exit_code); diff --git a/daemons/execd/cts-exec-helper.c b/daemons/execd/cts-exec-helper.c index 47ab5bbe382..4e7045ea12d 100644 --- a/daemons/execd/cts-exec-helper.c +++ b/daemons/execd/cts-exec-helper.c @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the Pacemaker project contributors + * Copyright 2012-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -16,6 +16,7 @@ #include #include #include +#include // crm_meta_name() #include #include @@ -171,7 +172,7 @@ test_exit(crm_exit_t exit_code) #define print_result(fmt, args...) \ if (!options.quiet) { \ - printf(fmt "\n" , ##args); \ + printf(fmt "\n", ##args); \ } #define report_event(event) \ @@ -181,7 +182,7 @@ test_exit(crm_exit_t exit_code) event->op_type ? event->op_type : "none", \ crm_exit_str((crm_exit_t) event->rc), \ pcmk_exec_status_str(event->op_status)); \ - crm_info("%s", event_buf_v0); + pcmk__info("%s", event_buf_v0); static void test_shutdown(int nsig) @@ -235,13 +236,13 @@ connection_events(lrmd_event_data_t * event) } if (!rc) { - crm_info("Executor client connection established"); + pcmk__info("Executor client connection established"); start_test(NULL); return; } else { sleep(1); try_connect(); - crm_notice("Executor client connection failed"); + pcmk__notice("Executor client connection failed"); } } @@ -469,7 +470,7 @@ generate_params(void) // Calculate cluster status scheduler = pcmk_new_scheduler(); if (scheduler == NULL) { - crm_crit("Could not allocate scheduler data"); + pcmk__crit("Could not allocate scheduler data"); return ENOMEM; } pcmk__set_scheduler_flags(scheduler, pcmk__sched_no_counts); @@ -483,7 +484,7 @@ generate_params(void) pcmk_rsc_match_history |pcmk_rsc_match_basename); if (rsc == NULL) { - crm_err("Resource does not exist in config"); + pcmk__err("Resource does not exist in config"); pcmk_free_scheduler(scheduler); return EINVAL; } @@ -610,7 +611,7 @@ main(int argc, char **argv) mainloop_set_trigger(trig); mainloop_add_signal(SIGTERM, test_shutdown); - crm_info("Starting"); + pcmk__info("Starting"); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); diff --git a/daemons/execd/execd_alerts.c b/daemons/execd/execd_alerts.c index bdf75f0477a..a3c1ec96973 100644 --- a/daemons/execd/execd_alerts.c +++ b/daemons/execd/execd_alerts.c @@ -18,6 +18,7 @@ #include #include #include +#include // xml2list() #include #include "pacemaker-execd.h" @@ -79,21 +80,19 @@ alert_complete(svc_action_t *action) if (action->status != PCMK_EXEC_DONE) { const char *reason = services__exit_reason(action); - crm_notice("Could not send alert: %s%s%s%s " QB_XS " client=%s", - pcmk_exec_status_str(action->status), - (reason == NULL)? "" : " (", - (reason == NULL)? "" : reason, - (reason == NULL)? "" : ")", - cb_data->client_id); + pcmk__notice("Could not send alert: %s%s%s%s " QB_XS " client=%s", + pcmk_exec_status_str(action->status), + (reason != NULL)? " (" : "", pcmk__s(reason, ""), + (reason != NULL)? ")" : "", cb_data->client_id); } else if (action->rc != 0) { - crm_notice("Alert [%d] completed but exited with status %d " - QB_XS " client=%s", - action->pid, action->rc, cb_data->client_id); + pcmk__notice("Alert [%d] completed but exited with status %d " + QB_XS " client=%s", + action->pid, action->rc, cb_data->client_id); } else { - crm_debug("Alert [%d] completed " QB_XS " client=%s", - action->pid, cb_data->client_id); + pcmk__debug("Alert [%d] completed " QB_XS " client=%s", action->pid, + cb_data->client_id); } free(cb_data->client_id); @@ -109,9 +108,8 @@ process_lrmd_alert_exec(pcmk__client_t *client, uint32_t id, xmlNode *request) xmlNode *alert_xml = pcmk__xpath_find_one(request->doc, "//" PCMK__XE_LRMD_ALERT, LOG_ERR); - const char *alert_id = crm_element_value(alert_xml, PCMK__XA_LRMD_ALERT_ID); - const char *alert_path = crm_element_value(alert_xml, - PCMK__XA_LRMD_ALERT_PATH); + const char *alert_id = pcmk__xe_get(alert_xml, PCMK__XA_LRMD_ALERT_ID); + const char *alert_path = pcmk__xe_get(alert_xml, PCMK__XA_LRMD_ALERT_PATH); svc_action_t *action = NULL; int alert_timeout = 0; int rc = pcmk_ok; @@ -127,9 +125,9 @@ process_lrmd_alert_exec(pcmk__client_t *client, uint32_t id, xmlNode *request) return pcmk_ok; } - crm_element_value_int(alert_xml, PCMK__XA_LRMD_TIMEOUT, &alert_timeout); + pcmk__xe_get_int(alert_xml, PCMK__XA_LRMD_TIMEOUT, &alert_timeout); - crm_info("Executing alert %s for %s", alert_id, client->id); + pcmk__info("Executing alert %s for %s", alert_id, client->id); params = xml2list(alert_xml); pcmk__add_alert_key_int(params, PCMK__alert_key_node_sequence, @@ -139,7 +137,7 @@ process_lrmd_alert_exec(pcmk__client_t *client, uint32_t id, xmlNode *request) cb_data->client_id = pcmk__str_copy(client->id); - crm_element_value_int(request, PCMK__XA_LRMD_CALLID, &(cb_data->call_id)); + pcmk__xe_get_int(request, PCMK__XA_LRMD_CALLID, &(cb_data->call_id)); action = services_alert_create(alert_id, alert_path, alert_timeout, params, alert_sequence_no, cb_data); @@ -175,8 +173,8 @@ drain_check(guint remaining_timeout_ms) guint count = g_hash_table_size(inflight_alerts); if (count > 0) { - crm_trace("%d alerts pending (%.3fs timeout remaining)", - count, remaining_timeout_ms / 1000.0); + pcmk__trace("%d alerts pending (%.3fs timeout remaining)", + count, (remaining_timeout_ms / 1000.0)); return TRUE; } } @@ -189,8 +187,8 @@ lrmd_drain_alerts(GMainLoop *mloop) if (inflight_alerts != NULL) { guint timer_ms = max_inflight_timeout() + 5000; - crm_trace("Draining in-flight alerts (timeout %.3fs)", - timer_ms / 1000.0); + pcmk__trace("Draining in-flight alerts (timeout %.3fs)", + (timer_ms / 1000.0)); draining_alerts = TRUE; pcmk_drain_main_loop(mloop, timer_ms, drain_check); g_hash_table_destroy(inflight_alerts); diff --git a/daemons/execd/execd_commands.c b/daemons/execd/execd_commands.c index e961d3d661a..d2739e60e4b 100644 --- a/daemons/execd/execd_commands.c +++ b/daemons/execd/execd_commands.c @@ -29,6 +29,7 @@ #include #include #include +#include // hash2smartfield() #include #include "pacemaker-execd.h" @@ -272,7 +273,7 @@ static const char * normalize_action_name(lrmd_rsc_t * rsc, const char *action) { if (pcmk__str_eq(action, PCMK_ACTION_MONITOR, pcmk__str_casei) && - pcmk_is_set(pcmk_get_ra_caps(rsc->class), pcmk_ra_cap_status)) { + pcmk__is_set(pcmk_get_ra_caps(rsc->class), pcmk_ra_cap_status)) { return PCMK_ACTION_STATUS; } return action; @@ -287,12 +288,12 @@ build_rsc_from_xml(xmlNode * msg) rsc = pcmk__assert_alloc(1, sizeof(lrmd_rsc_t)); - crm_element_value_int(msg, PCMK__XA_LRMD_CALLOPT, &rsc->call_opts); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_CALLOPT, &rsc->call_opts); - rsc->rsc_id = crm_element_value_copy(rsc_xml, PCMK__XA_LRMD_RSC_ID); - rsc->class = crm_element_value_copy(rsc_xml, PCMK__XA_LRMD_CLASS); - rsc->provider = crm_element_value_copy(rsc_xml, PCMK__XA_LRMD_PROVIDER); - rsc->type = crm_element_value_copy(rsc_xml, PCMK__XA_LRMD_TYPE); + rsc->rsc_id = pcmk__xe_get_copy(rsc_xml, PCMK__XA_LRMD_RSC_ID); + rsc->class = pcmk__xe_get_copy(rsc_xml, PCMK__XA_LRMD_CLASS); + rsc->provider = pcmk__xe_get_copy(rsc_xml, PCMK__XA_LRMD_PROVIDER); + rsc->type = pcmk__xe_get_copy(rsc_xml, PCMK__XA_LRMD_TYPE); rsc->work = mainloop_add_trigger(G_PRIORITY_HIGH, execute_resource_action, rsc); @@ -312,33 +313,31 @@ create_lrmd_cmd(xmlNode *msg, pcmk__client_t *client) cmd = pcmk__assert_alloc(1, sizeof(lrmd_cmd_t)); - crm_element_value_int(msg, PCMK__XA_LRMD_CALLOPT, &call_options); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_CALLOPT, &call_options); cmd->call_opts = call_options; cmd->client_id = pcmk__str_copy(client->id); - crm_element_value_int(msg, PCMK__XA_LRMD_CALLID, &cmd->call_id); - crm_element_value_ms(rsc_xml, PCMK__XA_LRMD_RSC_INTERVAL, - &cmd->interval_ms); - crm_element_value_int(rsc_xml, PCMK__XA_LRMD_TIMEOUT, &cmd->timeout); - crm_element_value_int(rsc_xml, PCMK__XA_LRMD_RSC_START_DELAY, - &cmd->start_delay); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_CALLID, &cmd->call_id); + pcmk__xe_get_guint(rsc_xml, PCMK__XA_LRMD_RSC_INTERVAL, &cmd->interval_ms); + pcmk__xe_get_int(rsc_xml, PCMK__XA_LRMD_TIMEOUT, &cmd->timeout); + pcmk__xe_get_int(rsc_xml, PCMK__XA_LRMD_RSC_START_DELAY, &cmd->start_delay); cmd->timeout_orig = cmd->timeout; - cmd->origin = crm_element_value_copy(rsc_xml, PCMK__XA_LRMD_ORIGIN); - cmd->action = crm_element_value_copy(rsc_xml, PCMK__XA_LRMD_RSC_ACTION); - cmd->userdata_str = crm_element_value_copy(rsc_xml, - PCMK__XA_LRMD_RSC_USERDATA_STR); - cmd->rsc_id = crm_element_value_copy(rsc_xml, PCMK__XA_LRMD_RSC_ID); + cmd->origin = pcmk__xe_get_copy(rsc_xml, PCMK__XA_LRMD_ORIGIN); + cmd->action = pcmk__xe_get_copy(rsc_xml, PCMK__XA_LRMD_RSC_ACTION); + cmd->userdata_str = pcmk__xe_get_copy(rsc_xml, + PCMK__XA_LRMD_RSC_USERDATA_STR); + cmd->rsc_id = pcmk__xe_get_copy(rsc_xml, PCMK__XA_LRMD_RSC_ID); cmd->params = xml2list(rsc_xml); if (pcmk__str_eq(g_hash_table_lookup(cmd->params, "CRM_meta_on_fail"), PCMK_VALUE_BLOCK, pcmk__str_casei)) { - crm_debug("Setting flag to leave pid group on timeout and " - "only kill action pid for " PCMK__OP_FMT, - cmd->rsc_id, cmd->action, cmd->interval_ms); + pcmk__debug("Setting flag to leave pid group on timeout and only kill " + "action pid for " PCMK__OP_FMT, + cmd->rsc_id, cmd->action, cmd->interval_ms); cmd->service_flags = pcmk__set_flags_as(__func__, __LINE__, - LOG_TRACE, "Action", + PCMK__LOG_TRACE, "Action", cmd->action, 0, SVC_ACTION_LEAVE_GROUP, "SVC_ACTION_LEAVE_GROUP"); @@ -484,10 +483,10 @@ merge_recurring_duplicate(lrmd_rsc_t * rsc, lrmd_cmd_t * cmd) /* This should not occur. If it does, we need to investigate how something * like this is possible in the controller. */ - crm_warn("Duplicate recurring op entry detected (" PCMK__OP_FMT - "), merging with previous op entry", - rsc->rsc_id, normalize_action_name(rsc, dup->action), - dup->interval_ms); + pcmk__warn("Duplicate recurring op entry detected (" PCMK__OP_FMT "), " + "merging with previous op entry", + rsc->rsc_id, normalize_action_name(rsc, dup->action), + dup->interval_ms); // Merge new action's call ID and user data into existing action dup->first_notify_sent = false; @@ -522,7 +521,7 @@ schedule_lrmd_cmd(lrmd_rsc_t * rsc, lrmd_cmd_t * cmd) CRM_CHECK(cmd != NULL, return); CRM_CHECK(rsc != NULL, return); - crm_trace("Scheduling %s on %s", cmd->action, rsc->rsc_id); + pcmk__trace("Scheduling %s on %s", cmd->action, rsc->rsc_id); if (merge_recurring_duplicate(rsc, cmd)) { // Equivalent of cmd has already been scheduled @@ -552,9 +551,9 @@ create_lrmd_reply(const char *origin, int rc, int call_id) { xmlNode *reply = pcmk__xe_create(NULL, PCMK__XE_LRMD_REPLY); - crm_xml_add(reply, PCMK__XA_LRMD_ORIGIN, origin); - crm_xml_add_int(reply, PCMK__XA_LRMD_RC, rc); - crm_xml_add_int(reply, PCMK__XA_LRMD_CALLID, call_id); + pcmk__xe_set(reply, PCMK__XA_LRMD_ORIGIN, origin); + pcmk__xe_set_int(reply, PCMK__XA_LRMD_RC, rc); + pcmk__xe_set_int(reply, PCMK__XA_LRMD_CALLID, call_id); return reply; } @@ -569,16 +568,16 @@ send_client_notify(gpointer key, gpointer value, gpointer user_data) CRM_CHECK(client != NULL, return); if (client->name == NULL) { - crm_trace("Skipping notification to client without name"); + pcmk__trace("Skipping notification to client without name"); return; } - if (pcmk_is_set(client->flags, pcmk__client_to_proxy)) { + if (pcmk__is_set(client->flags, pcmk__client_to_proxy)) { /* We only want to notify clients of the executor IPC API. If we are * running as Pacemaker Remote, we may have clients proxied to other * IPC services in the cluster, so skip those. */ - crm_trace("Skipping executor API notification to client %s", - pcmk__client_name(client)); + pcmk__trace("Skipping executor API notification to client %s", + pcmk__client_name(client)); return; } @@ -619,7 +618,7 @@ send_cmd_complete_notify(lrmd_cmd_t * cmd) * operation results, skip the notification if the result hasn't changed. */ if (cmd->first_notify_sent - && pcmk_is_set(cmd->call_opts, lrmd_opt_notify_changes_only) + && pcmk__is_set(cmd->call_opts, lrmd_opt_notify_changes_only) && (cmd->last_notify_rc == cmd->result.exit_status) && (cmd->last_notify_op_status == cmd->result.execution_status)) { return; @@ -631,42 +630,40 @@ send_cmd_complete_notify(lrmd_cmd_t * cmd) notify = pcmk__xe_create(NULL, PCMK__XE_LRMD_NOTIFY); - crm_xml_add(notify, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add_int(notify, PCMK__XA_LRMD_TIMEOUT, cmd->timeout); - crm_xml_add_ms(notify, PCMK__XA_LRMD_RSC_INTERVAL, cmd->interval_ms); - crm_xml_add_int(notify, PCMK__XA_LRMD_RSC_START_DELAY, cmd->start_delay); - crm_xml_add_int(notify, PCMK__XA_LRMD_EXEC_RC, cmd->result.exit_status); - crm_xml_add_int(notify, PCMK__XA_LRMD_EXEC_OP_STATUS, - cmd->result.execution_status); - crm_xml_add_int(notify, PCMK__XA_LRMD_CALLID, cmd->call_id); - crm_xml_add_int(notify, PCMK__XA_LRMD_RSC_DELETED, cmd->rsc_deleted); - - crm_xml_add_ll(notify, PCMK__XA_LRMD_RUN_TIME, - (long long) cmd->epoch_last_run); - crm_xml_add_ll(notify, PCMK__XA_LRMD_RCCHANGE_TIME, - (long long) cmd->epoch_rcchange); + pcmk__xe_set(notify, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_TIMEOUT, cmd->timeout); + pcmk__xe_set_guint(notify, PCMK__XA_LRMD_RSC_INTERVAL, cmd->interval_ms); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_RSC_START_DELAY, cmd->start_delay); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_EXEC_RC, cmd->result.exit_status); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_EXEC_OP_STATUS, + cmd->result.execution_status); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_CALLID, cmd->call_id); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_RSC_DELETED, cmd->rsc_deleted); + + pcmk__xe_set_time(notify, PCMK__XA_LRMD_RUN_TIME, cmd->epoch_last_run); + pcmk__xe_set_time(notify, PCMK__XA_LRMD_RCCHANGE_TIME, cmd->epoch_rcchange); #ifdef PCMK__TIME_USE_CGT - crm_xml_add_int(notify, PCMK__XA_LRMD_EXEC_TIME, exec_time); - crm_xml_add_int(notify, PCMK__XA_LRMD_QUEUE_TIME, queue_time); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_EXEC_TIME, exec_time); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_QUEUE_TIME, queue_time); #endif - crm_xml_add(notify, PCMK__XA_LRMD_OP, LRMD_OP_RSC_EXEC); - crm_xml_add(notify, PCMK__XA_LRMD_RSC_ID, cmd->rsc_id); + pcmk__xe_set(notify, PCMK__XA_LRMD_OP, LRMD_OP_RSC_EXEC); + pcmk__xe_set(notify, PCMK__XA_LRMD_RSC_ID, cmd->rsc_id); if(cmd->real_action) { - crm_xml_add(notify, PCMK__XA_LRMD_RSC_ACTION, cmd->real_action); + pcmk__xe_set(notify, PCMK__XA_LRMD_RSC_ACTION, cmd->real_action); } else { - crm_xml_add(notify, PCMK__XA_LRMD_RSC_ACTION, cmd->action); + pcmk__xe_set(notify, PCMK__XA_LRMD_RSC_ACTION, cmd->action); } - crm_xml_add(notify, PCMK__XA_LRMD_RSC_USERDATA_STR, cmd->userdata_str); - crm_xml_add(notify, PCMK__XA_LRMD_RSC_EXIT_REASON, cmd->result.exit_reason); + pcmk__xe_set(notify, PCMK__XA_LRMD_RSC_USERDATA_STR, cmd->userdata_str); + pcmk__xe_set(notify, PCMK__XA_LRMD_RSC_EXIT_REASON, cmd->result.exit_reason); if (cmd->result.action_stderr != NULL) { - crm_xml_add(notify, PCMK__XA_LRMD_RSC_OUTPUT, - cmd->result.action_stderr); + pcmk__xe_set(notify, PCMK__XA_LRMD_RSC_OUTPUT, + cmd->result.action_stderr); } else if (cmd->result.action_stdout != NULL) { - crm_xml_add(notify, PCMK__XA_LRMD_RSC_OUTPUT, - cmd->result.action_stdout); + pcmk__xe_set(notify, PCMK__XA_LRMD_RSC_OUTPUT, + cmd->result.action_stdout); } if (cmd->params) { @@ -682,7 +679,7 @@ send_cmd_complete_notify(lrmd_cmd_t * cmd) } } if ((cmd->client_id != NULL) - && pcmk_is_set(cmd->call_opts, lrmd_opt_notify_orig_only)) { + && pcmk__is_set(cmd->call_opts, lrmd_opt_notify_orig_only)) { pcmk__client_t *client = pcmk__find_client_by_id(cmd->client_id); @@ -705,17 +702,17 @@ send_generic_notify(int rc, xmlNode * request) xmlNode *rsc_xml = pcmk__xpath_find_one(request->doc, "//" PCMK__XE_LRMD_RSC, LOG_ERR); - const char *rsc_id = crm_element_value(rsc_xml, PCMK__XA_LRMD_RSC_ID); - const char *op = crm_element_value(request, PCMK__XA_LRMD_OP); + const char *rsc_id = pcmk__xe_get(rsc_xml, PCMK__XA_LRMD_RSC_ID); + const char *op = pcmk__xe_get(request, PCMK__XA_LRMD_OP); - crm_element_value_int(request, PCMK__XA_LRMD_CALLID, &call_id); + pcmk__xe_get_int(request, PCMK__XA_LRMD_CALLID, &call_id); notify = pcmk__xe_create(NULL, PCMK__XE_LRMD_NOTIFY); - crm_xml_add(notify, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add_int(notify, PCMK__XA_LRMD_RC, rc); - crm_xml_add_int(notify, PCMK__XA_LRMD_CALLID, call_id); - crm_xml_add(notify, PCMK__XA_LRMD_OP, op); - crm_xml_add(notify, PCMK__XA_LRMD_RSC_ID, rsc_id); + pcmk__xe_set(notify, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_RC, rc); + pcmk__xe_set_int(notify, PCMK__XA_LRMD_CALLID, call_id); + pcmk__xe_set(notify, PCMK__XA_LRMD_OP, op); + pcmk__xe_set(notify, PCMK__XA_LRMD_RSC_ID, rsc_id); pcmk__foreach_ipc_client(send_client_notify, notify); @@ -740,8 +737,9 @@ cmd_reset(lrmd_cmd_t * cmd) static void cmd_finalize(lrmd_cmd_t * cmd, lrmd_rsc_t * rsc) { - crm_trace("Resource operation rsc:%s action:%s completed (%p %p)", cmd->rsc_id, cmd->action, - rsc ? rsc->active : NULL, cmd); + pcmk__trace("Resource operation rsc:%s action:%s completed (%p %p)", + cmd->rsc_id, cmd->action, ((rsc != NULL)? rsc->active : NULL), + cmd); if (rsc && (rsc->active == cmd)) { rsc->active = NULL; @@ -799,8 +797,8 @@ notify_of_new_client(pcmk__client_t *new_client) data.new_client = new_client; data.notify = pcmk__xe_create(NULL, PCMK__XE_LRMD_NOTIFY); - crm_xml_add(data.notify, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add(data.notify, PCMK__XA_LRMD_OP, LRMD_OP_NEW_CLIENT); + pcmk__xe_set(data.notify, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data.notify, PCMK__XA_LRMD_OP, LRMD_OP_NEW_CLIENT); pcmk__foreach_ipc_client(notify_one_client, &data); pcmk__xml_free(data.notify); } @@ -814,7 +812,7 @@ client_disconnect_cleanup(const char *client_id) g_hash_table_iter_init(&iter, rsc_list); while (g_hash_table_iter_next(&iter, (gpointer *) & key, (gpointer *) & rsc)) { - if (pcmk_all_flags_set(rsc->call_opts, lrmd_opt_drop_recurring)) { + if (pcmk__is_set(rsc->call_opts, lrmd_opt_drop_recurring)) { /* This client is disconnecting, drop any recurring operations * it may have initiated on the resource */ cancel_all_recurring(rsc, client_id); @@ -838,8 +836,9 @@ action_complete(svc_action_t * action) #endif if (!cmd) { - crm_err("Completed executor action (%s) does not match any known operations", - action->id); + pcmk__err("Completed executor action (%s) does not match any known " + "operations", + action->id); return; } @@ -909,11 +908,11 @@ action_complete(svc_action_t * action) int time_sum = time_diff_ms(NULL, &(cmd->t_first_run)); int timeout_left = cmd->timeout_orig - time_sum; - crm_debug("%s systemd %s is now complete (elapsed=%dms, " - "remaining=%dms): %s (%d)", - cmd->rsc_id, cmd->real_action, time_sum, timeout_left, - crm_exit_str(cmd->result.exit_status), - cmd->result.exit_status); + pcmk__debug("%s systemd %s is now complete (elapsed=%dms, " + "remaining=%dms): %s (%d)", + cmd->rsc_id, cmd->real_action, time_sum, timeout_left, + crm_exit_str(cmd->result.exit_status), + cmd->result.exit_status); cmd_original_times(cmd); // Monitors may return "not running", but start/stop shouldn't @@ -940,10 +939,12 @@ action_complete(svc_action_t * action) int time_left = time(NULL) - (cmd->epoch_rcchange + (cmd->timeout_orig/1000)); if (time_left >= 0) { - crm_notice("Giving up on %s %s (rc=%d): monitor pending timeout " - "(first pending notification=%s timeout=%ds)", - cmd->rsc_id, cmd->action, cmd->result.exit_status, - pcmk__trim(ctime(&cmd->epoch_rcchange)), cmd->timeout_orig); + pcmk__notice("Giving up on %s %s (rc=%d): monitor pending " + "timeout (first pending notification=%s " + "timeout=%ds)", + cmd->rsc_id, cmd->action, cmd->result.exit_status, + pcmk__trim(ctime(&cmd->epoch_rcchange)), + cmd->timeout_orig); pcmk__set_result(&(cmd->result), PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_TIMEOUT, "Investigate reason for timeout, and adjust " @@ -971,21 +972,24 @@ action_complete(svc_action_t * action) cmd->timeout = timeout_left; if (pcmk__result_ok(&(cmd->result))) { - crm_debug("%s %s may still be in progress: re-scheduling (elapsed=%dms, remaining=%dms, start_delay=%dms)", - cmd->rsc_id, cmd->real_action, time_sum, timeout_left, delay); + pcmk__debug("%s %s may still be in progress: re-scheduling " + "(elapsed=%dms, remaining=%dms, start_delay=%dms)", + cmd->rsc_id, cmd->real_action, time_sum, timeout_left, + delay); } else if (cmd->result.execution_status == PCMK_EXEC_PENDING) { - crm_info("%s %s is still in progress: re-scheduling (elapsed=%dms, remaining=%dms, start_delay=%dms)", - cmd->rsc_id, cmd->action, time_sum, timeout_left, delay); + pcmk__info("%s %s is still in progress: re-scheduling " + "(elapsed=%dms, remaining=%dms, start_delay=%dms)", + cmd->rsc_id, cmd->action, time_sum, timeout_left, delay); } else { - crm_notice("%s %s failed: %s: Re-scheduling (remaining " - "timeout %s) " QB_XS - " exitstatus=%d elapsed=%dms start_delay=%dms)", - cmd->rsc_id, cmd->action, - crm_exit_str(cmd->result.exit_status), - pcmk__readable_interval(timeout_left), - cmd->result.exit_status, time_sum, delay); + pcmk__notice("%s %s failed: %s: Re-scheduling (remaining timeout " + "%s) " + QB_XS " exitstatus=%d elapsed=%dms start_delay=%dms)", + cmd->rsc_id, cmd->action, + crm_exit_str(cmd->result.exit_status), + pcmk__readable_interval(timeout_left), + cmd->result.exit_status, time_sum, delay); } cmd_reset(cmd); @@ -998,10 +1002,10 @@ action_complete(svc_action_t * action) return; } else { - crm_notice("Giving up on %s %s (rc=%d): timeout (elapsed=%dms, remaining=%dms)", - cmd->rsc_id, - (cmd->real_action? cmd->real_action : cmd->action), - cmd->result.exit_status, time_sum, timeout_left); + pcmk__notice("Giving up on %s %s (rc=%d): timeout (elapsed=%dms, " + "remaining=%dms)", + cmd->rsc_id, pcmk__s(cmd->real_action, cmd->action), + cmd->result.exit_status, time_sum, timeout_left); pcmk__set_result(&(cmd->result), PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_TIMEOUT, "Investigate reason for timeout, and adjust " @@ -1119,8 +1123,8 @@ static void lrmd_stonith_callback(stonith_t * stonith, stonith_callback_data_t * data) { if ((data == NULL) || (data->userdata == NULL)) { - crm_err("Ignoring fence action result: " - "Invalid callback arguments (bug?)"); + pcmk__err("Ignoring fence action result: Invalid callback arguments " + "(bug?)"); } else { stonith_action_complete((lrmd_cmd_t *) data->userdata, stonith__exit_status(data), @@ -1135,8 +1139,8 @@ stonith_connection_failed(void) GHashTableIter iter; lrmd_rsc_t *rsc = NULL; - crm_warn("Connection to fencer lost (any pending operations for " - "fence devices will be considered failed)"); + pcmk__warn("Connection to fencer lost (any pending operations for fence " + "devices will be considered failed)"); g_hash_table_iter_init(&iter, rsc_list); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &rsc)) { @@ -1344,8 +1348,9 @@ execute_nonstonith_action(lrmd_rsc_t *rsc, lrmd_cmd_t *cmd) pcmk__assert((rsc != NULL) && (cmd != NULL)); - crm_trace("Creating action, resource:%s action:%s class:%s provider:%s agent:%s", - rsc->rsc_id, cmd->action, rsc->class, rsc->provider, rsc->type); + pcmk__trace("Creating action, resource:%s action:%s class:%s provider:%s " + "agent:%s", + rsc->rsc_id, cmd->action, rsc->class, rsc->provider, rsc->type); params_copy = pcmk__str_table_dup(cmd->params); @@ -1402,7 +1407,7 @@ execute_resource_action(gpointer user_data) CRM_CHECK(rsc != NULL, return FALSE); if (rsc->active) { - crm_trace("%s is still active", rsc->rsc_id); + pcmk__trace("%s is still active", rsc->rsc_id); return TRUE; } @@ -1411,9 +1416,9 @@ execute_resource_action(gpointer user_data) cmd = first->data; if (cmd->delay_id) { - crm_trace - ("Command %s %s was asked to run too early, waiting for start_delay timeout of %dms", - cmd->rsc_id, cmd->action, cmd->start_delay); + pcmk__trace("Command %s %s was asked to run too early, waiting for " + "start_delay timeout of %dms", + cmd->rsc_id, cmd->action, cmd->start_delay); return TRUE; } rsc->pending_ops = g_list_remove_link(rsc->pending_ops, first); @@ -1426,7 +1431,7 @@ execute_resource_action(gpointer user_data) } if (!cmd) { - crm_trace("Nothing further to do for %s", rsc->rsc_id); + pcmk__trace("Nothing further to do for %s", rsc->rsc_id); return TRUE; } @@ -1512,22 +1517,25 @@ process_lrmd_signon(pcmk__client_t *client, xmlNode *request, int call_id, { int rc = pcmk_ok; time_t now = time(NULL); - const char *protocol_version = - crm_element_value(request, PCMK__XA_LRMD_PROTOCOL_VERSION); + const char *protocol_version = pcmk__xe_get(request, + PCMK__XA_LRMD_PROTOCOL_VERSION); const char *start_state = pcmk__env_option(PCMK__ENV_NODE_START_STATE); - if (compare_version(protocol_version, LRMD_COMPATIBLE_PROTOCOL) < 0) { - crm_err("Cluster API version must be greater than or equal to %s, not %s", - LRMD_COMPATIBLE_PROTOCOL, protocol_version); + if (pcmk__compare_versions(protocol_version, + LRMD_COMPATIBLE_PROTOCOL) < 0) { + + pcmk__err("Cluster API version must be greater than or equal to " + LRMD_COMPATIBLE_PROTOCOL " , not %s", + protocol_version); rc = -EPROTO; } if (pcmk__xe_attr_is_true(request, PCMK__XA_LRMD_IS_IPC_PROVIDER)) { #ifdef PCMK__COMPILE_REMOTE if ((client->remote != NULL) - && pcmk_is_set(client->flags, - pcmk__client_tls_handshake_complete)) { - const char *op = crm_element_value(request, PCMK__XA_LRMD_OP); + && pcmk__is_set(client->flags, + pcmk__client_tls_handshake_complete)) { + const char *op = pcmk__xe_get(request, PCMK__XA_LRMD_OP); // This is a remote connection from a cluster node's controller ipc_proxy_add_provider(client); @@ -1557,13 +1565,13 @@ process_lrmd_signon(pcmk__client_t *client, xmlNode *request, int call_id, } *reply = create_lrmd_reply(__func__, rc, call_id); - crm_xml_add(*reply, PCMK__XA_LRMD_OP, CRM_OP_REGISTER); - crm_xml_add(*reply, PCMK__XA_LRMD_CLIENTID, client->id); - crm_xml_add(*reply, PCMK__XA_LRMD_PROTOCOL_VERSION, LRMD_PROTOCOL_VERSION); - crm_xml_add_ll(*reply, PCMK__XA_UPTIME, now - start_time); + pcmk__xe_set(*reply, PCMK__XA_LRMD_OP, CRM_OP_REGISTER); + pcmk__xe_set(*reply, PCMK__XA_LRMD_CLIENTID, client->id); + pcmk__xe_set(*reply, PCMK__XA_LRMD_PROTOCOL_VERSION, LRMD_PROTOCOL_VERSION); + pcmk__xe_set_time(*reply, PCMK__XA_UPTIME, now - start_time); if (start_state) { - crm_xml_add(*reply, PCMK__XA_NODE_START_STATE, start_state); + pcmk__xe_set(*reply, PCMK__XA_NODE_START_STATE, start_state); } return rc; @@ -1580,13 +1588,13 @@ process_lrmd_rsc_register(pcmk__client_t *client, uint32_t id, xmlNode *request) pcmk__str_eq(rsc->class, dup->class, pcmk__str_casei) && pcmk__str_eq(rsc->provider, dup->provider, pcmk__str_casei) && pcmk__str_eq(rsc->type, dup->type, pcmk__str_casei)) { - crm_notice("Ignoring duplicate registration of '%s'", rsc->rsc_id); + pcmk__notice("Ignoring duplicate registration of '%s'", rsc->rsc_id); free_rsc(rsc); return rc; } g_hash_table_replace(rsc_list, rsc->rsc_id, rsc); - crm_info("Cached agent information for '%s'", rsc->rsc_id); + pcmk__info("Cached agent information for '%s'", rsc->rsc_id); return rc; } @@ -1597,7 +1605,7 @@ process_lrmd_get_rsc_info(xmlNode *request, int call_id) xmlNode *rsc_xml = pcmk__xpath_find_one(request->doc, "//" PCMK__XE_LRMD_RSC, LOG_ERR); - const char *rsc_id = crm_element_value(rsc_xml, PCMK__XA_LRMD_RSC_ID); + const char *rsc_id = pcmk__xe_get(rsc_xml, PCMK__XA_LRMD_RSC_ID); xmlNode *reply = NULL; lrmd_rsc_t *rsc = NULL; @@ -1606,17 +1614,17 @@ process_lrmd_get_rsc_info(xmlNode *request, int call_id) } else { rsc = g_hash_table_lookup(rsc_list, rsc_id); if (rsc == NULL) { - crm_info("Agent information for '%s' not in cache", rsc_id); + pcmk__info("Agent information for '%s' not in cache", rsc_id); rc = -ENODEV; } } reply = create_lrmd_reply(__func__, rc, call_id); if (rsc) { - crm_xml_add(reply, PCMK__XA_LRMD_RSC_ID, rsc->rsc_id); - crm_xml_add(reply, PCMK__XA_LRMD_CLASS, rsc->class); - crm_xml_add(reply, PCMK__XA_LRMD_PROVIDER, rsc->provider); - crm_xml_add(reply, PCMK__XA_LRMD_TYPE, rsc->type); + pcmk__xe_set(reply, PCMK__XA_LRMD_RSC_ID, rsc->rsc_id); + pcmk__xe_set(reply, PCMK__XA_LRMD_CLASS, rsc->class); + pcmk__xe_set(reply, PCMK__XA_LRMD_PROVIDER, rsc->provider); + pcmk__xe_set(reply, PCMK__XA_LRMD_TYPE, rsc->type); } return reply; } @@ -1630,7 +1638,7 @@ process_lrmd_rsc_unregister(pcmk__client_t *client, uint32_t id, xmlNode *rsc_xml = pcmk__xpath_find_one(request->doc, "//" PCMK__XE_LRMD_RSC, LOG_ERR); - const char *rsc_id = crm_element_value(rsc_xml, PCMK__XA_LRMD_RSC_ID); + const char *rsc_id = pcmk__xe_get(rsc_xml, PCMK__XA_LRMD_RSC_ID); if (!rsc_id) { return -ENODEV; @@ -1638,15 +1646,17 @@ process_lrmd_rsc_unregister(pcmk__client_t *client, uint32_t id, rsc = g_hash_table_lookup(rsc_list, rsc_id); if (rsc == NULL) { - crm_info("Ignoring unregistration of resource '%s', which is not registered", - rsc_id); + pcmk__info("Ignoring unregistration of resource '%s', which is not " + "registered", + rsc_id); return pcmk_ok; } if (rsc->active) { /* let the caller know there are still active ops on this rsc to watch for */ - crm_trace("Operation (%p) still in progress for unregistered resource %s", - rsc->active, rsc_id); + pcmk__trace("Operation (%p) still in progress for unregistered " + "resource %s", + rsc->active, rsc_id); rc = -EINPROGRESS; } @@ -1663,15 +1673,15 @@ process_lrmd_rsc_exec(pcmk__client_t *client, uint32_t id, xmlNode *request) xmlNode *rsc_xml = pcmk__xpath_find_one(request->doc, "//" PCMK__XE_LRMD_RSC, LOG_ERR); - const char *rsc_id = crm_element_value(rsc_xml, PCMK__XA_LRMD_RSC_ID); + const char *rsc_id = pcmk__xe_get(rsc_xml, PCMK__XA_LRMD_RSC_ID); int call_id; if (!rsc_id) { return -EINVAL; } if (!(rsc = g_hash_table_lookup(rsc_list, rsc_id))) { - crm_info("Resource '%s' not found (%d active resources)", - rsc_id, g_hash_table_size(rsc_list)); + pcmk__info("Resource '%s' not found (%d active resources)", rsc_id, + g_hash_table_size(rsc_list)); return -ENODEV; } @@ -1788,11 +1798,11 @@ process_lrmd_rsc_cancel(pcmk__client_t *client, uint32_t id, xmlNode *request) xmlNode *rsc_xml = pcmk__xpath_find_one(request->doc, "//" PCMK__XE_LRMD_RSC, LOG_ERR); - const char *rsc_id = crm_element_value(rsc_xml, PCMK__XA_LRMD_RSC_ID); - const char *action = crm_element_value(rsc_xml, PCMK__XA_LRMD_RSC_ACTION); + const char *rsc_id = pcmk__xe_get(rsc_xml, PCMK__XA_LRMD_RSC_ID); + const char *action = pcmk__xe_get(rsc_xml, PCMK__XA_LRMD_RSC_ACTION); guint interval_ms = 0; - crm_element_value_ms(rsc_xml, PCMK__XA_LRMD_RSC_INTERVAL, &interval_ms); + pcmk__xe_get_guint(rsc_xml, PCMK__XA_LRMD_RSC_INTERVAL, &interval_ms); if (!rsc_id || !action) { return -EINVAL; @@ -1806,15 +1816,16 @@ add_recurring_op_xml(xmlNode *reply, lrmd_rsc_t *rsc) { xmlNode *rsc_xml = pcmk__xe_create(reply, PCMK__XE_LRMD_RSC); - crm_xml_add(rsc_xml, PCMK__XA_LRMD_RSC_ID, rsc->rsc_id); + pcmk__xe_set(rsc_xml, PCMK__XA_LRMD_RSC_ID, rsc->rsc_id); for (GList *item = rsc->recurring_ops; item != NULL; item = item->next) { lrmd_cmd_t *cmd = item->data; xmlNode *op_xml = pcmk__xe_create(rsc_xml, PCMK__XE_LRMD_RSC_OP); - crm_xml_add(op_xml, PCMK__XA_LRMD_RSC_ACTION, - pcmk__s(cmd->real_action, cmd->action)); - crm_xml_add_ms(op_xml, PCMK__XA_LRMD_RSC_INTERVAL, cmd->interval_ms); - crm_xml_add_int(op_xml, PCMK__XA_LRMD_TIMEOUT, cmd->timeout_orig); + pcmk__xe_set(op_xml, PCMK__XA_LRMD_RSC_ACTION, + pcmk__s(cmd->real_action, cmd->action)); + pcmk__xe_set_guint(op_xml, PCMK__XA_LRMD_RSC_INTERVAL, + cmd->interval_ms); + pcmk__xe_set_int(op_xml, PCMK__XA_LRMD_TIMEOUT, cmd->timeout_orig); } } @@ -1833,15 +1844,15 @@ process_lrmd_get_recurring(xmlNode *request, int call_id) rsc_xml = pcmk__xe_first_child(rsc_xml, PCMK__XE_LRMD_RSC, NULL, NULL); } if (rsc_xml) { - rsc_id = crm_element_value(rsc_xml, PCMK__XA_LRMD_RSC_ID); + rsc_id = pcmk__xe_get(rsc_xml, PCMK__XA_LRMD_RSC_ID); } // If resource ID is specified, resource must exist if (rsc_id != NULL) { rsc = g_hash_table_lookup(rsc_list, rsc_id); if (rsc == NULL) { - crm_info("Resource '%s' not found (%d active resources)", - rsc_id, g_hash_table_size(rsc_list)); + pcmk__info("Resource '%s' not found (%d active resources)", rsc_id, + g_hash_table_size(rsc_list)); rc = -ENODEV; } } @@ -1869,7 +1880,7 @@ process_lrmd_message(pcmk__client_t *client, uint32_t id, xmlNode *request) { int rc = pcmk_ok; int call_id = 0; - const char *op = crm_element_value(request, PCMK__XA_LRMD_OP); + const char *op = pcmk__xe_get(request, PCMK__XA_LRMD_OP); int do_reply = 0; int do_notify = 0; xmlNode *reply = NULL; @@ -1878,10 +1889,10 @@ process_lrmd_message(pcmk__client_t *client, uint32_t id, xmlNode *request) * hacluster), because they would otherwise provide a means of bypassing * ACLs. */ - bool allowed = pcmk_is_set(client->flags, pcmk__client_privileged); + bool allowed = pcmk__is_set(client->flags, pcmk__client_privileged); - crm_trace("Processing %s operation from %s", op, client->id); - crm_element_value_int(request, PCMK__XA_LRMD_CALLID, &call_id); + pcmk__trace("Processing %s operation from %s", op, client->id); + pcmk__xe_get_int(request, PCMK__XA_LRMD_CALLID, &call_id); if (pcmk__str_eq(op, CRM_OP_IPC_FWD, pcmk__str_none)) { #ifdef PCMK__COMPILE_REMOTE @@ -1950,7 +1961,7 @@ process_lrmd_message(pcmk__client_t *client, uint32_t id, xmlNode *request) const char *timeout = NULL; CRM_LOG_ASSERT(data != NULL); - timeout = crm_element_value(data, PCMK__XA_LRMD_WATCHDOG); + timeout = pcmk__xe_get(data, PCMK__XA_LRMD_WATCHDOG); pcmk__valid_stonith_watchdog_timeout(timeout); } else { rc = -EACCES; @@ -1972,17 +1983,17 @@ process_lrmd_message(pcmk__client_t *client, uint32_t id, xmlNode *request) } else { rc = -EOPNOTSUPP; do_reply = 1; - crm_err("Unknown IPC request '%s' from client %s", - op, pcmk__client_name(client)); + pcmk__err("Unknown IPC request '%s' from client %s", op, + pcmk__client_name(client)); } if (rc == -EACCES) { - crm_warn("Rejecting IPC request '%s' from unprivileged client %s", - op, pcmk__client_name(client)); + pcmk__warn("Rejecting IPC request '%s' from unprivileged client %s", op, + pcmk__client_name(client)); } - crm_debug("Processed %s operation from %s: rc=%d, reply=%d, notify=%d", - op, client->id, rc, do_reply, do_notify); + pcmk__debug("Processed %s operation from %s: rc=%d, reply=%d, notify=%d", + op, client->id, rc, do_reply, do_notify); if (do_reply) { int send_rc = pcmk_rc_ok; @@ -1993,8 +2004,9 @@ process_lrmd_message(pcmk__client_t *client, uint32_t id, xmlNode *request) send_rc = lrmd_server_send_reply(client, id, reply); pcmk__xml_free(reply); if (send_rc != pcmk_rc_ok) { - crm_warn("Reply to client %s failed: %s " QB_XS " rc=%d", - pcmk__client_name(client), pcmk_rc_str(send_rc), send_rc); + pcmk__warn("Reply to client %s failed: %s " QB_XS " rc=%d", + pcmk__client_name(client), pcmk_rc_str(send_rc), + send_rc); } } diff --git a/daemons/execd/pacemaker-execd.c b/daemons/execd/pacemaker-execd.c index c32f6b26aa2..0dee5a7cbb9 100644 --- a/daemons/execd/pacemaker-execd.c +++ b/daemons/execd/pacemaker-execd.c @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the Pacemaker project contributors + * Copyright 2012-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -76,13 +76,15 @@ get_stonith_connection(void) stonith_api = stonith_api_new(); if (stonith_api == NULL) { - crm_err("Could not connect to fencer: API memory allocation failed"); + pcmk__err("Could not connect to fencer: API memory allocation " + "failed"); return NULL; } 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 " - QB_XS " rc=%d", pcmk_strerror(rc), rc); + pcmk__err("Could not connect to fencer in 10 attempts: %s " + QB_XS " rc=%d", + pcmk_strerror(rc), rc); stonith_api_delete(stonith_api); stonith_api = NULL; } else { @@ -99,7 +101,7 @@ get_stonith_connection(void) static int32_t lrmd_ipc_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) { - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); if (pcmk__new_client(c, uid, gid) == NULL) { return -ENOMEM; } @@ -111,7 +113,7 @@ lrmd_ipc_created(qb_ipcs_connection_t * c) { pcmk__client_t *new_client = pcmk__find_client(c); - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); pcmk__assert(new_client != NULL); /* Now that the connection is offically established, alert * the other clients a new connection exists. */ @@ -127,12 +129,13 @@ lrmd_ipc_dispatch(qb_ipcs_connection_t * c, void *data, size_t size) pcmk__client_t *client = pcmk__find_client(c); xmlNode *request = pcmk__client_data2xml(client, data, &id, &flags); - CRM_CHECK(client != NULL, crm_err("Invalid client"); + CRM_CHECK(client != NULL, pcmk__err("Invalid client"); return FALSE); - CRM_CHECK(client->id != NULL, crm_err("Invalid client: %p", client); + CRM_CHECK(client->id != NULL, pcmk__err("Invalid client: %p", client); return FALSE); - CRM_CHECK(flags & crm_ipc_client_response, crm_err("Invalid client request: %p", client); + CRM_CHECK(pcmk__is_set(flags, crm_ipc_client_response), + pcmk__err("Invalid client request: %p", client); return FALSE); if (!request) { @@ -144,8 +147,7 @@ lrmd_ipc_dispatch(qb_ipcs_connection_t * c, void *data, size_t size) */ if (!client->name) { - const char *value = crm_element_value(request, - PCMK__XA_LRMD_CLIENTNAME); + const char *value = pcmk__xe_get(request, PCMK__XA_LRMD_CLIENTNAME); if (value == NULL) { client->name = pcmk__itoa(pcmk__client_pid(c)); @@ -159,9 +161,9 @@ lrmd_ipc_dispatch(qb_ipcs_connection_t * c, void *data, size_t size) lrmd_call_id = 1; } - crm_xml_add(request, PCMK__XA_LRMD_CLIENTID, client->id); - crm_xml_add(request, PCMK__XA_LRMD_CLIENTNAME, client->name); - crm_xml_add_int(request, PCMK__XA_LRMD_CALLID, lrmd_call_id); + pcmk__xe_set(request, PCMK__XA_LRMD_CLIENTID, client->id); + pcmk__xe_set(request, PCMK__XA_LRMD_CLIENTNAME, client->name); + pcmk__xe_set_int(request, PCMK__XA_LRMD_CALLID, lrmd_call_id); process_lrmd_message(client, id, request); @@ -199,7 +201,7 @@ lrmd_ipc_closed(qb_ipcs_connection_t * c) return 0; } - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); client_disconnect_cleanup(client->id); #ifdef PCMK__COMPILE_REMOTE ipc_proxy_remove_provider(client); @@ -212,7 +214,7 @@ static void lrmd_ipc_destroy(qb_ipcs_connection_t * c) { lrmd_ipc_closed(c); - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); } static struct qb_ipcs_service_handlers lrmd_ipc_callbacks = { @@ -227,7 +229,7 @@ static struct qb_ipcs_service_handlers lrmd_ipc_callbacks = { int lrmd_server_send_reply(pcmk__client_t *client, uint32_t id, xmlNode *reply) { - crm_trace("Sending reply (%d) to client (%s)", id, client->id); + pcmk__trace("Sending reply (%d) to client (%s)", id, client->id); switch (PCMK__CLIENT_TYPE(client)) { case pcmk__client_ipc: return pcmk__ipc_send_xml(client, id, reply, FALSE); @@ -236,9 +238,9 @@ lrmd_server_send_reply(pcmk__client_t *client, uint32_t id, xmlNode *reply) return lrmd__remote_send_xml(client->remote, reply, id, "reply"); #endif default: - crm_err("Could not send reply: unknown type for client %s " - QB_XS " flags=%#llx", - pcmk__client_name(client), client->flags); + pcmk__err("Could not send reply: unknown type for client %s " + QB_XS " flags=%#llx", + pcmk__client_name(client), client->flags); } return ENOTCONN; } @@ -247,27 +249,27 @@ lrmd_server_send_reply(pcmk__client_t *client, uint32_t id, xmlNode *reply) int lrmd_server_send_notify(pcmk__client_t *client, xmlNode *msg) { - crm_trace("Sending notification to client (%s)", client->id); + pcmk__trace("Sending notification to client (%s)", client->id); switch (PCMK__CLIENT_TYPE(client)) { case pcmk__client_ipc: if (client->ipcs == NULL) { - crm_trace("Could not notify local client: disconnected"); + pcmk__trace("Could not notify local client: disconnected"); return ENOTCONN; } return pcmk__ipc_send_xml(client, 0, msg, crm_ipc_server_event); #ifdef PCMK__COMPILE_REMOTE case pcmk__client_tls: if (client->remote == NULL) { - crm_trace("Could not notify remote client: disconnected"); + pcmk__trace("Could not notify remote client: disconnected"); return ENOTCONN; } else { return lrmd__remote_send_xml(client->remote, msg, 0, "notify"); } #endif default: - crm_err("Could not notify client %s with unknown transport " - QB_XS " flags=%#llx", - pcmk__client_name(client), client->flags); + pcmk__err("Could not notify client %s with unknown transport " + QB_XS " flags=%#llx", + pcmk__client_name(client), client->flags); } return ENOTCONN; } @@ -281,8 +283,8 @@ exit_executor(void) { const guint nclients = pcmk__ipc_client_count(); - crm_info("Terminating with %d client%s", - nclients, pcmk__plural_s(nclients)); + pcmk__info("Terminating with %d client%s", nclients, + pcmk__plural_s(nclients)); stonith_api_delete(stonith_api); if (ipcs) { mainloop_del_ipc_server(ipcs); @@ -322,13 +324,14 @@ lrmd_shutdown(int nsig) */ if (ipc_proxy) { if (shutting_down) { - crm_notice("Waiting for cluster to stop resources before exiting"); + pcmk__notice("Waiting for cluster to stop resources before " + "exiting"); return; } - crm_info("Sending shutdown request to cluster"); + pcmk__info("Sending shutdown request to cluster"); if (ipc_proxy_shutdown_req(ipc_proxy) < 0) { - crm_crit("Shutdown request failed, exiting immediately"); + pcmk__crit("Shutdown request failed, exiting immediately"); } else { /* We requested a shutdown. Now, we need to wait for an @@ -362,12 +365,12 @@ handle_shutdown_ack(void) { #ifdef PCMK__COMPILE_REMOTE if (shutting_down) { - crm_info("IPC proxy provider acknowledged shutdown request"); + pcmk__info("IPC proxy provider acknowledged shutdown request"); return; } #endif - crm_debug("Ignoring unexpected shutdown acknowledgment " - "from IPC proxy provider"); + pcmk__debug("Ignoring unexpected shutdown acknowledgment from IPC proxy " + "provider"); } /*! @@ -379,13 +382,14 @@ handle_shutdown_nack(void) { #ifdef PCMK__COMPILE_REMOTE if (shutting_down) { - crm_info("Exiting immediately after IPC proxy provider " - "indicated no resources will be stopped"); + pcmk__info("Exiting immediately after IPC proxy provider indicated no " + "resources will be stopped"); exit_executor(); return; } #endif - crm_debug("Ignoring unexpected shutdown rejection from IPC proxy provider"); + pcmk__debug("Ignoring unexpected shutdown rejection from IPC proxy " + "provider"); } static GOptionEntry entries[] = { @@ -512,7 +516,7 @@ main(int argc, char **argv, char **envp) start_time = time(NULL); - crm_notice("Starting Pacemaker " EXECD_TYPE " executor"); + pcmk__notice("Starting Pacemaker " EXECD_TYPE " executor"); /* The presence of this variable allegedly controls whether child * processes like httpd will try and use Systemd's sd_notify @@ -525,22 +529,25 @@ main(int argc, char **argv, char **envp) int rc = pcmk__build_path(PCMK__OCF_TMP_DIR, 0755); if (rc != pcmk_rc_ok) { - crm_warn("Could not create resource agent temporary directory " - PCMK__OCF_TMP_DIR ": %s", pcmk_rc_str(rc)); + pcmk__warn("Could not create resource agent temporary directory " + PCMK__OCF_TMP_DIR ": %s", + pcmk_rc_str(rc)); } } rsc_list = pcmk__strkey_table(NULL, free_rsc); ipcs = mainloop_add_ipc_server(CRM_SYSTEM_LRMD, QB_IPC_SHM, &lrmd_ipc_callbacks); if (ipcs == NULL) { - crm_err("Failed to create IPC server: shutting down and inhibiting respawn"); + pcmk__err("Failed to create IPC server: shutting down and inhibiting " + "respawn"); exit_code = CRM_EX_FATAL; goto done; } #ifdef PCMK__COMPILE_REMOTE if (lrmd_init_remote_tls_server() < 0) { - crm_err("Failed to create TLS listener: shutting down and staying down"); + pcmk__err("Failed to create TLS listener: shutting down and staying " + "down"); exit_code = CRM_EX_FATAL; goto done; } @@ -549,8 +556,9 @@ main(int argc, char **argv, char **envp) mainloop_add_signal(SIGTERM, lrmd_shutdown); mainloop = g_main_loop_new(NULL, FALSE); - crm_notice("Pacemaker " EXECD_TYPE " executor successfully started and accepting connections"); - crm_notice("OCF resource agent search path is %s", PCMK__OCF_RA_PATH); + pcmk__notice("Pacemaker " EXECD_TYPE " executor successfully started and " + "accepting connections"); + pcmk__notice("OCF resource agent search path is %s", PCMK__OCF_RA_PATH); g_main_loop_run(mainloop); /* should never get here */ diff --git a/daemons/execd/remoted_pidone.c b/daemons/execd/remoted_pidone.c index 187de51d04e..4267fcd7577 100644 --- a/daemons/execd/remoted_pidone.c +++ b/daemons/execd/remoted_pidone.c @@ -1,5 +1,5 @@ /* - * Copyright 2017-2024 the Pacemaker project contributors + * Copyright 2017-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -247,7 +247,7 @@ remoted_spawn_pidone(int argc, char **argv, char **envp) // Child remains as pacemaker-remoted return; case -1: - crm_err("fork failed: %s", pcmk_rc_str(errno)); + pcmk__err("fork failed: %s", pcmk_rc_str(errno)); } /* Parent becomes the reaper of zombie processes */ diff --git a/daemons/execd/remoted_proxy.c b/daemons/execd/remoted_proxy.c index 9083a9d9cc1..0e2306f80d6 100644 --- a/daemons/execd/remoted_proxy.c +++ b/daemons/execd/remoted_proxy.c @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the Pacemaker project contributors + * Copyright 2012-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -77,8 +77,9 @@ ipc_proxy_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid, const char *ipc xmlNode *msg; if (ipc_proxy == NULL) { - crm_warn("Cannot proxy IPC connection from uid %d gid %d to %s " - "because not connected to cluster", uid, gid, ipc_channel); + pcmk__warn("Cannot proxy IPC connection from uid %d gid %d to %s " + "because not connected to cluster", + uid, gid, ipc_channel); return -EREMOTEIO; } @@ -93,7 +94,8 @@ ipc_proxy_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid, const char *ipc /* This ipc client is bound to a single ipc provider. If the * provider goes away, this client is disconnected */ client->userdata = pcmk__str_copy(ipc_proxy->id); - client->name = crm_strdup_printf("proxy-%s-%d-%.8s", ipc_channel, client->pid, client->id); + client->name = pcmk__assert_asprintf("proxy-%s-%d-%.8s", ipc_channel, + client->pid, client->id); /* Allow remote executor to distinguish between proxied local clients and * actual executor API clients @@ -103,14 +105,14 @@ ipc_proxy_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid, const char *ipc g_hash_table_insert(ipc_clients, client->id, client); msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_NEW); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_SERVER, ipc_channel); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_SESSION, client->id); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_NEW); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_SERVER, ipc_channel); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_SESSION, client->id); lrmd_server_send_notify(ipc_proxy, msg); pcmk__xml_free(msg); - crm_debug("Accepted IPC proxy connection (session ID %s) " - "from uid %d gid %d on channel %s", - client->id, uid, gid, ipc_channel); + pcmk__debug("Accepted IPC proxy connection (session ID %s) from uid %d " + "gid %d on channel %s", + client->id, uid, gid, ipc_channel); return 0; } @@ -153,8 +155,8 @@ cib_proxy_accept_ro(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) void ipc_proxy_forward_client(pcmk__client_t *ipc_proxy, xmlNode *xml) { - const char *session = crm_element_value(xml, PCMK__XA_LRMD_IPC_SESSION); - const char *msg_type = crm_element_value(xml, PCMK__XA_LRMD_IPC_OP); + const char *session = pcmk__xe_get(xml, PCMK__XA_LRMD_IPC_SESSION); + const char *msg_type = pcmk__xe_get(xml, PCMK__XA_LRMD_IPC_OP); xmlNode *wrapper = pcmk__xe_first_child(xml, PCMK__XE_LRMD_IPC_MSG, NULL, NULL); @@ -176,8 +178,8 @@ ipc_proxy_forward_client(pcmk__client_t *ipc_proxy, xmlNode *xml) ipc_client = pcmk__find_client_by_id(session); if (ipc_client == NULL) { xmlNode *msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_DESTROY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_SESSION, session); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_DESTROY); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_SESSION, session); lrmd_server_send_notify(ipc_proxy, msg); pcmk__xml_free(msg); return; @@ -198,14 +200,15 @@ ipc_proxy_forward_client(pcmk__client_t *ipc_proxy, xmlNode *xml) */ if (pcmk__str_eq(msg_type, LRMD_IPC_OP_EVENT, pcmk__str_casei)) { - crm_trace("Sending event to %s", ipc_client->id); + pcmk__trace("Sending event to %s", ipc_client->id); rc = pcmk__ipc_send_xml(ipc_client, 0, msg, crm_ipc_server_event); } else if (pcmk__str_eq(msg_type, LRMD_IPC_OP_RESPONSE, pcmk__str_casei)) { int msg_id = 0; - crm_element_value_int(xml, PCMK__XA_LRMD_IPC_MSG_ID, &msg_id); - crm_trace("Sending response to %d - %s", ipc_client->request_id, ipc_client->id); + pcmk__xe_get_int(xml, PCMK__XA_LRMD_IPC_MSG_ID, &msg_id); + pcmk__trace("Sending response to %d - %s", ipc_client->request_id, + ipc_client->id); rc = pcmk__ipc_send_xml(ipc_client, msg_id, msg, FALSE); CRM_LOG_ASSERT(msg_id == ipc_client->request_id); @@ -215,12 +218,12 @@ ipc_proxy_forward_client(pcmk__client_t *ipc_proxy, xmlNode *xml) qb_ipcs_disconnect(ipc_client->ipcs); } else { - crm_err("Unknown ipc proxy msg type %s" , msg_type); + pcmk__err("Unknown ipc proxy msg type %s" , msg_type); } if (rc != pcmk_rc_ok) { - crm_warn("Could not proxy IPC to client %s: %s " QB_XS " rc=%d", - ipc_client->id, pcmk_rc_str(rc), rc); + pcmk__warn("Could not proxy IPC to client %s: %s " QB_XS " rc=%d", + ipc_client->id, pcmk_rc_str(rc), rc); } } @@ -259,9 +262,9 @@ ipc_proxy_dispatch(qb_ipcs_connection_t * c, void *data, size_t size) return 0; } - CRM_CHECK(client != NULL, crm_err("Invalid client"); + CRM_CHECK(client != NULL, pcmk__err("Invalid client"); pcmk__xml_free(request); return FALSE); - CRM_CHECK(client->id != NULL, crm_err("Invalid client: %p", client); + CRM_CHECK(client->id != NULL, pcmk__err("Invalid client: %p", client); pcmk__xml_free(request); return FALSE); /* This ensures that synced request/responses happen over the event channel @@ -271,12 +274,14 @@ ipc_proxy_dispatch(qb_ipcs_connection_t * c, void *data, size_t size) client->request_id = id; msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_REQUEST); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_SESSION, client->id); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_CLIENT, pcmk__client_name(client)); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_USER, client->user); - crm_xml_add_int(msg, PCMK__XA_LRMD_IPC_MSG_ID, id); - crm_xml_add_int(msg, PCMK__XA_LRMD_IPC_MSG_FLAGS, flags); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_REQUEST); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_SESSION, client->id); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_CLIENT, pcmk__client_name(client)); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_USER, client->user); + pcmk__xe_set_int(msg, PCMK__XA_LRMD_IPC_MSG_ID, id); + + // @TODO Use different setter for uint32_t + pcmk__xe_set_int(msg, PCMK__XA_LRMD_IPC_MSG_FLAGS, flags); wrapper = pcmk__xe_create(msg, PCMK__XE_LRMD_IPC_MSG); @@ -303,12 +308,12 @@ ipc_proxy_shutdown_req(pcmk__client_t *ipc_proxy) xmlNode *msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); int rc; - crm_xml_add(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_SHUTDOWN_REQ); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_SHUTDOWN_REQ); /* We don't really have a session, but the controller needs this attribute * to recognize this as proxy communication. */ - crm_xml_add(msg, PCMK__XA_LRMD_IPC_SESSION, "0"); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_SESSION, "0"); rc = (lrmd_server_send_notify(ipc_proxy, msg) != pcmk_rc_ok)? -1 : 0; pcmk__xml_free(msg); @@ -327,12 +332,12 @@ ipc_proxy_closed(qb_ipcs_connection_t * c) ipc_proxy = pcmk__find_client_by_id(client->userdata); - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); if (ipc_proxy) { xmlNode *msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_DESTROY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_SESSION, client->id); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_DESTROY); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_SESSION, client->id); lrmd_server_send_notify(ipc_proxy, msg); pcmk__xml_free(msg); } @@ -348,7 +353,7 @@ ipc_proxy_closed(qb_ipcs_connection_t * c) static void ipc_proxy_destroy(qb_ipcs_connection_t * c) { - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); ipc_proxy_closed(c); } @@ -422,8 +427,9 @@ ipc_proxy_remove_provider(pcmk__client_t *ipc_proxy) while (g_hash_table_iter_next(&iter, (gpointer *) & key, (gpointer *) & ipc_client)) { const char *proxy_id = ipc_client->userdata; if (pcmk__str_eq(proxy_id, ipc_proxy->id, pcmk__str_casei)) { - crm_info("ipc proxy connection for client %s pid %d destroyed because cluster node disconnected.", - ipc_client->id, ipc_client->pid); + pcmk__info("IPC proxy connection for client %s pid %d destroyed " + "because cluster node disconnected", + ipc_client->id, ipc_client->pid); /* we can't remove during the iteration, so copy items * to a list we can destroy later */ remove_these = g_list_append(remove_these, ipc_client); @@ -453,8 +459,10 @@ ipc_proxy_init(void) pcmk__serve_pacemakerd_ipc(&pacemakerd_ipcs, &pacemakerd_proxy_callbacks); crmd_ipcs = pcmk__serve_controld_ipc(&crmd_proxy_callbacks); if (crmd_ipcs == NULL) { - crm_err("Failed to create controller: exiting and inhibiting respawn"); - crm_warn("Verify pacemaker and pacemaker_remote are not both enabled"); + pcmk__err("Failed to create controller: exiting and inhibiting " + "respawn"); + pcmk__warn("Verify pacemaker and pacemaker_remote are not both " + "enabled"); crm_exit(CRM_EX_FATAL); } } diff --git a/daemons/execd/remoted_schemas.c b/daemons/execd/remoted_schemas.c index f56ec00e307..4300c59ca61 100644 --- a/daemons/execd/remoted_schemas.c +++ b/daemons/execd/remoted_schemas.c @@ -34,7 +34,7 @@ rm_files(const char *pathname, const struct stat *sbuf, int type, struct FTW *ft if (remove(pathname) != 0) { int rc = errno; - crm_err("Could not remove %s: %s", pathname, pcmk_rc_str(rc)); + pcmk__err("Could not remove %s: %s", pathname, pcmk_rc_str(rc)); return -1; } @@ -55,21 +55,22 @@ clean_up_extra_schema_files(void) /* If the directory doesn't exist, try to make it first. */ if (mkdir(remote_schema_dir, 0755) != 0) { rc = errno; - crm_err("Could not create directory for schemas: %s", - pcmk_rc_str(rc)); + pcmk__err("Could not create directory for schemas: %s", + pcmk_rc_str(rc)); } } else { rc = errno; - crm_err("Could not create directory for schemas: %s", - pcmk_rc_str(rc)); + pcmk__err("Could not create directory for schemas: %s", + pcmk_rc_str(rc)); } } else if (!S_ISDIR(sb.st_mode)) { /* If something exists with the same name that's not a directory, that's * an error. */ - crm_err("%s already exists but is not a directory", remote_schema_dir); + pcmk__err("%s already exists but is not a directory", + remote_schema_dir); } else { /* It's a directory - clear it out so we can download potentially new @@ -78,7 +79,8 @@ clean_up_extra_schema_files(void) rc = nftw(remote_schema_dir, rm_files, 10, FTW_DEPTH|FTW_MOUNT|FTW_PHYS); if (rc != 0) { - crm_err("Could not remove %s: %s", remote_schema_dir, pcmk_rc_str(rc)); + pcmk__err("Could not remove %s: %s", remote_schema_dir, + pcmk_rc_str(rc)); } } } @@ -91,13 +93,13 @@ write_extra_schema_file(xmlNode *xml, void *user_data) char *path = NULL; int rc; - file = crm_element_value(xml, PCMK_XA_PATH); + file = pcmk__xe_get(xml, PCMK_XA_PATH); if (file == NULL) { - crm_warn("No destination path given in schema request"); + pcmk__warn("No destination path given in schema request"); return; } - path = crm_strdup_printf("%s/%s", remote_schema_dir, file); + path = pcmk__assert_asprintf("%s/%s", remote_schema_dir, file); /* The schema is a CDATA node, which is a child of the node. Traverse * all children and look for the first CDATA child. There can't be more than @@ -112,12 +114,14 @@ write_extra_schema_file(xmlNode *xml, void *user_data) stream = fopen(path, "w+"); if (stream == NULL) { - crm_warn("Could not write schema file %s: %s", path, strerror(errno)); + pcmk__warn("Could not write schema file %s: %s", path, + strerror(errno)); } else { rc = fprintf(stream, "%s", child->content); if (rc < 0) { - crm_warn("Could not write schema file %s: %s", path, strerror(errno)); + pcmk__warn("Could not write schema file %s: %s", path, + strerror(errno)); } fclose(stream); @@ -145,7 +149,7 @@ get_schema_files(void) rc = cib->cmds->signon(cib, crm_system_name, cib_query); rc = pcmk_legacy2rc(rc); if (rc != pcmk_rc_ok) { - crm_err("Could not connect to the CIB manager: %s", pcmk_rc_str(rc)); + pcmk__err("Could not connect to the CIB manager: %s", pcmk_rc_str(rc)); pcmk_common_cleanup(); _exit(pcmk_rc2exitc(rc)); } @@ -153,7 +157,7 @@ get_schema_files(void) rc = cib->cmds->fetch_schemas(cib, &reply, pcmk__highest_schema_name(), cib_sync_call); if (rc != pcmk_ok) { - crm_err("Could not get schema files: %s", pcmk_strerror(rc)); + pcmk__err("Could not get schema files: %s", pcmk_strerror(rc)); rc = pcmk_legacy2rc(rc); } else if (reply->children != NULL) { @@ -211,16 +215,17 @@ get_schema_files_complete(mainloop_child_t *p, pid_t pid, int core, int signo, i */ pcmk__load_schemas_from_dir(remote_schema_dir); pcmk__sort_schemas(); - crm_info("Fetching extra schema files completed successfully"); + pcmk__info("Fetching extra schema files completed successfully"); } else { if (signo == 0) { - crm_err("%s: process %d exited %d", errmsg, (int) pid, exitcode); + pcmk__err("%s: process %lld exited %d", errmsg, (long long) pid, + exitcode); } else { - crm_err("%s: process %d terminated with signal %d (%s)%s", - errmsg, (int) pid, signo, strsignal(signo), - (core? " and dumped core" : "")); + pcmk__err("%s: process %lld terminated with signal %d (%s)%s", + errmsg, (long long) pid, signo, strsignal(signo), + ((core != 0)? " and dumped core" : "")); } /* Clean up any incomplete schema data we might have been downloading @@ -245,7 +250,7 @@ remoted_request_cib_schema_files(void) */ if (schema_fetch_pid != 0) { if (mainloop_child_kill(schema_fetch_pid) == FALSE) { - crm_warn("Unable to kill pre-existing schema-fetch process"); + pcmk__warn("Unable to kill pre-existing schema-fetch process"); return; } @@ -264,13 +269,14 @@ remoted_request_cib_schema_files(void) pcmk__schema_cleanup(); pcmk__schema_init(); - crm_info("Fetching extra schema files from cluster"); + pcmk__info("Fetching extra schema files from cluster"); pid = fork(); switch (pid) { case -1: { rc = errno; - crm_warn("Could not spawn process to get schema files: %s", pcmk_rc_str(rc)); + pcmk__warn("Could not spawn process to get schema files: %s", + pcmk_rc_str(rc)); break; } diff --git a/daemons/execd/remoted_tls.c b/daemons/execd/remoted_tls.c index eede13edaec..046f376ec6c 100644 --- a/daemons/execd/remoted_tls.c +++ b/daemons/execd/remoted_tls.c @@ -63,7 +63,7 @@ remoted__read_handshake_data(pcmk__client_t *client) client->remote->auth_timeout = 0; pcmk__set_client_flags(client, pcmk__client_tls_handshake_complete); - crm_notice("Remote client connection accepted"); + pcmk__notice("Remote client connection accepted"); /* Now that the handshake is done, see if any client TLS certificate is * close to its expiration date and log if so. If a TLS certificate is not @@ -90,7 +90,7 @@ lrmd_remote_client_msg(gpointer data) xmlNode *request = NULL; pcmk__client_t *client = data; - if (!pcmk_is_set(client->flags, pcmk__client_tls_handshake_complete)) { + if (!pcmk__is_set(client->flags, pcmk__client_tls_handshake_complete)) { return remoted__read_handshake_data(client); } @@ -105,7 +105,7 @@ lrmd_remote_client_msg(gpointer data) default: /* Error */ - crm_info("Error polling remote client: %s", pcmk_rc_str(rc)); + pcmk__info("Error polling remote client: %s", pcmk_rc_str(rc)); return -1; } @@ -120,7 +120,7 @@ lrmd_remote_client_msg(gpointer data) default: /* Error */ - crm_info("Error reading from remote client: %s", pcmk_rc_str(rc)); + pcmk__info("Error reading from remote client: %s", pcmk_rc_str(rc)); return -1; } @@ -129,11 +129,10 @@ lrmd_remote_client_msg(gpointer data) return 0; } - crm_element_value_int(request, PCMK__XA_LRMD_REMOTE_MSG_ID, &id); - crm_trace("Processing remote client request %d", id); + pcmk__xe_get_int(request, PCMK__XA_LRMD_REMOTE_MSG_ID, &id); + pcmk__trace("Processing remote client request %d", id); if (!client->name) { - client->name = crm_element_value_copy(request, - PCMK__XA_LRMD_CLIENTNAME); + client->name = pcmk__xe_get_copy(request, PCMK__XA_LRMD_CLIENTNAME); } lrmd_call_id++; @@ -141,9 +140,9 @@ lrmd_remote_client_msg(gpointer data) lrmd_call_id = 1; } - crm_xml_add(request, PCMK__XA_LRMD_CLIENTID, client->id); - crm_xml_add(request, PCMK__XA_LRMD_CLIENTNAME, client->name); - crm_xml_add_int(request, PCMK__XA_LRMD_CALLID, lrmd_call_id); + pcmk__xe_set(request, PCMK__XA_LRMD_CLIENTID, client->id); + pcmk__xe_set(request, PCMK__XA_LRMD_CLIENTNAME, client->name); + pcmk__xe_set_int(request, PCMK__XA_LRMD_CALLID, lrmd_call_id); process_lrmd_message(client, id, request); pcmk__xml_free(request); @@ -160,8 +159,8 @@ lrmd_remote_client_destroy(gpointer user_data) return; } - crm_notice("Cleaning up after remote client %s disconnected", - pcmk__client_name(client)); + pcmk__notice("Cleaning up after remote client %s disconnected", + pcmk__client_name(client)); ipc_proxy_remove_provider(client); @@ -191,14 +190,13 @@ lrmd_auth_timeout_cb(gpointer data) client->remote->auth_timeout = 0; - if (pcmk_is_set(client->flags, - pcmk__client_tls_handshake_complete)) { + if (pcmk__is_set(client->flags, pcmk__client_tls_handshake_complete)) { return FALSE; } mainloop_del_fd(client->remote->source); client->remote->source = NULL; - crm_err("Remote client authentication timed out"); + pcmk__err("Remote client authentication timed out"); return FALSE; } @@ -238,8 +236,8 @@ lrmd_remote_listen(gpointer data) new_client->remote->auth_timeout = pcmk__create_timer(LRMD_REMOTE_AUTH_TIMEOUT, lrmd_auth_timeout_cb, new_client); - crm_info("Remote client pending authentication " - QB_XS " %p id: %s", new_client, new_client->id); + pcmk__info("Remote client pending authentication " QB_XS " %p id: %s", + new_client, new_client->id); new_client->remote->source = mainloop_add_fd("pacemaker-remote-client", G_PRIORITY_DEFAULT, csock, @@ -250,7 +248,7 @@ lrmd_remote_listen(gpointer data) static void tls_server_dropped(gpointer user_data) { - crm_notice("TLS server session ended"); + pcmk__notice("TLS server session ended"); return; } @@ -270,12 +268,12 @@ bind_and_listen(struct addrinfo *addr) char buffer[INET6_ADDRSTRLEN] = { 0, }; pcmk__sockaddr2str(addr->ai_addr, buffer); - crm_trace("Attempting to bind to address %s", buffer); + pcmk__trace("Attempting to bind to address %s", buffer); fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); if (fd < 0) { rc = errno; - crm_err("Listener socket creation failed: %", pcmk_rc_str(rc)); + pcmk__err("Listener socket creation failed: %", pcmk_rc_str(rc)); return -rc; } @@ -284,7 +282,8 @@ bind_and_listen(struct addrinfo *addr) rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); if (rc < 0) { rc = errno; - crm_err("Local address reuse not allowed on %s: %s", buffer, pcmk_rc_str(rc)); + pcmk__err("Local address reuse not allowed on %s: %s", buffer, + pcmk_rc_str(rc)); close(fd); return -rc; } @@ -294,7 +293,8 @@ bind_and_listen(struct addrinfo *addr) rc = setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)); if (rc < 0) { rc = errno; - crm_err("Couldn't disable IPV6-only on %s: %s", buffer, pcmk_rc_str(rc)); + pcmk__err("Couldn't disable IPV6-only on %s: %s", buffer, + pcmk_rc_str(rc)); close(fd); return -rc; } @@ -302,14 +302,14 @@ bind_and_listen(struct addrinfo *addr) if (bind(fd, addr->ai_addr, addr->ai_addrlen) != 0) { rc = errno; - crm_err("Cannot bind to %s: %s", buffer, pcmk_rc_str(rc)); + pcmk__err("Cannot bind to %s: %s", buffer, pcmk_rc_str(rc)); close(fd); return -rc; } if (listen(fd, 10) == -1) { rc = errno; - crm_err("Cannot listen on %s: %s", buffer, pcmk_rc_str(rc)); + pcmk__err("Cannot listen on %s: %s", buffer, pcmk_rc_str(rc)); close(fd); return -rc; } @@ -334,8 +334,8 @@ get_address_info(const char *bind_name, int port, struct addrinfo **res) rc = pcmk__gaierror2rc(rc); if (rc != pcmk_rc_ok) { - crm_err("Unable to get IP address(es) for %s: %s", - (bind_name? bind_name : "local node"), pcmk_rc_str(rc)); + pcmk__err("Unable to get IP address(es) for %s: %s", + pcmk__s(bind_name, "local node"), pcmk_rc_str(rc)); return rc; } @@ -359,8 +359,8 @@ lrmd_init_remote_tls_server(void) CRM_CHECK(ssock == -1, return ssock); - crm_debug("Starting TLS listener on %s port %d", - (bind_name? bind_name : "all addresses on"), port); + pcmk__debug("Starting TLS listener on %s port %d", + pcmk__s(bind_name, "all addresses on"), port); rc = pcmk__init_tls(&tls, true, use_cert ? GNUTLS_CRD_CERTIFICATE : GNUTLS_CRD_PSK); if (rc != pcmk_rc_ok) { @@ -378,7 +378,8 @@ lrmd_init_remote_tls_server(void) * going to be added later. */ if (lrmd__init_remote_key(&psk_key) != pcmk_rc_ok) { - crm_warn("A cluster connection will not be possible until the key is available"); + pcmk__warn("A cluster connection will not be possible until the " + "key is available"); } gnutls_free(psk_key.data); @@ -418,8 +419,8 @@ lrmd_init_remote_tls_server(void) if (ssock >= 0) { mainloop_add_fd("pacemaker-remote-server", G_PRIORITY_DEFAULT, ssock, NULL, &remote_listen_fd_callbacks); - crm_debug("Started TLS listener on %s port %d", - (bind_name? bind_name : "all addresses on"), port); + pcmk__debug("Started TLS listener on %s port %d", + pcmk__s(bind_name, "all addresses on"), port); } freeaddrinfo(res); return ssock; diff --git a/daemons/fenced/cts-fence-helper.c b/daemons/fenced/cts-fence-helper.c index 1424a316230..0ed83817455 100644 --- a/daemons/fenced/cts-fence-helper.c +++ b/daemons/fenced/cts-fence-helper.c @@ -1,5 +1,5 @@ /* - * Copyright 2009-2024 the Pacemaker project contributors + * Copyright 2009-2025 the Pacemaker project contributors * * This source code is licensed under the GNU General Public License version 2 * or later (GPLv2+) WITHOUT ANY WARRANTY. @@ -94,14 +94,14 @@ static void mainloop_test_done(const char *origin, bool pass) { if (pass) { - crm_info("SUCCESS - %s", origin); + pcmk__info("SUCCESS - %s", origin); mainloop_iter++; mainloop_set_trigger(trig); result.execution_status = PCMK_EXEC_DONE; result.exit_status = CRM_EX_OK; } else { - crm_err("FAILURE - %s (%d: %s)", origin, result.exit_status, - pcmk_exec_status_str(result.execution_status)); + pcmk__err("FAILURE - %s (%d: %s)", origin, result.exit_status, + pcmk_exec_status_str(result.execution_status)); crm_exit(CRM_EX_ERROR); } } @@ -112,7 +112,7 @@ dispatch_helper(int timeout) { int rc; - crm_debug("Looking for notification"); + pcmk__debug("Looking for notification"); pollfd.events = POLLIN; while (true) { rc = poll(&pollfd, 1, timeout); /* wait 10 minutes, -1 forever */ @@ -136,7 +136,7 @@ st_callback(stonith_t * st, stonith_event_t * e) } desc = stonith__event_description(e); - crm_notice("%s", desc); + pcmk__notice("%s", desc); free(desc); if (expected_notifications) { @@ -147,10 +147,9 @@ st_callback(stonith_t * st, stonith_event_t * e) static void st_global_callback(stonith_t * stonith, stonith_callback_data_t * data) { - crm_notice("Call %d exited %d: %s (%s)", - data->call_id, stonith__exit_status(data), - stonith__execution_status(data), - pcmk__s(stonith__exit_reason(data), "unspecified reason")); + pcmk__notice("Call %d exited %d: %s (%s)", data->call_id, + stonith__exit_status(data), stonith__execution_status(data), + pcmk__s(stonith__exit_reason(data), "unspecified reason")); } static void @@ -185,17 +184,20 @@ passive_test(void) dispatch_helper(500); \ } \ if (rc != expected_rc) { \ - crm_err("FAILURE - expected rc %d != %d(%s) for cmd - %s", expected_rc, rc, pcmk_strerror(rc), str); \ + pcmk__err("FAILURE - expected rc %d != %d(%s) for cmd - %s", \ + expected_rc, rc, pcmk_strerror(rc), str); \ crm_exit(CRM_EX_ERROR); \ } else if (expected_notifications) { \ - crm_err("FAILURE - expected %d notifications, got only %d for cmd - %s", \ - num_notifications, num_notifications - expected_notifications, str); \ + pcmk__err("FAILURE - expected %d notifications, got only %d for " \ + "cmd - %s", \ + num_notifications, \ + (num_notifications - expected_notifications), str); \ crm_exit(CRM_EX_ERROR); \ } else { \ if (verbose) { \ - crm_info("SUCCESS - %s: %d", str, rc); \ + pcmk__info("SUCCESS - %s: %d", str, rc); \ } else { \ - crm_debug("SUCCESS - %s: %d", str, rc); \ + pcmk__debug("SUCCESS - %s: %d", str, rc); \ } \ } \ }\ @@ -335,11 +337,11 @@ sanity_tests(void) st->cmds->register_callback(st, 0, 120, st_opt_timeout_updates, NULL, "st_global_callback", st_global_callback); - crm_info("Starting API Sanity Tests"); + pcmk__info("Starting API Sanity Tests"); run_standard_test(); run_fence_failure_test(); run_fence_failure_rollover_test(); - crm_info("Sanity Tests Passed"); + pcmk__info("Sanity Tests Passed"); } static void @@ -359,49 +361,49 @@ standard_dev_test(void) "some-host=pcmk-7 true_1_node1=3,4"); rc = st->cmds->register_device(st, st_opts, "test-id", "stonith-ng", "fence_xvm", params); - crm_debug("Register: %d", rc); + pcmk__debug("Register: %d", rc); rc = st->cmds->list(st, st_opts, "test-id", &tmp, 10); - crm_debug("List: %d output: %s", rc, tmp ? tmp : ""); + pcmk__debug("List: %d output: %s", rc, tmp ? tmp : ""); rc = st->cmds->monitor(st, st_opts, "test-id", 10); - crm_debug("Monitor: %d", rc); + pcmk__debug("Monitor: %d", rc); rc = st->cmds->status(st, st_opts, "test-id", "false_1_node2", 10); - crm_debug("Status false_1_node2: %d", rc); + pcmk__debug("Status false_1_node2: %d", rc); rc = st->cmds->status(st, st_opts, "test-id", "false_1_node1", 10); - crm_debug("Status false_1_node1: %d", rc); + pcmk__debug("Status false_1_node1: %d", rc); rc = st->cmds->fence(st, st_opts, "unknown-host", PCMK_ACTION_OFF, 60, 0); - crm_debug("Fence unknown-host: %d", rc); + pcmk__debug("Fence unknown-host: %d", rc); rc = st->cmds->status(st, st_opts, "test-id", "false_1_node1", 10); - crm_debug("Status false_1_node1: %d", rc); + pcmk__debug("Status false_1_node1: %d", rc); rc = st->cmds->fence(st, st_opts, "false_1_node1", PCMK_ACTION_OFF, 60, 0); - crm_debug("Fence false_1_node1: %d", rc); + pcmk__debug("Fence false_1_node1: %d", rc); rc = st->cmds->status(st, st_opts, "test-id", "false_1_node1", 10); - crm_debug("Status false_1_node1: %d", rc); + pcmk__debug("Status false_1_node1: %d", rc); rc = st->cmds->fence(st, st_opts, "false_1_node1", PCMK_ACTION_ON, 10, 0); - crm_debug("Unfence false_1_node1: %d", rc); + pcmk__debug("Unfence false_1_node1: %d", rc); rc = st->cmds->status(st, st_opts, "test-id", "false_1_node1", 10); - crm_debug("Status false_1_node1: %d", rc); + pcmk__debug("Status false_1_node1: %d", rc); rc = st->cmds->fence(st, st_opts, "some-host", PCMK_ACTION_OFF, 10, 0); - crm_debug("Fence alias: %d", rc); + pcmk__debug("Fence alias: %d", rc); rc = st->cmds->status(st, st_opts, "test-id", "some-host", 10); - crm_debug("Status alias: %d", rc); + pcmk__debug("Status alias: %d", rc); rc = st->cmds->fence(st, st_opts, "false_1_node1", PCMK_ACTION_ON, 10, 0); - crm_debug("Unfence false_1_node1: %d", rc); + pcmk__debug("Unfence false_1_node1: %d", rc); rc = st->cmds->remove_device(st, st_opts, "test-id"); - crm_debug("Remove test-id: %d", rc); + pcmk__debug("Remove test-id: %d", rc); stonith_key_value_freeall(params, 1, 1); } @@ -440,7 +442,7 @@ test_async_fence_pass(int check_event) rc = st->cmds->fence(st, 0, "true_1_node1", PCMK_ACTION_OFF, MAINLOOP_DEFAULT_TIMEOUT, 0); if (rc < 0) { - crm_err("fence failed with rc %d", rc); + pcmk__err("fence failed with rc %d", rc); mainloop_test_done(__func__, false); } register_callback_helper(rc); @@ -460,9 +462,10 @@ test_async_fence_custom_timeout(int check_event) if (result.execution_status != PCMK_EXEC_TIMEOUT) { mainloop_test_done(__func__, false); } else if (diff < CUSTOM_TIMEOUT_ADDITION + MAINLOOP_DEFAULT_TIMEOUT) { - crm_err - ("Custom timeout test failed, callback expiration should be updated to %d, actual timeout was %d", - CUSTOM_TIMEOUT_ADDITION + MAINLOOP_DEFAULT_TIMEOUT, diff); + pcmk__err("Custom timeout test failed, callback expiration should " + "be updated to %d, actual timeout was %d", + (CUSTOM_TIMEOUT_ADDITION + MAINLOOP_DEFAULT_TIMEOUT), + diff); mainloop_test_done(__func__, false); } else { mainloop_test_done(__func__, true); @@ -474,7 +477,7 @@ test_async_fence_custom_timeout(int check_event) rc = st->cmds->fence(st, 0, "custom_timeout_node1", PCMK_ACTION_OFF, MAINLOOP_DEFAULT_TIMEOUT, 0); if (rc < 0) { - crm_err("fence failed with rc %d", rc); + pcmk__err("fence failed with rc %d", rc); mainloop_test_done(__func__, false); } register_callback_helper(rc); @@ -495,7 +498,7 @@ test_async_fence_timeout(int check_event) rc = st->cmds->fence(st, 0, "false_1_node2", PCMK_ACTION_OFF, MAINLOOP_DEFAULT_TIMEOUT, 0); if (rc < 0) { - crm_err("fence failed with rc %d", rc); + pcmk__err("fence failed with rc %d", rc); mainloop_test_done(__func__, false); } register_callback_helper(rc); @@ -514,7 +517,7 @@ test_async_monitor(int check_event) rc = st->cmds->monitor(st, 0, "false_1", MAINLOOP_DEFAULT_TIMEOUT); if (rc < 0) { - crm_err("monitor failed with rc %d", rc); + pcmk__err("monitor failed with rc %d", rc); mainloop_test_done(__func__, false); } @@ -564,7 +567,7 @@ try_mainloop_connect(int check_event) mainloop_test_done(__func__, true); return; } - crm_err("API CONNECTION FAILURE"); + pcmk__err("API CONNECTION FAILURE"); mainloop_test_done(__func__, false); } @@ -582,7 +585,7 @@ iterate_mainloop_tests(gboolean event_ready) if (mainloop_iter == (sizeof(callbacks) / sizeof(mainloop_test_iteration_cb))) { /* all tests ran, everything passed */ - crm_info("ALL MAINLOOP TESTS PASSED!"); + pcmk__info("ALL MAINLOOP TESTS PASSED!"); crm_exit(CRM_EX_OK); } @@ -603,9 +606,9 @@ test_shutdown(int nsig) if (st) { rc = st->cmds->disconnect(st); - crm_info("Disconnect: %d", rc); + pcmk__info("Disconnect: %d", rc); - crm_debug("Destroy"); + pcmk__debug("Destroy"); stonith_api_delete(st); } @@ -621,7 +624,7 @@ mainloop_tests(void) mainloop_set_trigger(trig); mainloop_add_signal(SIGTERM, test_shutdown); - crm_info("Starting"); + pcmk__info("Starting"); mainloop = g_main_loop_new(NULL, FALSE); g_main_loop_run(mainloop); } diff --git a/daemons/fenced/fenced_cib.c b/daemons/fenced/fenced_cib.c index 887486d04e7..b04d00e3be5 100644 --- a/daemons/fenced/fenced_cib.c +++ b/daemons/fenced/fenced_cib.c @@ -61,7 +61,7 @@ node_has_attr(const char *node, const char *name, const char *value) "[@" PCMK_XA_NAME "='", name, "' " "and @" PCMK_XA_VALUE "='", value, "']", NULL); - match = pcmk__xpath_find_one(local_cib->doc, xpath->str, LOG_NEVER); + match = pcmk__xpath_find_one(local_cib->doc, xpath->str, PCMK__LOG_NEVER); g_string_free(xpath, TRUE); return (match != NULL); @@ -88,9 +88,9 @@ topology_remove_helper(const char *node, int level) pcmk__action_result_t result = PCMK__UNKNOWN_RESULT; xmlNode *data = pcmk__xe_create(NULL, PCMK_XE_FENCING_LEVEL); - crm_xml_add(data, PCMK__XA_ST_ORIGIN, __func__); - crm_xml_add_int(data, PCMK_XA_INDEX, level); - crm_xml_add(data, PCMK_XA_TARGET, node); + pcmk__xe_set(data, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set_int(data, PCMK_XA_INDEX, level); + pcmk__xe_set(data, PCMK_XA_TARGET, node); fenced_unregister_level(data, &desc, &result); fenced_send_config_notification(STONITH_OP_LEVEL_DEL, &result, desc); @@ -108,7 +108,7 @@ remove_topology_level(xmlNode *match) CRM_CHECK(match != NULL, return); key = stonith_level_key(match, fenced_target_by_unknown); - crm_element_value_int(match, PCMK_XA_INDEX, &index); + pcmk__xe_get_int(match, PCMK_XA_INDEX, &index); topology_remove_helper(key, index); free(key); } @@ -154,7 +154,7 @@ fencing_topology_init(void) xmlXPathObject *xpathObj = NULL; const char *xpath = "//" PCMK_XE_FENCING_LEVEL; - crm_trace("Full topology refresh"); + pcmk__trace("Full topology refresh"); free_topology_list(); init_topology_list(); @@ -172,26 +172,23 @@ fencing_topology_init(void) static void update_stonith_watchdog_timeout_ms(xmlNode *cib) { - long long timeout_ms = 0; xmlNode *stonith_watchdog_xml = NULL; const char *value = NULL; // @TODO An XPath search can't handle multiple instances or rules stonith_watchdog_xml = pcmk__xpath_find_one(cib->doc, XPATH_WATCHDOG_TIMEOUT, - LOG_NEVER); + PCMK__LOG_NEVER); if (stonith_watchdog_xml) { - value = crm_element_value(stonith_watchdog_xml, PCMK_XA_VALUE); - } - if (value) { - timeout_ms = crm_get_msec(value); + value = pcmk__xe_get(stonith_watchdog_xml, PCMK_XA_VALUE); } - if (timeout_ms < 0) { - timeout_ms = pcmk__auto_stonith_watchdog_timeout(); - } + if ((value != NULL) + && ((pcmk__parse_ms(value, &stonith_watchdog_timeout_ms) != pcmk_rc_ok) + || (stonith_watchdog_timeout_ms < 0))) { - stonith_watchdog_timeout_ms = timeout_ms; + stonith_watchdog_timeout_ms = pcmk__auto_stonith_watchdog_timeout(); + } } /*! @@ -204,10 +201,10 @@ cib_devices_update(void) GHashTableIter iter; stonith_device_t *device = NULL; - crm_info("Updating devices to version %s.%s.%s", - crm_element_value(local_cib, PCMK_XA_ADMIN_EPOCH), - crm_element_value(local_cib, PCMK_XA_EPOCH), - crm_element_value(local_cib, PCMK_XA_NUM_UPDATES)); + pcmk__info("Updating devices to version %s.%s.%s", + pcmk__xe_get(local_cib, PCMK_XA_ADMIN_EPOCH), + pcmk__xe_get(local_cib, PCMK_XA_EPOCH), + pcmk__xe_get(local_cib, PCMK_XA_NUM_UPDATES)); g_hash_table_iter_init(&iter, device_list); while (g_hash_table_iter_next(&iter, NULL, (void **)&device)) { @@ -242,18 +239,18 @@ update_cib_stonith_devices(const char *event, xmlNode * msg) char *reason = NULL; CRM_CHECK(patchset != NULL, return); - crm_element_value_int(patchset, PCMK_XA_FORMAT, &format); + pcmk__xe_get_int(patchset, PCMK_XA_FORMAT, &format); if (format != 2) { - crm_warn("Unknown patch format: %d", format); + pcmk__warn("Unknown patch format: %d", format); return; } for (xmlNode *change = pcmk__xe_first_child(patchset, NULL, NULL, NULL); change != NULL; change = pcmk__xe_next(change, NULL)) { - const char *op = crm_element_value(change, PCMK_XA_OPERATION); - const char *xpath = crm_element_value(change, PCMK_XA_PATH); + const char *op = pcmk__xe_get(change, PCMK_XA_OPERATION); + const char *xpath = pcmk__xe_get(change, PCMK_XA_PATH); const char *shortpath = NULL; if (pcmk__str_eq(op, PCMK_VALUE_MOVE, pcmk__str_null_matches) @@ -286,7 +283,7 @@ update_cib_stonith_devices(const char *event, xmlNode * msg) /* watchdog_device_update called afterwards to fall back to implicit definition if needed */ } else { - crm_warn("Ignoring malformed CIB update (resource deletion)"); + pcmk__warn("Ignoring malformed CIB update (resource deletion)"); } free(mutable); @@ -295,17 +292,17 @@ update_cib_stonith_devices(const char *event, xmlNode * msg) || strstr(xpath, "/" PCMK_XE_RSC_DEFAULTS)) { shortpath = strrchr(xpath, '/'); pcmk__assert(shortpath != NULL); - reason = crm_strdup_printf("%s %s", op, shortpath+1); + reason = pcmk__assert_asprintf("%s %s", op, shortpath + 1); break; } } if (reason != NULL) { - crm_info("Updating device list from CIB: %s", reason); + pcmk__info("Updating device list from CIB: %s", reason); cib_devices_update(); free(reason); } else { - crm_trace("No updates for device list found in CIB"); + pcmk__trace("No updates for device list found in CIB"); } } @@ -335,8 +332,8 @@ watchdog_device_update(void) if (rc != pcmk_ok) { rc = pcmk_legacy2rc(rc); exit_code = CRM_EX_FATAL; - crm_crit("Cannot register watchdog pseudo fence agent: %s", - pcmk_rc_str(rc)); + pcmk__crit("Cannot register watchdog pseudo fence agent: %s", + pcmk_rc_str(rc)); stonith_shutdown(0); } } @@ -358,14 +355,14 @@ fenced_query_cib(void) { int rc = pcmk_ok; - crm_trace("Re-requesting full CIB"); + pcmk__trace("Re-requesting full CIB"); rc = cib_api->cmds->query(cib_api, NULL, &local_cib, cib_sync_call); rc = pcmk_legacy2rc(rc); if (rc == pcmk_rc_ok) { pcmk__assert(local_cib != NULL); } else { - crm_err("Couldn't retrieve the CIB: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__err("Couldn't retrieve the CIB: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); } return rc; } @@ -384,19 +381,19 @@ update_fencing_topology(const char *event, xmlNode *msg) CRM_CHECK(patchset != NULL, return); - crm_element_value_int(patchset, PCMK_XA_FORMAT, &format); + pcmk__xe_get_int(patchset, PCMK_XA_FORMAT, &format); if (format != 2) { - crm_warn("Unknown patch format: %d", format); + pcmk__warn("Unknown patch format: %d", format); return; } - xml_patch_versions(patchset, add, del); + pcmk__xml_patchset_versions(patchset, del, add); for (xmlNode *change = pcmk__xe_first_child(patchset, NULL, NULL, NULL); change != NULL; change = pcmk__xe_next(change, NULL)) { - const char *op = crm_element_value(change, PCMK_XA_OPERATION); - const char *xpath = crm_element_value(change, PCMK_XA_PATH); + const char *op = pcmk__xe_get(change, PCMK_XA_OPERATION); + const char *xpath = pcmk__xe_get(change, PCMK_XA_PATH); if (op == NULL) { continue; @@ -404,16 +401,16 @@ update_fencing_topology(const char *event, xmlNode *msg) if (strstr(xpath, "/" PCMK_XE_FENCING_LEVEL) != NULL) { // Change to a specific entry - crm_trace("Handling %s operation %d.%d.%d for %s", - op, add[0], add[1], add[2], xpath); + pcmk__trace("Handling %s operation %d.%d.%d for %s", op, + add[0], add[1], add[2], xpath); if (strcmp(op, PCMK_VALUE_DELETE) == 0) { /* We have only path and ID, which is not enough info to remove * a specific entry. Re-initialize the whole topology. */ - crm_info("Re-initializing fencing topology after %s operation " - "%d.%d.%d for %s", - op, add[0], add[1], add[2], xpath); + pcmk__info("Re-initializing fencing topology after %s " + "operation %d.%d.%d for %s", + op, add[0], add[1], add[2], xpath); fencing_topology_init(); return; } @@ -436,9 +433,9 @@ update_fencing_topology(const char *event, xmlNode *msg) if (strstr(xpath, "/" PCMK_XE_FENCING_TOPOLOGY) != NULL) { // Change to the topology in general - crm_info("Re-initializing fencing topology after top-level " - "%s operation %d.%d.%d for %s", - op, add[0], add[1], add[2], xpath); + pcmk__info("Re-initializing fencing topology after top-level %s " + "operation %d.%d.%d for %s", + op, add[0], add[1], add[2], xpath); fencing_topology_init(); return; } @@ -450,15 +447,15 @@ update_fencing_topology(const char *event, xmlNode *msg) NULL)) { // Topology was created or entire configuration section was deleted - crm_info("Re-initializing fencing topology after top-level " - "%s operation %d.%d.%d for %s", - op, add[0], add[1], add[2], xpath); + pcmk__info("Re-initializing fencing topology after top-level %s " + "operation %d.%d.%d for %s", + op, add[0], add[1], add[2], xpath); fencing_topology_init(); return; } - crm_trace("Nothing for us in %s operation %d.%d.%d for %s", - op, add[0], add[1], add[2], xpath); + pcmk__trace("Nothing for us in %s operation %d.%d.%d for %s", op, + add[0], add[1], add[2], xpath); } } @@ -469,11 +466,11 @@ update_cib_cache_cb(const char *event, xmlNode * msg) bool need_full_refresh = false; if(!have_cib_devices) { - crm_trace("Skipping updates until we get a full dump"); + pcmk__trace("Skipping updates until we get a full dump"); return; } else if(msg == NULL) { - crm_trace("Missing %s update", event); + pcmk__trace("Missing %s update", event); return; } @@ -485,7 +482,7 @@ update_cib_cache_cb(const char *event, xmlNode * msg) xmlNode *wrapper = NULL; xmlNode *patchset = NULL; - crm_element_value_int(msg, PCMK__XA_CIB_RC, &rc); + pcmk__xe_get_int(msg, PCMK__XA_CIB_RC, &rc); if (rc != pcmk_ok) { return; } @@ -501,12 +498,14 @@ update_cib_cache_cb(const char *event, xmlNode * msg) break; case -pcmk_err_diff_resync: case -pcmk_err_diff_failed: - crm_notice("[%s] Patch aborted: %s (%d)", event, pcmk_strerror(rc), rc); + pcmk__notice("[%s] Patch aborted: %s (%d)", event, + pcmk_strerror(rc), rc); pcmk__xml_free(local_cib); local_cib = NULL; break; default: - crm_warn("[%s] ABORTED: %s (%d)", event, pcmk_strerror(rc), rc); + pcmk__warn("[%s] ABORTED: %s (%d)", event, pcmk_strerror(rc), + rc); pcmk__xml_free(local_cib); local_cib = NULL; } @@ -541,7 +540,7 @@ update_cib_cache_cb(const char *event, xmlNode * msg) static void init_cib_cache_cb(xmlNode * msg, int call_id, int rc, xmlNode * output, void *user_data) { - crm_info("Updating device list from CIB"); + pcmk__info("Updating device list from CIB"); have_cib_devices = TRUE; local_cib = pcmk__xml_copy(NULL, output); @@ -557,10 +556,10 @@ static void cib_connection_destroy(gpointer user_data) { if (stonith_shutdown_flag) { - crm_info("Connection to the CIB manager closed"); + pcmk__info("Connection to the CIB manager closed"); return; } else { - crm_crit("Lost connection to the CIB manager, shutting down"); + pcmk__crit("Lost connection to the CIB manager, shutting down"); } if (cib_api) { cib_api->cmds->signoff(cib_api); @@ -591,7 +590,7 @@ setup_cib(void) cib_api = cib_new(); if (cib_api == NULL) { - crm_err("No connection to the CIB manager"); + pcmk__err("No connection to the CIB manager"); return; } @@ -601,7 +600,8 @@ setup_cib(void) } while (rc == -ENOTCONN && ++retries < 5); if (rc != pcmk_ok) { - crm_err("Could not connect to the CIB manager: %s (%d)", pcmk_strerror(rc), rc); + pcmk__err("Could not connect to the CIB manager: %s (%d)", + pcmk_strerror(rc), rc); return; } @@ -609,7 +609,7 @@ setup_cib(void) PCMK__VALUE_CIB_DIFF_NOTIFY, update_cib_cache_cb); if (rc != pcmk_ok) { - crm_err("Could not set CIB notification callback"); + pcmk__err("Could not set CIB notification callback"); return; } @@ -617,5 +617,5 @@ setup_cib(void) cib_api->cmds->register_callback(cib_api, rc, 120, FALSE, NULL, "init_cib_cache_cb", init_cib_cache_cb); cib_api->cmds->set_connection_dnotify(cib_api, cib_connection_destroy); - crm_info("Watching for fencing topology changes"); + pcmk__info("Watching for fencing topology changes"); } diff --git a/daemons/fenced/fenced_commands.c b/daemons/fenced/fenced_commands.c index 51666992bff..be5eade10aa 100644 --- a/daemons/fenced/fenced_commands.c +++ b/daemons/fenced/fenced_commands.c @@ -30,6 +30,7 @@ #include #include #include +#include // hash2field(), xml2list() #include #include @@ -169,14 +170,14 @@ get_action_delay_base(const stonith_device_t *device, const char *action, char *mapval = strchr(val, ':'); if (mapval == NULL || mapval[1] == 0) { - crm_err("pcmk_delay_base: empty value in mapping", val); + pcmk__err("pcmk_delay_base: empty value in mapping", val); continue; } if (mapval != val && strncasecmp(target, val, (size_t)(mapval - val)) == 0) { value = mapval + 1; - crm_debug("pcmk_delay_base mapped to %s for %s", - value, target); + pcmk__debug("pcmk_delay_base mapped to %s for %s", value, + target); break; } } @@ -225,9 +226,10 @@ get_action_timeout(const stonith_device_t *device, const char *action, * we will remap to "off", so check timeout for "off" instead */ if (pcmk__str_eq(action, PCMK_ACTION_REBOOT, pcmk__str_none) - && !pcmk_is_set(device->flags, st_device_supports_reboot)) { - crm_trace("%s doesn't support reboot, using timeout for off instead", - device->id); + && !pcmk__is_set(device->flags, st_device_supports_reboot)) { + pcmk__trace("%s doesn't support reboot, using timeout for off " + "instead", + device->id); action = PCMK_ACTION_OFF; } @@ -235,8 +237,18 @@ get_action_timeout(const stonith_device_t *device, const char *action, snprintf(buffer, sizeof(buffer), "pcmk_%s_timeout", action); value = g_hash_table_lookup(device->params, buffer); if (value) { - long long timeout_ms = crm_get_msec(value); - return (int) QB_MIN(pcmk__timeout_ms2s(timeout_ms), INT_MAX); + long long timeout_ms = 0; + + if ((pcmk__parse_ms(value, &timeout_ms) == pcmk_rc_ok) + && (timeout_ms >= 0)) { + + int timeout_sec = 0; + + timeout_ms = QB_MIN(timeout_ms, UINT_MAX); + timeout_sec = pcmk__timeout_ms2s((guint) timeout_ms); + + return QB_MIN(timeout_sec, INT_MAX); + } } } return default_timeout; @@ -297,7 +309,7 @@ fenced_device_supports_on(const char *device_id) stonith_device_t *device = g_hash_table_lookup(device_list, device_id); if (device != NULL) { - return pcmk_is_set(device->flags, st_device_supports_on); + return pcmk__is_set(device->flags, st_device_supports_on); } } return false; @@ -359,30 +371,30 @@ create_async_command(xmlNode *msg) cmd = pcmk__assert_alloc(1, sizeof(async_command_t)); // All messages must include these - cmd->action = crm_element_value_copy(op, PCMK__XA_ST_DEVICE_ACTION); - cmd->op = crm_element_value_copy(msg, PCMK__XA_ST_OP); - cmd->client = crm_element_value_copy(msg, PCMK__XA_ST_CLIENTID); + cmd->action = pcmk__xe_get_copy(op, PCMK__XA_ST_DEVICE_ACTION); + cmd->op = pcmk__xe_get_copy(msg, PCMK__XA_ST_OP); + cmd->client = pcmk__xe_get_copy(msg, PCMK__XA_ST_CLIENTID); if ((cmd->action == NULL) || (cmd->op == NULL) || (cmd->client == NULL)) { free_async_command(cmd); return NULL; } - crm_element_value_int(msg, PCMK__XA_ST_CALLID, &(cmd->id)); - crm_element_value_int(msg, PCMK__XA_ST_DELAY, &(cmd->start_delay)); - crm_element_value_int(msg, PCMK__XA_ST_TIMEOUT, &(cmd->default_timeout)); + pcmk__xe_get_int(msg, PCMK__XA_ST_CALLID, &(cmd->id)); + pcmk__xe_get_int(msg, PCMK__XA_ST_DELAY, &(cmd->start_delay)); + pcmk__xe_get_int(msg, PCMK__XA_ST_TIMEOUT, &(cmd->default_timeout)); cmd->timeout = cmd->default_timeout; rc = pcmk__xe_get_flags(msg, PCMK__XA_ST_CALLOPT, &(cmd->options), st_opt_none); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); } - cmd->origin = crm_element_value_copy(msg, PCMK__XA_SRC); - cmd->remote_op_id = crm_element_value_copy(msg, PCMK__XA_ST_REMOTE_OP); - cmd->client_name = crm_element_value_copy(msg, PCMK__XA_ST_CLIENTNAME); - cmd->target = crm_element_value_copy(op, PCMK__XA_ST_TARGET); - cmd->device = crm_element_value_copy(op, PCMK__XA_ST_DEVICE_ID); + cmd->origin = pcmk__xe_get_copy(msg, PCMK__XA_SRC); + cmd->remote_op_id = pcmk__xe_get_copy(msg, PCMK__XA_ST_REMOTE_OP); + cmd->client_name = pcmk__xe_get_copy(msg, PCMK__XA_ST_CLIENTNAME); + cmd->target = pcmk__xe_get_copy(op, PCMK__XA_ST_TARGET); + cmd->device = pcmk__xe_get_copy(op, PCMK__XA_ST_DEVICE_ID); cmd->done_cb = st_child_done; @@ -440,10 +452,10 @@ fork_cb(int pid, void *user_data) cmd->activating_on?cmd->activating_on:cmd->active_on; pcmk__assert(device != NULL); - crm_debug("Operation '%s' [%d]%s%s using %s now running with %ds timeout", - cmd->action, pid, - ((cmd->target == NULL)? "" : " targeting "), - pcmk__s(cmd->target, ""), device->id, cmd->timeout); + pcmk__debug("Operation '%s' [%d]%s%s using %s now running with %ds timeout", + cmd->action, pid, + ((cmd->target != NULL)? " targeting " : ""), + pcmk__s(cmd->target, ""), device->id, cmd->timeout); cmd->active_on = device; cmd->activating_on = NULL; } @@ -512,9 +524,9 @@ stonith_device_execute(stonith_device_t * device) active_cmds = get_active_cmds(device); action_limit = get_action_limit(device); if (action_limit > -1 && active_cmds >= action_limit) { - crm_trace("%s is over its action limit of %d (%u active action%s)", - device->id, action_limit, active_cmds, - pcmk__plural_s(active_cmds)); + pcmk__trace("%s is over its action limit of %d (%u active action%s)", + device->id, action_limit, active_cmds, + pcmk__plural_s(active_cmds)); return TRUE; } @@ -524,12 +536,12 @@ stonith_device_execute(stonith_device_t * device) gIterNext = gIter->next; if (pending_op && pending_op->delay_id) { - crm_trace("Operation '%s'%s%s using %s was asked to run too early, " - "waiting for start delay of %ds", - pending_op->action, - ((pending_op->target == NULL)? "" : " targeting "), - pcmk__s(pending_op->target, ""), - device->id, pending_op->start_delay); + pcmk__trace("Operation '%s'%s%s using %s was asked to run too " + "early, waiting for start delay of %ds", + pending_op->action, + ((pending_op->target != NULL)? " targeting ": ""), + pcmk__s(pending_op->target, ""), device->id, + pending_op->start_delay); continue; } @@ -541,7 +553,7 @@ stonith_device_execute(stonith_device_t * device) } if (cmd == NULL) { - crm_trace("No actions using %s are needed", device->id); + pcmk__trace("No actions using %s are needed", device->id); return TRUE; } @@ -553,7 +565,7 @@ stonith_device_execute(stonith_device_t * device) goto done; } } else { - crm_info("Faking success for %s watchdog operation", cmd->action); + pcmk__info("Faking success for %s watchdog operation", cmd->action); report_internal_result(cmd, CRM_EX_OK, PCMK_EXEC_DONE, NULL); goto done; } @@ -563,13 +575,13 @@ stonith_device_execute(stonith_device_t * device) exec_rc = pcmk__substitute_secrets(device->id, device->params); if (exec_rc != pcmk_rc_ok) { if (pcmk__str_eq(cmd->action, PCMK_ACTION_STOP, pcmk__str_none)) { - crm_info("Proceeding with stop operation for %s " - "despite being unable to load CIB secrets (%s)", - device->id, pcmk_rc_str(exec_rc)); + pcmk__info("Proceeding with stop operation for %s despite being " + "unable to load CIB secrets (%s)", + device->id, pcmk_rc_str(exec_rc)); } else { - crm_err("Considering %s unconfigured " - "because unable to load CIB secrets: %s", - device->id, pcmk_rc_str(exec_rc)); + pcmk__err("Considering %s unconfigured because unable to load CIB " + "secrets: %s", + device->id, pcmk_rc_str(exec_rc)); report_internal_result(cmd, CRM_EX_ERROR, PCMK_EXEC_NO_SECRETS, "Failed to get CIB secrets"); goto done; @@ -579,19 +591,19 @@ stonith_device_execute(stonith_device_t * device) action_str = cmd->action; if (pcmk__str_eq(cmd->action, PCMK_ACTION_REBOOT, pcmk__str_none) - && !pcmk_is_set(device->flags, st_device_supports_reboot)) { + && !pcmk__is_set(device->flags, st_device_supports_reboot)) { - crm_notice("Remapping 'reboot' action%s%s using %s to 'off' " - "because agent '%s' does not support reboot", - ((cmd->target == NULL)? "" : " targeting "), - pcmk__s(cmd->target, ""), device->id, device->agent); + pcmk__notice("Remapping 'reboot' action%s%s using %s to 'off' because " + "agent '%s' does not support reboot", + ((cmd->target == NULL)? "" : " targeting "), + pcmk__s(cmd->target, ""), device->id, device->agent); action_str = PCMK_ACTION_OFF; } - if (pcmk_is_set(device->flags, st_device_supports_parameter_port)) { + if (pcmk__is_set(device->flags, st_device_supports_parameter_port)) { host_arg = "port"; - } else if (pcmk_is_set(device->flags, st_device_supports_parameter_plug)) { + } else if (pcmk__is_set(device->flags, st_device_supports_parameter_plug)) { host_arg = "plug"; } @@ -666,18 +678,19 @@ schedule_stonith_command(async_command_t * cmd, stonith_device_t * device) cmd->timeout = get_action_timeout(device, cmd->action, cmd->default_timeout); if (cmd->remote_op_id) { - crm_debug("Scheduling '%s' action%s%s using %s for remote peer %s " - "with op id %.8s and timeout %ds", - cmd->action, - (cmd->target == NULL)? "" : " targeting ", - pcmk__s(cmd->target, ""), - device->id, cmd->origin, cmd->remote_op_id, cmd->timeout); + pcmk__debug("Scheduling '%s' action%s%s using %s for remote peer %s " + "with op id %.8s and timeout %ds", + cmd->action, + ((cmd->target != NULL)? " targeting " : ""), + pcmk__s(cmd->target, ""), + device->id, cmd->origin, cmd->remote_op_id, cmd->timeout); } else { - crm_debug("Scheduling '%s' action%s%s using %s for %s with timeout %ds", - cmd->action, - (cmd->target == NULL)? "" : " targeting ", - pcmk__s(cmd->target, ""), - device->id, cmd->client, cmd->timeout); + pcmk__debug("Scheduling '%s' action%s%s using %s for %s with timeout " + "%ds", + cmd->action, + ((cmd->target != NULL)? " targeting " : ""), + pcmk__s(cmd->target, ""), + device->id, cmd->client, cmd->timeout); } device->pending_ops = g_list_append(device->pending_ops, cmd); @@ -694,10 +707,10 @@ schedule_stonith_command(async_command_t * cmd, stonith_device_t * device) delay_max = delay_base; } if (delay_max < delay_base) { - crm_warn(PCMK_STONITH_DELAY_BASE " (%ds) is larger than " - PCMK_STONITH_DELAY_MAX " (%ds) for %s using %s " - "(limiting to maximum delay)", - delay_base, delay_max, cmd->action, device->id); + pcmk__warn(PCMK_STONITH_DELAY_BASE " (%ds) is larger than " + PCMK_STONITH_DELAY_MAX " (%ds) for %s using %s (limiting to " + "maximum delay)", + delay_base, delay_max, cmd->action, device->id); delay_base = delay_max; } if (delay_max > 0) { @@ -708,13 +721,11 @@ schedule_stonith_command(async_command_t * cmd, stonith_device_t * device) } if (cmd->start_delay > 0) { - crm_notice("Delaying '%s' action%s%s using %s for %ds " QB_XS - " timeout=%ds requested_delay=%ds base=%ds max=%ds", - cmd->action, - (cmd->target == NULL)? "" : " targeting ", - pcmk__s(cmd->target, ""), - device->id, cmd->start_delay, cmd->timeout, - requested_delay, delay_base, delay_max); + pcmk__notice("Delaying '%s' action%s%s using %s for %ds " + QB_XS " timeout=%ds requested_delay=%ds base=%ds max=%ds", + cmd->action, (cmd->target == NULL)? "" : " targeting ", + pcmk__s(cmd->target, ""), device->id, cmd->start_delay, + cmd->timeout, requested_delay, delay_base, delay_max); cmd->delay_id = pcmk__create_timer(cmd->start_delay * 1000, start_delay_helper, cmd); } @@ -732,7 +743,8 @@ free_device(gpointer data) for (gIter = device->pending_ops; gIter != NULL; gIter = gIter->next) { async_command_t *cmd = gIter->data; - crm_warn("Removal of device '%s' purged operation '%s'", device->id, cmd->action); + pcmk__warn("Removal of device '%s' purged operation '%s'", device->id, + cmd->action); report_internal_result(cmd, CRM_EX_ERROR, PCMK_EXEC_NO_FENCE_DEVICE, "Device was removed before action could be executed"); } @@ -823,7 +835,7 @@ build_port_aliases(const char *hostmap, GList ** targets) } value[k] = '\0'; - crm_debug("Adding alias '%s'='%s'", name, value); + pcmk__debug("Adding alias '%s'='%s'", name, value); g_hash_table_replace(aliases, name, value); if (targets) { *targets = g_list_append(*targets, pcmk__str_copy(value)); @@ -833,7 +845,8 @@ build_port_aliases(const char *hostmap, GList ** targets) added++; } else if (lpc > last) { - crm_debug("Parse error at offset %d near '%s'", lpc - last, hostmap + last); + pcmk__debug("Parse error at offset %d near '%s'", + (lpc - last), (hostmap + last)); } last = lpc + 1; @@ -846,7 +859,7 @@ build_port_aliases(const char *hostmap, GList ** targets) } if (added == 0) { - crm_info("No host mappings detected in '%s'", hostmap); + pcmk__info("No host mappings detected in '%s'", hostmap); } free(name); @@ -889,15 +902,16 @@ get_agent_metadata(const char *agent, xmlNode ** metadata) int rc; if (st == NULL) { - crm_warn("Could not get agent meta-data: " - "API memory allocation failed"); + pcmk__warn("Could not get agent meta-data: API memory allocation " + "failed"); return EAGAIN; } rc = st->cmds->metadata(st, st_opt_sync_call, agent, NULL, &buffer, 10); stonith_api_delete(st); if (rc || !buffer) { - crm_err("Could not retrieve metadata for fencing agent %s", agent); + pcmk__err("Could not retrieve metadata for fencing agent %s", + agent); return EAGAIN; } g_hash_table_replace(metadata_cache, pcmk__str_copy(agent), buffer); @@ -955,7 +969,7 @@ read_action_metadata(stonith_device_t *device) CRM_LOG_ASSERT(match != NULL); if(match == NULL) { continue; }; - action = crm_element_value(match, PCMK_XA_NAME); + action = pcmk__xe_get(match, PCMK_XA_NAME); if (pcmk__str_eq(action, PCMK_ACTION_LIST, pcmk__str_none)) { stonith__set_device_flags(device->flags, device->id, @@ -1004,9 +1018,9 @@ target_list_type(stonith_device_t * dev) check_type = PCMK_VALUE_STATIC_LIST; } else if (g_hash_table_lookup(dev->params, PCMK_STONITH_HOST_MAP)) { check_type = PCMK_VALUE_STATIC_LIST; - } else if (pcmk_is_set(dev->flags, st_device_supports_list)) { + } else if (pcmk__is_set(dev->flags, st_device_supports_list)) { check_type = PCMK_VALUE_DYNAMIC_LIST; - } else if (pcmk_is_set(dev->flags, st_device_supports_status)) { + } else if (pcmk__is_set(dev->flags, st_device_supports_status)) { check_type = PCMK_VALUE_STATUS; } else { check_type = PCMK_VALUE_NONE; @@ -1021,15 +1035,15 @@ build_device_from_xml(xmlNode *dev) { const char *value; stonith_device_t *device = NULL; - char *agent = crm_element_value_copy(dev, PCMK_XA_AGENT); + char *agent = pcmk__xe_get_copy(dev, PCMK_XA_AGENT); CRM_CHECK(agent != NULL, return device); device = pcmk__assert_alloc(1, sizeof(stonith_device_t)); - device->id = crm_element_value_copy(dev, PCMK_XA_ID); + device->id = pcmk__xe_get_copy(dev, PCMK_XA_ID); device->agent = agent; - device->namespace = crm_element_value_copy(dev, PCMK__XA_NAMESPACE); + device->namespace = pcmk__xe_get_copy(dev, PCMK__XA_NAMESPACE); device->params = xml2list(dev); value = g_hash_table_lookup(device->params, PCMK_STONITH_HOST_LIST); @@ -1076,19 +1090,19 @@ build_device_from_xml(xmlNode *dev) device->include_nodeid = is_nodeid_required(device->agent_metadata); } - value = crm_element_value(dev, PCMK__XA_RSC_PROVIDES); + value = pcmk__xe_get(dev, PCMK__XA_RSC_PROVIDES); if (pcmk__str_eq(value, PCMK_VALUE_UNFENCING, pcmk__str_casei)) { device->automatic_unfencing = TRUE; } if (is_action_required(PCMK_ACTION_ON, device)) { - crm_info("Fencing device '%s' requires unfencing", device->id); + pcmk__info("Fencing device '%s' requires unfencing", device->id); } if (device->on_target_actions != NULL) { - crm_info("Fencing device '%s' requires actions (%s) to be executed " - "on target", device->id, - (const char *) device->on_target_actions->str); + pcmk__info("Fencing device '%s' requires actions (%s) to be executed " + "on target", + device->id, (const char *) device->on_target_actions->str); } device->work = mainloop_add_trigger(G_PRIORITY_HIGH, stonith_device_dispatch, device); @@ -1154,32 +1168,34 @@ status_search_cb(int pid, const pcmk__action_result_t *result, void *user_data) mainloop_set_trigger(dev->work); if (result->execution_status != PCMK_EXEC_DONE) { - crm_warn("Assuming %s cannot fence %s " - "because status could not be executed: %s%s%s%s", - dev->id, search->host, - pcmk_exec_status_str(result->execution_status), - ((result->exit_reason == NULL)? "" : " ("), - ((result->exit_reason == NULL)? "" : result->exit_reason), - ((result->exit_reason == NULL)? "" : ")")); + const char *reason = result->exit_reason; + + pcmk__warn("Assuming %s cannot fence %s because status could not be " + "executed: %s%s%s%s", + dev->id, search->host, + pcmk_exec_status_str(result->execution_status), + ((reason != NULL)? " (" : ""), pcmk__s(reason, ""), + ((reason != NULL)? ")" : "")); search_devices_record_result(search, dev->id, FALSE); return; } switch (result->exit_status) { case fence_status_unknown: - crm_trace("%s reported it cannot fence %s", dev->id, search->host); + pcmk__trace("%s reported it cannot fence %s", dev->id, + search->host); break; case fence_status_active: case fence_status_inactive: - crm_trace("%s reported it can fence %s", dev->id, search->host); + pcmk__trace("%s reported it can fence %s", dev->id, search->host); can = TRUE; break; default: - crm_warn("Assuming %s cannot fence %s " - "(status returned unknown code %d)", - dev->id, search->host, result->exit_status); + pcmk__warn("Assuming %s cannot fence %s (status returned unknown " + "code %d)", + dev->id, search->host, result->exit_status); break; } search_devices_record_result(search, dev->id, can); @@ -1209,45 +1225,48 @@ dynamic_list_search_cb(int pid, const pcmk__action_result_t *result, mainloop_set_trigger(dev->work); if (pcmk__result_ok(result)) { - crm_info("Refreshing target list for %s", dev->id); + pcmk__info("Refreshing target list for %s", dev->id); g_list_free_full(dev->targets, free); dev->targets = stonith__parse_targets(result->action_stdout); dev->targets_age = time(NULL); } else if (dev->targets != NULL) { if (result->execution_status == PCMK_EXEC_DONE) { - crm_info("Reusing most recent target list for %s " - "because list returned error code %d", - dev->id, result->exit_status); + pcmk__info("Reusing most recent target list for %s because list " + "returned error code %d", + dev->id, result->exit_status); } else { - crm_info("Reusing most recent target list for %s " - "because list could not be executed: %s%s%s%s", - dev->id, pcmk_exec_status_str(result->execution_status), - ((result->exit_reason == NULL)? "" : " ("), - ((result->exit_reason == NULL)? "" : result->exit_reason), - ((result->exit_reason == NULL)? "" : ")")); + const char *reason = result->exit_reason; + + pcmk__info("Reusing most recent target list for %s because list " + "could not be executed: %s%s%s%s", + dev->id, pcmk_exec_status_str(result->execution_status), + ((reason != NULL)? " (" : ""), pcmk__s(reason, ""), + ((reason != NULL)? ")" : "")); } } else { // We have never successfully executed list if (result->execution_status == PCMK_EXEC_DONE) { - crm_warn("Assuming %s cannot fence %s " - "because list returned error code %d", - dev->id, search->host, result->exit_status); + pcmk__warn("Assuming %s cannot fence %s because list returned " + "error code %d", + dev->id, search->host, result->exit_status); } else { - crm_warn("Assuming %s cannot fence %s " - "because list could not be executed: %s%s%s%s", - dev->id, search->host, - pcmk_exec_status_str(result->execution_status), - ((result->exit_reason == NULL)? "" : " ("), - ((result->exit_reason == NULL)? "" : result->exit_reason), - ((result->exit_reason == NULL)? "" : ")")); + const char *reason = result->exit_reason; + + pcmk__warn("Assuming %s cannot fence %s because list could not be " + "executed: %s%s%s%s", + dev->id, search->host, + pcmk_exec_status_str(result->execution_status), + ((reason != NULL)? " (" : ""), pcmk__s(reason, ""), + ((reason != NULL)? ")" : "")); } /* Fall back to pcmk_host_check=PCMK_VALUE_STATUS if the user didn't * explicitly specify PCMK_VALUE_DYNAMIC_LIST */ if (g_hash_table_lookup(dev->params, PCMK_STONITH_HOST_CHECK) == NULL) { - crm_notice("Switching to pcmk_host_check='status' for %s", dev->id); + pcmk__notice("Switching to pcmk_host_check='status' for %s", + dev->id); pcmk__insert_dup(dev->params, PCMK_STONITH_HOST_CHECK, PCMK_VALUE_STATUS); } @@ -1287,7 +1306,8 @@ device_params_diff(GHashTable *first, GHashTable *second) { char *other_value = g_hash_table_lookup(second, key); if (!other_value || !pcmk__str_eq(other_value, value, pcmk__str_casei)) { - crm_trace("Different value for %s: %s != %s", key, other_value, value); + pcmk__trace("Different value for %s: %s != %s", key, + other_value, value); return 1; } } @@ -1306,11 +1326,11 @@ device_has_duplicate(const stonith_device_t *device) stonith_device_t *dup = g_hash_table_lookup(device_list, device->id); if (!dup) { - crm_trace("No match for %s", device->id); + pcmk__trace("No match for %s", device->id); return NULL; } else if (!pcmk__str_eq(dup->agent, device->agent, pcmk__str_casei)) { - crm_trace("Different agent: %s != %s", dup->agent, device->agent); + pcmk__trace("Different agent: %s != %s", dup->agent, device->agent); return NULL; } @@ -1320,7 +1340,7 @@ device_has_duplicate(const stonith_device_t *device) return NULL; } - crm_trace("Match"); + pcmk__trace("Match"); return dup; } @@ -1339,22 +1359,22 @@ stonith_device_register(xmlNode *dev, gboolean from_cib) pcmk__str_any_of(device->agent, STONITH_WATCHDOG_AGENT, STONITH_WATCHDOG_AGENT_INTERNAL, NULL)) do { if (stonith_watchdog_timeout_ms <= 0) { - crm_err("Ignoring watchdog fence device without " - PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " set."); + pcmk__err("Ignoring watchdog fence device without " + PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " set"); rv = -ENODEV; /* fall through to cleanup & return */ } else if (!pcmk__str_any_of(device->agent, STONITH_WATCHDOG_AGENT, STONITH_WATCHDOG_AGENT_INTERNAL, NULL)) { - crm_err("Ignoring watchdog fence device with unknown " - "agent '%s' unequal '" STONITH_WATCHDOG_AGENT "'.", - device->agent?device->agent:""); + pcmk__err("Ignoring watchdog fence device with unknown agent '%s' " + "unequal to '" STONITH_WATCHDOG_AGENT "'", + pcmk__s(device->agent, "")); rv = -ENODEV; /* fall through to cleanup & return */ } else if (!pcmk__str_eq(device->id, STONITH_WATCHDOG_ID, pcmk__str_none)) { - crm_err("Ignoring watchdog fence device " - "named %s !='"STONITH_WATCHDOG_ID"'.", - device->id?device->id:""); + pcmk__err("Ignoring watchdog fence device named " + "'%s' != '" STONITH_WATCHDOG_ID "'", + pcmk__s(device->id, "")); rv = -ENODEV; /* fall through to cleanup & return */ } else { @@ -1378,7 +1398,8 @@ stonith_device_register(xmlNode *dev, gboolean from_cib) break; } - crm_debug("Skip registration of watchdog fence device on node not in host-list."); + pcmk__debug("Skip registration of watchdog fence device on node " + "not in host-list."); /* cleanup and fall through to more cleanup and return */ device->targets = NULL; stonith_device_remove(device->id, from_cib); @@ -1390,8 +1411,8 @@ stonith_device_register(xmlNode *dev, gboolean from_cib) dup = device_has_duplicate(device); if (dup) { ndevices = g_hash_table_size(device_list); - crm_debug("Device '%s' already in device list (%d active device%s)", - device->id, ndevices, pcmk__plural_s(ndevices)); + pcmk__debug("Device '%s' already in device list (%d active device%s)", + device->id, ndevices, pcmk__plural_s(ndevices)); free_device(device); device = dup; dup = g_hash_table_lookup(device_list, device->id); @@ -1405,7 +1426,8 @@ stonith_device_register(xmlNode *dev, gboolean from_cib) * copy any pending ops that currently exist on the old entry to the new one. * Otherwise the pending ops will be reported as failures */ - crm_info("Overwriting existing entry for %s from CIB", device->id); + pcmk__info("Overwriting existing entry for %s from CIB", + device->id); device->pending_ops = old->pending_ops; device->api_registered = TRUE; old->pending_ops = NULL; @@ -1416,8 +1438,8 @@ stonith_device_register(xmlNode *dev, gboolean from_cib) g_hash_table_replace(device_list, device->id, device); ndevices = g_hash_table_size(device_list); - crm_notice("Added '%s' to device list (%d active device%s)", - device->id, ndevices, pcmk__plural_s(ndevices)); + pcmk__notice("Added '%s' to device list (%d active device%s)", + device->id, ndevices, pcmk__plural_s(ndevices)); } if (from_cib) { @@ -1437,8 +1459,8 @@ stonith_device_remove(const char *id, bool from_cib) if (!device) { ndevices = g_hash_table_size(device_list); - crm_info("Device '%s' not found (%d active device%s)", - id, ndevices, pcmk__plural_s(ndevices)); + pcmk__info("Device '%s' not found (%d active device%s)", id, ndevices, + pcmk__plural_s(ndevices)); return; } @@ -1452,14 +1474,14 @@ stonith_device_remove(const char *id, bool from_cib) if (!device->cib_registered && !device->api_registered) { g_hash_table_remove(device_list, id); ndevices = g_hash_table_size(device_list); - crm_info("Removed '%s' from device list (%d active device%s)", - id, ndevices, pcmk__plural_s(ndevices)); + pcmk__info("Removed '%s' from device list (%u active device%s)", id, + ndevices, pcmk__plural_s(ndevices)); } else { - crm_trace("Not removing '%s' from device list (%d active) because " - "still registered via:%s%s", - id, g_hash_table_size(device_list), - (device->cib_registered? " cib" : ""), - (device->api_registered? " api" : "")); + pcmk__trace("Not removing '%s' from device list (%u active) because " + "still registered via:%s%s", + id, g_hash_table_size(device_list), + (device->cib_registered? " cib" : ""), + (device->api_registered? " api" : "")); } } @@ -1530,18 +1552,20 @@ stonith_level_key(const xmlNode *level, enum fenced_target_by mode) } switch (mode) { case fenced_target_by_name: - return crm_element_value_copy(level, PCMK_XA_TARGET); + return pcmk__xe_get_copy(level, PCMK_XA_TARGET); case fenced_target_by_pattern: - return crm_element_value_copy(level, PCMK_XA_TARGET_PATTERN); + return pcmk__xe_get_copy(level, PCMK_XA_TARGET_PATTERN); case fenced_target_by_attribute: - return crm_strdup_printf("%s=%s", - crm_element_value(level, PCMK_XA_TARGET_ATTRIBUTE), - crm_element_value(level, PCMK_XA_TARGET_VALUE)); + return pcmk__assert_asprintf("%s=%s", + pcmk__xe_get(level, + PCMK_XA_TARGET_ATTRIBUTE), + pcmk__xe_get(level, + PCMK_XA_TARGET_VALUE)); default: - return crm_strdup_printf("unknown-%s", pcmk__xe_id(level)); + return pcmk__assert_asprintf("unknown-%s", pcmk__xe_id(level)); } } @@ -1556,14 +1580,14 @@ stonith_level_key(const xmlNode *level, enum fenced_target_by mode) static enum fenced_target_by unpack_level_kind(const xmlNode *level) { - if (crm_element_value(level, PCMK_XA_TARGET) != NULL) { + if (pcmk__xe_get(level, PCMK_XA_TARGET) != NULL) { return fenced_target_by_name; } - if (crm_element_value(level, PCMK_XA_TARGET_PATTERN) != NULL) { + if (pcmk__xe_get(level, PCMK_XA_TARGET_PATTERN) != NULL) { return fenced_target_by_pattern; } - if ((crm_element_value(level, PCMK_XA_TARGET_ATTRIBUTE) != NULL) - && (crm_element_value(level, PCMK_XA_TARGET_VALUE) != NULL)) { + if ((pcmk__xe_get(level, PCMK_XA_TARGET_ATTRIBUTE) != NULL) + && (pcmk__xe_get(level, PCMK_XA_TARGET_VALUE) != NULL)) { return fenced_target_by_attribute; } return fenced_target_by_unknown; @@ -1628,14 +1652,14 @@ unpack_level_request(xmlNode *xml, enum fenced_target_by *mode, char **target, if (xml == NULL) { if (desc != NULL) { - *desc = crm_strdup_printf("missing"); + *desc = pcmk__assert_asprintf("missing"); } } else { local_mode = unpack_level_kind(xml); local_target = stonith_level_key(xml, local_mode); - crm_element_value_int(xml, PCMK_XA_INDEX, &local_id); + pcmk__xe_get_int(xml, PCMK_XA_INDEX, &local_id); if (desc != NULL) { - *desc = crm_strdup_printf("%s[%d]", local_target, local_id); + *desc = pcmk__assert_asprintf("%s[%d]", local_target, local_id); } } @@ -1690,9 +1714,9 @@ fenced_register_level(xmlNode *msg, char **desc, pcmk__action_result_t *result) // Ensure an ID was given (even the client API adds an ID) if (pcmk__str_empty(pcmk__xe_id(level))) { - crm_warn("Ignoring registration for topology level without ID"); + pcmk__warn("Ignoring registration for topology level without ID"); free(target); - crm_log_xml_trace(level, "Bad level"); + pcmk__log_xml_trace(level, "Bad level"); pcmk__format_result(result, CRM_EX_INVALID_PARAM, PCMK_EXEC_INVALID, "Topology level is invalid without ID"); return; @@ -1700,10 +1724,11 @@ fenced_register_level(xmlNode *msg, char **desc, pcmk__action_result_t *result) // Ensure a valid target was specified if (mode == fenced_target_by_unknown) { - crm_warn("Ignoring registration for topology level '%s' " - "without valid target", pcmk__xe_id(level)); + pcmk__warn("Ignoring registration for topology level '%s' without " + "valid target", + pcmk__xe_id(level)); free(target); - crm_log_xml_trace(level, "Bad level"); + pcmk__log_xml_trace(level, "Bad level"); pcmk__format_result(result, CRM_EX_INVALID_PARAM, PCMK_EXEC_INVALID, "Invalid target for topology level '%s'", pcmk__xe_id(level)); @@ -1712,14 +1737,14 @@ fenced_register_level(xmlNode *msg, char **desc, pcmk__action_result_t *result) // Ensure level ID is in allowed range if ((id < ST__LEVEL_MIN) || (id > ST__LEVEL_MAX)) { - crm_warn("Ignoring topology registration for %s with invalid level %d", - target, id); + pcmk__warn("Ignoring topology registration for %s with invalid level " + "%d", + target, id); free(target); - crm_log_xml_trace(level, "Bad level"); + pcmk__log_xml_trace(level, "Bad level"); pcmk__format_result(result, CRM_EX_INVALID_PARAM, PCMK_EXEC_INVALID, "Invalid level number '%s' for topology level '%s'", - pcmk__s(crm_element_value(level, PCMK_XA_INDEX), - ""), + pcmk__s(pcmk__xe_get(level, PCMK_XA_INDEX), ""), pcmk__xe_id(level)); return; } @@ -1731,29 +1756,27 @@ fenced_register_level(xmlNode *msg, char **desc, pcmk__action_result_t *result) tp->kind = mode; tp->target = target; - tp->target_value = crm_element_value_copy(level, PCMK_XA_TARGET_VALUE); - tp->target_pattern = crm_element_value_copy(level, - PCMK_XA_TARGET_PATTERN); - tp->target_attribute = crm_element_value_copy(level, - PCMK_XA_TARGET_ATTRIBUTE); + tp->target_value = pcmk__xe_get_copy(level, PCMK_XA_TARGET_VALUE); + tp->target_pattern = pcmk__xe_get_copy(level, PCMK_XA_TARGET_PATTERN); + tp->target_attribute = pcmk__xe_get_copy(level, PCMK_XA_TARGET_ATTRIBUTE); g_hash_table_replace(topology, tp->target, tp); - crm_trace("Added %s (%d) to the topology (%d active entries)", - target, (int) mode, g_hash_table_size(topology)); + pcmk__trace("Added %s (%d) to the topology (%u active entries)", target, + (int) mode, g_hash_table_size(topology)); } else { free(target); } if (tp->levels[id] != NULL) { - crm_info("Adding to the existing %s[%d] topology entry", - tp->target, id); + pcmk__info("Adding to the existing %s[%d] topology entry", tp->target, + id); } - devices = parse_device_list(crm_element_value(level, PCMK_XA_DEVICES)); + devices = parse_device_list(pcmk__xe_get(level, PCMK_XA_DEVICES)); for (dIter = devices; dIter; dIter = dIter->next) { const char *device = dIter->value; - crm_trace("Adding device '%s' for %s[%d]", device, tp->target, id); + pcmk__trace("Adding device '%s' for %s[%d]", device, tp->target, id); tp->levels[id] = g_list_append(tp->levels[id], pcmk__str_copy(device)); } stonith_key_value_freeall(devices, 1, 1); @@ -1761,8 +1784,8 @@ fenced_register_level(xmlNode *msg, char **desc, pcmk__action_result_t *result) { int nlevels = count_active_levels(tp); - crm_info("Target %s has %d active fencing level%s", - tp->target, nlevels, pcmk__plural_s(nlevels)); + pcmk__info("Target %s has %d active fencing level%s", tp->target, + nlevels, pcmk__plural_s(nlevels)); } pcmk__set_result(result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); @@ -1799,13 +1822,14 @@ fenced_unregister_level(xmlNode *msg, char **desc, // Ensure level ID is in allowed range if ((id < 0) || (id >= ST__LEVEL_COUNT)) { - crm_warn("Ignoring topology unregistration for %s with invalid level %d", - target, id); + pcmk__warn("Ignoring topology unregistration for %s with invalid level " + "%d", + target, id); free(target); - crm_log_xml_trace(level, "Bad level"); + pcmk__log_xml_trace(level, "Bad level"); pcmk__format_result(result, CRM_EX_INVALID_PARAM, PCMK_EXEC_INVALID, "Invalid level number '%s' for topology level %s", - pcmk__s(crm_element_value(level, PCMK_XA_INDEX), + pcmk__s(pcmk__xe_get(level, PCMK_XA_INDEX), ""), // Client API doesn't add ID to unregistration XML @@ -1817,16 +1841,16 @@ fenced_unregister_level(xmlNode *msg, char **desc, if (tp == NULL) { guint nentries = g_hash_table_size(topology); - crm_info("No fencing topology found for %s (%d active %s)", - target, nentries, - pcmk__plural_alt(nentries, "entry", "entries")); + pcmk__info("No fencing topology found for %s (%d active %s)", target, + nentries, pcmk__plural_alt(nentries, "entry", "entries")); } else if (id == 0 && g_hash_table_remove(topology, target)) { guint nentries = g_hash_table_size(topology); - crm_info("Removed all fencing topology entries related to %s " - "(%d active %s remaining)", target, nentries, - pcmk__plural_alt(nentries, "entry", "entries")); + pcmk__info("Removed all fencing topology entries related to %s (%d " + "active %s remaining)", + target, nentries, + pcmk__plural_alt(nentries, "entry", "entries")); } else if (tp->levels[id] != NULL) { guint nlevels; @@ -1835,9 +1859,9 @@ fenced_unregister_level(xmlNode *msg, char **desc, tp->levels[id] = NULL; nlevels = count_active_levels(tp); - crm_info("Removed level %d from fencing topology for %s " - "(%d active level%s remaining)", - id, target, nlevels, pcmk__plural_s(nlevels)); + pcmk__info("Removed level %d from fencing topology for %s (%d " + "active level%s remaining)", + id, target, nlevels, pcmk__plural_s(nlevels)); } free(target); @@ -1902,15 +1926,15 @@ execute_agent_action(xmlNode *msg, pcmk__action_result_t *result) xmlNode *op = pcmk__xpath_find_one(msg->doc, "//*[@" PCMK__XA_ST_DEVICE_ACTION "]", LOG_ERR); - const char *id = crm_element_value(dev, PCMK__XA_ST_DEVICE_ID); - const char *action = crm_element_value(op, PCMK__XA_ST_DEVICE_ACTION); + const char *id = pcmk__xe_get(dev, PCMK__XA_ST_DEVICE_ID); + const char *action = pcmk__xe_get(op, PCMK__XA_ST_DEVICE_ACTION); async_command_t *cmd = NULL; stonith_device_t *device = NULL; if ((id == NULL) || (action == NULL)) { - crm_info("Malformed API action request: device %s, action %s", - (id? id : "not specified"), - (action? action : "not specified")); + pcmk__info("Malformed API action request: device %s, action %s", + pcmk__s(id, "not specified"), + pcmk__s(action, "not specified")); fenced_set_protocol_error(result); return; } @@ -1938,8 +1962,9 @@ execute_agent_action(xmlNode *msg, pcmk__action_result_t *result) device = g_hash_table_lookup(device_list, id); if (device == NULL) { - crm_info("Ignoring API '%s' action request because device %s not found", - action, id); + pcmk__info("Ignoring API '%s' action request because device %s not " + "found", + action, id); pcmk__format_result(result, CRM_EX_ERROR, PCMK_EXEC_NO_FENCE_DEVICE, "'%s' not found", id); return; @@ -1947,8 +1972,9 @@ execute_agent_action(xmlNode *msg, pcmk__action_result_t *result) } else if (!device->api_registered && (strcmp(action, PCMK_ACTION_MONITOR) == 0)) { // Monitors may run only on "started" (API-registered) devices - crm_info("Ignoring API '%s' action request because device %s not active", - action, id); + pcmk__info("Ignoring API '%s' action request because device %s not " + "active", + action, id); pcmk__format_result(result, CRM_EX_ERROR, PCMK_EXEC_NO_FENCE_DEVICE, "'%s' not active", id); return; @@ -1956,7 +1982,7 @@ execute_agent_action(xmlNode *msg, pcmk__action_result_t *result) cmd = create_async_command(msg); if (cmd == NULL) { - crm_log_xml_warn(msg, "invalid"); + pcmk__log_xml_warn(msg, "invalid"); fenced_set_protocol_error(result); return; } @@ -1972,7 +1998,7 @@ search_devices_record_result(struct device_search_s *search, const char *device, if (can_fence && device) { if (search->support_action_only != st_device_supports_none) { stonith_device_t *dev = g_hash_table_lookup(device_list, device); - if (dev && !pcmk_is_set(dev->flags, search->support_action_only)) { + if (dev && !pcmk__is_set(dev->flags, search->support_action_only)) { return; } } @@ -1984,10 +2010,11 @@ search_devices_record_result(struct device_search_s *search, const char *device, guint ndevices = g_list_length(search->capable); - crm_debug("Search found %d device%s that can perform '%s' targeting %s", - ndevices, pcmk__plural_s(ndevices), - (search->action? search->action : "unknown action"), - (search->host? search->host : "any node")); + pcmk__debug("Search found %d device%s that can perform '%s' targeting " + "%s", + ndevices, pcmk__plural_s(ndevices), + pcmk__s(search->action, "unknown action"), + pcmk__s(search->host, "any node")); search->callback(search->capable, search->user_data); free(search->host); @@ -2020,13 +2047,14 @@ localhost_is_eligible(const stonith_device_t *device, const char *action, action) != NULL)) { if (!localhost_is_target) { - crm_trace("Operation '%s' using %s can only be executed for local " - "host, not %s", action, device->id, target); + pcmk__trace("Operation '%s' using %s can only be executed for " + "local host, not %s", + action, device->id, target); return FALSE; } } else if (localhost_is_target && !allow_self) { - crm_trace("'%s' operation does not support self-fencing", action); + pcmk__trace("'%s' operation does not support self-fencing", action); return FALSE; } return TRUE; @@ -2114,7 +2142,7 @@ can_fence_host_with_device(stonith_device_t *dev, * or the local node is not allowed to perform it */ if (pcmk__str_eq(action, PCMK_ACTION_ON, pcmk__str_none) - && !pcmk_is_set(dev->flags, st_device_supports_on)) { + && !pcmk__is_set(dev->flags, st_device_supports_on)) { check_type = "Agent does not support 'on'"; goto search_report_results; @@ -2147,14 +2175,16 @@ can_fence_host_with_device(stonith_device_t *dev, search->per_device_timeout); if (device_timeout > search->per_device_timeout) { - crm_notice("Since the pcmk_list_timeout (%ds) parameter of %s " - "is larger than " PCMK_OPT_STONITH_TIMEOUT - " (%ds), timeout may occur", - device_timeout, dev_id, search->per_device_timeout); + pcmk__notice("Since the pcmk_list_timeout (%ds) parameter of " + "%s is larger than " PCMK_OPT_STONITH_TIMEOUT " " + "(%ds), timeout may occur", + device_timeout, dev_id, + search->per_device_timeout); } - crm_trace("Running '%s' to check whether %s is eligible to fence %s (%s)", - check_type, dev_id, target, action); + pcmk__trace("Running '%s' to check whether %s is eligible to fence " + "%s (%s)", + check_type, dev_id, target, action); schedule_internal_command(__func__, dev, PCMK_ACTION_LIST, NULL, search->per_device_timeout, search, dynamic_list_search_cb); @@ -2172,29 +2202,32 @@ can_fence_host_with_device(stonith_device_t *dev, int device_timeout = get_action_timeout(dev, check_type, search->per_device_timeout); if (device_timeout > search->per_device_timeout) { - crm_notice("Since the pcmk_status_timeout (%ds) parameter of %s is " - "larger than " PCMK_OPT_STONITH_TIMEOUT " (%ds), " - "timeout may occur", - device_timeout, dev_id, search->per_device_timeout); + pcmk__notice("Since the pcmk_status_timeout (%ds) parameter of %s " + "is larger than " PCMK_OPT_STONITH_TIMEOUT " (%ds), " + "timeout may occur", + device_timeout, dev_id, search->per_device_timeout); } - crm_trace("Running '%s' to check whether %s is eligible to fence %s (%s)", - check_type, dev_id, target, action); + pcmk__trace("Running '%s' to check whether %s is eligible to fence %s " + "(%s)", + check_type, dev_id, target, action); schedule_internal_command(__func__, dev, PCMK_ACTION_STATUS, target, search->per_device_timeout, search, status_search_cb); /* we'll respond to this search request async in the cb */ return; } else { - crm_err("Invalid value for " PCMK_STONITH_HOST_CHECK ": %s", check_type); + pcmk__err("Invalid value for " PCMK_STONITH_HOST_CHECK ": %s", + check_type); check_type = "Invalid " PCMK_STONITH_HOST_CHECK; } search_report_results: - crm_info("%s is%s eligible to fence (%s) %s%s%s%s: %s", - dev_id, (can? "" : " not"), pcmk__s(action, "unspecified action"), - pcmk__s(target, "unspecified target"), - (alias == NULL)? "" : " (as '", pcmk__s(alias, ""), - (alias == NULL)? "" : "')", check_type); + pcmk__info("%s is%s eligible to fence (%s) %s%s%s%s: %s", + dev_id, (can? "" : " not"), + pcmk__s(action, "unspecified action"), + pcmk__s(target, "unspecified target"), + ((alias != NULL)? " (as '" : ""), pcmk__s(alias, ""), + ((alias != NULL)? "')" : ""), check_type); search_devices_record_result(search, ((dev == NULL)? NULL : dev_id), can); } @@ -2237,10 +2270,11 @@ get_capable_devices(const char *host, const char *action, int timeout, */ search->replies_needed = ndevices; - crm_debug("Searching %d device%s to see which can execute '%s' targeting %s", - ndevices, pcmk__plural_s(ndevices), - (search->action? search->action : "unknown action"), - (search->host? search->host : "any node")); + pcmk__debug("Searching %d device%s to see which can execute '%s' targeting " + "%s", + ndevices, pcmk__plural_s(ndevices), + pcmk__s(search->action, "unknown action"), + pcmk__s(search->host, "any node")); g_hash_table_foreach(device_list, search_devices, search); } @@ -2275,41 +2309,41 @@ add_action_specific_attributes(xmlNode *xml, const char *action, // PCMK__XA_ST_REQUIRED is currently used only for unfencing if (is_action_required(action, device)) { - crm_trace("Action '%s' is required using %s", action, device->id); - crm_xml_add_int(xml, PCMK__XA_ST_REQUIRED, 1); + pcmk__trace("Action '%s' is required using %s", action, device->id); + pcmk__xe_set_int(xml, PCMK__XA_ST_REQUIRED, 1); } // pcmk__timeout if configured action_specific_timeout = get_action_timeout(device, action, 0); if (action_specific_timeout) { - crm_trace("Action '%s' has timeout %ds using %s", - action, action_specific_timeout, device->id); - crm_xml_add_int(xml, PCMK__XA_ST_ACTION_TIMEOUT, - action_specific_timeout); + pcmk__trace("Action '%s' has timeout %ds using %s", action, + action_specific_timeout, device->id); + pcmk__xe_set_int(xml, PCMK__XA_ST_ACTION_TIMEOUT, + action_specific_timeout); } delay_max = get_action_delay_max(device, action); if (delay_max > 0) { - crm_trace("Action '%s' has maximum random delay %ds using %s", - action, delay_max, device->id); - crm_xml_add_int(xml, PCMK__XA_ST_DELAY_MAX, delay_max); + pcmk__trace("Action '%s' has maximum random delay %ds using %s", action, + delay_max, device->id); + pcmk__xe_set_int(xml, PCMK__XA_ST_DELAY_MAX, delay_max); } delay_base = get_action_delay_base(device, action, target); if (delay_base > 0) { - crm_xml_add_int(xml, PCMK__XA_ST_DELAY_BASE, delay_base); + pcmk__xe_set_int(xml, PCMK__XA_ST_DELAY_BASE, delay_base); } if ((delay_max > 0) && (delay_base == 0)) { - crm_trace("Action '%s' has maximum random delay %ds using %s", - action, delay_max, device->id); + pcmk__trace("Action '%s' has maximum random delay %ds using %s", action, + delay_max, device->id); } else if ((delay_max == 0) && (delay_base > 0)) { - crm_trace("Action '%s' has a static delay of %ds using %s", - action, delay_base, device->id); + pcmk__trace("Action '%s' has a static delay of %ds using %s", action, + delay_base, device->id); } else if ((delay_max > 0) && (delay_base > 0)) { - crm_trace("Action '%s' has a minimum delay of %ds and a randomly chosen " - "maximum delay of %ds using %s", - action, delay_base, delay_max, device->id); + pcmk__trace("Action '%s' has a minimum delay of %ds and a randomly " + "chosen maximum delay of %ds using %s", + action, delay_base, delay_max, device->id); } } @@ -2328,8 +2362,8 @@ add_disallowed(xmlNode *xml, const char *action, const stonith_device_t *device, const char *target, gboolean allow_self) { if (!localhost_is_eligible(device, action, target, allow_self)) { - crm_trace("Action '%s' using %s is disallowed for local host", - action, device->id); + pcmk__trace("Action '%s' using %s is disallowed for local host", action, + device->id); pcmk__xe_set_bool_attr(xml, PCMK__XA_ST_ACTION_DISALLOWED, true); } } @@ -2351,7 +2385,7 @@ add_action_reply(xmlNode *xml, const char *action, { xmlNode *child = pcmk__xe_create(xml, PCMK__XE_ST_DEVICE_ACTION); - crm_xml_add(child, PCMK_XA_ID, action); + pcmk__xe_set(child, PCMK_XA_ID, action); add_action_specific_attributes(child, action, device, target); add_disallowed(child, action, device, target, allow_self); } @@ -2396,8 +2430,8 @@ stonith_query_capable_device_cb(GList * devices, void *user_data) if (query->client_id != NULL) { client = pcmk__find_client_by_id(query->client_id); if ((client == NULL) && (query->remote_peer == NULL)) { - crm_trace("Skipping reply to %s: no longer a client", - query->client_id); + pcmk__trace("Skipping reply to %s: no longer a client", + query->client_id); goto done; } } @@ -2405,7 +2439,7 @@ stonith_query_capable_device_cb(GList * devices, void *user_data) // Pack the results into XML wrapper = pcmk__xe_create(query->reply, PCMK__XE_ST_CALLDATA); list = pcmk__xe_create(wrapper, __func__); - crm_xml_add(list, PCMK__XA_ST_TARGET, query->target); + pcmk__xe_set(list, PCMK__XA_ST_TARGET, query->target); for (lpc = devices; lpc != NULL; lpc = lpc->next) { stonith_device_t *device = g_hash_table_lookup(device_list, lpc->data); @@ -2421,23 +2455,24 @@ stonith_query_capable_device_cb(GList * devices, void *user_data) available_devices++; dev = pcmk__xe_create(list, PCMK__XE_ST_DEVICE_ID); - crm_xml_add(dev, PCMK_XA_ID, device->id); - crm_xml_add(dev, PCMK__XA_NAMESPACE, device->namespace); - crm_xml_add(dev, PCMK_XA_AGENT, device->agent); + pcmk__xe_set(dev, PCMK_XA_ID, device->id); + pcmk__xe_set(dev, PCMK__XA_NAMESPACE, device->namespace); + pcmk__xe_set(dev, PCMK_XA_AGENT, device->agent); // Has had successful monitor, list, or status on this node - crm_xml_add_int(dev, PCMK__XA_ST_MONITOR_VERIFIED, device->verified); + pcmk__xe_set_int(dev, PCMK__XA_ST_MONITOR_VERIFIED, device->verified); - crm_xml_add_int(dev, PCMK__XA_ST_DEVICE_SUPPORT_FLAGS, device->flags); + pcmk__xe_set_int(dev, PCMK__XA_ST_DEVICE_SUPPORT_FLAGS, device->flags); /* If the originating fencer wants to reboot the node, and we have a * capable device that doesn't support "reboot", remap to "off" instead. */ - if (!pcmk_is_set(device->flags, st_device_supports_reboot) + if (!pcmk__is_set(device->flags, st_device_supports_reboot) && pcmk__str_eq(query->action, PCMK_ACTION_REBOOT, pcmk__str_none)) { - crm_trace("%s doesn't support reboot, using values for off instead", - device->id); + pcmk__trace("%s doesn't support reboot, using values for off " + "instead", + device->id); action = PCMK_ACTION_OFF; } @@ -2456,11 +2491,11 @@ stonith_query_capable_device_cb(GList * devices, void *user_data) * versions will ignore "off" and "on", so they are not a problem. */ add_disallowed(dev, action, device, query->target, - pcmk_is_set(query->call_options, - st_opt_allow_self_fencing)); + pcmk__is_set(query->call_options, + st_opt_allow_self_fencing)); add_action_reply(dev, PCMK_ACTION_OFF, device, query->target, - pcmk_is_set(query->call_options, - st_opt_allow_self_fencing)); + pcmk__is_set(query->call_options, + st_opt_allow_self_fencing)); add_action_reply(dev, PCMK_ACTION_ON, device, query->target, FALSE); } @@ -2472,17 +2507,17 @@ stonith_query_capable_device_cb(GList * devices, void *user_data) } } - crm_xml_add_int(list, PCMK__XA_ST_AVAILABLE_DEVICES, available_devices); + pcmk__xe_set_int(list, PCMK__XA_ST_AVAILABLE_DEVICES, available_devices); if (query->target) { - crm_debug("Found %d matching device%s for target '%s'", - available_devices, pcmk__plural_s(available_devices), - query->target); + pcmk__debug("Found %d matching device%s for target '%s'", + available_devices, pcmk__plural_s(available_devices), + query->target); } else { - crm_debug("%d device%s installed", - available_devices, pcmk__plural_s(available_devices)); + pcmk__debug("%d device%s installed", available_devices, + pcmk__plural_s(available_devices)); } - crm_log_xml_trace(list, "query-result"); + pcmk__log_xml_trace(list, "query-result"); stonith_send_reply(query->reply, query->call_options, query->remote_peer, client); @@ -2513,7 +2548,7 @@ log_async_result(const async_command_t *cmd, int pid, const char *next, bool op_merged) { int log_level = LOG_ERR; - int output_log_level = LOG_NEVER; + int output_log_level = PCMK__LOG_NEVER; guint devices_remaining = g_list_length(cmd->next_device_iter); GString *msg = g_string_sized_new(80); // Reasonable starting size @@ -2577,8 +2612,8 @@ log_async_result(const async_command_t *cmd, g_string_free(msg, TRUE); // Log the output (which may have multiple lines), if appropriate - if (output_log_level != LOG_NEVER) { - char *prefix = crm_strdup_printf("%s[%d]", cmd->device, pid); + if (output_log_level != PCMK__LOG_NEVER) { + char *prefix = pcmk__assert_asprintf("%s[%d]", cmd->device, pid); crm_log_output(output_log_level, prefix, result->action_stdout); free(prefix); @@ -2608,7 +2643,8 @@ send_async_reply(const async_command_t *cmd, const pcmk__action_result_t *result if (cmd->client != NULL) { client = pcmk__find_client_by_id(cmd->client); if ((client == NULL) && (cmd->origin == NULL)) { - crm_trace("Skipping reply to %s: no longer a client", cmd->client); + pcmk__trace("Skipping reply to %s: no longer a client", + cmd->client); return; } } @@ -2623,17 +2659,17 @@ send_async_reply(const async_command_t *cmd, const pcmk__action_result_t *result /* The target was also the originator, so broadcast the result on its * behalf (since it will be unable to). */ - crm_trace("Broadcast '%s' result for %s (target was also originator)", - cmd->action, cmd->target); - crm_xml_add(reply, PCMK__XA_SUBT, PCMK__VALUE_BROADCAST); - crm_xml_add(reply, PCMK__XA_ST_OP, STONITH_OP_NOTIFY); + pcmk__trace("Broadcast '%s' result for %s (target was also originator)", + cmd->action, cmd->target); + pcmk__xe_set(reply, PCMK__XA_SUBT, PCMK__VALUE_BROADCAST); + pcmk__xe_set(reply, PCMK__XA_ST_OP, STONITH_OP_NOTIFY); pcmk__cluster_send_message(NULL, pcmk_ipc_fenced, reply); } else { // Reply only to the originator stonith_send_reply(reply, cmd->options, cmd->origin, client); } - crm_log_xml_trace(reply, "Reply"); + pcmk__log_xml_trace(reply, "Reply"); pcmk__xml_free(reply); } @@ -2643,8 +2679,8 @@ cancel_stonith_command(async_command_t * cmd) stonith_device_t *device = cmd_device(cmd); if (device) { - crm_trace("Cancel scheduled '%s' action using %s", - cmd->action, device->id); + pcmk__trace("Cancel scheduled '%s' action using %s", cmd->action, + device->id); device->pending_ops = g_list_remove(device->pending_ops, cmd); } } @@ -2697,12 +2733,12 @@ reply_to_duplicates(async_command_t *cmd, const pcmk__action_result_t *result, continue; } - crm_notice("Merging fencing action '%s'%s%s originating from " - "client %s with identical fencing request from client %s", - cmd_other->action, - (cmd_other->target == NULL)? "" : " targeting ", - pcmk__s(cmd_other->target, ""), cmd_other->client_name, - cmd->client_name); + pcmk__notice("Merging fencing action '%s'%s%s originating from client " + "%s with identical fencing request from client %s", + cmd_other->action, + (cmd_other->target == NULL)? "" : " targeting ", + pcmk__s(cmd_other->target, ""), cmd_other->client_name, + cmd->client_name); // Stop tracking the duplicate, send its result, and cancel it cmd_list = g_list_remove_link(cmd_list, iter); @@ -2812,8 +2848,8 @@ stonith_fence_get_devices_cb(GList * devices, void *user_data) stonith_device_t *device = NULL; guint ndevices = g_list_length(devices); - crm_info("Found %d matching device%s for target '%s'", - ndevices, pcmk__plural_s(ndevices), cmd->target); + pcmk__info("Found %d matching device%s for target '%s'", ndevices, + pcmk__plural_s(ndevices), cmd->target); if (devices != NULL) { /* Order based on priority */ @@ -2861,16 +2897,16 @@ fence_locally(xmlNode *msg, pcmk__action_result_t *result) cmd = create_async_command(msg); if (cmd == NULL) { - crm_log_xml_warn(msg, "invalid"); + pcmk__log_xml_warn(msg, "invalid"); fenced_set_protocol_error(result); return; } - device_id = crm_element_value(dev, PCMK__XA_ST_DEVICE_ID); + device_id = pcmk__xe_get(dev, PCMK__XA_ST_DEVICE_ID); if (device_id != NULL) { device = g_hash_table_lookup(device_list, device_id); if (device == NULL) { - crm_err("Requested device '%s' is not available", device_id); + pcmk__err("Requested device '%s' is not available", device_id); pcmk__format_result(result, CRM_EX_ERROR, PCMK_EXEC_NO_FENCE_DEVICE, "Requested device '%s' not found", device_id); return; @@ -2878,9 +2914,9 @@ fence_locally(xmlNode *msg, pcmk__action_result_t *result) schedule_stonith_command(cmd, device); } else { - const char *host = crm_element_value(dev, PCMK__XA_ST_TARGET); + const char *host = pcmk__xe_get(dev, PCMK__XA_ST_TARGET); - if (pcmk_is_set(cmd->options, st_opt_cs_nodeid)) { + if (pcmk__is_set(cmd->options, st_opt_cs_nodeid)) { int nodeid = 0; pcmk__node_status_t *node = NULL; @@ -2924,8 +2960,8 @@ fenced_construct_reply(const xmlNode *request, xmlNode *data, reply = pcmk__xe_create(NULL, PCMK__XE_ST_REPLY); - crm_xml_add(reply, PCMK__XA_ST_ORIGIN, __func__); - crm_xml_add(reply, PCMK__XA_T, PCMK__VALUE_STONITH_NG); + pcmk__xe_set(reply, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set(reply, PCMK__XA_T, PCMK__VALUE_STONITH_NG); stonith__xe_set_result(reply, result); if (request == NULL) { @@ -2935,9 +2971,9 @@ fenced_construct_reply(const xmlNode *request, xmlNode *data, * * @TODO Maybe synchronize this information at start-up? */ - crm_warn("Missing request information for client notifications for " - "operation with result '%s' (initiated before we came up?)", - pcmk_exec_status_str(result->execution_status)); + pcmk__warn("Missing request information for client notifications for " + "operation with result '%s' (initiated before we came up?)", + pcmk_exec_status_str(result->execution_status)); } else { const char *name = NULL; @@ -2955,8 +2991,8 @@ fenced_construct_reply(const xmlNode *request, xmlNode *data, for (int lpc = 0; lpc < PCMK__NELEM(names); lpc++) { name = names[lpc]; - value = crm_element_value(request, name); - crm_xml_add(reply, name, value); + value = pcmk__xe_get(request, name); + pcmk__xe_set(reply, name, value); } if (data != NULL) { xmlNode *wrapper = pcmk__xe_create(reply, PCMK__XE_ST_CALLDATA); @@ -2980,18 +3016,18 @@ construct_async_reply(const async_command_t *cmd, { xmlNode *reply = pcmk__xe_create(NULL, PCMK__XE_ST_REPLY); - crm_xml_add(reply, PCMK__XA_ST_ORIGIN, __func__); - crm_xml_add(reply, PCMK__XA_T, PCMK__VALUE_STONITH_NG); - crm_xml_add(reply, PCMK__XA_ST_OP, cmd->op); - crm_xml_add(reply, PCMK__XA_ST_DEVICE_ID, cmd->device); - crm_xml_add(reply, PCMK__XA_ST_REMOTE_OP, cmd->remote_op_id); - crm_xml_add(reply, PCMK__XA_ST_CLIENTID, cmd->client); - crm_xml_add(reply, PCMK__XA_ST_CLIENTNAME, cmd->client_name); - crm_xml_add(reply, PCMK__XA_ST_TARGET, cmd->target); - crm_xml_add(reply, PCMK__XA_ST_DEVICE_ACTION, cmd->op); - crm_xml_add(reply, PCMK__XA_ST_ORIGIN, cmd->origin); - crm_xml_add_int(reply, PCMK__XA_ST_CALLID, cmd->id); - crm_xml_add_int(reply, PCMK__XA_ST_CALLOPT, cmd->options); + pcmk__xe_set(reply, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set(reply, PCMK__XA_T, PCMK__VALUE_STONITH_NG); + pcmk__xe_set(reply, PCMK__XA_ST_OP, cmd->op); + pcmk__xe_set(reply, PCMK__XA_ST_DEVICE_ID, cmd->device); + pcmk__xe_set(reply, PCMK__XA_ST_REMOTE_OP, cmd->remote_op_id); + pcmk__xe_set(reply, PCMK__XA_ST_CLIENTID, cmd->client); + pcmk__xe_set(reply, PCMK__XA_ST_CLIENTNAME, cmd->client_name); + pcmk__xe_set(reply, PCMK__XA_ST_TARGET, cmd->target); + pcmk__xe_set(reply, PCMK__XA_ST_DEVICE_ACTION, cmd->op); + pcmk__xe_set(reply, PCMK__XA_ST_ORIGIN, cmd->origin); + pcmk__xe_set_int(reply, PCMK__XA_ST_CALLID, cmd->id); + pcmk__xe_set_int(reply, PCMK__XA_ST_CALLOPT, cmd->options); stonith__xe_set_result(reply, result); return reply; @@ -3001,7 +3037,7 @@ bool fencing_peer_active(pcmk__node_status_t *peer) { return (peer != NULL) && (peer->name != NULL) - && pcmk_is_set(peer->processes, crm_get_cluster_proc()); + && pcmk__is_set(peer->processes, crm_get_cluster_proc()); } void @@ -3034,12 +3070,12 @@ check_alternate_host(const char *target) while (g_hash_table_iter_next(&gIter, NULL, (void **)&entry)) { if (fencing_peer_active(entry) && !pcmk__str_eq(entry->name, target, pcmk__str_casei)) { - crm_notice("Forwarding self-fencing request to %s", - entry->name); + pcmk__notice("Forwarding self-fencing request to %s", + entry->name); return entry->name; } } - crm_warn("Will handle own fencing because no peer can"); + pcmk__warn("Will handle own fencing because no peer can"); } return NULL; } @@ -3049,7 +3085,7 @@ remove_relay_op(xmlNode * request) { xmlNode *dev = pcmk__xpath_find_one(request->doc, "//*[@" PCMK__XA_ST_DEVICE_ACTION "]", - LOG_TRACE); + PCMK__LOG_TRACE); const char *relay_op_id = NULL; const char *op_id = NULL; const char *client_name = NULL; @@ -3057,12 +3093,12 @@ remove_relay_op(xmlNode * request) remote_fencing_op_t *relay_op = NULL; if (dev) { - target = crm_element_value(dev, PCMK__XA_ST_TARGET); + target = pcmk__xe_get(dev, PCMK__XA_ST_TARGET); } - relay_op_id = crm_element_value(request, PCMK__XA_ST_REMOTE_OP_RELAY); - op_id = crm_element_value(request, PCMK__XA_ST_REMOTE_OP); - client_name = crm_element_value(request, PCMK__XA_ST_CLIENTNAME); + relay_op_id = pcmk__xe_get(request, PCMK__XA_ST_REMOTE_OP_RELAY); + op_id = pcmk__xe_get(request, PCMK__XA_ST_REMOTE_OP); + client_name = pcmk__xe_get(request, PCMK__XA_ST_CLIENTNAME); /* Delete RELAY operation. */ if ((relay_op_id != NULL) && (target != NULL) @@ -3087,14 +3123,14 @@ remove_relay_op(xmlNode * request) } } } - crm_debug("Deleting relay op %s ('%s'%s%s for %s), " - "replaced by op %s ('%s'%s%s for %s)", - relay_op->id, relay_op->action, - (relay_op->target == NULL)? "" : " targeting ", - pcmk__s(relay_op->target, ""), - relay_op->client_name, op_id, relay_op->action, - (target == NULL)? "" : " targeting ", pcmk__s(target, ""), - client_name); + pcmk__debug("Deleting relay op %s ('%s'%s%s for %s), replaced by " + "op %s ('%s'%s%s for %s)", + relay_op->id, relay_op->action, + ((relay_op->target != NULL)? " targeting " : ""), + pcmk__s(relay_op->target, ""), + relay_op->client_name, op_id, relay_op->action, + ((target != NULL)? " targeting " : ""), + pcmk__s(target, ""), client_name); g_hash_table_remove(stonith_remote_op_list, relay_op_id); } @@ -3118,11 +3154,11 @@ remove_relay_op(xmlNode * request) static inline bool is_privileged(const pcmk__client_t *c, const char *op) { - if ((c == NULL) || pcmk_is_set(c->flags, pcmk__client_privileged)) { + if ((c == NULL) || pcmk__is_set(c->flags, pcmk__client_privileged)) { return true; } else { - crm_warn("Rejecting IPC request '%s' from unprivileged client %s", - pcmk__s(op, ""), pcmk__client_name(c)); + pcmk__warn("Rejecting IPC request '%s' from unprivileged client %s", + pcmk__s(op, ""), pcmk__client_name(c)); return false; } } @@ -3134,8 +3170,8 @@ handle_register_request(pcmk__request_t *request) xmlNode *reply = pcmk__xe_create(NULL, "reply"); pcmk__assert(request->ipc_client != NULL); - crm_xml_add(reply, PCMK__XA_ST_OP, CRM_OP_REGISTER); - crm_xml_add(reply, PCMK__XA_ST_CLIENTID, request->ipc_client->id); + pcmk__xe_set(reply, PCMK__XA_ST_OP, CRM_OP_REGISTER); + pcmk__xe_set(reply, PCMK__XA_ST_CLIENTID, request->ipc_client->id); pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); pcmk__set_request_flags(request, pcmk__request_reuse_options); return reply; @@ -3156,12 +3192,11 @@ handle_agent_request(pcmk__request_t *request) static xmlNode * handle_update_timeout_request(pcmk__request_t *request) { - const char *call_id = crm_element_value(request->xml, PCMK__XA_ST_CALLID); - const char *client_id = crm_element_value(request->xml, - PCMK__XA_ST_CLIENTID); + const char *call_id = pcmk__xe_get(request->xml, PCMK__XA_ST_CALLID); + const char *client_id = pcmk__xe_get(request->xml, PCMK__XA_ST_CLIENTID); int op_timeout = 0; - crm_element_value_int(request->xml, PCMK__XA_ST_TIMEOUT, &op_timeout); + pcmk__xe_get_int(request->xml, PCMK__XA_ST_TIMEOUT, &op_timeout); do_stonith_async_timeout_update(client_id, call_id, op_timeout); pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); return NULL; @@ -3175,8 +3210,7 @@ handle_query_request(pcmk__request_t *request) xmlNode *dev = NULL; const char *action = NULL; const char *target = NULL; - const char *client_id = crm_element_value(request->xml, - PCMK__XA_ST_CLIENTID); + const char *client_id = pcmk__xe_get(request->xml, PCMK__XA_ST_CLIENTID); struct st_query_data *query = NULL; if (request->peer != NULL) { @@ -3191,18 +3225,18 @@ handle_query_request(pcmk__request_t *request) dev = pcmk__xpath_find_one(request->xml->doc, "//*[@" PCMK__XA_ST_DEVICE_ACTION "]", - LOG_NEVER); + PCMK__LOG_NEVER); if (dev != NULL) { - const char *device = crm_element_value(dev, PCMK__XA_ST_DEVICE_ID); + const char *device = pcmk__xe_get(dev, PCMK__XA_ST_DEVICE_ID); if (pcmk__str_eq(device, "manual_ack", pcmk__str_casei)) { return NULL; // No query or reply necessary } - target = crm_element_value(dev, PCMK__XA_ST_TARGET); - action = crm_element_value(dev, PCMK__XA_ST_DEVICE_ACTION); + target = pcmk__xe_get(dev, PCMK__XA_ST_TARGET); + action = pcmk__xe_get(dev, PCMK__XA_ST_DEVICE_ACTION); } - crm_log_xml_trace(request->xml, "Query"); + pcmk__log_xml_trace(request->xml, "Query"); query = pcmk__assert_alloc(1, sizeof(struct st_query_data)); @@ -3213,10 +3247,10 @@ handle_query_request(pcmk__request_t *request) query->action = pcmk__str_copy(action); query->call_options = request->call_options; - crm_element_value_int(request->xml, PCMK__XA_ST_TIMEOUT, &timeout); + pcmk__xe_get_int(request->xml, PCMK__XA_ST_TIMEOUT, &timeout); get_capable_devices(target, action, timeout, - pcmk_is_set(query->call_options, - st_opt_allow_self_fencing), + pcmk__is_set(query->call_options, + st_opt_allow_self_fencing), query, stonith_query_capable_device_cb, st_device_supports_none); return NULL; } @@ -3228,17 +3262,17 @@ handle_notify_request(pcmk__request_t *request) const char *flag_name = NULL; pcmk__assert(request->ipc_client != NULL); - flag_name = crm_element_value(request->xml, PCMK__XA_ST_NOTIFY_ACTIVATE); + flag_name = pcmk__xe_get(request->xml, PCMK__XA_ST_NOTIFY_ACTIVATE); if (flag_name != NULL) { - crm_debug("Enabling %s callbacks for client %s", - flag_name, pcmk__request_origin(request)); + pcmk__debug("Enabling %s callbacks for client %s", flag_name, + pcmk__request_origin(request)); pcmk__set_client_flags(request->ipc_client, get_stonith_flag(flag_name)); } - flag_name = crm_element_value(request->xml, PCMK__XA_ST_NOTIFY_DEACTIVATE); + flag_name = pcmk__xe_get(request->xml, PCMK__XA_ST_NOTIFY_DEACTIVATE); if (flag_name != NULL) { - crm_debug("Disabling %s callbacks for client %s", - flag_name, pcmk__request_origin(request)); + pcmk__debug("Disabling %s callbacks for client %s", flag_name, + pcmk__request_origin(request)); pcmk__clear_client_flags(request->ipc_client, get_stonith_flag(flag_name)); } @@ -3256,14 +3290,14 @@ handle_relay_request(pcmk__request_t *request) { xmlNode *dev = pcmk__xpath_find_one(request->xml->doc, "//*[@" PCMK__XA_ST_TARGET "]", - LOG_TRACE); + PCMK__LOG_TRACE); - crm_notice("Received forwarded fencing request from " - "%s %s to fence (%s) peer %s", - pcmk__request_origin_type(request), - pcmk__request_origin(request), - crm_element_value(dev, PCMK__XA_ST_DEVICE_ACTION), - crm_element_value(dev, PCMK__XA_ST_TARGET)); + pcmk__notice("Received forwarded fencing request from %s %s to fence (%s) " + "peer %s", + pcmk__request_origin_type(request), + pcmk__request_origin(request), + pcmk__xe_get(dev, PCMK__XA_ST_DEVICE_ACTION), + pcmk__xe_get(dev, PCMK__XA_ST_TARGET)); if (initiate_remote_stonith_op(NULL, request->xml, FALSE) == NULL) { fenced_set_protocol_error(&request->result); @@ -3281,7 +3315,7 @@ handle_fence_request(pcmk__request_t *request) if (request->peer != NULL) { fence_locally(request->xml, &request->result); - } else if (pcmk_is_set(request->call_options, st_opt_manual_ack)) { + } else if (pcmk__is_set(request->call_options, st_opt_manual_ack)) { switch (fenced_handle_manual_confirmation(request->ipc_client, request->xml)) { case pcmk_rc_ok: @@ -3301,18 +3335,18 @@ handle_fence_request(pcmk__request_t *request) const char *alternate_host = NULL; xmlNode *dev = pcmk__xpath_find_one(request->xml->doc, "//*[@" PCMK__XA_ST_TARGET "]", - LOG_TRACE); - const char *target = crm_element_value(dev, PCMK__XA_ST_TARGET); - const char *action = crm_element_value(dev, PCMK__XA_ST_DEVICE_ACTION); - const char *device = crm_element_value(dev, PCMK__XA_ST_DEVICE_ID); + PCMK__LOG_TRACE); + const char *target = pcmk__xe_get(dev, PCMK__XA_ST_TARGET); + const char *action = pcmk__xe_get(dev, PCMK__XA_ST_DEVICE_ACTION); + const char *device = pcmk__xe_get(dev, PCMK__XA_ST_DEVICE_ID); if (request->ipc_client != NULL) { int tolerance = 0; - crm_notice("Client %s wants to fence (%s) %s using %s", - pcmk__request_origin(request), action, - target, (device? device : "any device")); - crm_element_value_int(dev, PCMK__XA_ST_TOLERANCE, &tolerance); + pcmk__notice("Client %s wants to fence (%s) %s using %s", + pcmk__request_origin(request), action, + target, pcmk__s(device, "any device")); + pcmk__xe_get_int(dev, PCMK__XA_ST_TOLERANCE, &tolerance); if (stonith_check_fence_tolerance(tolerance, target, action)) { pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); @@ -3322,9 +3356,9 @@ handle_fence_request(pcmk__request_t *request) alternate_host = check_alternate_host(target); } else { - crm_notice("Peer %s wants to fence (%s) '%s' with device '%s'", - request->peer, action, target, - (device == NULL)? "(any)" : device); + pcmk__notice("Peer %s wants to fence (%s) '%s' with device '%s'", + request->peer, action, target, + pcmk__s(device, "(any)")); } if (alternate_host != NULL) { @@ -3335,8 +3369,7 @@ handle_fence_request(pcmk__request_t *request) pcmk__node_search_cluster_member); if (request->ipc_client->id == 0) { - client_id = crm_element_value(request->xml, - PCMK__XA_ST_CLIENTID); + client_id = pcmk__xe_get(request->xml, PCMK__XA_ST_CLIENTID); } else { client_id = request->ipc_client->id; } @@ -3347,10 +3380,10 @@ handle_fence_request(pcmk__request_t *request) */ op = create_remote_stonith_op(client_id, request->xml, FALSE); - crm_xml_add(request->xml, PCMK__XA_ST_OP, STONITH_OP_RELAY); - crm_xml_add(request->xml, PCMK__XA_ST_CLIENTID, - request->ipc_client->id); - crm_xml_add(request->xml, PCMK__XA_ST_REMOTE_OP, op->id); + pcmk__xe_set(request->xml, PCMK__XA_ST_OP, STONITH_OP_RELAY); + pcmk__xe_set(request->xml, PCMK__XA_ST_CLIENTID, + request->ipc_client->id); + pcmk__xe_set(request->xml, PCMK__XA_ST_REMOTE_OP, op->id); // @TODO On failure, fail request immediately, or maybe panic pcmk__cluster_send_message(node, pcmk_ipc_fenced, request->xml); @@ -3384,7 +3417,7 @@ handle_history_request(pcmk__request_t *request) stonith_fence_history(request->xml, &data, request->peer, request->call_options); pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); - if (!pcmk_is_set(request->call_options, st_opt_discard_reply)) { + if (!pcmk__is_set(request->call_options, st_opt_discard_reply)) { /* When the local node broadcasts its history, it sets * st_opt_discard_reply and doesn't need a reply. */ @@ -3398,7 +3431,7 @@ handle_history_request(pcmk__request_t *request) static xmlNode * handle_device_add_request(pcmk__request_t *request) { - const char *op = crm_element_value(request->xml, PCMK__XA_ST_OP); + const char *op = pcmk__xe_get(request->xml, PCMK__XA_ST_OP); xmlNode *dev = pcmk__xpath_find_one(request->xml->doc, "//" PCMK__XE_ST_DEVICE_ID, LOG_ERR); @@ -3425,8 +3458,8 @@ handle_device_delete_request(pcmk__request_t *request) { xmlNode *dev = pcmk__xpath_find_one(request->xml->doc, "//" PCMK__XE_ST_DEVICE_ID, LOG_ERR); - const char *device_id = crm_element_value(dev, PCMK_XA_ID); - const char *op = crm_element_value(request->xml, PCMK__XA_ST_OP); + const char *device_id = pcmk__xe_get(dev, PCMK_XA_ID); + const char *op = pcmk__xe_get(request->xml, PCMK__XA_ST_OP); if (is_privileged(request->ipc_client, op)) { stonith_device_remove(device_id, false); @@ -3445,7 +3478,7 @@ static xmlNode * handle_level_add_request(pcmk__request_t *request) { char *desc = NULL; - const char *op = crm_element_value(request->xml, PCMK__XA_ST_OP); + const char *op = pcmk__xe_get(request->xml, PCMK__XA_ST_OP); if (is_privileged(request->ipc_client, op)) { fenced_register_level(request->xml, &desc, &request->result); @@ -3465,7 +3498,7 @@ static xmlNode * handle_level_delete_request(pcmk__request_t *request) { char *desc = NULL; - const char *op = crm_element_value(request->xml, PCMK__XA_ST_OP); + const char *op = pcmk__xe_get(request->xml, PCMK__XA_ST_OP); if (is_privileged(request->ipc_client, op)) { fenced_unregister_level(request->xml, &desc, &request->result); @@ -3487,8 +3520,8 @@ handle_cache_request(pcmk__request_t *request) int node_id = 0; const char *name = NULL; - crm_element_value_int(request->xml, PCMK_XA_ID, &node_id); - name = crm_element_value(request->xml, PCMK_XA_UNAME); + pcmk__xe_get_int(request->xml, PCMK_XA_ID, &node_id); + name = pcmk__xe_get(request->xml, PCMK_XA_UNAME); pcmk__cluster_forget_cluster_node(node_id, name); pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); return NULL; @@ -3497,9 +3530,9 @@ handle_cache_request(pcmk__request_t *request) static xmlNode * handle_unknown_request(pcmk__request_t *request) { - crm_err("Unknown IPC request %s from %s %s", - request->op, pcmk__request_origin_type(request), - pcmk__request_origin(request)); + pcmk__err("Unknown IPC request %s from %s %s", request->op, + pcmk__request_origin_type(request), + pcmk__request_origin(request)); pcmk__format_result(&request->result, CRM_EX_PROTOCOL, PCMK_EXEC_INVALID, "Unknown IPC request type '%s' (bug?)", request->op); return fenced_construct_reply(request->xml, NULL, &request->result); @@ -3548,7 +3581,7 @@ handle_request(pcmk__request_t *request) } reply = pcmk__process_request(request, fenced_handlers); if (reply != NULL) { - if (pcmk_is_set(request->flags, pcmk__request_reuse_options) + if (pcmk__is_set(request->flags, pcmk__request_reuse_options) && (request->ipc_client != NULL)) { /* Certain IPC-only commands must reuse the call options from the * original request rather than the ones set by stonith_send_reply() @@ -3565,20 +3598,20 @@ handle_request(pcmk__request_t *request) } reason = request->result.exit_reason; - crm_debug("Processed %s request from %s %s: %s%s%s%s", - request->op, pcmk__request_origin_type(request), - pcmk__request_origin(request), - pcmk_exec_status_str(request->result.execution_status), - (reason == NULL)? "" : " (", - (reason == NULL)? "" : reason, - (reason == NULL)? "" : ")"); + pcmk__debug("Processed %s request from %s %s: %s%s%s%s", + request->op, pcmk__request_origin_type(request), + pcmk__request_origin(request), + pcmk_exec_status_str(request->result.execution_status), + ((reason != NULL)? " (" : ""), + pcmk__s(reason, ""), + ((reason != NULL)? ")" : "")); } static void handle_reply(pcmk__client_t *client, xmlNode *request, const char *remote_peer) { // Copy, because request might be freed before we want to log this - char *op = crm_element_value_copy(request, PCMK__XA_ST_OP); + char *op = pcmk__xe_get_copy(request, PCMK__XA_ST_OP); if (pcmk__str_eq(op, STONITH_OP_QUERY, pcmk__str_none)) { process_remote_stonith_query(request); @@ -3588,16 +3621,16 @@ handle_reply(pcmk__client_t *client, xmlNode *request, const char *remote_peer) fenced_process_fencing_reply(request); } else { - crm_err("Ignoring unknown %s reply from %s %s", - pcmk__s(op, "untyped"), ((client == NULL)? "peer" : "client"), - ((client == NULL)? remote_peer : pcmk__client_name(client))); - crm_log_xml_warn(request, "UnknownOp"); + pcmk__err("Ignoring unknown %s reply from %s %s", + pcmk__s(op, "untyped"), ((client != NULL)? "client" : "peer"), + ((client != NULL)? pcmk__client_name(client) : remote_peer)); + pcmk__log_xml_warn(request, "UnknownOp"); free(op); return; } - crm_debug("Processed %s reply from %s %s", - op, ((client == NULL)? "peer" : "client"), - ((client == NULL)? remote_peer : pcmk__client_name(client))); + pcmk__debug("Processed %s reply from %s %s", op, + ((client != NULL)? "client" : "peer"), + ((client != NULL)? pcmk__client_name(client) : remote_peer)); free(op); } @@ -3622,24 +3655,24 @@ stonith_command(pcmk__client_t *client, uint32_t id, uint32_t flags, CRM_CHECK(message != NULL, return); if (pcmk__xpath_find_one(message->doc, "//" PCMK__XE_ST_REPLY, - LOG_NEVER) != NULL) { + PCMK__LOG_NEVER) != NULL) { is_reply = true; } rc = pcmk__xe_get_flags(message, PCMK__XA_ST_CALLOPT, &call_options, st_opt_none); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from message: %s", pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from message: %s", pcmk_rc_str(rc)); } - crm_debug("Processing %ssynchronous %s %s %u from %s %s", - pcmk_is_set(call_options, st_opt_sync_call)? "" : "a", - crm_element_value(message, PCMK__XA_ST_OP), - (is_reply? "reply" : "request"), id, - ((client == NULL)? "peer" : "client"), - ((client == NULL)? remote_peer : pcmk__client_name(client))); + pcmk__debug("Processing %ssynchronous %s %s %u from %s %s", + (pcmk__is_set(call_options, st_opt_sync_call)? "" : "a"), + pcmk__xe_get(message, PCMK__XA_ST_OP), + (is_reply? "reply" : "request"), id, + ((client != NULL)? "client" : "peer"), + ((client != NULL)? pcmk__client_name(client) : remote_peer)); - if (pcmk_is_set(call_options, st_opt_sync_call)) { + if (pcmk__is_set(call_options, st_opt_sync_call)) { pcmk__assert((client == NULL) || (client->request_id == id)); } @@ -3656,10 +3689,10 @@ stonith_command(pcmk__client_t *client, uint32_t id, uint32_t flags, .result = PCMK__UNKNOWN_RESULT, }; - request.op = crm_element_value_copy(request.xml, PCMK__XA_ST_OP); + request.op = pcmk__xe_get_copy(request.xml, PCMK__XA_ST_OP); CRM_CHECK(request.op != NULL, return); - if (pcmk_is_set(request.call_options, st_opt_sync_call)) { + if (pcmk__is_set(request.call_options, st_opt_sync_call)) { pcmk__set_request_flags(&request, pcmk__request_sync); } diff --git a/daemons/fenced/fenced_history.c b/daemons/fenced/fenced_history.c index 9807a7f38cd..10526ff293d 100644 --- a/daemons/fenced/fenced_history.c +++ b/daemons/fenced/fenced_history.c @@ -47,14 +47,14 @@ stonith_send_broadcast_history(xmlNode *history, xmlNode *wrapper = pcmk__xe_create(bcast, PCMK__XE_ST_CALLDATA); xmlNode *call_data = pcmk__xe_create(wrapper, __func__); - crm_xml_add(bcast, PCMK__XA_T, PCMK__VALUE_STONITH_NG); - crm_xml_add(bcast, PCMK__XA_SUBT, PCMK__VALUE_BROADCAST); - crm_xml_add(bcast, PCMK__XA_ST_OP, STONITH_OP_FENCE_HISTORY); - crm_xml_add_int(bcast, PCMK__XA_ST_CALLOPT, callopts); + pcmk__xe_set(bcast, PCMK__XA_T, PCMK__VALUE_STONITH_NG); + pcmk__xe_set(bcast, PCMK__XA_SUBT, PCMK__VALUE_BROADCAST); + pcmk__xe_set(bcast, PCMK__XA_ST_OP, STONITH_OP_FENCE_HISTORY); + pcmk__xe_set_int(bcast, PCMK__XA_ST_CALLOPT, callopts); pcmk__xml_copy(call_data, history); if (target != NULL) { - crm_xml_add(call_data, PCMK__XA_ST_TARGET, target); + pcmk__xe_set(call_data, PCMK__XA_ST_TARGET, target); } pcmk__cluster_send_message(NULL, pcmk_ipc_fenced, bcast); @@ -211,8 +211,9 @@ stonith_fence_history_trim(void) if (g_hash_table_size(stonith_remote_op_list) > MAX_STONITH_HISTORY) { GList *ops = g_hash_table_get_values(stonith_remote_op_list); - crm_trace("More than %d entries in fencing history, purging oldest " - "completed operations", MAX_STONITH_HISTORY); + pcmk__trace("More than %d entries in fencing history, purging oldest " + "completed operations", + MAX_STONITH_HISTORY); ops = g_list_sort(ops, cmp_op_by_completion); @@ -247,51 +248,46 @@ stonith_xml_history_to_list(const xmlNode *history) xml_op != NULL; xml_op = pcmk__xe_next(xml_op, NULL)) { remote_fencing_op_t *op = NULL; - char *id = crm_element_value_copy(xml_op, PCMK__XA_ST_REMOTE_OP); + char *id = pcmk__xe_get_copy(xml_op, PCMK__XA_ST_REMOTE_OP); int state; int exit_status = CRM_EX_OK; int execution_status = PCMK_EXEC_DONE; - long long completed; - long long completed_nsec = 0L; if (!id) { - crm_warn("Malformed fencing history received from peer"); + pcmk__warn("Malformed fencing history received from peer"); continue; } - crm_trace("Attaching op %s to hashtable", id); + pcmk__trace("Attaching op %s to hashtable", id); op = pcmk__assert_alloc(1, sizeof(remote_fencing_op_t)); op->id = id; - op->target = crm_element_value_copy(xml_op, PCMK__XA_ST_TARGET); - op->action = crm_element_value_copy(xml_op, PCMK__XA_ST_DEVICE_ACTION); - op->originator = crm_element_value_copy(xml_op, PCMK__XA_ST_ORIGIN); - op->delegate = crm_element_value_copy(xml_op, PCMK__XA_ST_DELEGATE); - op->client_name = crm_element_value_copy(xml_op, - PCMK__XA_ST_CLIENTNAME); - crm_element_value_ll(xml_op, PCMK__XA_ST_DATE, &completed); - op->completed = (time_t) completed; - crm_element_value_ll(xml_op, PCMK__XA_ST_DATE_NSEC, &completed_nsec); - op->completed_nsec = completed_nsec; - crm_element_value_int(xml_op, PCMK__XA_ST_STATE, &state); + op->target = pcmk__xe_get_copy(xml_op, PCMK__XA_ST_TARGET); + op->action = pcmk__xe_get_copy(xml_op, PCMK__XA_ST_DEVICE_ACTION); + op->originator = pcmk__xe_get_copy(xml_op, PCMK__XA_ST_ORIGIN); + op->delegate = pcmk__xe_get_copy(xml_op, PCMK__XA_ST_DELEGATE); + op->client_name = pcmk__xe_get_copy(xml_op, PCMK__XA_ST_CLIENTNAME); + pcmk__xe_get_time(xml_op, PCMK__XA_ST_DATE, &op->completed); + pcmk__xe_get_ll(xml_op, PCMK__XA_ST_DATE_NSEC, &op->completed_nsec); + pcmk__xe_get_int(xml_op, PCMK__XA_ST_STATE, &state); op->state = (enum op_state) state; /* @COMPAT We can't use stonith__xe_get_result() here because * fencers <2.1.3 didn't include results, leading it to assume an error * status. Instead, set an unknown status in that case. */ - if ((crm_element_value_int(xml_op, PCMK__XA_RC_CODE, &exit_status) < 0) - || (crm_element_value_int(xml_op, PCMK__XA_OP_STATUS, - &execution_status) < 0)) { + if ((pcmk__xe_get_int(xml_op, PCMK__XA_RC_CODE, + &exit_status) != pcmk_rc_ok) + || (pcmk__xe_get_int(xml_op, PCMK__XA_OP_STATUS, + &execution_status) != pcmk_rc_ok)) { exit_status = CRM_EX_INDETERMINATE; execution_status = PCMK_EXEC_UNKNOWN; } pcmk__set_result(&op->result, exit_status, execution_status, - crm_element_value(xml_op, PCMK_XA_EXIT_REASON)); + pcmk__xe_get(xml_op, PCMK_XA_EXIT_REASON)); pcmk__set_result_output(&op->result, - crm_element_value_copy(xml_op, - PCMK__XA_ST_OUTPUT), + pcmk__xe_get_copy(xml_op, PCMK__XA_ST_OUTPUT), NULL); @@ -341,11 +337,11 @@ stonith_local_history_diff_and_merge(GHashTable *remote_history, if (stonith__op_state_pending(op->state) && !stonith__op_state_pending(remote_op->state)) { - crm_debug("Updating outdated pending operation %.8s " - "(state=%s) according to the one (state=%s) from " - "remote peer history", - op->id, stonith_op_state_str(op->state), - stonith_op_state_str(remote_op->state)); + pcmk__debug("Updating outdated pending operation " + "%.8s (state=%s) according to the one " + "(state=%s) from remote peer history", + op->id, stonith_op_state_str(op->state), + stonith_op_state_str(remote_op->state)); g_hash_table_steal(remote_history, op->id); op->id = remote_op->id; @@ -358,11 +354,12 @@ stonith_local_history_diff_and_merge(GHashTable *remote_history, } else if (!stonith__op_state_pending(op->state) && stonith__op_state_pending(remote_op->state)) { - crm_debug("Broadcasting operation %.8s (state=%s) to " - "update the outdated pending one " - "(state=%s) in remote peer history", - op->id, stonith_op_state_str(op->state), - stonith_op_state_str(remote_op->state)); + pcmk__debug("Broadcasting operation %.8s " + "(state=%s) to update the outdated " + "pending one state=%s) in remote peer " + "history", + op->id, stonith_op_state_str(op->state), + stonith_op_state_str(remote_op->state)); g_hash_table_remove(remote_history, op->id); @@ -378,20 +375,20 @@ stonith_local_history_diff_and_merge(GHashTable *remote_history, } cnt++; - crm_trace("Attaching op %s", op->id); + pcmk__trace("Attaching op %s", op->id); entry = pcmk__xe_create(history, STONITH_OP_EXEC); if (add_id) { - crm_xml_add(entry, PCMK__XA_ST_REMOTE_OP, op->id); + pcmk__xe_set(entry, PCMK__XA_ST_REMOTE_OP, op->id); } - crm_xml_add(entry, PCMK__XA_ST_TARGET, op->target); - crm_xml_add(entry, PCMK__XA_ST_DEVICE_ACTION, op->action); - crm_xml_add(entry, PCMK__XA_ST_ORIGIN, op->originator); - crm_xml_add(entry, PCMK__XA_ST_DELEGATE, op->delegate); - crm_xml_add(entry, PCMK__XA_ST_CLIENTNAME, op->client_name); - crm_xml_add_ll(entry, PCMK__XA_ST_DATE, op->completed); - crm_xml_add_ll(entry, PCMK__XA_ST_DATE_NSEC, - op->completed_nsec); - crm_xml_add_int(entry, PCMK__XA_ST_STATE, op->state); + pcmk__xe_set(entry, PCMK__XA_ST_TARGET, op->target); + pcmk__xe_set(entry, PCMK__XA_ST_DEVICE_ACTION, op->action); + pcmk__xe_set(entry, PCMK__XA_ST_ORIGIN, op->originator); + pcmk__xe_set(entry, PCMK__XA_ST_DELEGATE, op->delegate); + pcmk__xe_set(entry, PCMK__XA_ST_CLIENTNAME, op->client_name); + pcmk__xe_set_time(entry, PCMK__XA_ST_DATE, op->completed); + pcmk__xe_set_ll(entry, PCMK__XA_ST_DATE_NSEC, + op->completed_nsec); + pcmk__xe_set_int(entry, PCMK__XA_ST_STATE, op->state); stonith__xe_set_result(entry, &op->result); } } @@ -407,8 +404,9 @@ stonith_local_history_diff_and_merge(GHashTable *remote_history, pcmk__str_eq(op->originator, fenced_get_local_node(), pcmk__str_casei)) { - crm_warn("Failing pending operation %.8s originated by us but " - "known only from peer history", op->id); + pcmk__warn("Failing pending operation %.8s originated by us " + "but known only from peer history", + op->id); op->state = st_failed; set_fencing_completed(op); @@ -481,11 +479,11 @@ stonith_fence_history(xmlNode *msg, xmlNode **output, const char *target = NULL; xmlNode *dev = pcmk__xpath_find_one(msg->doc, "//*[@" PCMK__XA_ST_TARGET "]", - LOG_NEVER); + PCMK__LOG_NEVER); xmlNode *out_history = NULL; if (dev) { - target = crm_element_value(dev, PCMK__XA_ST_TARGET); + target = pcmk__xe_get(dev, PCMK__XA_ST_TARGET); if (target && (options & st_opt_cs_nodeid)) { int nodeid; pcmk__node_status_t *node = NULL; @@ -501,10 +499,10 @@ stonith_fence_history(xmlNode *msg, xmlNode **output, } if (options & st_opt_cleanup) { - const char *call_id = crm_element_value(msg, PCMK__XA_ST_CALLID); + const char *call_id = pcmk__xe_get(msg, PCMK__XA_ST_CALLID); - crm_trace("Cleaning up operations on %s in %p", target, - stonith_remote_op_list); + pcmk__trace("Cleaning up operations on %s in %p", target, + stonith_remote_op_list); stonith_fence_history_cleanup(target, (call_id != NULL)); } else if (options & st_opt_broadcast) { @@ -514,7 +512,7 @@ stonith_fence_history(xmlNode *msg, xmlNode **output, */ fenced_send_notification(PCMK__VALUE_ST_NOTIFY_HISTORY_SYNCED, NULL, NULL); - if (crm_element_value(msg, PCMK__XA_ST_CALLID) != NULL) { + if (pcmk__xe_get(msg, PCMK__XA_ST_CALLID) != NULL) { /* this is coming from the stonith-API * * craft a broadcast with node's history @@ -522,7 +520,7 @@ stonith_fence_history(xmlNode *msg, xmlNode **output, * what it has on top */ out_history = stonith_local_history(TRUE, NULL); - crm_trace("Broadcasting history to peers"); + pcmk__trace("Broadcasting history to peers"); stonith_send_broadcast_history(out_history, st_opt_broadcast | st_opt_discard_reply, NULL); @@ -531,7 +529,7 @@ stonith_fence_history(xmlNode *msg, xmlNode **output, pcmk__str_casei)) { xmlNode *history = pcmk__xpath_find_one(msg->doc, "//" PCMK__XE_ST_HISTORY, - LOG_NEVER); + PCMK__LOG_NEVER); /* either a broadcast created directly upon stonith-API request * or a diff as response to such a thing @@ -553,26 +551,26 @@ stonith_fence_history(xmlNode *msg, xmlNode **output, out_history = stonith_local_history_diff_and_merge(received_history, TRUE, NULL); if (out_history) { - crm_trace("Broadcasting history-diff to peers"); + pcmk__trace("Broadcasting history-diff to peers"); pcmk__xe_set_bool_attr(out_history, PCMK__XA_ST_DIFFERENTIAL, true); stonith_send_broadcast_history(out_history, st_opt_broadcast | st_opt_discard_reply, NULL); } else { - crm_trace("History-diff is empty - skip broadcast"); + pcmk__trace("History-diff is empty - skip broadcast"); } } } else { - crm_trace("Skipping history-query-broadcast (%s%s)" - " we sent ourselves", - remote_peer?"remote-peer=":"local-ipc", - remote_peer?remote_peer:""); + pcmk__trace("Skipping history-query-broadcast (%s%s) we sent " + "ourselves", + ((remote_peer != NULL)? "remote-peer=" : "local-ipc"), + pcmk__s(remote_peer, "")); } } else { /* plain history request */ - crm_trace("Looking for operations on %s in %p", target, - stonith_remote_op_list); + pcmk__trace("Looking for operations on %s in %p", target, + stonith_remote_op_list); *output = stonith_local_history(FALSE, target); } pcmk__xml_free(out_history); diff --git a/daemons/fenced/fenced_remote.c b/daemons/fenced/fenced_remote.c index 42760b8d27d..de195daa6ff 100644 --- a/daemons/fenced/fenced_remote.c +++ b/daemons/fenced/fenced_remote.c @@ -139,7 +139,9 @@ count_peer_device(gpointer key, gpointer value, gpointer user_data) if (!props->executed[data->op->phase] && (!data->verified_only || props->verified) - && ((data->support_action_only == st_device_supports_none) || pcmk_is_set(props->device_support_flags, data->support_action_only))) { + && ((data->support_action_only == st_device_supports_none) + || pcmk__is_set(props->device_support_flags, + data->support_action_only))) { ++(data->count); } } @@ -187,7 +189,9 @@ find_peer_device(const remote_fencing_op_t *op, const peer_device_info_t *peer, { device_properties_t *props = g_hash_table_lookup(peer->devices, device); - if (props && support_action_only != st_device_supports_none && !pcmk_is_set(props->device_support_flags, support_action_only)) { + if ((props != NULL) + && (support_action_only != st_device_supports_none) + && !pcmk__is_set(props->device_support_flags, support_action_only)) { return NULL; } return (props && !props->executed[op->phase] @@ -216,8 +220,8 @@ grab_peer_device(const remote_fencing_op_t *op, peer_device_info_t *peer, return FALSE; } - crm_trace("Removing %s from %s (%d remaining)", - device, peer->host, count_peer_devices(op, peer, FALSE, st_device_supports_none)); + pcmk__trace("Removing %s from %s (%d remaining)", device, peer->host, + count_peer_devices(op, peer, FALSE, st_device_supports_none)); props->executed[op->phase] = TRUE; return TRUE; } @@ -244,7 +248,7 @@ free_remote_op(gpointer data) { remote_fencing_op_t *op = data; - crm_log_xml_debug(op->request, "Destroying"); + pcmk__log_xml_debug(op->request, "Destroying"); clear_remote_op_timers(op); @@ -305,8 +309,9 @@ op_requested_action(const remote_fencing_op_t *op) static void op_phase_off(remote_fencing_op_t *op) { - crm_info("Remapping multiple-device reboot targeting %s to 'off' " - QB_XS " id=%.8s", op->target, op->id); + pcmk__info("Remapping multiple-device reboot targeting %s to 'off' " + QB_XS " id=%.8s", + op->target, op->id); op->phase = st_phase_off; /* Happily, "off" and "on" are shorter than "reboot", so we can reuse the @@ -326,9 +331,9 @@ op_phase_on(remote_fencing_op_t *op) { GList *iter = NULL; - crm_info("Remapped 'off' targeting %s complete, " - "remapping to 'on' for %s " QB_XS " id=%.8s", - op->target, op->client_name, op->id); + pcmk__info("Remapped 'off' targeting %s complete, remapping to 'on' for " + "%s " QB_XS " id=%.8s", + op->target, op->client_name, op->id); op->phase = st_phase_on; strcpy(op->action, PCMK_ACTION_ON); @@ -360,8 +365,9 @@ static void undo_op_remap(remote_fencing_op_t *op) { if (op->phase > 0) { - crm_info("Undoing remap of reboot targeting %s for %s " - QB_XS " id=%.8s", op->target, op->client_name, op->id); + pcmk__info("Undoing remap of reboot targeting %s for %s " + QB_XS " id=%.8s", + op->target, op->client_name, op->id); op->phase = st_phase_requested; strcpy(op->action, PCMK_ACTION_REBOOT); } @@ -382,14 +388,14 @@ fencing_result2xml(xmlNode *parent, const remote_fencing_op_t *op) { xmlNode *notify_data = pcmk__xe_create(parent, PCMK__XE_ST_NOTIFY_FENCE); - crm_xml_add_int(notify_data, PCMK_XA_STATE, op->state); - crm_xml_add(notify_data, PCMK__XA_ST_TARGET, op->target); - crm_xml_add(notify_data, PCMK__XA_ST_DEVICE_ACTION, op->action); - crm_xml_add(notify_data, PCMK__XA_ST_DELEGATE, op->delegate); - crm_xml_add(notify_data, PCMK__XA_ST_REMOTE_OP, op->id); - crm_xml_add(notify_data, PCMK__XA_ST_ORIGIN, op->originator); - crm_xml_add(notify_data, PCMK__XA_ST_CLIENTID, op->client_id); - crm_xml_add(notify_data, PCMK__XA_ST_CLIENTNAME, op->client_name); + pcmk__xe_set_int(notify_data, PCMK_XA_STATE, op->state); + pcmk__xe_set(notify_data, PCMK__XA_ST_TARGET, op->target); + pcmk__xe_set(notify_data, PCMK__XA_ST_DEVICE_ACTION, op->action); + pcmk__xe_set(notify_data, PCMK__XA_ST_DELEGATE, op->delegate); + pcmk__xe_set(notify_data, PCMK__XA_ST_REMOTE_OP, op->id); + pcmk__xe_set(notify_data, PCMK__XA_ST_ORIGIN, op->originator); + pcmk__xe_set(notify_data, PCMK__XA_ST_CLIENTID, op->client_id); + pcmk__xe_set(notify_data, PCMK__XA_ST_CLIENTNAME, op->client_name); return notify_data; } @@ -410,11 +416,11 @@ fenced_broadcast_op_result(const remote_fencing_op_t *op, bool op_merged) xmlNode *notify_data = NULL; count++; - crm_trace("Broadcasting result to peers"); - crm_xml_add(bcast, PCMK__XA_T, PCMK__VALUE_ST_NOTIFY); - crm_xml_add(bcast, PCMK__XA_SUBT, PCMK__VALUE_BROADCAST); - crm_xml_add(bcast, PCMK__XA_ST_OP, STONITH_OP_NOTIFY); - crm_xml_add_int(bcast, PCMK_XA_COUNT, count); + pcmk__trace("Broadcasting result to peers"); + pcmk__xe_set(bcast, PCMK__XA_T, PCMK__VALUE_ST_NOTIFY); + pcmk__xe_set(bcast, PCMK__XA_SUBT, PCMK__VALUE_BROADCAST); + pcmk__xe_set(bcast, PCMK__XA_ST_OP, STONITH_OP_NOTIFY); + pcmk__xe_set_int(bcast, PCMK_XA_COUNT, count); if (op_merged) { pcmk__xe_set_bool_attr(bcast, PCMK__XA_ST_OP_MERGED, true); @@ -450,17 +456,17 @@ handle_local_reply_and_notify(remote_fencing_op_t *op, xmlNode *data) } /* Do notification with a clean data object */ - crm_xml_add_int(data, PCMK_XA_STATE, op->state); - crm_xml_add(data, PCMK__XA_ST_TARGET, op->target); - crm_xml_add(data, PCMK__XA_ST_OP, op->action); + pcmk__xe_set_int(data, PCMK_XA_STATE, op->state); + pcmk__xe_set(data, PCMK__XA_ST_TARGET, op->target); + pcmk__xe_set(data, PCMK__XA_ST_OP, op->action); reply = fenced_construct_reply(op->request, data, &op->result); - crm_xml_add(reply, PCMK__XA_ST_DELEGATE, op->delegate); + pcmk__xe_set(reply, PCMK__XA_ST_DELEGATE, op->delegate); /* Send fencing OP reply to local client that initiated fencing */ client = pcmk__find_client_by_id(op->client_id); if (client == NULL) { - crm_trace("Skipping reply to %s: no longer a client", op->client_id); + pcmk__trace("Skipping reply to %s: no longer a client", op->client_id); } else { do_local_reply(reply, client, op->call_options); } @@ -492,20 +498,20 @@ finalize_op_duplicates(remote_fencing_op_t *op, xmlNode *data) if (other->state == st_duplicate) { other->state = op->state; - crm_debug("Performing duplicate notification for %s@%s: %s " - QB_XS " id=%.8s", - other->client_name, other->originator, - pcmk_exec_status_str(op->result.execution_status), - other->id); + pcmk__debug("Performing duplicate notification for %s@%s: %s " + QB_XS " id=%.8s", + other->client_name, other->originator, + pcmk_exec_status_str(op->result.execution_status), + other->id); pcmk__copy_result(&op->result, &other->result); finalize_op(other, data, true); } else { // Possible if (for example) it timed out already - crm_err("Skipping duplicate notification for %s@%s " - QB_XS " state=%s id=%.8s", - other->client_name, other->originator, - stonith_op_state_str(other->state), other->id); + pcmk__err("Skipping duplicate notification for %s@%s " + QB_XS " state=%s id=%.8s", + other->client_name, other->originator, + stonith_op_state_str(other->state), other->id); } } } @@ -515,12 +521,12 @@ delegate_from_xml(xmlNode *xml) { xmlNode *match = pcmk__xpath_find_one(xml->doc, "//*[@" PCMK__XA_ST_DELEGATE "]", - LOG_NEVER); + PCMK__LOG_NEVER); if (match == NULL) { - return crm_element_value_copy(xml, PCMK__XA_SRC); + return pcmk__xe_get_copy(xml, PCMK__XA_SRC); } else { - return crm_element_value_copy(match, PCMK__XA_ST_DELEGATE); + return pcmk__xe_get_copy(match, PCMK__XA_ST_DELEGATE); } } @@ -555,14 +561,12 @@ finalize_op(remote_fencing_op_t *op, xmlNode *data, bool dup) if (op->notify_sent) { // Most likely, this is a timed-out action that eventually completed - crm_notice("Operation '%s'%s%s by %s for %s@%s%s: " - "Result arrived too late " QB_XS " id=%.8s", - op->action, (op->target? " targeting " : ""), - (op->target? op->target : ""), - (op->delegate? op->delegate : "unknown node"), - op->client_name, op->originator, - (op_merged? " (merged)" : ""), - op->id); + pcmk__notice("Operation '%s'%s%s by %s for %s@%s%s: Result arrive too " + "late " QB_XS " id=%.8s", + op->action, (op->target? " targeting " : ""), + pcmk__s(op->target, ""), + pcmk__s(op->delegate, "unknown node"), op->client_name, + op->originator, (op_merged? " (merged)" : ""), op->id); return; } @@ -590,14 +594,14 @@ finalize_op(remote_fencing_op_t *op, xmlNode *data, bool dup) } } - if (dup || (crm_element_value(data, PCMK__XA_ST_OP_MERGED) != NULL)) { + if (dup || (pcmk__xe_get(data, PCMK__XA_ST_OP_MERGED) != NULL)) { op_merged = true; } /* Tell everyone the operation is done, we will continue * with doing the local notifications once we receive * the broadcast back. */ - subt = crm_element_value(data, PCMK__XA_SUBT); + subt = pcmk__xe_get(data, PCMK__XA_SUBT); if (!dup && !pcmk__str_eq(subt, PCMK__VALUE_BROADCAST, pcmk__str_none)) { /* Defer notification until the bcast message arrives */ fenced_broadcast_op_result(op, op_merged); @@ -658,9 +662,9 @@ remote_op_watchdog_done(gpointer userdata) op->op_timer_one = 0; - crm_notice("Self-fencing (%s) by %s for %s assumed complete " - QB_XS " id=%.8s", - op->action, op->target, op->client_name, op->id); + pcmk__notice("Self-fencing (%s) by %s for %s assumed complete " + QB_XS " id=%.8s", + op->action, op->target, op->client_name, op->id); op->state = st_done; pcmk__set_result(&op->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); finalize_op(op, NULL, false); @@ -674,17 +678,18 @@ remote_op_timeout_one(gpointer userdata) op->op_timer_one = 0; - crm_notice("Peer's '%s' action targeting %s for client %s timed out " QB_XS - " id=%.8s", op->action, op->target, op->client_name, op->id); + pcmk__notice("Peer's '%s' action targeting %s for client %s timed out " + QB_XS " id=%.8s", + op->action, op->target, op->client_name, op->id); pcmk__set_result(&op->result, CRM_EX_ERROR, PCMK_EXEC_TIMEOUT, "Peer did not return fence result within timeout"); // The requested delay has been applied for the first device if (op->client_delay > 0) { op->client_delay = 0; - crm_trace("Try another device for '%s' action targeting %s " - "for client %s without delay " QB_XS " id=%.8s", - op->action, op->target, op->client_name, op->id); + pcmk__trace("Try another device for '%s' action targeting %s for " + "client %s without delay " QB_XS " id=%.8s", + op->action, op->target, op->client_name, op->id); } // Try another device, if appropriate @@ -702,9 +707,9 @@ remote_op_timeout_one(gpointer userdata) static void finalize_timed_out_op(remote_fencing_op_t *op, const char *reason) { - crm_debug("Action '%s' targeting %s for client %s timed out " - QB_XS " id=%.8s", - op->action, op->target, op->client_name, op->id); + pcmk__debug("Action '%s' targeting %s for client %s timed out " + QB_XS " id=%.8s", + op->action, op->target, op->client_name, op->id); if (op->phase == st_phase_on) { /* A remapped reboot operation timed out in the "on" phase, but the @@ -736,9 +741,9 @@ remote_op_timeout(gpointer userdata) op->op_timer_total = 0; if (op->state == st_done) { - crm_debug("Action '%s' targeting %s for client %s already completed " - QB_XS " id=%.8s", - op->action, op->target, op->client_name, op->id); + pcmk__debug("Action '%s' targeting %s for client %s already completed " + QB_XS " id=%.8s", + op->action, op->target, op->client_name, op->id); } else { finalize_timed_out_op(userdata, "Fencing did not complete within a " "total timeout based on the " @@ -756,19 +761,19 @@ remote_op_query_timeout(gpointer data) op->query_timer = 0; if (op->state == st_done) { - crm_debug("Operation %.8s targeting %s already completed", - op->id, op->target); + pcmk__debug("Operation %.8s targeting %s already completed", op->id, + op->target); } else if (op->state == st_exec) { - crm_debug("Operation %.8s targeting %s already in progress", - op->id, op->target); + pcmk__debug("Operation %.8s targeting %s already in progress", op->id, + op->target); } else if (op->query_results) { // Query succeeded, so attempt the actual fencing - crm_debug("Query %.8s targeting %s complete (state=%s)", - op->id, op->target, stonith_op_state_str(op->state)); + pcmk__debug("Query %.8s targeting %s complete (state=%s)", op->id, + op->target, stonith_op_state_str(op->state)); request_peer_fencing(op, NULL); } else { - crm_debug("Query %.8s targeting %s timed out (state=%s)", - op->id, op->target, stonith_op_state_str(op->state)); + pcmk__debug("Query %.8s targeting %s timed out (state=%s)", op->id, + op->target, stonith_op_state_str(op->state)); finalize_timed_out_op(op, "No capable peers replied to device query " "within timeout"); } @@ -873,7 +878,8 @@ topology_matches(const stonith_topology_t *tp, const char *node) * is received, then the topology will be unable to be used. */ if (node_has_attr(node, tp->target_attribute, tp->target_value)) { - crm_notice("Matched %s with %s by attribute", node, tp->target); + pcmk__notice("Matched %s with %s by attribute", node, + tp->target); return TRUE; } break; @@ -883,26 +889,27 @@ topology_matches(const stonith_topology_t *tp, const char *node) * (and tp->target_pattern) is a regular expression. */ if (regcomp(&r_patt, tp->target_pattern, REG_EXTENDED|REG_NOSUB)) { - crm_info("Bad regex '%s' for fencing level", tp->target); + pcmk__info("Bad regex '%s' for fencing level", tp->target); } else { int status = regexec(&r_patt, node, 0, NULL, 0); regfree(&r_patt); if (status == 0) { - crm_notice("Matched %s with %s by name", node, tp->target); + pcmk__notice("Matched %s with %s by name", node, + tp->target); return TRUE; } } break; case fenced_target_by_name: - crm_trace("Testing %s against %s", node, tp->target); + pcmk__trace("Testing %s against %s", node, tp->target); return pcmk__str_eq(tp->target, node, pcmk__str_casei); default: break; } - crm_trace("No match for %s with %s", node, tp->target); + pcmk__trace("No match for %s with %s", node, tp->target); return FALSE; } @@ -913,19 +920,22 @@ find_topology_for_host(const char *host) stonith_topology_t *tp = g_hash_table_lookup(topology, host); if(tp != NULL) { - crm_trace("Found %s for %s in %d entries", tp->target, host, g_hash_table_size(topology)); + pcmk__trace("Found %s for %s in %u entries", tp->target, host, + g_hash_table_size(topology)); return tp; } g_hash_table_iter_init(&tIter, topology); while (g_hash_table_iter_next(&tIter, NULL, (gpointer *) & tp)) { if (topology_matches(tp, host)) { - crm_trace("Found %s for %s in %d entries", tp->target, host, g_hash_table_size(topology)); + pcmk__trace("Found %s for %s in %u entries", tp->target, host, + g_hash_table_size(topology)); return tp; } } - crm_trace("No matches for %s in %d topology entries", host, g_hash_table_size(topology)); + pcmk__trace("No matches for %s in %u topology entries", host, + g_hash_table_size(topology)); return NULL; } @@ -965,10 +975,10 @@ advance_topology_level(remote_fencing_op_t *op, bool empty_ok) } while (op->level < ST__LEVEL_COUNT && tp->levels[op->level] == NULL); if (op->level < ST__LEVEL_COUNT) { - crm_trace("Attempting fencing level %d targeting %s (%d devices) " - "for client %s@%s (id=%.8s)", - op->level, op->target, g_list_length(tp->levels[op->level]), - op->client_name, op->originator, op->id); + pcmk__trace("Attempting fencing level %d targeting %s (%d devices) for " + "client %s@%s (id=%.8s)", + op->level, op->target, g_list_length(tp->levels[op->level]), + op->client_name, op->originator, op->id); set_op_device_list(op, tp->levels[op->level]); // The requested delay has been applied for the first fencing level @@ -988,10 +998,10 @@ advance_topology_level(remote_fencing_op_t *op, bool empty_ok) return pcmk_rc_ok; } - crm_info("All %sfencing options targeting %s for client %s@%s failed " - QB_XS " id=%.8s", - (stonith_watchdog_timeout_ms > 0)?"non-watchdog ":"", - op->target, op->client_name, op->originator, op->id); + pcmk__info("All %sfencing options targeting %s for client %s@%s failed " + QB_XS " id=%.8s", + ((stonith_watchdog_timeout_ms > 0)? "non-watchdog " : ""), + op->target, op->client_name, op->originator, op->id); return ENODEV; } @@ -1018,28 +1028,28 @@ merge_duplicates(remote_fencing_op_t *op) continue; // Don't compare against self } if (other->state > st_exec) { - crm_trace("%.8s not duplicate of %.8s: not in progress", - op->id, other->id); + pcmk__trace("%.8s not duplicate of %.8s: not in progress", op->id, + other->id); continue; } if (!pcmk__str_eq(op->target, other->target, pcmk__str_casei)) { - crm_trace("%.8s not duplicate of %.8s: node %s vs. %s", - op->id, other->id, op->target, other->target); + pcmk__trace("%.8s not duplicate of %.8s: node %s vs. %s", op->id, + other->id, op->target, other->target); continue; } if (!pcmk__str_eq(op->action, other_action, pcmk__str_none)) { - crm_trace("%.8s not duplicate of %.8s: action %s vs. %s", - op->id, other->id, op->action, other_action); + pcmk__trace("%.8s not duplicate of %.8s: action %s vs. %s", op->id, + other->id, op->action, other_action); continue; } if (pcmk__str_eq(op->client_name, other->client_name, pcmk__str_casei)) { - crm_trace("%.8s not duplicate of %.8s: same client %s", - op->id, other->id, op->client_name); + pcmk__trace("%.8s not duplicate of %.8s: same client %s", op->id, + other->id, op->client_name); continue; } if (pcmk__str_eq(other->target, other->originator, pcmk__str_casei)) { - crm_trace("%.8s not duplicate of %.8s: self-fencing for %s", - op->id, other->id, other->target); + pcmk__trace("%.8s not duplicate of %.8s: self-fencing for %s", + op->id, other->id, other->target); continue; } @@ -1047,20 +1057,20 @@ merge_duplicates(remote_fencing_op_t *op) pcmk__node_search_cluster_member); if (!fencing_peer_active(node)) { - crm_notice("Failing action '%s' targeting %s originating from " - "client %s@%s: Originator is dead " QB_XS " id=%.8s", - other->action, other->target, other->client_name, - other->originator, other->id); - crm_trace("%.8s not duplicate of %.8s: originator dead", - op->id, other->id); + pcmk__notice("Failing action '%s' targeting %s originating from " + "client %s@%s: Originator is dead " QB_XS " id=%.8s", + other->action, other->target, other->client_name, + other->originator, other->id); + pcmk__trace("%.8s not duplicate of %.8s: originator dead", op->id, + other->id); other->state = st_failed; continue; } if ((other->total_timeout > 0) && (now > (other->total_timeout + other->created))) { - crm_trace("%.8s not duplicate of %.8s: old (%lld vs. %lld + %ds)", - op->id, other->id, (long long)now, (long long)other->created, - other->total_timeout); + pcmk__trace("%.8s not duplicate of %.8s: old (%lld vs. %lld + %ds)", + op->id, other->id, (long long) now, + (long long) other->created, other->total_timeout); continue; } @@ -1071,15 +1081,15 @@ merge_duplicates(remote_fencing_op_t *op) if (other->total_timeout == 0) { other->total_timeout = op->total_timeout = TIMEOUT_MULTIPLY_FACTOR * get_op_total_timeout(op, NULL); - crm_trace("Best guess as to timeout used for %.8s: %ds", - other->id, other->total_timeout); + pcmk__trace("Best guess as to timeout used for %.8s: %ds", + other->id, other->total_timeout); } - crm_notice("Merging fencing action '%s' targeting %s originating from " - "client %s with identical request from %s@%s " - QB_XS " original=%.8s duplicate=%.8s total_timeout=%ds", - op->action, op->target, op->client_name, - other->client_name, other->originator, - op->id, other->id, other->total_timeout); + pcmk__notice("Merging fencing action '%s' targeting %s originating " + "from client %s with identical request from %s@%s " + QB_XS " original=%.8s duplicate=%.8s total_timeout=%ds", + op->action, op->target, op->client_name, + other->client_name, other->originator, + op->id, other->id, other->total_timeout); report_timeout_period(op, other->total_timeout); op->state = st_duplicate; } @@ -1119,9 +1129,9 @@ fenced_handle_manual_confirmation(const pcmk__client_t *client, xmlNode *msg) CRM_CHECK(dev != NULL, return EPROTO); - crm_notice("Received manual confirmation that %s has been fenced", - pcmk__s(crm_element_value(dev, PCMK__XA_ST_TARGET), - "unknown target")); + pcmk__notice("Received manual confirmation that %s has been fenced", + pcmk__s(pcmk__xe_get(dev, PCMK__XA_ST_TARGET), + "unknown target")); op = initiate_remote_stonith_op(client, msg, TRUE); if (op == NULL) { return EPROTO; @@ -1156,7 +1166,7 @@ create_remote_stonith_op(const char *client, xmlNode *request, gboolean peer) remote_fencing_op_t *op = NULL; xmlNode *dev = pcmk__xpath_find_one(request->doc, "//*[@" PCMK__XA_ST_TARGET "]", - LOG_NEVER); + PCMK__LOG_NEVER); int rc = pcmk_rc_ok; const char *operation = NULL; @@ -1165,35 +1175,36 @@ create_remote_stonith_op(const char *client, xmlNode *request, gboolean peer) /* If this operation is owned by another node, check to make * sure we haven't already created this operation. */ if (peer && dev) { - const char *op_id = crm_element_value(dev, PCMK__XA_ST_REMOTE_OP); + const char *op_id = pcmk__xe_get(dev, PCMK__XA_ST_REMOTE_OP); CRM_CHECK(op_id != NULL, return NULL); op = g_hash_table_lookup(stonith_remote_op_list, op_id); if (op) { - crm_debug("Reusing existing remote fencing op %.8s for %s", - op_id, ((client == NULL)? "unknown client" : client)); + pcmk__debug("Reusing existing remote fencing op %.8s for %s", op_id, + pcmk__s(client, "unknown client")); return op; } } op = pcmk__assert_alloc(1, sizeof(remote_fencing_op_t)); - crm_element_value_int(request, PCMK__XA_ST_TIMEOUT, &(op->base_timeout)); + pcmk__xe_get_int(request, PCMK__XA_ST_TIMEOUT, &(op->base_timeout)); + // Value -1 means disable any static/random fencing delays - crm_element_value_int(request, PCMK__XA_ST_DELAY, &(op->client_delay)); + pcmk__xe_get_int(request, PCMK__XA_ST_DELAY, &(op->client_delay)); if (peer && dev) { - op->id = crm_element_value_copy(dev, PCMK__XA_ST_REMOTE_OP); + op->id = pcmk__xe_get_copy(dev, PCMK__XA_ST_REMOTE_OP); } else { - op->id = crm_generate_uuid(); + op->id = pcmk__generate_uuid(); } g_hash_table_replace(stonith_remote_op_list, op->id, op); op->state = st_query; op->replies_expected = fencing_active_peers(); - op->action = crm_element_value_copy(dev, PCMK__XA_ST_DEVICE_ACTION); + op->action = pcmk__xe_get_copy(dev, PCMK__XA_ST_DEVICE_ACTION); /* The node initiating the stonith operation. If an operation is relayed, * this is the last node the operation lands on. When in standalone mode, @@ -1201,31 +1212,30 @@ create_remote_stonith_op(const char *client, xmlNode *request, gboolean peer) * * Or may be the name of the function that created the operation. */ - op->originator = crm_element_value_copy(dev, PCMK__XA_ST_ORIGIN); + op->originator = pcmk__xe_get_copy(dev, PCMK__XA_ST_ORIGIN); if (op->originator == NULL) { /* Local or relayed request */ op->originator = pcmk__str_copy(fenced_get_local_node()); } // Delegate may not be set - op->delegate = crm_element_value_copy(dev, PCMK__XA_ST_DELEGATE); + op->delegate = pcmk__xe_get_copy(dev, PCMK__XA_ST_DELEGATE); op->created = time(NULL); CRM_LOG_ASSERT(client != NULL); op->client_id = pcmk__str_copy(client); /* For a RELAY operation, set fenced on the client. */ - operation = crm_element_value(request, PCMK__XA_ST_OP); + operation = pcmk__xe_get(request, PCMK__XA_ST_OP); if (pcmk__str_eq(operation, STONITH_OP_RELAY, pcmk__str_none)) { - op->client_name = crm_strdup_printf("%s.%lu", crm_system_name, - (unsigned long) getpid()); + op->client_name = pcmk__assert_asprintf("%s.%lu", crm_system_name, + (unsigned long) getpid()); } else { - op->client_name = crm_element_value_copy(request, - PCMK__XA_ST_CLIENTNAME); + op->client_name = pcmk__xe_get_copy(request, PCMK__XA_ST_CLIENTNAME); } - op->target = crm_element_value_copy(dev, PCMK__XA_ST_TARGET); + op->target = pcmk__xe_get_copy(dev, PCMK__XA_ST_TARGET); // @TODO Figure out how to avoid copying XML here op->request = pcmk__xml_copy(NULL, request); @@ -1233,18 +1243,18 @@ create_remote_stonith_op(const char *client, xmlNode *request, gboolean peer) rc = pcmk__xe_get_flags(request, PCMK__XA_ST_CALLOPT, &(op->call_options), 0U); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from request %s: %s", - op->id, pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from request %s: %s", op->id, + pcmk_rc_str(rc)); } - crm_element_value_int(request, PCMK__XA_ST_CALLID, &(op->client_callid)); + pcmk__xe_get_int(request, PCMK__XA_ST_CALLID, &(op->client_callid)); - crm_trace("%s new fencing op %s ('%s' targeting %s for client %s, " - "base timeout %ds, %u %s expected)", - (peer && dev)? "Recorded" : "Generated", op->id, op->action, - op->target, op->client_name, op->base_timeout, - op->replies_expected, - pcmk__plural_alt(op->replies_expected, "reply", "replies")); + pcmk__trace("%s new fencing op %s ('%s' targeting %s for client %s, base " + "timeout %ds, %u %s expected)", + ((peer && (dev != NULL))? "Recorded" : "Generated"), op->id, + op->action, op->target, op->client_name, op->base_timeout, + op->replies_expected, + pcmk__plural_alt(op->replies_expected, "reply", "replies")); if (op->call_options & st_opt_cs_nodeid) { int nodeid; @@ -1262,7 +1272,8 @@ create_remote_stonith_op(const char *client, xmlNode *request, gboolean peer) pcmk__str_update(&(op->target), node->name); } else { - crm_warn("Could not expand nodeid '%s' into a host name", op->target); + pcmk__warn("Could not expand nodeid '%s' into a host name", + op->target); } } @@ -1304,7 +1315,7 @@ initiate_remote_stonith_op(const pcmk__client_t *client, xmlNode *request, if (client) { client_id = client->id; } else { - client_id = crm_element_value(request, PCMK__XA_ST_CLIENTID); + client_id = pcmk__xe_get(request, PCMK__XA_ST_CLIENTID); } CRM_LOG_ASSERT(client_id != NULL); @@ -1325,40 +1336,42 @@ initiate_remote_stonith_op(const pcmk__client_t *client, xmlNode *request, // advance_topology_level() exhausted levels pcmk__set_result(&op->result, CRM_EX_ERROR, PCMK_EXEC_ERROR, "All topology levels failed"); - crm_warn("Could not request peer fencing (%s) targeting %s " - QB_XS " id=%.8s", op->action, op->target, op->id); + pcmk__warn("Could not request peer fencing (%s) targeting %s " + QB_XS " id=%.8s", + op->action, op->target, op->id); finalize_op(op, NULL, false); return op; case st_duplicate: - crm_info("Requesting peer fencing (%s) targeting %s (duplicate) " - QB_XS " id=%.8s", op->action, op->target, op->id); + pcmk__info("Requesting peer fencing (%s) targeting %s (duplicate) " + QB_XS " id=%.8s", + op->action, op->target, op->id); return op; default: - crm_notice("Requesting peer fencing (%s) targeting %s " - QB_XS " id=%.8s state=%s base_timeout=%ds", - op->action, op->target, op->id, - stonith_op_state_str(op->state), op->base_timeout); + pcmk__notice("Requesting peer fencing (%s) targeting %s " + QB_XS " id=%.8s state=%s base_timeout=%ds", + op->action, op->target, op->id, + stonith_op_state_str(op->state), op->base_timeout); } query = stonith_create_op(op->client_callid, op->id, STONITH_OP_QUERY, NULL, op->call_options); - crm_xml_add(query, PCMK__XA_ST_REMOTE_OP, op->id); - crm_xml_add(query, PCMK__XA_ST_TARGET, op->target); - crm_xml_add(query, PCMK__XA_ST_DEVICE_ACTION, op_requested_action(op)); - crm_xml_add(query, PCMK__XA_ST_ORIGIN, op->originator); - crm_xml_add(query, PCMK__XA_ST_CLIENTID, op->client_id); - crm_xml_add(query, PCMK__XA_ST_CLIENTNAME, op->client_name); - crm_xml_add_int(query, PCMK__XA_ST_TIMEOUT, op->base_timeout); + pcmk__xe_set(query, PCMK__XA_ST_REMOTE_OP, op->id); + pcmk__xe_set(query, PCMK__XA_ST_TARGET, op->target); + pcmk__xe_set(query, PCMK__XA_ST_DEVICE_ACTION, op_requested_action(op)); + pcmk__xe_set(query, PCMK__XA_ST_ORIGIN, op->originator); + pcmk__xe_set(query, PCMK__XA_ST_CLIENTID, op->client_id); + pcmk__xe_set(query, PCMK__XA_ST_CLIENTNAME, op->client_name); + pcmk__xe_set_int(query, PCMK__XA_ST_TIMEOUT, op->base_timeout); /* In case of RELAY operation, RELAY information is added to the query to delete the original operation of RELAY. */ - operation = crm_element_value(request, PCMK__XA_ST_OP); + operation = pcmk__xe_get(request, PCMK__XA_ST_OP); if (pcmk__str_eq(operation, STONITH_OP_RELAY, pcmk__str_none)) { - relay_op_id = crm_element_value(request, PCMK__XA_ST_REMOTE_OP); + relay_op_id = pcmk__xe_get(request, PCMK__XA_ST_REMOTE_OP); if (relay_op_id) { - crm_xml_add(query, PCMK__XA_ST_REMOTE_OP_RELAY, relay_op_id); + pcmk__xe_set(query, PCMK__XA_ST_REMOTE_OP_RELAY, relay_op_id); } } @@ -1396,16 +1409,17 @@ find_best_peer(const char *device, remote_fencing_op_t * op, enum find_best_peer GList *iter = NULL; gboolean verified_devices_only = (options & FIND_PEER_VERIFIED_ONLY) ? TRUE : FALSE; - if (!device && pcmk_is_set(op->call_options, st_opt_topology)) { + if ((device == NULL) && pcmk__is_set(op->call_options, st_opt_topology)) { return NULL; } for (iter = op->query_results; iter != NULL; iter = iter->next) { peer_device_info_t *peer = iter->data; - crm_trace("Testing result from %s targeting %s with %d device%s: %d %x", - peer->host, op->target, peer->ndevices, - pcmk__plural_s(peer->ndevices), peer->tried, options); + pcmk__trace("Testing result from %s targeting %s with %d device%s: %d " + "%x", + peer->host, op->target, peer->ndevices, + pcmk__plural_s(peer->ndevices), peer->tried, options); if ((options & FIND_PEER_SKIP_TARGET) && pcmk__str_eq(peer->host, op->target, pcmk__str_casei)) { continue; } @@ -1413,8 +1427,7 @@ find_best_peer(const char *device, remote_fencing_op_t * op, enum find_best_peer continue; } - if (pcmk_is_set(op->call_options, st_opt_topology)) { - + if (pcmk__is_set(op->call_options, st_opt_topology)) { if (grab_peer_device(op, peer, device, verified_devices_only)) { return peer; } @@ -1423,7 +1436,7 @@ find_best_peer(const char *device, remote_fencing_op_t * op, enum find_best_peer && count_peer_devices(op, peer, verified_devices_only, fenced_support_flag(op->action))) { /* No topology: Use the current best peer */ - crm_trace("Simple fencing"); + pcmk__trace("Simple fencing"); return peer; } } @@ -1441,29 +1454,32 @@ stonith_choose_peer(remote_fencing_op_t * op) do { if (op->devices) { device = op->devices->data; - crm_trace("Checking for someone to fence (%s) %s using %s", - op->action, op->target, device); + pcmk__trace("Checking for someone to fence (%s) %s using %s", + op->action, op->target, device); } else { - crm_trace("Checking for someone to fence (%s) %s", - op->action, op->target); + pcmk__trace("Checking for someone to fence (%s) %s", op->action, + op->target); } /* Best choice is a peer other than the target with verified access */ peer = find_best_peer(device, op, FIND_PEER_SKIP_TARGET|FIND_PEER_VERIFIED_ONLY); if (peer) { - crm_trace("Found verified peer %s for %s", peer->host, device?device:""); + pcmk__trace("Found verified peer %s for %s", peer->host, + pcmk__s(device, "")); return peer; } if(op->query_timer != 0 && op->replies < QB_MIN(op->replies_expected, active)) { - crm_trace("Waiting before looking for unverified devices to fence %s", op->target); + pcmk__trace("Waiting before looking for unverified devices to " + "fence %s", + op->target); return NULL; } /* If no other peer has verified access, next best is unverified access */ peer = find_best_peer(device, op, FIND_PEER_SKIP_TARGET); if (peer) { - crm_trace("Found best unverified peer %s", peer->host); + pcmk__trace("Found best unverified peer %s", peer->host); return peer; } @@ -1473,7 +1489,7 @@ stonith_choose_peer(remote_fencing_op_t * op) if (op->phase != st_phase_on) { peer = find_best_peer(device, op, FIND_PEER_TARGET_ONLY); if (peer) { - crm_trace("%s will fence itself", peer->host); + pcmk__trace("%s will fence itself", peer->host); return peer; } } @@ -1482,19 +1498,19 @@ stonith_choose_peer(remote_fencing_op_t * op) * phase of a remapped "reboot", because we ignore errors in that case) */ } while ((op->phase != st_phase_on) - && pcmk_is_set(op->call_options, st_opt_topology) + && pcmk__is_set(op->call_options, st_opt_topology) && (advance_topology_level(op, false) == pcmk_rc_ok)); /* With a simple watchdog fencing configuration without a topology, * "device" is NULL here. Consider it should be done with watchdog fencing. */ if (is_watchdog_fencing(op, device)) { - crm_info("Couldn't contact watchdog-fencing target-node (%s)", - op->target); + pcmk__info("Couldn't contact watchdog-fencing target-node (%s)", + op->target); /* check_watchdog_fencing_and_wait will log additional info */ } else { - crm_notice("Couldn't find anyone to fence (%s) %s using %s", - op->action, op->target, (device? device : "any device")); + pcmk__notice("Couldn't find anyone to fence (%s) %s using %s", + op->action, op->target, pcmk__s(device, "any device")); } return NULL; } @@ -1515,17 +1531,17 @@ valid_fencing_timeout(int specified_timeout, bool action_specific, if (timeout > specified_timeout) { if (action_specific) { - crm_warn("pcmk_%s_timeout %ds for %s is too short (must be >= " - PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " %ds), using %ds " - "instead", - op->action, specified_timeout, device? device : "watchdog", - timeout, timeout); + pcmk__warn("pcmk_%s_timeout %ds for %s is too short (must be >= " + PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " %ds), using %ds " + "instead", + op->action, specified_timeout, + pcmk__s(device, "watchdog"), timeout, timeout); } else { - crm_warn("Fencing timeout %ds is too short (must be >= " - PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " %ds), using %ds " - "instead", - specified_timeout, timeout, timeout); + pcmk__warn("Fencing timeout %ds is too short (must be >= " + PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " %ds), using %ds " + "instead", + specified_timeout, timeout, timeout); } } @@ -1615,7 +1631,7 @@ get_op_total_timeout(const remote_fencing_op_t *op, long long total_timeout = 0; stonith_topology_t *tp = find_topology_for_host(op->target); - if (pcmk_is_set(op->call_options, st_opt_topology) && tp) { + if (pcmk__is_set(op->call_options, st_opt_topology) && (tp != NULL)) { int i; GList *device_list = NULL; GList *iter = NULL; @@ -1728,10 +1744,10 @@ report_timeout_period(remote_fencing_op_t * op, int op_timeout) return; } - crm_trace("Reporting timeout for %s (id=%.8s)", op->client_name, op->id); - client_node = crm_element_value(op->request, PCMK__XA_ST_CLIENTNODE); - call_id = crm_element_value(op->request, PCMK__XA_ST_CALLID); - client_id = crm_element_value(op->request, PCMK__XA_ST_CLIENTID); + pcmk__trace("Reporting timeout for %s (id=%.8s)", op->client_name, op->id); + client_node = pcmk__xe_get(op->request, PCMK__XA_ST_CLIENTNODE); + call_id = pcmk__xe_get(op->request, PCMK__XA_ST_CALLID); + client_id = pcmk__xe_get(op->request, PCMK__XA_ST_CLIENTID); if (!client_node || !call_id || !client_id) { return; } @@ -1744,10 +1760,10 @@ report_timeout_period(remote_fencing_op_t * op, int op_timeout) /* The client is connected to another node, relay this update to them */ update = stonith_create_op(op->client_callid, op->id, STONITH_OP_TIMEOUT_UPDATE, NULL, 0); - crm_xml_add(update, PCMK__XA_ST_REMOTE_OP, op->id); - crm_xml_add(update, PCMK__XA_ST_CLIENTID, client_id); - crm_xml_add(update, PCMK__XA_ST_CALLID, call_id); - crm_xml_add_int(update, PCMK__XA_ST_TIMEOUT, op_timeout); + pcmk__xe_set(update, PCMK__XA_ST_REMOTE_OP, op->id); + pcmk__xe_set(update, PCMK__XA_ST_CLIENTID, client_id); + pcmk__xe_set(update, PCMK__XA_ST_CALLID, call_id); + pcmk__xe_set_int(update, PCMK__XA_ST_TIMEOUT, op_timeout); pcmk__cluster_send_message(pcmk__get_node(0, client_node, NULL, pcmk__node_search_cluster_member), @@ -1758,8 +1774,8 @@ report_timeout_period(remote_fencing_op_t * op, int op_timeout) for (iter = op->duplicates; iter != NULL; iter = iter->next) { remote_fencing_op_t *dup = iter->data; - crm_trace("Reporting timeout for duplicate %.8s to client %s", - dup->id, dup->client_name); + pcmk__trace("Reporting timeout for duplicate %.8s to client %s", + dup->id, dup->client_name); report_timeout_period(iter->data, op_timeout); } } @@ -1808,8 +1824,8 @@ advance_topology_device_in_level(remote_fencing_op_t *op, const char *device, if (op->devices) { /* Necessary devices remain, so execute the next one */ - crm_trace("Next targeting %s on behalf of %s@%s", - op->target, op->client_name, op->originator); + pcmk__trace("Next targeting %s on behalf of %s@%s", op->target, + op->client_name, op->originator); // The requested delay has been applied for the first device if (op->client_delay > 0) { @@ -1819,8 +1835,8 @@ advance_topology_device_in_level(remote_fencing_op_t *op, const char *device, request_peer_fencing(op, NULL); } else { /* We're done with all devices and phases, so finalize operation */ - crm_trace("Marking complex fencing op targeting %s as complete", - op->target); + pcmk__trace("Marking complex fencing op targeting %s as complete", + op->target); op->state = st_done; finalize_op(op, msg, false); } @@ -1832,10 +1848,10 @@ check_watchdog_fencing_and_wait(remote_fencing_op_t * op) if (node_does_watchdog_fencing(op->target)) { guint timeout_ms = QB_MIN(stonith_watchdog_timeout_ms, UINT_MAX); - crm_notice("Waiting %s for %s to self-fence (%s) for " - "client %s " QB_XS " id=%.8s", - pcmk__readable_interval(timeout_ms), op->target, op->action, - op->client_name, op->id); + pcmk__notice("Waiting %s for %s to self-fence (%s) for client %s " + QB_XS " id=%.8s", + pcmk__readable_interval(timeout_ms), op->target, + op->action, op->client_name, op->id); if (op->op_timer_one) { g_source_remove(op->op_timer_one); @@ -1844,8 +1860,9 @@ check_watchdog_fencing_and_wait(remote_fencing_op_t * op) op); return TRUE; } else { - crm_debug("Skipping fallback to watchdog-fencing as %s is " - "not in host-list", op->target); + pcmk__debug("Skipping fallback to watchdog-fencing as %s is not in " + "host-list", + op->target); } return FALSE; } @@ -1866,9 +1883,8 @@ request_peer_fencing(remote_fencing_op_t *op, peer_device_info_t *peer) CRM_CHECK(op != NULL, return); - crm_trace("Action %.8s targeting %s for %s is %s", - op->id, op->target, op->client_name, - stonith_op_state_str(op->state)); + pcmk__trace("Action %.8s targeting %s for %s is %s", op->id, op->target, + op->client_name, stonith_op_state_str(op->state)); if ((op->phase == st_phase_on) && (op->devices != NULL)) { /* We are in the "on" phase of a remapped topology reboot. If this @@ -1885,22 +1901,23 @@ request_peer_fencing(remote_fencing_op_t *op, peer_device_info_t *peer) device = op->devices->data; if (pcmk__str_eq(fenced_device_reboot_action(device), PCMK_ACTION_OFF, pcmk__str_none)) { - crm_info("Not turning %s back on using %s because the device is " - "configured to stay off (pcmk_reboot_action='off')", - op->target, device); + pcmk__info("Not turning %s back on using %s because the device is " + "configured to stay off (pcmk_reboot_action='off')", + op->target, device); advance_topology_device_in_level(op, device, NULL); return; } if (!fenced_device_supports_on(device)) { - crm_info("Not turning %s back on using %s because the agent " - "doesn't support 'on'", op->target, device); + pcmk__info("Not turning %s back on using %s because the agent " + "doesn't support 'on'", + op->target, device); advance_topology_device_in_level(op, device, NULL); return; } } timeout = op->base_timeout; - if ((peer == NULL) && !pcmk_is_set(op->call_options, st_opt_topology)) { + if ((peer == NULL) && !pcmk__is_set(op->call_options, st_opt_topology)) { peer = stonith_choose_peer(op); } @@ -1908,12 +1925,13 @@ request_peer_fencing(remote_fencing_op_t *op, peer_device_info_t *peer) op->total_timeout = TIMEOUT_MULTIPLY_FACTOR * get_op_total_timeout(op, peer); op->op_timer_total = pcmk__create_timer(1000 * op->total_timeout, remote_op_timeout, op); report_timeout_period(op, op->total_timeout); - crm_info("Total timeout set to %ds for peer's fencing targeting %s for %s " - QB_XS " id=%.8s", - op->total_timeout, op->target, op->client_name, op->id); + pcmk__info("Total timeout set to %ds for peer's fencing targeting %s " + "for %s " QB_XS " id=%.8s", + op->total_timeout, op->target, op->client_name, op->id); } - if (pcmk_is_set(op->call_options, st_opt_topology) && op->devices) { + if (pcmk__is_set(op->call_options, st_opt_topology) + && (op->devices != NULL)) { /* Ignore the caller's peer preference if topology is in use, because * that peer might not have access to the required device. With * topology, stonith_choose_peer() removes the device from further @@ -1946,32 +1964,32 @@ request_peer_fencing(remote_fencing_op_t *op, peer_device_info_t *peer) timeout_one = TIMEOUT_MULTIPLY_FACTOR * op->client_delay; } - crm_xml_add(remote_op, PCMK__XA_ST_REMOTE_OP, op->id); - crm_xml_add(remote_op, PCMK__XA_ST_TARGET, op->target); - crm_xml_add(remote_op, PCMK__XA_ST_DEVICE_ACTION, op->action); - crm_xml_add(remote_op, PCMK__XA_ST_ORIGIN, op->originator); - crm_xml_add(remote_op, PCMK__XA_ST_CLIENTID, op->client_id); - crm_xml_add(remote_op, PCMK__XA_ST_CLIENTNAME, op->client_name); - crm_xml_add_int(remote_op, PCMK__XA_ST_TIMEOUT, timeout); - crm_xml_add_int(remote_op, PCMK__XA_ST_CALLOPT, op->call_options); - crm_xml_add_int(remote_op, PCMK__XA_ST_DELAY, op->client_delay); + pcmk__xe_set(remote_op, PCMK__XA_ST_REMOTE_OP, op->id); + pcmk__xe_set(remote_op, PCMK__XA_ST_TARGET, op->target); + pcmk__xe_set(remote_op, PCMK__XA_ST_DEVICE_ACTION, op->action); + pcmk__xe_set(remote_op, PCMK__XA_ST_ORIGIN, op->originator); + pcmk__xe_set(remote_op, PCMK__XA_ST_CLIENTID, op->client_id); + pcmk__xe_set(remote_op, PCMK__XA_ST_CLIENTNAME, op->client_name); + pcmk__xe_set_int(remote_op, PCMK__XA_ST_TIMEOUT, timeout); + pcmk__xe_set_int(remote_op, PCMK__XA_ST_CALLOPT, op->call_options); + pcmk__xe_set_int(remote_op, PCMK__XA_ST_DELAY, op->client_delay); if (device) { timeout_one += TIMEOUT_MULTIPLY_FACTOR * get_device_timeout(op, peer, device, true); - crm_notice("Requesting that %s perform '%s' action targeting %s " - "using %s " QB_XS " for client %s (%ds)", - peer->host, op->action, op->target, device, - op->client_name, timeout_one); - crm_xml_add(remote_op, PCMK__XA_ST_DEVICE_ID, device); + pcmk__notice("Requesting that %s perform '%s' action targeting %s " + "using %s " QB_XS " for client %s (%ds)", + peer->host, op->action, op->target, device, + op->client_name, timeout_one); + pcmk__xe_set(remote_op, PCMK__XA_ST_DEVICE_ID, device); } else { timeout_one += TIMEOUT_MULTIPLY_FACTOR * get_peer_timeout(op, peer); - crm_notice("Requesting that %s perform '%s' action targeting %s " - QB_XS " for client %s (%ds, %s)", - peer->host, op->action, op->target, op->client_name, - timeout_one, - pcmk__readable_interval(stonith_watchdog_timeout_ms)); + pcmk__notice("Requesting that %s perform '%s' action targeting %s " + QB_XS " for client %s (%ds, %s)", + peer->host, op->action, op->target, op->client_name, + timeout_one, + pcmk__readable_interval(stonith_watchdog_timeout_ms)); } op->state = st_exec; @@ -2015,20 +2033,23 @@ request_peer_fencing(remote_fencing_op_t *op, peer_device_info_t *peer) /* A remapped "on" cannot be executed, but the node was already * turned off successfully, so ignore the error and continue. */ - crm_warn("Ignoring %s 'on' failure (no capable peers) targeting %s " - "after successful 'off'", device, op->target); + pcmk__warn("Ignoring %s 'on' failure (no capable peers) targeting %s " + "after successful 'off'", + device, op->target); advance_topology_device_in_level(op, device, NULL); return; } else if (op->owner == FALSE) { - crm_err("Fencing (%s) targeting %s for client %s is not ours to control", - op->action, op->target, op->client_name); + pcmk__err("Fencing (%s) targeting %s for client %s is not ours to " + "control", + op->action, op->target, op->client_name); } else if (op->query_timer == 0) { /* We've exhausted all available peers */ - crm_info("No remaining peers capable of fencing (%s) %s for client %s " - QB_XS " state=%s", op->action, op->target, op->client_name, - stonith_op_state_str(op->state)); + pcmk__info("No remaining peers capable of fencing (%s) %s for client " + "%s " QB_XS " state=%s", + op->action, op->target, op->client_name, + stonith_op_state_str(op->state)); CRM_CHECK(op->state < st_done, return); finalize_timed_out_op(op, "All nodes failed, or are unable, to " "fence target"); @@ -2050,16 +2071,16 @@ request_peer_fencing(remote_fencing_op_t *op, peer_device_info_t *peer) } if (op->state == st_query) { - crm_info("No peers (out of %d) have devices capable of fencing " - "(%s) %s for client %s " QB_XS " state=%s", - op->replies, op->action, op->target, op->client_name, - stonith_op_state_str(op->state)); + pcmk__info("No peers (out of %d) have devices capable of fencing " + "(%s) %s for client %s " QB_XS " state=%s", + op->replies, op->action, op->target, op->client_name, + stonith_op_state_str(op->state)); pcmk__reset_result(&op->result); pcmk__set_result(&op->result, CRM_EX_ERROR, PCMK_EXEC_NO_FENCE_DEVICE, NULL); } else { - if (pcmk_is_set(op->call_options, st_opt_topology)) { + if (pcmk__is_set(op->call_options, st_opt_topology)) { pcmk__reset_result(&op->result); pcmk__set_result(&op->result, CRM_EX_ERROR, PCMK_EXEC_NO_FENCE_DEVICE, NULL); @@ -2071,20 +2092,20 @@ request_peer_fencing(remote_fencing_op_t *op, peer_device_info_t *peer) * needed. */ - crm_info("No peers (out of %d) are capable of fencing (%s) %s " - "for client %s " QB_XS " state=%s", - op->replies, op->action, op->target, op->client_name, - stonith_op_state_str(op->state)); + pcmk__info("No peers (out of %d) are capable of fencing (%s) %s " + "for client %s " QB_XS " state=%s", + op->replies, op->action, op->target, op->client_name, + stonith_op_state_str(op->state)); } op->state = st_failed; finalize_op(op, NULL, false); } else { - crm_info("Waiting for additional peers capable of fencing (%s) %s%s%s " - "for client %s " QB_XS " id=%.8s", - op->action, op->target, (device? " using " : ""), - (device? device : ""), op->client_name, op->id); + pcmk__info("Waiting for additional peers capable of fencing (%s) " + "%s%s%s for client %s " QB_XS " id=%.8s", + op->action, op->target, ((device != NULL)? " using " : ""), + pcmk__s(device, ""), op->client_name, op->id); } } @@ -2172,36 +2193,36 @@ parse_action_specific(const xmlNode *xml, const char *peer, const char *device, enum st_remap_phase phase, device_properties_t *props) { props->custom_action_timeout[phase] = 0; - crm_element_value_int(xml, PCMK__XA_ST_ACTION_TIMEOUT, - &props->custom_action_timeout[phase]); + pcmk__xe_get_int(xml, PCMK__XA_ST_ACTION_TIMEOUT, + &props->custom_action_timeout[phase]); if (props->custom_action_timeout[phase]) { - crm_trace("Peer %s with device %s returned %s action timeout %ds", - peer, device, action, props->custom_action_timeout[phase]); + pcmk__trace("Peer %s with device %s returned %s action timeout %ds", + peer, device, action, props->custom_action_timeout[phase]); } props->delay_max[phase] = 0; - crm_element_value_int(xml, PCMK__XA_ST_DELAY_MAX, &props->delay_max[phase]); + pcmk__xe_get_int(xml, PCMK__XA_ST_DELAY_MAX, &props->delay_max[phase]); if (props->delay_max[phase]) { - crm_trace("Peer %s with device %s returned maximum of random delay %ds for %s", - peer, device, props->delay_max[phase], action); + pcmk__trace("Peer %s with device %s returned maximum of random delay " + "%ds for %s", + peer, device, props->delay_max[phase], action); } props->delay_base[phase] = 0; - crm_element_value_int(xml, PCMK__XA_ST_DELAY_BASE, - &props->delay_base[phase]); + pcmk__xe_get_int(xml, PCMK__XA_ST_DELAY_BASE, &props->delay_base[phase]); if (props->delay_base[phase]) { - crm_trace("Peer %s with device %s returned base delay %ds for %s", - peer, device, props->delay_base[phase], action); + pcmk__trace("Peer %s with device %s returned base delay %ds for %s", + peer, device, props->delay_base[phase], action); } /* Handle devices with automatic unfencing */ if (pcmk__str_eq(action, PCMK_ACTION_ON, pcmk__str_none)) { int required = 0; - crm_element_value_int(xml, PCMK__XA_ST_REQUIRED, &required); + pcmk__xe_get_int(xml, PCMK__XA_ST_REQUIRED, &required); if (required) { - crm_trace("Peer %s requires device %s to execute for action %s", - peer, device, action); + pcmk__trace("Peer %s requires device %s to execute for action %s", + peer, device, action); add_required_device(op, device); } } @@ -2211,8 +2232,8 @@ parse_action_specific(const xmlNode *xml, const char *peer, const char *device, */ if (pcmk__xe_attr_is_true(xml, PCMK__XA_ST_ACTION_DISALLOWED)) { props->disallowed[phase] = TRUE; - crm_trace("Peer %s is disallowed from executing %s for device %s", - peer, action, device); + pcmk__trace("Peer %s is disallowed from executing %s for device %s", + peer, action, device); } } @@ -2239,10 +2260,10 @@ add_device_properties(const xmlNode *xml, remote_fencing_op_t *op, g_hash_table_insert(peer->devices, pcmk__str_copy(device), props); /* Peers with verified (monitored) access will be preferred */ - crm_element_value_int(xml, PCMK__XA_ST_MONITOR_VERIFIED, &verified); + pcmk__xe_get_int(xml, PCMK__XA_ST_MONITOR_VERIFIED, &verified); if (verified) { - crm_trace("Peer %s has confirmed a verified device %s", - peer->host, device); + pcmk__trace("Peer %s has confirmed a verified device %s", peer->host, + device); props->verified = TRUE; } @@ -2251,8 +2272,9 @@ add_device_properties(const xmlNode *xml, remote_fencing_op_t *op, &(props->device_support_flags), st_device_supports_on); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't determine device support for %s " - "(assuming unfencing): %s", device, pcmk_rc_str(rc)); + pcmk__warn("Couldn't determine device support for %s " + "(assuming unfencing): %s", + device, pcmk_rc_str(rc)); } /* Parse action-specific device properties */ @@ -2310,8 +2332,8 @@ add_result(remote_fencing_op_t *op, const char *host, int ndevices, peer->ndevices = g_hash_table_size(peer->devices); CRM_CHECK(ndevices == peer->ndevices, - crm_err("Query claimed to have %d device%s but %d found", - ndevices, pcmk__plural_s(ndevices), peer->ndevices)); + pcmk__err("Query claimed to have %d device%s but %d found", + ndevices, pcmk__plural_s(ndevices), peer->ndevices)); op->query_results = g_list_insert_sorted(op->query_results, peer, sort_peers); return peer; @@ -2348,19 +2370,19 @@ process_remote_stonith_query(xmlNode *msg) CRM_CHECK(dev != NULL, return -EPROTO); - id = crm_element_value(dev, PCMK__XA_ST_REMOTE_OP); + id = pcmk__xe_get(dev, PCMK__XA_ST_REMOTE_OP); CRM_CHECK(id != NULL, return -EPROTO); dev = pcmk__xpath_find_one(msg->doc, "//*[@" PCMK__XA_ST_AVAILABLE_DEVICES "]", LOG_ERR); CRM_CHECK(dev != NULL, return -EPROTO); - crm_element_value_int(dev, PCMK__XA_ST_AVAILABLE_DEVICES, &ndevices); + pcmk__xe_get_int(dev, PCMK__XA_ST_AVAILABLE_DEVICES, &ndevices); op = g_hash_table_lookup(stonith_remote_op_list, id); if (op == NULL) { - crm_debug("Received query reply for unknown or expired operation %s", - id); + pcmk__debug("Received query reply for unknown or expired operation %s", + id); return -EOPNOTSUPP; } @@ -2371,30 +2393,31 @@ process_remote_stonith_query(xmlNode *msg) if ((++op->replies >= replies_expected) && (op->state == st_query)) { have_all_replies = TRUE; } - host = crm_element_value(msg, PCMK__XA_SRC); + host = pcmk__xe_get(msg, PCMK__XA_SRC); host_is_target = pcmk__str_eq(host, op->target, pcmk__str_casei); - crm_info("Query result %d of %d from %s for %s/%s (%d device%s) %s", - op->replies, replies_expected, host, - op->target, op->action, ndevices, pcmk__plural_s(ndevices), id); + pcmk__info("Query result %d of %d from %s for %s/%s (%d device%s) %s", + op->replies, replies_expected, host, op->target, op->action, + ndevices, pcmk__plural_s(ndevices), id); if (ndevices > 0) { peer = add_result(op, host, ndevices, dev); } pcmk__set_result(&op->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); - if (pcmk_is_set(op->call_options, st_opt_topology)) { + if (pcmk__is_set(op->call_options, st_opt_topology)) { /* If we start the fencing before all the topology results are in, * it is possible fencing levels will be skipped because of the missing * query results. */ if (op->state == st_query && all_topology_devices_found(op)) { /* All the query results are in for the topology, start the fencing ops. */ - crm_trace("All topology devices found"); + pcmk__trace("All topology devices found"); request_peer_fencing(op, peer); } else if (have_all_replies) { - crm_info("All topology query replies have arrived, continuing (%d expected/%d received) ", - replies_expected, op->replies); + pcmk__info("All topology query replies have arrived, continuing " + "(%d expected/%d received) ", + replies_expected, op->replies); request_peer_fencing(op, NULL); } @@ -2406,24 +2429,26 @@ process_remote_stonith_query(xmlNode *msg) * go ahead and start fencing before query timeout */ if ((peer != NULL) && !host_is_target && nverified) { /* we have a verified device living on a peer that is not the target */ - crm_trace("Found %d verified device%s", - nverified, pcmk__plural_s(nverified)); + pcmk__trace("Found %d verified device%s", nverified, + pcmk__plural_s(nverified)); request_peer_fencing(op, peer); } else if (have_all_replies) { - crm_info("All query replies have arrived, continuing (%d expected/%d received) ", - replies_expected, op->replies); + pcmk__info("All query replies have arrived, continuing (%d " + "expected/%d received) ", + replies_expected, op->replies); request_peer_fencing(op, NULL); } else { - crm_trace("Waiting for more peer results before launching fencing operation"); + pcmk__trace("Waiting for more peer results before launching " + "fencing operation"); } } else if ((peer != NULL) && (op->state == st_done)) { - crm_info("Discarding query result from %s (%d device%s): " - "Operation is %s", peer->host, - peer->ndevices, pcmk__plural_s(peer->ndevices), - stonith_op_state_str(op->state)); + pcmk__info("Discarding query result from %s (%d device%s): Operation " + "is %s", + peer->host, peer->ndevices, pcmk__plural_s(peer->ndevices), + stonith_op_state_str(op->state)); } return pcmk_ok; @@ -2451,7 +2476,7 @@ fenced_process_fencing_reply(xmlNode *msg) CRM_CHECK(dev != NULL, return); - id = crm_element_value(dev, PCMK__XA_ST_REMOTE_OP); + id = pcmk__xe_get(dev, PCMK__XA_ST_REMOTE_OP); CRM_CHECK(id != NULL, return); dev = stonith__find_xe_with_result(msg); @@ -2459,7 +2484,7 @@ fenced_process_fencing_reply(xmlNode *msg) stonith__xe_get_result(dev, &result); - device = crm_element_value(dev, PCMK__XA_ST_DEVICE_ID); + device = pcmk__xe_get(dev, PCMK__XA_ST_DEVICE_ID); if (stonith_remote_op_list) { op = g_hash_table_lookup(stonith_remote_op_list, id); @@ -2467,7 +2492,7 @@ fenced_process_fencing_reply(xmlNode *msg) if ((op == NULL) && pcmk__result_ok(&result)) { /* Record successful fencing operations */ - const char *client_id = crm_element_value(dev, PCMK__XA_ST_CLIENTID); + const char *client_id = pcmk__xe_get(dev, PCMK__XA_ST_CLIENTID); op = create_remote_stonith_op(client_id, dev, TRUE); } @@ -2475,7 +2500,8 @@ fenced_process_fencing_reply(xmlNode *msg) if (op == NULL) { /* Could be for an event that began before we started */ /* TODO: Record the op for later querying */ - crm_info("Received peer result of unknown or expired operation %s", id); + pcmk__info("Received peer result of unknown or expired operation %s", + id); pcmk__reset_result(&result); return; } @@ -2484,14 +2510,15 @@ fenced_process_fencing_reply(xmlNode *msg) op->result = result; // The operation takes ownership of the result if (op->devices && device && !pcmk__str_eq(op->devices->data, device, pcmk__str_casei)) { - crm_err("Received outdated reply for device %s (instead of %s) to " - "fence (%s) %s. Operation already timed out at peer level.", - device, (const char *) op->devices->data, op->action, op->target); + pcmk__err("Received outdated reply for device %s (instead of %s) to " + "fence (%s) %s. Operation already timed out at peer level.", + device, (const char *) op->devices->data, op->action, + op->target); return; } - if (pcmk__str_eq(crm_element_value(msg, PCMK__XA_SUBT), - PCMK__VALUE_BROADCAST, pcmk__str_none)) { + if (pcmk__str_eq(pcmk__xe_get(msg, PCMK__XA_SUBT), PCMK__VALUE_BROADCAST, + pcmk__str_none)) { if (pcmk__result_ok(&op->result)) { op->state = st_done; @@ -2505,13 +2532,13 @@ fenced_process_fencing_reply(xmlNode *msg) pcmk__str_casei)) { /* If this isn't a remote level broadcast, and we are not the * originator of the operation, we should not be receiving this msg. */ - crm_err("Received non-broadcast fencing result for operation %.8s " - "we do not own (device %s targeting %s)", - op->id, device, op->target); + pcmk__err("Received non-broadcast fencing result for operation %.8s we " + "do not own (device %s targeting %s)", + op->id, device, op->target); return; } - if (pcmk_is_set(op->call_options, st_opt_topology)) { + if (pcmk__is_set(op->call_options, st_opt_topology)) { const char *device = NULL; const char *reason = op->result.exit_reason; @@ -2522,31 +2549,28 @@ fenced_process_fencing_reply(xmlNode *msg) return; } - device = crm_element_value(msg, PCMK__XA_ST_DEVICE_ID); + device = pcmk__xe_get(msg, PCMK__XA_ST_DEVICE_ID); if ((op->phase == 2) && !pcmk__result_ok(&op->result)) { /* A remapped "on" failed, but the node was already turned off * successfully, so ignore the error and continue. */ - crm_warn("Ignoring %s 'on' failure (%s%s%s) targeting %s " - "after successful 'off'", - device, pcmk_exec_status_str(op->result.execution_status), - (reason == NULL)? "" : ": ", - (reason == NULL)? "" : reason, - op->target); + pcmk__warn("Ignoring %s 'on' failure (%s%s%s) targeting %s after " + "successful 'off'", + device, + pcmk_exec_status_str(op->result.execution_status), + ((reason != NULL)? ": " : ""), pcmk__s(reason, ""), + op->target); pcmk__set_result(&op->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); } else { - crm_notice("Action '%s' targeting %s%s%s on behalf of %s@%s: " - "%s%s%s%s", - op->action, op->target, - ((device == NULL)? "" : " using "), - ((device == NULL)? "" : device), - op->client_name, - op->originator, - pcmk_exec_status_str(op->result.execution_status), - (reason == NULL)? "" : " (", - (reason == NULL)? "" : reason, - (reason == NULL)? "" : ")"); + pcmk__notice("Action '%s' targeting %s%s%s on behalf of %s@%s: " + "%s%s%s%s", + op->action, op->target, + ((device == NULL)? "" : " using "), + pcmk__s(device, ""), op->client_name, op->originator, + pcmk_exec_status_str(op->result.execution_status), + ((reason != NULL)? " (" : ""), pcmk__s(reason, ""), + ((reason != NULL)? ")" : "")); } if (pcmk__result_ok(&op->result)) { @@ -2581,9 +2605,9 @@ fenced_process_fencing_reply(xmlNode *msg) } /* Retry on failure */ - crm_trace("Next for %s on behalf of %s@%s (result was: %s)", - op->target, op->originator, op->client_name, - pcmk_exec_status_str(op->result.execution_status)); + pcmk__trace("Next for %s on behalf of %s@%s (result was: %s)", op->target, + op->originator, op->client_name, + pcmk_exec_status_str(op->result.execution_status)); request_peer_fencing(op, NULL); } @@ -2614,8 +2638,9 @@ stonith_check_fence_tolerance(int tolerance, const char *target, const char *act continue; } - crm_notice("Target %s was fenced (%s) less than %ds ago by %s on behalf of %s", - target, action, tolerance, rop->delegate, rop->originator); + pcmk__notice("Target %s was fenced (%s) less than %ds ago by %s on " + "behalf of %s", + target, action, tolerance, rop->delegate, rop->originator); return TRUE; } return FALSE; diff --git a/daemons/fenced/fenced_scheduler.c b/daemons/fenced/fenced_scheduler.c index 46d74320fcc..6f00a86e846 100644 --- a/daemons/fenced/fenced_scheduler.c +++ b/daemons/fenced/fenced_scheduler.c @@ -13,6 +13,7 @@ #include #include +#include // pcmk_readable_score() #include #include @@ -46,7 +47,7 @@ fenced_scheduler_init(void) pe__register_messages(logger); pcmk__register_lib_messages(logger); - pcmk__output_set_log_level(logger, LOG_TRACE); + pcmk__output_set_log_level(logger, PCMK__LOG_TRACE); scheduler->priv->out = logger; return pcmk_rc_ok; @@ -164,33 +165,36 @@ register_if_fencing_device(gpointer data, gpointer user_data) return; } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_fence_device)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_fence_device)) { return; // Not a fencing device } if (pe__resource_is_disabled(rsc)) { - crm_info("Ignoring fencing device %s because it is disabled", rsc->id); + pcmk__info("Ignoring fencing device %s because it is disabled", + rsc->id); return; } if ((stonith_watchdog_timeout_ms <= 0) && pcmk__str_eq(rsc->id, STONITH_WATCHDOG_ID, pcmk__str_none)) { - crm_info("Ignoring fencing device %s " - "because watchdog fencing is disabled", rsc->id); + pcmk__info("Ignoring fencing device %s because watchdog fencing is " + "disabled", + rsc->id); return; } // Check whether local node is allowed to run resource node = local_node_allowed_for(rsc); if (node == NULL) { - crm_info("Ignoring fencing device %s " - "because local node is not allowed to run it", rsc->id); + pcmk__info("Ignoring fencing device %s because local node is not " + "allowed to run it", + rsc->id); return; } if (node->assign->score < 0) { - crm_info("Ignoring fencing device %s " - "because local node has preference %s for it", - rsc->id, pcmk_readable_score(node->assign->score)); + pcmk__info("Ignoring fencing device %s because local node has " + "preference %s for it", + rsc->id, pcmk_readable_score(node->assign->score)); return; } @@ -199,16 +203,16 @@ register_if_fencing_device(gpointer data, gpointer user_data) pcmk_node_t *group_node = local_node_allowed_for(rsc->priv->parent); if ((group_node != NULL) && (group_node->assign->score < 0)) { - crm_info("Ignoring fencing device %s " - "because local node has preference %s for its group", - rsc->id, pcmk_readable_score(group_node->assign->score)); + pcmk__info("Ignoring fencing device %s because local node has " + "preference %s for its group", + rsc->id, pcmk_readable_score(group_node->assign->score)); return; } } - crm_debug("Reloading configuration of fencing device %s", rsc->id); + pcmk__debug("Reloading configuration of fencing device %s", rsc->id); - agent = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); + agent = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); get_meta_attributes(rsc->priv->meta, rsc, NULL, scheduler); rsc_provides = g_hash_table_lookup(rsc->priv->meta, diff --git a/daemons/fenced/pacemaker-fenced.c b/daemons/fenced/pacemaker-fenced.c index 32a3f2bf562..fc53e4f5864 100644 --- a/daemons/fenced/pacemaker-fenced.c +++ b/daemons/fenced/pacemaker-fenced.c @@ -1,5 +1,5 @@ /* - * Copyright 2009-2024 the Pacemaker project contributors + * Copyright 2009-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -72,8 +72,8 @@ static int32_t st_ipc_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) { if (stonith_shutdown_flag) { - crm_info("Ignoring new client [%d] during shutdown", - pcmk__client_pid(c)); + pcmk__info("Ignoring new client [%d] during shutdown", + pcmk__client_pid(c)); return -ECONNREFUSED; } @@ -96,7 +96,7 @@ st_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) int rc = pcmk_rc_ok; if (c == NULL) { - crm_info("Invalid client: %p", qbc); + pcmk__info("Invalid client: %p", qbc); return 0; } @@ -107,13 +107,13 @@ st_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) } - op = crm_element_value(request, PCMK__XA_CRM_TASK); + op = pcmk__xe_get(request, PCMK__XA_CRM_TASK); if(pcmk__str_eq(op, CRM_OP_RM_NODE_CACHE, pcmk__str_casei)) { - crm_xml_add(request, PCMK__XA_T, PCMK__VALUE_STONITH_NG); - crm_xml_add(request, PCMK__XA_ST_OP, op); - crm_xml_add(request, PCMK__XA_ST_CLIENTID, c->id); - crm_xml_add(request, PCMK__XA_ST_CLIENTNAME, pcmk__client_name(c)); - crm_xml_add(request, PCMK__XA_ST_CLIENTNODE, fenced_get_local_node()); + pcmk__xe_set(request, PCMK__XA_T, PCMK__VALUE_STONITH_NG); + pcmk__xe_set(request, PCMK__XA_ST_OP, op); + pcmk__xe_set(request, PCMK__XA_ST_CLIENTID, c->id); + pcmk__xe_set(request, PCMK__XA_ST_CLIENTNAME, pcmk__client_name(c)); + pcmk__xe_set(request, PCMK__XA_ST_CLIENTNODE, fenced_get_local_node()); pcmk__cluster_send_message(NULL, pcmk_ipc_fenced, request); pcmk__xml_free(request); @@ -121,32 +121,34 @@ st_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) } if (c->name == NULL) { - const char *value = crm_element_value(request, PCMK__XA_ST_CLIENTNAME); + const char *value = pcmk__xe_get(request, PCMK__XA_ST_CLIENTNAME); - c->name = crm_strdup_printf("%s.%u", pcmk__s(value, "unknown"), c->pid); + c->name = pcmk__assert_asprintf("%s.%u", pcmk__s(value, "unknown"), + c->pid); } rc = pcmk__xe_get_flags(request, PCMK__XA_ST_CALLOPT, &call_options, st_opt_none); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from IPC request: %s", - pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from IPC request: %s", + pcmk_rc_str(rc)); } - crm_trace("Flags %#08" PRIx32 "/%#08x for command %" PRIu32 - " from client %s", flags, call_options, id, pcmk__client_name(c)); + pcmk__trace("Flags %#08" PRIx32 "/%#08x for command %" PRIu32 + " from client %s", + flags, call_options, id, pcmk__client_name(c)); - if (pcmk_is_set(call_options, st_opt_sync_call)) { - pcmk__assert(pcmk_is_set(flags, crm_ipc_client_response)); + if (pcmk__is_set(call_options, st_opt_sync_call)) { + pcmk__assert(pcmk__is_set(flags, crm_ipc_client_response)); CRM_LOG_ASSERT(c->request_id == 0); /* This means the client has two synchronous events in-flight */ c->request_id = id; /* Reply only to the last one */ } - crm_xml_add(request, PCMK__XA_ST_CLIENTID, c->id); - crm_xml_add(request, PCMK__XA_ST_CLIENTNAME, pcmk__client_name(c)); - crm_xml_add(request, PCMK__XA_ST_CLIENTNODE, fenced_get_local_node()); + pcmk__xe_set(request, PCMK__XA_ST_CLIENTID, c->id); + pcmk__xe_set(request, PCMK__XA_ST_CLIENTNAME, pcmk__client_name(c)); + pcmk__xe_set(request, PCMK__XA_ST_CLIENTNODE, fenced_get_local_node()); - crm_log_xml_trace(request, "ipc-received"); + pcmk__log_xml_trace(request, "ipc-received"); stonith_command(c, id, flags, request, NULL); pcmk__xml_free(request); @@ -163,7 +165,7 @@ st_ipc_closed(qb_ipcs_connection_t * c) return 0; } - crm_trace("Connection %p closed", c); + pcmk__trace("Connection %p closed", c); pcmk__free_client(client); /* 0 means: yes, go ahead and destroy the connection */ @@ -173,21 +175,21 @@ st_ipc_closed(qb_ipcs_connection_t * c) static void st_ipc_destroy(qb_ipcs_connection_t * c) { - crm_trace("Connection %p destroyed", c); + pcmk__trace("Connection %p destroyed", c); st_ipc_closed(c); } static void stonith_peer_callback(xmlNode * msg, void *private_data) { - const char *remote_peer = crm_element_value(msg, PCMK__XA_SRC); - const char *op = crm_element_value(msg, PCMK__XA_ST_OP); + const char *remote_peer = pcmk__xe_get(msg, PCMK__XA_SRC); + const char *op = pcmk__xe_get(msg, PCMK__XA_ST_OP); if (pcmk__str_eq(op, STONITH_OP_POKE, pcmk__str_none)) { return; } - crm_log_xml_trace(msg, "Peer[inbound]"); + pcmk__log_xml_trace(msg, "Peer[inbound]"); stonith_command(NULL, 0, 0, msg, remote_peer); } @@ -206,11 +208,11 @@ handle_cpg_message(cpg_handle_t handle, const struct cpg_name *groupName, xml = pcmk__xml_parse(data); if (xml == NULL) { - crm_err("Invalid XML: '%.120s'", data); + pcmk__err("Invalid XML: '%.120s'", data); free(data); return; } - crm_xml_add(xml, PCMK__XA_SRC, from); + pcmk__xe_set(xml, PCMK__XA_SRC, from); stonith_peer_callback(xml, NULL); pcmk__xml_free(xml); @@ -220,7 +222,7 @@ handle_cpg_message(cpg_handle_t handle, const struct cpg_name *groupName, static void stonith_peer_cs_destroy(gpointer user_data) { - crm_crit("Lost connection to cluster layer, shutting down"); + pcmk__crit("Lost connection to cluster layer, shutting down"); stonith_shutdown(0); } #endif @@ -234,7 +236,7 @@ do_local_reply(const xmlNode *notify_src, pcmk__client_t *client, int rid = 0; uint32_t ipc_flags = crm_ipc_server_event; - if (pcmk_is_set(call_options, st_opt_sync_call)) { + if (pcmk__is_set(call_options, st_opt_sync_call)) { CRM_LOG_ASSERT(client->request_id); rid = client->request_id; client->request_id = 0; @@ -243,12 +245,12 @@ do_local_reply(const xmlNode *notify_src, pcmk__client_t *client, local_rc = pcmk__ipc_send_xml(client, rid, notify_src, ipc_flags); if (local_rc == pcmk_rc_ok) { - crm_trace("Sent response %d to client %s", - rid, pcmk__client_name(client)); + pcmk__trace("Sent response %d to client %s", rid, + pcmk__client_name(client)); } else { - crm_warn("%synchronous reply to client %s failed: %s", - (pcmk_is_set(call_options, st_opt_sync_call)? "S" : "As"), - pcmk__client_name(client), pcmk_rc_str(local_rc)); + pcmk__warn("%synchronous reply to client %s failed: %s", + (pcmk__is_set(call_options, st_opt_sync_call)? "S" : "As"), + pcmk__client_name(client), pcmk_rc_str(local_rc)); } } @@ -287,25 +289,26 @@ stonith_notify_client(gpointer key, gpointer value, gpointer user_data) CRM_CHECK(client != NULL, return); CRM_CHECK(update_msg != NULL, return); - type = crm_element_value(update_msg, PCMK__XA_SUBT); - CRM_CHECK(type != NULL, crm_log_xml_err(update_msg, "notify"); return); + type = pcmk__xe_get(update_msg, PCMK__XA_SUBT); + CRM_CHECK(type != NULL, pcmk__log_xml_err(update_msg, "notify"); return); if (client->ipcs == NULL) { - crm_trace("Skipping client with NULL channel"); + pcmk__trace("Skipping client with NULL channel"); return; } - if (pcmk_is_set(client->flags, get_stonith_flag(type))) { + if (pcmk__is_set(client->flags, get_stonith_flag(type))) { int rc = pcmk__ipc_send_xml(client, 0, update_msg, crm_ipc_server_event); if (rc != pcmk_rc_ok) { - crm_warn("%s notification of client %s failed: %s " - QB_XS " id=%.8s rc=%d", type, pcmk__client_name(client), - pcmk_rc_str(rc), client->id, rc); + pcmk__warn("%s notification of client %s failed: %s " + QB_XS " id=%.8s rc=%d", + type, pcmk__client_name(client), pcmk_rc_str(rc), + client->id, rc); } else { - crm_trace("Sent %s notification to client %s", - type, pcmk__client_name(client)); + pcmk__trace("Sent %s notification to client %s", type, + pcmk__client_name(client)); } } } @@ -326,11 +329,12 @@ do_stonith_async_timeout_update(const char *client_id, const char *call_id, int } notify_data = pcmk__xe_create(NULL, PCMK__XE_ST_ASYNC_TIMEOUT_VALUE); - crm_xml_add(notify_data, PCMK__XA_T, PCMK__VALUE_ST_ASYNC_TIMEOUT_VALUE); - crm_xml_add(notify_data, PCMK__XA_ST_CALLID, call_id); - crm_xml_add_int(notify_data, PCMK__XA_ST_TIMEOUT, timeout); + pcmk__xe_set(notify_data, PCMK__XA_T, PCMK__VALUE_ST_ASYNC_TIMEOUT_VALUE); + pcmk__xe_set(notify_data, PCMK__XA_ST_CALLID, call_id); + pcmk__xe_set_int(notify_data, PCMK__XA_ST_TIMEOUT, timeout); - crm_trace("timeout update is %d for client %s and call id %s", timeout, client_id, call_id); + pcmk__trace("timeout update is %d for client %s and call id %s", timeout, + client_id, call_id); if (client) { pcmk__ipc_send_xml(client, 0, notify_data, crm_ipc_server_event); @@ -356,9 +360,9 @@ fenced_send_notification(const char *type, const pcmk__action_result_t *result, CRM_LOG_ASSERT(type != NULL); - crm_xml_add(update_msg, PCMK__XA_T, PCMK__VALUE_ST_NOTIFY); - crm_xml_add(update_msg, PCMK__XA_SUBT, type); - crm_xml_add(update_msg, PCMK__XA_ST_OP, type); + pcmk__xe_set(update_msg, PCMK__XA_T, PCMK__VALUE_ST_NOTIFY); + pcmk__xe_set(update_msg, PCMK__XA_SUBT, type); + pcmk__xe_set(update_msg, PCMK__XA_ST_OP, type); stonith__xe_set_result(update_msg, result); if (data != NULL) { @@ -367,10 +371,10 @@ fenced_send_notification(const char *type, const pcmk__action_result_t *result, pcmk__xml_copy(wrapper, data); } - crm_trace("Notifying clients"); + pcmk__trace("Notifying clients"); pcmk__foreach_ipc_client(stonith_notify_client, update_msg); pcmk__xml_free(update_msg); - crm_trace("Notify complete"); + pcmk__trace("Notify complete"); } /*! @@ -392,7 +396,7 @@ fenced_send_config_notification(const char *op, { xmlNode *notify_data = pcmk__xe_create(NULL, op); - crm_xml_add(notify_data, PCMK__XA_ST_DEVICE_ID, desc); + pcmk__xe_set(notify_data, PCMK__XA_ST_DEVICE_ID, desc); fenced_send_notification(op, result, notify_data); pcmk__xml_free(notify_data); @@ -418,7 +422,7 @@ node_does_watchdog_fencing(const char *node) void stonith_shutdown(int nsig) { - crm_info("Terminating with %d clients", pcmk__ipc_client_count()); + pcmk__info("Terminating with %d clients", pcmk__ipc_client_count()); stonith_shutdown_flag = TRUE; if (mainloop != NULL && g_main_loop_is_running(mainloop)) { g_main_loop_quit(mainloop); @@ -463,18 +467,18 @@ st_peer_update_callback(enum pcmk__node_update type, pcmk__node_status_t *node, const void *data) { if ((type != pcmk__node_update_processes) - && !pcmk_is_set(node->flags, pcmk__node_status_remote)) { + && !pcmk__is_set(node->flags, pcmk__node_status_remote)) { /* * This is a hack until we can send to a nodeid and/or we fix node name lookups * These messages are ignored in stonith_peer_callback() */ xmlNode *query = pcmk__xe_create(NULL, PCMK__XE_STONITH_COMMAND); - crm_xml_add(query, PCMK__XA_T, PCMK__VALUE_STONITH_NG); - crm_xml_add(query, PCMK__XA_ST_OP, STONITH_OP_POKE); + pcmk__xe_set(query, PCMK__XA_T, PCMK__VALUE_STONITH_NG); + pcmk__xe_set(query, PCMK__XA_ST_OP, STONITH_OP_POKE); - crm_debug("Broadcasting our uname because of node %" PRIu32, - node->cluster_layer_id); + pcmk__debug("Broadcasting our uname because of node %" PRIu32, + node->cluster_layer_id); pcmk__cluster_send_message(NULL, pcmk_ipc_fenced, query); pcmk__xml_free(query); @@ -575,12 +579,12 @@ main(int argc, char **argv) crm_log_init(NULL, LOG_INFO + args->verbosity, TRUE, (args->verbosity > 0), argc, argv, FALSE); - crm_notice("Starting Pacemaker fencer"); + pcmk__notice("Starting Pacemaker fencer"); old_instance = crm_ipc_new("stonith-ng", 0); if (old_instance == NULL) { /* crm_ipc_new() will have already logged an error message with - * crm_err() + * pcmk__err() */ exit_code = CRM_EX_FATAL; goto done; @@ -590,8 +594,8 @@ main(int argc, char **argv) // IPC endpoint already up crm_ipc_close(old_instance); crm_ipc_destroy(old_instance); - crm_crit("Aborting start-up because another fencer instance is " - "already active"); + pcmk__crit("Aborting start-up because another fencer instance is " + "already active"); goto done; } else { // Not up or not authentic, we'll proceed either way @@ -625,7 +629,7 @@ main(int argc, char **argv) if (pcmk_cluster_connect(cluster) != pcmk_rc_ok) { exit_code = CRM_EX_FATAL; - crm_crit("Cannot sign in to the cluster... terminating"); + pcmk__crit("Cannot sign in to the cluster... terminating"); goto done; } fenced_set_local_node(cluster->priv->node_name); @@ -641,7 +645,8 @@ main(int argc, char **argv) // Create the mainloop and run it... mainloop = g_main_loop_new(NULL, FALSE); - crm_notice("Pacemaker fencer successfully started and accepting connections"); + pcmk__notice("Pacemaker fencer successfully started and accepting " + "connections"); g_main_loop_run(mainloop); done: diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c index b85e7eaf6c5..0bff3b5b50b 100644 --- a/daemons/pacemakerd/pacemakerd.c +++ b/daemons/pacemakerd/pacemakerd.c @@ -1,5 +1,5 @@ /* - * Copyright 2010-2024 the Pacemaker project contributors + * Copyright 2010-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -125,7 +125,7 @@ static GOptionEntry entries[] = { static void pcmk_ignore(int nsig) { - crm_info("Ignoring signal %s (%d)", strsignal(nsig), nsig); + pcmk__info("Ignoring signal %s (%d)", strsignal(nsig), nsig); } static void @@ -140,8 +140,9 @@ pacemakerd_chown(const char *path, uid_t uid, gid_t gid) int rc = chown(path, uid, gid); if (rc < 0) { - crm_warn("Cannot change the ownership of %s to user %s and gid %d: %s", - path, CRM_DAEMON_USER, gid, pcmk_rc_str(errno)); + pcmk__warn("Cannot change the ownership of %s to user " CRM_DAEMON_USER + " and gid %d: %s", + path, gid, pcmk_rc_str(errno)); } } @@ -161,16 +162,16 @@ create_pcmk_dirs(void) NULL }; - if (pcmk_daemon_user(&pcmk_uid, &pcmk_gid) < 0) { - crm_err("Cluster user %s does not exist, aborting Pacemaker startup", - CRM_DAEMON_USER); + if (pcmk__daemon_user(&pcmk_uid, &pcmk_gid) != pcmk_rc_ok) { + pcmk__err("Cluster user " CRM_DAEMON_USER " does not exist, aborting " + "Pacemaker startup"); crm_exit(CRM_EX_NOUSER); } // Used by some resource agents if ((mkdir(CRM_STATE_DIR, 0750) < 0) && (errno != EEXIST)) { - crm_warn("Could not create directory " CRM_STATE_DIR ": %s", - pcmk_rc_str(errno)); + pcmk__warn("Could not create directory " CRM_STATE_DIR ": %s", + pcmk_rc_str(errno)); } else { pacemakerd_chown(CRM_STATE_DIR, pcmk_uid, pcmk_gid); } @@ -179,8 +180,8 @@ create_pcmk_dirs(void) int rc = pcmk__build_path(dirs[i], 0750); if (rc != pcmk_rc_ok) { - crm_warn("Could not create directory %s: %s", - dirs[i], pcmk_rc_str(rc)); + pcmk__warn("Could not create directory %s: %s", dirs[i], + pcmk_rc_str(rc)); } else { pacemakerd_chown(dirs[i], pcmk_uid, pcmk_gid); } @@ -194,16 +195,16 @@ remove_core_file_limit(void) // Get current limits if (getrlimit(RLIMIT_CORE, &cores) < 0) { - crm_notice("Unable to check system core file limits " - "(consider ensuring the size is unlimited): %s", - strerror(errno)); + pcmk__notice("Unable to check system core file limits (consider " + "ensuring the size is unlimited): %s", + strerror(errno)); return; } // Check whether core dumps are disabled if (cores.rlim_max == 0) { if (geteuid() != 0) { // Yes, and there's nothing we can do about it - crm_notice("Core dumps are disabled (consider enabling them)"); + pcmk__notice("Core dumps are disabled (consider enabling them)"); return; } cores.rlim_max = RLIM_INFINITY; // Yes, but we're root, so enable them @@ -213,18 +214,18 @@ remove_core_file_limit(void) if (cores.rlim_cur != cores.rlim_max) { cores.rlim_cur = cores.rlim_max; if (setrlimit(RLIMIT_CORE, &cores) < 0) { - crm_notice("Unable to raise system limit on core file size " - "(consider doing so manually): %s", - strerror(errno)); + pcmk__notice("Unable to raise system limit on core file size " + "(consider doing so manually): %s", + strerror(errno)); return; } } if (cores.rlim_cur == RLIM_INFINITY) { - crm_trace("Core file size is unlimited"); + pcmk__trace("Core file size is unlimited"); } else { - crm_trace("Core file size is limited to %llu bytes", - (unsigned long long) cores.rlim_cur); + pcmk__trace("Core file size is limited to %llu bytes", + (unsigned long long) cores.rlim_cur); } } @@ -322,7 +323,7 @@ main(int argc, char **argv) crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE); } - crm_debug("Checking for existing Pacemaker instance"); + pcmk__debug("Checking for existing Pacemaker instance"); rc = pcmk_new_ipc_api(&old_instance, pcmk_ipc_pacemakerd); if (old_instance == NULL) { @@ -334,8 +335,8 @@ main(int argc, char **argv) pcmk_register_ipc_callback(old_instance, pacemakerd_event_cb, NULL); rc = pcmk__connect_ipc(old_instance, pcmk_ipc_dispatch_sync, 2); if (rc != pcmk_rc_ok) { - crm_debug("No existing %s instance found: %s", - pcmk_ipc_name(old_instance, true), pcmk_rc_str(rc)); + pcmk__debug("No existing %s instance found: %s", + pcmk_ipc_name(old_instance, true), pcmk_rc_str(rc)); } old_instance_connected = pcmk_ipc_is_connected(old_instance); @@ -379,7 +380,7 @@ main(int argc, char **argv) } else if (old_instance_connected) { pcmk_free_ipc_api(old_instance); - crm_err("Aborting start-up because active Pacemaker instance found"); + pcmk__err("Aborting start-up because active Pacemaker instance found"); exit_code = CRM_EX_FATAL; goto done; } @@ -409,8 +410,8 @@ main(int argc, char **argv) } } - crm_notice("Starting Pacemaker %s " QB_XS " build=%s features:%s", - PACEMAKER_VERSION, BUILD_VERSION, CRM_FEATURES); + pcmk__notice("Starting Pacemaker " PACEMAKER_VERSION " " + QB_XS " build=" BUILD_VERSION " features:" CRM_FEATURES); mainloop = g_main_loop_new(NULL, FALSE); remove_core_file_limit(); @@ -444,24 +445,25 @@ main(int argc, char **argv) mainloop_add_signal(SIGINT, pcmk_shutdown); if ((running_with_sbd) && pcmk__get_sbd_sync_resource_startup()) { - crm_notice("Waiting for startup-trigger from SBD."); + pcmk__notice("Waiting for startup-trigger from SBD"); pacemakerd_state = PCMK__VALUE_WAIT_FOR_PING; startup_trigger = mainloop_add_trigger(G_PRIORITY_HIGH, init_children_processes, NULL); } else { if (running_with_sbd) { - crm_warn("Enabling SBD_SYNC_RESOURCE_STARTUP would (if supported " - "by your SBD version) improve reliability of " - "interworking between SBD & pacemaker."); + pcmk__warn("Enabling SBD_SYNC_RESOURCE_STARTUP would (if supported " + "by your SBD version) improve reliability of " + "interworking between SBD & pacemaker."); } pacemakerd_state = PCMK__VALUE_STARTING_DAEMONS; init_children_processes(NULL); } - crm_notice("Pacemaker daemon successfully started and accepting connections"); + pcmk__notice("Pacemaker daemon successfully started and accepting " + "connections"); g_main_loop_run(mainloop); if (ipcs) { - crm_trace("Closing IPC server"); + pcmk__trace("Closing IPC server"); mainloop_del_ipc_server(ipcs); ipcs = NULL; } diff --git a/daemons/pacemakerd/pcmkd_corosync.c b/daemons/pacemakerd/pcmkd_corosync.c index 7e54c42c4a8..e6d4af54aaa 100644 --- a/daemons/pacemakerd/pcmkd_corosync.c +++ b/daemons/pacemakerd/pcmkd_corosync.c @@ -1,5 +1,5 @@ /* - * Copyright 2010-2024 the Pacemaker project contributors + * Copyright 2010-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,6 +11,8 @@ #include "pacemakerd.h" #include "pcmkd_corosync.h" +#include // PRIu32 +#include // uint32_t #include #include /* for calls to stat() */ #include /* For basename() and dirname() */ @@ -37,9 +39,21 @@ static mainloop_timer_t *reconnect_timer = NULL; static void cfg_shutdown_callback(corosync_cfg_handle_t h, corosync_cfg_shutdown_flags_t flags) { - crm_info("Corosync wants to shut down: %s", - (flags == COROSYNC_CFG_SHUTDOWN_FLAG_IMMEDIATE) ? "immediate" : - (flags == COROSYNC_CFG_SHUTDOWN_FLAG_REGARDLESS) ? "forced" : "optional"); + const char *shutdown_s = NULL; + + switch (flags) { + case COROSYNC_CFG_SHUTDOWN_FLAG_IMMEDIATE: + shutdown_s = "immediate"; + break; + case COROSYNC_CFG_SHUTDOWN_FLAG_REGARDLESS: + shutdown_s = "forced"; + break; + default: + shutdown_s = "optional"; + break; + } + + pcmk__info("Corosync wants to shut down: %s", shutdown_s); /* Never allow corosync to shut down while we're running */ corosync_cfg_replyto_shutdown(h, COROSYNC_CFG_SHUTDOWN_FLAG_NO); @@ -82,13 +96,13 @@ cluster_reconnect_cb(gpointer data) if (cluster_connect_cfg()) { mainloop_timer_del(reconnect_timer); reconnect_timer = NULL; - crm_notice("Cluster reconnect succeeded"); + pcmk__notice("Cluster reconnect succeeded"); pacemakerd_read_config(); restart_cluster_subdaemons(); return G_SOURCE_REMOVE; } else { - crm_info("Cluster reconnect failed " - "(connection will be reattempted once per second)"); + pcmk__info("Cluster reconnect failed (connection will be reattempted " + "once per second)"); } /* * In theory this will continue forever. In practice the CIB connection from @@ -101,8 +115,8 @@ cluster_reconnect_cb(gpointer data) static void cfg_connection_destroy(gpointer user_data) { - crm_warn("Lost connection to cluster layer " - "(connection will be reattempted once per second)"); + pcmk__warn("Lost connection to cluster layer (connection will be " + "reattempted once per second)"); corosync_cfg_finalize(cfg_handle); cfg_handle = 0; reconnect_timer = mainloop_timer_add("corosync reconnect", 1000, TRUE, cluster_reconnect_cb, NULL); @@ -126,7 +140,7 @@ cluster_disconnect_cfg(void) code; \ if(rc == CS_ERR_TRY_AGAIN || rc == CS_ERR_QUEUE_FULL) { \ counter++; \ - crm_debug("Retrying Corosync operation after %ds", counter); \ + pcmk__debug("Retrying Corosync operation after %ds", counter); \ sleep(counter); \ } else { \ break; \ @@ -151,47 +165,48 @@ cluster_connect_cfg(void) cs_repeat(retries, 30, rc = corosync_cfg_initialize(&cfg_handle, &cfg_callbacks)); if (rc != CS_OK) { - crm_crit("Could not connect to Corosync CFG: %s " QB_XS " rc=%d", - cs_strerror(rc), rc); + pcmk__crit("Could not connect to Corosync CFG: %s " QB_XS " rc=%d", + cs_strerror(rc), rc); return FALSE; } rc = corosync_cfg_fd_get(cfg_handle, &fd); if (rc != CS_OK) { - crm_crit("Could not get Corosync CFG descriptor: %s " QB_XS " rc=%d", - cs_strerror(rc), rc); + pcmk__crit("Could not get Corosync CFG descriptor: %s " QB_XS " rc=%d", + cs_strerror(rc), rc); goto bail; } /* CFG provider run as root (in given user namespace, anyway)? */ if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid, &found_uid, &found_gid))) { - crm_crit("Rejecting Corosync CFG provider because process %lld " - "is running as uid %lld gid %lld, not root", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__crit("Rejecting Corosync CFG provider because process %lld " + "is running as uid %lld gid %lld, not root", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); goto bail; } else if (rv < 0) { - crm_crit("Could not authenticate Corosync CFG provider: %s " - QB_XS " rc=%d", strerror(-rv), -rv); + pcmk__crit("Could not authenticate Corosync CFG provider: %s " + QB_XS " rc=%d", strerror(-rv), -rv); goto bail; } retries = 0; cs_repeat(retries, 30, rc = corosync_cfg_local_get(cfg_handle, &nodeid)); if (rc != CS_OK) { - crm_crit("Could not get local node ID from Corosync: %s " - QB_XS " rc=%d", cs_strerror(rc), rc); + pcmk__crit("Could not get local node ID from Corosync: %s " + QB_XS " rc=%d", cs_strerror(rc), rc); goto bail; } - crm_debug("Corosync reports local node ID is %lu", (unsigned long) nodeid); + pcmk__debug("Corosync reports local node ID is %" PRIu32, nodeid); #ifdef HAVE_COROSYNC_CFG_TRACKSTART retries = 0; cs_repeat(retries, 30, rc = corosync_cfg_trackstart(cfg_handle, 0)); if (rc != CS_OK) { - crm_crit("Could not enable Corosync CFG shutdown tracker: %s " QB_XS " rc=%d", - cs_strerror(rc), rc); + pcmk__crit("Could not enable Corosync CFG shutdown tracker: %s " + QB_XS " rc=%d", + cs_strerror(rc), rc); goto bail; } #endif @@ -210,17 +225,17 @@ pcmkd_shutdown_corosync(void) cs_error_t rc; if (cfg_handle == 0) { - crm_warn("Unable to shut down Corosync: No connection"); + pcmk__warn("Unable to shut down Corosync: No connection"); return; } - crm_info("Asking Corosync to shut down"); + pcmk__info("Asking Corosync to shut down"); rc = corosync_cfg_try_shutdown(cfg_handle, COROSYNC_CFG_SHUTDOWN_FLAG_IMMEDIATE); if (rc == CS_OK) { close_cfg(); } else { - crm_warn("Corosync shutdown failed: %s " QB_XS " rc=%d", - cs_strerror(rc), rc); + pcmk__warn("Corosync shutdown failed: %s " QB_XS " rc=%d", + cs_strerror(rc), rc); } } @@ -253,10 +268,11 @@ get_config_opt(uint64_t unused, cmap_handle_t object_handle, const char *key, ch cs_repeat(retries, 5, rc = cmap_get_string(object_handle, key, value)); if (rc != CS_OK) { - crm_trace("Search for %s failed %d, defaulting to %s", key, rc, fallback); + pcmk__trace("Search for %s failed %d, defaulting to %s", key, rc, + fallback); pcmk__str_update(value, fallback); } - crm_trace("%s: %s", key, *value); + pcmk__trace("%s: %s", key, *value); return rc; } @@ -280,8 +296,9 @@ pacemakerd_read_config(void) rc = pcmk__init_cmap(&local_handle); if (rc != CS_OK) { retries++; - crm_info("Could not connect to Corosync CMAP: %s (retrying in %ds) " - QB_XS " rc=%d", cs_strerror(rc), retries, rc); + pcmk__info("Could not connect to Corosync CMAP: %s (retrying in " + "%ds) " QB_XS " rc=%d", + cs_strerror(rc), retries, rc); sleep(retries); } else { @@ -291,15 +308,15 @@ pacemakerd_read_config(void) } while (retries < 5); if (rc != CS_OK) { - crm_crit("Could not connect to Corosync CMAP: %s " - QB_XS " rc=%d", cs_strerror(rc), rc); + pcmk__crit("Could not connect to Corosync CMAP: %s " + QB_XS " rc=%d", cs_strerror(rc), rc); return FALSE; } rc = cmap_fd_get(local_handle, &fd); if (rc != CS_OK) { - crm_crit("Could not get Corosync CMAP descriptor: %s " QB_XS " rc=%d", - cs_strerror(rc), rc); + pcmk__crit("Could not get Corosync CMAP descriptor: %s " QB_XS " rc=%d", + cs_strerror(rc), rc); cmap_finalize(local_handle); return FALSE; } @@ -307,15 +324,15 @@ pacemakerd_read_config(void) /* CMAP provider run as root (in given user namespace, anyway)? */ if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid, &found_uid, &found_gid))) { - crm_crit("Rejecting Corosync CMAP provider because process %lld " - "is running as uid %lld gid %lld, not root", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__crit("Rejecting Corosync CMAP provider because process %lld " + "is running as uid %lld gid %lld, not root", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); cmap_finalize(local_handle); return FALSE; } else if (rv < 0) { - crm_crit("Could not authenticate Corosync CMAP provider: %s " - QB_XS " rc=%d", strerror(-rv), -rv); + pcmk__crit("Could not authenticate Corosync CMAP provider: %s " + QB_XS " rc=%d", strerror(-rv), -rv); cmap_finalize(local_handle); return FALSE; } @@ -324,13 +341,13 @@ pacemakerd_read_config(void) cluster_layer_s = pcmk_cluster_layer_text(cluster_layer); if (cluster_layer != pcmk_cluster_layer_corosync) { - crm_crit("Expected Corosync cluster layer but detected %s " - QB_XS " cluster_layer=%d", - cluster_layer_s, cluster_layer); + pcmk__crit("Expected Corosync cluster layer but detected %s " + QB_XS " cluster_layer=%d", + cluster_layer_s, cluster_layer); return FALSE; } - crm_info("Reading configuration for %s cluster layer", cluster_layer_s); + pcmk__info("Reading configuration for %s cluster layer", cluster_layer_s); pcmk__set_env_option(PCMK__ENV_CLUSTER_TYPE, PCMK_VALUE_COROSYNC, true); // If debug logging is not configured, check whether corosync has it @@ -340,7 +357,7 @@ pacemakerd_read_config(void) get_config_opt(config, local_handle, "logging.debug", &debug_enabled, PCMK_VALUE_OFF); - if (crm_is_true(debug_enabled)) { + if (pcmk__is_true(debug_enabled)) { pcmk__set_env_option(PCMK__ENV_DEBUG, "1", true); if (get_crm_log_level() < LOG_DEBUG) { set_crm_log_level(LOG_DEBUG); @@ -355,17 +372,18 @@ pacemakerd_read_config(void) if(local_handle){ gid_t gid = 0; - if (pcmk_daemon_user(NULL, &gid) < 0) { - crm_warn("Could not authorize group with Corosync " QB_XS - " No group found for user %s", CRM_DAEMON_USER); + if (pcmk__daemon_user(NULL, &gid) != pcmk_rc_ok) { + pcmk__warn("Could not authorize group with Corosync " + QB_XS " No group found for user " CRM_DAEMON_USER); } else { char key[PATH_MAX]; snprintf(key, PATH_MAX, "uidgid.gid.%u", gid); rc = cmap_set_uint8(local_handle, key, 1); if (rc != CS_OK) { - crm_warn("Could not authorize group with Corosync: %s " QB_XS - " group=%u rc=%d", pcmk__cs_err_str(rc), gid, rc); + pcmk__warn("Could not authorize group with Corosync: %s " + QB_XS " group=%u rc=%d", + pcmk__cs_err_str(rc), gid, rc); } } } diff --git a/daemons/pacemakerd/pcmkd_messages.c b/daemons/pacemakerd/pcmkd_messages.c index 3069aab3c74..fa31e51b729 100644 --- a/daemons/pacemakerd/pcmkd_messages.c +++ b/daemons/pacemakerd/pcmkd_messages.c @@ -1,5 +1,5 @@ /* - * Copyright 2010-2024 the Pacemaker project contributors + * Copyright 2010-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -25,9 +25,9 @@ static GHashTable *pcmkd_handlers = NULL; static xmlNode * handle_node_cache_request(pcmk__request_t *request) { - crm_trace("Ignoring request from client %s to purge node " - "because peer cache is not used", - pcmk__client_name(request->ipc_client)); + pcmk__trace("Ignoring request from client %s to purge node because peer " + "cache is not used", + pcmk__client_name(request->ipc_client)); pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags, PCMK__XE_ACK, NULL, CRM_EX_OK); @@ -42,24 +42,23 @@ handle_ping_request(pcmk__request_t *request) const char *value = NULL; xmlNode *ping = NULL; xmlNode *reply = NULL; - const char *from = crm_element_value(msg, PCMK__XA_CRM_SYS_FROM); + const char *from = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_FROM); /* Pinged for status */ - crm_trace("Pinged from " PCMK__XA_CRM_SYS_FROM "='%s' " - PCMK_XA_ORIGIN "='%s'", - pcmk__s(from, ""), - pcmk__s(crm_element_value(msg, PCMK_XA_ORIGIN), "")); + pcmk__trace("Pinged from " PCMK__XA_CRM_SYS_FROM "='%s' " + PCMK_XA_ORIGIN "='%s'", + pcmk__s(from, ""), + pcmk__s(pcmk__xe_get(msg, PCMK_XA_ORIGIN), "")); pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags, PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE); ping = pcmk__xe_create(NULL, PCMK__XE_PING_RESPONSE); - value = crm_element_value(msg, PCMK__XA_CRM_SYS_TO); - crm_xml_add(ping, PCMK__XA_CRM_SUBSYSTEM, value); - crm_xml_add(ping, PCMK__XA_PACEMAKERD_STATE, pacemakerd_state); - crm_xml_add_ll(ping, PCMK_XA_CRM_TIMESTAMP, - (long long) subdaemon_check_progress); - crm_xml_add(ping, PCMK_XA_RESULT, "ok"); + value = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_TO); + pcmk__xe_set(ping, PCMK__XA_CRM_SUBSYSTEM, value); + pcmk__xe_set(ping, PCMK__XA_PACEMAKERD_STATE, pacemakerd_state); + pcmk__xe_set_time(ping, PCMK_XA_CRM_TIMESTAMP, subdaemon_check_progress); + pcmk__xe_set(ping, PCMK_XA_RESULT, "ok"); reply = pcmk__new_reply(msg, ping); pcmk__xml_free(ping); @@ -77,14 +76,14 @@ handle_ping_request(pcmk__request_t *request) if (pcmk__str_eq(pacemakerd_state, PCMK__VALUE_SHUTDOWN_COMPLETE, pcmk__str_none)) { if (pcmk__get_sbd_sync_resource_startup()) { - crm_notice("Shutdown-complete-state passed to SBD."); + pcmk__notice("Shutdown-complete-state passed to SBD"); } shutdown_complete_state_reported_to = request->ipc_client->pid; } else if (pcmk__str_eq(pacemakerd_state, PCMK__VALUE_WAIT_FOR_PING, pcmk__str_none)) { - crm_notice("Received startup-trigger from SBD."); + pcmk__notice("Received startup-trigger from SBD"); pacemakerd_state = PCMK__VALUE_STARTING_DAEMONS; mainloop_set_trigger(startup_trigger); } @@ -105,7 +104,8 @@ handle_shutdown_request(pcmk__request_t *request) * Pacemaker from the command line (or direct IPC), so that other users * are forced to go through the CIB and have ACLs applied. */ - bool allowed = pcmk_is_set(request->ipc_client->flags, pcmk__client_privileged); + bool allowed = pcmk__is_set(request->ipc_client->flags, + pcmk__client_privileged); pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags, PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE); @@ -113,14 +113,15 @@ handle_shutdown_request(pcmk__request_t *request) shutdown = pcmk__xe_create(NULL, PCMK__XE_SHUTDOWN); if (allowed) { - crm_notice("Shutting down in response to IPC request %s from %s", - crm_element_value(msg, PCMK_XA_REFERENCE), - crm_element_value(msg, PCMK_XA_ORIGIN)); - crm_xml_add_int(shutdown, PCMK__XA_OP_STATUS, CRM_EX_OK); + pcmk__notice("Shutting down in response to IPC request %s from %s", + pcmk__xe_get(msg, PCMK_XA_REFERENCE), + pcmk__xe_get(msg, PCMK_XA_ORIGIN)); + pcmk__xe_set_int(shutdown, PCMK__XA_OP_STATUS, CRM_EX_OK); } else { - crm_warn("Ignoring shutdown request from unprivileged client %s", - pcmk__client_name(request->ipc_client)); - crm_xml_add_int(shutdown, PCMK__XA_OP_STATUS, CRM_EX_INSUFFICIENT_PRIV); + pcmk__warn("Ignoring shutdown request from unprivileged client %s", + pcmk__client_name(request->ipc_client)); + pcmk__xe_set_int(shutdown, PCMK__XA_OP_STATUS, + CRM_EX_INSUFFICIENT_PRIV); } reply = pcmk__new_reply(msg, shutdown); @@ -169,7 +170,7 @@ pcmkd_register_handlers(void) static int32_t pcmk_ipc_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) { - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); if (pcmk__new_client(c, uid, gid) == NULL) { return -ENOMEM; } @@ -185,7 +186,7 @@ pcmk_ipc_closed(qb_ipcs_connection_t * c) if (client == NULL) { return 0; } - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); if (shutdown_complete_state_reported_to == client->pid) { shutdown_complete_state_reported_client_closed = TRUE; if (shutdown_trigger) { @@ -199,7 +200,7 @@ pcmk_ipc_closed(qb_ipcs_connection_t * c) static void pcmk_ipc_destroy(qb_ipcs_connection_t * c) { - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); pcmk_ipc_closed(c); } @@ -225,6 +226,7 @@ pcmk_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) } else { char *log_msg = NULL; + const char *exec_status_s = NULL; const char *reason = NULL; xmlNode *reply = NULL; @@ -238,7 +240,7 @@ pcmk_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) .result = PCMK__UNKNOWN_RESULT, }; - request.op = crm_element_value_copy(request.xml, PCMK__XA_CRM_TASK); + request.op = pcmk__xe_get_copy(request.xml, PCMK__XA_CRM_TASK); CRM_CHECK(request.op != NULL, return 0); reply = pcmk__process_request(&request, pcmkd_handlers); @@ -248,20 +250,23 @@ pcmk_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) pcmk__xml_free(reply); } + exec_status_s = pcmk_exec_status_str(request.result.execution_status); reason = request.result.exit_reason; - log_msg = crm_strdup_printf("Processed %s request from %s %s: %s%s%s%s", - request.op, pcmk__request_origin_type(&request), - pcmk__request_origin(&request), - pcmk_exec_status_str(request.result.execution_status), - (reason == NULL)? "" : " (", - (reason == NULL)? "" : reason, - (reason == NULL)? "" : ")"); + log_msg = pcmk__assert_asprintf("Processed %s request from %s %s: " + "%s%s%s%s", + request.op, + pcmk__request_origin_type(&request), + pcmk__request_origin(&request), + exec_status_s, + (reason == NULL)? "" : " (", + pcmk__s(reason, ""), + (reason == NULL)? "" : ")"); if (!pcmk__result_ok(&request.result)) { - crm_warn("%s", log_msg); + pcmk__warn("%s", log_msg); } else { - crm_debug("%s", log_msg); + pcmk__debug("%s", log_msg); } free(log_msg); diff --git a/daemons/pacemakerd/pcmkd_subdaemons.c b/daemons/pacemakerd/pcmkd_subdaemons.c index 715cd754dc4..4a2dc52a20e 100644 --- a/daemons/pacemakerd/pcmkd_subdaemons.c +++ b/daemons/pacemakerd/pcmkd_subdaemons.c @@ -1,5 +1,5 @@ /* - * Copyright 2010-2024 the Pacemaker project contributors + * Copyright 2010-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -36,14 +36,17 @@ enum child_daemon_flags { child_active_before_startup = 1 << 3, }; -typedef struct pcmk_child_s { +typedef struct { enum pcmk_ipc_server server; pid_t pid; int respawn_count; - const char *uid; + + //! Child runs as \c root if \c true, or as \c CRM_DAEMON_USER if \c false + bool as_root; + int check_count; uint32_t flags; -} pcmk_child_t; +} pcmkd_child_t; #define PCMK_PROCESS_CHECK_INTERVAL 1000 /* 1s */ #define PCMK_PROCESS_CHECK_RETRIES 5 @@ -52,31 +55,13 @@ typedef struct pcmk_child_s { /* Index into the array below */ #define PCMK_CHILD_CONTROLD 5 -static pcmk_child_t pcmk_children[] = { - { - pcmk_ipc_based, 0, 0, CRM_DAEMON_USER, - 0, child_respawn | child_needs_cluster - }, - { - pcmk_ipc_fenced, 0, 0, NULL, - 0, child_respawn | child_needs_cluster - }, - { - pcmk_ipc_execd, 0, 0, NULL, - 0, child_respawn - }, - { - pcmk_ipc_attrd, 0, 0, CRM_DAEMON_USER, - 0, child_respawn | child_needs_cluster - }, - { - pcmk_ipc_schedulerd, 0, 0, CRM_DAEMON_USER, - 0, child_respawn - }, - { - pcmk_ipc_controld, 0, 0, CRM_DAEMON_USER, - 0, child_respawn | child_needs_cluster - }, +static pcmkd_child_t pcmk_children[] = { + { pcmk_ipc_based, 0, 0, false, 0, child_respawn|child_needs_cluster }, + { pcmk_ipc_fenced, 0, 0, true, 0, child_respawn|child_needs_cluster }, + { pcmk_ipc_execd, 0, 0, true, 0, child_respawn }, + { pcmk_ipc_attrd, 0, 0, false, 0, child_respawn|child_needs_cluster }, + { pcmk_ipc_schedulerd, 0, 0, false, 0, child_respawn }, + { pcmk_ipc_controld, 0, 0, false, 0, child_respawn|child_needs_cluster }, }; static char *opts_default[] = { NULL, NULL }; @@ -110,13 +95,13 @@ GMainLoop *mainloop = NULL; static gboolean fatal_error = FALSE; -static int child_liveness(pcmk_child_t *child); +static int child_liveness(pcmkd_child_t *child); static gboolean escalate_shutdown(gpointer data); -static int start_child(pcmk_child_t * child); +static int start_child(pcmkd_child_t *child); static void pcmk_child_exit(mainloop_child_t * p, pid_t pid, int core, int signo, int exitcode); -static void pcmk_process_exit(pcmk_child_t * child); +static void pcmk_process_exit(pcmkd_child_t *child); static gboolean pcmk_shutdown_worker(gpointer user_data); -static gboolean stop_child(pcmk_child_t * child, int signal); +static gboolean stop_child(pcmkd_child_t *child, int signal); /*! * \internal @@ -128,10 +113,10 @@ static gboolean stop_child(pcmk_child_t * child, int signal); * \note It is the caller's responsibility to free() the return value */ static inline char * -subdaemon_path(pcmk_child_t *subdaemon) +subdaemon_path(pcmkd_child_t *subdaemon) { - return crm_strdup_printf(CRM_DAEMON_DIR "/%s", - pcmk__server_name(subdaemon->server)); + return pcmk__assert_asprintf(CRM_DAEMON_DIR "/%s", + pcmk__server_name(subdaemon->server)); } static bool @@ -149,13 +134,13 @@ check_next_subdaemon(gpointer user_data) { static int next_child = 0; - pcmk_child_t *child = &(pcmk_children[next_child]); + pcmkd_child_t *child = &(pcmk_children[next_child]); const char *name = pcmk__server_name(child->server); const long long pid = PCMK__SPECIAL_PID_AS_0(child->pid); int rc = child_liveness(child); - crm_trace("Checked subdaemon %s[%lld]: %s (%d)", - name, pid, pcmk_rc_str(rc), rc); + pcmk__trace("Checked subdaemon %s[%lld]: %s (%d)", name, pid, + pcmk_rc_str(rc), rc); switch (rc) { case pcmk_rc_ok: @@ -166,21 +151,21 @@ check_next_subdaemon(gpointer user_data) case pcmk_rc_ipc_pid_only: // Child was previously OK if (++(child->check_count) >= PCMK_PROCESS_CHECK_RETRIES) { // cts-lab looks for this message - crm_crit("Subdaemon %s[%lld] is unresponsive to IPC " - "after %d attempt%s and will now be killed", - name, pid, child->check_count, - pcmk__plural_s(child->check_count)); + pcmk__crit("Subdaemon %s[%lld] is unresponsive to IPC " + "after %d attempt%s and will now be killed", + name, pid, child->check_count, + pcmk__plural_s(child->check_count)); stop_child(child, SIGKILL); - if (pcmk_is_set(child->flags, child_respawn)) { + if (pcmk__is_set(child->flags, child_respawn)) { // Respawn limit hasn't been reached, so retry another round child->check_count = 0; } } else { - crm_notice("Subdaemon %s[%lld] is unresponsive to IPC " - "after %d attempt%s (will recheck later)", - name, pid, child->check_count, - pcmk__plural_s(child->check_count)); - if (pcmk_is_set(child->flags, child_respawn)) { + pcmk__notice("Subdaemon %s[%lld] is unresponsive to IPC after " + "%d attempt%s (will recheck later)", + name, pid, child->check_count, + pcmk__plural_s(child->check_count)); + if (pcmk__is_set(child->flags, child_respawn)) { /* as long as the respawn-limit isn't reached and we haven't run out of connect retries we account this as progress we are willing @@ -194,7 +179,7 @@ check_next_subdaemon(gpointer user_data) */ break; case pcmk_rc_ipc_unresponsive: - if (!pcmk_is_set(child->flags, child_respawn)) { + if (!pcmk__is_set(child->flags, child_respawn)) { /* if a subdaemon is down and we don't want it to be restarted this is a success during shutdown. if it isn't restarted anymore @@ -205,16 +190,16 @@ check_next_subdaemon(gpointer user_data) subdaemon_check_progress = time(NULL); } } - if (!pcmk_is_set(child->flags, child_active_before_startup)) { - crm_trace("Subdaemon %s[%lld] terminated", name, pid); + if (!pcmk__is_set(child->flags, child_active_before_startup)) { + pcmk__trace("Subdaemon %s[%lld] terminated", name, pid); break; } - if (pcmk_is_set(child->flags, child_respawn)) { + if (pcmk__is_set(child->flags, child_respawn)) { // cts-lab looks for this message - crm_err("Subdaemon %s[%lld] terminated", name, pid); + pcmk__err("Subdaemon %s[%lld] terminated", name, pid); } else { /* orderly shutdown */ - crm_notice("Subdaemon %s[%lld] terminated", name, pid); + pcmk__notice("Subdaemon %s[%lld] terminated", name, pid); } pcmk_process_exit(child); break; @@ -233,15 +218,15 @@ check_next_subdaemon(gpointer user_data) static gboolean escalate_shutdown(gpointer data) { - pcmk_child_t *child = data; + pcmkd_child_t *child = data; if (child->pid == PCMK__SPECIAL_PID) { pcmk_process_exit(child); } else if (child->pid != 0) { /* Use SIGSEGV instead of SIGKILL to create a core so we can see what it was up to */ - crm_err("Subdaemon %s not terminating in a timely manner, forcing", - pcmk__server_name(child->server)); + pcmk__err("Subdaemon %s not terminating in a timely manner, forcing", + pcmk__server_name(child->server)); stop_child(child, SIGSEGV); } return FALSE; @@ -250,7 +235,7 @@ escalate_shutdown(gpointer data) static void pcmk_child_exit(mainloop_child_t * p, pid_t pid, int core, int signo, int exitcode) { - pcmk_child_t *child = mainloop_child_userdata(p); + pcmkd_child_t *child = mainloop_child_userdata(p); const char *name = mainloop_child_name(p); if (signo) { @@ -263,13 +248,14 @@ pcmk_child_exit(mainloop_child_t * p, pid_t pid, int core, int signo, int exitco } else { switch(exitcode) { case CRM_EX_OK: - crm_info("%s[%d] exited with status %d (%s)", - name, pid, exitcode, crm_exit_str(exitcode)); + pcmk__info("%s[%d] exited with status %lld (%s)", name, + (long long) pid, exitcode, crm_exit_str(exitcode)); break; case CRM_EX_FATAL: - crm_warn("Shutting cluster down because %s[%d] had fatal failure", - name, pid); + pcmk__warn("Shutting cluster down because %s[%d] had fatal " + "failure", + name, pid); child->flags &= ~child_respawn; fatal_error = TRUE; pcmk_shutdown(SIGTERM); @@ -281,8 +267,9 @@ pcmk_child_exit(mainloop_child_t * p, pid_t pid, int core, int signo, int exitco child->flags &= ~child_respawn; fatal_error = TRUE; - msg = crm_strdup_printf("Subdaemon %s[%d] requested panic", - name, pid); + msg = pcmk__assert_asprintf("Subdaemon %s[%d] requested " + "panic", + name, pid); pcmk__panic(msg); // Should never get here @@ -293,8 +280,8 @@ pcmk_child_exit(mainloop_child_t * p, pid_t pid, int core, int signo, int exitco default: // cts-lab looks for this message - crm_err("%s[%d] exited with status %d (%s)", - name, pid, exitcode, crm_exit_str(exitcode)); + pcmk__err("%s[%d] exited with status %d (%s)", name, pid, + exitcode, crm_exit_str(exitcode)); break; } } @@ -303,7 +290,7 @@ pcmk_child_exit(mainloop_child_t * p, pid_t pid, int core, int signo, int exitco } static void -pcmk_process_exit(pcmk_child_t * child) +pcmk_process_exit(pcmkd_child_t * child) { const char *name = pcmk__server_name(child->server); child->pid = 0; @@ -312,7 +299,7 @@ pcmk_process_exit(pcmk_child_t * child) child->respawn_count += 1; if (child->respawn_count > MAX_RESPAWN) { - crm_err("Subdaemon %s exceeded maximum respawn count", name); + pcmk__err("Subdaemon %s exceeded maximum respawn count", name); child->flags &= ~child_respawn; } @@ -320,23 +307,24 @@ pcmk_process_exit(pcmk_child_t * child) /* resume step-wise shutdown (returned TRUE yields no parallelizing) */ mainloop_set_trigger(shutdown_trigger); - } else if (!pcmk_is_set(child->flags, child_respawn)) { + } else if (!pcmk__is_set(child->flags, child_respawn)) { /* nothing to do */ - } else if (crm_is_true(pcmk__env_option(PCMK__ENV_FAIL_FAST))) { + } else if (pcmk__is_true(pcmk__env_option(PCMK__ENV_FAIL_FAST))) { pcmk__panic("Subdaemon failed"); } else if (child_liveness(child) == pcmk_rc_ok) { - crm_warn("Not respawning subdaemon %s because IPC endpoint %s is OK", - name, pcmk__server_ipc_name(child->server)); + pcmk__warn("Not respawning subdaemon %s because IPC endpoint %s is OK", + name, pcmk__server_ipc_name(child->server)); - } else if (pcmk_is_set(child->flags, child_needs_cluster) && !pcmkd_cluster_connected()) { - crm_notice("Not respawning subdaemon %s until cluster returns", name); + } else if (pcmk__is_set(child->flags, child_needs_cluster) + && !pcmkd_cluster_connected()) { + pcmk__notice("Not respawning subdaemon %s until cluster returns", name); child->flags |= child_needs_retry; } else { // cts-lab looks for this message - crm_notice("Respawning subdaemon %s after unexpected exit", name); + pcmk__notice("Respawning subdaemon %s after unexpected exit", name); start_child(child); } } @@ -348,25 +336,25 @@ pcmk_shutdown_worker(gpointer user_data) static time_t next_log = 0; if (phase == PCMK__NELEM(pcmk_children) - 1) { - crm_notice("Shutting down Pacemaker"); + pcmk__notice("Shutting down Pacemaker"); pacemakerd_state = PCMK__VALUE_SHUTTING_DOWN; } for (; phase >= 0; phase--) { - pcmk_child_t *child = &(pcmk_children[phase]); + pcmkd_child_t *child = &(pcmk_children[phase]); const char *name = pcmk__server_name(child->server); if (child->pid != 0) { time_t now = time(NULL); - if (pcmk_is_set(child->flags, child_respawn)) { + if (pcmk__is_set(child->flags, child_respawn)) { if (child->pid == PCMK__SPECIAL_PID) { - crm_warn("Subdaemon %s cannot be terminated (shutdown " - "will be escalated after %ld seconds if it does " - "not terminate on its own; set PCMK_" - PCMK__ENV_FAIL_FAST "=1 to exit immediately " - "instead)", - name, (long) SHUTDOWN_ESCALATION_PERIOD); + pcmk__warn("Subdaemon %s cannot be terminated (shutdown " + "will be escalated after %ld seconds if it does " + "not terminate on its own; set PCMK_" + PCMK__ENV_FAIL_FAST "=1 to exit immediately " + "instead)", + name, (long) SHUTDOWN_ESCALATION_PERIOD); } next_log = now + 30; child->flags &= ~child_respawn; @@ -378,30 +366,31 @@ pcmk_shutdown_worker(gpointer user_data) } else if (now >= next_log) { next_log = now + 30; - crm_notice("Still waiting for subdaemon %s to terminate " - QB_XS " pid=%lld", name, (long long) child->pid); + pcmk__notice("Still waiting for subdaemon %s to terminate " + QB_XS " pid=%lld", + name, (long long) child->pid); } return TRUE; } /* cleanup */ - crm_debug("Subdaemon %s confirmed stopped", name); + pcmk__debug("Subdaemon %s confirmed stopped", name); child->pid = 0; } - crm_notice("Shutdown complete"); + pcmk__notice("Shutdown complete"); pacemakerd_state = PCMK__VALUE_SHUTDOWN_COMPLETE; if (!fatal_error && running_with_sbd && pcmk__get_sbd_sync_resource_startup() && !shutdown_complete_state_reported_client_closed) { - crm_notice("Waiting for SBD to pick up shutdown-complete-state."); + pcmk__notice("Waiting for SBD to pick up shutdown-complete-state."); return TRUE; } g_main_loop_quit(mainloop); if (fatal_error) { - crm_notice("Shutting down and staying down after fatal error"); + pcmk__notice("Shutting down and staying down after fatal error"); #if SUPPORT_COROSYNC pcmkd_shutdown_corosync(); #endif @@ -418,10 +407,12 @@ pcmk_shutdown_worker(gpointer user_data) room for races */ // \return Standard Pacemaker return code static int -start_child(pcmk_child_t * child) +start_child(pcmkd_child_t * child) { + const char *user = (child->as_root? "root" : CRM_DAEMON_USER); uid_t uid = 0; gid_t gid = 0; + gboolean use_valgrind = FALSE; gboolean use_callgrind = FALSE; const char *name = pcmk__server_name(child->server); @@ -431,7 +422,7 @@ start_child(pcmk_child_t * child) child->flags &= ~child_active_before_startup; child->check_count = 0; - if (env_callgrind != NULL && crm_is_true(env_callgrind)) { + if (pcmk__is_true(env_callgrind)) { use_callgrind = TRUE; use_valgrind = TRUE; @@ -440,7 +431,7 @@ start_child(pcmk_child_t * child) use_callgrind = TRUE; use_valgrind = TRUE; - } else if (env_valgrind != NULL && crm_is_true(env_valgrind)) { + } else if (pcmk__is_true(env_valgrind)) { use_valgrind = TRUE; } else if ((env_valgrind != NULL) @@ -449,101 +440,108 @@ start_child(pcmk_child_t * child) } if (use_valgrind && strlen(PCMK__VALGRIND_EXEC) == 0) { - crm_warn("Cannot enable valgrind for subdaemon %s: valgrind not found", - name); + pcmk__warn("Cannot enable valgrind for subdaemon %s: valgrind not " + "found", + name); use_valgrind = FALSE; } - if ((child->uid != NULL) && (crm_user_lookup(child->uid, &uid, &gid) < 0)) { - crm_err("Invalid user (%s) for subdaemon %s: not found", - child->uid, name); - return EACCES; + if (!child->as_root) { + int rc = pcmk__daemon_user(&uid, &gid); + + if (rc != pcmk_rc_ok) { + pcmk__err("User " CRM_DAEMON_USER " not found for subdaemon %s: %s", + name, pcmk_rc_str(rc)); + return rc; + } } child->pid = fork(); pcmk__assert(child->pid != -1); if (child->pid > 0) { - /* parent */ + // Parent + const char *valgrind_s = ""; + + if (use_valgrind) { + valgrind_s = " (valgrind enabled: " PCMK__VALGRIND_EXEC ")"; + } + mainloop_child_add(child->pid, 0, name, child, pcmk_child_exit); - if (use_valgrind) { - crm_info("Forked process %lld using user %lu (%s) and group %lu " - "for subdaemon %s (valgrind enabled: %s)", - (long long) child->pid, (unsigned long) uid, - pcmk__s(child->uid, "root"), (unsigned long) gid, name, - PCMK__VALGRIND_EXEC); - } else { - crm_info("Forked process %lld using user %lu (%s) and group %lu " - "for subdaemon %s", - (long long) child->pid, (unsigned long) uid, - pcmk__s(child->uid, "root"), (unsigned long) gid, name); - } + pcmk__info("Forked process %lld using user %lld (%s) and group %lld " + "for subdaemon %s%s", + (long long) child->pid, (long long) uid, user, + (long long) gid, name, valgrind_s); return pcmk_rc_ok; + } - } else { - /* Start a new session */ - (void)setsid(); - - /* Setup the two alternate arg arrays */ - opts_vgrind[0] = pcmk__str_copy(PCMK__VALGRIND_EXEC); - if (use_callgrind) { - opts_vgrind[1] = pcmk__str_copy("--tool=callgrind"); - opts_vgrind[2] = pcmk__str_copy("--callgrind-out-file=" - CRM_STATE_DIR "/callgrind.out.%p"); - opts_vgrind[3] = subdaemon_path(child); - opts_vgrind[4] = NULL; - } else { - opts_vgrind[1] = subdaemon_path(child); - opts_vgrind[2] = NULL; - opts_vgrind[3] = NULL; - opts_vgrind[4] = NULL; - } - opts_default[0] = subdaemon_path(child); + // Child - if(gid) { - // Drop root group access if not needed - if (!need_root_group && (setgid(gid) < 0)) { - crm_warn("Could not set subdaemon %s group to %lu: %s", - name, (unsigned long) gid, strerror(errno)); - } + // Start a new session + (void) setsid(); - /* Initialize supplementary groups to only those always granted to - * the user, plus haclient (so we can access IPC). - */ - if (initgroups(child->uid, gid) < 0) { - crm_err("Cannot initialize system groups for subdaemon %s: %s " - QB_XS " errno=%d", - name, pcmk_rc_str(errno), errno); - } + // Set up the two alternate argument arrays + opts_vgrind[0] = pcmk__str_copy(PCMK__VALGRIND_EXEC); + if (use_callgrind) { + opts_vgrind[1] = pcmk__str_copy("--tool=callgrind"); + opts_vgrind[2] = pcmk__str_copy("--callgrind-out-file=" + CRM_STATE_DIR "/callgrind.out.%p"); + opts_vgrind[3] = subdaemon_path(child); + opts_vgrind[4] = NULL; + } else { + opts_vgrind[1] = subdaemon_path(child); + opts_vgrind[2] = NULL; + opts_vgrind[3] = NULL; + opts_vgrind[4] = NULL; + } + opts_default[0] = subdaemon_path(child); + + if (gid != 0) { + // Drop root group access if not needed + if (!need_root_group && (setgid(gid) < 0)) { + pcmk__warn("Could not set subdaemon %s group to %lld: %s", name, + (long long) gid, strerror(errno)); } - if (uid && setuid(uid) < 0) { - crm_warn("Could not set subdaemon %s user to %s: %s " - QB_XS " uid=%lu errno=%d", - name, strerror(errno), child->uid, (unsigned long) uid, - errno); + /* Initialize supplementary groups to those where the user is a member, + * plus haclient (so we can access IPC). + * + * @TODO initgroups() is not portable (not part of any standard). + */ + if (initgroups(user, gid) < 0) { + pcmk__err("Cannot initialize system groups for subdaemon %s: %s " + QB_XS " errno=%d", + name, strerror(errno), errno); } + } - pcmk__close_fds_in_child(true); + if ((uid != 0) && (setuid(uid) < 0)) { + pcmk__warn("Could not set subdaemon %s user to %s: %s " + QB_XS " uid=%lld errno=%d", + name, strerror(errno), user, (long long) uid, errno); + } - pcmk__open_devnull(O_RDONLY); // stdin (fd 0) - pcmk__open_devnull(O_WRONLY); // stdout (fd 1) - pcmk__open_devnull(O_WRONLY); // stderr (fd 2) + pcmk__close_fds_in_child(true); - if (use_valgrind) { - (void)execvp(PCMK__VALGRIND_EXEC, opts_vgrind); - } else { - char *path = subdaemon_path(child); + pcmk__open_devnull(O_RDONLY); // stdin (fd 0) + pcmk__open_devnull(O_WRONLY); // stdout (fd 1) + pcmk__open_devnull(O_WRONLY); // stderr (fd 2) - (void) execvp(path, opts_default); - free(path); - } - crm_crit("Could not execute subdaemon %s: %s", name, strerror(errno)); - crm_exit(CRM_EX_FATAL); + if (use_valgrind) { + (void) execvp(PCMK__VALGRIND_EXEC, opts_vgrind); + + } else { + char *path = subdaemon_path(child); + + (void) execvp(path, opts_default); + free(path); } - return pcmk_rc_ok; /* never reached */ + + pcmk__crit("Could not execute subdaemon %s: %s", name, strerror(errno)); + crm_exit(CRM_EX_FATAL); + return pcmk_rc_ok; // Never reached } /*! @@ -565,7 +563,7 @@ start_child(pcmk_child_t * child) * a different authentic holder of the IPC end-point). */ static int -child_liveness(pcmk_child_t *child) +child_liveness(pcmkd_child_t *child) { uid_t cl_uid = 0; gid_t cl_gid = 0; @@ -574,97 +572,100 @@ child_liveness(pcmk_child_t *child) const uid_t *ref_uid; const gid_t *ref_gid; const char *name = pcmk__server_name(child->server); - int rc = pcmk_rc_ipc_unresponsive; - int legacy_rc = pcmk_ok; + const char *ipc_name = pcmk__server_ipc_name(child->server); + int rc = pcmk_rc_ok; pid_t ipc_pid = 0; - if (child->uid == NULL) { + if (child->as_root) { ref_uid = &root_uid; ref_gid = &root_gid; + } else { ref_uid = &cl_uid; ref_gid = &cl_gid; - legacy_rc = pcmk_daemon_user(&cl_uid, &cl_gid); + + rc = pcmk__daemon_user(&cl_uid, &cl_gid); + if (rc != pcmk_rc_ok) { + pcmk__err("Could not find user and group IDs for user " + CRM_DAEMON_USER ": %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); + return rc; + } } - if (legacy_rc < 0) { - rc = pcmk_legacy2rc(legacy_rc); - crm_err("Could not find user and group IDs for user %s: %s " - QB_XS " rc=%d", CRM_DAEMON_USER, pcmk_rc_str(rc), rc); - } else { - const char *ipc_name = pcmk__server_ipc_name(child->server); - - rc = pcmk__ipc_is_authentic_process_active(ipc_name, - *ref_uid, *ref_gid, - &ipc_pid); - if ((rc == pcmk_rc_ok) || (rc == pcmk_rc_ipc_unresponsive)) { - if (child->pid <= 0) { - /* If rc is pcmk_rc_ok, ipc_pid is nonzero and this - * initializes a new child. If rc is - * pcmk_rc_ipc_unresponsive, ipc_pid is zero, and we will - * investigate further. - */ - child->pid = ipc_pid; - } else if ((ipc_pid != 0) && (child->pid != ipc_pid)) { - /* An unexpected (but authorized) process is responding to - * IPC. Investigate further. - */ - rc = pcmk_rc_ipc_unresponsive; - } + rc = pcmk__ipc_is_authentic_process_active(ipc_name, *ref_uid, *ref_gid, + &ipc_pid); + if ((rc == pcmk_rc_ok) || (rc == pcmk_rc_ipc_unresponsive)) { + if (child->pid <= 0) { + /* If rc is pcmk_rc_ok, ipc_pid is nonzero and this initializes a + * new child. If rc is pcmk_rc_ipc_unresponsive, ipc_pid is zero, + * and we will investigate further. + */ + child->pid = ipc_pid; + + } else if ((ipc_pid != 0) && (child->pid != ipc_pid)) { + /* An unexpected (but authorized) process is responding to IPC. + * Investigate further. + */ + rc = pcmk_rc_ipc_unresponsive; } } - if (rc == pcmk_rc_ipc_unresponsive) { - /* If we get here, a child without IPC is being tracked, no IPC liveness - * has been detected, or IPC liveness has been detected with an - * unexpected (but authorized) process. This is safe on FreeBSD since - * the only change possible from a proper child's PID into "special" PID - * of 1 behind more loosely related process. + if (rc != pcmk_rc_ipc_unresponsive) { + return rc; + } + + /* If we get here, a child without IPC is being tracked, no IPC liveness has + * been detected, or IPC liveness has been detected with an unexpected (but + * authorized) process. This is safe on FreeBSD since the only change + * possible from a proper child's PID into "special" PID of 1 behind more + * loosely related process. + */ + rc = pcmk__pid_active(child->pid, name); + + if ((ipc_pid != 0) + && ((rc != pcmk_rc_ok) + || (ipc_pid == PCMK__SPECIAL_PID) + || (pcmk__pid_active(ipc_pid, name) == pcmk_rc_ok))) { + /* An unexpected (but authorized) process was detected at the IPC + * endpoint, and either it is active, or the child we're tracking is + * not. */ - int ret = pcmk__pid_active(child->pid, name); - - if (ipc_pid && ((ret != pcmk_rc_ok) - || ipc_pid == PCMK__SPECIAL_PID - || (pcmk__pid_active(ipc_pid, name) == pcmk_rc_ok))) { - /* An unexpected (but authorized) process was detected at the IPC - * endpoint, and either it is active, or the child we're tracking is - * not. + + if (rc == pcmk_rc_ok) { + /* The child we're tracking is active. Kill it, and adopt the + * detected process. This assumes that our children don't fork (thus + * getting a different PID owning the IPC), but rather the tracking + * got out of sync because of some means external to Pacemaker, and + * adopting the detected process is better than killing it and + * possibly having to spawn a new child. */ - if (ret == pcmk_rc_ok) { - /* The child we're tracking is active. Kill it, and adopt the - * detected process. This assumes that our children don't fork - * (thus getting a different PID owning the IPC), but rather the - * tracking got out of sync because of some means external to - * Pacemaker, and adopting the detected process is better than - * killing it and possibly having to spawn a new child. - */ - /* not possessing IPC, afterall (what about corosync CPG?) */ - stop_child(child, SIGKILL); - } - rc = pcmk_rc_ok; - child->pid = ipc_pid; - } else if (ret == pcmk_rc_ok) { - // Our tracked child's PID was found active, but not its IPC - rc = pcmk_rc_ipc_pid_only; - } else if ((child->pid == 0) && (ret == EINVAL)) { - // FreeBSD can return EINVAL - rc = pcmk_rc_ipc_unresponsive; - } else { - switch (ret) { - case EACCES: - rc = pcmk_rc_ipc_unauthorized; - break; - case ESRCH: - rc = pcmk_rc_ipc_unresponsive; - break; - default: - rc = ret; - break; - } + // Not possessing IPC, after all (what about corosync CPG?) + stop_child(child, SIGKILL); } + child->pid = ipc_pid; + return pcmk_rc_ok; + } + + if (rc == pcmk_rc_ok) { + // Our tracked child's PID was found active, but not its IPC + return pcmk_rc_ipc_pid_only; + } + + if ((child->pid == 0) && (rc == EINVAL)) { + // FreeBSD can return EINVAL + return pcmk_rc_ipc_unresponsive; + } + + switch (rc) { + case EACCES: + return pcmk_rc_ipc_unauthorized; + case ESRCH: + return pcmk_rc_ipc_unresponsive; + default: + return rc; } - return rc; } /*! @@ -707,6 +708,8 @@ find_and_track_existing_processes(void) for (i = 0; i < PCMK__NELEM(pcmk_children); i++) { const char *name = pcmk__server_name(pcmk_children[i].server); const char *ipc_name = NULL; + const long long child_pid = + (long long) PCMK__SPECIAL_PID_AS_0(pcmk_children[i].pid); if (pcmk_children[i].respawn_count < 0) { continue; @@ -727,68 +730,70 @@ find_and_track_existing_processes(void) switch (rc) { case pcmk_rc_ok: if (pcmk_children[i].pid == PCMK__SPECIAL_PID) { - if (crm_is_true(pcmk__env_option(PCMK__ENV_FAIL_FAST))) { - crm_crit("Cannot reliably track pre-existing" - " authentic process behind %s IPC on this" - " platform and PCMK_" PCMK__ENV_FAIL_FAST - " requested", ipc_name); + const char *fail_fast = + pcmk__env_option(PCMK__ENV_FAIL_FAST); + + if (pcmk__is_true(fail_fast)) { + pcmk__crit("Cannot reliably track pre-existing " + "authentic process behind %s IPC on " + "this platform and " + "PCMK_" PCMK__ENV_FAIL_FAST " requested", + ipc_name); return EOPNOTSUPP; } else if (pcmk_children[i].respawn_count == WAIT_TRIES) { - crm_notice("Assuming pre-existing authentic, though" - " on this platform untrackable, process" - " behind %s IPC is stable (was in %d" - " previous samples) so rather than" - " bailing out (PCMK_" PCMK__ENV_FAIL_FAST - " not requested), we just switch to a" - " less optimal IPC liveness monitoring" - " (not very suitable for heavy load)", - name, WAIT_TRIES - 1); - crm_warn("The process behind %s IPC cannot be" - " terminated, so the overall shutdown" - " will get delayed implicitly (%ld s)," - " which serves as a graceful period for" - " its native termination if it vitally" - " depends on some other daemons going" - " down in a controlled way already", - name, (long) SHUTDOWN_ESCALATION_PERIOD); + pcmk__notice("Assuming pre-existing authentic, " + "though on this platform untrackable, " + "process behind %s IPC is stable (was " + "in %d previous samples) so rather " + "than bailing out (PCMK_" + PCMK__ENV_FAIL_FAST " not requested), " + "we just switch to a less optimal IPC " + "liveness monitoring (not very " + "suitable for heavy load)", + name, (WAIT_TRIES - 1)); + pcmk__warn("The process behind %s IPC cannot be" + " terminated, so the overall shutdown" + " will get delayed implicitly (%ld s)," + " which serves as a graceful period for" + " its native termination if it vitally" + " depends on some other daemons going" + " down in a controlled way already", + name, (long) SHUTDOWN_ESCALATION_PERIOD); } else { + const int remaining = + (WAIT_TRIES - pcmk_children[i].respawn_count); + wait_in_progress = true; - crm_warn("Cannot reliably track pre-existing" - " authentic process behind %s IPC on this" - " platform, can still disappear in %d" - " attempt(s)", ipc_name, - WAIT_TRIES - pcmk_children[i].respawn_count); + pcmk__warn("Cannot reliably track pre-existing" + " authentic process behind %s IPC on" + " this platform, can still disappear in" + " %d attempt(s)", + ipc_name, remaining); continue; } } - crm_notice("Tracking existing %s process (pid=%lld)", - name, - (long long) PCMK__SPECIAL_PID_AS_0( - pcmk_children[i].pid)); + pcmk__notice("Tracking existing %s process (pid=%lld)", + name, child_pid); pcmk_children[i].respawn_count = -1; /* 0~keep watching */ pcmk_children[i].flags |= child_active_before_startup; break; case pcmk_rc_ipc_pid_only: if (pcmk_children[i].respawn_count == WAIT_TRIES) { - crm_crit("%s IPC endpoint for existing authentic" - " process %lld did not (re)appear", - ipc_name, - (long long) PCMK__SPECIAL_PID_AS_0( - pcmk_children[i].pid)); + pcmk__crit("%s IPC endpoint for existing authentic" + " process %lld did not (re)appear", + ipc_name, child_pid); return rc; } wait_in_progress = true; - crm_warn("Cannot find %s IPC endpoint for existing" - " authentic process %lld, can still (re)appear" - " in %d attempts (?)", - ipc_name, - (long long) PCMK__SPECIAL_PID_AS_0( - pcmk_children[i].pid), - WAIT_TRIES - pcmk_children[i].respawn_count); + pcmk__warn("Cannot find %s IPC endpoint for existing" + " authentic process %lld, can still (re)appear" + " in %d attempts (?)", + ipc_name, child_pid, + (WAIT_TRIES - pcmk_children[i].respawn_count)); continue; default: - crm_crit("Checked liveness of %s: %s " QB_XS " rc=%d", - name, pcmk_rc_str(rc), rc); + pcmk__crit("Checked liveness of %s: %s " QB_XS " rc=%d", + name, pcmk_rc_str(rc), rc); return rc; } } @@ -850,12 +855,13 @@ void restart_cluster_subdaemons(void) { for (int i = 0; i < PCMK__NELEM(pcmk_children); i++) { - if (!pcmk_is_set(pcmk_children[i].flags, child_needs_retry) || pcmk_children[i].pid != 0) { + if (!pcmk__is_set(pcmk_children[i].flags, child_needs_retry) + || (pcmk_children[i].pid != 0)) { continue; } - crm_notice("Respawning cluster-based subdaemon %s", - pcmk__server_name(pcmk_children[i].server)); + pcmk__notice("Respawning cluster-based subdaemon %s", + pcmk__server_name(pcmk_children[i].server)); if (start_child(&pcmk_children[i])) { pcmk_children[i].flags &= ~child_needs_retry; } @@ -863,7 +869,7 @@ restart_cluster_subdaemons(void) } static gboolean -stop_child(pcmk_child_t * child, int signal) +stop_child(pcmkd_child_t *child, int signal) { const char *name = pcmk__server_name(child->server); @@ -876,24 +882,24 @@ stop_child(pcmk_child_t * child, int signal) - elsewhere: how "init" task is designated; in particular, in systemd arrangement of socket-based activation, this is pretty real */ if (child->pid == PCMK__SPECIAL_PID) { - crm_debug("Nothing to do to stop subdaemon %s[%lld]", - name, (long long) PCMK__SPECIAL_PID_AS_0(child->pid)); + pcmk__debug("Nothing to do to stop subdaemon %s[%lld]", name, + (long long) PCMK__SPECIAL_PID_AS_0(child->pid)); return TRUE; } if (child->pid <= 0) { - crm_trace("Nothing to do to stop subdaemon %s: Not running", name); + pcmk__trace("Nothing to do to stop subdaemon %s: Not running", name); return TRUE; } errno = 0; if (kill(child->pid, signal) == 0) { - crm_notice("Stopping subdaemon %s " - QB_XS " via signal %d to process %lld", - name, signal, (long long) child->pid); + pcmk__notice("Stopping subdaemon %s " + QB_XS " via signal %d to process %lld", + name, signal, (long long) child->pid); } else { - crm_err("Could not stop subdaemon %s[%lld] with signal %d: %s", - name, (long long) child->pid, signal, strerror(errno)); + pcmk__err("Could not stop subdaemon %s[%lld] with signal %d: %s", + name, (long long) child->pid, signal, strerror(errno)); } return TRUE; diff --git a/daemons/schedulerd/pacemaker-schedulerd.c b/daemons/schedulerd/pacemaker-schedulerd.c index f7ddc9c128f..133e3d7f0d5 100644 --- a/daemons/schedulerd/pacemaker-schedulerd.c +++ b/daemons/schedulerd/pacemaker-schedulerd.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -136,10 +136,11 @@ main(int argc, char **argv) pcmk__cli_init_logging(PCMK__SERVER_SCHEDULERD, args->verbosity); crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE); - crm_notice("Starting Pacemaker scheduler"); + pcmk__notice("Starting Pacemaker scheduler"); if (pcmk__daemon_can_write(PCMK_SCHEDULER_INPUT_DIR, NULL) == FALSE) { - crm_err("Terminating due to bad permissions on " PCMK_SCHEDULER_INPUT_DIR); + pcmk__err("Terminating due to bad permissions on " + PCMK_SCHEDULER_INPUT_DIR); exit_code = CRM_EX_FATAL; g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "ERROR: Bad permissions on %s (see logs for details)", @@ -162,11 +163,12 @@ main(int argc, char **argv) } pe__register_messages(logger_out); pcmk__register_lib_messages(logger_out); - pcmk__output_set_log_level(logger_out, LOG_TRACE); + pcmk__output_set_log_level(logger_out, PCMK__LOG_TRACE); /* Create the mainloop and run it... */ mainloop = g_main_loop_new(NULL, FALSE); - crm_notice("Pacemaker scheduler successfully started and accepting connections"); + pcmk__notice("Pacemaker scheduler successfully started and accepting " + "connections"); g_main_loop_run(mainloop); done: @@ -182,7 +184,7 @@ void pengine_shutdown(int nsig) { if (ipcs != NULL) { - crm_trace("Closing IPC server"); + pcmk__trace("Closing IPC server"); mainloop_del_ipc_server(ipcs); ipcs = NULL; } diff --git a/daemons/schedulerd/schedulerd_messages.c b/daemons/schedulerd/schedulerd_messages.c index 719473d4829..af19ed189ae 100644 --- a/daemons/schedulerd/schedulerd_messages.c +++ b/daemons/schedulerd/schedulerd_messages.c @@ -76,8 +76,8 @@ handle_pecalc_request(pcmk__request_t *request) if (pcmk__update_configured_schema(&converted, true) != pcmk_rc_ok) { scheduler->priv->graph = pcmk__xe_create(NULL, PCMK__XE_TRANSITION_GRAPH); - crm_xml_add_int(scheduler->priv->graph, "transition_id", 0); - crm_xml_add_int(scheduler->priv->graph, PCMK_OPT_CLUSTER_DELAY, 0); + pcmk__xe_set_int(scheduler->priv->graph, "transition_id", 0); + pcmk__xe_set_int(scheduler->priv->graph, PCMK_OPT_CLUSTER_DELAY, 0); process = false; free(digest); @@ -102,10 +102,10 @@ handle_pecalc_request(pcmk__request_t *request) } // Get appropriate index into series[] array - if (pcmk_is_set(scheduler->flags, pcmk__sched_processing_error) + if (pcmk__is_set(scheduler->flags, pcmk__sched_processing_error) || pcmk__config_has_error) { series_id = 0; - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_processing_warning) + } else if (pcmk__is_set(scheduler->flags, pcmk__sched_processing_warning) || pcmk__config_has_warning) { series_id = 1; } else { @@ -124,8 +124,8 @@ handle_pecalc_request(pcmk__request_t *request) // @TODO maybe handle errors better ... seq = 0U; } - crm_trace("Series %s: wrap=%d, seq=%u, pref=%s", - series[series_id].name, series_wrap, seq, value); + pcmk__trace("Series %s: wrap=%d, seq=%u, pref=%s", series[series_id].name, + series_wrap, seq, value); reply = pcmk__new_reply(msg, scheduler->priv->graph); @@ -146,20 +146,19 @@ handle_pecalc_request(pcmk__request_t *request) series[series_id].name, seq, true); } - crm_xml_add(reply, PCMK__XA_CRM_TGRAPH_IN, filename); + pcmk__xe_set(reply, PCMK__XA_CRM_TGRAPH_IN, filename); pcmk__log_transition_summary(scheduler, filename); if (series_wrap == 0) { - crm_debug("Not saving input to disk (disabled by configuration)"); + pcmk__debug("Not saving input to disk (disabled by configuration)"); } else if (is_repoke) { - crm_info("Input has not changed since last time, not saving to disk"); + pcmk__info("Input has not changed since last time, not saving to disk"); } else { unlink(filename); - crm_xml_add_ll(xml_data, PCMK_XA_EXECUTION_DATE, - (long long) execution_date); + pcmk__xe_set_time(xml_data, PCMK_XA_EXECUTION_DATE, execution_date); pcmk__xml_write_file(xml_data, filename, true); pcmk__write_series_sequence(PCMK_SCHEDULER_INPUT_DIR, series[series_id].name, ++seq, series_wrap); @@ -192,7 +191,8 @@ handle_hello_request(pcmk__request_t *request) pcmk__ipc_send_ack(request->ipc_client, request->ipc_id, request->ipc_flags, PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE); - crm_trace("Received IPC hello from %s", pcmk__client_name(request->ipc_client)); + pcmk__trace("Received IPC hello from %s", + pcmk__client_name(request->ipc_client)); pcmk__set_result(&request->result, CRM_EX_OK, PCMK_EXEC_DONE, NULL); return NULL; @@ -213,7 +213,7 @@ schedulerd_register_handlers(void) static int32_t pe_ipc_accept(qb_ipcs_connection_t * c, uid_t uid, gid_t gid) { - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); if (pcmk__new_client(c, uid, gid) == NULL) { return -ENOMEM; } @@ -241,22 +241,24 @@ pe_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) return 0; } - sys_to = crm_element_value(msg, PCMK__XA_CRM_SYS_TO); + sys_to = pcmk__xe_get(msg, PCMK__XA_CRM_SYS_TO); - if (pcmk__str_eq(crm_element_value(msg, PCMK__XA_SUBT), - PCMK__VALUE_RESPONSE, pcmk__str_none)) { + if (pcmk__str_eq(pcmk__xe_get(msg, PCMK__XA_SUBT), PCMK__VALUE_RESPONSE, + pcmk__str_none)) { pcmk__ipc_send_ack(c, id, flags, PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE); - crm_info("Ignoring IPC reply from %s", pcmk__client_name(c)); + pcmk__info("Ignoring IPC reply from %s", pcmk__client_name(c)); } else if (!pcmk__str_eq(sys_to, CRM_SYSTEM_PENGINE, pcmk__str_none)) { pcmk__ipc_send_ack(c, id, flags, PCMK__XE_ACK, NULL, CRM_EX_INDETERMINATE); - crm_info("Ignoring invalid IPC message: to '%s' not " - CRM_SYSTEM_PENGINE, pcmk__s(sys_to, "")); + pcmk__info("Ignoring invalid IPC message: to '%s' not " + CRM_SYSTEM_PENGINE, + pcmk__s(sys_to, "")); } else { char *log_msg = NULL; + const char *exec_status_s = NULL; const char *reason = NULL; xmlNode *reply = NULL; @@ -270,7 +272,7 @@ pe_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) .result = PCMK__UNKNOWN_RESULT, }; - request.op = crm_element_value_copy(request.xml, PCMK__XA_CRM_TASK); + request.op = pcmk__xe_get_copy(request.xml, PCMK__XA_CRM_TASK); CRM_CHECK(request.op != NULL, return 0); reply = pcmk__process_request(&request, schedulerd_handlers); @@ -280,20 +282,23 @@ pe_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size) pcmk__xml_free(reply); } + exec_status_s = pcmk_exec_status_str(request.result.execution_status); reason = request.result.exit_reason; - log_msg = crm_strdup_printf("Processed %s request from %s %s: %s%s%s%s", - request.op, pcmk__request_origin_type(&request), - pcmk__request_origin(&request), - pcmk_exec_status_str(request.result.execution_status), - (reason == NULL)? "" : " (", - (reason == NULL)? "" : reason, - (reason == NULL)? "" : ")"); + log_msg = pcmk__assert_asprintf("Processed %s request from %s %s: " + "%s%s%s%s", + request.op, + pcmk__request_origin_type(&request), + pcmk__request_origin(&request), + exec_status_s, + (reason == NULL)? "" : " (", + pcmk__s(reason, ""), + (reason == NULL)? "" : ")"); if (!pcmk__result_ok(&request.result)) { - crm_warn("%s", log_msg); + pcmk__warn("%s", log_msg); } else { - crm_debug("%s", log_msg); + pcmk__debug("%s", log_msg); } free(log_msg); @@ -313,7 +318,7 @@ pe_ipc_closed(qb_ipcs_connection_t * c) if (client == NULL) { return 0; } - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); pcmk__free_client(client); return 0; } @@ -321,7 +326,7 @@ pe_ipc_closed(qb_ipcs_connection_t * c) static void pe_ipc_destroy(qb_ipcs_connection_t * c) { - crm_trace("Connection %p", c); + pcmk__trace("Connection %p", c); pe_ipc_closed(c); } diff --git a/devel/scratch.c b/devel/scratch.c index 5a8977fdb18..d2070213b45 100644 --- a/devel/scratch.c +++ b/devel/scratch.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -31,7 +31,7 @@ main(int argc, char **argv) xmlNode *top = NULL; const char *xml_file = NULL; - crm_log_init(NULL, LOG_TRACE, FALSE, TRUE, argc, argv, FALSE); + crm_log_init(NULL, PCMK__LOG_TRACE, FALSE, TRUE, argc, argv, FALSE); while (1) { flag = getopt(argc, argv, OPTARGS); if (flag == -1) diff --git a/include/crm/cib.h b/include/crm/cib.h index 8fcc257d08c..e2c44764a00 100644 --- a/include/crm/cib.h +++ b/include/crm/cib.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -26,7 +26,7 @@ extern "C" { * \ingroup cib */ -// Use compare_version() for doing comparisons +// Use pcmk__compare_versions() for doing comparisons # define CIB_FEATURE_SET "2.0" /* Core functions */ diff --git a/include/crm/cib/internal.h b/include/crm/cib/internal.h index c06d8414b62..74816564d7b 100644 --- a/include/crm/cib/internal.h +++ b/include/crm/cib/internal.h @@ -12,6 +12,7 @@ #include #include +#include // PCMK__LOG_TRACE #include #include #include @@ -122,14 +123,17 @@ struct timer_rec_s { #define cib__set_call_options(cib_call_opts, call_for, flags_to_set) do { \ cib_call_opts = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "CIB call", (call_for), (cib_call_opts), \ - (flags_to_set), #flags_to_set); \ + PCMK__LOG_TRACE, "CIB call", \ + (call_for), (cib_call_opts), \ + (flags_to_set), #flags_to_set); \ } while (0) #define cib__clear_call_options(cib_call_opts, call_for, flags_to_clear) do { \ cib_call_opts = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "CIB call", (call_for), (cib_call_opts), \ - (flags_to_clear), #flags_to_clear); \ + PCMK__LOG_TRACE, "CIB call", \ + (call_for), (cib_call_opts), \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) cib_t *cib_new_variant(void); diff --git a/include/crm/common/Makefile.am b/include/crm/common/Makefile.am index 7b9a676ffac..6b5829c211a 100644 --- a/include/crm/common/Makefile.am +++ b/include/crm/common/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2004-2024 the Pacemaker project contributors +# Copyright 2004-2025 the Pacemaker project contributors # # The version control history for this file may have further details. # @@ -12,6 +12,7 @@ include $(top_srcdir)/mk/common.mk headerdir=$(pkgincludedir)/crm/common header_HEADERS = acl.h \ + acl_compat.h \ actions.h \ agents.h \ cib.h \ @@ -41,6 +42,7 @@ header_HEADERS = acl.h \ scores.h \ scores_compat.h \ strings.h \ + strings_compat.h \ util.h \ util_compat.h \ xml.h \ @@ -48,6 +50,7 @@ header_HEADERS = acl.h \ xml_element.h \ xml_element_compat.h \ xml_io.h \ + xml_io_compat.h \ xml_names.h noinst_HEADERS = $(wildcard *internal.h) diff --git a/include/crm/common/acl.h b/include/crm/common/acl.h index f8f4b688d40..0933a4554c6 100644 --- a/include/crm/common/acl.h +++ b/include/crm/common/acl.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -23,7 +23,6 @@ extern "C" { * \ingroup core */ -bool xml_acl_enabled(const xmlNode *xml); void xml_acl_disable(xmlNode *xml); bool xml_acl_denied(const xmlNode *xml); bool xml_acl_filtered_copy(const char *user, xmlNode* acl_source, xmlNode *xml, @@ -31,6 +30,10 @@ bool xml_acl_filtered_copy(const char *user, xmlNode* acl_source, xmlNode *xml, bool pcmk_acl_required(const char *user); +#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) +#include +#endif // !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) + #ifdef __cplusplus } #endif diff --git a/include/crm/common/acl_compat.h b/include/crm/common/acl_compat.h new file mode 100644 index 00000000000..fd67613ab70 --- /dev/null +++ b/include/crm/common/acl_compat.h @@ -0,0 +1,37 @@ +/* + * Copyright 2004-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU Lesser General Public License + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + */ + +#ifndef PCMK__CRM_COMMON_ACL_COMPAT__H +#define PCMK__CRM_COMMON_ACL_COMPAT__H + +#include + +#include // xmlNode + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file + * \brief Deprecated Pacemaker ACL API + * \ingroup core + * \deprecated Do not include this header directly. The XML APIs in this + * header, and the header itself, will be removed in a future + * release. + */ + +//! \deprecated Do not use +bool xml_acl_enabled(const xmlNode *xml); + +#ifdef __cplusplus +} +#endif + +#endif // PCMK__CRM_COMMON_ACL_COMPAT__H diff --git a/include/crm/common/acl_internal.h b/include/crm/common/acl_internal.h index a65be93c587..38d7f21e959 100644 --- a/include/crm/common/acl_internal.h +++ b/include/crm/common/acl_internal.h @@ -13,7 +13,7 @@ #include // strcmp() #include // xmlNode -#include // enum xml_private_flags +#include // enum pcmk__xml_flags #ifdef __cplusplus extern "C" { @@ -34,7 +34,7 @@ pcmk__is_privileged(const char *user) void pcmk__enable_acl(xmlNode *acl_source, xmlNode *target, const char *user); bool pcmk__check_acl(xmlNode *xml, const char *attr_name, - enum xml_private_flags mode); + enum pcmk__xml_flags mode); #ifdef __cplusplus } diff --git a/include/crm/common/action_relation_internal.h b/include/crm/common/action_relation_internal.h index 895bf29eca5..a1c44e164eb 100644 --- a/include/crm/common/action_relation_internal.h +++ b/include/crm/common/action_relation_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the Pacemaker project contributors + * Copyright 2023-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,7 +12,10 @@ #include // bool #include // uint32_t + #include // gpointer + +#include // PCMK__LOG_TRACE #include // pcmk_resource_t, pcmk_action_t #ifdef __cplusplus @@ -161,11 +164,11 @@ typedef struct pcmk__related_action { * \param[in,out] ar_flags Flag group to modify * \param[in] flags_to_set enum pcmk__action_relation_flags to set */ -#define pcmk__set_relation_flags(ar_flags, flags_to_set) do { \ - ar_flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Action relation", "constraint", \ - ar_flags, (flags_to_set), \ - #flags_to_set); \ +#define pcmk__set_relation_flags(ar_flags, flags_to_set) do { \ + ar_flags = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, \ + "Action relation", "constraint", \ + ar_flags, (flags_to_set), \ + #flags_to_set); \ } while (0) /*! @@ -176,10 +179,10 @@ typedef struct pcmk__related_action { * \param[in] flags_to_clear enum pcmk__action_relation_flags to clear */ #define pcmk__clear_relation_flags(ar_flags, flags_to_clear) do { \ - ar_flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Action relation", "constraint", \ - ar_flags, (flags_to_clear), \ - #flags_to_clear); \ + ar_flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Action relation", \ + "constraint", ar_flags, \ + (flags_to_clear), #flags_to_clear); \ } while (0) void pcmk__free_action_relation(gpointer user_data); diff --git a/include/crm/common/actions.h b/include/crm/common/actions.h index 63e2eac6aa5..7c457656865 100644 --- a/include/crm/common/actions.h +++ b/include/crm/common/actions.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,7 +11,6 @@ #define PCMK__CRM_COMMON_ACTIONS__H #include // bool -#include // strcasecmp() #include // gboolean, guint #include // xmlNode diff --git a/include/crm/common/actions_internal.h b/include/crm/common/actions_internal.h index ccecdff863b..a12b1c1f390 100644 --- a/include/crm/common/actions_internal.h +++ b/include/crm/common/actions_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -16,12 +16,11 @@ #include // xmlNode #include // PCMK_ACTION_MONITOR +#include // PCMK__LOG_TRACE #include // enum rsc_role_e #include // pcmk_resource_t, pcmk_node_t #include // pcmk__str_eq() -#include // pcmk__str_any_of() - #ifdef __cplusplus extern "C" { #endif @@ -38,7 +37,7 @@ extern "C" { */ #define pcmk__set_action_flags(action, flags_to_set) do { \ (action)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ + PCMK__LOG_TRACE, \ "Action", (action)->uuid, \ (action)->flags, \ (flags_to_set), \ @@ -54,7 +53,7 @@ extern "C" { */ #define pcmk__clear_action_flags(action, flags_to_clear) do { \ (action)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ + PCMK__LOG_TRACE, \ "Action", (action)->uuid, \ (action)->flags, \ (flags_to_clear), \ @@ -71,8 +70,8 @@ extern "C" { */ #define pcmk__set_raw_action_flags(action_flags, action_name, to_set) do { \ action_flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Action", action_name, \ - (action_flags), \ + PCMK__LOG_TRACE, "Action", \ + action_name, (action_flags), \ (to_set), #to_set); \ } while (0) @@ -86,9 +85,9 @@ extern "C" { */ #define pcmk__clear_raw_action_flags(action_flags, action_name, to_clear) \ do { \ - action_flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Action", action_name, \ - (action_flags), \ + action_flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Action", \ + action_name, (action_flags), \ (to_clear), #to_clear); \ } while (0) diff --git a/include/crm/common/attrs_internal.h b/include/crm/common/attrs_internal.h index ef533153f4b..13bc3c63883 100644 --- a/include/crm/common/attrs_internal.h +++ b/include/crm/common/attrs_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,7 +11,7 @@ #define PCMK__CRM_COMMON_ATTRS_INTERNAL__H #include // crm_system_name -#include // LOG_TRACE +#include // PCMK__LOG_TRACE #include // pcmk_node_t #include // enum pcmk__rsc_node @@ -36,14 +36,22 @@ enum pcmk__node_attr_opts { #define pcmk__set_node_attr_flags(node_attr_flags, flags_to_set) do { \ node_attr_flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Node attribute", crm_system_name, \ - (node_attr_flags), (flags_to_set), #flags_to_set); \ + PCMK__LOG_TRACE, \ + "Node attribute", \ + crm_system_name, \ + (node_attr_flags), \ + (flags_to_set), \ + #flags_to_set); \ } while (0) #define pcmk__clear_node_attr_flags(node_attr_flags, flags_to_clear) do { \ node_attr_flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Node attribute", crm_system_name, \ - (node_attr_flags), (flags_to_clear), #flags_to_clear); \ + PCMK__LOG_TRACE, \ + "Node attribute", \ + crm_system_name, \ + (node_attr_flags), \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) const char *pcmk__node_attr_target(const char *name); diff --git a/include/crm/common/clone_internal.h b/include/crm/common/clone_internal.h index 4dd6bb927ce..e2157fc917c 100644 --- a/include/crm/common/clone_internal.h +++ b/include/crm/common/clone_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,10 +12,11 @@ #include // NULL #include // bool + +#include // pcmk__is_set() #include // pcmk_resource_t #include // pcmk_rsc_unique, #include // pcmk__rsc_variant_clone etc. -#include // pcmk_is_set #ifdef __cplusplus extern "C" { @@ -60,7 +61,7 @@ pcmk__is_clone(const pcmk_resource_t *rsc) static inline bool pcmk__is_unique_clone(const pcmk_resource_t *rsc) { - return pcmk__is_clone(rsc) && pcmk_is_set(rsc->flags, pcmk__rsc_unique); + return pcmk__is_clone(rsc) && pcmk__is_set(rsc->flags, pcmk__rsc_unique); } /*! @@ -74,7 +75,7 @@ pcmk__is_unique_clone(const pcmk_resource_t *rsc) static inline bool pcmk__is_anonymous_clone(const pcmk_resource_t *rsc) { - return pcmk__is_clone(rsc) && !pcmk_is_set(rsc->flags, pcmk__rsc_unique); + return pcmk__is_clone(rsc) && !pcmk__is_set(rsc->flags, pcmk__rsc_unique); } #ifdef __cplusplus diff --git a/include/crm/common/digest_internal.h b/include/crm/common/digest_internal.h index 5c49c1d09ed..729b4e8cbcf 100644 --- a/include/crm/common/digest_internal.h +++ b/include/crm/common/digest_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2015-2024 the Pacemaker project contributors + * Copyright 2015-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -41,11 +41,11 @@ typedef struct { char *digest_restart_calc; // Digest of params_restart } pcmk__op_digest_t; -char *pcmk__digest_on_disk_cib(xmlNode *input); -char *pcmk__digest_operation(xmlNode *input); -char *pcmk__digest_xml(xmlNode *input, bool filter); +char *pcmk__digest_on_disk_cib(const xmlNode *input); +char *pcmk__digest_operation(const xmlNode *input); +char *pcmk__digest_xml(const xmlNode *input, bool filter); -bool pcmk__verify_digest(xmlNode *input, const char *expected); +bool pcmk__verify_digest(const xmlNode *input, const char *expected); #ifdef __cplusplus } diff --git a/include/crm/common/history_internal.h b/include/crm/common/history_internal.h index bcf2015d60c..783e6d7f2a2 100644 --- a/include/crm/common/history_internal.h +++ b/include/crm/common/history_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,7 +13,6 @@ #include // NULL #include // xmlNode -#include // crm_element_value() #include // pcmk__str_empty() #include // pcmk__xe_id() #include // PCMK__XA_OPERATION_KEY @@ -40,7 +39,7 @@ pcmk__xe_history_key(const xmlNode *xml) * instead. Checking for that allows us to process old saved CIBs, * including some regression tests. */ - const char *key = crm_element_value(xml, PCMK__XA_OPERATION_KEY); + const char *key = pcmk__xe_get(xml, PCMK__XA_OPERATION_KEY); return pcmk__str_empty(key)? pcmk__xe_id(xml) : key; } diff --git a/include/crm/common/internal.h b/include/crm/common/internal.h index ceb831c41d2..6832922e924 100644 --- a/include/crm/common/internal.h +++ b/include/crm/common/internal.h @@ -10,9 +10,11 @@ #ifndef PCMK__CRM_COMMON_INTERNAL__H #define PCMK__CRM_COMMON_INTERNAL__H -#include // pid_t, getpid() +#include // struct passwd +#include // getpid() #include // bool #include // uint8_t, uint64_t +#include // pid_t, uid_t, gid_t #include // PRIu64 #include // guint, GList, GHashTable @@ -20,18 +22,8 @@ #include // do_crm_log_unlikely(), etc. #include // mainloop_io_t, struct ipc_client_callbacks -#include // crm_strdup_printf() -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include // pcmk__assert() +#include // pcmk__assert_asprintf() #ifdef __cplusplus extern "C" { @@ -174,6 +166,61 @@ pcmk__clear_flags_as(const char *function, int line, uint8_t log_level, return result; } +/*! + * \internal + * \brief Check whether any of specified flags are set in a flag group + * + * \param[in] flag_group Flag group to check whether \p flags_to_check are + * set + * \param[in] flags_to_check Flags to check whether set in \p flag_group + * + * \retval \c true if \p flags_to_check is nonzero and any of its flags are + * set in \p flag_group + * \retval \c false otherwise + */ +static inline bool +pcmk__any_flags_set(uint64_t flag_group, uint64_t flags_to_check) +{ + return (flag_group & flags_to_check) != 0; +} + +/*! + * \internal + * \brief Check whether all of specified flags are set in a flag group + * + * \param[in] flag_group Flag group to check whether \p flags_to_check are + * set + * \param[in] flags_to_check Flags to check whether set in \p flag_group + * + * \retval \c true if all flags in \p flags_to_check are set in \p flag_group + * or if \p flags_to_check is 0 + * \retval \c false otherwise + */ +static inline bool +pcmk__all_flags_set(uint64_t flag_group, uint64_t flags_to_check) +{ + return (flag_group & flags_to_check) == flags_to_check; +} + +/*! + * \internal + * \brief Convenience alias for \c pcmk__all_flags_set(), to check single flag + * + * This is truly identical to \c pcmk__all_flags_set() but allows a call that's + * shorter and semantically clearer for checking a single flag. + * + * \param[in] flag_group Flag group (check whether \p flag is set in this) + * \param[in] flag Flag (check whether this is set in \p flag_group) + * + * \retval \c true if \p flag is set in \p flag_group or if \p flag is 0 + * \retval \c false otherwise + */ +static inline bool +pcmk__is_set(uint64_t flag_group, uint64_t flag) +{ + return pcmk__all_flags_set(flag_group, flag); +} + /*! * \internal * \brief Get readable string for whether specified flags are set @@ -186,13 +233,17 @@ pcmk__clear_flags_as(const char *function, int line, uint8_t log_level, static inline const char * pcmk__flag_text(uint64_t flag_group, uint64_t flags) { - return pcmk__btoa(pcmk_all_flags_set(flag_group, flags)); + return pcmk__btoa(pcmk__all_flags_set(flag_group, flags)); } // miscellaneous utilities (from utils.c) +int pcmk__compare_versions(const char *version1, const char *version2); +int pcmk__daemon_user(uid_t *uid, gid_t *gid); void pcmk__daemonize(const char *name, const char *pidfile); +char *pcmk__generate_uuid(void); +int pcmk__lookup_user(const char *name, uid_t *uid, gid_t *gid); void pcmk__panic(const char *reason); pid_t pcmk__locate_sbd(void); void pcmk__sleep_ms(unsigned int ms); @@ -277,7 +328,7 @@ pcmk__realloc(void *ptr, size_t size) static inline char * pcmk__getpid_s(void) { - return crm_strdup_printf("%lu", (unsigned long) getpid()); + return pcmk__assert_asprintf("%lu", (unsigned long) getpid()); } // More efficient than g_list_length(list) == 1 @@ -321,7 +372,8 @@ pcmk__fail_attr_name(const char *prefix, const char *rsc_id, const char *op, guint interval_ms) { CRM_CHECK(prefix && rsc_id && op, return NULL); - return crm_strdup_printf("%s-%s#%s_%u", prefix, rsc_id, op, interval_ms); + return pcmk__assert_asprintf("%s-%s#%s_%u", prefix, rsc_id, op, + interval_ms); } static inline char * diff --git a/include/crm/common/io_internal.h b/include/crm/common/io_internal.h index e9c68f6eb89..23e966ca725 100644 --- a/include/crm/common/io_internal.h +++ b/include/crm/common/io_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -18,6 +18,18 @@ extern "C" { #endif +/* Define compression parameters for IPC messages + * + * Compression costs a LOT, so we don't want to do it unless we're hitting + * message limits. Currently, we use 128KB as the threshold, because higher + * values don't play well with the heartbeat stack. With an earlier limit of + * 10KB, compressing 184 of 1071 messages accounted for 23% of the total CPU + * used by the cib. + */ +#define PCMK__BZ2_BLOCKS 4 +#define PCMK__BZ2_WORK 20 +#define PCMK__BZ2_THRESHOLD (128 * 1024) + int pcmk__real_path(const char *path, char **resolved_path); char *pcmk__series_filename(const char *directory, const char *series, diff --git a/include/crm/common/ipc.h b/include/crm/common/ipc.h index 27be73c900a..5ab0766dc91 100644 --- a/include/crm/common/ipc.h +++ b/include/crm/common/ipc.h @@ -12,7 +12,10 @@ #include #include + #include + +#include // crm_exit_t #include #ifdef __cplusplus diff --git a/include/crm/common/ipc_internal.h b/include/crm/common/ipc_internal.h index cfa06541b09..c2587f6fde9 100644 --- a/include/crm/common/ipc_internal.h +++ b/include/crm/common/ipc_internal.h @@ -26,6 +26,7 @@ #include #include // pcmk_controld_api_reply #include // pcmk_pacemakerd_{api_reply,state} +#include // PCMK__LOG_TRACE #include // mainloop_io_t #ifdef __cplusplus @@ -186,29 +187,33 @@ struct pcmk__client_s { #define pcmk__set_client_flags(client, flags_to_set) do { \ (client)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ - "Client", pcmk__client_name(client), \ - (client)->flags, (flags_to_set), #flags_to_set); \ + PCMK__LOG_TRACE, "Client", \ + pcmk__client_name(client), \ + (client)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) -#define pcmk__clear_client_flags(client, flags_to_clear) do { \ - (client)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ - "Client", pcmk__client_name(client), \ - (client)->flags, (flags_to_clear), #flags_to_clear); \ +#define pcmk__clear_client_flags(client, flags_to_clear) do { \ + (client)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Client", \ + pcmk__client_name(client), \ + (client)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) #define pcmk__set_ipc_flags(ipc_flags, ipc_name, flags_to_set) do { \ - ipc_flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \ - "IPC", (ipc_name), \ - (ipc_flags), (flags_to_set), \ - #flags_to_set); \ + ipc_flags = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, \ + "IPC", (ipc_name), (ipc_flags), \ + (flags_to_set), #flags_to_set); \ } while (0) #define pcmk__clear_ipc_flags(ipc_flags, ipc_name, flags_to_clear) do { \ - ipc_flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ - "IPC", (ipc_name), \ - (ipc_flags), (flags_to_clear), \ + ipc_flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "IPC", \ + (ipc_name), (ipc_flags), \ + (flags_to_clear), \ #flags_to_clear); \ } while (0) diff --git a/include/crm/common/logging.h b/include/crm/common/logging.h index 56f42107e9d..822a7f10342 100644 --- a/include/crm/common/logging.h +++ b/include/crm/common/logging.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -99,11 +99,6 @@ void pcmk_log_xml_as(const char *file, const char *function, uint32_t line, uint32_t tags, uint8_t level, const char *text, const xmlNode *xml); -/* - * Throughout the macros below, note the leading, pre-comma, space in the - * various ' , ##args' occurrences to aid portability across versions of 'gcc'. - * https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html#Variadic-Macros - */ #if defined(__clang__) #define CRM_TRACE_INIT_DATA(name) #else @@ -151,13 +146,13 @@ pcmk__clip_log_level(int level) \ switch (_level) { \ case LOG_STDOUT: \ - printf(fmt "\n" , ##args); \ + printf(fmt "\n", ##args); \ break; \ case LOG_NEVER: \ break; \ default: \ qb_log_from_external_source(__func__, __FILE__, fmt, \ - _level, __LINE__, 0 , ##args); \ + _level, __LINE__, 0, ##args); \ break; \ } \ } while (0) @@ -185,7 +180,7 @@ pcmk__clip_log_level(int level) } \ if (crm_is_callsite_active(trace_cs, _level, 0)) { \ qb_log_from_external_source(__func__, __FILE__, fmt, \ - _level, __LINE__, 0 , \ + _level, __LINE__, 0, \ ##args); \ } \ } \ @@ -270,13 +265,13 @@ pcmk__clip_log_level(int level) \ switch (_level) { \ case LOG_STDOUT: \ - printf(fmt "\n" , ##args); \ + printf(fmt "\n" ,##args); \ break; \ case LOG_NEVER: \ break; \ default: \ qb_log_from_external_source(function, file, fmt, _level, \ - line, 0 , ##args); \ + line, 0 ,##args); \ break; \ } \ } while (0) @@ -305,13 +300,12 @@ pcmk__clip_log_level(int level) default: { \ const char *err = strerror(errno); \ if (_level <= crm_log_level) { \ - fprintf(stderr, fmt ": %s (%d)\n" , ##args, err, \ - errno); \ + fprintf(stderr, fmt ": %s (%d)\n", ##args, err, errno); \ } \ /* Pass original level arg since do_crm_log() also declares \ * _level \ */ \ - do_crm_log((level), fmt ": %s (%d)" , ##args, err, errno); \ + do_crm_log((level), fmt ": %s (%d)", ##args, err, errno); \ } \ break; \ } \ @@ -346,39 +340,12 @@ pcmk__clip_log_level(int level) converted_tag)) { \ qb_log_from_external_source(__func__, __FILE__, fmt, \ _level, __LINE__, \ - converted_tag , ##args); \ + converted_tag, ##args); \ } \ } \ } \ } while (0) -#define crm_emerg(fmt, args...) qb_log(LOG_EMERG, fmt , ##args) -#define crm_crit(fmt, args...) qb_logt(LOG_CRIT, 0, fmt , ##args) - -// NOTE: sbd (as of at least 1.5.2) uses this -#define crm_err(fmt, args...) qb_logt(LOG_ERR, 0, fmt , ##args) - -// NOTE: sbd (as of at least 1.5.2) uses this -#define crm_warn(fmt, args...) qb_logt(LOG_WARNING, 0, fmt , ##args) - -// NOTE: sbd (as of at least 1.5.2) uses this -#define crm_notice(fmt, args...) qb_logt(LOG_NOTICE, 0, fmt , ##args) - -#define crm_info(fmt, args...) qb_logt(LOG_INFO, 0, fmt , ##args) - // -// NOTE: sbd (as of at least 1.5.2) uses this -#define crm_debug(fmt, args...) do_crm_log_unlikely(LOG_DEBUG, fmt , ##args) - -#define crm_trace(fmt, args...) do_crm_log_unlikely(LOG_TRACE, fmt , ##args) - -#define crm_log_xml_crit(xml, text) do_crm_log_xml(LOG_CRIT, text, xml) -#define crm_log_xml_err(xml, text) do_crm_log_xml(LOG_ERR, text, xml) -#define crm_log_xml_warn(xml, text) do_crm_log_xml(LOG_WARNING, text, xml) -#define crm_log_xml_notice(xml, text) do_crm_log_xml(LOG_NOTICE, text, xml) -#define crm_log_xml_info(xml, text) do_crm_log_xml(LOG_INFO, text, xml) -#define crm_log_xml_debug(xml, text) do_crm_log_xml(LOG_DEBUG, text, xml) -#define crm_log_xml_trace(xml, text) do_crm_log_xml(LOG_TRACE, text, xml) - #define crm_log_xml_explicit(xml, text) do { \ static struct qb_log_callsite *digest_cs = NULL; \ digest_cs = qb_log_callsite_get( \ diff --git a/include/crm/common/logging_compat.h b/include/crm/common/logging_compat.h index 4864c2b4231..88f11b32899 100644 --- a/include/crm/common/logging_compat.h +++ b/include/crm/common/logging_compat.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -22,6 +22,55 @@ extern "C" { //! \deprecated Use qb_log_ctl() directly instead #define crm_extended_logging(t, e) qb_log_ctl((t), QB_LOG_CONF_EXTENDED, (e)) +//! \deprecated Do not use +#define crm_emerg(fmt, args...) qb_log(LOG_EMERG, fmt, ##args) + +//! \deprecated Do not use +#define crm_crit(fmt, args...) qb_log(LOG_CRIT, fmt, ##args) + +// NOTE: sbd (as of at least 1.5.2) uses this +//! \deprecated Do not use +#define crm_err(fmt, args...) qb_log(LOG_ERR, fmt, ##args) + +// NOTE: sbd (as of at least 1.5.2) uses this +//! \deprecated Do not use +#define crm_warn(fmt, args...) qb_log(LOG_WARNING, fmt, ##args) + +// NOTE: sbd (as of at least 1.5.2) uses this +//! \deprecated Do not use +#define crm_notice(fmt, args...) qb_log(LOG_NOTICE, fmt, ##args) + +//! \deprecated Do not use +#define crm_info(fmt, args...) qb_log(LOG_INFO, fmt, ##args) + +// NOTE: sbd (as of at least 1.5.2) uses this +//! \deprecated Do not use +#define crm_debug(fmt, args...) do_crm_log_unlikely(LOG_DEBUG, fmt, ##args) + +//! \deprecated Do not use +#define crm_trace(fmt, args...) do_crm_log_unlikely(LOG_TRACE, fmt, ##args) + +//! \deprecated Do not use +#define crm_log_xml_crit(xml, text) do_crm_log_xml(LOG_CRIT, text, xml) + +//! \deprecated Do not use +#define crm_log_xml_err(xml, text) do_crm_log_xml(LOG_ERR, text, xml) + +//! \deprecated Do not use +#define crm_log_xml_warn(xml, text) do_crm_log_xml(LOG_WARNING, text, xml) + +//! \deprecated Do not use +#define crm_log_xml_notice(xml, text) do_crm_log_xml(LOG_NOTICE, text, xml) + +//! \deprecated Do not use +#define crm_log_xml_info(xml, text) do_crm_log_xml(LOG_INFO, text, xml) + +//! \deprecated Do not use +#define crm_log_xml_debug(xml, text) do_crm_log_xml(LOG_DEBUG, text, xml) + +//! \deprecated Do not use +#define crm_log_xml_trace(xml, text) do_crm_log_xml(LOG_TRACE, text, xml) + #ifdef __cplusplus } #endif diff --git a/include/crm/common/logging_internal.h b/include/crm/common/logging_internal.h index ec63e7fe9f0..2b01ba0e03c 100644 --- a/include/crm/common/logging_internal.h +++ b/include/crm/common/logging_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2015-2024 the Pacemaker project contributors + * Copyright 2015-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,6 +12,7 @@ #include +#include // pcmk__is_set() #include #include @@ -19,6 +20,178 @@ extern "C" { #endif +/* Define custom log priorities. + * + * syslog(3) uses int for priorities, but libqb's struct qb_log_callsite uses + * uint8_t, so make sure they fit in the latter. + */ + +#ifndef PCMK__LOG_TRACE +/*! + * \internal + * \brief Log level for tracing (less importance than \c LOG_DEBUG messages) + * + * \note This value must stay the same as \c LOG_TRACE until the latter is + * dropped. Be mindful of public API functions that may pass arbitrary + * integer log levels as well. + */ +#define PCMK__LOG_TRACE (LOG_DEBUG + 1) +#endif // PCMK__LOG_TRACE + +#ifndef PCMK__LOG_STDOUT +/*! + * \internal + * \brief Request to print message to \c stdout instead of logging it + * + * Some callees print nothing when this is the log level. + * + * \note This value must stay the same as \c LOG_STDOUT until the latter is + * dropped. Be mindful of public API functions that may pass arbitrary + * integer log levels as well. + */ +#define PCMK__LOG_STDOUT 254 +#endif // PCMK__LOG_STDOUT + +#ifndef PCMK__LOG_NEVER +/*! + * \internal + * \brief Request not to print or log message anywhere + * + * \note This value must stay the same as \c LOG_NEVER until the latter is + * dropped. Be mindful of public API functions that may pass arbitrary + * integer log levels as well. + */ +#define PCMK__LOG_NEVER 255 +#endif // PCMK__LOG_NEVER + +/*! + * \internal + * \brief Log a message at \c LOG_EMERG level + * + * \param[in] fmt \c printf() format string for log message + * \param[in] args Format string arguments + */ +#define pcmk__emerg(fmt, args...) qb_log(LOG_EMERG, fmt, ##args) + +/*! + * \internal + * \brief Log a message at \c LOG_CRIT level + * + * \param[in] fmt \c printf() format string for log message + * \param[in] args Format string arguments + */ +#define pcmk__crit(fmt, args...) qb_log(LOG_CRIT, fmt, ##args) + +/*! + * \internal + * \brief Log a message at \c LOG_ERR level + * + * \param[in] fmt \c printf() format string for log message + * \param[in] args Format string arguments + */ +#define pcmk__err(fmt, args...) qb_log(LOG_ERR, fmt, ##args) + +/*! + * \internal + * \brief Log a message at \c LOG_WARN level + * + * \param[in] fmt \c printf() format string for log message + * \param[in] args Format string arguments + */ +#define pcmk__warn(fmt, args...) qb_log(LOG_WARNING, fmt, ##args) + +/*! + * \internal + * \brief Log a message at \c LOG_NOTICE level + * + * \param[in] fmt \c printf() format string for log message + * \param[in] args Format string arguments + */ +#define pcmk__notice(fmt, args...) qb_log(LOG_NOTICE, fmt, ##args) + +/*! + * \internal + * \brief Log a message at \c LOG_INFO level + * + * \param[in] fmt \c printf() format string for log message + * \param[in] args Format string arguments + */ +#define pcmk__info(fmt, args...) qb_log(LOG_INFO, fmt, ##args) + +/*! + * \internal + * \brief Log a message at \c LOG_DEBUG level + * + * \param[in] fmt \c printf() format string for log message + * \param[in] args Format string arguments + */ +#define pcmk__debug(fmt, args...) do_crm_log_unlikely(LOG_DEBUG, fmt, ##args) + +/*! + * \internal + * \brief Log a message at \c PCMK__LOG_TRACE level + * + * \param[in] fmt \c printf() format string for log message + * \param[in] args Format string arguments + */ +#define pcmk__trace(fmt, args...) do_crm_log_unlikely(LOG_TRACE, fmt, ##args) + +/*! + * \internal + * \brief Log XML line-by-line in a formatted fashion at \c LOG_ERR level + * + * \param[in] prefix Prefix for each line + * \param[in] xml XML to log + */ +#define pcmk__log_xml_err(xml, prefix) do_crm_log_xml(LOG_ERR, prefix, xml) + +/*! + * \internal + * \brief Log XML line-by-line in a formatted fashion at \c LOG_WARNING level + * + * \param[in] prefix Prefix for each line + * \param[in] xml XML to log + */ +#define pcmk__log_xml_warn(xml, prefix) do_crm_log_xml(LOG_WARNING, prefix, xml) + +/*! + * \internal + * \brief Log XML line-by-line in a formatted fashion at \c LOG_NOTICE level + * + * \param[in] prefix Prefix for each line + * \param[in] xml XML to log + */ +#define pcmk__log_xml_notice(xml, prefix) \ + do_crm_log_xml(LOG_NOTICE, prefix, xml) + +/*! + * \internal + * \brief Log XML line-by-line in a formatted fashion at \c LOG_INFO level + * + * \param[in] prefix Prefix for each line + * \param[in] xml XML to log + */ +#define pcmk__log_xml_info(xml, prefix) do_crm_log_xml(LOG_INFO, prefix, xml) + +/*! + * \internal + * \brief Log XML line-by-line in a formatted fashion at \c LOG_DEBUG level + * + * \param[in] prefix Prefix for each line + * \param[in] xml XML to log + */ +#define pcmk__log_xml_debug(xml, prefix) do_crm_log_xml(LOG_DEBUG, prefix, xml) + +/*! + * \internal + * \brief Log XML line-by-line in a formatted fashion at \c PCMK__LOG_TRACE level + * + * \param[in] prefix Prefix for each line + * \param[in] xml XML to log + */ +#define pcmk__log_xml_trace(xml, prefix) \ + do_crm_log_xml(PCMK__LOG_TRACE, prefix, xml) + /* Some warnings are too noisy when logged every time a given function is called * (for example, using a deprecated feature). As an alternative, we allow * warnings to be logged once per invocation of the calling program. Each of @@ -48,14 +221,14 @@ enum pcmk__warnings { * \param[in] fmt... printf(3)-style format and arguments */ #define pcmk__warn_once(wo_flag, fmt...) do { \ - if (!pcmk_is_set(pcmk__warnings, wo_flag)) { \ + if (!pcmk__is_set(pcmk__warnings, wo_flag)) { \ if (wo_flag == pcmk__wo_blind) { \ - crm_warn(fmt); \ + pcmk__warn(fmt); \ } else { \ pcmk__config_warn(fmt); \ } \ pcmk__warnings = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ + PCMK__LOG_TRACE, \ "Warn-once", "logging", \ pcmk__warnings, \ (wo_flag), #wo_flag); \ @@ -95,7 +268,7 @@ extern bool pcmk__config_has_warning; #define pcmk__config_err(fmt...) do { \ pcmk__config_has_error = true; \ if (pcmk__config_error_handler == NULL) { \ - crm_err(fmt); \ + pcmk__err(fmt); \ } else { \ pcmk__config_error_handler(pcmk__config_error_context, fmt); \ } \ @@ -110,7 +283,7 @@ extern bool pcmk__config_has_warning; #define pcmk__config_warn(fmt...) do { \ pcmk__config_has_warning = true; \ if (pcmk__config_warning_handler == NULL) { \ - crm_warn(fmt); \ + pcmk__warn(fmt); \ } else { \ pcmk__config_warning_handler(pcmk__config_warning_context, fmt);\ } \ @@ -129,20 +302,20 @@ extern bool pcmk__config_has_warning; * \note Neither \p if_action nor \p else_action can contain a \p break or * \p continue statement. */ -#define pcmk__if_tracing(if_action, else_action) do { \ - static struct qb_log_callsite *trace_cs = NULL; \ - \ - if (trace_cs == NULL) { \ - trace_cs = qb_log_callsite_get(__func__, __FILE__, \ - "if_tracing", LOG_TRACE, \ - __LINE__, crm_trace_nonlog); \ - } \ - if (crm_is_callsite_active(trace_cs, LOG_TRACE, \ - crm_trace_nonlog)) { \ - if_action; \ - } else { \ - else_action; \ - } \ +#define pcmk__if_tracing(if_action, else_action) do { \ + static struct qb_log_callsite *trace_cs = NULL; \ + \ + if (trace_cs == NULL) { \ + trace_cs = qb_log_callsite_get(__func__, __FILE__, \ + "if_tracing", PCMK__LOG_TRACE, \ + __LINE__, crm_trace_nonlog); \ + } \ + if (crm_is_callsite_active(trace_cs, PCMK__LOG_TRACE, \ + crm_trace_nonlog)) { \ + if_action; \ + } else { \ + else_action; \ + } \ } while (0) /*! @@ -152,15 +325,16 @@ extern bool pcmk__config_has_warning; * \param[in] level Priority at which to log the messages * \param[in] xml XML to log * - * \note This does nothing when \p level is \c LOG_STDOUT. + * \note This does nothing when \p level is \c PCMK__LOG_STDOUT or + * \c PCMK__LOG_NEVER. */ #define pcmk__log_xml_changes(level, xml) do { \ uint8_t _level = pcmk__clip_log_level(level); \ static struct qb_log_callsite *xml_cs = NULL; \ \ switch (_level) { \ - case LOG_STDOUT: \ - case LOG_NEVER: \ + case PCMK__LOG_STDOUT: \ + case PCMK__LOG_NEVER: \ break; \ default: \ if (xml_cs == NULL) { \ @@ -183,15 +357,16 @@ extern bool pcmk__config_has_warning; * \param[in] level Priority at which to log the messages * \param[in] patchset XML patchset to log * - * \note This does nothing when \p level is \c LOG_STDOUT. + * \note This does nothing when \p level is \c PCMK__LOG_STDOUT or + * \c PCMK__LOG_NEVER. */ #define pcmk__log_xml_patchset(level, patchset) do { \ uint8_t _level = pcmk__clip_log_level(level); \ static struct qb_log_callsite *xml_cs = NULL; \ \ switch (_level) { \ - case LOG_STDOUT: \ - case LOG_NEVER: \ + case PCMK__LOG_STDOUT: \ + case PCMK__LOG_NEVER: \ break; \ default: \ if (xml_cs == NULL) { \ diff --git a/include/crm/common/messages_internal.h b/include/crm/common/messages_internal.h index e9481d0e752..0b183202ee7 100644 --- a/include/crm/common/messages_internal.h +++ b/include/crm/common/messages_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2018-2024 the Pacemaker project contributors + * Copyright 2018-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,7 @@ #include // uint32_t #include // xmlNode #include // pcmk__client_t +#include // PCMK__LOG_TRACE #include // pcmk__action_result_t #include // pcmk__xml_copy() @@ -67,7 +68,7 @@ typedef struct { #define pcmk__set_request_flags(request, flags_to_set) do { \ (request)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Request", "message", (request)->flags, \ + PCMK__LOG_TRACE, "Request", "message", (request)->flags, \ (flags_to_set), #flags_to_set); \ } while (0) diff --git a/include/crm/common/nodes.h b/include/crm/common/nodes.h index c4acb91c4b8..fc200becfeb 100644 --- a/include/crm/common/nodes.h +++ b/include/crm/common/nodes.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,7 +11,7 @@ #define PCMK__CRM_COMMON_NODES__H #include // bool -#include // gboolean, GList, GHashTable +#include // gboolean, GList #include // xmlNode #include // pcmk_resource_t, pcmk_scheduler_t diff --git a/include/crm/common/nodes_internal.h b/include/crm/common/nodes_internal.h index b8525758a3d..c70db07b7d9 100644 --- a/include/crm/common/nodes_internal.h +++ b/include/crm/common/nodes_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -15,6 +15,8 @@ #include // uint32_t, UINT32_C() #include // gpointer, GList, GHashTable + +#include // PCMK__LOG_TRACE #include #ifdef __cplusplus @@ -133,10 +135,13 @@ pcmk_node_t *pcmk__find_node_in_list(const GList *nodes, const char *node_name); * \param[in,out] node Node to set flags for * \param[in] flags_to_set Group of enum pcmk_node_flags to set */ -#define pcmk__set_node_flags(node, flags_to_set) do { \ - (node)->priv->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Node", pcmk__node_name(node), \ - (node)->priv->flags, (flags_to_set), #flags_to_set); \ +#define pcmk__set_node_flags(node, flags_to_set) do { \ + (node)->priv->flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Node", \ + pcmk__node_name(node), \ + (node)->priv->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) /*! @@ -148,8 +153,11 @@ pcmk_node_t *pcmk__find_node_in_list(const GList *nodes, const char *node_name); */ #define pcmk__clear_node_flags(node, flags_to_clear) do { \ (node)->priv->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Node", pcmk__node_name(node), \ - (node)->priv->flags, (flags_to_clear), #flags_to_clear); \ + PCMK__LOG_TRACE, "Node", \ + pcmk__node_name(node), \ + (node)->priv->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) void pcmk__free_node(gpointer user_data); diff --git a/include/crm/common/nvpair.h b/include/crm/common/nvpair.h index f8018b3090f..938357fc5ea 100644 --- a/include/crm/common/nvpair.h +++ b/include/crm/common/nvpair.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,8 +10,7 @@ #ifndef PCMK__CRM_COMMON_NVPAIR__H #define PCMK__CRM_COMMON_NVPAIR__H -#include // struct timeval -#include // gpointer, gboolean, guint, GHashTable +#include // gpointer, GHashTable #include // xmlNode #include diff --git a/include/crm/common/resources_internal.h b/include/crm/common/resources_internal.h index 0a8839b4a1b..4c0a012239a 100644 --- a/include/crm/common/resources_internal.h +++ b/include/crm/common/resources_internal.h @@ -15,6 +15,7 @@ #include // gboolean, gpointer, guint, etc. #include // xmlNode +#include // PCMK__LOG_TRACE #include // pcmk_resource_t #include // enum rsc_role_e #include // pcmk_node_t, etc. @@ -32,8 +33,11 @@ extern "C" { */ #define pcmk__set_rsc_flags(resource, flags_to_set) do { \ (resource)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Resource", (resource)->id, (resource)->flags, \ - (flags_to_set), #flags_to_set); \ + PCMK__LOG_TRACE, "Resource", \ + (resource)->id, \ + (resource)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) /*! @@ -43,10 +47,14 @@ extern "C" { * \param[in,out] resource Resource to clear flags for * \param[in] flags_to_clear Group of enum pcmk_rsc_flags to clear */ -#define pcmk__clear_rsc_flags(resource, flags_to_clear) do { \ - (resource)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Resource", (resource)->id, (resource)->flags, \ - (flags_to_clear), #flags_to_clear); \ +#define pcmk__clear_rsc_flags(resource, flags_to_clear) do { \ + (resource)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "Resource", \ + (resource)->id, \ + (resource)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) //! Resource variants supported by Pacemaker diff --git a/include/crm/common/scheduler_internal.h b/include/crm/common/scheduler_internal.h index 82805ac4acd..03b768e3dfc 100644 --- a/include/crm/common/scheduler_internal.h +++ b/include/crm/common/scheduler_internal.h @@ -20,7 +20,9 @@ #include #include #include +#include // PCMK__LOG_TRACE #include +#include #include #include #include @@ -227,8 +229,9 @@ extern uint32_t pcmk__warnings; * \param[in] rsc Tag message with this resource's ID * \param[in] fmt... printf(3)-style format and arguments */ -#define pcmk__rsc_trace(rsc, fmt, args...) \ - crm_log_tag(LOG_TRACE, ((rsc) == NULL)? "" : (rsc)->id, (fmt), ##args) +#define pcmk__rsc_trace(rsc, fmt, args...) \ + crm_log_tag(PCMK__LOG_TRACE, (((rsc) != NULL)? (rsc)->id : ""), \ + (fmt), ##args) /*! * \internal @@ -240,7 +243,7 @@ extern uint32_t pcmk__warnings; #define pcmk__sched_err(scheduler, fmt...) do { \ pcmk__set_scheduler_flags((scheduler), \ pcmk__sched_processing_error); \ - crm_err(fmt); \ + pcmk__err(fmt); \ } while (0) /*! @@ -253,7 +256,7 @@ extern uint32_t pcmk__warnings; #define pcmk__sched_warn(scheduler, fmt...) do { \ pcmk__set_scheduler_flags((scheduler), \ pcmk__sched_processing_warning); \ - crm_warn(fmt); \ + pcmk__warn(fmt); \ } while (0) /*! @@ -265,8 +268,12 @@ extern uint32_t pcmk__warnings; */ #define pcmk__set_scheduler_flags(scheduler, flags_to_set) do { \ (scheduler)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Scheduler", crm_system_name, \ - (scheduler)->flags, (flags_to_set), #flags_to_set); \ + PCMK__LOG_TRACE, \ + "Scheduler", \ + crm_system_name, \ + (scheduler)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) /*! @@ -278,8 +285,12 @@ extern uint32_t pcmk__warnings; */ #define pcmk__clear_scheduler_flags(scheduler, flags_to_clear) do { \ (scheduler)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Scheduler", crm_system_name, \ - (scheduler)->flags, (flags_to_clear), #flags_to_clear); \ + PCMK__LOG_TRACE, \ + "Scheduler", \ + crm_system_name, \ + (scheduler)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) void pcmk__set_scheduler_defaults(pcmk_scheduler_t *scheduler); diff --git a/include/crm/common/schemas.h b/include/crm/common/schemas.h index 338311ba75b..c892010b0c0 100644 --- a/include/crm/common/schemas.h +++ b/include/crm/common/schemas.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,7 +10,6 @@ #ifndef PCMK__CRM_COMMON_SCHEMAS__H #define PCMK__CRM_COMMON_SCHEMAS__H -#include // bool #include // xmlNode #ifdef __cplusplus diff --git a/include/crm/common/strings.h b/include/crm/common/strings.h index a82ce033f46..fd4fba8fba3 100644 --- a/include/crm/common/strings.h +++ b/include/crm/common/strings.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,7 +10,7 @@ #ifndef PCMK__CRM_COMMON_STRINGS__H #define PCMK__CRM_COMMON_STRINGS__H -#include // gboolean, guint, G_GNUC_PRINTF +#include // guint #ifdef __cplusplus extern "C" { @@ -22,18 +22,11 @@ extern "C" { * \ingroup core */ -// NOTE: sbd (as of at least 1.5.2) uses this -long long crm_get_msec(const char *input); - int pcmk_parse_interval_spec(const char *input, guint *result_ms); -// NOTE: sbd (as of at least 1.5.2) uses this -gboolean crm_is_true(const char *s); - -int crm_str_to_boolean(const char *s, int *ret); - -// NOTE: sbd (as of at least 1.5.2) uses this -char *crm_strdup_printf(char const *format, ...) G_GNUC_PRINTF(1, 2); +#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) +#include +#endif #ifdef __cplusplus } diff --git a/include/crm/common/strings_compat.h b/include/crm/common/strings_compat.h new file mode 100644 index 00000000000..9fa586c60c6 --- /dev/null +++ b/include/crm/common/strings_compat.h @@ -0,0 +1,46 @@ +/* + * Copyright 2004-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU Lesser General Public License + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + */ + +#include // gboolean + +#ifndef PCMK__CRM_COMMON_STRINGS_COMPAT__H +#define PCMK__CRM_COMMON_STRINGS_COMPAT__H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file + * \brief Deprecated Pacemaker strings API + * \ingroup core + * \deprecated Do not include this header directly. The XML APIs in this header, + * and the header itself, will be removed in a future release. + */ + +// NOTE: sbd (as of at least 1.5.2) uses this +//! \deprecated Do not use +long long crm_get_msec(const char *input); + +// NOTE: sbd (as of at least 1.5.2) uses this +//! \deprecated Do not use +gboolean crm_is_true(const char *s); + +//! \deprecated Do not use +int crm_str_to_boolean(const char *s, int *ret); + +// NOTE: sbd (as of at least 1.5.2) uses this +//! \deprecated Do not use +char *crm_strdup_printf(char const *format, ...) G_GNUC_PRINTF(1, 2); + +#ifdef __cplusplus +} +#endif + +#endif // PCMK__CRM_COMMON_STRINGS_COMPAT__H diff --git a/include/crm/common/strings_internal.h b/include/crm/common/strings_internal.h index 5d4c0de6050..7c6086a892d 100644 --- a/include/crm/common/strings_internal.h +++ b/include/crm/common/strings_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2015-2024 the Pacemaker project contributors + * Copyright 2015-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -16,7 +16,7 @@ #include // guint, GList, GHashTable #include // PCMK_VALUE_TRUE, PCMK_VALUE_FALSE -#include // crm_strdup_printf() +#include // pcmk_rc_ok #ifdef __cplusplus extern "C" { @@ -53,7 +53,28 @@ int pcmk__compress(const char *data, unsigned int length, unsigned int max, int pcmk__scan_ll(const char *text, long long *result, long long default_value); int pcmk__scan_min_int(const char *text, int *result, int minimum); int pcmk__scan_port(const char *text, int *port); +int pcmk__parse_bool(const char *input, bool *result); int pcmk__parse_ll_range(const char *srcstring, long long *start, long long *end); +int pcmk__parse_ms(const char *input, long long *result); + +/*! + * \internal + * \brief Check whether a string parses to \c true + * + * \param[in] input Input string + * + * \retval \c true if \p input is not \c NULL and \c pcmk__parse_bool() parses + * it to \c true + * \retval \c false otherwise + */ +static inline bool +pcmk__is_true(const char *input) +{ + bool result = false; + + return (input != NULL) && (pcmk__parse_bool(input, &result) == pcmk_rc_ok) + && result; +} GHashTable *pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func); @@ -168,6 +189,8 @@ char *pcmk__str_copy_as(const char *file, const char *function, uint32_t line, void pcmk__str_update(char **str, const char *value); +char *pcmk__assert_asprintf(const char *format, ...) G_GNUC_PRINTF(1, 2); + void pcmk__g_strcat(GString *buffer, ...) G_GNUC_NULL_TERMINATED; static inline bool @@ -187,9 +210,9 @@ pcmk__add_word(GString **list, size_t init_size, const char *word) * vs. "2 nodes have". A flexible solution is to pluralize entire strings, e.g. * * if (a == 1) { - * crm_info("singular message"): + * pcmk__info("singular message"): * } else { - * crm_info("plural message"); + * pcmk__info("plural message"); * } * * though even that's not sufficient for all languages besides English (if we @@ -198,12 +221,12 @@ pcmk__add_word(GString **list, size_t init_size, const char *word) */ /* Example: - * crm_info("Found %d %s", nentries, - * pcmk__plural_alt(nentries, "entry", "entries")); + * pcmk__info("Found %d %s", nentries, + * pcmk__plural_alt(nentries, "entry", "entries")); */ #define pcmk__plural_alt(i, s1, s2) (((i) == 1)? (s1) : (s2)) -// Example: crm_info("Found %d node%s", nnodes, pcmk__plural_s(nnodes)); +// Example: pcmk__info("Found %d node%s", nnodes, pcmk__plural_s(nnodes)); #define pcmk__plural_s(i) pcmk__plural_alt(i, "", "s") static inline int @@ -215,19 +238,19 @@ pcmk__str_empty(const char *s) static inline char * pcmk__itoa(int an_int) { - return crm_strdup_printf("%d", an_int); + return pcmk__assert_asprintf("%d", an_int); } static inline char * pcmk__ftoa(double a_float) { - return crm_strdup_printf("%f", a_float); + return pcmk__assert_asprintf("%f", a_float); } static inline char * pcmk__ttoa(time_t epoch_time) { - return crm_strdup_printf("%lld", (long long) epoch_time); + return pcmk__assert_asprintf("%lld", (long long) epoch_time); } // note this returns const not allocated diff --git a/include/crm/common/tickets_internal.h b/include/crm/common/tickets_internal.h index e57e2b7423d..1eb36fbe04b 100644 --- a/include/crm/common/tickets_internal.h +++ b/include/crm/common/tickets_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -14,6 +14,8 @@ #include // time_t #include // GHashTable +#include // PCMK__LOG_TRACE + #ifdef __cplusplus extern "C" { #endif @@ -31,10 +33,12 @@ extern "C" { * \param[in,out] ticket Ticket to set flags for * \param[in] flags_to_set Group of enum pcmk__ticket_flags to set */ -#define pcmk__set_ticket_flags(ticket, flags_to_set) do { \ - (ticket)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Ticket", (ticket)->id, (ticket)->flags, \ - (flags_to_set), #flags_to_set); \ +#define pcmk__set_ticket_flags(ticket, flags_to_set) do { \ + (ticket)->flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Ticket", \ + (ticket)->id, (ticket)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) /*! @@ -44,10 +48,13 @@ extern "C" { * \param[in,out] ticket Ticket to clear flags for * \param[in] flags_to_clear Group of enum pcmk__ticket_flags to clear */ -#define pcmk__clear_ticket_flags(ticket, flags_to_clear) do { \ - (ticket)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Ticket", (ticket)->id, (ticket)->flags, \ - (flags_to_clear), #flags_to_clear); \ +#define pcmk__clear_ticket_flags(ticket, flags_to_clear) do { \ + (ticket)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Ticket", \ + (ticket)->id, \ + (ticket)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) enum pcmk__ticket_flags { diff --git a/include/crm/common/util.h b/include/crm/common/util.h index d656c54b673..86759f9d227 100644 --- a/include/crm/common/util.h +++ b/include/crm/common/util.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,22 +10,6 @@ #ifndef PCMK__CRM_COMMON_UTIL__H #define PCMK__CRM_COMMON_UTIL__H -#include // gid_t, mode_t, size_t, time_t, uid_t -#include -#include -#include // uint32_t -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - #ifdef __cplusplus extern "C" { #endif @@ -42,48 +26,7 @@ char *pcmk_promotion_score_name(const char *rsc_id); /* public Pacemaker Remote functions (from remote.c) */ int crm_default_remote_port(void); -int compare_version(const char *version1, const char *version2); - -/*! - * \brief Check whether any of specified flags are set in a flag group - * - * \param[in] flag_group The flag group being examined - * \param[in] flags_to_check Which flags in flag_group should be checked - * - * \return true if \p flags_to_check is nonzero and any of its flags are set in - * \p flag_group, or false otherwise - */ -static inline bool -pcmk_any_flags_set(uint64_t flag_group, uint64_t flags_to_check) -{ - return (flag_group & flags_to_check) != 0; -} - -/*! - * \brief Check whether all of specified flags are set in a flag group - * - * \param[in] flag_group The flag group being examined - * \param[in] flags_to_check Which flags in flag_group should be checked - * - * \return true if \p flags_to_check is zero or all of its flags are set in - * \p flag_group, or false otherwise - */ -static inline bool -pcmk_all_flags_set(uint64_t flag_group, uint64_t flags_to_check) -{ - return (flag_group & flags_to_check) == flags_to_check; -} - -/*! - * \brief Convenience alias for pcmk_all_flags_set(), to check single flag - */ -#define pcmk_is_set(g, f) pcmk_all_flags_set((g), (f)) - void pcmk_common_cleanup(void); -char *crm_md5sum(const char *buffer); -char *crm_generate_uuid(void); -int crm_user_lookup(const char *name, uid_t * uid, gid_t * gid); -int pcmk_daemon_user(uid_t *uid, gid_t *gid); #ifdef __cplusplus } diff --git a/include/crm/common/util_compat.h b/include/crm/common/util_compat.h index ebcefcb9e96..7118cfcf96b 100644 --- a/include/crm/common/util_compat.h +++ b/include/crm/common/util_compat.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,6 +11,9 @@ #define PCMK__CRM_COMMON_UTIL_COMPAT__H #include // bool +#include // uint64_t +#include // uid_t, gid_t + #include // gboolean #ifdef __cplusplus @@ -33,13 +36,45 @@ void crm_gnutls_global_init(void); bool crm_is_daemon_name(const char *name); // NOTE: sbd (as of at least 1.5.2) uses this -//! \deprecated Use pcmk_is_set() or pcmk_all_flags_set() instead +//! \deprecated Do not use static inline gboolean is_set(long long word, long long bit) { return ((word & bit) == bit); } +//! \deprecated Do not use +static inline bool +pcmk_any_flags_set(uint64_t flag_group, uint64_t flags_to_check) +{ + return (flag_group & flags_to_check) != 0; +} + +//! \deprecated Do not use +static inline bool +pcmk_all_flags_set(uint64_t flag_group, uint64_t flags_to_check) +{ + return (flag_group & flags_to_check) == flags_to_check; +} + +//! \deprecated Do not use +#define pcmk_is_set(g, f) pcmk_all_flags_set((g), (f)) + +//! \deprecated Do not use +char *crm_md5sum(const char *buffer); + +//! \deprecated Do not use +char *crm_generate_uuid(void); + +//! \deprecated Do not use +int pcmk_daemon_user(uid_t *uid, gid_t *gid); + +//! \deprecated Do not use +int crm_user_lookup(const char *name, uid_t *uid, gid_t *gid); + +//! \deprecated Do not use +int compare_version(const char *version1, const char *version2); + #ifdef __cplusplus } #endif diff --git a/include/crm/common/xml.h b/include/crm/common/xml.h index ac4c0739267..32bd5bb886d 100644 --- a/include/crm/common/xml.h +++ b/include/crm/common/xml.h @@ -29,21 +29,14 @@ extern "C" { * \ingroup core */ -/* - * Searching & Modifying +/* @COMPAT Create and apply patchset functions must remain public until we + * create libpacemaker equivalents */ -void xml_track_changes(xmlNode * xml, const char *user, xmlNode *acl_source, bool enforce_acls); -void xml_calculate_changes(xmlNode *old_xml, xmlNode *new_xml); -void xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml); -void xml_accept_changes(xmlNode * xml); -bool xml_patch_versions(const xmlNode *patchset, int add[3], int del[3]); - xmlNode *xml_create_patchset( int format, xmlNode *source, xmlNode *target, bool *config, bool manage_version); -int xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version); - -void patchset_process_digest(xmlNode *patch, xmlNode *source, xmlNode *target, bool with_digest); +int xml_apply_patchset(xmlNode *xml, const xmlNode *patchset, + bool check_version); #ifdef __cplusplus } diff --git a/include/crm/common/xml_compat.h b/include/crm/common/xml_compat.h index d575326e0a6..95b2461a06b 100644 --- a/include/crm/common/xml_compat.h +++ b/include/crm/common/xml_compat.h @@ -10,13 +10,12 @@ #ifndef PCMK__CRM_COMMON_XML_COMPAT__H #define PCMK__CRM_COMMON_XML_COMPAT__H +#include // bool + #include // gboolean #include // xmlNode #include // xmlXPathObject -#include // crm_xml_add() -#include // PCMK_XE_CLONE - #ifdef __cplusplus extern "C" { #endif @@ -111,6 +110,26 @@ bool xml_tracking_changes(xmlNode *xml); //! \deprecated Do not use bool xml_document_dirty(xmlNode *xml); +//! \deprecated Do not use +void xml_accept_changes(xmlNode *xml); + +//! \deprecated Do not use +void xml_track_changes(xmlNode *xml, const char *user, xmlNode *acl_source, + bool enforce_acls); + +//! \deprecated Do not use +void xml_calculate_changes(xmlNode *old_xml, xmlNode *new_xml); + +//! \deprecated Do not use +void xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml); + +//! \deprecated Do not use +bool xml_patch_versions(const xmlNode *patchset, int add[3], int del[3]); + +//! \deprecated Do not use +void patchset_process_digest(xmlNode *patch, const xmlNode *source, + const xmlNode *target, bool with_digest); + #ifdef __cplusplus } #endif diff --git a/include/crm/common/xml_element.h b/include/crm/common/xml_element.h index c49603b5454..4ec740b46bf 100644 --- a/include/crm/common/xml_element.h +++ b/include/crm/common/xml_element.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,11 +10,6 @@ #ifndef PCMK__CRM_COMMON_XML_ELEMENT__H #define PCMK__CRM_COMMON_XML_ELEMENT__H -#include // struct timeval - -#include // guint -#include // xmlNode - #ifdef __cplusplus extern "C" { #endif @@ -25,41 +20,6 @@ extern "C" { * \ingroup core */ -const char *crm_xml_add(xmlNode *node, const char *name, const char *value); -const char *crm_xml_add_int(xmlNode *node, const char *name, int value); -const char *crm_xml_add_ll(xmlNode *node, const char *name, long long value); -const char *crm_xml_add_ms(xmlNode *node, const char *name, guint ms); -const char *crm_xml_add_timeval(xmlNode *xml, const char *name_sec, - const char *name_usec, - const struct timeval *value); - -const char *crm_element_value(const xmlNode *data, const char *name); -int crm_element_value_int(const xmlNode *data, const char *name, int *dest); -int crm_element_value_ll(const xmlNode *data, const char *name, long long *dest); -int crm_element_value_ms(const xmlNode *data, const char *name, guint *dest); -int crm_element_value_epoch(const xmlNode *xml, const char *name, time_t *dest); -int crm_element_value_timeval(const xmlNode *data, const char *name_sec, - const char *name_usec, struct timeval *dest); -char *crm_element_value_copy(const xmlNode *data, const char *name); - -/*! - * \brief Copy an element from one XML object to another - * - * \param[in] obj1 Source XML - * \param[in,out] obj2 Destination XML - * \param[in] element Name of element to copy - * - * \return Pointer to copied value (from source) - */ -static inline const char * -crm_copy_xml_element(const xmlNode *obj1, xmlNode *obj2, const char *element) -{ - const char *value = crm_element_value(obj1, element); - - crm_xml_add(obj2, element, value); - return value; -} - #ifdef __cplusplus } #endif diff --git a/include/crm/common/xml_element_compat.h b/include/crm/common/xml_element_compat.h index 7c6e1f1c841..ce44d49a11f 100644 --- a/include/crm/common/xml_element_compat.h +++ b/include/crm/common/xml_element_compat.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,7 +10,9 @@ #ifndef PCMK__CRM_COMMON_XML_ELEMENT_COMPAT__H #define PCMK__CRM_COMMON_XML_ELEMENT_COMPAT__H -#include // gboolean +#include // struct timeval + +#include // gboolean, guint #include // xmlNode #ifdef __cplusplus @@ -35,6 +37,50 @@ void crm_xml_set_id(xmlNode *xml, const char *format, ...) G_GNUC_PRINTF(2, 3); //! \deprecated Do not use xmlNode *sorted_xml(xmlNode *input, xmlNode *parent, gboolean recursive); +//! \deprecated Do not use +const char *crm_copy_xml_element(const xmlNode *obj1, xmlNode *obj2, + const char *element); + +//! \deprecated Do not use +int crm_element_value_timeval(const xmlNode *data, const char *name_sec, + const char *name_usec, struct timeval *dest); + +//! \deprecated Do not use +int crm_element_value_epoch(const xmlNode *xml, const char *name, time_t *dest); + +//! \deprecated Do not use +int crm_element_value_ms(const xmlNode *data, const char *name, guint *dest); + +//! \deprecated Do not use +int crm_element_value_ll(const xmlNode *data, const char *name, + long long *dest); + +//! \deprecated Do not use +int crm_element_value_int(const xmlNode *data, const char *name, int *dest); + +//! \deprecated Do not use +const char *crm_element_value(const xmlNode *data, const char *name); + +//! \deprecated Do not use +char *crm_element_value_copy(const xmlNode *data, const char *name); + +//! \deprecated Do not use +const char *crm_xml_add_timeval(xmlNode *xml, const char *name_sec, + const char *name_usec, + const struct timeval *value); + +//! \deprecated Do not use +const char *crm_xml_add_ms(xmlNode *node, const char *name, guint ms); + +//! \deprecated Do not use +const char *crm_xml_add_ll(xmlNode *node, const char *name, long long value); + +//! \deprecated Do not use +const char *crm_xml_add_int(xmlNode *node, const char *name, int value); + +//! \deprecated Do not use +const char *crm_xml_add(xmlNode *node, const char *name, const char *value); + #ifdef __cplusplus } #endif diff --git a/include/crm/common/xml_element_internal.h b/include/crm/common/xml_element_internal.h index 0420212952d..674f2a069b4 100644 --- a/include/crm/common/xml_element_internal.h +++ b/include/crm/common/xml_element_internal.h @@ -20,10 +20,11 @@ #include // NULL #include // strcmp() +#include // guint #include // xmlNode, etc. #include // crm_time_t -#include // crm_element_value() +#include // pcmk__str_copy() #include // PCMK_XA_ID #ifdef __cplusplus @@ -44,20 +45,6 @@ int pcmk__xe_delete_match(xmlNode *xml, xmlNode *search); int pcmk__xe_replace_match(xmlNode *xml, xmlNode *replace); int pcmk__xe_update_match(xmlNode *xml, xmlNode *update, uint32_t flags); -/*! - * \internal - * \brief Retrieve the value of the \c PCMK_XA_ID XML attribute - * - * \param[in] xml XML element to check - * - * \return Value of the \c PCMK_XA_ID attribute (may be \c NULL) - */ -static inline const char * -pcmk__xe_id(const xmlNode *xml) -{ - return crm_element_value(xml, PCMK_XA_ID); -} - /*! * \internal * \brief Check whether an XML element is of a particular type @@ -153,14 +140,67 @@ pcmk__xe_foreach_child(xmlNode *xml, const char *child_element_name, int (*handler)(xmlNode *xml, void *userdata), void *userdata); +const char *pcmk__xe_get(const xmlNode *xml, const char *attr_name); +int pcmk__xe_set(xmlNode *xml, const char *attr_name, const char *value); + int pcmk__xe_get_datetime(const xmlNode *xml, const char *attr, crm_time_t **t); int pcmk__xe_get_flags(const xmlNode *xml, const char *name, uint32_t *dest, uint32_t default_value); +int pcmk__xe_get_guint(const xmlNode *xml, const char *attr, guint *dest); +void pcmk__xe_set_guint(xmlNode *xml, const char *attr, guint value); + +int pcmk__xe_get_int(const xmlNode *xml, const char *name, int *dest); +void pcmk__xe_set_int(xmlNode *xml, const char *attr, int value); + +int pcmk__xe_get_ll(const xmlNode *xml, const char *name, long long *dest); +int pcmk__xe_set_ll(xmlNode *xml, const char *attr, long long value); + +int pcmk__xe_get_time(const xmlNode *xml, const char *attr, time_t *dest); +void pcmk__xe_set_time(xmlNode *xml, const char *attr, time_t value); + +int pcmk__xe_get_timeval(const xmlNode *xml, const char *sec_attr, + const char *usec_attr, struct timeval *dest); +void pcmk__xe_set_timeval(xmlNode *xml, const char *sec_attr, + const char *usec_attr, const struct timeval *value); + void pcmk__xe_set_bool_attr(xmlNodePtr node, const char *name, bool value); int pcmk__xe_get_bool_attr(const xmlNode *node, const char *name, bool *value); bool pcmk__xe_attr_is_true(const xmlNode *node, const char *name); +/*! + * \internal + * \brief Retrieve a copy of the value of an XML attribute + * + * This is like \c pcmk__xe_get() but allocates new memory for the result. + * + * \param[in] xml XML element whose attribute to get + * \param[in] attr Attribute name + * + * \return Value of specified attribute (or \c NULL if not set) + * + * \note The caller is responsible for freeing the result using \c free(). + */ +static inline char * +pcmk__xe_get_copy(const xmlNode *xml, const char *attr) +{ + return pcmk__str_copy(pcmk__xe_get(xml, attr)); +} + +/*! + * \internal + * \brief Retrieve the value of the \c PCMK_XA_ID XML attribute + * + * \param[in] xml XML element to check + * + * \return Value of the \c PCMK_XA_ID attribute (may be \c NULL) + */ +static inline const char * +pcmk__xe_id(const xmlNode *xml) +{ + return pcmk__xe_get(xml, PCMK_XA_ID); +} + #ifdef __cplusplus } #endif diff --git a/include/crm/common/xml_internal.h b/include/crm/common/xml_internal.h index 4245985a744..a3b455cc0df 100644 --- a/include/crm/common/xml_internal.h +++ b/include/crm/common/xml_internal.h @@ -347,31 +347,85 @@ void pcmk__xml_sanitize_id(char *id); /* internal XML-related utilities */ -enum xml_private_flags { - pcmk__xf_none = 0x0000, - pcmk__xf_dirty = 0x0001, - pcmk__xf_deleted = 0x0002, - pcmk__xf_created = 0x0004, - pcmk__xf_modified = 0x0008, - - pcmk__xf_tracking = 0x0010, - pcmk__xf_processed = 0x0020, - pcmk__xf_skip = 0x0040, - pcmk__xf_moved = 0x0080, - - pcmk__xf_acl_enabled = 0x0100, - pcmk__xf_acl_read = 0x0200, - pcmk__xf_acl_write = 0x0400, - pcmk__xf_acl_deny = 0x0800, - - pcmk__xf_acl_create = 0x1000, - pcmk__xf_acl_denied = 0x2000, - pcmk__xf_lazy = 0x4000, +/*! + * \internal + * \brief Flags related to XML change tracking and ACLs + */ +enum pcmk__xml_flags { + //! This flag has no effect + pcmk__xf_none = UINT32_C(0), + + /*! + * Node was created or modified, or one of its descendants was created, + * modified, moved, or deleted. + */ + pcmk__xf_dirty = (UINT32_C(1) << 0), + + //! Node was deleted (set for attribute only) + pcmk__xf_deleted = (UINT32_C(1) << 1), + + //! Node was created + pcmk__xf_created = (UINT32_C(1) << 2), + + //! Node was modified + pcmk__xf_modified = (UINT32_C(1) << 3), + + /*! + * \brief Tracking is enabled (set for document only) + * + * Call \c pcmk__xml_commit_changes() before setting this flag if a clean + * start for tracking is needed. + */ + pcmk__xf_tracking = (UINT32_C(1) << 4), + + //! Skip counting this node when getting a node's position among siblings + pcmk__xf_skip = (UINT32_C(1) << 6), + + //! Node was moved + pcmk__xf_moved = (UINT32_C(1) << 7), + + //! ACLs are enabled (set for document only) + pcmk__xf_acl_enabled = (UINT32_C(1) << 8), + + /* @TODO Consider splitting the ACL permission flags (pcmk__xf_acl_read, + * pcmk__xf_acl_write, pcmk__xf_acl_write, and pcmk__xf_acl_create) into a + * separate enum and reserving this enum for tracking-related flags. + * + * The ACL permission flags have various meanings in different contexts (for + * example, what permission an ACL grants or denies; what permissions the + * current ACL user has for a given XML node; and possibly others). And + * for xml_acl_t objects, they're used in exclusive mode (exactly one is + * set), rather than as flags. + */ + + //! ACL read permission + pcmk__xf_acl_read = (UINT32_C(1) << 9), + + //! ACL write permission (implies read permission in most or all contexts) + pcmk__xf_acl_write = (UINT32_C(1) << 10), + + //! ACL deny permission (that is, no permission) + pcmk__xf_acl_deny = (UINT32_C(1) << 11), + + /*! + * ACL create permission for attributes (if attribute exists, this is mapped + * to \c pcmk__xf_acl_write) + */ + pcmk__xf_acl_create = (UINT32_C(1) << 12), + + //! ACLs deny the user access (set for document only) + pcmk__xf_acl_denied = (UINT32_C(1) << 13), + + //! Ignore attribute moves within an element (set for document only) + pcmk__xf_ignore_attr_pos = (UINT32_C(1) << 14), }; void pcmk__xml_doc_set_flags(xmlDoc *doc, uint32_t flags); bool pcmk__xml_doc_all_flags_set(const xmlDoc *xml, uint32_t flags); +void pcmk__xml_commit_changes(xmlDoc *doc); +void pcmk__xml_mark_changes(xmlNode *old_xml, xmlNode *new_xml); + bool pcmk__xml_tree_foreach(xmlNode *xml, bool (*fn)(xmlNode *, void *), void *user_data); @@ -382,17 +436,10 @@ pcmk__xml_attr_value(const xmlAttr *attr) : (const char *) attr->children->content; } -/*! - * \internal - * \brief Check whether a given CIB element was modified in a CIB patchset - * - * \param[in] patchset CIB XML patchset - * \param[in] element XML tag of CIB element to check (\c NULL is equivalent - * to \c PCMK_XE_CIB). Supported values include any CIB - * element supported by \c pcmk__cib_abs_xpath_for(). - * - * \return \c true if \p element was modified, or \c false otherwise - */ +void pcmk__xml_patchset_add_digest(xmlNode *patchset, const xmlNode *target); +int pcmk__xml_patchset_versions(const xmlNode *patchset, int source[3], + int target[3]); + bool pcmk__cib_element_in_patchset(const xmlNode *patchset, const char *element); diff --git a/include/crm/common/xml_io.h b/include/crm/common/xml_io.h index b90ba88f826..c8dbfd06086 100644 --- a/include/crm/common/xml_io.h +++ b/include/crm/common/xml_io.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,8 +10,6 @@ #ifndef PCMK__CRM_COMMON_XML_IO__H #define PCMK__CRM_COMMON_XML_IO__H -#include // xmlNode - #ifdef __cplusplus extern "C" { #endif @@ -22,20 +20,9 @@ extern "C" { * \ingroup core */ -/* Define compression parameters for IPC messages - * - * Compression costs a LOT, so we don't want to do it unless we're hitting - * message limits. Currently, we use 128KB as the threshold, because higher - * values don't play well with the heartbeat stack. With an earlier limit of - * 10KB, compressing 184 of 1071 messages accounted for 23% of the total CPU - * used by the cib. - */ -#define CRM_BZ2_BLOCKS 4 -#define CRM_BZ2_WORK 20 -#define CRM_BZ2_THRESHOLD (128 * 1024) - -void save_xml_to_file(const xmlNode *xml, const char *desc, - const char *filename); +#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) +#include +#endif #ifdef __cplusplus } diff --git a/include/crm/common/xml_io_compat.h b/include/crm/common/xml_io_compat.h new file mode 100644 index 00000000000..b4154697341 --- /dev/null +++ b/include/crm/common/xml_io_compat.h @@ -0,0 +1,44 @@ +/* + * Copyright 2004-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU Lesser General Public License + * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. + */ + +#ifndef PCMK__CRM_COMMON_XML_IO_COMPAT__H +#define PCMK__CRM_COMMON_XML_IO_COMPAT__H + +#include // xmlNode + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file + * \brief Deprecated Pacemaker XML I/O API + * \ingroup core + * \deprecated Do not include this header directly. The XML APIs in this header, + * and the header itself, will be removed in a future release. + */ + +//! \deprecated Do not use +#define CRM_BZ2_BLOCKS 4 + +//! \deprecated Do not use +#define CRM_BZ2_WORK 20 + +//! \deprecated Do not use +#define CRM_BZ2_THRESHOLD (128 * 1024) + +//! \deprecated Do not use +void save_xml_to_file(const xmlNode *xml, const char *desc, + const char *filename); + +#ifdef __cplusplus +} +#endif + +#endif // PCMK__CRM_COMMON_XML_IO_COMPAT__H diff --git a/include/crm/common/xml_io_internal.h b/include/crm/common/xml_io_internal.h index ddce11463cd..2e1feab1277 100644 --- a/include/crm/common/xml_io_internal.h +++ b/include/crm/common/xml_io_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2017-2024 the Pacemaker project contributors + * Copyright 2017-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -34,6 +34,8 @@ int pcmk__xml2fd(int fd, xmlNode *cur); int pcmk__xml_write_fd(const xmlNode *xml, const char *filename, int fd); int pcmk__xml_write_file(const xmlNode *xml, const char *filename, bool compress); +void pcmk__xml_write_temp_file(const xmlNode *xml, const char *desc, + const char *filename); #ifdef __cplusplus } diff --git a/include/crm/fencing/internal.h b/include/crm/fencing/internal.h index d46dab7ab9a..8af9417bb0f 100644 --- a/include/crm/fencing/internal.h +++ b/include/crm/fencing/internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2011-2024 the Pacemaker project contributors + * Copyright 2011-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,7 @@ #include #include #include +#include // PCMK__LOG_TRACE #include #include #include @@ -31,25 +32,27 @@ enum st_device_flags { st_device_supports_on = (1 << 5), }; -#define stonith__set_device_flags(device_flags, device_id, flags_to_set) do { \ - device_flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Fence device", device_id, \ - (device_flags), (flags_to_set), \ - #flags_to_set); \ +#define stonith__set_device_flags(device_flags, device_id, flags_to_set) do { \ + device_flags = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, \ + "Fence device", device_id, \ + (device_flags), (flags_to_set), \ + #flags_to_set); \ } while (0) -#define stonith__set_call_options(st_call_opts, call_for, flags_to_set) do { \ - st_call_opts = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Fencer call", (call_for), \ - (st_call_opts), (flags_to_set), \ - #flags_to_set); \ +#define stonith__set_call_options(st_call_opts, call_for, flags_to_set) do { \ + st_call_opts = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, \ + "Fencer call", (call_for), \ + (st_call_opts), (flags_to_set), \ + #flags_to_set); \ } while (0) -#define stonith__clear_call_options(st_call_opts, call_for, flags_to_clear) do { \ - st_call_opts = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Fencer call", (call_for), \ - (st_call_opts), (flags_to_clear), \ - #flags_to_clear); \ +#define stonith__clear_call_options(st_call_opts, call_for, \ + flags_to_clear) do { \ + st_call_opts = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Fencer call", \ + (call_for), (st_call_opts), \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) struct stonith_action_s; diff --git a/include/crm/lrmd.h b/include/crm/lrmd.h index 4c1f8eed1ee..5d666fd0223 100644 --- a/include/crm/lrmd.h +++ b/include/crm/lrmd.h @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the Pacemaker project contributors + * Copyright 2012-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -16,6 +16,8 @@ #include #include +#include // pcmk__compare_versions() + #ifdef __cplusplus extern "C" { #endif @@ -43,7 +45,7 @@ typedef struct lrmd_key_value_s { */ #define LRMD_PROTOCOL_VERSION "1.2" -#define LRMD_SUPPORTS_SCHEMA_XFER(x) (compare_version((x), "1.2") >= 0) +#define LRMD_SUPPORTS_SCHEMA_XFER(x) (pcmk__compare_versions((x), "1.2") >= 0) /* The major protocol version the client and server both need to support for * the connection to be successful. This should only ever be the major diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h index 1417912c058..adb5dd93ece 100644 --- a/include/crm/pengine/internal.h +++ b/include/crm/pengine/internal.h @@ -17,6 +17,7 @@ #include #include #include +#include // pcmk__parse_health_strategy() #include #include #include diff --git a/include/crm/pengine/status.h b/include/crm/pengine/status.h index 4d894dc96ed..8d7722c72b0 100644 --- a/include/crm/pengine/status.h +++ b/include/crm/pengine/status.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,7 +12,6 @@ # include // gboolean # include // bool -# include // pcmk_is_set() # include # include // pcmk_node_t, pcmk_resource_t, etc. # include diff --git a/include/crm/pengine/status_compat.h b/include/crm/pengine/status_compat.h index af45129d2d4..e0a685bedc6 100644 --- a/include/crm/pengine/status_compat.h +++ b/include/crm/pengine/status_compat.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,7 +11,6 @@ #define PCMK__CRM_PENGINE_STATUS_COMPAT__H #include // bool -#include // pcmk_is_set() #include // pcmk_resource_t, pcmk__rsc_unique, etc. #ifdef __cplusplus diff --git a/include/crm_internal.h b/include/crm_internal.h index 891f2e5b686..8577d1ca815 100644 --- a/include/crm_internal.h +++ b/include/crm_internal.h @@ -1,5 +1,5 @@ /* - * Copyright 2006-2024 the Pacemaker project contributors + * Copyright 2006-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -38,17 +38,48 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include #include #include +#include #include +#include +#include +#include +#include #include -#include #include #include diff --git a/include/pcmki/pcmki_ticket.h b/include/pcmki/pcmki_ticket.h index 34d779a2d7b..474378cc2df 100644 --- a/include/pcmki/pcmki_ticket.h +++ b/include/pcmki/pcmki_ticket.h @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,7 +10,10 @@ #ifndef PCMK__PCMKI_PCMKI_TICKET__H #define PCMK__PCMKI_PCMKI_TICKET__H -#include +#include // bool + +#include // pcmk__output_t +#include // pcmk_scheduler_t #include diff --git a/include/pcmki/pcmki_transition.h b/include/pcmki/pcmki_transition.h index 63ac6392817..27e5e58b807 100644 --- a/include/pcmki/pcmki_transition.h +++ b/include/pcmki/pcmki_transition.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -16,6 +16,7 @@ #include // guint, GList, GHashTable #include // xmlNode +#include // PCMK__LOG_TRACE #include // pcmk_scheduler_t #include // lrmd_event_data_t @@ -50,18 +51,21 @@ typedef struct { GList *inputs; /* pcmk__graph_action_t* */ } pcmk__graph_synapse_t; -#define pcmk__set_synapse_flags(synapse, flags_to_set) do { \ - (synapse)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ - "Synapse", "synapse", \ - (synapse)->flags, (flags_to_set), #flags_to_set); \ +#define pcmk__set_synapse_flags(synapse, flags_to_set) do { \ + (synapse)->flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Synapse", \ + "synapse", (synapse)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) -#define pcmk__clear_synapse_flags(synapse, flags_to_clear) do { \ - (synapse)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ - "Synapse", "synapse", \ - (synapse)->flags, (flags_to_clear), #flags_to_clear); \ +#define pcmk__clear_synapse_flags(synapse, flags_to_clear) do { \ + (synapse)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Synapse", \ + "synapse", \ + (synapse)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) enum pcmk__graph_action_flags { @@ -86,18 +90,20 @@ typedef struct { } pcmk__graph_action_t; -#define pcmk__set_graph_action_flags(action, flags_to_set) do { \ - (action)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ - "Action", "action", \ - (action)->flags, (flags_to_set), #flags_to_set); \ +#define pcmk__set_graph_action_flags(action, flags_to_set) do { \ + (action)->flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Action", \ + "action", (action)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) -#define pcmk__clear_graph_action_flags(action, flags_to_clear) do { \ - (action)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ - "Action", "action", \ - (action)->flags, (flags_to_clear), #flags_to_clear); \ +#define pcmk__clear_graph_action_flags(action, flags_to_clear) do { \ + (action)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Action", \ + "action", (action)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) // What to do after finished processing a transition graph diff --git a/lib/cib/cib_attrs.c b/lib/cib/cib_attrs.c index f0c8e52b589..31ec789cb50 100644 --- a/lib/cib/cib_attrs.c +++ b/lib/cib/cib_attrs.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -22,6 +22,7 @@ #include #include +#include // crm_create_nvpair_xml() #include #include #include @@ -42,7 +43,7 @@ new_output_object(const char *ty) pcmk__register_formats(NULL, formats); rc = pcmk__output_new(&out, ty, NULL, (char**)argv); if ((rc != pcmk_rc_ok) || (out == NULL)) { - crm_err("Can't out due to internal error: %s", pcmk_rc_str(rc)); + pcmk__err("Can't out due to internal error: %s", pcmk_rc_str(rc)); return NULL; } @@ -89,7 +90,7 @@ find_attr(cib_t *cib, const char *section, const char *node_uuid, xpath_base = pcmk_cib_xpath_for(section); if (xpath_base == NULL) { - crm_warn("%s CIB section not known", section); + pcmk__warn("%s CIB section not known", section); return ENOMSG; } @@ -136,12 +137,12 @@ find_attr(cib_t *cib, const char *section, const char *node_uuid, rc = pcmk_legacy2rc(rc); if (rc != pcmk_rc_ok) { - crm_trace("Query failed for attribute %s (section=%s, node=%s, set=%s, xpath=%s): %s", - attr_name, section, pcmk__s(node_uuid, ""), - pcmk__s(set_name, ""), (const char *) xpath->str, - pcmk_rc_str(rc)); + pcmk__trace("Query failed for attribute %s (section=%s, node=%s, " + "set=%s, xpath=%s): %s", + attr_name, section, pcmk__s(node_uuid, ""), + pcmk__s(set_name, ""), xpath->str, pcmk_rc_str(rc)); } else { - crm_log_xml_debug(xml_search, "Match"); + pcmk__log_xml_debug(xml_search, "Match"); } g_string_free(xpath, TRUE); @@ -187,7 +188,7 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c pcmk__xml_free(xml_search); return ENOTUNIQ; } else { - local_attr_id = crm_element_value_copy(xml_search, PCMK_XA_ID); + local_attr_id = pcmk__xe_get_copy(xml_search, PCMK_XA_ID); attr_id = local_attr_id; pcmk__xml_free(xml_search); goto do_modify; @@ -202,7 +203,7 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c } else { pcmk__xml_free(xml_search); - crm_trace("%s does not exist, create it", attr_name); + pcmk__trace("%s does not exist, create it", attr_name); if (pcmk__str_eq(section, PCMK_XE_TICKETS, pcmk__str_casei)) { node_uuid = NULL; section = PCMK_XE_STATUS; @@ -220,9 +221,9 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c if (pcmk__str_eq(node_type, PCMK_VALUE_REMOTE, pcmk__str_casei)) { xml_top = pcmk__xe_create(xml_obj, PCMK_XE_NODES); xml_obj = pcmk__xe_create(xml_top, PCMK_XE_NODE); - crm_xml_add(xml_obj, PCMK_XA_TYPE, PCMK_VALUE_REMOTE); - crm_xml_add(xml_obj, PCMK_XA_ID, node_uuid); - crm_xml_add(xml_obj, PCMK_XA_UNAME, node_uuid); + pcmk__xe_set(xml_obj, PCMK_XA_TYPE, PCMK_VALUE_REMOTE); + pcmk__xe_set(xml_obj, PCMK_XA_ID, node_uuid); + pcmk__xe_set(xml_obj, PCMK_XA_UNAME, node_uuid); } else { tag = PCMK_XE_NODE; } @@ -234,7 +235,7 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c } xml_top = pcmk__xe_create(xml_obj, PCMK__XE_NODE_STATE); - crm_xml_add(xml_top, PCMK_XA_ID, node_uuid); + pcmk__xe_set(xml_top, PCMK_XA_ID, node_uuid); xml_obj = xml_top; } else { @@ -249,27 +250,29 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c } else if (pcmk__str_eq(node_type, PCMK_XE_TICKETS, pcmk__str_casei)) { - local_set_name = crm_strdup_printf("%s-%s", section, - PCMK_XE_TICKETS); + local_set_name = pcmk__assert_asprintf("%s-%s", section, + PCMK_XE_TICKETS); } else if (node_uuid) { - local_set_name = crm_strdup_printf("%s-%s", section, node_uuid); + local_set_name = pcmk__assert_asprintf("%s-%s", section, + node_uuid); if (set_type) { char *tmp_set_name = local_set_name; - local_set_name = crm_strdup_printf("%s-%s", tmp_set_name, - set_type); + local_set_name = pcmk__assert_asprintf("%s-%s", + tmp_set_name, + set_type); free(tmp_set_name); } } else { - local_set_name = crm_strdup_printf("%s-options", section); + local_set_name = pcmk__assert_asprintf("%s-options", section); } set_name = local_set_name; } if (attr_id == NULL) { - local_attr_id = crm_strdup_printf("%s-%s", set_name, attr_name); + local_attr_id = pcmk__assert_asprintf("%s-%s", set_name, attr_name); pcmk__xml_sanitize_id(local_attr_id); attr_id = local_attr_id; @@ -277,10 +280,10 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c attr_name = attr_id; } - crm_trace("Creating %s/%s", section, tag); + pcmk__trace("Creating %s/%s", section, tag); if (tag != NULL) { xml_obj = pcmk__xe_create(xml_obj, tag); - crm_xml_add(xml_obj, PCMK_XA_ID, node_uuid); + pcmk__xe_set(xml_obj, PCMK_XA_ID, node_uuid); if (xml_top == NULL) { xml_top = xml_obj; } @@ -302,7 +305,7 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c } else { xml_obj = pcmk__xe_create(xml_obj, PCMK_XE_INSTANCE_ATTRIBUTES); } - crm_xml_add(xml_obj, PCMK_XA_ID, set_name); + pcmk__xe_set(xml_obj, PCMK_XA_ID, set_name); if (xml_top == NULL) { xml_top = xml_obj; @@ -315,11 +318,11 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c xml_top = xml_obj; } - crm_log_xml_trace(xml_top, "update_attr"); + pcmk__log_xml_trace(xml_top, "update_attr"); rc = cib_internal_op(cib, PCMK__CIB_REQUEST_MODIFY, NULL, section, xml_top, NULL, call_options, user_name); - if (!pcmk_is_set(call_options, cib_sync_call) && (cib->variant != cib_file) + if (!pcmk__is_set(call_options, cib_sync_call) && (cib->variant != cib_file) && (rc >= 0)) { // For async call, positive rc is the call ID (file always synchronous) rc = pcmk_rc_ok; @@ -331,7 +334,7 @@ cib__update_node_attr(pcmk__output_t *out, cib_t *cib, int call_options, const c out->err(out, "Error setting %s=%s (section=%s, set=%s): %s", attr_name, attr_value, section, pcmk__s(set_name, ""), pcmk_rc_str(rc)); - crm_log_xml_info(xml_top, "Update"); + pcmk__log_xml_info(xml_top, "Update"); } free(local_set_name); @@ -358,10 +361,11 @@ cib__get_node_attrs(pcmk__output_t *out, cib_t *cib, const char *section, user_name, result); if (rc != pcmk_rc_ok) { - crm_trace("Query failed for attribute %s (section=%s node=%s set=%s): %s", - pcmk__s(attr_name, "with unspecified name"), - section, pcmk__s(set_name, ""), - pcmk__s(node_uuid, ""), pcmk_rc_str(rc)); + pcmk__trace("Query failed for attribute %s (section=%s node=%s " + "set=%s): %s", + pcmk__s(attr_name, "with unspecified name"), section, + pcmk__s(set_name, ""), pcmk__s(node_uuid, ""), + pcmk_rc_str(rc)); } return rc; @@ -389,7 +393,7 @@ cib__delete_node_attr(pcmk__output_t *out, cib_t *cib, int options, const char * pcmk__xml_free(xml_search); return rc; } else { - local_attr_id = crm_element_value_copy(xml_search, PCMK_XA_ID); + local_attr_id = pcmk__xe_get_copy(xml_search, PCMK_XA_ID); attr_id = local_attr_id; pcmk__xml_free(xml_search); } @@ -400,7 +404,7 @@ cib__delete_node_attr(pcmk__output_t *out, cib_t *cib, int options, const char * rc = cib_internal_op(cib, PCMK__CIB_REQUEST_DELETE, NULL, section, xml_obj, NULL, options, user_name); - if (!pcmk_is_set(options, cib_sync_call) && (cib->variant != cib_file) + if (!pcmk__is_set(options, cib_sync_call) && (cib->variant != cib_file) && (rc >= 0)) { // For async call, positive rc is the call ID (file always synchronous) rc = pcmk_rc_ok; @@ -441,7 +445,7 @@ find_nvpair_attr_delegate(cib_t *cib, const char *attr, const char *section, rc = handle_multiples(out, xml_search, attr_name); if (rc == pcmk_rc_ok) { - pcmk__str_update(value, crm_element_value(xml_search, attr)); + pcmk__str_update(value, pcmk__xe_get(xml_search, attr)); } } @@ -494,8 +498,7 @@ read_attr_delegate(cib_t *cib, const char *section, const char *node_uuid, if (rc == pcmk_rc_ok) { if (result->children == NULL) { - pcmk__str_update(attr_value, - crm_element_value(result, PCMK_XA_VALUE)); + pcmk__str_update(attr_value, pcmk__xe_get(result, PCMK_XA_VALUE)); } else { rc = ENOTUNIQ; } @@ -559,9 +562,9 @@ get_uuid_from_result(const xmlNode *result, char **uuid, int *is_remote) if (pcmk__xe_is(result, PCMK_XE_NODE)) { // Result is PCMK_XE_NODE element from PCMK_XE_NODES section - if (pcmk__str_eq(crm_element_value(result, PCMK_XA_TYPE), - PCMK_VALUE_REMOTE, pcmk__str_casei)) { - parsed_uuid = crm_element_value(result, PCMK_XA_UNAME); + if (pcmk__str_eq(pcmk__xe_get(result, PCMK_XA_TYPE), PCMK_VALUE_REMOTE, + pcmk__str_casei)) { + parsed_uuid = pcmk__xe_get(result, PCMK_XA_UNAME); parsed_is_remote = TRUE; } else { parsed_uuid = pcmk__xe_id(result); @@ -579,13 +582,13 @@ get_uuid_from_result(const xmlNode *result, char **uuid, int *is_remote) * node */ - parsed_uuid = crm_element_value(result, PCMK_XA_VALUE); + parsed_uuid = pcmk__xe_get(result, PCMK_XA_VALUE); parsed_is_remote = TRUE; } else if (pcmk__xe_is(result, PCMK__XE_NODE_STATE)) { // Result is PCMK__XE_NODE_STATE element from PCMK_XE_STATUS section - parsed_uuid = crm_element_value(result, PCMK_XA_UNAME); + parsed_uuid = pcmk__xe_get(result, PCMK_XA_UNAME); if (pcmk__xe_attr_is_true(result, PCMK_XA_REMOTE_NODE)) { parsed_is_remote = TRUE; } @@ -643,7 +646,9 @@ query_node_uuid(cib_t * the_cib, const char *uname, char **uuid, int *is_remote_ *is_remote_node = FALSE; } - xpath_string = crm_strdup_printf(XPATH_NODE, host_lowercase, host_lowercase, host_lowercase, host_lowercase); + xpath_string = pcmk__assert_asprintf(XPATH_NODE, host_lowercase, + host_lowercase, host_lowercase, + host_lowercase); if (cib_internal_op(the_cib, PCMK__CIB_REQUEST_QUERY, NULL, xpath_string, NULL, &xml_search, cib_sync_call|cib_xpath, NULL) == pcmk_ok) { @@ -656,10 +661,11 @@ query_node_uuid(cib_t * the_cib, const char *uname, char **uuid, int *is_remote_ g_free(host_lowercase); if (rc != pcmk_ok) { - crm_debug("Could not map node name '%s' to a UUID: %s", - uname, pcmk_strerror(rc)); + pcmk__debug("Could not map node name '%s' to a UUID: %s", uname, + pcmk_strerror(rc)); } else { - crm_info("Mapped node name '%s' to UUID %s", uname, (uuid? *uuid : "")); + pcmk__info("Mapped node name '%s' to UUID %s", uname, + ((uuid != NULL)? *uuid : "")); } return rc; } diff --git a/lib/cib/cib_client.c b/lib/cib/cib_client.c index 5cbbb141c04..5310ffa1745 100644 --- a/lib/cib/cib_client.c +++ b/lib/cib/cib_client.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -39,12 +39,12 @@ ciblib_GCompareFunc(gconstpointer a, gconstpointer b) if (a_client->callback == b_client->callback) { return 0; } else if (((long)a_client->callback) < ((long)b_client->callback)) { - crm_trace("callbacks for %s are not equal: %p < %p", - a_client->event, a_client->callback, b_client->callback); + pcmk__trace("callbacks for %s are not equal: %p < %p", + a_client->event, a_client->callback, b_client->callback); return -1; } - crm_trace("callbacks for %s are not equal: %p > %p", - a_client->event, a_client->callback, b_client->callback); + pcmk__trace("callbacks for %s are not equal: %p > %p", a_client->event, + a_client->callback, b_client->callback); return 1; } return rc; @@ -62,8 +62,8 @@ cib_client_add_notify_callback(cib_t * cib, const char *event, return -EPROTONOSUPPORT; } - crm_trace("Adding callback for %s events (%d)", - event, g_list_length(cib->notify_list)); + pcmk__trace("Adding callback for %s events (%u)", event, + g_list_length(cib->notify_list)); new_client = pcmk__assert_alloc(1, sizeof(cib_notify_client_t)); new_client->event = event; @@ -73,7 +73,7 @@ cib_client_add_notify_callback(cib_t * cib, const char *event, ciblib_GCompareFunc); if (list_item != NULL) { - crm_warn("Callback already present"); + pcmk__warn("Callback already present"); free(new_client); return -EINVAL; @@ -82,7 +82,7 @@ cib_client_add_notify_callback(cib_t * cib, const char *event, cib->cmds->register_notification(cib, event, 1); - crm_trace("Callback added (%d)", g_list_length(cib->notify_list)); + pcmk__trace("Callback added (%d)", g_list_length(cib->notify_list)); } return pcmk_ok; } @@ -100,7 +100,7 @@ get_notify_list_event_count(cib_t *cib, const char *event) count++; } } - crm_trace("event(%s) count : %d", event, count); + pcmk__trace("event(%s) count : %d", event, count); return count; } @@ -117,11 +117,11 @@ cib_client_del_notify_callback(cib_t *cib, const char *event, } if (get_notify_list_event_count(cib, event) == 0) { - crm_debug("The callback of the event does not exist(%s)", event); + pcmk__debug("The callback of the event does not exist(%s)", event); return pcmk_ok; } - crm_debug("Removing callback for %s events", event); + pcmk__debug("Removing callback for %s events", event); new_client = pcmk__assert_alloc(1, sizeof(cib_notify_client_t)); new_client->event = event; @@ -135,10 +135,10 @@ cib_client_del_notify_callback(cib_t *cib, const char *event, cib->notify_list = g_list_remove(cib->notify_list, list_client); free(list_client); - crm_trace("Removed callback"); + pcmk__trace("Removed callback"); } else { - crm_trace("Callback not present"); + pcmk__trace("Callback not present"); } if (get_notify_list_event_count(cib, event) == 0) { @@ -155,8 +155,8 @@ cib_async_timeout_handler(gpointer data) { struct timer_rec_s *timer = data; - crm_debug("Async call %d timed out after %ds", - timer->call_id, timer->timeout); + pcmk__debug("Async call %d timed out after %ds", timer->call_id, + timer->timeout); cib_native_callback(timer->cib, NULL, timer->call_id, -ETIME); // We remove the handler in remove_cib_op_callback() @@ -177,7 +177,7 @@ cib_client_register_callback_full(cib_t *cib, int call_id, int timeout, if (only_success == FALSE) { callback(NULL, call_id, call_id, NULL, user_data); } else { - crm_warn("CIB call failed: %s", pcmk_strerror(call_id)); + pcmk__warn("CIB call failed: %s", pcmk_strerror(call_id)); } if (user_data && free_func) { free_func(user_data); @@ -206,7 +206,7 @@ cib_client_register_callback_full(cib_t *cib, int call_id, int timeout, async_timer); } - crm_trace("Adding callback %s for call %d", callback_name, call_id); + pcmk__trace("Adding callback %s for call %d", callback_name, call_id); pcmk__intkey_table_insert(cib_op_callback_table, call_id, blob); return TRUE; @@ -350,8 +350,8 @@ cib_client_init_transaction(cib_t *cib) const char *client_id = NULL; cib->cmds->client_id(cib, NULL, &client_id); - crm_err("Failed to initialize CIB transaction for client %s: %s", - client_id, pcmk_rc_str(rc)); + pcmk__err("Failed to initialize CIB transaction for client %s: %s", + client_id, pcmk_rc_str(rc)); } return pcmk_rc2legacy(rc); } @@ -373,8 +373,8 @@ cib_client_end_transaction(cib_t *cib, bool commit, int call_options) if (cib->transaction == NULL) { rc = pcmk_rc_no_transaction; - crm_err("Failed to commit transaction for CIB client %s: %s", - client_id, pcmk_rc_str(rc)); + pcmk__err("Failed to commit transaction for CIB client %s: %s", + client_id, pcmk_rc_str(rc)); return pcmk_rc2legacy(rc); } rc = cib_internal_op(cib, PCMK__CIB_REQUEST_COMMIT_TRANSACT, NULL, NULL, @@ -383,9 +383,9 @@ cib_client_end_transaction(cib_t *cib, bool commit, int call_options) } else { // Discard always succeeds if (cib->transaction != NULL) { - crm_trace("Discarded transaction for CIB client %s", client_id); + pcmk__trace("Discarded transaction for CIB client %s", client_id); } else { - crm_trace("No transaction found for CIB client %s", client_id); + pcmk__trace("No transaction found for CIB client %s", client_id); } } pcmk__xml_free(cib->transaction); @@ -400,7 +400,7 @@ cib_client_fetch_schemas(cib_t *cib, xmlNode **output_data, const char *after_ve xmlNode *data = pcmk__xe_create(NULL, PCMK__XA_SCHEMA); int rc = pcmk_ok; - crm_xml_add(data, PCMK_XA_VERSION, after_ver); + pcmk__xe_set(data, PCMK_XA_VERSION, after_ver); rc = cib_internal_op(cib, PCMK__CIB_REQUEST_SCHEMAS, NULL, NULL, data, output_data, call_options, NULL); @@ -445,7 +445,7 @@ get_shadow_file(const char *suffix) { char *cib_home = NULL; char *fullname = NULL; - char *name = crm_strdup_printf("shadow.%s", suffix); + char *name = pcmk__assert_asprintf("shadow.%s", suffix); const char *dir = getenv("CIB_shadow_dir"); if (dir == NULL) { @@ -478,7 +478,7 @@ get_shadow_file(const char *suffix) if (home && home[0] == '/') { int rc = 0; - cib_home = crm_strdup_printf("%s/.cib", home); + cib_home = pcmk__assert_asprintf("%s/.cib", home); rc = mkdir(cib_home, 0700); if (rc < 0 && errno != EEXIST) { @@ -493,7 +493,7 @@ get_shadow_file(const char *suffix) } } - fullname = crm_strdup_printf("%s/%s", dir, name); + fullname = pcmk__assert_asprintf("%s/%s", dir, name); free(cib_home); free(name); @@ -588,7 +588,7 @@ cib_new(void) */ pcmk__scan_port(value, &port); - if (!crm_is_true(getenv("CIB_encrypted"))) { + if (!pcmk__is_true(getenv("CIB_encrypted"))) { encrypted = FALSE; } @@ -604,8 +604,8 @@ cib_new(void) server = "localhost"; } - crm_debug("Initializing %s remote CIB access to %s:%d as user %s", - (encrypted? "encrypted" : "plain-text"), server, port, user); + pcmk__debug("Initializing %s remote CIB access to %s:%d as user %s", + (encrypted? "encrypted" : "plain-text"), server, port, user); return cib_remote_new(server, user, pass, port, encrypted); } @@ -752,7 +752,7 @@ cib_dump_pending_op(gpointer key, gpointer value, gpointer user_data) int call = GPOINTER_TO_INT(key); cib_callback_client_t *blob = value; - crm_debug("Call %d (%s): pending", call, pcmk__s(blob->id, "without ID")); + pcmk__debug("Call %d (%s): pending", call, pcmk__s(blob->id, "without ID")); } void diff --git a/lib/cib/cib_file.c b/lib/cib/cib_file.c index 9cfa14c7b17..850581575bc 100644 --- a/lib/cib/cib_file.c +++ b/lib/cib/cib_file.c @@ -1,6 +1,6 @@ /* * Original copyright 2004 International Business Machines - * Later changes copyright 2008-2024 the Pacemaker project contributors + * Later changes copyright 2008-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -139,22 +139,23 @@ static uid_t cib_file_owner = 0; static uid_t cib_file_group = 0; static gboolean cib_do_chown = FALSE; -#define cib_set_file_flags(cibfile, flags_to_set) do { \ - (cibfile)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "CIB file", \ - cibfile->filename, \ - (cibfile)->flags, \ - (flags_to_set), \ - #flags_to_set); \ +#define cib_set_file_flags(cibfile, flags_to_set) do { \ + (cibfile)->flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "CIB file", \ + cibfile->filename, \ + (cibfile)->flags, \ + (flags_to_set), \ + #flags_to_set); \ } while (0) -#define cib_clear_file_flags(cibfile, flags_to_clear) do { \ - (cibfile)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "CIB file", \ - cibfile->filename, \ - (cibfile)->flags, \ - (flags_to_clear), \ - #flags_to_clear); \ +#define cib_clear_file_flags(cibfile, flags_to_clear) do { \ + (cibfile)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, \ + "CIB file", \ + cibfile->filename, \ + (cibfile)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) /*! @@ -218,8 +219,8 @@ cib_file_process_request(cib_t *cib, xmlNode *request, xmlNode **output) int call_id = 0; uint32_t call_options = cib_none; - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); - const char *section = crm_element_value(request, PCMK__XA_CIB_SECTION); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); + const char *section = pcmk__xe_get(request, PCMK__XA_CIB_SECTION); xmlNode *wrapper = pcmk__xe_first_child(request, PCMK__XE_CIB_CALLDATA, NULL, NULL); xmlNode *data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); @@ -235,14 +236,14 @@ cib_file_process_request(cib_t *cib, xmlNode *request, xmlNode **output) cib__get_operation(op, &operation); op_function = file_get_op_function(operation); - crm_element_value_int(request, PCMK__XA_CIB_CALLID, &call_id); + pcmk__xe_get_int(request, PCMK__XA_CIB_CALLID, &call_id); rc = pcmk__xe_get_flags(request, PCMK__XA_CIB_CALLOPT, &call_options, cib_none); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse options from request: %s", pcmk_rc_str(rc)); } - read_only = !pcmk_is_set(operation->flags, cib__op_attr_modifies); + read_only = !pcmk__is_set(operation->flags, cib__op_attr_modifies); // Mirror the logic in prepare_input() in the CIB manager if ((section != NULL) && pcmk__xe_is(data, PCMK_XE_CIB)) { @@ -254,7 +255,7 @@ cib_file_process_request(cib_t *cib, xmlNode *request, xmlNode **output) request, data, true, &changed, &private->cib_xml, &result_cib, &cib_diff, output); - if (pcmk_is_set(call_options, cib_transaction)) { + if (pcmk__is_set(call_options, cib_transaction)) { /* The rest of the logic applies only to the transaction as a whole, not * to individual requests. */ @@ -296,9 +297,9 @@ cib_file_perform_op_delegate(cib_t *cib, const char *op, const char *host, const cib__operation_t *operation = NULL; - crm_info("Handling %s operation for %s as %s", - pcmk__s(op, "invalid"), pcmk__s(section, "entire CIB"), - pcmk__s(user_name, "default user")); + pcmk__info("Handling %s operation for %s as %s", + pcmk__s(op, "invalid"), pcmk__s(section, "entire CIB"), + pcmk__s(user_name, "default user")); if (output_data != NULL) { *output_data = NULL; @@ -317,7 +318,7 @@ cib_file_perform_op_delegate(cib_t *cib, const char *op, const char *host, if (file_get_op_function(operation) == NULL) { // @COMPAT: At compatibility break, use EOPNOTSUPP - crm_err("Operation %s is not supported by CIB file clients", op); + pcmk__err("Operation %s is not supported by CIB file clients", op); return -EPROTONOSUPPORT; } @@ -328,10 +329,10 @@ cib_file_perform_op_delegate(cib_t *cib, const char *op, const char *host, if (rc != pcmk_ok) { return rc; } - crm_xml_add(request, PCMK__XA_ACL_TARGET, user_name); - crm_xml_add(request, PCMK__XA_CIB_CLIENTID, private->id); + pcmk__xe_set(request, PCMK__XA_ACL_TARGET, user_name); + pcmk__xe_set(request, PCMK__XA_CIB_CLIENTID, private->id); - if (pcmk_is_set(call_options, cib_transaction)) { + if (pcmk__is_set(call_options, cib_transaction)) { rc = cib__extend_transaction(cib, request); goto done; } @@ -418,16 +419,17 @@ cib_file_signon(cib_t *cib, const char *name, enum cib_conn_type type) } if (rc == pcmk_ok) { - crm_debug("Opened connection to local file '%s' for %s", - private->filename, pcmk__s(name, "client")); + pcmk__debug("Opened connection to local file '%s' for %s", + private->filename, pcmk__s(name, "client")); cib->state = cib_connected_command; cib->type = cib_command; register_client(cib); } else { - crm_info("Connection to local file '%s' for %s (client %s) failed: %s", - private->filename, pcmk__s(name, "client"), private->id, - pcmk_strerror(rc)); + pcmk__info("Connection to local file '%s' for %s (client %s) failed: " + "%s", + private->filename, pcmk__s(name, "client"), private->id, + pcmk_strerror(rc)); } return rc; } @@ -444,17 +446,18 @@ cib_file_signon(cib_t *cib, const char *name, enum cib_conn_type type) static int cib_file_write_live(xmlNode *cib_root, char *path) { - uid_t uid = geteuid(); - struct passwd *daemon_pwent; + uid_t euid = geteuid(); + uid_t daemon_uid = 0; + gid_t daemon_gid = 0; char *sep = strrchr(path, '/'); const char *cib_dirname, *cib_filename; - int rc = 0; + int rc = pcmk_rc_ok; /* Get the desired uid/gid */ - errno = 0; - daemon_pwent = getpwnam(CRM_DAEMON_USER); - if (daemon_pwent == NULL) { - crm_perror(LOG_ERR, "Could not find %s user", CRM_DAEMON_USER); + rc = pcmk__daemon_user(&daemon_uid, &daemon_gid); + if (rc != pcmk_rc_ok) { + crm_perror(LOG_ERR, "Could not find user '" CRM_DAEMON_USER "': %s", + pcmk_rc_str(rc)); return -1; } @@ -462,9 +465,11 @@ cib_file_write_live(xmlNode *cib_root, char *path) * if we're daemon, anything we create will be OK; * otherwise, block access so we don't create wrong owner */ - if ((uid != 0) && (uid != daemon_pwent->pw_uid)) { - crm_perror(LOG_ERR, "Must be root or %s to modify live CIB", - CRM_DAEMON_USER); + if ((euid != 0) && (euid != daemon_uid)) { + crm_perror(LOG_ERR, + "Must be root or " CRM_DAEMON_USER " to modify live CIB"); + + // @TODO Should this return -1 instead? return 0; } @@ -485,9 +490,9 @@ cib_file_write_live(xmlNode *cib_root, char *path) } /* if we're root, we want to update the file ownership */ - if (uid == 0) { - cib_file_owner = daemon_pwent->pw_uid; - cib_file_group = daemon_pwent->pw_gid; + if (euid == 0) { + cib_file_owner = daemon_uid; + cib_file_group = daemon_gid; cib_do_chown = TRUE; } @@ -498,7 +503,7 @@ cib_file_write_live(xmlNode *cib_root, char *path) } /* turn off file ownership changes, for other callers */ - if (uid == 0) { + if (euid == 0) { cib_do_chown = FALSE; } @@ -529,17 +534,17 @@ cib_file_signoff(cib_t *cib) int rc = pcmk_ok; cib_file_opaque_t *private = cib->variant_opaque; - crm_debug("Disconnecting from the CIB manager"); + pcmk__debug("Disconnecting from the CIB manager"); cib->state = cib_disconnected; cib->type = cib_no_connection; unregister_client(cib); cib->cmds->end_transaction(cib, false, cib_none); /* If the in-memory CIB has been changed, write it to disk */ - if (pcmk_is_set(private->flags, cib_file_flag_dirty)) { + if (pcmk__is_set(private->flags, cib_file_flag_dirty)) { /* If this is the live CIB, write it out with a digest */ - if (pcmk_is_set(private->flags, cib_file_flag_live)) { + if (pcmk__is_set(private->flags, cib_file_flag_live)) { if (cib_file_write_live(private->cib_xml, private->filename) < 0) { rc = pcmk_err_generic; } @@ -555,10 +560,10 @@ cib_file_signoff(cib_t *cib) } if (rc == pcmk_ok) { - crm_info("Wrote CIB to %s", private->filename); + pcmk__info("Wrote CIB to %s", private->filename); cib_clear_file_flags(private, cib_file_flag_dirty); } else { - crm_err("Could not write CIB to %s", private->filename); + pcmk__err("Could not write CIB to %s", private->filename); } } @@ -667,7 +672,7 @@ cib_file_new(const char *cib_location) return NULL; } - private->id = crm_generate_uuid(); + private->id = pcmk__generate_uuid(); private->filename = filename; cib->variant = cib_file; @@ -676,7 +681,7 @@ cib_file_new(const char *cib_location) private->flags = 0; if (cib_file_is_live(cib_location)) { cib_set_file_flags(private, cib_file_flag_live); - crm_trace("File %s detected as live CIB", cib_location); + pcmk__trace("File %s detected as live CIB", cib_location); } /* assign variant specific ops */ @@ -711,16 +716,16 @@ cib_file_verify_digest(xmlNode *root, const char *sigfile) switch (rc) { case pcmk_rc_ok: if (expected == NULL) { - crm_err("On-disk digest at %s is empty", sigfile); + pcmk__err("On-disk digest at %s is empty", sigfile); return FALSE; } break; case ENOENT: - crm_warn("No on-disk digest present at %s", sigfile); + pcmk__warn("No on-disk digest present at %s", sigfile); return TRUE; default: - crm_err("Could not read on-disk digest from %s: %s", - sigfile, pcmk_rc_str(rc)); + pcmk__err("Could not read on-disk digest from %s: %s", sigfile, + pcmk_rc_str(rc)); return FALSE; } passed = pcmk__verify_digest(root, expected); @@ -762,20 +767,23 @@ cib_file_read_and_verify(const char *filename, const char *sigfile, xmlNode **ro crm_perror(LOG_WARNING, "Could not verify cluster configuration file %s", filename); return -errno; } else if (buf.st_size == 0) { - crm_warn("Cluster configuration file %s is corrupt (size is zero)", filename); + pcmk__warn("Cluster configuration file %s is corrupt (size is zero)", + filename); return -pcmk_err_cib_corrupt; } /* Parse XML */ local_root = pcmk__xml_read(filename); if (local_root == NULL) { - crm_warn("Cluster configuration file %s is corrupt (unparseable as XML)", filename); + pcmk__warn("Cluster configuration file %s is corrupt (unparseable as " + "XML)", + filename); return -pcmk_err_cib_corrupt; } /* If sigfile is not specified, use original file name plus .sig */ if (sigfile == NULL) { - sigfile = local_sigfile = crm_strdup_printf("%s.sig", filename); + sigfile = local_sigfile = pcmk__assert_asprintf("%s.sig", filename); } /* Verify that digests match */ @@ -808,8 +816,8 @@ cib_file_backup(const char *cib_dirname, const char *cib_filename) { int rc = 0; unsigned int seq = 0U; - char *cib_path = crm_strdup_printf("%s/%s", cib_dirname, cib_filename); - char *cib_digest = crm_strdup_printf("%s.sig", cib_path); + char *cib_path = pcmk__assert_asprintf("%s/%s", cib_dirname, cib_filename); + char *cib_digest = pcmk__assert_asprintf("%s.sig", cib_path); char *backup_path; char *backup_digest; @@ -821,7 +829,7 @@ cib_file_backup(const char *cib_dirname, const char *cib_filename) } backup_path = pcmk__series_filename(cib_dirname, CIB_SERIES, seq, CIB_SERIES_BZIP); - backup_digest = crm_strdup_printf("%s.sig", backup_path); + backup_digest = pcmk__assert_asprintf("%s.sig", backup_path); /* Remove the old backups if they exist */ unlink(backup_path); @@ -859,13 +867,13 @@ cib_file_backup(const char *cib_dirname, const char *cib_filename) rc2 = pcmk__chown_series_sequence(cib_dirname, CIB_SERIES, cib_file_owner, cib_file_group); if (rc2 != pcmk_rc_ok) { - crm_err("Could not set owner of sequence file in %s: %s", - cib_dirname, pcmk_rc_str(rc2)); + pcmk__err("Could not set owner of sequence file in %s: %s", + cib_dirname, pcmk_rc_str(rc2)); rc = -1; } } pcmk__sync_directory(cib_dirname); - crm_info("Archived previous version as %s", backup_path); + pcmk__info("Archived previous version as %s", backup_path); } free(cib_path); @@ -892,7 +900,7 @@ cib_file_prepare_xml(xmlNode *root) xmlNode *cib_status_root = NULL; /* Always write out with num_updates=0 and current last-written timestamp */ - crm_xml_add(root, PCMK_XA_NUM_UPDATES, "0"); + pcmk__xe_set(root, PCMK_XA_NUM_UPDATES, "0"); pcmk__xe_add_last_written(root); /* Delete status section before writing to file, because @@ -924,23 +932,23 @@ cib_file_write_with_digest(xmlNode *cib_root, const char *cib_dirname, char *digest = NULL; /* Detect CIB version for diagnostic purposes */ - const char *epoch = crm_element_value(cib_root, PCMK_XA_EPOCH); - const char *admin_epoch = crm_element_value(cib_root, PCMK_XA_ADMIN_EPOCH); + const char *epoch = pcmk__xe_get(cib_root, PCMK_XA_EPOCH); + const char *admin_epoch = pcmk__xe_get(cib_root, PCMK_XA_ADMIN_EPOCH); /* Determine full CIB and signature pathnames */ - char *cib_path = crm_strdup_printf("%s/%s", cib_dirname, cib_filename); - char *digest_path = crm_strdup_printf("%s.sig", cib_path); + char *cib_path = pcmk__assert_asprintf("%s/%s", cib_dirname, cib_filename); + char *digest_path = pcmk__assert_asprintf("%s.sig", cib_path); /* Create temporary file name patterns for writing out CIB and signature */ - char *tmp_cib = crm_strdup_printf("%s/cib.XXXXXX", cib_dirname); - char *tmp_digest = crm_strdup_printf("%s/cib.XXXXXX", cib_dirname); + char *tmp_cib = pcmk__assert_asprintf("%s/cib.XXXXXX", cib_dirname); + char *tmp_digest = pcmk__assert_asprintf("%s/cib.XXXXXX", cib_dirname); /* Ensure the admin didn't modify the existing CIB underneath us */ - crm_trace("Reading cluster configuration file %s", cib_path); + pcmk__trace("Reading cluster configuration file %s", cib_path); rc = cib_file_read_and_verify(cib_path, NULL, NULL); if ((rc != pcmk_ok) && (rc != -ENOENT)) { - crm_err("%s was manually modified while the cluster was active!", - cib_path); + pcmk__err("%s was manually modified while the cluster was active!", + cib_path); exit_rc = pcmk_err_cib_modified; goto cleanup; } @@ -951,7 +959,7 @@ cib_file_write_with_digest(xmlNode *cib_root, const char *cib_dirname, goto cleanup; } - crm_debug("Writing CIB to disk"); + pcmk__debug("Writing CIB to disk"); umask(S_IWGRP | S_IWOTH | S_IROTH); cib_file_prepare_xml(cib_root); @@ -980,7 +988,7 @@ cib_file_write_with_digest(xmlNode *cib_root, const char *cib_dirname, /* Write out the CIB */ if (pcmk__xml_write_fd(cib_root, tmp_cib, fd) != pcmk_rc_ok) { - crm_err("Changes couldn't be written to %s", tmp_cib); + pcmk__err("Changes couldn't be written to %s", tmp_cib); exit_rc = pcmk_err_cib_save; goto cleanup; } @@ -988,8 +996,8 @@ cib_file_write_with_digest(xmlNode *cib_root, const char *cib_dirname, /* Calculate CIB digest */ digest = pcmk__digest_on_disk_cib(cib_root); pcmk__assert(digest != NULL); - crm_info("Wrote version %s.%s.0 of the CIB to disk (digest: %s)", - (admin_epoch ? admin_epoch : "0"), (epoch ? epoch : "0"), digest); + pcmk__info("Wrote version %s.%s.0 of the CIB to disk (digest: %s)", + pcmk__s(admin_epoch, "0"), pcmk__s(epoch, "0"), digest); /* Write the CIB digest to a temporary file */ fd = mkstemp(tmp_digest); @@ -1007,23 +1015,23 @@ cib_file_write_with_digest(xmlNode *cib_root, const char *cib_dirname, } rc = pcmk__write_sync(fd, digest); if (rc != pcmk_rc_ok) { - crm_err("Could not write digest to %s: %s", - tmp_digest, pcmk_rc_str(rc)); + pcmk__err("Could not write digest to %s: %s", tmp_digest, + pcmk_rc_str(rc)); exit_rc = pcmk_err_cib_save; close(fd); goto cleanup; } close(fd); - crm_debug("Wrote digest %s to disk", digest); + pcmk__debug("Wrote digest %s to disk", digest); /* Verify that what we wrote is sane */ - crm_info("Reading cluster configuration file %s (digest: %s)", - tmp_cib, tmp_digest); + pcmk__info("Reading cluster configuration file %s (digest: %s)", tmp_cib, + tmp_digest); rc = cib_file_read_and_verify(tmp_cib, tmp_digest, NULL); pcmk__assert(rc == 0); /* Rename temporary files to live, and sync directory changes to media */ - crm_debug("Activating %s", tmp_cib); + pcmk__debug("Activating %s", tmp_cib); if (rename(tmp_cib, cib_path) < 0) { crm_perror(LOG_ERR, "Couldn't rename %s as %s", tmp_cib, cib_path); exit_rc = pcmk_err_cib_save; @@ -1067,23 +1075,23 @@ cib_file_process_transaction_requests(cib_t *cib, xmlNode *transaction) request = pcmk__xe_next(request, PCMK__XE_CIB_COMMAND)) { xmlNode *output = NULL; - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); int rc = cib_file_process_request(cib, request, &output); rc = pcmk_legacy2rc(rc); if (rc != pcmk_rc_ok) { - crm_err("Aborting transaction for CIB file client (%s) on file " - "'%s' due to failed %s request: %s", - private->id, private->filename, op, pcmk_rc_str(rc)); - crm_log_xml_info(request, "Failed request"); + pcmk__err("Aborting transaction for CIB file client (%s) on file " + "'%s' due to failed %s request: %s", + private->id, private->filename, op, pcmk_rc_str(rc)); + pcmk__log_xml_info(request, "Failed request"); return rc; } - crm_trace("Applied %s request to transaction working CIB for CIB file " - "client (%s) on file '%s'", - op, private->id, private->filename); - crm_log_xml_trace(request, "Successful request"); + pcmk__trace("Applied %s request to transaction working CIB for CIB " + "file client (%s) on file '%s'", + op, private->id, private->filename); + pcmk__log_xml_trace(request, "Successful request"); } return pcmk_rc_ok; @@ -1124,18 +1132,18 @@ cib_file_commit_transaction(cib_t *cib, xmlNode *transaction, CRM_CHECK((*result_cib != NULL) && (*result_cib != private->cib_xml), *result_cib = pcmk__xml_copy(NULL, private->cib_xml)); - crm_trace("Committing transaction for CIB file client (%s) on file '%s' to " - "working CIB", - private->id, private->filename); + pcmk__trace("Committing transaction for CIB file client (%s) on file '%s' " + "to working CIB", + private->id, private->filename); // Apply all changes to a working copy of the CIB private->cib_xml = *result_cib; rc = cib_file_process_transaction_requests(cib, transaction); - crm_trace("Transaction commit %s for CIB file client (%s) on file '%s'", - ((rc == pcmk_rc_ok)? "succeeded" : "failed"), - private->id, private->filename); + pcmk__trace("Transaction commit %s for CIB file client (%s) on file '%s'", + ((rc == pcmk_rc_ok)? "succeeded" : "failed"), + private->id, private->filename); /* Some request types (for example, erase) may have freed private->cib_xml * (the working copy) and pointed it at a new XML object. In that case, it @@ -1158,7 +1166,7 @@ cib_file_process_commit_transaction(const char *op, int options, xmlNode **result_cib, xmlNode **answer) { int rc = pcmk_rc_ok; - const char *client_id = crm_element_value(req, PCMK__XA_CIB_CLIENTID); + const char *client_id = pcmk__xe_get(req, PCMK__XA_CIB_CLIENTID); cib_t *cib = NULL; CRM_CHECK(client_id != NULL, return -EINVAL); @@ -1170,9 +1178,9 @@ cib_file_process_commit_transaction(const char *op, int options, if (rc != pcmk_rc_ok) { cib_file_opaque_t *private = cib->variant_opaque; - crm_err("Could not commit transaction for CIB file client (%s) on " - "file '%s': %s", - private->id, private->filename, pcmk_rc_str(rc)); + pcmk__err("Could not commit transaction for CIB file client (%s) on " + "file '%s': %s", + private->id, private->filename, pcmk_rc_str(rc)); } return pcmk_rc2legacy(rc); } diff --git a/lib/cib/cib_native.c b/lib/cib/cib_native.c index 274c43b9d1a..869130c0823 100644 --- a/lib/cib/cib_native.c +++ b/lib/cib/cib_native.c @@ -1,6 +1,6 @@ /* * Copyright 2004 International Business Machines - * Later changes copyright 2004-2024 the Pacemaker project contributors + * Later changes copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -57,7 +57,7 @@ cib_native_perform_op_delegate(cib_t *cib, const char *op, const char *host, } if (op == NULL) { - crm_err("No operation specified"); + pcmk__err("No operation specified"); return -EINVAL; } @@ -71,25 +71,26 @@ cib_native_perform_op_delegate(cib_t *cib, const char *op, const char *host, return rc; } - if (pcmk_is_set(call_options, cib_transaction)) { + if (pcmk__is_set(call_options, cib_transaction)) { rc = cib__extend_transaction(cib, op_msg); goto done; } - crm_trace("Sending %s message to the CIB manager (timeout=%ds)", op, cib->call_timeout); + pcmk__trace("Sending %s message to the CIB manager (timeout=%ds)", op, + cib->call_timeout); rc = crm_ipc_send(native->ipc, op_msg, ipc_flags, cib->call_timeout * 1000, &op_reply); if (rc < 0) { - crm_err("Couldn't perform %s operation (timeout=%ds): %s (%d)", op, - cib->call_timeout, pcmk_strerror(rc), rc); + pcmk__err("Couldn't perform %s operation (timeout=%ds): %s (%d)", op, + cib->call_timeout, pcmk_strerror(rc), rc); rc = -ECOMM; goto done; } - crm_log_xml_trace(op_reply, "Reply"); + pcmk__log_xml_trace(op_reply, "Reply"); if (!(call_options & cib_sync_call)) { - crm_trace("Async call, returning %d", cib->call_id); + pcmk__trace("Async call, returning %d", cib->call_id); CRM_CHECK(cib->call_id != 0, rc = -ENOMSG; goto done); rc = cib->call_id; @@ -97,32 +98,32 @@ cib_native_perform_op_delegate(cib_t *cib, const char *op, const char *host, } rc = pcmk_ok; - crm_element_value_int(op_reply, PCMK__XA_CIB_CALLID, &reply_id); + pcmk__xe_get_int(op_reply, PCMK__XA_CIB_CALLID, &reply_id); if (reply_id == cib->call_id) { xmlNode *wrapper = pcmk__xe_first_child(op_reply, PCMK__XE_CIB_CALLDATA, NULL, NULL); xmlNode *tmp = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); - crm_trace("Synchronous reply %d received", reply_id); - if (crm_element_value_int(op_reply, PCMK__XA_CIB_RC, &rc) != 0) { + pcmk__trace("Synchronous reply %d received", reply_id); + if (pcmk__xe_get_int(op_reply, PCMK__XA_CIB_RC, &rc) != pcmk_rc_ok) { rc = -EPROTO; } if (output_data == NULL || (call_options & cib_discard_reply)) { - crm_trace("Discarding reply"); + pcmk__trace("Discarding reply"); } else { *output_data = pcmk__xml_copy(NULL, tmp); } } else if (reply_id <= 0) { - crm_err("Received bad reply: No id set"); - crm_log_xml_err(op_reply, "Bad reply"); + pcmk__err("Received bad reply: No id set"); + pcmk__log_xml_err(op_reply, "Bad reply"); rc = -ENOMSG; goto done; } else { - crm_err("Received bad reply: %d (wanted %d)", reply_id, cib->call_id); - crm_log_xml_err(op_reply, "Old reply"); + pcmk__err("Received bad reply: %d (wanted %d)", reply_id, cib->call_id); + pcmk__log_xml_err(op_reply, "Old reply"); rc = -ENOMSG; goto done; } @@ -147,21 +148,21 @@ cib_native_perform_op_delegate(cib_t *cib, const char *op, const char *host, /* These indicate internal problems */ case -EPROTO: case -ENOMSG: - crm_err("Call failed: %s", pcmk_strerror(rc)); + pcmk__err("Call failed: %s", pcmk_strerror(rc)); if (op_reply) { - crm_log_xml_err(op_reply, "Invalid reply"); + pcmk__log_xml_err(op_reply, "Invalid reply"); } break; default: if (!pcmk__str_eq(op, PCMK__CIB_REQUEST_QUERY, pcmk__str_none)) { - crm_warn("Call failed: %s", pcmk_strerror(rc)); + pcmk__warn("Call failed: %s", pcmk_strerror(rc)); } } done: if (!crm_ipc_connected(native->ipc)) { - crm_err("The CIB manager disconnected"); + pcmk__err("The CIB manager disconnected"); cib->state = cib_disconnected; } @@ -179,23 +180,23 @@ cib_native_dispatch_internal(const char *buffer, ssize_t length, cib_t *cib = userdata; - crm_trace("dispatching %p", userdata); + pcmk__trace("dispatching %p", userdata); if (cib == NULL) { - crm_err("No CIB!"); + pcmk__err("No CIB!"); return 0; } msg = pcmk__xml_parse(buffer); if (msg == NULL) { - crm_warn("Received a NULL message from the CIB manager"); + pcmk__warn("Received a NULL message from the CIB manager"); return 0; } /* do callbacks */ - type = crm_element_value(msg, PCMK__XA_T); - crm_trace("Activating %s callbacks...", type); + type = pcmk__xe_get(msg, PCMK__XA_T); + pcmk__trace("Activating %s callbacks...", type); crm_log_xml_explicit(msg, "cib-reply"); if (pcmk__str_eq(type, PCMK__VALUE_CIB, pcmk__str_none)) { @@ -205,7 +206,7 @@ cib_native_dispatch_internal(const char *buffer, ssize_t length, g_list_foreach(cib->notify_list, cib_native_notify, msg); } else { - crm_err("Unknown message type: %s", type); + pcmk__err("Unknown message type: %s", type); } pcmk__xml_free(msg); @@ -218,7 +219,7 @@ cib_native_destroy(void *userdata) cib_t *cib = userdata; cib_native_opaque_t *native = cib->variant_opaque; - crm_trace("destroying %p", userdata); + pcmk__trace("destroying %p", userdata); cib->state = cib_disconnected; native->source = NULL; native->ipc = NULL; @@ -233,7 +234,7 @@ cib_native_signoff(cib_t *cib) { cib_native_opaque_t *native = cib->variant_opaque; - crm_debug("Disconnecting from the CIB manager"); + pcmk__debug("Disconnecting from the CIB manager"); cib_free_notify(cib); remove_cib_op_callback(0, TRUE); @@ -295,14 +296,14 @@ cib_native_signon(cib_t *cib, const char *name, enum cib_conn_type type) return -ENOTCONN; } - crm_trace("Connecting %s channel", channel); + pcmk__trace("Connecting %s channel", channel); native->source = mainloop_add_ipc_client(channel, G_PRIORITY_HIGH, 512 * 1024, cib, &cib_callbacks); native->ipc = mainloop_get_ipc_client(native->source); if (rc != pcmk_ok || native->ipc == NULL || !crm_ipc_connected(native->ipc)) { - crm_info("Could not connect to CIB manager for %s", name); + pcmk__info("Could not connect to CIB manager for %s", name); rc = -ENOTCONN; } @@ -316,19 +317,18 @@ cib_native_signon(cib_t *cib, const char *name, enum cib_conn_type type) if (crm_ipc_send(native->ipc, hello, crm_ipc_client_response, -1, &reply) > 0) { - const char *msg_type = crm_element_value(reply, PCMK__XA_CIB_OP); + const char *msg_type = pcmk__xe_get(reply, PCMK__XA_CIB_OP); - crm_log_xml_trace(reply, "reg-reply"); + pcmk__log_xml_trace(reply, "reg-reply"); if (!pcmk__str_eq(msg_type, CRM_OP_REGISTER, pcmk__str_casei)) { - crm_info("Reply to CIB registration message has unknown type " - "'%s'", - msg_type); + pcmk__info("Reply to CIB registration message has unknown type " + "'%s'", + msg_type); rc = -EPROTO; } else { - native->token = crm_element_value_copy(reply, - PCMK__XA_CIB_CLIENTID); + native->token = pcmk__xe_get_copy(reply, PCMK__XA_CIB_CLIENTID); if (native->token == NULL) { rc = -EPROTO; } @@ -342,12 +342,12 @@ cib_native_signon(cib_t *cib, const char *name, enum cib_conn_type type) } if (rc == pcmk_ok) { - crm_info("Successfully connected to CIB manager for %s", name); + pcmk__info("Successfully connected to CIB manager for %s", name); return pcmk_ok; } - crm_info("Connection to CIB manager for %s failed: %s", - name, pcmk_strerror(rc)); + pcmk__info("Connection to CIB manager for %s failed: %s", name, + pcmk_strerror(rc)); cib_native_signoff(cib); return rc; } @@ -382,13 +382,13 @@ cib_native_register_notification(cib_t *cib, const char *callback, int enabled) cib_native_opaque_t *native = cib->variant_opaque; if (cib->state != cib_disconnected) { - crm_xml_add(notify_msg, PCMK__XA_CIB_OP, PCMK__VALUE_CIB_NOTIFY); - crm_xml_add(notify_msg, PCMK__XA_CIB_NOTIFY_TYPE, callback); - crm_xml_add_int(notify_msg, PCMK__XA_CIB_NOTIFY_ACTIVATE, enabled); + pcmk__xe_set(notify_msg, PCMK__XA_CIB_OP, PCMK__VALUE_CIB_NOTIFY); + pcmk__xe_set(notify_msg, PCMK__XA_CIB_NOTIFY_TYPE, callback); + pcmk__xe_set_int(notify_msg, PCMK__XA_CIB_NOTIFY_ACTIVATE, enabled); rc = crm_ipc_send(native->ipc, notify_msg, crm_ipc_client_response, 1000 * cib->call_timeout, NULL); if (rc <= 0) { - crm_trace("Notification not registered: %d", rc); + pcmk__trace("Notification not registered: %d", rc); rc = -ECOMM; } } @@ -404,7 +404,7 @@ cib_native_set_connection_dnotify(cib_t *cib, cib_native_opaque_t *native = NULL; if (cib == NULL) { - crm_err("No CIB!"); + pcmk__err("No CIB!"); return FALSE; } diff --git a/lib/cib/cib_ops.c b/lib/cib/cib_ops.c index f9a5aeea6df..ca7788f2b4d 100644 --- a/lib/cib/cib_ops.c +++ b/lib/cib/cib_ops.c @@ -159,7 +159,7 @@ cib__get_operation(const char *op, const cib__operation_t **operation) *operation = g_hash_table_lookup(operation_table, op); if (*operation == NULL) { - crm_err("Operation %s is invalid", op); + pcmk__err("Operation %s is invalid", op); return EINVAL; } return pcmk_rc_ok; @@ -172,8 +172,8 @@ cib_process_query(const char *op, int options, const char *section, xmlNode * re xmlNode *obj_root = NULL; int result = pcmk_ok; - crm_trace("Processing %s for %s section", - op, pcmk__s(section, "unspecified")); + pcmk__trace("Processing %s for %s section", op, + pcmk__s(section, "unspecified")); if (options & cib_xpath) { return cib_process_xpath(op, options, section, req, input, @@ -204,7 +204,7 @@ cib_process_query(const char *op, int options, const char *section, xmlNode * re } if (result == pcmk_ok && *answer == NULL) { - crm_err("Error creating query response"); + pcmk__err("Error creating query response"); result = -ENOMSG; } @@ -218,8 +218,8 @@ update_counter(xmlNode *xml_obj, const char *field, bool reset) char *old_value = NULL; int int_value = -1; - if (!reset && crm_element_value(xml_obj, field) != NULL) { - old_value = crm_element_value_copy(xml_obj, field); + if (!reset && pcmk__xe_get(xml_obj, field) != NULL) { + old_value = pcmk__xe_get_copy(xml_obj, field); } if (old_value != NULL) { int_value = atoi(old_value); @@ -228,9 +228,9 @@ update_counter(xmlNode *xml_obj, const char *field, bool reset) new_value = pcmk__str_copy("1"); } - crm_trace("Update %s from %s to %s", - field, pcmk__s(old_value, "unset"), new_value); - crm_xml_add(xml_obj, field, new_value); + pcmk__trace("Update %s from %s to %s", field, pcmk__s(old_value, "unset"), + new_value); + pcmk__xe_set(xml_obj, field, new_value); free(new_value); free(old_value); @@ -244,7 +244,7 @@ cib_process_erase(const char *op, int options, const char *section, xmlNode * re { int result = pcmk_ok; - crm_trace("Processing \"%s\" event", op); + pcmk__trace("Processing \"%s\" event", op); if (*result_cib != existing_cib) { pcmk__xml_free(*result_cib); @@ -263,18 +263,18 @@ cib_process_upgrade(const char *op, int options, const char *section, xmlNode * xmlNode ** answer) { int rc = 0; - const char *max_schema = crm_element_value(req, PCMK__XA_CIB_SCHEMA_MAX); + const char *max_schema = pcmk__xe_get(req, PCMK__XA_CIB_SCHEMA_MAX); const char *original_schema = NULL; const char *new_schema = NULL; *answer = NULL; - crm_trace("Processing \"%s\" event with max=%s", op, max_schema); + pcmk__trace("Processing \"%s\" event with max=%s", op, max_schema); - original_schema = crm_element_value(existing_cib, PCMK_XA_VALIDATE_WITH); + original_schema = pcmk__xe_get(existing_cib, PCMK_XA_VALIDATE_WITH); rc = pcmk__update_schema(result_cib, max_schema, true, - !pcmk_is_set(options, cib_verbose)); + !pcmk__is_set(options, cib_verbose)); rc = pcmk_rc2legacy(rc); - new_schema = crm_element_value(*result_cib, PCMK_XA_VALIDATE_WITH); + new_schema = pcmk__xe_get(*result_cib, PCMK_XA_VALIDATE_WITH); if (pcmk__cmp_schemas_by_name(new_schema, original_schema) > 0) { update_counter(*result_cib, PCMK_XA_ADMIN_EPOCH, false); @@ -292,8 +292,8 @@ cib_process_bump(const char *op, int options, const char *section, xmlNode * req { int result = pcmk_ok; - crm_trace("Processing %s for epoch='%s'", op, - pcmk__s(crm_element_value(existing_cib, PCMK_XA_EPOCH), "")); + pcmk__trace("Processing %s for epoch='%s'", op, + pcmk__s(pcmk__xe_get(existing_cib, PCMK_XA_EPOCH), "")); *answer = NULL; update_counter(*result_cib, PCMK_XA_EPOCH, false); @@ -308,8 +308,8 @@ cib_process_replace(const char *op, int options, const char *section, xmlNode * { int result = pcmk_ok; - crm_trace("Processing %s for %s section", - op, pcmk__s(section, "unspecified")); + pcmk__trace("Processing %s for %s section", op, + pcmk__s(section, "unspecified")); if (options & cib_xpath) { return cib_process_xpath(op, options, section, req, input, @@ -339,24 +339,26 @@ cib_process_replace(const char *op, int options, const char *section, xmlNode * int replace_admin_epoch = 0; const char *reason = NULL; - const char *peer = crm_element_value(req, PCMK__XA_SRC); - const char *digest = crm_element_value(req, PCMK__XA_DIGEST); + const char *peer = pcmk__xe_get(req, PCMK__XA_SRC); + const char *digest = pcmk__xe_get(req, PCMK__XA_DIGEST); if (digest) { char *digest_verify = pcmk__digest_xml(input, true); if (!pcmk__str_eq(digest_verify, digest, pcmk__str_casei)) { - crm_err("Digest mis-match on replace from %s: %s vs. %s (expected)", peer, - digest_verify, digest); + pcmk__err("Digest mis-match on replace from %s: %s vs. %s " + "(expected)", + peer, digest_verify, digest); reason = "digest mismatch"; } else { - crm_info("Digest matched on replace from %s: %s", peer, digest); + pcmk__info("Digest matched on replace from %s: %s", peer, + digest); } free(digest_verify); } else { - crm_trace("No digest to verify"); + pcmk__trace("No digest to verify"); } cib_version_details(existing_cib, &admin_epoch, &epoch, &updates); @@ -379,15 +381,17 @@ cib_process_replace(const char *op, int options, const char *section, xmlNode * } if (reason != NULL) { - crm_info("Replacement %d.%d.%d from %s not applied to %d.%d.%d:" - " current %s is greater than the replacement", - replace_admin_epoch, replace_epoch, - replace_updates, peer, admin_epoch, epoch, updates, reason); + pcmk__info("Replacement %d.%d.%d from %s not applied to %d.%d.%d: " + "current %s is greater than the replacement", + replace_admin_epoch, replace_epoch, + replace_updates, peer, admin_epoch, epoch, updates, + reason); result = -pcmk_err_old_data; } else { - crm_info("Replaced %d.%d.%d with %d.%d.%d from %s", - admin_epoch, epoch, updates, - replace_admin_epoch, replace_epoch, replace_updates, peer); + pcmk__info("Replaced %d.%d.%d with %d.%d.%d from %s", + admin_epoch, epoch, updates, + replace_admin_epoch, replace_epoch, replace_updates, + peer); } if (*result_cib != existing_cib) { @@ -402,7 +406,7 @@ cib_process_replace(const char *op, int options, const char *section, xmlNode * result = pcmk__xe_replace_match(obj_root, input); result = pcmk_rc2legacy(result); if (result != pcmk_ok) { - crm_trace("No matching object to replace"); + pcmk__trace("No matching object to replace"); } } @@ -415,8 +419,8 @@ delete_child(xmlNode *child, void *userdata) xmlNode *obj_root = userdata; if (pcmk__xe_delete_match(obj_root, child) != pcmk_rc_ok) { - crm_trace("No matching object to delete: %s=%s", - child->name, pcmk__xe_id(child)); + pcmk__trace("No matching object to delete: %s=%s", child->name, + pcmk__xe_id(child)); } return pcmk_rc_ok; @@ -428,7 +432,7 @@ cib_process_delete(const char *op, int options, const char *section, xmlNode * r { xmlNode *obj_root = NULL; - crm_trace("Processing \"%s\" event", op); + pcmk__trace("Processing \"%s\" event", op); if (options & cib_xpath) { return cib_process_xpath(op, options, section, req, input, @@ -436,7 +440,7 @@ cib_process_delete(const char *op, int options, const char *section, xmlNode * r } if (input == NULL) { - crm_err("Cannot perform modification with no data"); + pcmk__err("Cannot perform modification with no data"); return -EINVAL; } @@ -457,7 +461,7 @@ cib_process_modify(const char *op, int options, const char *section, xmlNode * r xmlNode *obj_root = NULL; uint32_t flags = pcmk__xaf_none; - crm_trace("Processing \"%s\" event", op); + pcmk__trace("Processing \"%s\" event", op); if (options & cib_xpath) { return cib_process_xpath(op, options, section, req, input, @@ -465,7 +469,7 @@ cib_process_modify(const char *op, int options, const char *section, xmlNode * r } if (input == NULL) { - crm_err("Cannot perform modification with no data"); + pcmk__err("Cannot perform modification with no data"); return -EINVAL; } @@ -488,7 +492,7 @@ cib_process_modify(const char *op, int options, const char *section, xmlNode * r CRM_CHECK(obj_root != NULL, return -EINVAL); - if (pcmk_is_set(options, cib_score_update)) { + if (pcmk__is_set(options, cib_score_update)) { flags |= pcmk__xaf_score_update; } @@ -526,10 +530,10 @@ add_cib_object(xmlNode * parent, xmlNode * new_obj) } if (object_id != NULL) { - crm_trace("Processing creation of <%s " PCMK_XA_ID "='%s'>", - object_name, object_id); + pcmk__trace("Processing creation of <%s " PCMK_XA_ID "='%s'>", + object_name, object_id); } else { - crm_trace("Processing creation of <%s>", object_name); + pcmk__trace("Processing creation of <%s>", object_name); } /* @COMPAT PCMK__XA_REPLACE is deprecated since 2.1.6. Due to a legacy use @@ -562,13 +566,14 @@ update_results(xmlNode *failed, xmlNode *target, const char *operation, xml_node = pcmk__xe_create(failed, PCMK__XE_FAILED_UPDATE); pcmk__xml_copy(xml_node, target); - crm_xml_add(xml_node, PCMK_XA_ID, pcmk__xe_id(target)); - crm_xml_add(xml_node, PCMK_XA_OBJECT_TYPE, (const char *) target->name); - crm_xml_add(xml_node, PCMK_XA_OPERATION, operation); - crm_xml_add(xml_node, PCMK_XA_REASON, error_msg); + pcmk__xe_set(xml_node, PCMK_XA_ID, pcmk__xe_id(target)); + pcmk__xe_set(xml_node, PCMK_XA_OBJECT_TYPE, + (const char *) target->name); + pcmk__xe_set(xml_node, PCMK_XA_OPERATION, operation); + pcmk__xe_set(xml_node, PCMK_XA_REASON, error_msg); - crm_warn("Action %s failed: %s (cde=%d)", - operation, error_msg, return_code); + pcmk__warn("Action %s failed: %s (cde=%d)", operation, error_msg, + return_code); } return was_error; @@ -582,8 +587,8 @@ cib_process_create(const char *op, int options, const char *section, xmlNode * r int result = pcmk_ok; xmlNode *update_section = NULL; - crm_trace("Processing %s for %s section", - op, pcmk__s(section, "unspecified")); + pcmk__trace("Processing %s for %s section", op, + pcmk__s(section, "unspecified")); if (pcmk__str_eq(PCMK__XE_ALL, section, pcmk__str_casei)) { section = NULL; @@ -597,7 +602,7 @@ cib_process_create(const char *op, int options, const char *section, xmlNode * r CRM_CHECK(strcmp(op, PCMK__CIB_REQUEST_CREATE) == 0, return -EINVAL); if (input == NULL) { - crm_err("Cannot perform modification with no data"); + pcmk__err("Cannot perform modification with no data"); return -EINVAL; } @@ -631,7 +636,7 @@ cib_process_create(const char *op, int options, const char *section, xmlNode * r } if (result != pcmk_ok) { - crm_log_xml_err(failed, "CIB Update failures"); + pcmk__log_xml_err(failed, "CIB Update failures"); *answer = failed; } else { @@ -645,15 +650,15 @@ int cib_process_diff(const char *op, int options, const char *section, xmlNode * req, xmlNode * input, xmlNode * existing_cib, xmlNode ** result_cib, xmlNode ** answer) { + const bool force = pcmk__is_set(options, cib_force_diff); const char *originator = NULL; if (req != NULL) { - originator = crm_element_value(req, PCMK__XA_SRC); + originator = pcmk__xe_get(req, PCMK__XA_SRC); } - crm_trace("Processing \"%s\" event from %s%s", - op, originator, - (pcmk_is_set(options, cib_force_diff)? " (global update)" : "")); + pcmk__trace("Processing \"%s\" event from %s%s", op, originator, + (force? " (global update)" : "")); if (*result_cib != existing_cib) { pcmk__xml_free(*result_cib); @@ -671,12 +676,12 @@ cib_process_xpath(const char *op, int options, const char *section, int num_results = 0; int rc = pcmk_ok; bool is_query = pcmk__str_eq(op, PCMK__CIB_REQUEST_QUERY, pcmk__str_none); - bool delete_multiple = pcmk_is_set(options, cib_multiple) + bool delete_multiple = pcmk__is_set(options, cib_multiple) && pcmk__str_eq(op, PCMK__CIB_REQUEST_DELETE, pcmk__str_none); xmlXPathObject *xpathObj = NULL; - crm_trace("Processing \"%s\" event", op); + pcmk__trace("Processing \"%s\" event", op); if (is_query) { xpathObj = pcmk__xpath_search(existing_cib->doc, section); @@ -687,10 +692,10 @@ cib_process_xpath(const char *op, int options, const char *section, num_results = pcmk__xpath_num_results(xpathObj); if (num_results == 0) { if (pcmk__str_eq(op, PCMK__CIB_REQUEST_DELETE, pcmk__str_none)) { - crm_debug("%s was already removed", section); + pcmk__debug("%s was already removed", section); } else { - crm_debug("%s: %s does not exist", op, section); + pcmk__debug("%s: %s does not exist", op, section); rc = -ENXIO; } goto done; @@ -731,13 +736,15 @@ cib_process_xpath(const char *op, int options, const char *section, } path = xmlGetNodePath(match); - crm_debug("Processing %s op for %s with %s", op, section, path); + pcmk__debug("Processing %s op for %s with %s", op, section, path); free(path); if (pcmk__str_eq(op, PCMK__CIB_REQUEST_DELETE, pcmk__str_none)) { if (match == *result_cib) { /* Attempting to delete the whole "/cib" */ - crm_warn("Cannot perform %s for %s: The xpath is addressing the whole /cib", op, section); + pcmk__warn("Cannot perform %s for %s: The xpath is addressing " + "the whole /cib", + op, section); rc = -EINVAL; break; } @@ -750,7 +757,7 @@ cib_process_xpath(const char *op, int options, const char *section, } else if (pcmk__str_eq(op, PCMK__CIB_REQUEST_MODIFY, pcmk__str_none)) { uint32_t flags = pcmk__xaf_none; - if (pcmk_is_set(options, cib_score_update)) { + if (pcmk__is_set(options, cib_score_update)) { flags |= pcmk__xaf_score_update; } @@ -781,29 +788,29 @@ cib_process_xpath(const char *op, int options, const char *section, xmlNode *parent = match; while (parent && parent->type == XML_ELEMENT_NODE) { - const char *id = crm_element_value(parent, PCMK_XA_ID); + const char *id = pcmk__xe_get(parent, PCMK_XA_ID); char *new_path = NULL; if (id) { - new_path = crm_strdup_printf("/%s[@" PCMK_XA_ID "='%s']" - "%s", - parent->name, id, - pcmk__s(path, "")); + new_path = + pcmk__assert_asprintf("/%s[@" PCMK_XA_ID "='%s']%s", + parent->name, id, + pcmk__s(path, "")); } else { - new_path = crm_strdup_printf("/%s%s", parent->name, - pcmk__s(path, "")); + new_path = pcmk__assert_asprintf("/%s%s", parent->name, + pcmk__s(path, "")); } free(path); path = new_path; parent = parent->parent; } - crm_trace("Got: %s", path); + pcmk__trace("Got: %s", path); if (*answer == NULL) { *answer = pcmk__xe_create(NULL, PCMK__XE_XPATH_QUERY); } parent = pcmk__xe_create(*answer, PCMK__XE_XPATH_QUERY_PATH); - crm_xml_add(parent, PCMK_XA_ID, path); + pcmk__xe_set(parent, PCMK_XA_ID, path); free(path); } else if (*answer) { diff --git a/lib/cib/cib_remote.c b/lib/cib/cib_remote.c index 1fb38dbb0bd..f674daa3d9b 100644 --- a/lib/cib/cib_remote.c +++ b/lib/cib/cib_remote.c @@ -75,7 +75,7 @@ cib_remote_perform_op(cib_t *cib, const char *op, const char *host, } if (op == NULL) { - crm_err("No operation specified"); + pcmk__err("No operation specified"); return -EINVAL; } @@ -85,13 +85,13 @@ cib_remote_perform_op(cib_t *cib, const char *op, const char *host, return rc; } - if (pcmk_is_set(call_options, cib_transaction)) { + if (pcmk__is_set(call_options, cib_transaction)) { rc = cib__extend_transaction(cib, op_msg); pcmk__xml_free(op_msg); return rc; } - crm_trace("Sending %s message to the CIB manager", op); + pcmk__trace("Sending %s message to the CIB manager", op); if (!(call_options & cib_sync_call)) { pcmk__remote_send_xml(&private->callback, op_msg); } else { @@ -100,14 +100,14 @@ cib_remote_perform_op(cib_t *cib, const char *op, const char *host, pcmk__xml_free(op_msg); if ((call_options & cib_discard_reply)) { - crm_trace("Discarding reply"); + pcmk__trace("Discarding reply"); return pcmk_ok; } else if (!(call_options & cib_sync_call)) { return cib->call_id; } - crm_trace("Waiting for a synchronous reply"); + pcmk__trace("Waiting for a synchronous reply"); start_time = time(NULL); remaining_time = cib->call_timeout ? cib->call_timeout : 60; @@ -125,21 +125,22 @@ cib_remote_perform_op(cib_t *cib, const char *op, const char *host, break; } - crm_element_value_int(op_reply, PCMK__XA_CIB_CALLID, &reply_id); + pcmk__xe_get_int(op_reply, PCMK__XA_CIB_CALLID, &reply_id); if (reply_id == msg_id) { break; } else if (reply_id < msg_id) { - crm_debug("Received old reply: %d (wanted %d)", reply_id, msg_id); - crm_log_xml_trace(op_reply, "Old reply"); + pcmk__debug("Received old reply: %d (wanted %d)", reply_id, msg_id); + pcmk__log_xml_trace(op_reply, "Old reply"); } else if ((reply_id - 10000) > msg_id) { /* wrap-around case */ - crm_debug("Received old reply: %d (wanted %d)", reply_id, msg_id); - crm_log_xml_trace(op_reply, "Old reply"); + pcmk__debug("Received old reply: %d (wanted %d)", reply_id, msg_id); + pcmk__log_xml_trace(op_reply, "Old reply"); } else { - crm_err("Received a __future__ reply:" " %d (wanted %d)", reply_id, msg_id); + pcmk__err("Received a __future__ reply:" " %d (wanted %d)", + reply_id, msg_id); } pcmk__xml_free(op_reply); @@ -150,17 +151,17 @@ cib_remote_perform_op(cib_t *cib, const char *op, const char *host, } if (rc == ENOTCONN) { - crm_err("Disconnected while waiting for reply."); + pcmk__err("Disconnected while waiting for reply"); return -ENOTCONN; } else if (op_reply == NULL) { - crm_err("No reply message - empty"); + pcmk__err("No reply message - empty"); return -ENOMSG; } - crm_trace("Synchronous reply received"); + pcmk__trace("Synchronous reply received"); /* Start processing the reply... */ - if (crm_element_value_int(op_reply, PCMK__XA_CIB_RC, &rc) != 0) { + if (pcmk__xe_get_int(op_reply, PCMK__XA_CIB_RC, &rc) != pcmk_rc_ok) { rc = -EPROTO; } @@ -170,11 +171,11 @@ cib_remote_perform_op(cib_t *cib, const char *op, const char *host, } if (rc == pcmk_ok || rc == -EPERM) { - crm_log_xml_debug(op_reply, "passed"); + pcmk__log_xml_debug(op_reply, "passed"); } else { - crm_err("Call failed: %s", pcmk_strerror(rc)); - crm_log_xml_warn(op_reply, "failed"); + pcmk__err("Call failed: %s", pcmk_strerror(rc)); + pcmk__log_xml_warn(op_reply, "failed"); } if (output_data == NULL) { @@ -186,7 +187,8 @@ cib_remote_perform_op(cib_t *cib, const char *op, const char *host, xmlNode *tmp = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); if (tmp == NULL) { - crm_trace("No output in reply to \"%s\" command %d", op, cib->call_id - 1); + pcmk__trace("No output in reply to \"%s\" command %d", op, + (cib->call_id - 1)); } else { *output_data = pcmk__xml_copy(NULL, tmp); } @@ -224,8 +226,8 @@ cib_remote_callback_dispatch(gpointer user_data) case EAGAIN: /* Have we timed out? */ if (time(NULL) >= private->start_time + private->timeout_sec) { - crm_info("Error reading from CIB manager connection: %s", - pcmk_rc_str(ETIME)); + pcmk__info("Error reading from CIB manager connection: %s", + pcmk_rc_str(ETIME)); return -1; } @@ -234,8 +236,8 @@ cib_remote_callback_dispatch(gpointer user_data) default: /* Error */ - crm_info("Error reading from CIB manager connection: %s", - pcmk_rc_str(rc)); + pcmk__info("Error reading from CIB manager connection: %s", + pcmk_rc_str(rc)); return -1; } @@ -245,16 +247,16 @@ cib_remote_callback_dispatch(gpointer user_data) return 0; } - type = crm_element_value(msg, PCMK__XA_T); + type = pcmk__xe_get(msg, PCMK__XA_T); - crm_trace("Activating %s callbacks...", type); + pcmk__trace("Activating %s callbacks...", type); if (pcmk__str_eq(type, PCMK__VALUE_CIB, pcmk__str_none)) { cib_native_callback(cib, msg, 0, 0); } else if (pcmk__str_eq(type, PCMK__VALUE_CIB_NOTIFY, pcmk__str_none)) { g_list_foreach(cib->notify_list, cib_native_notify, msg); } else { - crm_err("Unknown message type: %s", type); + pcmk__err("Unknown message type: %s", type); } pcmk__xml_free(msg); @@ -278,8 +280,8 @@ cib_remote_command_dispatch(gpointer user_data) if (rc == EAGAIN) { /* Have we timed out? */ if (time(NULL) >= private->start_time + private->timeout_sec) { - crm_info("Error reading from CIB manager connection: %s", - pcmk_rc_str(ETIME)); + pcmk__info("Error reading from CIB manager connection: %s", + pcmk_rc_str(ETIME)); return -1; } @@ -289,11 +291,11 @@ cib_remote_command_dispatch(gpointer user_data) free(private->command.buffer); private->command.buffer = NULL; - crm_err("received late reply for remote cib connection, discarding"); + pcmk__err("Received late reply for remote cib connection, discarding"); if (rc != pcmk_rc_ok) { - crm_info("Error reading from CIB manager connection: %s", - pcmk_rc_str(rc)); + pcmk__info("Error reading from CIB manager connection: %s", + pcmk_rc_str(rc)); return -1; } @@ -345,7 +347,7 @@ cib_tls_close(cib_t *cib) static void cib_remote_connection_destroy(gpointer user_data) { - crm_err("Connection destroyed"); + pcmk__err("Connection destroyed"); cib_tls_close(user_data); } @@ -369,8 +371,8 @@ cib_tls_signon(cib_t *cib, pcmk__remote_t *connection, gboolean event_channel) rc = pcmk__connect_remote(private->server, private->port, 0, NULL, &(connection->tcp_socket), NULL, NULL); if (rc != pcmk_rc_ok) { - crm_info("Remote connection to %s:%d failed: %s " QB_XS " rc=%d", - private->server, private->port, pcmk_rc_str(rc), rc); + pcmk__info("Remote connection to %s:%d failed: %s " QB_XS " rc=%d", + private->server, private->port, pcmk_rc_str(rc), rc); return -ENOTCONN; } @@ -393,9 +395,11 @@ cib_tls_signon(cib_t *cib, pcmk__remote_t *connection, gboolean event_channel) rc = pcmk__tls_client_handshake(connection, TLS_HANDSHAKE_TIMEOUT, &tls_rc); if (rc != pcmk_rc_ok) { - crm_err("Remote CIB session creation for %s:%d failed: %s", - private->server, private->port, - (rc == EPROTO)? gnutls_strerror(tls_rc) : pcmk_rc_str(rc)); + const bool proto_err = (rc == EPROTO); + + pcmk__err("Remote CIB session creation for %s:%d failed: %s", + private->server, private->port, + (proto_err? gnutls_strerror(tls_rc) : pcmk_rc_str(rc))); gnutls_deinit(connection->tls_session); connection->tls_session = NULL; cib_tls_close(cib); @@ -412,10 +416,10 @@ cib_tls_signon(cib_t *cib, pcmk__remote_t *connection, gboolean event_channel) /* login to server */ login = pcmk__xe_create(NULL, PCMK__XE_CIB_COMMAND); - crm_xml_add(login, PCMK_XA_OP, "authenticate"); - crm_xml_add(login, PCMK_XA_USER, private->user); - crm_xml_add(login, PCMK__XA_PASSWORD, private->passwd); - crm_xml_add(login, PCMK__XA_HIDDEN, PCMK__VALUE_PASSWORD); + pcmk__xe_set(login, PCMK_XA_OP, "authenticate"); + pcmk__xe_set(login, PCMK_XA_USER, private->user); + pcmk__xe_set(login, PCMK__XA_PASSWORD, private->passwd); + pcmk__xe_set(login, PCMK__XA_HIDDEN, PCMK__VALUE_PASSWORD); pcmk__remote_send_xml(connection, login); pcmk__xml_free(login); @@ -427,18 +431,17 @@ cib_tls_signon(cib_t *cib, pcmk__remote_t *connection, gboolean event_channel) answer = pcmk__remote_message_xml(connection); - crm_log_xml_trace(answer, "Reply"); + pcmk__log_xml_trace(answer, "Reply"); if (answer == NULL) { rc = -EPROTO; } else { /* grab the token */ - const char *msg_type = crm_element_value(answer, PCMK__XA_CIB_OP); - const char *tmp_ticket = crm_element_value(answer, - PCMK__XA_CIB_CLIENTID); + const char *msg_type = pcmk__xe_get(answer, PCMK__XA_CIB_OP); + const char *tmp_ticket = pcmk__xe_get(answer, PCMK__XA_CIB_CLIENTID); if (!pcmk__str_eq(msg_type, CRM_OP_REGISTER, pcmk__str_casei)) { - crm_err("Invalid registration message: %s", msg_type); + pcmk__err("Invalid registration message: %s", msg_type); rc = -EPROTO; } else if (tmp_ticket == NULL) { @@ -456,7 +459,7 @@ cib_tls_signon(cib_t *cib, pcmk__remote_t *connection, gboolean event_channel) return rc; } - crm_trace("remote client connection established"); + pcmk__trace("remote client connection established"); private->timeout_sec = 60; connection->source = mainloop_add_fd("cib-remote", G_PRIORITY_HIGH, connection->tcp_socket, cib, @@ -499,14 +502,14 @@ cib_remote_signon(cib_t *cib, const char *name, enum cib_conn_type type) done: if (rc == pcmk_ok) { - crm_info("Opened connection to %s:%d for %s", - private->server, private->port, name); + pcmk__info("Opened connection to %s:%d for %s", private->server, + private->port, name); cib->state = cib_connected_command; cib->type = cib_command; } else { - crm_info("Connection to %s:%d for %s failed: %s\n", - private->server, private->port, name, pcmk_strerror(rc)); + pcmk__info("Connection to %s:%d for %s failed: %s\n", private->server, + private->port, name, pcmk_strerror(rc)); } return rc; @@ -517,7 +520,7 @@ cib_remote_signoff(cib_t *cib) { int rc = pcmk_ok; - crm_debug("Disconnecting from the CIB manager"); + pcmk__debug("Disconnecting from the CIB manager"); cib_tls_close(cib); cib->cmds->end_transaction(cib, false, cib_none); @@ -532,7 +535,7 @@ cib_remote_free(cib_t *cib) { int rc = pcmk_ok; - crm_warn("Freeing CIB"); + pcmk__warn("Freeing CIB"); if (cib->state != cib_disconnected) { rc = cib_remote_signoff(cib); if (rc == pcmk_ok) { @@ -557,9 +560,9 @@ cib_remote_register_notification(cib_t * cib, const char *callback, int enabled) xmlNode *notify_msg = pcmk__xe_create(NULL, PCMK__XE_CIB_COMMAND); cib_remote_opaque_t *private = cib->variant_opaque; - crm_xml_add(notify_msg, PCMK__XA_CIB_OP, PCMK__VALUE_CIB_NOTIFY); - crm_xml_add(notify_msg, PCMK__XA_CIB_NOTIFY_TYPE, callback); - crm_xml_add_int(notify_msg, PCMK__XA_CIB_NOTIFY_ACTIVATE, enabled); + pcmk__xe_set(notify_msg, PCMK__XA_CIB_OP, PCMK__VALUE_CIB_NOTIFY); + pcmk__xe_set(notify_msg, PCMK__XA_CIB_NOTIFY_TYPE, callback); + pcmk__xe_set_int(notify_msg, PCMK__XA_CIB_NOTIFY_ACTIVATE, enabled); pcmk__remote_send_xml(&private->callback, notify_msg); pcmk__xml_free(notify_msg); return pcmk_ok; diff --git a/lib/cib/cib_utils.c b/lib/cib/cib_utils.c index 26981946809..587706d41d6 100644 --- a/lib/cib/cib_utils.c +++ b/lib/cib/cib_utils.c @@ -1,6 +1,6 @@ /* * Original copyright 2004 International Business Machines - * Later changes copyright 2008-2024 the Pacemaker project contributors + * Later changes copyright 2008-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -19,7 +19,9 @@ #include #include +#include // pcmk_acl_required(), etc. #include +#include // pcmk_unpack_nvpair_blocks() #include #include @@ -32,12 +34,11 @@ cib_version_details(xmlNode * cib, int *admin_epoch, int *epoch, int *updates) if (cib == NULL) { return FALSE; - - } else { - crm_element_value_int(cib, PCMK_XA_EPOCH, epoch); - crm_element_value_int(cib, PCMK_XA_NUM_UPDATES, updates); - crm_element_value_int(cib, PCMK_XA_ADMIN_EPOCH, admin_epoch); } + + pcmk__xe_get_int(cib, PCMK_XA_EPOCH, epoch); + pcmk__xe_get_int(cib, PCMK_XA_NUM_UPDATES, updates); + pcmk__xe_get_int(cib, PCMK_XA_ADMIN_EPOCH, admin_epoch); return TRUE; } @@ -48,7 +49,7 @@ cib_diff_version_details(xmlNode * diff, int *admin_epoch, int *epoch, int *upda int add[] = { 0, 0, 0 }; int del[] = { 0, 0, 0 }; - xml_patch_versions(diff, add, del); + pcmk__xml_patchset_versions(diff, del, add); *admin_epoch = add[0]; *epoch = add[1]; @@ -80,16 +81,16 @@ cib__get_notify_patchset(const xmlNode *msg, const xmlNode **patchset) *patchset = NULL; if (msg == NULL) { - crm_err("CIB diff notification received with no XML"); + pcmk__err("CIB diff notification received with no XML"); return ENOMSG; } - if ((crm_element_value_int(msg, PCMK__XA_CIB_RC, &rc) != 0) + if ((pcmk__xe_get_int(msg, PCMK__XA_CIB_RC, &rc) != pcmk_rc_ok) || (rc != pcmk_ok)) { - crm_warn("Ignore failed CIB update: %s " QB_XS " rc=%d", - pcmk_strerror(rc), rc); - crm_log_xml_debug(msg, "failed"); + pcmk__warn("Ignore failed CIB update: %s " QB_XS " rc=%d", + pcmk_strerror(rc), rc); + pcmk__log_xml_debug(msg, "failed"); return pcmk_legacy2rc(rc); } @@ -97,7 +98,7 @@ cib__get_notify_patchset(const xmlNode *msg, const xmlNode **patchset) *patchset = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); if (*patchset == NULL) { - crm_err("CIB diff notification received with no patchset"); + pcmk__err("CIB diff notification received with no patchset"); return ENOMSG; } return pcmk_rc_ok; @@ -119,12 +120,12 @@ createEmptyCib(int cib_epoch) xmlNode *cib_root = NULL, *config = NULL; cib_root = pcmk__xe_create(NULL, PCMK_XE_CIB); - crm_xml_add(cib_root, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); - crm_xml_add(cib_root, PCMK_XA_VALIDATE_WITH, pcmk__highest_schema_name()); + pcmk__xe_set(cib_root, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(cib_root, PCMK_XA_VALIDATE_WITH, pcmk__highest_schema_name()); - crm_xml_add_int(cib_root, PCMK_XA_EPOCH, cib_epoch); - crm_xml_add_int(cib_root, PCMK_XA_NUM_UPDATES, 0); - crm_xml_add_int(cib_root, PCMK_XA_ADMIN_EPOCH, 0); + pcmk__xe_set_int(cib_root, PCMK_XA_EPOCH, cib_epoch); + pcmk__xe_set_int(cib_root, PCMK_XA_NUM_UPDATES, 0); + pcmk__xe_set_int(cib_root, PCMK_XA_ADMIN_EPOCH, 0); config = pcmk__xe_create(cib_root, PCMK_XE_CONFIGURATION); pcmk__xe_create(cib_root, PCMK_XE_STATUS); @@ -140,11 +141,12 @@ createEmptyCib(int cib_epoch) xmlNode *meta = pcmk__xe_create(rsc_defaults, PCMK_XE_META_ATTRIBUTES); xmlNode *nvpair = pcmk__xe_create(meta, PCMK_XE_NVPAIR); - crm_xml_add(meta, PCMK_XA_ID, "build-resource-defaults"); - crm_xml_add(nvpair, PCMK_XA_ID, "build-" PCMK_META_RESOURCE_STICKINESS); - crm_xml_add(nvpair, PCMK_XA_NAME, PCMK_META_RESOURCE_STICKINESS); - crm_xml_add_int(nvpair, PCMK_XA_VALUE, - PCMK__RESOURCE_STICKINESS_DEFAULT); + pcmk__xe_set(meta, PCMK_XA_ID, "build-resource-defaults"); + pcmk__xe_set(nvpair, PCMK_XA_ID, + "build-" PCMK_META_RESOURCE_STICKINESS); + pcmk__xe_set(nvpair, PCMK_XA_NAME, PCMK_META_RESOURCE_STICKINESS); + pcmk__xe_set_int(nvpair, PCMK_XA_VALUE, + PCMK__RESOURCE_STICKINESS_DEFAULT); } #endif return cib_root; @@ -153,7 +155,7 @@ createEmptyCib(int cib_epoch) static bool cib_acl_enabled(xmlNode *xml, const char *user) { - bool rc = FALSE; + bool rc = false; if(pcmk_acl_required(user)) { const char *value = NULL; @@ -161,11 +163,11 @@ cib_acl_enabled(xmlNode *xml, const char *user) cib_read_config(options, xml); value = pcmk__cluster_option(options, PCMK_OPT_ENABLE_ACL); - rc = crm_is_true(value); + rc = pcmk__is_true(value); g_hash_table_destroy(options); } - crm_trace("CIB ACL is %s", rc ? "enabled" : "disabled"); + pcmk__trace("CIB ACL is %s", (rc? "enabled" : "disabled")); return rc; } @@ -182,7 +184,7 @@ cib_acl_enabled(xmlNode *xml, const char *user) static bool should_copy_cib(const char *op, const char *section, int call_options) { - if (pcmk_is_set(call_options, cib_dryrun)) { + if (pcmk__is_set(call_options, cib_dryrun)) { // cib_dryrun implies a scratch copy by definition; no side effects return true; } @@ -195,7 +197,7 @@ should_copy_cib(const char *op, const char *section, int call_options) return true; } - if (pcmk_is_set(call_options, cib_transaction)) { + if (pcmk__is_set(call_options, cib_transaction)) { /* If cib_transaction is set, then we're in the process of committing a * transaction. The commit-transaction request already made a scratch * copy, and we're accumulating changes in that copy. @@ -232,12 +234,13 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, xmlNode *patchset_cib = NULL; xmlNode *local_diff = NULL; - const char *user = crm_element_value(req, PCMK__XA_CIB_USER); + const char *user = pcmk__xe_get(req, PCMK__XA_CIB_USER); + const bool enable_acl = cib_acl_enabled(*current_cib, user); bool with_digest = false; - crm_trace("Begin %s%s%s op", - (pcmk_is_set(call_options, cib_dryrun)? "dry run of " : ""), - (is_query? "read-only " : ""), op); + pcmk__trace("Begin %s%s%s op", + (pcmk__is_set(call_options, cib_dryrun)? "dry run of " : ""), + (is_query? "read-only " : ""), op); CRM_CHECK(output != NULL, return -ENOMSG); CRM_CHECK(current_cib != NULL, return -ENOMSG); @@ -259,16 +262,16 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, xmlNode *cib_ro = *current_cib; xmlNode *cib_filtered = NULL; - if (cib_acl_enabled(cib_ro, user) + if (enable_acl && xml_acl_filtered_copy(user, *current_cib, *current_cib, &cib_filtered)) { if (cib_filtered == NULL) { - crm_debug("Pre-filtered the entire cib"); + pcmk__debug("Pre-filtered the entire cib"); return -EACCES; } cib_ro = cib_filtered; - crm_log_xml_trace(cib_ro, "filtered"); + pcmk__log_xml_trace(cib_ro, "filtered"); } rc = (*fn) (op, call_options, section, req, input, cib_ro, result_cib, output); @@ -307,11 +310,19 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, pcmk__xe_copy_attrs(top, scratch, pcmk__xaf_none); patchset_cib = top; - xml_track_changes(scratch, user, NULL, cib_acl_enabled(scratch, user)); + pcmk__xml_commit_changes(scratch->doc); + pcmk__xml_doc_set_flags(scratch->doc, pcmk__xf_tracking); + if (enable_acl) { + pcmk__enable_acl(*current_cib, scratch, user); + } + rc = (*fn) (op, call_options, section, req, input, scratch, &scratch, output); /* If scratch points to a new object now (for example, after an erase * operation), then *current_cib should point to the same object. + * + * @TODO Enable tracking and ACLs and calculate changes? Change tracking + * and unpacked ACLs didn't carry over to new object. */ *current_cib = scratch; @@ -319,15 +330,25 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, scratch = pcmk__xml_copy(NULL, *current_cib); patchset_cib = *current_cib; - xml_track_changes(scratch, user, NULL, cib_acl_enabled(scratch, user)); + pcmk__xml_doc_set_flags(scratch->doc, pcmk__xf_tracking); + if (enable_acl) { + pcmk__enable_acl(*current_cib, scratch, user); + } + rc = (*fn) (op, call_options, section, req, input, *current_cib, &scratch, output); + /* @TODO This appears to be a hack to determine whether scratch points + * to a new object now, without saving the old pointer (which may be + * invalid now) for comparison. Confirm this, and check more clearly. + */ if (!pcmk__xml_doc_all_flags_set(scratch->doc, pcmk__xf_tracking)) { - crm_trace("Inferring changes after %s op", op); - xml_track_changes(scratch, user, *current_cib, - cib_acl_enabled(*current_cib, user)); - xml_calculate_changes(*current_cib, scratch); + pcmk__trace("Inferring changes after %s op", op); + pcmk__xml_commit_changes(scratch->doc); + if (enable_acl) { + pcmk__enable_acl(*current_cib, scratch, user); + } + pcmk__xml_mark_changes(*current_cib, scratch); } CRM_CHECK(*current_cib != scratch, return -EINVAL); } @@ -339,7 +360,7 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, goto done; } else if(rc == pcmk_ok && xml_acl_denied(scratch)) { - crm_trace("ACL rejected part or all of the proposed changes"); + pcmk__trace("ACL rejected part or all of the proposed changes"); rc = -EACCES; goto done; @@ -352,12 +373,14 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, * is checked elsewhere. */ if (scratch && (cib == NULL || cib->variant != cib_file)) { - const char *new_version = crm_element_value(scratch, PCMK_XA_CRM_FEATURE_SET); + const char *new_version = pcmk__xe_get(scratch, + PCMK_XA_CRM_FEATURE_SET); rc = pcmk__check_feature_set(new_version); if (rc != pcmk_rc_ok) { - crm_err("Discarding update with feature set '%s' greater than " - "our own '%s'", new_version, CRM_FEATURE_SET); + pcmk__err("Discarding update with feature set '%s' greater than " + "our own '%s'", + new_version, CRM_FEATURE_SET); rc = pcmk_rc2legacy(rc); goto done; } @@ -367,30 +390,30 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, int old = 0; int new = 0; - crm_element_value_int(scratch, PCMK_XA_ADMIN_EPOCH, &new); - crm_element_value_int(patchset_cib, PCMK_XA_ADMIN_EPOCH, &old); + pcmk__xe_get_int(scratch, PCMK_XA_ADMIN_EPOCH, &new); + pcmk__xe_get_int(patchset_cib, PCMK_XA_ADMIN_EPOCH, &old); if (old > new) { - crm_err("%s went backwards: %d -> %d (Opts: %#x)", - PCMK_XA_ADMIN_EPOCH, old, new, call_options); - crm_log_xml_warn(req, "Bad Op"); - crm_log_xml_warn(input, "Bad Data"); + pcmk__err("%s went backwards: %d -> %d (Opts: %#x)", + PCMK_XA_ADMIN_EPOCH, old, new, call_options); + pcmk__log_xml_warn(req, "Bad Op"); + pcmk__log_xml_warn(input, "Bad Data"); rc = -pcmk_err_old_data; } else if (old == new) { - crm_element_value_int(scratch, PCMK_XA_EPOCH, &new); - crm_element_value_int(patchset_cib, PCMK_XA_EPOCH, &old); + pcmk__xe_get_int(scratch, PCMK_XA_EPOCH, &new); + pcmk__xe_get_int(patchset_cib, PCMK_XA_EPOCH, &old); if (old > new) { - crm_err("%s went backwards: %d -> %d (Opts: %#x)", - PCMK_XA_EPOCH, old, new, call_options); - crm_log_xml_warn(req, "Bad Op"); - crm_log_xml_warn(input, "Bad Data"); + pcmk__err("%s went backwards: %d -> %d (Opts: %#x)", + PCMK_XA_EPOCH, old, new, call_options); + pcmk__log_xml_warn(req, "Bad Op"); + pcmk__log_xml_warn(input, "Bad Data"); rc = -pcmk_err_old_data; } } } - crm_trace("Massaging CIB contents"); + pcmk__trace("Massaging CIB contents"); pcmk__strip_xml_text(scratch); if (make_copy) { @@ -406,13 +429,15 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, local_diff = xml_create_patchset(0, patchset_cib, scratch, config_changed, manage_counters); - pcmk__log_xml_changes(LOG_TRACE, scratch); - xml_accept_changes(scratch); + pcmk__log_xml_changes(PCMK__LOG_TRACE, scratch); + pcmk__xml_commit_changes(scratch->doc); if(local_diff) { - patchset_process_digest(local_diff, patchset_cib, scratch, with_digest); + if (with_digest) { + pcmk__xml_patchset_add_digest(local_diff, scratch); + } pcmk__log_xml_patchset(LOG_INFO, local_diff); - crm_log_xml_trace(local_diff, "raw patch"); + pcmk__log_xml_trace(local_diff, "raw patch"); } if (make_copy && (local_diff != NULL)) { @@ -424,19 +449,23 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, int format = 1; xmlNode *cib_copy = pcmk__xml_copy(NULL, patchset_cib); - crm_element_value_int(local_diff, PCMK_XA_FORMAT, &format); + pcmk__xe_get_int(local_diff, PCMK_XA_FORMAT, &format); test_rc = xml_apply_patchset(cib_copy, local_diff, manage_counters); if (test_rc != pcmk_ok) { - save_xml_to_file(cib_copy, "PatchApply:calculated", NULL); - save_xml_to_file(patchset_cib, "PatchApply:input", NULL); - save_xml_to_file(scratch, "PatchApply:actual", NULL); - save_xml_to_file(local_diff, "PatchApply:diff", NULL); - crm_err("v%d patchset error, patch failed to apply: %s " - "(%d)", - format, pcmk_rc_str(pcmk_legacy2rc(test_rc)), - test_rc); + pcmk__xml_write_temp_file(cib_copy, "PatchApply:calculated", + NULL); + pcmk__xml_write_temp_file(patchset_cib, "PatchApply:input", + NULL); + pcmk__xml_write_temp_file(scratch, "PatchApply:actual", + NULL); + pcmk__xml_write_temp_file(local_diff, "PatchApply:diff", + NULL); + pcmk__err("v%d patchset error, patch failed to apply: %s " + "(%d)", + format, pcmk_rc_str(pcmk_legacy2rc(test_rc)), + test_rc); } pcmk__xml_free(cib_copy); }, @@ -464,8 +493,8 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, }; */ - if (*config_changed && !pcmk_is_set(call_options, cib_no_mtime)) { - const char *schema = crm_element_value(scratch, PCMK_XA_VALIDATE_WITH); + if (*config_changed && !pcmk__is_set(call_options, cib_no_mtime)) { + const char *schema = pcmk__xe_get(scratch, PCMK_XA_VALIDATE_WITH); if (schema == NULL) { rc = -pcmk_err_cib_corrupt; @@ -478,31 +507,30 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, * the ones in req (if the schema allows the attributes) */ if (pcmk__cmp_schemas_by_name(schema, "pacemaker-1.2") >= 0) { - const char *origin = crm_element_value(req, PCMK__XA_SRC); - const char *client = crm_element_value(req, - PCMK__XA_CIB_CLIENTNAME); + const char *origin = pcmk__xe_get(req, PCMK__XA_SRC); + const char *client = pcmk__xe_get(req, PCMK__XA_CIB_CLIENTNAME); if (origin != NULL) { - crm_xml_add(scratch, PCMK_XA_UPDATE_ORIGIN, origin); + pcmk__xe_set(scratch, PCMK_XA_UPDATE_ORIGIN, origin); } else { pcmk__xe_remove_attr(scratch, PCMK_XA_UPDATE_ORIGIN); } if (client != NULL) { - crm_xml_add(scratch, PCMK_XA_UPDATE_CLIENT, user); + pcmk__xe_set(scratch, PCMK_XA_UPDATE_CLIENT, user); } else { pcmk__xe_remove_attr(scratch, PCMK_XA_UPDATE_CLIENT); } if (user != NULL) { - crm_xml_add(scratch, PCMK_XA_UPDATE_USER, user); + pcmk__xe_set(scratch, PCMK_XA_UPDATE_USER, user); } else { pcmk__xe_remove_attr(scratch, PCMK_XA_UPDATE_USER); } } } - crm_trace("Perform validation: %s", pcmk__btoa(check_schema)); + pcmk__trace("Perform validation: %s", pcmk__btoa(check_schema)); if ((rc == pcmk_ok) && check_schema && !pcmk__configured_schema_validates(scratch)) { rc = -pcmk_err_schema_validation; @@ -519,7 +547,7 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, && xml_acl_filtered_copy(user, patchset_cib, scratch, result_cib)) { if (*result_cib == NULL) { - crm_debug("Pre-filtered the entire cib result"); + pcmk__debug("Pre-filtered the entire cib result"); } pcmk__xml_free(scratch); } @@ -531,7 +559,7 @@ cib_perform_op(cib_t *cib, const char *op, uint32_t call_options, } pcmk__xml_free(top); - crm_trace("Done"); + pcmk__trace("Done"); return rc; } @@ -550,16 +578,17 @@ cib__create_op(cib_t *cib, const char *op, const char *host, cib->call_id = 1; } - crm_xml_add(*op_msg, PCMK__XA_T, PCMK__VALUE_CIB); - crm_xml_add(*op_msg, PCMK__XA_CIB_OP, op); - crm_xml_add(*op_msg, PCMK__XA_CIB_HOST, host); - crm_xml_add(*op_msg, PCMK__XA_CIB_SECTION, section); - crm_xml_add(*op_msg, PCMK__XA_CIB_USER, user_name); - crm_xml_add(*op_msg, PCMK__XA_CIB_CLIENTNAME, client_name); - crm_xml_add_int(*op_msg, PCMK__XA_CIB_CALLID, cib->call_id); + pcmk__xe_set(*op_msg, PCMK__XA_T, PCMK__VALUE_CIB); + pcmk__xe_set(*op_msg, PCMK__XA_CIB_OP, op); + pcmk__xe_set(*op_msg, PCMK__XA_CIB_HOST, host); + pcmk__xe_set(*op_msg, PCMK__XA_CIB_SECTION, section); + pcmk__xe_set(*op_msg, PCMK__XA_CIB_USER, user_name); + pcmk__xe_set(*op_msg, PCMK__XA_CIB_CLIENTNAME, client_name); + pcmk__xe_set_int(*op_msg, PCMK__XA_CIB_CALLID, cib->call_id); - crm_trace("Sending call options: %.8lx, %d", (long)call_options, call_options); - crm_xml_add_int(*op_msg, PCMK__XA_CIB_CALLOPT, call_options); + pcmk__trace("Sending call options: %.8lx, %d", (long) call_options, + call_options); + pcmk__xe_set_int(*op_msg, PCMK__XA_CIB_CALLOPT, call_options); if (data != NULL) { xmlNode *wrapper = pcmk__xe_create(*op_msg, PCMK__XE_CIB_CALLDATA); @@ -581,8 +610,8 @@ cib__create_op(cib_t *cib, const char *op, const char *host, static int validate_transaction_request(const xmlNode *request) { - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); - const char *host = crm_element_value(request, PCMK__XA_CIB_HOST); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); + const char *host = pcmk__xe_get(request, PCMK__XA_CIB_HOST); const cib__operation_t *operation = NULL; int rc = cib__get_operation(op, &operation); @@ -591,15 +620,15 @@ validate_transaction_request(const xmlNode *request) return rc; } - if (!pcmk_is_set(operation->flags, cib__op_attr_transaction)) { - crm_err("Operation %s is not supported in CIB transactions", op); + if (!pcmk__is_set(operation->flags, cib__op_attr_transaction)) { + pcmk__err("Operation %s is not supported in CIB transactions", op); return EOPNOTSUPP; } if (host != NULL) { - crm_err("Operation targeting a specific node (%s) is not supported in " - "a CIB transaction", - host); + pcmk__err("Operation targeting a specific node (%s) is not supported " + "in a CIB transaction", + host); return EOPNOTSUPP; } return pcmk_rc_ok; @@ -631,13 +660,14 @@ cib__extend_transaction(cib_t *cib, xmlNode *request) pcmk__xml_copy(cib->transaction, request); } else { - const char *op = crm_element_value(request, PCMK__XA_CIB_OP); + const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP); const char *client_id = NULL; cib->cmds->client_id(cib, NULL, &client_id); - crm_err("Failed to add '%s' operation to transaction for client %s: %s", - op, pcmk__s(client_id, "(unidentified)"), pcmk_rc_str(rc)); - crm_log_xml_info(request, "failed"); + pcmk__err("Failed to add '%s' operation to transaction for client %s: " + "%s", + op, pcmk__s(client_id, "(unidentified)"), pcmk_rc_str(rc)); + pcmk__log_xml_info(request, "failed"); } return pcmk_rc2legacy(rc); } @@ -651,8 +681,8 @@ cib_native_callback(cib_t * cib, xmlNode * msg, int call_id, int rc) if (msg != NULL) { xmlNode *wrapper = NULL; - crm_element_value_int(msg, PCMK__XA_CIB_RC, &rc); - crm_element_value_int(msg, PCMK__XA_CIB_CALLID, &call_id); + pcmk__xe_get_int(msg, PCMK__XA_CIB_RC, &rc); + pcmk__xe_get_int(msg, PCMK__XA_CIB_CALLID, &call_id); wrapper = pcmk__xe_first_child(msg, PCMK__XE_CIB_CALLDATA, NULL, NULL); output = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); } @@ -660,11 +690,11 @@ cib_native_callback(cib_t * cib, xmlNode * msg, int call_id, int rc) blob = cib__lookup_id(call_id); if (blob == NULL) { - crm_trace("No callback found for call %d", call_id); + pcmk__trace("No callback found for call %d", call_id); } if (cib == NULL) { - crm_debug("No cib object supplied"); + pcmk__debug("No cib object supplied"); } if (rc == -pcmk_err_diff_resync) { @@ -673,13 +703,13 @@ cib_native_callback(cib_t * cib, xmlNode * msg, int call_id, int rc) } if (blob && blob->callback && (rc == pcmk_ok || blob->only_success == FALSE)) { - crm_trace("Invoking callback %s for call %d", - pcmk__s(blob->id, "without ID"), call_id); + pcmk__trace("Invoking callback %s for call %d", + pcmk__s(blob->id, "without ID"), call_id); blob->callback(msg, call_id, rc, output, blob->user_data); } else if ((cib != NULL) && (rc != pcmk_ok)) { - crm_warn("CIB command failed: %s", pcmk_strerror(rc)); - crm_log_xml_debug(msg, "Failed CIB Update"); + pcmk__warn("CIB command failed: %s", pcmk_strerror(rc)); + pcmk__log_xml_debug(msg, "Failed CIB Update"); } /* This may free user_data, so do it after the callback */ @@ -687,7 +717,7 @@ cib_native_callback(cib_t * cib, xmlNode * msg, int call_id, int rc) remove_cib_op_callback(call_id, FALSE); } - crm_trace("OP callback activated for %d", call_id); + pcmk__trace("OP callback activated for %d", call_id); } void @@ -698,28 +728,29 @@ cib_native_notify(gpointer data, gpointer user_data) const char *event = NULL; if (msg == NULL) { - crm_warn("Skipping callback - NULL message"); + pcmk__warn("Skipping callback - NULL message"); return; } - event = crm_element_value(msg, PCMK__XA_SUBT); + event = pcmk__xe_get(msg, PCMK__XA_SUBT); if (entry == NULL) { - crm_warn("Skipping callback - NULL callback client"); + pcmk__warn("Skipping callback - NULL callback client"); return; } else if (entry->callback == NULL) { - crm_warn("Skipping callback - NULL callback"); + pcmk__warn("Skipping callback - NULL callback"); return; } else if (!pcmk__str_eq(entry->event, event, pcmk__str_casei)) { - crm_trace("Skipping callback - event mismatch %p/%s vs. %s", entry, entry->event, event); + pcmk__trace("Skipping callback - event mismatch %p/%s vs. %s", entry, + entry->event, event); return; } - crm_trace("Invoking callback for %p/%s event...", entry, event); + pcmk__trace("Invoking callback for %p/%s event...", entry, event); entry->callback(event, msg); - crm_trace("Callback invoked..."); + pcmk__trace("Callback invoked..."); } gboolean @@ -799,7 +830,7 @@ cib_apply_patch_event(xmlNode *event, xmlNode *input, xmlNode **output, pcmk__assert((event != NULL) && (input != NULL) && (output != NULL)); - crm_element_value_int(event, PCMK__XA_CIB_RC, &rc); + pcmk__xe_get_int(event, PCMK__XA_CIB_RC, &rc); wrapper = pcmk__xe_first_child(event, PCMK__XE_CIB_UPDATE_RESULT, NULL, NULL); diff = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); @@ -817,11 +848,12 @@ cib_apply_patch_event(xmlNode *event, xmlNode *input, xmlNode **output, NULL); if (rc != pcmk_ok) { - crm_debug("Update didn't apply: %s (%d) %p", - pcmk_strerror(rc), rc, *output); + pcmk__debug("Update didn't apply: %s (%d) %p", pcmk_strerror(rc), + rc, *output); if (rc == -pcmk_err_old_data) { - crm_trace("Masking error, we already have the supplied update"); + pcmk__trace("Masking error, we already have the supplied " + "update"); return pcmk_ok; } pcmk__xml_free(*output); @@ -836,7 +868,7 @@ cib_apply_patch_event(xmlNode *event, xmlNode *input, xmlNode **output, if (out != NULL) { \ out->err(out, fmt, ##args); \ } else { \ - crm_err(fmt, ##args); \ + pcmk__err(fmt, ##args); \ } \ } while (0) @@ -898,8 +930,8 @@ cib__signon_attempts(cib_t *cib, enum cib_conn_type type, int attempts) { int rc = pcmk_rc_ok; - crm_trace("Attempting connection to CIB manager (up to %d time%s)", - attempts, pcmk__plural_s(attempts)); + pcmk__trace("Attempting connection to CIB manager (up to %d time%s)", + attempts, pcmk__plural_s(attempts)); for (int remaining = attempts - 1; remaining >= 0; --remaining) { rc = cib->cmds->signon(cib, crm_system_name, type); @@ -912,8 +944,9 @@ cib__signon_attempts(cib_t *cib, enum cib_conn_type type, int attempts) // Retry after soft error (interrupted by signal, etc.) pcmk__sleep_ms((attempts - remaining) * 500); - crm_debug("Re-attempting connection to CIB manager (%d attempt%s remaining)", - remaining, pcmk__plural_s(remaining)); + pcmk__debug("Re-attempting connection to CIB manager (%d attempt%s " + "remaining)", + remaining, pcmk__plural_s(remaining)); } return rc; diff --git a/lib/cluster/cluster.c b/lib/cluster/cluster.c index dda4b8e89ae..2e855ba3654 100644 --- a/lib/cluster/cluster.c +++ b/lib/cluster/cluster.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -53,7 +53,8 @@ pcmk__cluster_get_xml_id(pcmk__node_status_t *node) } // xml_id is always set when a Pacemaker Remote node entry is created - CRM_CHECK(!pcmk_is_set(node->flags, pcmk__node_status_remote), return NULL); + CRM_CHECK(!pcmk__is_set(node->flags, pcmk__node_status_remote), + return NULL); switch (cluster_layer) { #if SUPPORT_COROSYNC @@ -63,8 +64,8 @@ pcmk__cluster_get_xml_id(pcmk__node_status_t *node) #endif // SUPPORT_COROSYNC default: - crm_err("Unsupported cluster layer %s", - pcmk_cluster_layer_text(cluster_layer)); + pcmk__err("Unsupported cluster layer %s", + pcmk_cluster_layer_text(cluster_layer)); return NULL; } } @@ -88,7 +89,7 @@ pcmk_cluster_connect(pcmk_cluster_t *cluster) } // cts-lab looks for this message - crm_notice("Connecting to %s cluster layer", cluster_layer_s); + pcmk__notice("Connecting to %s cluster layer", cluster_layer_s); switch (cluster_layer) { #if SUPPORT_COROSYNC @@ -100,8 +101,8 @@ pcmk_cluster_connect(pcmk_cluster_t *cluster) break; } - crm_err("Failed to connect to unsupported cluster layer %s", - cluster_layer_s); + pcmk__err("Failed to connect to unsupported cluster layer %s", + cluster_layer_s); return EPROTONOSUPPORT; } @@ -118,7 +119,7 @@ pcmk_cluster_disconnect(pcmk_cluster_t *cluster) const enum pcmk_cluster_layer cluster_layer = pcmk_get_cluster_layer(); const char *cluster_layer_s = pcmk_cluster_layer_text(cluster_layer); - crm_info("Disconnecting from %s cluster layer", cluster_layer_s); + pcmk__info("Disconnecting from %s cluster layer", cluster_layer_s); switch (cluster_layer) { #if SUPPORT_COROSYNC @@ -132,8 +133,8 @@ pcmk_cluster_disconnect(pcmk_cluster_t *cluster) break; } - crm_err("Failed to disconnect from unsupported cluster layer %s", - cluster_layer_s); + pcmk__err("Failed to disconnect from unsupported cluster layer %s", + cluster_layer_s); return EPROTONOSUPPORT; } @@ -251,28 +252,28 @@ pcmk__cluster_node_name(uint32_t nodeid) #endif // SUPPORT_COROSYNC default: - crm_err("Unsupported cluster layer: %s", cluster_layer_s); + pcmk__err("Unsupported cluster layer: %s", cluster_layer_s); break; } if (nodeid == 0) { struct utsname hostinfo; - crm_notice("Could not get local node name from %s cluster layer, " - "defaulting to local hostname", - cluster_layer_s); + pcmk__notice("Could not get local node name from %s cluster layer, " + "defaulting to local hostname", + cluster_layer_s); if (uname(&hostinfo) < 0) { // @TODO Maybe let the caller decide what to do - crm_err("Failed to get the local hostname"); + pcmk__err("Failed to get the local hostname"); crm_exit(CRM_EX_FATAL); } return pcmk__str_copy(hostinfo.nodename); } - crm_notice("Could not obtain a node name for node with " - PCMK_XA_ID "=" PRIu32, - nodeid); + pcmk__notice("Could not obtain a node name for node with " + PCMK_XA_ID "=" PRIu32, + nodeid); return NULL; } @@ -364,7 +365,7 @@ pcmk_cluster_layer_text(enum pcmk_cluster_layer layer) case pcmk_cluster_layer_invalid: return "invalid"; default: - crm_err("Invalid cluster layer: %d", layer); + pcmk__err("Invalid cluster layer: %d", layer); return "invalid"; } } @@ -394,7 +395,7 @@ pcmk_get_cluster_layer(void) cluster = pcmk__env_option(PCMK__ENV_CLUSTER_TYPE); if (cluster != NULL) { - crm_info("Verifying configured cluster layer '%s'", cluster); + pcmk__info("Verifying configured cluster layer '%s'", cluster); cluster_layer = pcmk_cluster_layer_invalid; #if SUPPORT_COROSYNC @@ -404,27 +405,27 @@ pcmk_get_cluster_layer(void) #endif // SUPPORT_COROSYNC if (cluster_layer == pcmk_cluster_layer_invalid) { - crm_notice("This installation does not support the '%s' cluster " - "infrastructure: terminating", - cluster); + pcmk__notice("This installation does not support the '%s' cluster " + "infrastructure: terminating", + cluster); crm_exit(CRM_EX_FATAL); } - crm_info("Assuming an active '%s' cluster", cluster); + pcmk__info("Assuming an active '%s' cluster", cluster); } else { // Nothing configured, so test supported cluster layers #if SUPPORT_COROSYNC - crm_debug("Testing with Corosync"); + pcmk__debug("Testing with Corosync"); if (pcmk__corosync_is_active()) { cluster_layer = pcmk_cluster_layer_corosync; } #endif // SUPPORT_COROSYNC if (cluster_layer == pcmk_cluster_layer_unknown) { - crm_notice("Could not determine the current cluster layer"); + pcmk__notice("Could not determine the current cluster layer"); } else { - crm_info("Detected an active '%s' cluster", - pcmk_cluster_layer_text(cluster_layer)); + pcmk__info("Detected an active '%s' cluster", + pcmk_cluster_layer_text(cluster_layer)); } } @@ -462,7 +463,7 @@ name_for_cluster_type(enum cluster_type_e type) case pcmk_cluster_invalid: return "invalid"; } - crm_err("Invalid cluster type: %d", type); + pcmk__err("Invalid cluster type: %d", type); return "invalid"; } diff --git a/lib/cluster/corosync.c b/lib/cluster/corosync.c index 2782b100671..7d8e42236a9 100644 --- a/lib/cluster/corosync.c +++ b/lib/cluster/corosync.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -14,6 +14,7 @@ #include #include #include +#include // uint32_t, etc. #include #include @@ -56,9 +57,9 @@ pcmk__corosync_uuid(const pcmk__node_status_t *node) if (node != NULL) { if (node->cluster_layer_id > 0) { - return crm_strdup_printf("%" PRIu32, node->cluster_layer_id); + return pcmk__assert_asprintf("%" PRIu32, node->cluster_layer_id); } else { - crm_info("Node %s is not yet known by Corosync", node->name); + pcmk__info("Node %s is not yet known by Corosync", node->name); } } return NULL; @@ -70,18 +71,18 @@ node_name_is_valid(const char *key, const char *name) int octet; if (name == NULL) { - crm_trace("%s is empty", key); + pcmk__trace("%s is empty", key); return false; } else if (sscanf(name, "%d.%d.%d.%d", &octet, &octet, &octet, &octet) == 4) { - crm_trace("%s contains an IPv4 address (%s), ignoring", key, name); + pcmk__trace("%s contains an IPv4 address (%s), ignoring", key, name); return false; } else if (strstr(name, ":") != NULL) { - crm_trace("%s contains an IPv6 address (%s), ignoring", key, name); + pcmk__trace("%s contains an IPv6 address (%s), ignoring", key, name); return false; } - crm_trace("'%s: %s' is valid", key, name); + pcmk__trace("'%s: %s' is valid", key, name); return true; } @@ -119,21 +120,22 @@ pcmk__corosync_name(uint64_t /*cmap_handle_t */ cmap_handle, uint32_t nodeid) if (cmap_handle == 0 && local_handle == 0) { retries = 0; - crm_trace("Initializing CMAP connection"); + pcmk__trace("Initializing CMAP connection"); do { rc = pcmk__init_cmap(&local_handle); if (rc != CS_OK) { retries++; - crm_debug("API connection setup failed: %s. Retrying in %ds", cs_strerror(rc), - retries); + pcmk__debug("API connection setup failed: %s. Retrying in %ds", + cs_strerror(rc), retries); sleep(retries); } } while (retries < 5 && rc != CS_OK); if (rc != CS_OK) { - crm_warn("Could not connect to Cluster Configuration Database API, error %s", - cs_strerror(rc)); + pcmk__warn("Could not connect to Cluster Configuration Database " + "API, error %s", + cs_strerror(rc)); local_handle = 0; } } @@ -143,22 +145,22 @@ pcmk__corosync_name(uint64_t /*cmap_handle_t */ cmap_handle, uint32_t nodeid) rc = cmap_fd_get(cmap_handle, &fd); if (rc != CS_OK) { - crm_err("Could not obtain the CMAP API connection: %s (%d)", - cs_strerror(rc), rc); + pcmk__err("Could not obtain the CMAP API connection: %s (%d)", + cs_strerror(rc), rc); goto bail; } /* CMAP provider run as root (in given user namespace, anyway)? */ if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid, &found_uid, &found_gid))) { - crm_err("CMAP provider is not authentic:" - " process %lld (uid: %lld, gid: %lld)", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__err("CMAP provider is not authentic: process %lld " + "(uid: %lld, gid: %lld)", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); goto bail; } else if (rv < 0) { - crm_err("Could not verify authenticity of CMAP provider: %s (%d)", - strerror(-rv), -rv); + pcmk__err("Could not verify authenticity of CMAP provider: %s (%d)", + strerror(-rv), -rv); goto bail; } } @@ -167,9 +169,9 @@ pcmk__corosync_name(uint64_t /*cmap_handle_t */ cmap_handle, uint32_t nodeid) uint32_t id = 0; char *key = NULL; - key = crm_strdup_printf("nodelist.node.%d.nodeid", lpc); + key = pcmk__assert_asprintf("nodelist.node.%d.nodeid", lpc); rc = cmap_get_uint32(cmap_handle, key, &id); - crm_trace("Checking %u vs %u from %s", nodeid, id, key); + pcmk__trace("Checking %u vs %u from %s", nodeid, id, key); free(key); if (rc != CS_OK) { @@ -177,18 +179,18 @@ pcmk__corosync_name(uint64_t /*cmap_handle_t */ cmap_handle, uint32_t nodeid) } if (nodeid == id) { - crm_trace("Searching for node name for %u in nodelist.node.%d %s", - nodeid, lpc, pcmk__s(name, "")); + pcmk__trace("Searching for node name for %u in nodelist.node.%d %s", + nodeid, lpc, pcmk__s(name, "")); if (name == NULL) { - key = crm_strdup_printf("nodelist.node.%d.name", lpc); + key = pcmk__assert_asprintf("nodelist.node.%d.name", lpc); cmap_get_string(cmap_handle, key, &name); - crm_trace("%s = %s", key, pcmk__s(name, "")); + pcmk__trace("%s = %s", key, pcmk__s(name, "")); free(key); } if (name == NULL) { - key = crm_strdup_printf("nodelist.node.%d.ring0_addr", lpc); + key = pcmk__assert_asprintf("nodelist.node.%d.ring0_addr", lpc); cmap_get_string(cmap_handle, key, &name); - crm_trace("%s = %s", key, pcmk__s(name, "")); + pcmk__trace("%s = %s", key, pcmk__s(name, "")); if (!node_name_is_valid(key, name)) { free(name); @@ -208,7 +210,7 @@ pcmk__corosync_name(uint64_t /*cmap_handle_t */ cmap_handle, uint32_t nodeid) } if (name == NULL) { - crm_info("Unable to get node name for nodeid %u", nodeid); + pcmk__info("Unable to get node name for nodeid %u", nodeid); } return name; } @@ -228,7 +230,7 @@ pcmk__corosync_disconnect(pcmk_cluster_t *cluster) quorum_finalize(pcmk_quorum_handle); pcmk_quorum_handle = 0; } - crm_notice("Disconnected from Corosync"); + pcmk__notice("Disconnected from Corosync"); } /*! @@ -245,7 +247,7 @@ quorum_dispatch_cb(gpointer user_data) int rc = quorum_dispatch(pcmk_quorum_handle, CS_DISPATCH_ALL); if (rc < 0) { - crm_err("Connection to the Quorum API failed: %d", rc); + pcmk__err("Connection to the Quorum API failed: %d", rc); quorum_finalize(pcmk_quorum_handle); pcmk_quorum_handle = 0; return -1; @@ -277,24 +279,26 @@ quorum_notification_cb(quorum_handle_t handle, uint32_t quorate, bool was_quorate = pcmk__cluster_has_quorum(); if (is_quorate && !was_quorate) { - crm_notice("Quorum acquired " QB_XS " membership=%" PRIu64 - " members=%" PRIu32, - ring_id, view_list_entries); + pcmk__notice("Quorum acquired " QB_XS " membership=%" PRIu64 + " members=%" PRIu32, + ring_id, view_list_entries); pcmk__cluster_set_quorum(true); } else if (!is_quorate && was_quorate) { - crm_warn("Quorum lost " QB_XS " membership=%" PRIu64 " members=" PRIu32, - ring_id, view_list_entries); + pcmk__warn("Quorum lost " QB_XS " membership=%" PRIu64 + " members=%" PRIu32, + ring_id, view_list_entries); pcmk__cluster_set_quorum(false); } else { - crm_info("Quorum %s " QB_XS " membership=%" PRIu64 " members=%" PRIu32, - (is_quorate? "retained" : "still lost"), ring_id, - view_list_entries); + pcmk__info("Quorum %s " QB_XS " membership=%" PRIu64 + " members=%" PRIu32, + (is_quorate? "retained" : "still lost"), ring_id, + view_list_entries); } if (view_list_entries == 0 && init_phase) { - crm_info("Corosync membership is still forming, ignoring"); + pcmk__info("Corosync membership is still forming, ignoring"); return; } @@ -311,14 +315,14 @@ quorum_notification_cb(quorum_handle_t handle, uint32_t quorate, for (i = 0; i < view_list_entries; i++) { uint32_t id = view_list[i]; - crm_debug("Member[%d] %u ", i, id); + pcmk__debug("Member[%d] %" PRIu32, i, id); /* Get this node's peer cache entry (adding one if not already there) */ node = pcmk__get_node(id, NULL, NULL, pcmk__node_search_cluster_member); if (node->name == NULL) { char *name = pcmk__corosync_name(0, id); - crm_info("Obtaining name for new node %u", id); + pcmk__info("Obtaining name for new node %u", id); node = pcmk__get_node(id, name, NULL, pcmk__node_search_cluster_member); free(name); @@ -361,7 +365,7 @@ pcmk__corosync_quorum_connect(gboolean (*dispatch)(unsigned long long, quorum_fd_callbacks.dispatch = quorum_dispatch_cb; quorum_fd_callbacks.destroy = destroy; - crm_debug("Configuring Pacemaker to obtain quorum from Corosync"); + pcmk__debug("Configuring Pacemaker to obtain quorum from Corosync"); { #if 0 @@ -385,55 +389,55 @@ pcmk__corosync_quorum_connect(gboolean (*dispatch)(unsigned long long, } if (rc != CS_OK) { - crm_err("Could not connect to the Quorum API: %s (%d)", - cs_strerror(rc), rc); + pcmk__err("Could not connect to the Quorum API: %s (%d)", + cs_strerror(rc), rc); goto bail; } else if (quorum_type != QUORUM_SET) { - crm_err("Corosync quorum is not configured"); + pcmk__err("Corosync quorum is not configured"); goto bail; } rc = quorum_fd_get(pcmk_quorum_handle, &fd); if (rc != CS_OK) { - crm_err("Could not obtain the Quorum API connection: %s (%d)", - strerror(rc), rc); + pcmk__err("Could not obtain the Quorum API connection: %s (%d)", + strerror(rc), rc); goto bail; } /* Quorum provider run as root (in given user namespace, anyway)? */ if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid, &found_uid, &found_gid))) { - crm_err("Quorum provider is not authentic:" - " process %lld (uid: %lld, gid: %lld)", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__err("Quorum provider is not authentic: process %lld " + "(uid: %lld, gid: %lld)", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); rc = CS_ERR_ACCESS; goto bail; } else if (rv < 0) { - crm_err("Could not verify authenticity of Quorum provider: %s (%d)", - strerror(-rv), -rv); + pcmk__err("Could not verify authenticity of Quorum provider: %s (%d)", + strerror(-rv), -rv); rc = CS_ERR_ACCESS; goto bail; } rc = quorum_getquorate(pcmk_quorum_handle, &quorate); if (rc != CS_OK) { - crm_err("Could not obtain the current Quorum API state: %d", rc); + pcmk__err("Could not obtain the current Quorum API state: %d", rc); goto bail; } if (quorate) { - crm_notice("Quorum acquired"); + pcmk__notice("Quorum acquired"); } else { - crm_warn("No quorum"); + pcmk__warn("No quorum"); } quorum_app_callback = dispatch; pcmk__cluster_set_quorum(quorate != 0); rc = quorum_trackstart(pcmk_quorum_handle, CS_TRACK_CHANGES | CS_TRACK_CURRENT); if (rc != CS_OK) { - crm_err("Could not setup Quorum API notifications: %d", rc); + pcmk__err("Could not setup Quorum API notifications: %d", rc); goto bail; } @@ -466,8 +470,8 @@ pcmk__corosync_connect(pcmk_cluster_t *cluster) pcmk__cluster_init_node_caches(); if (cluster_layer != pcmk_cluster_layer_corosync) { - crm_err("Invalid cluster layer: %s " QB_XS " cluster_layer=%d", - cluster_layer_s, cluster_layer); + pcmk__err("Invalid cluster layer: %s " QB_XS " cluster_layer=%d", + cluster_layer_s, cluster_layer); return EINVAL; } @@ -476,17 +480,17 @@ pcmk__corosync_connect(pcmk_cluster_t *cluster) // Error message was logged by pcmk__cpg_connect() return rc; } - crm_info("Connection to %s established", cluster_layer_s); + pcmk__info("Connection to %s established", cluster_layer_s); cluster->priv->node_id = pcmk__cpg_local_nodeid(0); if (cluster->priv->node_id == 0) { - crm_err("Could not determine local node ID"); + pcmk__err("Could not determine local node ID"); return ENXIO; } cluster->priv->node_name = pcmk__cluster_node_name(0); if (cluster->priv->node_name == NULL) { - crm_err("Could not determine local node name"); + pcmk__err("Could not determine local node name"); return ENXIO; } @@ -518,8 +522,8 @@ pcmk__corosync_is_active(void) return true; } - crm_info("Failed to initialize the cmap API: %s (%d)", - pcmk__cs_err_str(rc), rc); + pcmk__info("Failed to initialize the cmap API: %s (%d)", + pcmk__cs_err_str(rc), rc); return false; } @@ -535,17 +539,17 @@ bool pcmk__corosync_is_peer_active(const pcmk__node_status_t *node) { if (node == NULL) { - crm_trace("Corosync peer inactive: NULL"); + pcmk__trace("Corosync peer inactive: NULL"); return false; } if (!pcmk__str_eq(node->state, PCMK_VALUE_MEMBER, pcmk__str_none)) { - crm_trace("Corosync peer %s inactive: state=%s", - node->name, node->state); + pcmk__trace("Corosync peer %s inactive: state=%s", node->name, + node->state); return false; } - if (!pcmk_is_set(node->processes, crm_proc_cpg)) { - crm_trace("Corosync peer %s inactive " QB_XS " processes=%.16" PRIx32, - node->name, node->processes); + if (!pcmk__is_set(node->processes, crm_proc_cpg)) { + pcmk__trace("Corosync peer %s inactive " QB_XS " processes=%.16" PRIx32, + node->name, node->processes); return false; } return true; @@ -577,47 +581,49 @@ pcmk__corosync_add_nodes(xmlNode *xml_parent) rc = pcmk__init_cmap(&cmap_handle); if (rc != CS_OK) { retries++; - crm_debug("API connection setup failed: %s. Retrying in %ds", cs_strerror(rc), - retries); + pcmk__debug("API connection setup failed: %s. Retrying in %ds", + cs_strerror(rc), retries); sleep(retries); } } while (retries < 5 && rc != CS_OK); if (rc != CS_OK) { - crm_warn("Could not connect to Cluster Configuration Database API, error %d", rc); + pcmk__warn("Could not connect to Cluster Configuration Database API, " + "error %d", + rc); return false; } rc = cmap_fd_get(cmap_handle, &fd); if (rc != CS_OK) { - crm_err("Could not obtain the CMAP API connection: %s (%d)", - cs_strerror(rc), rc); + pcmk__err("Could not obtain the CMAP API connection: %s (%d)", + cs_strerror(rc), rc); goto bail; } /* CMAP provider run as root (in given user namespace, anyway)? */ if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid, &found_uid, &found_gid))) { - crm_err("CMAP provider is not authentic:" - " process %lld (uid: %lld, gid: %lld)", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__err("CMAP provider is not authentic: process %lld " + "(uid: %lld, gid: %lld)", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); goto bail; } else if (rv < 0) { - crm_err("Could not verify authenticity of CMAP provider: %s (%d)", - strerror(-rv), -rv); + pcmk__err("Could not verify authenticity of CMAP provider: %s (%d)", + strerror(-rv), -rv); goto bail; } pcmk__cluster_init_node_caches(); - crm_trace("Initializing Corosync node list"); + pcmk__trace("Initializing Corosync node list"); for (lpc = 0; TRUE; lpc++) { uint32_t nodeid = 0; char *name = NULL; char *key = NULL; - key = crm_strdup_printf("nodelist.node.%d.nodeid", lpc); + key = pcmk__assert_asprintf("nodelist.node.%d.nodeid", lpc); rc = cmap_get_uint32(cmap_handle, key, &nodeid); free(key); @@ -637,16 +643,16 @@ pcmk__corosync_add_nodes(xmlNode *xml_parent) && (node->cluster_layer_id != nodeid) && pcmk__str_eq(node->name, name, pcmk__str_casei)) { - crm_crit("Nodes %" PRIu32 " and %" PRIu32 " share the " - "same name '%s': shutting down", - node->cluster_layer_id, nodeid, name); + pcmk__crit("Nodes %" PRIu32 " and %" PRIu32 " share the " + "same name '%s': shutting down", + node->cluster_layer_id, nodeid, name); crm_exit(CRM_EX_FATAL); } } } if (nodeid > 0 || name != NULL) { - crm_trace("Initializing node[%d] %u = %s", lpc, nodeid, name); + pcmk__trace("Initializing node[%d] %u = %s", lpc, nodeid, name); pcmk__get_node(nodeid, name, NULL, pcmk__node_search_cluster_member); } @@ -656,8 +662,8 @@ pcmk__corosync_add_nodes(xmlNode *xml_parent) if (xml_parent) { xmlNode *node = pcmk__xe_create(xml_parent, PCMK_XE_NODE); - crm_xml_add_ll(node, PCMK_XA_ID, (long long) nodeid); - crm_xml_add(node, PCMK_XA_UNAME, name); + pcmk__xe_set_ll(node, PCMK_XA_ID, (long long) nodeid); + pcmk__xe_set(node, PCMK_XA_UNAME, name); } } @@ -688,38 +694,39 @@ pcmk__corosync_cluster_name(void) rc = pcmk__init_cmap(&handle); if (rc != CS_OK) { - crm_info("Failed to initialize the cmap API: %s (%d)", - cs_strerror(rc), rc); + pcmk__info("Failed to initialize the cmap API: %s (%d)", + cs_strerror(rc), rc); return NULL; } rc = cmap_fd_get(handle, &fd); if (rc != CS_OK) { - crm_err("Could not obtain the CMAP API connection: %s (%d)", - cs_strerror(rc), rc); + pcmk__err("Could not obtain the CMAP API connection: %s (%d)", + cs_strerror(rc), rc); goto bail; } /* CMAP provider run as root (in given user namespace, anyway)? */ if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid, &found_uid, &found_gid))) { - crm_err("CMAP provider is not authentic:" - " process %lld (uid: %lld, gid: %lld)", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__err("CMAP provider is not authentic: process %lld " + "(uid: %lld, gid: %lld)", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); goto bail; } else if (rv < 0) { - crm_err("Could not verify authenticity of CMAP provider: %s (%d)", - strerror(-rv), -rv); + pcmk__err("Could not verify authenticity of CMAP provider: %s (%d)", + strerror(-rv), -rv); goto bail; } rc = cmap_get_string(handle, "totem.cluster_name", &cluster_name); if (rc != CS_OK) { - crm_info("Cannot get totem.cluster_name: %s (%d)", cs_strerror(rc), rc); + pcmk__info("Cannot get totem.cluster_name: %s (%d)", cs_strerror(rc), + rc); } else { - crm_debug("cmap totem.cluster_name = '%s'", cluster_name); + pcmk__debug("cmap totem.cluster_name = '%s'", cluster_name); } bail: @@ -759,24 +766,24 @@ pcmk__corosync_has_nodelist(void) cs_rc = pcmk__init_cmap(&cmap_handle); if (cs_rc != CS_OK) { retries++; - crm_debug("CMAP connection failed: %s (rc=%d, retrying in %ds)", - cs_strerror(cs_rc), cs_rc, retries); + pcmk__debug("CMAP connection failed: %s (rc=%d, retrying in %ds)", + cs_strerror(cs_rc), cs_rc, retries); sleep(retries); } } while ((retries < 5) && (cs_rc != CS_OK)); if (cs_rc != CS_OK) { - crm_warn("Assuming Corosync does not have node list: " - "CMAP connection failed (%s) " QB_XS " rc=%d", - cs_strerror(cs_rc), cs_rc); + pcmk__warn("Assuming Corosync does not have node list: CMAP connection " + "failed (%s) " QB_XS " rc=%d", + cs_strerror(cs_rc), cs_rc); return false; } // Get CMAP connection file descriptor cs_rc = cmap_fd_get(cmap_handle, &fd); if (cs_rc != CS_OK) { - crm_warn("Assuming Corosync does not have node list: " - "CMAP unusable (%s) " QB_XS " rc=%d", - cs_strerror(cs_rc), cs_rc); + pcmk__warn("Assuming Corosync does not have node list: CMAP unusable " + "(%s) " QB_XS " rc=%d", + cs_strerror(cs_rc), cs_rc); goto bail; } @@ -784,25 +791,25 @@ pcmk__corosync_has_nodelist(void) rc = crm_ipc_is_authentic_process(fd, (uid_t) 0, (gid_t) 0, &found_pid, &found_uid, &found_gid); if (rc == 0) { - crm_warn("Assuming Corosync does not have node list: " - "CMAP provider is inauthentic " - QB_XS " pid=%lld uid=%lld gid=%lld", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__warn("Assuming Corosync does not have node list: CMAP provider " + "is inauthentic " + QB_XS " pid=%lld uid=%lld gid=%lld", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); goto bail; } else if (rc < 0) { - crm_warn("Assuming Corosync does not have node list: " - "Could not verify CMAP authenticity (%s) " QB_XS " rc=%d", - pcmk_strerror(rc), rc); + pcmk__warn("Assuming Corosync does not have node list: Could not " + "verify CMAP authenticity (%s) " QB_XS " rc=%d", + pcmk_strerror(rc), rc); goto bail; } // Check whether nodelist section is presetn cs_rc = cmap_iter_init(cmap_handle, "nodelist", &iter_handle); if (cs_rc != CS_OK) { - crm_warn("Assuming Corosync does not have node list: " - "CMAP not readable (%s) " QB_XS " rc=%d", - cs_strerror(cs_rc), cs_rc); + pcmk__warn("Assuming Corosync does not have node list: CMAP not " + "readable (%s) " QB_XS " rc=%d", + cs_strerror(cs_rc), cs_rc); goto bail; } @@ -813,7 +820,7 @@ pcmk__corosync_has_nodelist(void) cmap_iter_finalize(cmap_handle, iter_handle); got_result = true; - crm_debug("Corosync %s node list", (result? "has" : "does not have")); + pcmk__debug("Corosync %s node list", (result? "has" : "does not have")); bail: cmap_finalize(cmap_handle); diff --git a/lib/cluster/cpg.c b/lib/cluster/cpg.c index 457454ed559..663b9be96ae 100644 --- a/lib/cluster/cpg.c +++ b/lib/cluster/cpg.c @@ -87,7 +87,7 @@ static void crm_cs_flush(gpointer data); rc = code; \ if ((rc == CS_ERR_TRY_AGAIN) || (rc == CS_ERR_QUEUE_FULL)) { \ counter++; \ - crm_debug("Retrying operation after %ds", counter); \ + pcmk__debug("Retrying operation after %ds", counter); \ sleep(counter); \ } else { \ break; \ @@ -121,21 +121,21 @@ pcmk__cpg_local_nodeid(cpg_handle_t handle) } if (handle == 0) { - crm_trace("Creating connection"); + pcmk__trace("Creating connection"); cs_repeat(rc, retries, 5, cpg_model_initialize(&local_handle, CPG_MODEL_V1, (cpg_model_data_t *) &cpg_model_info, NULL)); if (rc != CS_OK) { - crm_err("Could not connect to the CPG API: %s (%d)", - cs_strerror(rc), rc); + pcmk__err("Could not connect to the CPG API: %s (%d)", + cs_strerror(rc), rc); return 0; } rc = cpg_fd_get(local_handle, &fd); if (rc != CS_OK) { - crm_err("Could not obtain the CPG API connection: %s (%d)", - cs_strerror(rc), rc); + pcmk__err("Could not obtain the CPG API connection: %s (%d)", + cs_strerror(rc), rc); goto bail; } @@ -143,36 +143,36 @@ pcmk__cpg_local_nodeid(cpg_handle_t handle) rv = crm_ipc_is_authentic_process(fd, (uid_t) 0, (gid_t) 0, &found_pid, &found_uid, &found_gid); if (rv == 0) { - crm_err("CPG provider is not authentic:" - " process %lld (uid: %lld, gid: %lld)", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__err("CPG provider is not authentic: process %lld " + "(uid: %lld, gid: %lld)", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); goto bail; } else if (rv < 0) { - crm_err("Could not verify authenticity of CPG provider: %s (%d)", - strerror(-rv), -rv); + pcmk__err("Could not verify authenticity of CPG provider: %s (%d)", + strerror(-rv), -rv); goto bail; } } if (rc == CS_OK) { retries = 0; - crm_trace("Performing lookup"); + pcmk__trace("Performing lookup"); cs_repeat(rc, retries, 5, cpg_local_get(local_handle, &local_nodeid)); } if (rc != CS_OK) { - crm_err("Could not get local node id from the CPG API: %s (%d)", - pcmk__cs_err_str(rc), rc); + pcmk__err("Could not get local node id from the CPG API: %s (%d)", + pcmk__cs_err_str(rc), rc); } bail: if (handle == 0) { - crm_trace("Closing connection"); + pcmk__trace("Closing connection"); cpg_finalize(local_handle); } - crm_debug("Local nodeid is %u", local_nodeid); + pcmk__debug("Local nodeid is %u", local_nodeid); return local_nodeid; } @@ -210,21 +210,21 @@ crm_cs_flush(gpointer data) cpg_handle_t *handle = (cpg_handle_t *) data; if (*handle == 0) { - crm_trace("Connection is dead"); + pcmk__trace("Connection is dead"); return; } queue_len = g_list_length(cs_message_queue); if (((queue_len % 1000) == 0) && (queue_len > 1)) { - crm_err("CPG queue has grown to %d", queue_len); + pcmk__err("CPG queue has grown to %d", queue_len); } else if (queue_len == CS_SEND_MAX) { - crm_warn("CPG queue has grown to %d", queue_len); + pcmk__warn("CPG queue has grown to %d", queue_len); } if (cs_message_timer != 0) { /* There is already a timer, wait until it goes off */ - crm_trace("Timer active %d", cs_message_timer); + pcmk__trace("Timer active %d", cs_message_timer); return; } @@ -237,7 +237,7 @@ crm_cs_flush(gpointer data) } sent++; - crm_trace("CPG message sent, size=%zu", iov->iov_len); + pcmk__trace("CPG message sent, size=%zu", iov->iov_len); cs_message_queue = g_list_remove(cs_message_queue, iov); free(iov->iov_base); @@ -245,7 +245,7 @@ crm_cs_flush(gpointer data) } queue_len -= sent; - do_crm_log((queue_len > 5)? LOG_INFO : LOG_TRACE, + do_crm_log(((queue_len > 5)? LOG_INFO : PCMK__LOG_TRACE), "Sent %u CPG message%s (%d still queued): %s (rc=%d)", sent, pcmk__plural_s(sent), queue_len, pcmk__cs_err_str(rc), (int) rc); @@ -276,14 +276,14 @@ pcmk_cpg_dispatch(gpointer user_data) rc = cpg_dispatch(cluster->priv->cpg_handle, CS_DISPATCH_ONE); if (rc != CS_OK) { - crm_err("Connection to the CPG API failed: %s (%d)", - pcmk__cs_err_str(rc), rc); + pcmk__err("Connection to the CPG API failed: %s (%d)", + pcmk__cs_err_str(rc), rc); cpg_finalize(cluster->priv->cpg_handle); cluster->priv->cpg_handle = 0; return -1; } else if (cpg_evicted) { - crm_err("Evicted from CPG membership"); + pcmk__err("Evicted from CPG membership"); return -1; } return 0; @@ -317,38 +317,36 @@ check_message_sanity(const pcmk__cpg_msg_t *msg) int32_t payload_size = msg->header.size - sizeof(pcmk__cpg_msg_t); if (payload_size < 1) { - crm_err("%sCPG message %d from %s invalid: " - "Claimed size of %d bytes is too small " - QB_XS " from %s[%u] to %s@%s", - (msg->is_compressed? "Compressed " : ""), - msg->id, ais_dest(&(msg->sender)), - (int) msg->header.size, - msg_type2text(msg->sender.type), msg->sender.pid, - msg_type2text(msg->host.type), ais_dest(&(msg->host))); + pcmk__err("%sCPG message %d from %s invalid: Claimed size of %d bytes " + "is too small " QB_XS " from %s[%u] to %s@%s", + (msg->is_compressed? "Compressed " : ""), + msg->id, ais_dest(&(msg->sender)), + (int) msg->header.size, + msg_type2text(msg->sender.type), msg->sender.pid, + msg_type2text(msg->host.type), ais_dest(&(msg->host))); return false; } if (msg->header.error != CS_OK) { - crm_err("%sCPG message %d from %s invalid: " - "Sender indicated error %d " - QB_XS " from %s[%u] to %s@%s", - (msg->is_compressed? "Compressed " : ""), - msg->id, ais_dest(&(msg->sender)), - msg->header.error, - msg_type2text(msg->sender.type), msg->sender.pid, - msg_type2text(msg->host.type), ais_dest(&(msg->host))); + pcmk__err("%sCPG message %d from %s invalid: Sender indicated error %d " + QB_XS " from %s[%u] to %s@%s", + (msg->is_compressed? "Compressed " : ""), + msg->id, ais_dest(&(msg->sender)), + msg->header.error, + msg_type2text(msg->sender.type), msg->sender.pid, + msg_type2text(msg->host.type), ais_dest(&(msg->host))); return false; } if (msg_data_len(msg) != payload_size) { - crm_err("%sCPG message %d from %s invalid: " - "Total size %d inconsistent with payload size %d " - QB_XS " from %s[%u] to %s@%s", - (msg->is_compressed? "Compressed " : ""), - msg->id, ais_dest(&(msg->sender)), - (int) msg->header.size, (int) msg_data_len(msg), - msg_type2text(msg->sender.type), msg->sender.pid, - msg_type2text(msg->host.type), ais_dest(&(msg->host))); + pcmk__err("%sCPG message %d from %s invalid: Total size %d " + "inconsistent with payload size %d " + QB_XS " from %s[%u] to %s@%s", + (msg->is_compressed? "Compressed " : ""), + msg->id, ais_dest(&(msg->sender)), + (int) msg->header.size, (int) msg_data_len(msg), + msg_type2text(msg->sender.type), msg->sender.pid, + msg_type2text(msg->host.type), ais_dest(&(msg->host))); return false; } @@ -358,20 +356,20 @@ check_message_sanity(const pcmk__cpg_msg_t *msg) */ (((msg->size > 1) && (msg->data[msg->size - 2] == '\0')) || (msg->data[msg->size - 1] != '\0'))) { - crm_err("CPG message %d from %s invalid: " - "Payload does not end at byte %" PRIu32 " " - QB_XS " from %s[%u] to %s@%s", - msg->id, ais_dest(&(msg->sender)), msg->size, - msg_type2text(msg->sender.type), msg->sender.pid, - msg_type2text(msg->host.type), ais_dest(&(msg->host))); + pcmk__err("CPG message %d from %s invalid: Payload does not end at " + "byte %" PRIu32 " " QB_XS " from %s[%u] to %s@%s", + msg->id, ais_dest(&(msg->sender)), msg->size, + msg_type2text(msg->sender.type), msg->sender.pid, + msg_type2text(msg->host.type), ais_dest(&(msg->host))); return false; } - crm_trace("Verified %d-byte %sCPG message %d from %s[%u]@%s to %s@%s", - (int) msg->header.size, (msg->is_compressed? "compressed " : ""), - msg->id, msg_type2text(msg->sender.type), msg->sender.pid, - ais_dest(&(msg->sender)), - msg_type2text(msg->host.type), ais_dest(&(msg->host))); + pcmk__trace("Verified %d-byte %sCPG message %d from %s[%u]@%s to %s@%s", + (int) msg->header.size, + (msg->is_compressed? "compressed " : ""), msg->id, + msg_type2text(msg->sender.type), msg->sender.pid, + ais_dest(&(msg->sender)), + msg_type2text(msg->host.type), ais_dest(&(msg->host))); return true; } @@ -410,25 +408,25 @@ pcmk__cpg_message_data(cpg_handle_t handle, uint32_t sender_id, uint32_t pid, if (msg->sender.id == 0) { msg->sender.id = sender_id; } else if (msg->sender.id != sender_id) { - crm_warn("Ignoring CPG message from ID %" PRIu32 " PID %" PRIu32 - ": claimed ID %" PRIu32, - sender_id, pid, msg->sender.id); + pcmk__warn("Ignoring CPG message from ID %" PRIu32 " PID %" PRIu32 + ": claimed ID %" PRIu32, + sender_id, pid, msg->sender.id); return NULL; } // Ignore messages that aren't for the local node if ((msg->host.id != 0) && (local_nodeid != msg->host.id)) { - crm_trace("Ignoring CPG message from ID %" PRIu32 " PID %" PRIu32 - ": for ID %" PRIu32 " not %" PRIu32, - sender_id, pid, msg->host.id, local_nodeid); + pcmk__trace("Ignoring CPG message from ID %" PRIu32 " PID %" PRIu32 + ": for ID %" PRIu32 " not %" PRIu32, + sender_id, pid, msg->host.id, local_nodeid); return NULL; } if ((msg->host.size > 0) && !pcmk__str_eq(msg->host.uname, local_name, pcmk__str_casei)) { - crm_trace("Ignoring CPG message from ID %" PRIu32 " PID %" PRIu32 - ": for name %s not %s", - sender_id, pid, msg->host.uname, local_name); + pcmk__trace("Ignoring CPG message from ID %" PRIu32 " PID %" PRIu32 + ": for name %s not %s", + sender_id, pid, msg->host.uname, local_name); return NULL; } @@ -439,11 +437,13 @@ pcmk__cpg_message_data(cpg_handle_t handle, uint32_t sender_id, uint32_t pid, pcmk__node_search_cluster_member); if (peer->name == NULL) { - crm_debug("Received CPG message from node with ID %" PRIu32 - " but its name is unknown", sender_id); + pcmk__debug("Received CPG message from node with ID %" PRIu32 + " but its name is unknown", + sender_id); } else { - crm_debug("Updating name of CPG message sender with ID %" PRIu32 - " to %s", sender_id, peer->name); + pcmk__debug("Updating name of CPG message sender with ID %" PRIu32 + " to %s", + sender_id, peer->name); msg->sender.size = strlen(peer->name); memset(msg->sender.uname, 0, MAX_NAME); memcpy(msg->sender.uname, peer->name, msg->sender.size); @@ -476,10 +476,10 @@ pcmk__cpg_message_data(cpg_handle_t handle, uint32_t sender_id, uint32_t pid, } if (rc != pcmk_rc_ok) { free(uncompressed); - crm_warn("Ignoring compressed CPG message %d from %s (ID %" PRIu32 - " PID %" PRIu32 "): %s", - msg->id, ais_dest(&(msg->sender)), sender_id, pid, - pcmk_rc_str(rc)); + pcmk__warn("Ignoring compressed CPG message %d from %s (ID %" PRIu32 + " PID %" PRIu32 "): %s", + msg->id, ais_dest(&(msg->sender)), sender_id, pid, + pcmk_rc_str(rc)); return NULL; } data = uncompressed; @@ -488,10 +488,10 @@ pcmk__cpg_message_data(cpg_handle_t handle, uint32_t sender_id, uint32_t pid, data = pcmk__str_copy(msg->data); } - crm_trace("Received %sCPG message %d from %s (ID %" PRIu32 - " PID %" PRIu32 "): %.40s...", - (msg->is_compressed? "compressed " : ""), - msg->id, ais_dest(&(msg->sender)), sender_id, pid, msg->data); + pcmk__trace("Received %sCPG message %d from %s (ID %" PRIu32 + " PID %" PRIu32 "): %.40s...", + (msg->is_compressed? "compressed " : ""), + msg->id, ais_dest(&(msg->sender)), sender_id, pid, msg->data); return data; } @@ -597,24 +597,24 @@ node_left(const char *cpg_group_name, int event_counter, } if (rival == NULL) { - crm_info("Group %s event %d: %s (node %u pid %u) left%s", - cpg_group_name, event_counter, peer_name(peer), - cpg_peer->nodeid, cpg_peer->pid, - cpgreason2str(cpg_peer->reason)); + pcmk__info("Group %s event %d: %s (node %u pid %u) left%s", + cpg_group_name, event_counter, peer_name(peer), + cpg_peer->nodeid, cpg_peer->pid, + cpgreason2str(cpg_peer->reason)); if (peer != NULL) { crm_update_peer_proc(__func__, peer, crm_proc_cpg, PCMK_VALUE_OFFLINE); } } else if (cpg_peer->nodeid == local_nodeid) { - crm_warn("Group %s event %d: duplicate local pid %u left%s", - cpg_group_name, event_counter, - cpg_peer->pid, cpgreason2str(cpg_peer->reason)); + pcmk__warn("Group %s event %d: duplicate local pid %u left%s", + cpg_group_name, event_counter, + cpg_peer->pid, cpgreason2str(cpg_peer->reason)); } else { - crm_warn("Group %s event %d: " - "%s (node %u) duplicate pid %u left%s (%u remains)", - cpg_group_name, event_counter, peer_name(peer), - cpg_peer->nodeid, cpg_peer->pid, - cpgreason2str(cpg_peer->reason), (*rival)->pid); + pcmk__warn("Group %s event %d: %s (node %u) duplicate pid %u left%s " + "(%u remains)", + cpg_group_name, event_counter, peer_name(peer), + cpg_peer->nodeid, cpg_peer->pid, + cpgreason2str(cpg_peer->reason), (*rival)->pid); } } @@ -669,9 +669,9 @@ pcmk__cpg_confchg_cb(cpg_handle_t handle, sorted = NULL; for (int i = 0; i < joined_list_entries; i++) { - crm_info("Group %s event %d: node %u pid %u joined%s", - group_name->value, counter, joined_list[i].nodeid, - joined_list[i].pid, cpgreason2str(joined_list[i].reason)); + pcmk__info("Group %s event %d: node %u pid %u joined%s", + group_name->value, counter, joined_list[i].nodeid, + joined_list[i].pid, cpgreason2str(joined_list[i].reason)); } for (int i = 0; i < member_list_entries; i++) { @@ -682,11 +682,11 @@ pcmk__cpg_confchg_cb(cpg_handle_t handle, if (member_list[i].nodeid == local_nodeid && member_list[i].pid != getpid()) { // See the note in node_left() - crm_warn("Group %s event %d: detected duplicate local pid %u", - group_name->value, counter, member_list[i].pid); + pcmk__warn("Group %s event %d: detected duplicate local pid %u", + group_name->value, counter, member_list[i].pid); continue; } - crm_info("Group %s event %d: %s (node %u pid %u) is member", + pcmk__info("Group %s event %d: %s (node %u pid %u) is member", group_name->value, counter, peer_name(peer), member_list[i].nodeid, member_list[i].pid); @@ -712,9 +712,9 @@ pcmk__cpg_confchg_cb(cpg_handle_t handle, } else if (now > (peer->when_lost + 60)) { // If it persists for more than a minute, update the state - crm_warn("Node %u is member of group %s but was believed " - "offline", - member_list[i].nodeid, group_name->value); + pcmk__warn("Node %u is member of group %s but was believed " + "offline", + member_list[i].nodeid, group_name->value); pcmk__update_peer_state(__func__, peer, PCMK_VALUE_MEMBER, 0); } } @@ -725,7 +725,7 @@ pcmk__cpg_confchg_cb(cpg_handle_t handle, } if (!found) { - crm_err("Local node was evicted from group %s", group_name->value); + pcmk__err("Local node was evicted from group %s", group_name->value); cpg_evicted = true; } @@ -822,37 +822,37 @@ pcmk__cpg_connect(pcmk_cluster_t *cluster) cs_repeat(rc, retries, 30, cpg_model_initialize(&handle, CPG_MODEL_V1, (cpg_model_data_t *)&cpg_model_info, NULL)); if (rc != CS_OK) { - crm_err("Could not connect to the CPG API: %s (%d)", - cs_strerror(rc), rc); + pcmk__err("Could not connect to the CPG API: %s (%d)", + cs_strerror(rc), rc); goto bail; } rc = cpg_fd_get(handle, &fd); if (rc != CS_OK) { - crm_err("Could not obtain the CPG API connection: %s (%d)", - cs_strerror(rc), rc); + pcmk__err("Could not obtain the CPG API connection: %s (%d)", + cs_strerror(rc), rc); goto bail; } /* CPG provider run as root (in given user namespace, anyway)? */ if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid, &found_uid, &found_gid))) { - crm_err("CPG provider is not authentic:" - " process %lld (uid: %lld, gid: %lld)", - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__err("CPG provider is not authentic: process %lld " + "(uid: %lld, gid: %lld)", + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); rc = CS_ERR_ACCESS; goto bail; } else if (rv < 0) { - crm_err("Could not verify authenticity of CPG provider: %s (%d)", - strerror(-rv), -rv); + pcmk__err("Could not verify authenticity of CPG provider: %s (%d)", + strerror(-rv), -rv); rc = CS_ERR_ACCESS; goto bail; } id = pcmk__cpg_local_nodeid(handle); if (id == 0) { - crm_err("Could not get local node id from the CPG API"); + pcmk__err("Could not get local node id from the CPG API"); goto bail; } @@ -861,7 +861,7 @@ pcmk__cpg_connect(pcmk_cluster_t *cluster) retries = 0; cs_repeat(rc, retries, 30, cpg_join(handle, &cluster->priv->group)); if (rc != CS_OK) { - crm_err("Could not join the CPG group '%s': %d", cpg_group_name, rc); + pcmk__err("Could not join the CPG group '%s': %d", cpg_group_name, rc); goto bail; } @@ -892,13 +892,13 @@ pcmk__cpg_disconnect(pcmk_cluster_t *cluster) { pcmk_cpg_handle = 0; if (cluster->priv->cpg_handle != 0) { - crm_trace("Disconnecting CPG"); + pcmk__trace("Disconnecting CPG"); cpg_leave(cluster->priv->cpg_handle, &cluster->priv->group); cpg_finalize(cluster->priv->cpg_handle); cluster->priv->cpg_handle = 0; } else { - crm_info("No CPG connection"); + pcmk__info("No CPG connection"); } } @@ -956,7 +956,7 @@ send_cpg_text(const char *data, const pcmk__node_status_t *node, memcpy(msg->host.uname, node->name, msg->host.size); } else { - target = crm_strdup_printf("%" PRIu32, node->cluster_layer_id); + target = pcmk__assert_asprintf("%" PRIu32, node->cluster_layer_id); } msg->host.id = node->cluster_layer_id; @@ -977,7 +977,7 @@ send_cpg_text(const char *data, const pcmk__node_status_t *node, msg->size = 1 + strlen(data); msg->header.size = sizeof(pcmk__cpg_msg_t) + msg->size; - if (msg->size < CRM_BZ2_THRESHOLD) { + if (msg->size < PCMK__BZ2_THRESHOLD) { msg = pcmk__realloc(msg, msg->header.size); memcpy(msg->data, data, msg->size); @@ -1008,13 +1008,13 @@ send_cpg_text(const char *data, const pcmk__node_status_t *node, iov->iov_len = msg->header.size; if (msg->compressed_size > 0) { - crm_trace("Queueing CPG message %" PRIu32 " to %s " - "(%zu bytes, %" PRIu32 " bytes compressed payload): %.200s", - msg->id, target, iov->iov_len, msg->compressed_size, data); + pcmk__trace("Queueing CPG message %" PRIu32 " to %s " + "(%zu bytes, %" PRIu32 " bytes compressed payload): %.200s", + msg->id, target, iov->iov_len, msg->compressed_size, data); } else { - crm_trace("Queueing CPG message %" PRIu32 " to %s " - "(%zu bytes, %" PRIu32 " bytes payload): %.200s", - msg->id, target, iov->iov_len, msg->size, data); + pcmk__trace("Queueing CPG message %" PRIu32 " to %s " + "(%zu bytes, %" PRIu32 " bytes payload): %.200s", + msg->id, target, iov->iov_len, msg->size, data); } free(target); diff --git a/lib/cluster/election.c b/lib/cluster/election.c index 51d4630b18b..99e07d5ec5e 100644 --- a/lib/cluster/election.c +++ b/lib/cluster/election.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -50,7 +50,7 @@ election_timer_cb(gpointer user_data) { pcmk_cluster_t *cluster = user_data; - crm_info("Declaring local node as winner after election timed out"); + pcmk__info("Declaring local node as winner after election timed out"); election_complete(cluster); return FALSE; } @@ -119,7 +119,7 @@ election_remove(pcmk_cluster_t *cluster, const char *uname) { if ((cluster != NULL) && (cluster->priv->election != NULL) && (uname != NULL) && (cluster->priv->election->voted != NULL)) { - crm_trace("Discarding (no-)vote from lost peer %s", uname); + pcmk__trace("Discarding (no-)vote from lost peer %s", uname); g_hash_table_remove(cluster->priv->election->voted, uname); } } @@ -134,7 +134,7 @@ void election_reset(pcmk_cluster_t *cluster) { if ((cluster != NULL) && (cluster->priv->election != NULL)) { - crm_trace("Resetting election"); + pcmk__trace("Resetting election"); mainloop_timer_stop(cluster->priv->election->timeout); if (cluster->priv->election->voted != NULL) { g_hash_table_destroy(cluster->priv->election->voted); @@ -157,7 +157,7 @@ election_fini(pcmk_cluster_t *cluster) { if ((cluster != NULL) && (cluster->priv->election != NULL)) { election_reset(cluster); - crm_trace("Destroying election"); + pcmk__trace("Destroying election"); mainloop_timer_del(cluster->priv->election->timeout); free(cluster->priv->election); cluster->priv->election = NULL; @@ -222,8 +222,9 @@ get_uptime(struct timeval *output) return -1; } - crm_debug("Current CPU usage is: %lds, %ldus", (long)info.ru_utime.tv_sec, - (long)info.ru_utime.tv_usec); + pcmk__debug("Current CPU usage is: %llds, %lldus", + (long long) info.ru_utime.tv_sec, + (long long) info.ru_utime.tv_usec); } expires = tm_now + STORM_INTERVAL; /* N seconds after the last _access_ */ @@ -241,18 +242,22 @@ compare_age(struct timeval your_age) get_uptime(&our_age); /* If an error occurred, our_age will be compared as {0,0} */ if (our_age.tv_sec > your_age.tv_sec) { - crm_debug("Win: %ld vs %ld (seconds)", (long)our_age.tv_sec, (long)your_age.tv_sec); + pcmk__debug("Win: %lld vs %lld (seconds)", + (long long) our_age.tv_sec, (long long) your_age.tv_sec); return 1; } else if (our_age.tv_sec < your_age.tv_sec) { - crm_debug("Lose: %ld vs %ld (seconds)", (long)our_age.tv_sec, (long)your_age.tv_sec); + pcmk__debug("Lose: %lld vs %lld (seconds)", + (long long) our_age.tv_sec, (long long) your_age.tv_sec); return -1; } else if (our_age.tv_usec > your_age.tv_usec) { - crm_debug("Win: %ld.%06ld vs %ld.%06ld (usec)", - (long)our_age.tv_sec, (long)our_age.tv_usec, (long)your_age.tv_sec, (long)your_age.tv_usec); + pcmk__debug("Win: %lld.%06lld vs %lld.%06lld (usec)", + (long long) our_age.tv_sec, (long long) our_age.tv_usec, + (long long) your_age.tv_sec, (long long) your_age.tv_usec); return 1; } else if (our_age.tv_usec < your_age.tv_usec) { - crm_debug("Lose: %ld.%06ld vs %ld.%06ld (usec)", - (long)our_age.tv_sec, (long)our_age.tv_usec, (long)your_age.tv_sec, (long)your_age.tv_usec); + pcmk__debug("Lose: %lld.%06lld vs %lld.%06lld (usec)", + (long long) our_age.tv_sec, (long long) our_age.tv_usec, + (long long) your_age.tv_sec, (long long) your_age.tv_usec); return -1; } @@ -285,14 +290,14 @@ election_vote(pcmk_cluster_t *cluster) CRM_CHECK((cluster != NULL) && (cluster->priv->election != NULL), return); if (cluster->priv->node_name == NULL) { - crm_err("Cannot start an election: Local node name unknown"); + pcmk__err("Cannot start an election: Local node name unknown"); return; } our_node = pcmk__get_node(0, cluster->priv->node_name, NULL, pcmk__node_search_cluster_member); if (!pcmk__cluster_is_node_active(our_node)) { - crm_trace("Cannot vote yet: local node not connected to cluster"); + pcmk__trace("Cannot vote yet: local node not connected to cluster"); return; } @@ -307,19 +312,20 @@ election_vote(pcmk_cluster_t *cluster) NULL, message_type, CRM_OP_VOTE, NULL); cluster->priv->election->count++; - crm_xml_add(vote, PCMK__XA_ELECTION_OWNER, - pcmk__cluster_get_xml_id(our_node)); - crm_xml_add_int(vote, PCMK__XA_ELECTION_ID, cluster->priv->election->count); + pcmk__xe_set(vote, PCMK__XA_ELECTION_OWNER, + pcmk__cluster_get_xml_id(our_node)); + pcmk__xe_set_int(vote, PCMK__XA_ELECTION_ID, + cluster->priv->election->count); // Warning: PCMK__XA_ELECTION_AGE_NANO_SEC value is actually microseconds get_uptime(&age); - crm_xml_add_timeval(vote, PCMK__XA_ELECTION_AGE_SEC, - PCMK__XA_ELECTION_AGE_NANO_SEC, &age); + pcmk__xe_set_timeval(vote, PCMK__XA_ELECTION_AGE_SEC, + PCMK__XA_ELECTION_AGE_NANO_SEC, &age); pcmk__cluster_send_message(NULL, cluster->priv->server, vote); pcmk__xml_free(vote); - crm_debug("Started election round %u", cluster->priv->election->count); + pcmk__debug("Started election round %u", cluster->priv->election->count); election_timeout_start(cluster); return; } @@ -350,7 +356,7 @@ election_check(pcmk_cluster_t *cluster) return false); if (cluster->priv->election->voted == NULL) { - crm_trace("Election check requested, but no votes received yet"); + pcmk__trace("Election check requested, but no votes received yet"); return FALSE; } @@ -369,29 +375,29 @@ election_check(pcmk_cluster_t *cluster) const pcmk__node_status_t *node = NULL; char *key = NULL; - crm_warn("Received too many votes in election"); + pcmk__warn("Received too many votes in election"); g_hash_table_iter_init(&gIter, pcmk__peer_cache); while (g_hash_table_iter_next(&gIter, NULL, (gpointer *) & node)) { if (pcmk__cluster_is_node_active(node)) { - crm_warn("* expected vote: %s", node->name); + pcmk__warn("* expected vote: %s", node->name); } } g_hash_table_iter_init(&gIter, cluster->priv->election->voted); while (g_hash_table_iter_next(&gIter, (gpointer *) & key, NULL)) { - crm_warn("* actual vote: %s", key); + pcmk__warn("* actual vote: %s", key); } } - crm_info("Election won by local node"); + pcmk__info("Election won by local node"); election_complete(cluster); return TRUE; } else { - crm_debug("Election still waiting on %d of %d vote%s", - num_members - voted_size, num_members, - pcmk__plural_s(num_members)); + pcmk__debug("Election still waiting on %d of %d vote%s", + (num_members - voted_size), num_members, + pcmk__plural_s(num_members)); } return FALSE; @@ -428,20 +434,19 @@ parse_election_message(const xmlNode *message, struct vote *vote) vote->age.tv_sec = -1; vote->age.tv_usec = -1; - vote->op = crm_element_value(message, PCMK__XA_CRM_TASK); - vote->from = crm_element_value(message, PCMK__XA_SRC); - vote->version = crm_element_value(message, PCMK_XA_VERSION); - vote->election_owner = crm_element_value(message, PCMK__XA_ELECTION_OWNER); + vote->op = pcmk__xe_get(message, PCMK__XA_CRM_TASK); + vote->from = pcmk__xe_get(message, PCMK__XA_SRC); + vote->version = pcmk__xe_get(message, PCMK_XA_VERSION); + vote->election_owner = pcmk__xe_get(message, PCMK__XA_ELECTION_OWNER); - crm_element_value_int(message, PCMK__XA_ELECTION_ID, &(vote->election_id)); + pcmk__xe_get_int(message, PCMK__XA_ELECTION_ID, &(vote->election_id)); if ((vote->op == NULL) || (vote->from == NULL) || (vote->version == NULL) || (vote->election_owner == NULL) || (vote->election_id < 0)) { - crm_warn("Invalid %s message from %s", - pcmk__s(vote->op, "election"), - pcmk__s(vote->from, "unspecified node")); - crm_log_xml_trace(message, "bad-vote"); + pcmk__warn("Invalid %s message from %s", pcmk__s(vote->op, "election"), + pcmk__s(vote->from, "unspecified node")); + pcmk__log_xml_trace(message, "bad-vote"); return FALSE; } @@ -451,17 +456,21 @@ parse_election_message(const xmlNode *message, struct vote *vote) /* Only vote ops have uptime. Warning: PCMK__XA_ELECTION_AGE_NANO_SEC value is in microseconds. */ - crm_element_value_timeval(message, PCMK__XA_ELECTION_AGE_SEC, - PCMK__XA_ELECTION_AGE_NANO_SEC, &(vote->age)); - if ((vote->age.tv_sec < 0) || (vote->age.tv_usec < 0)) { - crm_warn("Cannot count election %s from %s " - "because it is missing uptime", vote->op, vote->from); + if ((pcmk__xe_get_timeval(message, PCMK__XA_ELECTION_AGE_SEC, + PCMK__XA_ELECTION_AGE_NANO_SEC, + &(vote->age)) != pcmk_rc_ok) + || (vote->age.tv_sec < 0) || (vote->age.tv_usec < 0)) { + + pcmk__warn("Cannot count election %s from %s because uptime is " + "missing or invalid", + vote->op, vote->from); return FALSE; } } else if (!pcmk__str_eq(vote->op, CRM_OP_NOVOTE, pcmk__str_none)) { - crm_info("Cannot process election message from %s " - "because %s is not a known election op", vote->from, vote->op); + pcmk__info("Cannot process election message from %s because %s is not " + "a known election op", + vote->from, vote->op); return FALSE; } @@ -469,8 +478,9 @@ parse_election_message(const xmlNode *message, struct vote *vote) * the question is how we managed to get here. */ if (pcmk__peer_cache == NULL) { - crm_info("Cannot count election %s from %s " - "because no peer information available", vote->op, vote->from); + pcmk__info("Cannot count election %s from %s becasue no peer " + "information available", + vote->op, vote->from); return FALSE; } return TRUE; @@ -497,8 +507,8 @@ send_no_vote(pcmk_cluster_t *cluster, pcmk__node_status_t *peer, message_type = pcmk__server_message_type(cluster->priv->server); novote = pcmk__new_request(cluster->priv->server, message_type, vote->from, message_type, CRM_OP_NOVOTE, NULL); - crm_xml_add(novote, PCMK__XA_ELECTION_OWNER, vote->election_owner); - crm_xml_add_int(novote, PCMK__XA_ELECTION_ID, vote->election_id); + pcmk__xe_set(novote, PCMK__XA_ELECTION_OWNER, vote->election_owner); + pcmk__xe_set_int(novote, PCMK__XA_ELECTION_ID, vote->election_id); pcmk__cluster_send_message(peer, cluster->priv->server, novote); pcmk__xml_free(novote); @@ -561,7 +571,7 @@ election_count_vote(pcmk_cluster_t *cluster, const xmlNode *message, } else if (we_are_owner && (vote.election_id != cluster->priv->election->count)) { - log_level = LOG_TRACE; + log_level = PCMK__LOG_TRACE; reason = "Superseded"; done = TRUE; @@ -578,17 +588,17 @@ election_count_vote(pcmk_cluster_t *cluster, const xmlNode *message, * for us to win */ if (!we_are_owner) { - crm_warn("Cannot count election round %d %s from %s " - "because we did not start election (node ID %s did)", - vote.election_id, vote.op, vote.from, - vote.election_owner); + pcmk__warn("Cannot count election round %d %s from %s because we " + "did not start election (node ID %s did)", + vote.election_id, vote.op, vote.from, + vote.election_owner); return election_error; } if (cluster->priv->election->state != election_in_progress) { // Should only happen if we already lost - crm_debug("Not counting election round %d %s from %s " - "because no election in progress", - vote.election_id, vote.op, vote.from); + pcmk__debug("Not counting election round %d %s from %s because no " + "election in progress", + vote.election_id, vote.op, vote.from); return cluster->priv->election->state; } record_vote(cluster, &vote); @@ -598,7 +608,8 @@ election_count_vote(pcmk_cluster_t *cluster, const xmlNode *message, } else { // A peer vote requires a comparison to determine which node is better int age_result = compare_age(vote.age); - int version_result = compare_version(vote.version, CRM_FEATURE_SET); + int version_result = pcmk__compare_versions(vote.version, + CRM_FEATURE_SET); if (version_result < 0) { reason = "Version"; @@ -635,8 +646,8 @@ election_count_vote(pcmk_cluster_t *cluster, const xmlNode *message, */ cluster->priv->election->election_wins++; if (cluster->priv->election->election_wins > (peers * peers)) { - crm_warn("Election storm detected: %d wins in %d seconds", - cluster->priv->election->election_wins, STORM_INTERVAL); + pcmk__warn("Election storm detected: %d wins in %d seconds", + cluster->priv->election->election_wins, STORM_INTERVAL); cluster->priv->election->election_wins = 0; cluster->priv->election->expires = tm_now + STORM_INTERVAL; if (!(cluster->priv->election->wrote_blackbox)) { @@ -703,10 +714,10 @@ election_count_vote(pcmk_cluster_t *cluster, const xmlNode *message, loss_time += 11; loss_time[8] = '\0'; } - crm_info("Ignoring election round %d (started by node ID %s) pass " - "vs %s because we lost less than %ds ago at %s", - vote.election_id, vote.election_owner, vote.from, - LOSS_DAMPEN, (loss_time? loss_time : "unknown")); + pcmk__info("Ignoring election round %d (started by node ID %s) " + "pass vs %s because we lost less than %ds ago at %s", + vote.election_id, vote.election_owner, vote.from, + LOSS_DAMPEN, pcmk__s(loss_time, "unknown")); } } diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c index e41d9673939..c485d8a066a 100644 --- a/lib/cluster/membership.c +++ b/lib/cluster/membership.c @@ -67,19 +67,19 @@ static bool has_quorum = false; // Flag setting and clearing for pcmk__node_status_t:flags -#define set_peer_flags(peer, flags_to_set) do { \ - (peer)->flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Peer", (peer)->name, \ - (peer)->flags, (flags_to_set), \ - #flags_to_set); \ +#define set_peer_flags(peer, flags_to_set) do { \ + (peer)->flags = pcmk__set_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Peer", \ + (peer)->name, (peer)->flags, \ + (flags_to_set), #flags_to_set); \ } while (0) -#define clear_peer_flags(peer, flags_to_clear) do { \ - (peer)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, \ - "Peer", (peer)->name, \ - (peer)->flags, (flags_to_clear), \ - #flags_to_clear); \ +#define clear_peer_flags(peer, flags_to_clear) do { \ + (peer)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ + PCMK__LOG_TRACE, "Peer", \ + (peer)->name, (peer)->flags, \ + (flags_to_clear), \ + #flags_to_clear); \ } while (0) static void update_peer_uname(pcmk__node_status_t *node, const char *uname); @@ -203,7 +203,7 @@ pcmk__cluster_lookup_remote_node(const char *node_name) /* Add the new entry to the cache */ g_hash_table_replace(pcmk__remote_peer_cache, node->xml_id, node); - crm_trace("added %s to remote cache", node_name); + pcmk__trace("added %s to remote cache", node_name); /* Update the entry's uname, ensuring peer status callbacks are called */ update_peer_uname(node, node_name); @@ -227,7 +227,7 @@ pcmk__cluster_forget_remote_node(const char *node_name) * being removed -- we can't log it *after* removing it. */ if (g_hash_table_lookup(pcmk__remote_peer_cache, node_name) != NULL) { - crm_trace("Removing %s from Pacemaker Remote node cache", node_name); + pcmk__trace("Removing %s from Pacemaker Remote node cache", node_name); g_hash_table_remove(pcmk__remote_peer_cache, node_name); } } @@ -270,7 +270,7 @@ static void remote_cache_refresh_helper(xmlNode *result, void *user_data) { const struct refresh_data *data = user_data; - const char *remote = crm_element_value(result, data->field); + const char *remote = pcmk__xe_get(result, data->field); const char *state = NULL; pcmk__node_status_t *node; @@ -292,7 +292,7 @@ remote_cache_refresh_helper(xmlNode *result, void *user_data) pcmk__update_peer_state(__func__, node, state, 0); } - } else if (pcmk_is_set(node->flags, pcmk__node_status_dirty)) { + } else if (pcmk__is_set(node->flags, pcmk__node_status_dirty)) { /* Node is in cache and hasn't been updated already, so mark it clean */ clear_peer_flags(node, pcmk__node_status_dirty); if (state) { @@ -312,7 +312,7 @@ is_dirty(gpointer key, gpointer value, gpointer user_data) { const pcmk__node_status_t *node = value; - return pcmk_is_set(node->flags, pcmk__node_status_dirty); + return pcmk__is_set(node->flags, pcmk__node_status_dirty); } /*! @@ -375,7 +375,7 @@ pcmk__cluster_is_node_active(const pcmk__node_status_t *node) { const enum pcmk_cluster_layer cluster_layer = pcmk_get_cluster_layer(); - if ((node == NULL) || pcmk_is_set(node->flags, pcmk__node_status_remote)) { + if ((node == NULL) || pcmk__is_set(node->flags, pcmk__node_status_remote)) { return false; } @@ -390,8 +390,8 @@ pcmk__cluster_is_node_active(const pcmk__node_status_t *node) break; } - crm_err("Unhandled cluster layer: %s", - pcmk_cluster_layer_text(cluster_layer)); + pcmk__err("Unhandled cluster layer: %s", + pcmk_cluster_layer_text(cluster_layer)); return false; } @@ -443,9 +443,9 @@ should_forget_cluster_node(gpointer key, gpointer value, gpointer user_data) return FALSE; } - crm_info("Removing node with name %s and cluster layer ID %" PRIu32 - " from membership cache", - pcmk__s(node->name, "(unknown)"), node->cluster_layer_id); + pcmk__info("Removing node with name %s and cluster layer ID %" PRIu32 + " from membership cache", + pcmk__s(node->name, "(unknown)"), node->cluster_layer_id); return TRUE; } @@ -475,7 +475,8 @@ pcmk__cluster_forget_cluster_node(uint32_t id, const char *node_name) guint matches = 0; if (pcmk__peer_cache == NULL) { - crm_trace("Membership cache not initialized, ignoring removal request"); + pcmk__trace("Membership cache not initialized, ignoring removal " + "request"); return; } @@ -483,29 +484,30 @@ pcmk__cluster_forget_cluster_node(uint32_t id, const char *node_name) search.name = pcmk__str_copy(node_name); // May log after original freed if (id > 0) { - criterion = crm_strdup_printf("cluster layer ID %" PRIu32, id); + criterion = pcmk__assert_asprintf("cluster layer ID %" PRIu32, id); } else if (node_name != NULL) { - criterion = crm_strdup_printf("name %s", node_name); + criterion = pcmk__assert_asprintf("name %s", node_name); } matches = g_hash_table_foreach_remove(pcmk__peer_cache, should_forget_cluster_node, &search); if (matches > 0) { if (criterion != NULL) { - crm_notice("Removed %u inactive node%s with %s from the membership " - "cache", - matches, pcmk__plural_s(matches), criterion); + pcmk__notice("Removed %u inactive node%s with %s from the " + "membership cache", + matches, pcmk__plural_s(matches), criterion); } else { - crm_notice("Removed all (%u) inactive cluster nodes from the " - "membership cache", - matches); + pcmk__notice("Removed all (%u) inactive cluster nodes from the " + "membership cache", + matches); } } else { - crm_info("No inactive cluster nodes%s%s to remove from the membership " - "cache", - ((criterion != NULL)? " with " : ""), pcmk__s(criterion, "")); + pcmk__info("No inactive cluster nodes%s%s to remove from the " + "membership cache", + ((criterion != NULL)? " with " : ""), + pcmk__s(criterion, "")); } free(search.name); @@ -548,8 +550,8 @@ destroy_crm_node(gpointer data) { pcmk__node_status_t *node = data; - crm_trace("Destroying entry for node %" PRIu32 ": %s", - node->cluster_layer_id, node->name); + pcmk__trace("Destroying entry for node %" PRIu32 ": %s", + node->cluster_layer_id, node->name); free(node->name); free(node->state); @@ -588,22 +590,22 @@ void pcmk__cluster_destroy_node_caches(void) { if (pcmk__peer_cache != NULL) { - crm_trace("Destroying peer cache with %d members", - g_hash_table_size(pcmk__peer_cache)); + pcmk__trace("Destroying peer cache with %u members", + g_hash_table_size(pcmk__peer_cache)); g_hash_table_destroy(pcmk__peer_cache); pcmk__peer_cache = NULL; } if (pcmk__remote_peer_cache != NULL) { - crm_trace("Destroying remote peer cache with %d members", - pcmk__cluster_num_remote_nodes()); + pcmk__trace("Destroying remote peer cache with %u members", + pcmk__cluster_num_remote_nodes()); g_hash_table_destroy(pcmk__remote_peer_cache); pcmk__remote_peer_cache = NULL; } if (cluster_node_cib_cache != NULL) { - crm_trace("Destroying configured cluster node cache with %d members", - g_hash_table_size(cluster_node_cib_cache)); + pcmk__trace("Destroying configured cluster node cache with %u members", + g_hash_table_size(cluster_node_cib_cache)); g_hash_table_destroy(cluster_node_cib_cache); cluster_node_cib_cache = NULL; } @@ -699,7 +701,7 @@ search_cluster_member_cache(unsigned int id, const char *uname, g_hash_table_iter_init(&iter, pcmk__peer_cache); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { if (pcmk__str_eq(node->name, uname, pcmk__str_casei)) { - crm_trace("Name match: %s", node->name); + pcmk__trace("Name match: %s", node->name); by_name = node; break; } @@ -710,7 +712,7 @@ search_cluster_member_cache(unsigned int id, const char *uname, g_hash_table_iter_init(&iter, pcmk__peer_cache); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { if (node->cluster_layer_id == id) { - crm_trace("ID match: %" PRIu32, node->cluster_layer_id); + pcmk__trace("ID match: %" PRIu32, node->cluster_layer_id); by_id = node; break; } @@ -722,8 +724,8 @@ search_cluster_member_cache(unsigned int id, const char *uname, const char *this_xml_id = pcmk__cluster_get_xml_id(node); if (pcmk__str_eq(uuid, this_xml_id, pcmk__str_none)) { - crm_trace("Found cluster node cache entry by XML ID %s", - this_xml_id); + pcmk__trace("Found cluster node cache entry by XML ID %s", + this_xml_id); by_id = node; break; } @@ -733,15 +735,15 @@ search_cluster_member_cache(unsigned int id, const char *uname, node = by_id; /* Good default */ if(by_id == by_name) { /* Nothing to do if they match (both NULL counts) */ - crm_trace("Consistent: %p for %u/%s", by_id, id, uname); + pcmk__trace("Consistent: %p for %u/%s", by_id, id, uname); } else if(by_id == NULL && by_name) { - crm_trace("Only one: %p for %u/%s", by_name, id, uname); + pcmk__trace("Only one: %p for %u/%s", by_name, id, uname); if (id && by_name->cluster_layer_id) { dump_peer_hash(LOG_WARNING, __func__); - crm_crit("Nodes %u and %" PRIu32 " share the same name '%s'", - id, by_name->cluster_layer_id, uname); + pcmk__crit("Nodes %u and %" PRIu32 " share the same name '%s'", + id, by_name->cluster_layer_id, uname); node = NULL; /* Create a new one */ } else { @@ -749,35 +751,37 @@ search_cluster_member_cache(unsigned int id, const char *uname, } } else if(by_name == NULL && by_id) { - crm_trace("Only one: %p for %u/%s", by_id, id, uname); + pcmk__trace("Only one: %p for %u/%s", by_id, id, uname); if ((uname != NULL) && (by_id->name != NULL)) { dump_peer_hash(LOG_WARNING, __func__); - crm_crit("Nodes '%s' and '%s' share the same cluster nodeid %u: " - "assuming '%s' is correct", - uname, by_id->name, id, uname); + pcmk__crit("Nodes '%s' and '%s' share the same cluster nodeid %u: " + "assuming '%s' is correct", + uname, by_id->name, id, uname); } } else if ((uname != NULL) && (by_id->name != NULL)) { if (pcmk__str_eq(uname, by_id->name, pcmk__str_casei)) { - crm_notice("Node '%s' has changed its cluster layer ID " - "from %" PRIu32 " to %" PRIu32, - by_id->name, by_name->cluster_layer_id, - by_id->cluster_layer_id); + pcmk__notice("Node '%s' has changed its cluster layer ID " + "from %" PRIu32 " to %" PRIu32, + by_id->name, by_name->cluster_layer_id, + by_id->cluster_layer_id); g_hash_table_foreach_remove(pcmk__peer_cache, hash_find_by_data, by_name); } else { - crm_warn("Nodes '%s' and '%s' share the same cluster nodeid: %u %s", - by_id->name, by_name->name, id, uname); + pcmk__warn("Nodes '%s' and '%s' share the same cluster nodeid: %u " + "%s", + by_id->name, by_name->name, id, uname); dump_peer_hash(LOG_INFO, __func__); crm_abort(__FILE__, __func__, __LINE__, "member weirdness", TRUE, TRUE); } } else if ((id > 0) && (by_name->cluster_layer_id > 0)) { - crm_warn("Nodes %" PRIu32 " and %" PRIu32 " share the same name: '%s'", - by_id->cluster_layer_id, by_name->cluster_layer_id, uname); + pcmk__warn("Nodes %" PRIu32 " and %" PRIu32 " share the same name: " + "'%s'", + by_id->cluster_layer_id, by_name->cluster_layer_id, uname); } else { /* Simple merge */ @@ -788,7 +792,7 @@ search_cluster_member_cache(unsigned int id, const char *uname, */ dump_peer_hash(LOG_DEBUG, __func__); - crm_info("Merging %p into %p", by_name, by_id); + pcmk__info("Merging %p into %p", by_name, by_id); g_hash_table_foreach_remove(pcmk__peer_cache, hash_find_by_data, by_name); } @@ -817,7 +821,7 @@ pcmk__search_node_caches(unsigned int id, const char *uname, pcmk__cluster_init_node_caches(); - if (pcmk_is_set(flags, pcmk__node_search_remote)) { + if (pcmk__is_set(flags, pcmk__node_search_remote)) { if (uname != NULL) { node = g_hash_table_lookup(pcmk__remote_peer_cache, uname); } else if (xml_id != NULL) { @@ -826,17 +830,17 @@ pcmk__search_node_caches(unsigned int id, const char *uname, } if ((node == NULL) - && pcmk_is_set(flags, pcmk__node_search_cluster_member)) { + && pcmk__is_set(flags, pcmk__node_search_cluster_member)) { node = search_cluster_member_cache(id, uname, xml_id); } - if ((node == NULL) && pcmk_is_set(flags, pcmk__node_search_cluster_cib)) { + if ((node == NULL) && pcmk__is_set(flags, pcmk__node_search_cluster_cib)) { if (xml_id != NULL) { node = find_cib_cluster_node(xml_id, uname); } else { // Assumes XML ID is node ID as string (as with Corosync) - char *id_str = (id == 0)? NULL : crm_strdup_printf("%u", id); + char *id_str = (id == 0)? NULL : pcmk__assert_asprintf("%u", id); node = find_cib_cluster_node(id_str, uname); free(id_str); @@ -878,7 +882,7 @@ pcmk__purge_node_from_cache(const char *node_name, uint32_t node_id) node_name_copy = pcmk__str_copy(node_name); node_name = node_name_copy; - crm_trace("Purging %s from Pacemaker Remote node cache", node_name); + pcmk__trace("Purging %s from Pacemaker Remote node cache", node_name); g_hash_table_remove(pcmk__remote_peer_cache, node_name); } @@ -912,10 +916,10 @@ remove_conflicting_peer(pcmk__node_status_t *node) continue; } - crm_warn("Removing cached offline node %" PRIu32 "/%s which has " - "conflicting name with %" PRIu32, - existing_node->cluster_layer_id, existing_node->name, - node->cluster_layer_id); + pcmk__warn("Removing cached offline node %" PRIu32 "/%s which has " + "conflicting name with %" PRIu32, + existing_node->cluster_layer_id, existing_node->name, + node->cluster_layer_id); g_hash_table_iter_remove(&iter); matches++; @@ -955,14 +959,14 @@ pcmk__get_node(unsigned int id, const char *uname, const char *xml_id, pcmk__cluster_init_node_caches(); // Check the Pacemaker Remote node cache first - if (pcmk_is_set(flags, pcmk__node_search_remote)) { + if (pcmk__is_set(flags, pcmk__node_search_remote)) { node = g_hash_table_lookup(pcmk__remote_peer_cache, uname); if (node != NULL) { return node; } } - if (!pcmk_is_set(flags, pcmk__node_search_cluster_member)) { + if (!pcmk__is_set(flags, pcmk__node_search_cluster_member)) { return NULL; } @@ -976,7 +980,7 @@ pcmk__get_node(unsigned int id, const char *uname, const char *xml_id, if (uname_lookup) { uname = uname_lookup; - crm_trace("Inferred a name of '%s' for node %u", uname, id); + pcmk__trace("Inferred a name of '%s' for node %u", uname, id); /* try to turn up the node one more time now that we know the uname. */ if (node == NULL) { @@ -985,19 +989,18 @@ pcmk__get_node(unsigned int id, const char *uname, const char *xml_id, } if (node == NULL) { - char *uniqueid = crm_generate_uuid(); + char *uniqueid = pcmk__generate_uuid(); node = pcmk__assert_alloc(1, sizeof(pcmk__node_status_t)); - crm_info("Created entry %s/%p for node %s/%u (%d total)", - uniqueid, node, uname, id, - 1 + g_hash_table_size(pcmk__peer_cache)); + pcmk__info("Created entry %s/%p for node %s/%u (%d total)", uniqueid, + node, uname, id, (1 + g_hash_table_size(pcmk__peer_cache))); g_hash_table_replace(pcmk__peer_cache, uniqueid, node); } if ((id > 0) && (uname != NULL) && ((node->cluster_layer_id == 0) || (node->name == NULL))) { - crm_info("Node %u is now known as %s", id, uname); + pcmk__info("Node %u is now known as %s", id, uname); } if ((id > 0) && (node->cluster_layer_id == 0)) { @@ -1011,10 +1014,10 @@ pcmk__get_node(unsigned int id, const char *uname, const char *xml_id, if ((xml_id == NULL) && (node->xml_id == NULL)) { xml_id = pcmk__cluster_get_xml_id(node); if (xml_id == NULL) { - crm_debug("Cannot obtain an XML ID for node %s[%u] at this time", - node->name, id); + pcmk__debug("Cannot obtain an XML ID for node %s[%u] at this time", + node->name, id); } else { - crm_info("Node %s[%u] has XML ID %s", node->name, id, xml_id); + pcmk__info("Node %s[%u] has XML ID %s", node->name, id, xml_id); } } @@ -1038,20 +1041,22 @@ static void update_peer_uname(pcmk__node_status_t *node, const char *uname) { CRM_CHECK(uname != NULL, - crm_err("Bug: can't update node name without name"); return); + pcmk__err("Bug: can't update node name without name"); return); CRM_CHECK(node != NULL, - crm_err("Bug: can't update node name to %s without node", uname); + pcmk__err("Bug: can't update node name to %s without node", + uname); return); if (pcmk__str_eq(uname, node->name, pcmk__str_casei)) { - crm_debug("Node name '%s' did not change", uname); + pcmk__debug("Node name '%s' did not change", uname); return; } for (const char *c = uname; *c; ++c) { if ((*c >= 'A') && (*c <= 'Z')) { - crm_warn("Node names with capitals are discouraged, consider changing '%s'", - uname); + pcmk__warn("Node names with capitals are discouraged, consider " + "changing '%s'", + uname); break; } } @@ -1064,7 +1069,7 @@ update_peer_uname(pcmk__node_status_t *node, const char *uname) #if SUPPORT_COROSYNC if ((pcmk_get_cluster_layer() == pcmk_cluster_layer_corosync) - && !pcmk_is_set(node->flags, pcmk__node_status_remote)) { + && !pcmk__is_set(node->flags, pcmk__node_status_remote)) { remove_conflicting_peer(node); } @@ -1118,12 +1123,13 @@ crm_update_peer_proc(const char *source, pcmk__node_status_t *node, uint32_t last = 0; gboolean changed = FALSE; - CRM_CHECK(node != NULL, crm_err("%s: Could not set %s to %s for NULL", - source, proc2text(flag), status); - return NULL); + CRM_CHECK(node != NULL, + pcmk__err("%s: Could not set %s to %s for NULL", source, + proc2text(flag), status); + return NULL); /* Pacemaker doesn't spawn processes on remote nodes */ - if (pcmk_is_set(node->flags, pcmk__node_status_remote)) { + if (pcmk__is_set(node->flags, pcmk__node_status_remote)) { return node; } @@ -1137,15 +1143,16 @@ crm_update_peer_proc(const char *source, pcmk__node_status_t *node, } else if (pcmk__str_eq(status, PCMK_VALUE_ONLINE, pcmk__str_casei)) { if ((node->processes & flag) != flag) { node->processes = pcmk__set_flags_as(__func__, __LINE__, - LOG_TRACE, "Peer process", - node->name, node->processes, - flag, "processes"); + PCMK__LOG_TRACE, + "Peer process", node->name, + node->processes, flag, + "processes"); changed = TRUE; } } else if (node->processes & flag) { node->processes = pcmk__clear_flags_as(__func__, __LINE__, - LOG_TRACE, "Peer process", + PCMK__LOG_TRACE, "Peer process", node->name, node->processes, flag, "processes"); changed = TRUE; @@ -1153,15 +1160,16 @@ crm_update_peer_proc(const char *source, pcmk__node_status_t *node, if (changed) { if (status == NULL && flag <= crm_proc_none) { - crm_info("%s: Node %s[%" PRIu32 "] - all processes are now offline", - source, node->name, node->cluster_layer_id); + pcmk__info("%s: Node %s[%" PRIu32 "] - all processes are now " + "offline", + source, node->name, node->cluster_layer_id); } else { - crm_info("%s: Node %s[%" PRIu32 "] - %s is now %s", - source, node->name, node->cluster_layer_id, - proc2text(flag), status); + pcmk__info("%s: Node %s[%" PRIu32 "] - %s is now %s", source, + node->name, node->cluster_layer_id, proc2text(flag), + status); } - if (pcmk_is_set(node->processes, crm_get_cluster_proc())) { + if (pcmk__is_set(node->processes, crm_get_cluster_proc())) { node->when_online = time(NULL); } else { @@ -1185,7 +1193,7 @@ crm_update_peer_proc(const char *source, pcmk__node_status_t *node, if (autoreap) { const char *peer_state = NULL; - if (pcmk_is_set(node->processes, crm_get_cluster_proc())) { + if (pcmk__is_set(node->processes, crm_get_cluster_proc())) { peer_state = PCMK_VALUE_MEMBER; } else { peer_state = PCMK__VALUE_LOST; @@ -1193,9 +1201,9 @@ crm_update_peer_proc(const char *source, pcmk__node_status_t *node, node = pcmk__update_peer_state(__func__, node, peer_state, 0); } } else { - crm_trace("%s: Node %s[%" PRIu32 "] - %s is unchanged (%s)", - source, node->name, node->cluster_layer_id, proc2text(flag), - status); + pcmk__trace("%s: Node %s[%" PRIu32 "] - %s is unchanged (%s)", source, + node->name, node->cluster_layer_id, proc2text(flag), + status); } return node; } @@ -1215,11 +1223,12 @@ pcmk__update_peer_expected(const char *source, pcmk__node_status_t *node, char *last = NULL; gboolean changed = FALSE; - CRM_CHECK(node != NULL, crm_err("%s: Could not set 'expected' to %s", source, expected); + CRM_CHECK(node != NULL, + pcmk__err("%s: Could not set 'expected' to %s", source, expected); return); /* Remote nodes don't participate in joins */ - if (pcmk_is_set(node->flags, pcmk__node_status_remote)) { + if (pcmk__is_set(node->flags, pcmk__node_status_remote)) { return; } @@ -1230,12 +1239,14 @@ pcmk__update_peer_expected(const char *source, pcmk__node_status_t *node, } if (changed) { - crm_info("%s: Node %s[%" PRIu32 "] - expected state is now %s (was %s)", - source, node->name, node->cluster_layer_id, expected, last); + pcmk__info("%s: Node %s[%" PRIu32 "] - expected state is now %s (was " + "%s)", + source, node->name, node->cluster_layer_id, expected, last); free(last); } else { - crm_trace("%s: Node %s[%" PRIu32 "] - expected state is unchanged (%s)", - source, node->name, node->cluster_layer_id, expected); + pcmk__trace("%s: Node %s[%" PRIu32 "] - expected state is unchanged " + "(%s)", + source, node->name, node->cluster_layer_id, expected); } } @@ -1263,8 +1274,9 @@ update_peer_state_iter(const char *source, pcmk__node_status_t *node, gboolean is_member; CRM_CHECK(node != NULL, - crm_err("Could not set state for unknown host to %s " - QB_XS " source=%s", state, source); + pcmk__err("Could not set state for unknown host to %s " + QB_XS " source=%s", + state, source); return NULL); is_member = pcmk__str_eq(state, PCMK_VALUE_MEMBER, pcmk__str_none); @@ -1286,25 +1298,25 @@ update_peer_state_iter(const char *source, pcmk__node_status_t *node, } node->state = strdup(state); - crm_notice("Node %s state is now %s " QB_XS - " nodeid=%" PRIu32 " previous=%s source=%s", - node->name, state, node->cluster_layer_id, - pcmk__s(last, "unknown"), source); + pcmk__notice("Node %s state is now %s " + QB_XS " nodeid=%" PRIu32 " previous=%s source=%s", + node->name, state, node->cluster_layer_id, + pcmk__s(last, "unknown"), source); if (peer_status_callback != NULL) { peer_status_callback(pcmk__node_update_state, node, last); } free(last); if (autoreap && !is_member - && !pcmk_is_set(node->flags, pcmk__node_status_remote)) { + && !pcmk__is_set(node->flags, pcmk__node_status_remote)) { /* We only autoreap from the peer cache, not the remote peer cache, * because the latter should be managed only by * refresh_remote_nodes(). */ if(iter) { - crm_notice("Purged 1 peer with cluster layer ID %" PRIu32 - "and/or name=%s from the membership cache", - node->cluster_layer_id, node->name); + pcmk__notice("Purged 1 peer with cluster layer ID %" PRIu32 + "and/or name=%s from the membership cache", + node->cluster_layer_id, node->name); g_hash_table_iter_remove(iter); } else { @@ -1315,9 +1327,9 @@ update_peer_state_iter(const char *source, pcmk__node_status_t *node, } } else { - crm_trace("Node %s state is unchanged (%s) " QB_XS - " nodeid=%" PRIu32 " source=%s", - node->name, state, node->cluster_layer_id, source); + pcmk__trace("Node %s state is unchanged (%s) " QB_XS + " nodeid=%" PRIu32 " source=%s", + node->name, state, node->cluster_layer_id, source); } return node; } @@ -1356,7 +1368,7 @@ pcmk__reap_unseen_nodes(uint64_t membership) GHashTableIter iter; pcmk__node_status_t *node = NULL; - crm_trace("Reaping unseen nodes..."); + pcmk__trace("Reaping unseen nodes..."); g_hash_table_iter_init(&iter, pcmk__peer_cache); while (g_hash_table_iter_next(&iter, NULL, (gpointer *)&node)) { if (node->membership_id != membership) { @@ -1368,8 +1380,8 @@ pcmk__reap_unseen_nodes(uint64_t membership) membership, &iter); } else { - crm_info("State of node %s[%" PRIu32 "] is still unknown", - node->name, node->cluster_layer_id); + pcmk__info("State of node %s[%" PRIu32 "] is still unknown", + node->name, node->cluster_layer_id); } } } @@ -1387,7 +1399,7 @@ find_cib_cluster_node(const char *id, const char *uname) g_hash_table_iter_init(&iter, cluster_node_cib_cache); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { if (pcmk__str_eq(node->name, uname, pcmk__str_casei)) { - crm_trace("Name match: %s = %p", node->name, node); + pcmk__trace("Name match: %s = %p", node->name, node); by_name = node; break; } @@ -1399,7 +1411,7 @@ find_cib_cluster_node(const char *id, const char *uname) while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) { if (pcmk__str_eq(id, pcmk__cluster_get_xml_id(node), pcmk__str_none)) { - crm_trace("ID match: %s= %p", id, node); + pcmk__trace("ID match: %s= %p", id, node); by_id = node; break; } @@ -1409,10 +1421,10 @@ find_cib_cluster_node(const char *id, const char *uname) node = by_id; /* Good default */ if (by_id == by_name) { /* Nothing to do if they match (both NULL counts) */ - crm_trace("Consistent: %p for %s/%s", by_id, id, uname); + pcmk__trace("Consistent: %p for %s/%s", by_id, id, uname); } else if (by_id == NULL && by_name) { - crm_trace("Only one: %p for %s/%s", by_name, id, uname); + pcmk__trace("Only one: %p for %s/%s", by_name, id, uname); if (id) { node = NULL; @@ -1422,7 +1434,7 @@ find_cib_cluster_node(const char *id, const char *uname) } } else if (by_name == NULL && by_id) { - crm_trace("Only one: %p for %s/%s", by_id, id, uname); + pcmk__trace("Only one: %p for %s/%s", by_id, id, uname); if (uname) { node = NULL; @@ -1444,11 +1456,9 @@ find_cib_cluster_node(const char *id, const char *uname) } if (node == NULL) { - crm_debug("Couldn't find node%s%s%s%s", - id? " " : "", - id? id : "", - uname? " with name " : "", - uname? uname : ""); + pcmk__debug("Couldn't find node%s%s%s%s", ((id != NULL)? " " : ""), + pcmk__s(id, ""), ((uname != NULL)? " with name " : ""), + pcmk__s(uname, "")); } return node; @@ -1457,15 +1467,15 @@ find_cib_cluster_node(const char *id, const char *uname) static void cluster_node_cib_cache_refresh_helper(xmlNode *xml_node, void *user_data) { - const char *id = crm_element_value(xml_node, PCMK_XA_ID); - const char *uname = crm_element_value(xml_node, PCMK_XA_UNAME); + const char *id = pcmk__xe_get(xml_node, PCMK_XA_ID); + const char *uname = pcmk__xe_get(xml_node, PCMK_XA_UNAME); pcmk__node_status_t * node = NULL; CRM_CHECK(id != NULL && uname !=NULL, return); node = find_cib_cluster_node(id, uname); if (node == NULL) { - char *uniqueid = crm_generate_uuid(); + char *uniqueid = pcmk__generate_uuid(); node = pcmk__assert_alloc(1, sizeof(pcmk__node_status_t)); @@ -1474,7 +1484,7 @@ cluster_node_cib_cache_refresh_helper(xmlNode *xml_node, void *user_data) g_hash_table_replace(cluster_node_cib_cache, uniqueid, node); - } else if (pcmk_is_set(node->flags, pcmk__node_status_dirty)) { + } else if (pcmk__is_set(node->flags, pcmk__node_status_dirty)) { pcmk__str_update(&node->name, uname); /* Node is in cache and hasn't been updated already, so mark it clean */ diff --git a/lib/common/acl.c b/lib/common/acl.c index 9cdafa70164..d974270ae32 100644 --- a/lib/common/acl.c +++ b/lib/common/acl.c @@ -21,13 +21,14 @@ #include // xmlXPathObject, etc. #include +#include // pcmk_acl_required(), etc. #include #include #include "crmcommon_private.h" typedef struct xml_acl_s { - enum xml_private_flags mode; - gchar *xpath; + enum pcmk__xml_flags mode; + gchar *xpath; } xml_acl_t; static void @@ -48,19 +49,19 @@ pcmk__free_acls(GList *acls) } static GList * -create_acl(const xmlNode *xml, GList *acls, enum xml_private_flags mode) +create_acl(const xmlNode *xml, GList *acls, enum pcmk__xml_flags mode) { xml_acl_t *acl = NULL; - const char *tag = crm_element_value(xml, PCMK_XA_OBJECT_TYPE); - const char *ref = crm_element_value(xml, PCMK_XA_REFERENCE); - const char *xpath = crm_element_value(xml, PCMK_XA_XPATH); - const char *attr = crm_element_value(xml, PCMK_XA_ATTRIBUTE); + const char *tag = pcmk__xe_get(xml, PCMK_XA_OBJECT_TYPE); + const char *ref = pcmk__xe_get(xml, PCMK_XA_REFERENCE); + const char *xpath = pcmk__xe_get(xml, PCMK_XA_XPATH); + const char *attr = pcmk__xe_get(xml, PCMK_XA_ATTRIBUTE); if ((tag == NULL) && (ref == NULL) && (xpath == NULL)) { // Schema should prevent this, but to be safe ... - crm_trace("Ignoring ACL <%s> element without selection criteria", - xml->name); + pcmk__trace("Ignoring ACL <%s> element without selection criteria", + xml->name); return NULL; } @@ -69,8 +70,8 @@ create_acl(const xmlNode *xml, GList *acls, enum xml_private_flags mode) acl->mode = mode; if (xpath) { acl->xpath = g_strdup(xpath); - crm_trace("Unpacked ACL <%s> element using xpath: %s", - xml->name, acl->xpath); + pcmk__trace("Unpacked ACL <%s> element using xpath: %s", xml->name, + acl->xpath); } else { GString *buf = g_string_sized_new(128); @@ -94,8 +95,8 @@ create_acl(const xmlNode *xml, GList *acls, enum xml_private_flags mode) acl->xpath = buf->str; g_string_free(buf, FALSE); - crm_trace("Unpacked ACL <%s> element as xpath: %s", - xml->name, acl->xpath); + pcmk__trace("Unpacked ACL <%s> element as xpath: %s", xml->name, + acl->xpath); } return g_list_append(acls, acl); @@ -121,12 +122,12 @@ parse_acl_entry(const xmlNode *acl_top, const xmlNode *acl_entry, GList *acls) child != NULL; child = pcmk__xe_next(child, NULL)) { if (pcmk__xe_is(child, PCMK_XE_ACL_PERMISSION)) { - const char *kind = crm_element_value(child, PCMK_XA_KIND); + const char *kind = pcmk__xe_get(child, PCMK_XA_KIND); pcmk__assert(kind != NULL); - crm_trace("Unpacking <" PCMK_XE_ACL_PERMISSION "> element of " - "kind '%s'", - kind); + pcmk__trace("Unpacking <" PCMK_XE_ACL_PERMISSION "> element of " + "kind '%s'", + kind); if (pcmk__str_eq(kind, PCMK_VALUE_READ, pcmk__str_none)) { acls = create_acl(child, acls, pcmk__xf_acl_read); @@ -138,13 +139,13 @@ parse_acl_entry(const xmlNode *acl_top, const xmlNode *acl_entry, GList *acls) acls = create_acl(child, acls, pcmk__xf_acl_deny); } else { - crm_warn("Ignoring unknown ACL kind '%s'", kind); + pcmk__warn("Ignoring unknown ACL kind '%s'", kind); } } else if (pcmk__xe_is(child, PCMK_XE_ROLE)) { - const char *ref_role = crm_element_value(child, PCMK_XA_ID); + const char *ref_role = pcmk__xe_get(child, PCMK_XA_ID); - crm_trace("Unpacking <" PCMK_XE_ROLE "> element"); + pcmk__trace("Unpacking <" PCMK_XE_ROLE "> element"); if (ref_role == NULL) { continue; @@ -160,11 +161,12 @@ parse_acl_entry(const xmlNode *acl_top, const xmlNode *acl_entry, GList *acls) continue; } - role_id = crm_element_value(role, PCMK_XA_ID); + role_id = pcmk__xe_get(role, PCMK_XA_ID); if (pcmk__str_eq(ref_role, role_id, pcmk__str_none)) { - crm_trace("Unpacking referenced role '%s' in <%s> element", - role_id, acl_entry->name); + pcmk__trace("Unpacking referenced role '%s' in <%s> " + "element", + role_id, acl_entry->name); acls = parse_acl_entry(acl_top, role, acls); break; } @@ -198,15 +200,16 @@ parse_acl_entry(const xmlNode *acl_top, const xmlNode *acl_entry, GList *acls) */ static const char * -acl_to_text(enum xml_private_flags flags) +acl_to_text(enum pcmk__xml_flags flags) { - if (pcmk_is_set(flags, pcmk__xf_acl_deny)) { + if (pcmk__is_set(flags, pcmk__xf_acl_deny)) { return "deny"; - } else if (pcmk_any_flags_set(flags, pcmk__xf_acl_write|pcmk__xf_acl_create)) { + } else if (pcmk__any_flags_set(flags, + pcmk__xf_acl_write|pcmk__xf_acl_create)) { return "read/write"; - } else if (pcmk_is_set(flags, pcmk__xf_acl_read)) { + } else if (pcmk__is_set(flags, pcmk__xf_acl_read)) { return "read"; } return "none"; @@ -216,16 +219,21 @@ void pcmk__apply_acl(xmlNode *xml) { GList *aIter = NULL; - xml_doc_private_t *docpriv = xml->doc->_private; - xml_node_private_t *nodepriv; + xml_doc_private_t *docpriv = NULL; + xml_node_private_t *nodepriv = NULL; xmlXPathObject *xpathObj = NULL; - if (!xml_acl_enabled(xml)) { - crm_trace("Skipping ACLs for user '%s' because not enabled for this XML", - docpriv->acl_user); + pcmk__assert(xml != NULL); + + if (!pcmk__xml_doc_all_flags_set(xml->doc, pcmk__xf_acl_enabled)) { + pcmk__trace("Skipping ACLs for user '%s' because not enabled for this " + "XML", + docpriv->acl_user); return; } + docpriv = xml->doc->_private; + for (aIter = docpriv->acls; aIter != NULL; aIter = aIter->next) { int max = 0, lpc = 0; xml_acl_t *acl = aIter->data; @@ -284,16 +292,15 @@ pcmk__apply_acl(xmlNode *xml) pcmk__if_tracing( { GString *path = pcmk__element_xpath(match); - crm_trace("Applying %s ACL to %s matched by %s", - acl_to_text(acl->mode), path->str, acl->xpath); + pcmk__trace("Applying %s ACL to %s matched by %s", + acl_to_text(acl->mode), path->str, acl->xpath); g_string_free(path, TRUE); }, {} ); } - crm_trace("Applied %s ACL %s (%d match%s)", - acl_to_text(acl->mode), acl->xpath, max, - ((max == 1)? "" : "es")); + pcmk__trace("Applied %s ACL %s (%d match%s)", acl_to_text(acl->mode), + acl->xpath, max, ((max == 1)? "" : "es")); xmlXPathFreeObject(xpathObj); } } @@ -323,12 +330,12 @@ pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user) docpriv = target->doc->_private; if (!pcmk_acl_required(user)) { - crm_trace("Not unpacking ACLs because not required for user '%s'", - user); + pcmk__trace("Not unpacking ACLs because not required for user '%s'", + user); } else if (docpriv->acls == NULL) { xmlNode *acls = pcmk__xpath_find_one(source->doc, "//" PCMK_XE_ACLS, - LOG_NEVER); + PCMK__LOG_NEVER); pcmk__str_update(&(docpriv->acl_user), user); @@ -339,25 +346,25 @@ pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user) child != NULL; child = pcmk__xe_next(child, NULL)) { if (pcmk__xe_is(child, PCMK_XE_ACL_TARGET)) { - const char *id = crm_element_value(child, PCMK_XA_NAME); + const char *id = pcmk__xe_get(child, PCMK_XA_NAME); if (id == NULL) { - id = crm_element_value(child, PCMK_XA_ID); + id = pcmk__xe_get(child, PCMK_XA_ID); } if (id && strcmp(id, user) == 0) { - crm_debug("Unpacking ACLs for user '%s'", id); + pcmk__debug("Unpacking ACLs for user '%s'", id); docpriv->acls = parse_acl_entry(acls, child, docpriv->acls); } } else if (pcmk__xe_is(child, PCMK_XE_ACL_GROUP)) { - const char *id = crm_element_value(child, PCMK_XA_NAME); + const char *id = pcmk__xe_get(child, PCMK_XA_NAME); if (id == NULL) { - id = crm_element_value(child, PCMK_XA_ID); + id = pcmk__xe_get(child, PCMK_XA_ID); } if (id && pcmk__is_user_in_group(user,id)) { - crm_debug("Unpacking ACLs for group '%s'", id); + pcmk__debug("Unpacking ACLs for group '%s'", id); docpriv->acls = parse_acl_entry(acls, child, docpriv->acls); } } @@ -386,20 +393,21 @@ pcmk__enable_acl(xmlNode *acl_source, xmlNode *target, const char *user) } static inline bool -test_acl_mode(enum xml_private_flags allowed, enum xml_private_flags requested) +test_acl_mode(enum pcmk__xml_flags allowed, enum pcmk__xml_flags requested) { - if (pcmk_is_set(allowed, pcmk__xf_acl_deny)) { + if (pcmk__is_set(allowed, pcmk__xf_acl_deny)) { return false; - } else if (pcmk_all_flags_set(allowed, requested)) { + } else if (pcmk__all_flags_set(allowed, requested)) { return true; - } else if (pcmk_is_set(requested, pcmk__xf_acl_read) - && pcmk_is_set(allowed, pcmk__xf_acl_write)) { + } else if (pcmk__is_set(requested, pcmk__xf_acl_read) + && pcmk__is_set(allowed, pcmk__xf_acl_write)) { return true; - } else if (pcmk_is_set(requested, pcmk__xf_acl_create) - && pcmk_any_flags_set(allowed, pcmk__xf_acl_write|pcmk__xf_created)) { + } else if (pcmk__is_set(requested, pcmk__xf_acl_create) + && pcmk__any_flags_set(allowed, + pcmk__xf_acl_write|pcmk__xf_created)) { return true; } return false; @@ -425,8 +433,8 @@ purge_xml_attributes(xmlNode *xml) xml_node_private_t *nodepriv = xml->_private; if (test_acl_mode(nodepriv->flags, pcmk__xf_acl_read)) { - crm_trace("%s[@" PCMK_XA_ID "=%s] is readable", - xml->name, pcmk__xe_id(xml)); + pcmk__trace("%s[@" PCMK_XA_ID "=%s] is readable", xml->name, + pcmk__xe_id(xml)); return true; } @@ -479,12 +487,12 @@ xml_acl_filtered_copy(const char *user, xmlNode *acl_source, xmlNode *xml, *result = NULL; if ((xml == NULL) || !pcmk_acl_required(user)) { - crm_trace("Not filtering XML because ACLs not required for user '%s'", - user); + pcmk__trace("Not filtering XML because ACLs not required for user '%s'", + user); return false; } - crm_trace("Filtering XML copy using user '%s' ACLs", user); + pcmk__trace("Filtering XML copy using user '%s' ACLs", user); target = pcmk__xml_copy(NULL, xml); if (target == NULL) { return true; @@ -520,21 +528,22 @@ xml_acl_filtered_copy(const char *user, xmlNode *acl_source, xmlNode *xml, } if (!purge_xml_attributes(match) && (match == target)) { - crm_trace("ACLs deny user '%s' access to entire XML document", - user); + pcmk__trace("ACLs deny user '%s' access to entire XML " + "document", + user); xmlXPathFreeObject(xpathObj); return true; } } - crm_trace("ACLs deny user '%s' access to %s (%d %s)", - user, acl->xpath, max, - pcmk__plural_alt(max, "match", "matches")); + pcmk__trace("ACLs deny user '%s' access to %s (%d %s)", user, + acl->xpath, max, + pcmk__plural_alt(max, "match", "matches")); xmlXPathFreeObject(xpathObj); } } if (!purge_xml_attributes(target)) { - crm_trace("ACLs deny user '%s' access to entire XML document", user); + pcmk__trace("ACLs deny user '%s' access to entire XML document", user); return true; } @@ -543,8 +552,9 @@ xml_acl_filtered_copy(const char *user, xmlNode *acl_source, xmlNode *xml, docpriv->acls = NULL; } else { - crm_trace("User '%s' without ACLs denied access to entire XML document", - user); + pcmk__trace("User '%s' without ACLs denied access to entire XML " + "document", + user); pcmk__xml_free(target); target = NULL; } @@ -613,15 +623,16 @@ pcmk__apply_creation_acl(xmlNode *xml, bool check_top) { xml_node_private_t *nodepriv = xml->_private; - if (pcmk_is_set(nodepriv->flags, pcmk__xf_created)) { + if (pcmk__is_set(nodepriv->flags, pcmk__xf_created)) { if (implicitly_allowed(xml)) { - crm_trace("Creation of <%s> scaffolding with " PCMK_XA_ID "=\"%s\"" - " is implicitly allowed", - xml->name, display_id(xml)); + pcmk__trace("Creation of <%s> scaffolding with " + PCMK_XA_ID "=\"%s\" is implicitly allowed", + xml->name, display_id(xml)); } else if (pcmk__check_acl(xml, NULL, pcmk__xf_acl_write)) { - crm_trace("ACLs allow creation of <%s> with " PCMK_XA_ID "=\"%s\"", - xml->name, display_id(xml)); + pcmk__trace("ACLs allow creation of <%s> with " + PCMK_XA_ID "=\"%s\"", + xml->name, display_id(xml)); } else if (check_top) { /* is_root=true should be impossible with check_top=true, but check @@ -630,10 +641,10 @@ pcmk__apply_creation_acl(xmlNode *xml, bool check_top) bool is_root = (xmlDocGetRootElement(xml->doc) == xml); xml_doc_private_t *docpriv = xml->doc->_private; - crm_trace("ACLs disallow creation of %s<%s> with " - PCMK_XA_ID "=\"%s\"", - (is_root? "root element " : ""), xml->name, - display_id(xml)); + pcmk__trace("ACLs disallow creation of %s<%s> with " + PCMK_XA_ID "=\"%s\"", + (is_root? "root element " : ""), xml->name, + display_id(xml)); // pcmk__xml_free() checks ACLs if enabled, which would fail pcmk__clear_xml_flags(docpriv, pcmk__xf_acl_enabled); @@ -646,10 +657,12 @@ pcmk__apply_creation_acl(xmlNode *xml, bool check_top) return; } else { - crm_notice("ACLs would disallow creation of %s<%s> with " - PCMK_XA_ID "=\"%s\"", - ((xml == xmlDocGetRootElement(xml->doc))? "root element " : ""), - xml->name, display_id(xml)); + const bool is_root = (xml == xmlDocGetRootElement(xml->doc)); + + pcmk__notice("ACLs would disallow creation of %s<%s> with " + PCMK_XA_ID "=\"%s\"", + (is_root? "root element " : ""), xml->name, + display_id(xml)); } } @@ -673,7 +686,7 @@ xml_acl_denied(const xmlNode *xml) if (xml && xml->doc && xml->doc->_private){ xml_doc_private_t *docpriv = xml->doc->_private; - return pcmk_is_set(docpriv->flags, pcmk__xf_acl_denied); + return pcmk__is_set(docpriv->flags, pcmk__xf_acl_denied); } return false; } @@ -681,7 +694,9 @@ xml_acl_denied(const xmlNode *xml) void xml_acl_disable(xmlNode *xml) { - if (xml_acl_enabled(xml)) { + if ((xml != NULL) + && pcmk__xml_doc_all_flags_set(xml->doc, pcmk__xf_acl_enabled)) { + xml_doc_private_t *docpriv = xml->doc->_private; /* Catch anything that was created but shouldn't have been */ @@ -691,24 +706,6 @@ xml_acl_disable(xmlNode *xml) } } -/*! - * \brief Check whether or not an XML node is ACL-enabled - * - * \param[in] xml node to check - * - * \return true if XML node exists and is ACL-enabled, false otherwise - */ -bool -xml_acl_enabled(const xmlNode *xml) -{ - if (xml && xml->doc && xml->doc->_private){ - xml_doc_private_t *docpriv = xml->doc->_private; - - return pcmk_is_set(docpriv->flags, pcmk__xf_acl_enabled); - } - return false; -} - /*! * \internal * \brief Deny access to an XML tree's document based on ACLs @@ -719,7 +716,7 @@ xml_acl_enabled(const xmlNode *xml) * \param[in] prefix Prefix describing ACL that denied access (for * logging only) * \param[in] user User accessing \p xml (for logging only) - * \param[in] mode Access mode + * \param[in] mode Access mode (for logging only) */ #define check_acl_deny(xml, attr_name, prefix, user, mode) do { \ xmlNode *tree = xml; \ @@ -735,7 +732,7 @@ xml_acl_enabled(const xmlNode *xml) qb_log_from_external_source(__func__, __FILE__, \ "%sACL denies user '%s' %s " \ "access to %s", \ - LOG_TRACE, __LINE__, 0 , \ + PCMK__LOG_TRACE, __LINE__, 0 , \ prefix, user, \ acl_to_text(mode), xpath->str); \ g_string_free(xpath, TRUE); \ @@ -745,15 +742,14 @@ xml_acl_enabled(const xmlNode *xml) } while (false); bool -pcmk__check_acl(xmlNode *xml, const char *attr_name, - enum xml_private_flags mode) +pcmk__check_acl(xmlNode *xml, const char *attr_name, enum pcmk__xml_flags mode) { xml_doc_private_t *docpriv = NULL; pcmk__assert((xml != NULL) && (xml->doc->_private != NULL)); - if (!pcmk__xml_doc_all_flags_set(xml->doc, pcmk__xf_tracking) - || !xml_acl_enabled(xml)) { + if (!pcmk__xml_doc_all_flags_set(xml->doc, + pcmk__xf_tracking|pcmk__xf_acl_enabled)) { return true; } @@ -786,7 +782,7 @@ pcmk__check_acl(xmlNode *xml, const char *attr_name, return true; } - if (pcmk_is_set(nodepriv->flags, pcmk__xf_acl_deny)) { + if (pcmk__is_set(nodepriv->flags, pcmk__xf_acl_deny)) { const char *pfx = (parent != xml)? "Parent " : ""; check_acl_deny(xml, attr_name, pfx, docpriv->acl_user, mode); @@ -809,14 +805,14 @@ bool pcmk_acl_required(const char *user) { if (pcmk__str_empty(user)) { - crm_trace("ACLs not required because no user set"); + pcmk__trace("ACLs not required because no user set"); return false; } else if (!strcmp(user, CRM_DAEMON_USER) || !strcmp(user, "root")) { - crm_trace("ACLs not required for privileged user %s", user); + pcmk__trace("ACLs not required for privileged user %s", user); return false; } - crm_trace("ACLs required for %s", user); + pcmk__trace("ACLs required for %s", user); return true; } @@ -862,11 +858,12 @@ pcmk__update_acl_user(xmlNode *request, const char *field, effective_user = pcmk__uid2username(geteuid()); if (effective_user == NULL) { effective_user = pcmk__str_copy("#unprivileged"); - crm_err("Unable to determine effective user, assuming unprivileged for ACLs"); + pcmk__err("Unable to determine effective user, assuming " + "unprivileged for ACLs"); } } - requested_user = crm_element_value(request, PCMK__XA_ACL_TARGET); + requested_user = pcmk__xe_get(request, PCMK__XA_ACL_TARGET); if (requested_user == NULL) { /* Currently, different XML attribute names are used for the ACL user in * different contexts (PCMK__XA_ATTR_USER, PCMK__XA_CIB_USER, etc.). @@ -876,7 +873,7 @@ pcmk__update_acl_user(xmlNode *request, const char *field, * others once rolling upgrades from versions older than that are no * longer supported. */ - requested_user = crm_element_value(request, field); + requested_user = pcmk__xe_get(request, field); } if (!pcmk__is_privileged(effective_user)) { @@ -911,13 +908,33 @@ pcmk__update_acl_user(xmlNode *request, const char *field, } // This requires pointer comparison, not string comparison - if (user != crm_element_value(request, PCMK__XA_ACL_TARGET)) { - crm_xml_add(request, PCMK__XA_ACL_TARGET, user); + if (user != pcmk__xe_get(request, PCMK__XA_ACL_TARGET)) { + pcmk__xe_set(request, PCMK__XA_ACL_TARGET, user); } - if (field != NULL && user != crm_element_value(request, field)) { - crm_xml_add(request, field, user); + if ((field != NULL) && (user != pcmk__xe_get(request, field))) { + pcmk__xe_set(request, field, user); } return requested_user; } + +// Deprecated functions kept only for backward API compatibility +// LCOV_EXCL_START + +#include +#include + +bool +xml_acl_enabled(const xmlNode *xml) +{ + if (xml && xml->doc && xml->doc->_private){ + xml_doc_private_t *docpriv = xml->doc->_private; + + return pcmk__is_set(docpriv->flags, pcmk__xf_acl_enabled); + } + return false; +} + +// LCOV_EXCL_STOP +// End deprecated API diff --git a/lib/common/actions.c b/lib/common/actions.c index 61076f50b13..c7b09ef5e1b 100644 --- a/lib/common/actions.c +++ b/lib/common/actions.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -225,7 +225,7 @@ char * pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms) { pcmk__assert((rsc_id != NULL) && (op_type != NULL)); - return crm_strdup_printf(PCMK__OP_FMT, rsc_id, op_type, interval_ms); + return pcmk__assert_asprintf(PCMK__OP_FMT, rsc_id, op_type, interval_ms); } static inline gboolean @@ -368,8 +368,8 @@ pcmk__notify_key(const char *rsc_id, const char *notify_type, CRM_CHECK(rsc_id != NULL, return NULL); CRM_CHECK(op_type != NULL, return NULL); CRM_CHECK(notify_type != NULL, return NULL); - return crm_strdup_printf("%s_%s_notify_%s_0", - rsc_id, notify_type, op_type); + return pcmk__assert_asprintf("%s_%s_notify_%s_0", + rsc_id, notify_type, op_type); } /*! @@ -407,12 +407,13 @@ decode_transition_magic(const char *magic, char **uuid, int *transition_id, int res = sscanf(magic, "%d:%d;%s", &local_op_status, &local_op_rc, key); #endif if (res == EOF) { - crm_err("Could not decode transition information '%s': %s", - magic, pcmk_rc_str(errno)); + pcmk__err("Could not decode transition information '%s': %s", magic, + pcmk_rc_str(errno)); result = FALSE; } else if (res < 3) { - crm_warn("Transition information '%s' incomplete (%d of 3 expected items)", - magic, res); + pcmk__warn("Transition information '%s' incomplete (%d of 3 expected " + "items)", + magic, res); result = FALSE; } else { if (op_status) { @@ -433,8 +434,8 @@ pcmk__transition_key(int transition_id, int action_id, int target_rc, const char *node) { CRM_CHECK(node != NULL, return NULL); - return crm_strdup_printf("%d:%d:%d:%-*s", - action_id, transition_id, target_rc, 36, node); + return pcmk__assert_asprintf("%d:%d:%d:%-*s", + action_id, transition_id, target_rc, 36, node); } /*! @@ -476,11 +477,11 @@ decode_transition_key(const char *key, char **uuid, int *transition_id, int *act CRM_CHECK(key != NULL, return FALSE); if (sscanf(key, "%d:%d:%d:%36s", &local_action_id, &local_transition_id, &local_target_rc, local_uuid) != 4) { - crm_err("Invalid transition key '%s'", key); + pcmk__err("Invalid transition key '%s'", key); return FALSE; } if (strlen(local_uuid) != 36) { - crm_warn("Invalid UUID '%s' in transition key '%s'", local_uuid, key); + pcmk__warn("Invalid UUID '%s' in transition key '%s'", local_uuid, key); } if (uuid) { *uuid = pcmk__str_copy(local_uuid); @@ -555,10 +556,10 @@ crm_create_op_xml(xmlNode *parent, const char *prefix, const char *task, xml_op = pcmk__xe_create(parent, PCMK_XE_OP); pcmk__xe_set_id(xml_op, "%s-%s-%s", prefix, task, interval_spec); - crm_xml_add(xml_op, PCMK_META_INTERVAL, interval_spec); - crm_xml_add(xml_op, PCMK_XA_NAME, task); + pcmk__xe_set(xml_op, PCMK_META_INTERVAL, interval_spec); + pcmk__xe_set(xml_op, PCMK_XA_NAME, task); if (timeout) { - crm_xml_add(xml_op, PCMK_META_TIMEOUT, timeout); + pcmk__xe_set(xml_op, PCMK_META_TIMEOUT, timeout); } return xml_op; } @@ -582,7 +583,7 @@ crm_op_needs_metadata(const char *rsc_class, const char *op) CRM_CHECK((rsc_class != NULL) || (op != NULL), return false); if ((rsc_class != NULL) - && !pcmk_is_set(pcmk_get_ra_caps(rsc_class), pcmk_ra_cap_params)) { + && !pcmk__is_set(pcmk_get_ra_caps(rsc_class), pcmk_ra_cap_params)) { // Metadata is needed only for resource classes that use parameters return false; } diff --git a/lib/common/agents.c b/lib/common/agents.c index 34acbb0b45e..d705b2a5866 100644 --- a/lib/common/agents.c +++ b/lib/common/agents.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -92,10 +92,11 @@ crm_generate_ra_key(const char *standard, const char *provider, return NULL; } - return crm_strdup_printf("%s%s%s:%s", - standard, - (prov_empty ? "" : ":"), (prov_empty ? "" : provider), - type); + return pcmk__assert_asprintf("%s%s%s:%s", + standard, + (prov_empty ? "" : ":"), + (prov_empty ? "" : provider), + type); } /*! @@ -131,7 +132,7 @@ crm_parse_agent_spec(const char *spec, char **standard, char **provider, *standard = strndup(spec, colon - spec); spec = colon + 1; - if (pcmk_is_set(pcmk_get_ra_caps(*standard), pcmk_ra_cap_provider)) { + if (pcmk__is_set(pcmk_get_ra_caps(*standard), pcmk_ra_cap_provider)) { colon = strchr(spec, ':'); if ((colon == NULL) || (colon == spec)) { free(*standard); diff --git a/lib/common/alerts.c b/lib/common/alerts.c index d9e18f4d09b..efd40cae722 100644 --- a/lib/common/alerts.c +++ b/lib/common/alerts.c @@ -1,5 +1,5 @@ /* - * Copyright 2015-2024 the Pacemaker project contributors + * Copyright 2015-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,6 +10,7 @@ #include #include #include +#include // pcmk_unpack_nvpair_blocks(), etc. #include #include #include @@ -109,11 +110,11 @@ pcmk__add_alert_key(GHashTable *table, enum pcmk__alert_keys_e name, pcmk__assert((table != NULL) && (name >= 0) && (name < PCMK__ALERT_INTERNAL_KEY_MAX)); if (value == NULL) { - crm_trace("Removing alert key %s", pcmk__alert_keys[name]); + pcmk__trace("Removing alert key %s", pcmk__alert_keys[name]); g_hash_table_remove(table, pcmk__alert_keys[name]); } else { - crm_trace("Inserting alert key %s = '%s'", - pcmk__alert_keys[name], value); + pcmk__trace("Inserting alert key %s = '%s'", pcmk__alert_keys[name], + value); pcmk__insert_dup(table, pcmk__alert_keys[name], value); } } @@ -124,7 +125,7 @@ pcmk__add_alert_key_int(GHashTable *table, enum pcmk__alert_keys_e name, { pcmk__assert((table != NULL) && (name >= 0) && (name < PCMK__ALERT_INTERNAL_KEY_MAX)); - crm_trace("Inserting alert key %s = %d", pcmk__alert_keys[name], value); + pcmk__trace("Inserting alert key %s = %d", pcmk__alert_keys[name], value); g_hash_table_insert(table, pcmk__str_copy(pcmk__alert_keys[name]), pcmk__itoa(value)); } @@ -159,7 +160,7 @@ unpack_alert_options(xmlNode *xml, pcmk__alert_t *entry, guint *max_timeout) crm_time_free(now); value = g_hash_table_lookup(config_hash, PCMK_META_ENABLED); - if ((value != NULL) && !crm_is_true(value)) { + if ((value != NULL) && !pcmk__is_true(value)) { // No need to continue unpacking rc = pcmk_rc_disabled; goto done; @@ -167,22 +168,26 @@ unpack_alert_options(xmlNode *xml, pcmk__alert_t *entry, guint *max_timeout) value = g_hash_table_lookup(config_hash, PCMK_META_TIMEOUT); if (value != NULL) { - long long timeout_ms = crm_get_msec(value); + long long timeout_ms = 0; - entry->timeout = (int) QB_MIN(timeout_ms, INT_MAX); - if (entry->timeout <= 0) { - if (entry->timeout == 0) { - crm_trace("Alert %s uses default timeout (%s)", - entry->id, READABLE_DEFAULT); + if ((pcmk__parse_ms(value, &timeout_ms) != pcmk_rc_ok) + || (timeout_ms <= 0)) { + + entry->timeout = PCMK__ALERT_DEFAULT_TIMEOUT_MS; + + if (timeout_ms == 0) { + pcmk__trace("Alert %s uses default timeout (%s)", entry->id, + READABLE_DEFAULT); } else { pcmk__config_warn("Using default timeout (%s) for alert %s " "because '%s' is not a valid timeout", entry->id, value, READABLE_DEFAULT); } - entry->timeout = PCMK__ALERT_DEFAULT_TIMEOUT_MS; + } else { - crm_trace("Alert %s uses timeout of %s", - entry->id, pcmk__readable_interval(entry->timeout)); + entry->timeout = (int) QB_MIN(timeout_ms, INT_MAX); + pcmk__trace("Alert %s uses timeout of %s", entry->id, + pcmk__readable_interval(entry->timeout)); } if (entry->timeout > *max_timeout) { *max_timeout = entry->timeout; @@ -194,8 +199,8 @@ unpack_alert_options(xmlNode *xml, pcmk__alert_t *entry, guint *max_timeout) * can be a valid time-format-string */ entry->tstamp_format = strdup(value); - crm_trace("Alert %s uses timestamp format '%s'", - entry->id, entry->tstamp_format); + pcmk__trace("Alert %s uses timestamp format '%s'", entry->id, + entry->tstamp_format); } done: @@ -233,15 +238,15 @@ unpack_alert_parameters(const xmlNode *xml, pcmk__alert_t *entry) for (child = pcmk__xe_first_child(child, PCMK_XE_NVPAIR, NULL, NULL); child != NULL; child = pcmk__xe_next(child, PCMK_XE_NVPAIR)) { - const char *name = crm_element_value(child, PCMK_XA_NAME); - const char *value = crm_element_value(child, PCMK_XA_VALUE); + const char *name = pcmk__xe_get(child, PCMK_XA_NAME); + const char *value = pcmk__xe_get(child, PCMK_XA_VALUE); if (value == NULL) { value = ""; } pcmk__insert_dup(entry->envvars, name, value); - crm_trace("Alert %s: added environment variable %s='%s'", - entry->id, name, value); + pcmk__trace("Alert %s: added environment variable %s='%s'", entry->id, + name, value); } } @@ -282,7 +287,7 @@ unpack_alert_filter(xmlNode *xml, pcmk__alert_t *entry) NULL, NULL); attr != NULL; attr = pcmk__xe_next(attr, PCMK_XE_ATTRIBUTE)) { - attr_name = crm_element_value(attr, PCMK_XA_NAME); + attr_name = pcmk__xe_get(attr, PCMK_XA_NAME); if (attr_name) { if (nattrs == 0) { g_strfreev(entry->select_attribute_name); @@ -299,14 +304,24 @@ unpack_alert_filter(xmlNode *xml, pcmk__alert_t *entry) } if (flags != pcmk__alert_none) { + const bool attribute = pcmk__is_set(flags, pcmk__alert_attribute); + const bool fencing = pcmk__is_set(flags, pcmk__alert_fencing); + const bool node = pcmk__is_set(flags, pcmk__alert_node); + const bool resource = pcmk__is_set(flags, pcmk__alert_resource); + const char *which_attrs = "none"; + + if (attribute) { + if (entry->select_attribute_name != NULL) { + which_attrs = "some"; + } else { + which_attrs = "all"; + } + } + entry->flags = flags; - crm_debug("Alert %s receives events: attributes:%s%s%s%s", - entry->id, - (pcmk_is_set(flags, pcmk__alert_attribute)? - (entry->select_attribute_name? "some" : "all") : "none"), - (pcmk_is_set(flags, pcmk__alert_fencing)? " fencing" : ""), - (pcmk_is_set(flags, pcmk__alert_node)? " nodes" : ""), - (pcmk_is_set(flags, pcmk__alert_resource)? " resources" : "")); + pcmk__debug("Alert %s receives events: attributes:%s%s%s%s", entry->id, + which_attrs, (fencing? " fencing" : ""), + (node? " nodes" : ""), (resource? " resources" : "")); } } @@ -355,7 +370,7 @@ pcmk__unpack_alerts(const xmlNode *alerts) xmlNode *recipient = NULL; int recipients = 0; const char *alert_id = pcmk__xe_id(alert); - const char *alert_path = crm_element_value(alert, PCMK_XA_PATH); + const char *alert_path = pcmk__xe_get(alert, PCMK_XA_PATH); // Not possible with schema validation enabled if (alert_id == NULL) { @@ -372,7 +387,7 @@ pcmk__unpack_alerts(const xmlNode *alerts) if (unpack_alert(alert, entry, &max_timeout) != pcmk_rc_ok) { // Don't allow recipients to override if entire alert is disabled - crm_debug("Alert %s is disabled", entry->id); + pcmk__debug("Alert %s is disabled", entry->id); pcmk__free_alert(entry); continue; } @@ -382,10 +397,10 @@ pcmk__unpack_alerts(const xmlNode *alerts) pcmk__str_copy(PCMK__ALERT_DEFAULT_TSTAMP_FORMAT); } - crm_debug("Alert %s: path=%s timeout=%s tstamp-format='%s'", - entry->id, entry->path, - pcmk__readable_interval(entry->timeout), - entry->tstamp_format); + pcmk__debug("Alert %s: path=%s timeout=%s tstamp-format='%s'", + entry->id, entry->path, + pcmk__readable_interval(entry->timeout), + entry->tstamp_format); for (recipient = pcmk__xe_first_child(alert, PCMK_XE_RECIPIENT, NULL, NULL); @@ -393,24 +408,28 @@ pcmk__unpack_alerts(const xmlNode *alerts) recipient = pcmk__xe_next(recipient, PCMK_XE_RECIPIENT)) { pcmk__alert_t *recipient_entry = pcmk__dup_alert(entry); + guint n_envvars = 0; recipients++; - recipient_entry->recipient = crm_element_value_copy(recipient, - PCMK_XA_VALUE); + recipient_entry->recipient = pcmk__xe_get_copy(recipient, + PCMK_XA_VALUE); if (unpack_alert(recipient, recipient_entry, &max_timeout) != pcmk_rc_ok) { - crm_debug("Alert %s: recipient %s is disabled", - entry->id, recipient_entry->id); + pcmk__debug("Alert %s: recipient %s is disabled", entry->id, + recipient_entry->id); pcmk__free_alert(recipient_entry); continue; } alert_list = g_list_prepend(alert_list, recipient_entry); - crm_debug("Alert %s has recipient %s with value %s and %d envvars", - entry->id, pcmk__xe_id(recipient), - recipient_entry->recipient, - (recipient_entry->envvars? - g_hash_table_size(recipient_entry->envvars) : 0)); + + if (recipient_entry->envvars != NULL) { + n_envvars = g_hash_table_size(recipient_entry->envvars); + } + pcmk__debug("Alert %s has recipient %s with value %s and %d " + "envvars", + entry->id, pcmk__xe_id(recipient), + recipient_entry->recipient, n_envvars); } if (recipients == 0) { diff --git a/lib/common/attrs.c b/lib/common/attrs.c index aa50831c8b8..032a137dd84 100644 --- a/lib/common/attrs.c +++ b/lib/common/attrs.c @@ -1,5 +1,5 @@ /* - * Copyright 2011-2024 the Pacemaker project contributors + * Copyright 2011-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,6 +11,7 @@ #include +#include // crm_meta_name() #include #include #include @@ -93,7 +94,7 @@ pcmk_promotion_score_name(const char *rsc_id) return NULL; } } - return crm_strdup_printf("master-%s", rsc_id); + return pcmk__assert_asprintf("master-%s", rsc_id); } /*! @@ -130,8 +131,8 @@ pcmk__node_attr(const pcmk_node_t *node, const char *name, const char *target, if (!pcmk__is_guest_or_bundle_node(node) || !pcmk__str_eq(target, PCMK_VALUE_HOST, pcmk__str_casei)) { value = g_hash_table_lookup(node->priv->attrs, name); - crm_trace("%s='%s' on %s", - name, pcmk__s(value, ""), pcmk__node_name(node)); + pcmk__trace("%s='%s' on %s", name, pcmk__s(value, ""), + pcmk__node_name(node)); return value; } @@ -145,9 +146,9 @@ pcmk__node_attr(const pcmk_node_t *node, const char *name, const char *target, case pcmk__rsc_node_assigned: host = container->priv->assigned_node; if (host == NULL) { - crm_trace("Skipping %s lookup for %s because " - "its container %s is unassigned", - name, pcmk__node_name(node), container->id); + pcmk__trace("Skipping %s lookup for %s because its container " + "%s is unassigned", + name, pcmk__node_name(node), container->id); return NULL; } node_type_s = "assigned"; @@ -158,9 +159,9 @@ pcmk__node_attr(const pcmk_node_t *node, const char *name, const char *target, host = container->priv->active_nodes->data; } if (host == NULL) { - crm_trace("Skipping %s lookup for %s because " - "its container %s is inactive", - name, pcmk__node_name(node), container->id); + pcmk__trace("Skipping %s lookup for %s because its container " + "%s is inactive", + name, pcmk__node_name(node), container->id); return NULL; } node_type_s = "current"; @@ -173,8 +174,8 @@ pcmk__node_attr(const pcmk_node_t *node, const char *name, const char *target, } value = g_hash_table_lookup(host->priv->attrs, name); - crm_trace("%s='%s' for %s on %s container host %s", - name, pcmk__s(value, ""), pcmk__node_name(node), node_type_s, - pcmk__node_name(host)); + pcmk__trace("%s='%s' for %s on %s container host %s", name, + pcmk__s(value, ""), pcmk__node_name(node), node_type_s, + pcmk__node_name(host)); return value; } diff --git a/lib/common/cib.c b/lib/common/cib.c index fc29b0df644..5a1f09f7e0a 100644 --- a/lib/common/cib.c +++ b/lib/common/cib.c @@ -172,7 +172,7 @@ xmlNode * pcmk_find_cib_element(xmlNode *cib, const char *element_name) { return pcmk__xpath_find_one(cib->doc, pcmk_cib_xpath_for(element_name), - LOG_TRACE); + PCMK__LOG_TRACE); } /*! @@ -184,7 +184,8 @@ pcmk_find_cib_element(xmlNode *cib, const char *element_name) int pcmk__check_feature_set(const char *cib_version) { - if (cib_version && compare_version(cib_version, CRM_FEATURE_SET) > 0) { + if ((cib_version != NULL) + && (pcmk__compare_versions(cib_version, CRM_FEATURE_SET) > 0)) { return EPROTONOSUPPORT; } diff --git a/lib/common/cib_secrets.c b/lib/common/cib_secrets.c index 455c365d04d..1d2931ac331 100644 --- a/lib/common/cib_secrets.c +++ b/lib/common/cib_secrets.c @@ -45,13 +45,13 @@ read_file_trimmed(const char *filename) int rc = pcmk__file_contents(filename, &buf); if (rc != pcmk_rc_ok) { - crm_err("Failed to read %s: %s", filename, pcmk_rc_str(rc)); + pcmk__err("Failed to read %s: %s", filename, pcmk_rc_str(rc)); free(buf); return NULL; } if (buf == NULL) { - crm_err("File %s is empty", filename); + pcmk__err("File %s is empty", filename); return NULL; } @@ -78,37 +78,37 @@ validate_hash(const char *filename, const char *secret_value, const char *rsc_id, const char *param) { char *stored = NULL; - char *calculated = NULL; + gchar *calculated = NULL; int rc = pcmk_rc_ok; stored = read_file_trimmed(filename); if (stored == NULL) { - crm_err("Could not read md5 sum for resource %s parameter '%s' from " - "file '%s'", - rsc_id, param, filename); + pcmk__err("Could not read md5 sum for resource %s parameter '%s' from " + "file '%s'", + rsc_id, param, filename); rc = ENOENT; goto done; } - calculated = crm_md5sum(secret_value); + calculated = pcmk__md5sum(secret_value); if (calculated == NULL) { // Should be impossible rc = EINVAL; goto done; } - crm_trace("Stored hash: %s, calculated hash: %s", stored, calculated); + pcmk__trace("Stored hash: %s, calculated hash: %s", stored, calculated); if (!pcmk__str_eq(stored, calculated, pcmk__str_casei)) { - crm_err("Calculated md5 sum for resource %s parameter '%s' does not " - "match stored md5 sum", - rsc_id, param); + pcmk__err("Calculated md5 sum for resource %s parameter '%s' does not " + "match stored md5 sum", + rsc_id, param); rc = pcmk_rc_cib_corrupt; } done: free(stored); - free(calculated); + g_free(calculated); return rc; } @@ -153,7 +153,7 @@ pcmk__substitute_secrets(const char *rsc_id, GHashTable *params) if (filename == NULL) { // First secret parameter. Fill in directory path for use with all. - crm_debug("Replacing secret parameters for resource %s", rsc_id); + pcmk__debug("Replacing secret parameters for resource %s", rsc_id); filename = g_string_sized_new(128); pcmk__g_strcat(filename, PCMK__CIB_SECRETS_DIR "/", rsc_id, "/", @@ -169,9 +169,9 @@ pcmk__substitute_secrets(const char *rsc_id, GHashTable *params) g_string_append(filename, param); secret_value = read_file_trimmed(filename->str); if (secret_value == NULL) { - crm_err("Secret value for resource %s parameter '%s' not found in " - PCMK__CIB_SECRETS_DIR, - rsc_id, param); + pcmk__err("Secret value for resource %s parameter '%s' not found " + "in " PCMK__CIB_SECRETS_DIR, + rsc_id, param); rc = ENOENT; continue; } diff --git a/lib/common/cmdline.c b/lib/common/cmdline.c index 820bab39b60..849d7ee226a 100644 --- a/lib/common/cmdline.c +++ b/lib/common/cmdline.c @@ -1,5 +1,5 @@ /* - * Copyright 2019-2024 the Pacemaker project contributors + * Copyright 2019-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -100,7 +100,8 @@ pcmk__build_arg_context(pcmk__common_args_t *common_args, const char *fmts, *output_group = g_option_group_new("output", N_("Output Options:"), N_("Show output help"), NULL, NULL); } - common_args->output_as_descr = crm_strdup_printf("Specify output format as one of: %s", fmts); + common_args->output_as_descr = + pcmk__assert_asprintf("Specify output format as one of: %s", fmts); output_entries[0].description = common_args->output_as_descr; g_option_group_add_entries(*output_group, output_entries); g_option_context_add_group(context, *output_group); diff --git a/lib/common/crmcommon_private.h b/lib/common/crmcommon_private.h index 8e1b453eb61..ab89acc0e53 100644 --- a/lib/common/crmcommon_private.h +++ b/lib/common/crmcommon_private.h @@ -25,12 +25,11 @@ #include // pcmk_ipc_api_t, crm_ipc_t, etc. #include // crm_time_t -#include // LOG_NEVER #include // mainloop_io_t #include // pcmk__output_t #include // crm_exit_t #include // pcmk_rule_input_t -#include // enum xml_private_flags +#include // enum pcmk__xml_flags #ifdef __cplusplus extern "C" { @@ -70,7 +69,8 @@ typedef struct pcmk__deleted_xml_s { */ typedef struct xml_node_private_s { uint32_t check; //!< Magic number for checking integrity - uint32_t flags; //!< Group of enum xml_private_flags + uint32_t flags; //!< Group of enum pcmk__xml_flags + xmlNode *match; //!< Pointer to matching node (defined by caller) } xml_node_private_t; /*! @@ -79,7 +79,7 @@ typedef struct xml_node_private_s { */ typedef struct xml_doc_private_s { uint32_t check; //!< Magic number for checking integrity - uint32_t flags; //!< Group of enum xml_private_flags + uint32_t flags; //!< Group of enum pcmk__xml_flags char *acl_user; //!< User affected by \c acls (for logging) //! ACLs to check requested changes against (list of \c xml_acl_t) @@ -101,13 +101,13 @@ typedef struct xml_doc_private_s { #define pcmk__set_xml_flags(xml_priv, flags_to_set) do { \ (xml_priv)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_NEVER, "XML", "XML node", (xml_priv)->flags, \ + PCMK__LOG_NEVER, "XML", "XML node", (xml_priv)->flags, \ (flags_to_set), #flags_to_set); \ } while (0) #define pcmk__clear_xml_flags(xml_priv, flags_to_clear) do { \ (xml_priv)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_NEVER, "XML", "XML node", (xml_priv)->flags, \ + PCMK__LOG_NEVER, "XML", "XML node", (xml_priv)->flags, \ (flags_to_clear), #flags_to_clear); \ } while (0) @@ -133,16 +133,10 @@ G_GNUC_INTERNAL xmlDoc *pcmk__xml_new_doc(void); G_GNUC_INTERNAL -int pcmk__xml_position(const xmlNode *xml, - enum xml_private_flags ignore_if_set); +int pcmk__xml_position(const xmlNode *xml, enum pcmk__xml_flags ignore_if_set); G_GNUC_INTERNAL -xmlNode *pcmk__xml_match(const xmlNode *haystack, const xmlNode *needle, - bool exact); - -G_GNUC_INTERNAL -xmlNode *pcmk__xc_match(const xmlNode *root, const xmlNode *search_comment, - bool exact); +bool pcmk__xc_matches(const xmlNode *comment1, const xmlNode *comment2); G_GNUC_INTERNAL void pcmk__xc_update(xmlNode *parent, xmlNode *target, xmlNode *update); @@ -219,6 +213,11 @@ int pcmk__add_time_from_xml(crm_time_t *t, enum pcmk__time_component component, G_GNUC_INTERNAL void pcmk__set_time_if_earlier(crm_time_t *target, const crm_time_t *source); +/* + * Digests + */ + +char *pcmk__md5sum(const char *input); /* * IPC @@ -445,12 +444,6 @@ int pcmk__evaluate_op_expression(const xmlNode *expr, const pcmk_rule_input_t *rule_input); -/* - * Utils - */ -#define PCMK__PW_BUFFER_LEN 500 - - /* * Schemas */ diff --git a/lib/common/digest.c b/lib/common/digest.c index e7d23f7088a..aef65125167 100644 --- a/lib/common/digest.c +++ b/lib/common/digest.c @@ -20,6 +20,7 @@ #include // gnutls_strerror() #include +#include // crm_meta_name() #include #include "crmcommon_private.h" @@ -58,7 +59,7 @@ * \return Newly allocated buffer containing dumped XML */ static GString * -dump_xml_for_digest(xmlNodePtr xml) +dump_xml_for_digest(const xmlNode *xml) { GString *buffer = g_string_sized_new(1024); @@ -70,6 +71,46 @@ dump_xml_for_digest(xmlNodePtr xml) return buffer; } +/*! + * \internal + * \brief Compute an MD5 checksum for a given input string + * + * \param[in] input Input string (can be \c NULL) + * + * \return Newly allocated string containing MD5 checksum for \p input, or + * \c NULL on error or if \p input is \c NULL + * + * \note The caller is responsible for freeing the return value using \c free(). + */ +char * +pcmk__md5sum(const char *input) +{ + /* This function makes two copies of the same string: one inside + * g_compute_checksum_for_string() and one from pcmk__str_copy(). The first + * one gets freed before return. + * + * We could avoid this by calling g_checksum_new(), g_checksum_get_string() + * (copying the return value with pcmk__str_copy(), and g_checksum_free() + * directly; or by updating our own call chains to use (gchar *) strings. + * However, the below is much more readable. + */ + char *checksum = NULL; + gchar *checksum_g = NULL; + + if (input == NULL) { + return NULL; + } + + checksum_g = g_compute_checksum_for_string(G_CHECKSUM_MD5, input, -1); + if (checksum_g == NULL) { + pcmk__err("Failed to compute MD5 checksum for %s", input); + } + + checksum = pcmk__str_copy(checksum_g); + g_free(checksum_g); + return checksum; +} + /*! * \internal * \brief Calculate and return v1 digest of XML tree @@ -81,9 +122,10 @@ dump_xml_for_digest(xmlNodePtr xml) * \note Example return value: "c048eae664dba840e1d2060f00299e9d" */ static char * -calculate_xml_digest_v1(xmlNode *input) +calculate_xml_digest_v1(const xmlNode *input) { GString *buffer = dump_xml_for_digest(input); + gchar *digest_g = NULL; char *digest = NULL; // buffer->len > 2 for initial space and trailing newline @@ -91,10 +133,11 @@ calculate_xml_digest_v1(xmlNode *input) g_string_free(buffer, TRUE); return NULL); - digest = crm_md5sum((const char *) buffer->str); - crm_log_xml_trace(input, "digest:source"); + digest_g = pcmk__md5sum(buffer->str); + digest = pcmk__str_copy(digest_g); g_string_free(buffer, TRUE); + g_free(digest_g); return digest; } @@ -107,7 +150,7 @@ calculate_xml_digest_v1(xmlNode *input) * \return Newly allocated string containing digest */ char * -pcmk__digest_on_disk_cib(xmlNode *input) +pcmk__digest_on_disk_cib(const xmlNode *input) { /* Always use the v1 format for on-disk digests. * * Switching to v2 affects even full-restart upgrades, so it would be a @@ -122,25 +165,29 @@ pcmk__digest_on_disk_cib(xmlNode *input) * \internal * \brief Calculate and return digest of an operation XML element * - * The digest is invariant to changes in the order of XML attributes, provided - * that \p input has no children. + * The digest is invariant to changes in the order of XML attributes. * - * \param[in] input Root of XML to digest + * \param[in] input Root of XML to digest (must have no children) * * \return Newly allocated string containing digest */ char * -pcmk__digest_operation(xmlNode *input) +pcmk__digest_operation(const xmlNode *input) { /* Switching to v2 digests would likely cause restarts during rolling * upgrades. * * @TODO Confirm this. Switch to v2 if safe, or drop this TODO otherwise. */ - xmlNode *sorted = pcmk__xml_copy(NULL, input); char *digest = NULL; + xmlNode *sorted = NULL; + + pcmk__assert(input->children == NULL); + sorted = pcmk__xe_create(NULL, (const char *) input->name); + pcmk__xe_copy_attrs(sorted, input, pcmk__xaf_none); pcmk__xe_sort_attrs(sorted); + digest = calculate_xml_digest_v1(sorted); pcmk__xml_free(sorted); @@ -157,33 +204,40 @@ pcmk__digest_operation(xmlNode *input) * \return Newly allocated string containing digest */ char * -pcmk__digest_xml(xmlNode *xml, bool filter) +pcmk__digest_xml(const xmlNode *xml, bool filter) { /* @TODO Filtering accounts for significant CPU usage. Consider removing if * possible. */ - char *digest = NULL; GString *buf = g_string_sized_new(1024); + gchar *digest_g = NULL; + char *digest = NULL; pcmk__xml_string(xml, (filter? pcmk__xml_fmt_filtered : 0), buf, 0); - digest = crm_md5sum(buf->str); + digest_g = pcmk__md5sum(buf->str); + if (digest_g == NULL) { + goto done; + } + + digest = pcmk__str_copy(digest_g); pcmk__if_tracing( { - char *trace_file = crm_strdup_printf("%s/digest-%s", - pcmk__get_tmpdir(), digest); - - crm_trace("Saving %s.%s.%s to %s", - crm_element_value(xml, PCMK_XA_ADMIN_EPOCH), - crm_element_value(xml, PCMK_XA_EPOCH), - crm_element_value(xml, PCMK_XA_NUM_UPDATES), - trace_file); - save_xml_to_file(xml, "digest input", trace_file); + char *trace_file = pcmk__assert_asprintf("digest-%s", digest); + + pcmk__trace("Saving %s.%s.%s to %s", + pcmk__xe_get(xml, PCMK_XA_ADMIN_EPOCH), + pcmk__xe_get(xml, PCMK_XA_EPOCH), + pcmk__xe_get(xml, PCMK_XA_NUM_UPDATES), trace_file); + pcmk__xml_write_temp_file(xml, "digest input", trace_file); free(trace_file); }, {} ); + +done: g_string_free(buf, TRUE); + g_free(digest_g); return digest; } @@ -197,7 +251,7 @@ pcmk__digest_xml(xmlNode *xml, bool filter) * \return true if digests match, false on mismatch or error */ bool -pcmk__verify_digest(xmlNode *input, const char *expected) +pcmk__verify_digest(const xmlNode *input, const char *expected) { char *calculated = NULL; bool passed; @@ -211,10 +265,10 @@ pcmk__verify_digest(xmlNode *input, const char *expected) } passed = pcmk__str_eq(expected, calculated, pcmk__str_casei); if (passed) { - crm_trace("Digest comparison passed: %s", calculated); + pcmk__trace("Digest comparison passed: %s", calculated); } else { - crm_err("Digest comparison failed: expected %s, calculated %s", - expected, calculated); + pcmk__err("Digest comparison failed: expected %s, calculated %s", + expected, calculated); } free(calculated); return passed; @@ -247,30 +301,6 @@ pcmk__xa_filterable(const char *name) return false; } -char * -crm_md5sum(const char *buffer) -{ - char *digest = NULL; - gchar *raw_digest = NULL; - - if (buffer == NULL) { - return NULL; - } - - raw_digest = g_compute_checksum_for_string(G_CHECKSUM_MD5, buffer, -1); - - if (raw_digest == NULL) { - crm_err("Failed to calculate hash"); - return NULL; - } - - digest = pcmk__str_copy(raw_digest); - g_free(raw_digest); - - crm_trace("Digest %s.", digest); - return digest; -} - // Return true if a is an attribute that should be filtered static bool should_filter_for_digest(xmlAttrPtr a, void *user_data) @@ -310,14 +340,12 @@ pcmk__filter_op_for_digest(xmlNode *param_set) * removing meta-attributes */ key = crm_meta_name(PCMK_META_INTERVAL); - if (crm_element_value_ms(param_set, key, &interval_ms) != pcmk_ok) { - interval_ms = 0; - } + pcmk__xe_get_guint(param_set, key, &interval_ms); free(key); key = NULL; if (interval_ms != 0) { key = crm_meta_name(PCMK_META_TIMEOUT); - timeout = crm_element_value_copy(param_set, key); + timeout = pcmk__xe_get_copy(param_set, key); } // Remove all CRM_meta_* attributes and certain other attributes @@ -326,7 +354,7 @@ pcmk__filter_op_for_digest(xmlNode *param_set) // Add timeout back for recurring operation digests if (timeout != NULL) { - crm_xml_add(param_set, key, timeout); + pcmk__xe_set(param_set, key, timeout); } free(timeout); free(key); @@ -335,6 +363,7 @@ pcmk__filter_op_for_digest(xmlNode *param_set) // Deprecated functions kept only for backward API compatibility // LCOV_EXCL_START +#include // crm_md5sum() #include #include @@ -358,7 +387,7 @@ char * calculate_xml_versioned_digest(xmlNode *input, gboolean sort, gboolean do_filter, const char *version) { - if ((version == NULL) || (compare_version("3.0.5", version) > 0)) { + if ((version == NULL) || (pcmk__compare_versions("3.0.5", version) > 0)) { xmlNode *sorted = NULL; char *digest = NULL; @@ -368,17 +397,41 @@ calculate_xml_versioned_digest(xmlNode *input, gboolean sort, input = sorted; } - crm_trace("Using v1 digest algorithm for %s", - pcmk__s(version, "unknown feature set")); + pcmk__trace("Using v1 digest algorithm for %s", + pcmk__s(version, "unknown feature set")); digest = calculate_xml_digest_v1(input); pcmk__xml_free(sorted); return digest; } - crm_trace("Using v2 digest algorithm for %s", version); + pcmk__trace("Using v2 digest algorithm for %s", version); return pcmk__digest_xml(input, do_filter); } +char * +crm_md5sum(const char *buffer) +{ + char *digest = NULL; + gchar *raw_digest = NULL; + + if (buffer == NULL) { + return NULL; + } + + raw_digest = g_compute_checksum_for_string(G_CHECKSUM_MD5, buffer, -1); + + if (raw_digest == NULL) { + pcmk__err("Failed to calculate hash"); + return NULL; + } + + digest = pcmk__str_copy(raw_digest); + g_free(raw_digest); + + pcmk__trace("Digest %s.", digest); + return digest; +} + // LCOV_EXCL_STOP // End deprecated API diff --git a/lib/common/fuzzers/strings_fuzzer.c b/lib/common/fuzzers/strings_fuzzer.c index f8dfc8e39fa..d652df60b59 100644 --- a/lib/common/fuzzers/strings_fuzzer.c +++ b/lib/common/fuzzers/strings_fuzzer.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -22,6 +22,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char *ns = NULL; guint res = 0U; + long long msec = 0LL; if (size < 10) { return -1; // Do not add input to testing corpus @@ -33,7 +34,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) pcmk__numeric_strcasecmp(ns, ns); pcmk__trim(ns); pcmk_parse_interval_spec(ns, &res); - crm_get_msec(ns); + pcmk__parse_ms(ns, &msec); free(ns); return 0; diff --git a/lib/common/health.c b/lib/common/health.c index 97e4118fd11..fa98b0174fb 100644 --- a/lib/common/health.c +++ b/lib/common/health.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,7 @@ #include // pcmk_scheduler_t #include // pcmk_scheduler_t private data +#include // pcmk_parse_score(), etc. /*! * \internal @@ -90,8 +91,8 @@ pcmk__health_score(const char *option, const pcmk_scheduler_t *scheduler) value = pcmk__cluster_option(scheduler->priv->options, option); rc = pcmk_parse_score(value, &score, 0); if (rc != pcmk_rc_ok) { - crm_warn("Using 0 for %s because '%s' is invalid: %s", - option, value, pcmk_rc_str(rc)); + pcmk__warn("Using 0 for %s because '%s' is invalid: %s", + option, value, pcmk_rc_str(rc)); } return score; } diff --git a/lib/common/io.c b/lib/common/io.c index 2d8e0a8cfeb..77129cbfbea 100644 --- a/lib/common/io.c +++ b/lib/common/io.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -116,8 +116,8 @@ pcmk__series_filename(const char *directory, const char *series, unsigned int sequence, bool bzip) { pcmk__assert((directory != NULL) && (series != NULL)); - return crm_strdup_printf("%s/%s-%u.%s", directory, series, sequence, - (bzip? "bz2" : "raw")); + return pcmk__assert_asprintf("%s/%s-%u.%s", directory, series, sequence, + (bzip? "bz2" : "raw")); } /*! @@ -142,26 +142,26 @@ pcmk__read_series_sequence(const char *directory, const char *series, return EINVAL; } - series_file = crm_strdup_printf("%s/%s.last", directory, series); + series_file = pcmk__assert_asprintf("%s/%s.last", directory, series); fp = fopen(series_file, "r"); if (fp == NULL) { rc = errno; - crm_debug("Could not open series file %s: %s", - series_file, strerror(rc)); + pcmk__debug("Could not open series file %s: %s", series_file, + strerror(rc)); free(series_file); return rc; } errno = 0; if (fscanf(fp, "%u", seq) != 1) { rc = (errno == 0)? ENODATA : errno; - crm_debug("Could not read sequence number from series file %s: %s", - series_file, pcmk_rc_str(rc)); + pcmk__debug("Could not read sequence number from series file %s: %s", + series_file, pcmk_rc_str(rc)); fclose(fp); return rc; } fclose(fp); - crm_trace("Found last sequence number %u in series file %s", - *seq, series_file); + pcmk__trace("Found last sequence number %u in series file %s", *seq, + series_file); free(series_file); return pcmk_rc_ok; } @@ -195,7 +195,7 @@ pcmk__write_series_sequence(const char *directory, const char *series, sequence = 0; } - series_file = crm_strdup_printf("%s/%s.last", directory, series); + series_file = pcmk__assert_asprintf("%s/%s.last", directory, series); file_strm = fopen(series_file, "w"); if (file_strm != NULL) { rc = fprintf(file_strm, "%u", sequence); @@ -204,7 +204,7 @@ pcmk__write_series_sequence(const char *directory, const char *series, } } else { - crm_err("Cannot open series file %s for writing", series_file); + pcmk__err("Cannot open series file %s for writing", series_file); } if (file_strm != NULL) { @@ -212,7 +212,7 @@ pcmk__write_series_sequence(const char *directory, const char *series, fclose(file_strm); } - crm_trace("Wrote %d to %s", sequence, series_file); + pcmk__trace("Wrote %d to %s", sequence, series_file); free(series_file); } @@ -238,7 +238,7 @@ pcmk__chown_series_sequence(const char *directory, const char *series, if ((directory == NULL) || (series == NULL)) { return EINVAL; } - series_file = crm_strdup_printf("%s/%s.last", directory, series); + series_file = pcmk__assert_asprintf("%s/%s.last", directory, series); if (chown(series_file, uid, gid) < 0) { rc = errno; } @@ -249,26 +249,26 @@ pcmk__chown_series_sequence(const char *directory, const char *series, static bool pcmk__daemon_user_can_write(const char *target_name, struct stat *target_stat) { - struct passwd *sys_user = NULL; + uid_t daemon_uid = 0; + int rc = pcmk__daemon_user(&daemon_uid, NULL); - errno = 0; - sys_user = getpwnam(CRM_DAEMON_USER); - if (sys_user == NULL) { - crm_notice("Could not find user %s: %s", - CRM_DAEMON_USER, pcmk_rc_str(errno)); + if (rc != pcmk_rc_ok) { + pcmk__notice("Could not find user '" CRM_DAEMON_USER "': %s", + pcmk_rc_str(rc)); return FALSE; } - if (target_stat->st_uid != sys_user->pw_uid) { - crm_notice("%s is not owned by user %s " QB_XS " uid %d != %d", - target_name, CRM_DAEMON_USER, sys_user->pw_uid, - target_stat->st_uid); + if (target_stat->st_uid != daemon_uid) { + pcmk__notice("%s is not owned by user '" CRM_DAEMON_USER "' " + QB_XS " uid %lld != %lld", + target_name, (long long) daemon_uid, + (long long) target_stat->st_uid); return FALSE; } if ((target_stat->st_mode & (S_IRUSR | S_IWUSR)) == 0) { - crm_notice("%s is not readable and writable by user %s " - QB_XS " st_mode=0%lo", - target_name, CRM_DAEMON_USER, - (unsigned long) target_stat->st_mode); + pcmk__notice("%s is not readable and writable by user %s " + QB_XS " st_mode=0%lo", + target_name, CRM_DAEMON_USER, + (unsigned long) target_stat->st_mode); return FALSE; } return TRUE; @@ -277,28 +277,28 @@ pcmk__daemon_user_can_write(const char *target_name, struct stat *target_stat) static bool pcmk__daemon_group_can_write(const char *target_name, struct stat *target_stat) { - struct group *sys_grp = NULL; + gid_t daemon_gid = 0; + int rc = pcmk__daemon_user(NULL, &daemon_gid); - errno = 0; - sys_grp = getgrnam(CRM_DAEMON_GROUP); - if (sys_grp == NULL) { - crm_notice("Could not find group %s: %s", - CRM_DAEMON_GROUP, pcmk_rc_str(errno)); + if (rc != pcmk_rc_ok) { + pcmk__notice("Could not find group '" CRM_DAEMON_GROUP "': %s", + pcmk_rc_str(rc)); return FALSE; } - if (target_stat->st_gid != sys_grp->gr_gid) { - crm_notice("%s is not owned by group %s " QB_XS " uid %d != %d", - target_name, CRM_DAEMON_GROUP, - sys_grp->gr_gid, target_stat->st_gid); + if (target_stat->st_gid != daemon_gid) { + pcmk__notice("%s is not owned by group '" CRM_DAEMON_GROUP "' " + QB_XS " gid %lld != %lld", + target_name, (long long) daemon_gid, + (long long) target_stat->st_gid); return FALSE; } if ((target_stat->st_mode & (S_IRGRP | S_IWGRP)) == 0) { - crm_notice("%s is not readable and writable by group %s " - QB_XS " st_mode=0%lo", - target_name, CRM_DAEMON_GROUP, - (unsigned long) target_stat->st_mode); + pcmk__notice("%s is not readable and writable by group %s " + QB_XS " st_mode=0%lo", + target_name, CRM_DAEMON_GROUP, + (unsigned long) target_stat->st_mode); return FALSE; } return TRUE; @@ -331,19 +331,19 @@ pcmk__daemon_can_write(const char *dir, const char *file) // If file is given, check whether it exists as a regular file if (file != NULL) { - full_file = crm_strdup_printf("%s/%s", dir, file); + full_file = pcmk__assert_asprintf("%s/%s", dir, file); target = full_file; s_res = stat(full_file, &buf); if (s_res < 0) { - crm_notice("%s not found: %s", target, pcmk_rc_str(errno)); + pcmk__notice("%s not found: %s", target, pcmk_rc_str(errno)); free(full_file); full_file = NULL; target = NULL; } else if (S_ISREG(buf.st_mode) == FALSE) { - crm_err("%s must be a regular file " QB_XS " st_mode=0%lo", - target, (unsigned long) buf.st_mode); + pcmk__err("%s must be a regular file " QB_XS " st_mode=0%lo", + target, (unsigned long) buf.st_mode); free(full_file); return false; } @@ -354,12 +354,12 @@ pcmk__daemon_can_write(const char *dir, const char *file) target = dir; s_res = stat(dir, &buf); if (s_res < 0) { - crm_err("%s not found: %s", dir, pcmk_rc_str(errno)); + pcmk__err("%s not found: %s", dir, pcmk_rc_str(errno)); return false; } else if (S_ISDIR(buf.st_mode) == FALSE) { - crm_err("%s must be a directory " QB_XS " st_mode=0%lo", - dir, (unsigned long) buf.st_mode); + pcmk__err("%s must be a directory " QB_XS " st_mode=0%lo", + dir, (unsigned long) buf.st_mode); return false; } } @@ -367,10 +367,10 @@ pcmk__daemon_can_write(const char *dir, const char *file) if (!pcmk__daemon_user_can_write(target, &buf) && !pcmk__daemon_group_can_write(target, &buf)) { - crm_err("%s must be owned and writable by either user %s or group %s " - QB_XS " st_mode=0%lo", - target, CRM_DAEMON_USER, CRM_DAEMON_GROUP, - (unsigned long) buf.st_mode); + pcmk__err("%s must be owned and writable by either user " + CRM_DAEMON_USER " or group " CRM_DAEMON_GROUP " " + QB_XS " st_mode=0%lo", + target, (unsigned long) buf.st_mode); free(full_file); return false; } @@ -629,5 +629,5 @@ pcmk__full_path(const char *filename, const char *dirname) return pcmk__str_copy(filename); } pcmk__assert(dirname != NULL); - return crm_strdup_printf("%s/%s", dirname, filename); + return pcmk__assert_asprintf("%s/%s", dirname, filename); } diff --git a/lib/common/ipc_attrd.c b/lib/common/ipc_attrd.c index 394bf75c1d2..3bbe96c967e 100644 --- a/lib/common/ipc_attrd.c +++ b/lib/common/ipc_attrd.c @@ -26,7 +26,7 @@ set_pairs_data(pcmk__attrd_api_reply_t *data, xmlNode *msg_data) const char *name = NULL; pcmk__attrd_query_pair_t *pair; - name = crm_element_value(msg_data, PCMK__XA_ATTR_NAME); + name = pcmk__xe_get(msg_data, PCMK__XA_ATTR_NAME); for (xmlNode *node = pcmk__xe_first_child(msg_data, PCMK_XE_NODE, NULL, NULL); @@ -34,9 +34,9 @@ set_pairs_data(pcmk__attrd_api_reply_t *data, xmlNode *msg_data) pair = pcmk__assert_alloc(1, sizeof(pcmk__attrd_query_pair_t)); - pair->node = crm_element_value(node, PCMK__XA_ATTR_HOST); + pair->node = pcmk__xe_get(node, PCMK__XA_ATTR_HOST); pair->name = name; - pair->value = crm_element_value(node, PCMK__XA_ATTR_VALUE); + pair->value = pcmk__xe_get(node, PCMK__XA_ATTR_VALUE); data->data.pairs = g_list_prepend(data->data.pairs, pair); } } @@ -44,7 +44,7 @@ set_pairs_data(pcmk__attrd_api_reply_t *data, xmlNode *msg_data) static bool reply_expected(pcmk_ipc_api_t *api, const xmlNode *request) { - const char *command = crm_element_value(request, PCMK_XA_TASK); + const char *command = pcmk__xe_get(request, PCMK_XA_TASK); return pcmk__str_any_of(command, PCMK__ATTRD_CMD_CLEAR_FAILURE, @@ -71,17 +71,17 @@ dispatch(pcmk_ipc_api_t *api, xmlNode *reply) } /* Do some basic validation of the reply */ - value = crm_element_value(reply, PCMK__XA_T); + value = pcmk__xe_get(reply, PCMK__XA_T); if (pcmk__str_empty(value) || !pcmk__str_eq(value, PCMK__VALUE_ATTRD, pcmk__str_none)) { - crm_info("Unrecognizable message from attribute manager: " - "message type '%s' not '" PCMK__VALUE_ATTRD "'", - pcmk__s(value, "")); + pcmk__info("Unrecognizable message from attribute manager: message " + "type '%s' not '" PCMK__VALUE_ATTRD "'", + pcmk__s(value, "")); status = CRM_EX_PROTOCOL; goto done; } - value = crm_element_value(reply, PCMK__XA_SUBT); + value = pcmk__xe_get(reply, PCMK__XA_SUBT); /* Only the query command gets a reply for now. NULL counts as query for * backward compatibility with attribute managers <2.1.3 that didn't set it. @@ -95,8 +95,9 @@ dispatch(pcmk_ipc_api_t *api, xmlNode *reply) set_pairs_data(&reply_data, reply); } else { - crm_info("Unrecognizable message from attribute manager: " - "message subtype '%s' unknown", pcmk__s(value, "")); + pcmk__info("Unrecognizable message from attribute manager: message " + "subtype '%s' unknown", + pcmk__s(value, "")); status = CRM_EX_PROTOCOL; goto done; } @@ -140,9 +141,9 @@ create_attrd_op(const char *user_name) { xmlNode *attrd_op = pcmk__xe_create(NULL, __func__); - crm_xml_add(attrd_op, PCMK__XA_T, PCMK__VALUE_ATTRD); - crm_xml_add(attrd_op, PCMK__XA_SRC, pcmk__s(crm_system_name, "unknown")); - crm_xml_add(attrd_op, PCMK__XA_ATTR_USER, user_name); + pcmk__xe_set(attrd_op, PCMK__XA_T, PCMK__VALUE_ATTRD); + pcmk__xe_set(attrd_op, PCMK__XA_SRC, pcmk__s(crm_system_name, "unknown")); + pcmk__xe_set(attrd_op, PCMK__XA_ATTR_USER, user_name); return attrd_op; } @@ -198,17 +199,18 @@ pcmk__attrd_api_clear_failures(pcmk_ipc_api_t *api, const char *node, interval_desc = "all"; op_desc = "operations"; } - crm_debug("Asking %s to clear failure of %s %s for %s on %s", - pcmk_ipc_name(api, true), interval_desc, op_desc, - pcmk__s(resource, "all resources"), pcmk__s(node, "all nodes")); - - crm_xml_add(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_CLEAR_FAILURE); - crm_xml_add(request, PCMK__XA_ATTR_HOST, node); - crm_xml_add(request, PCMK__XA_ATTR_RESOURCE, resource); - crm_xml_add(request, PCMK__XA_ATTR_CLEAR_OPERATION, operation); - crm_xml_add(request, PCMK__XA_ATTR_CLEAR_INTERVAL, interval_spec); - crm_xml_add_int(request, PCMK__XA_ATTR_IS_REMOTE, - pcmk_is_set(options, pcmk__node_attr_remote)); + pcmk__debug("Asking %s to clear failure of %s %s for %s on %s", + pcmk_ipc_name(api, true), interval_desc, op_desc, + pcmk__s(resource, "all resources"), + pcmk__s(node, "all nodes")); + + pcmk__xe_set(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_CLEAR_FAILURE); + pcmk__xe_set(request, PCMK__XA_ATTR_HOST, node); + pcmk__xe_set(request, PCMK__XA_ATTR_RESOURCE, resource); + pcmk__xe_set(request, PCMK__XA_ATTR_CLEAR_OPERATION, operation); + pcmk__xe_set(request, PCMK__XA_ATTR_CLEAR_INTERVAL, interval_spec); + pcmk__xe_set_int(request, PCMK__XA_ATTR_IS_REMOTE, + pcmk__is_set(options, pcmk__node_attr_remote)); rc = connect_and_send_attrd_request(api, request); @@ -250,16 +252,16 @@ pcmk__attrd_api_purge(pcmk_ipc_api_t *api, const char *node, bool reap) node = target; } - crm_debug("Asking %s to purge transient attributes%s for %s", - pcmk_ipc_name(api, true), - (reap? " and node cache entries" : ""), - pcmk__s(node, "local node")); + pcmk__debug("Asking %s to purge transient attributes%s for %s", + pcmk_ipc_name(api, true), + (reap? " and node cache entries" : ""), + pcmk__s(node, "local node")); request = create_attrd_op(NULL); - crm_xml_add(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_PEER_REMOVE); + pcmk__xe_set(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_PEER_REMOVE); pcmk__xe_set_bool_attr(request, PCMK__XA_REAP, reap); - crm_xml_add(request, PCMK__XA_ATTR_HOST, node); + pcmk__xe_set(request, PCMK__XA_ATTR_HOST, node); rc = connect_and_send_attrd_request(api, request); @@ -279,7 +281,7 @@ pcmk__attrd_api_query(pcmk_ipc_api_t *api, const char *node, const char *name, return EINVAL; } - if (pcmk_is_set(options, pcmk__node_attr_query_all)) { + if (pcmk__is_set(options, pcmk__node_attr_query_all)) { node = NULL; } else { target = pcmk__node_attr_target(node); @@ -291,15 +293,14 @@ pcmk__attrd_api_query(pcmk_ipc_api_t *api, const char *node, const char *name, } } - crm_debug("Querying %s for value of '%s'%s%s", - pcmk_ipc_name(api, true), name, - ((node == NULL)? "" : " on "), pcmk__s(node, "")); + pcmk__debug("Querying %s for value of '%s'%s%s", pcmk_ipc_name(api, true), + name, ((node != NULL)? " on " : ""), pcmk__s(node, "")); request = create_attrd_op(NULL); - crm_xml_add(request, PCMK__XA_ATTR_NAME, name); - crm_xml_add(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_QUERY); - crm_xml_add(request, PCMK__XA_ATTR_HOST, node); + pcmk__xe_set(request, PCMK__XA_ATTR_NAME, name); + pcmk__xe_set(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_QUERY); + pcmk__xe_set(request, PCMK__XA_ATTR_HOST, node); rc = connect_and_send_attrd_request(api, request); pcmk__xml_free(request); @@ -317,13 +318,13 @@ pcmk__attrd_api_refresh(pcmk_ipc_api_t *api, const char *node) node = target; } - crm_debug("Asking %s to write all transient attributes for %s to CIB", - pcmk_ipc_name(api, true), pcmk__s(node, "local node")); + pcmk__debug("Asking %s to write all transient attributes for %s to CIB", + pcmk_ipc_name(api, true), pcmk__s(node, "local node")); request = create_attrd_op(NULL); - crm_xml_add(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_REFRESH); - crm_xml_add(request, PCMK__XA_ATTR_HOST, node); + pcmk__xe_set(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_REFRESH); + pcmk__xe_set(request, PCMK__XA_ATTR_HOST, node); rc = connect_and_send_attrd_request(api, request); @@ -334,12 +335,16 @@ pcmk__attrd_api_refresh(pcmk_ipc_api_t *api, const char *node) static void add_op_attr(xmlNode *op, uint32_t options) { - if (pcmk_all_flags_set(options, pcmk__node_attr_value | pcmk__node_attr_delay)) { - crm_xml_add(op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE_BOTH); - } else if (pcmk_is_set(options, pcmk__node_attr_value)) { - crm_xml_add(op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); - } else if (pcmk_is_set(options, pcmk__node_attr_delay)) { - crm_xml_add(op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE_DELAY); + if (pcmk__all_flags_set(options, + pcmk__node_attr_value|pcmk__node_attr_delay)) { + + pcmk__xe_set(op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE_BOTH); + + } else if (pcmk__is_set(options, pcmk__node_attr_value)) { + pcmk__xe_set(op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE); + + } else if (pcmk__is_set(options, pcmk__node_attr_delay)) { + pcmk__xe_set(op, PCMK_XA_TASK, PCMK__ATTRD_CMD_UPDATE_DELAY); } } @@ -347,33 +352,33 @@ static void populate_update_op(xmlNode *op, const char *node, const char *name, const char *value, const char *dampen, const char *set, uint32_t options) { - if (pcmk_is_set(options, pcmk__node_attr_pattern)) { - crm_xml_add(op, PCMK__XA_ATTR_REGEX, name); + if (pcmk__is_set(options, pcmk__node_attr_pattern)) { + pcmk__xe_set(op, PCMK__XA_ATTR_REGEX, name); } else { - crm_xml_add(op, PCMK__XA_ATTR_NAME, name); + pcmk__xe_set(op, PCMK__XA_ATTR_NAME, name); } - if (pcmk_is_set(options, pcmk__node_attr_utilization)) { - crm_xml_add(op, PCMK__XA_ATTR_SET_TYPE, PCMK_XE_UTILIZATION); + if (pcmk__is_set(options, pcmk__node_attr_utilization)) { + pcmk__xe_set(op, PCMK__XA_ATTR_SET_TYPE, PCMK_XE_UTILIZATION); } else { - crm_xml_add(op, PCMK__XA_ATTR_SET_TYPE, PCMK_XE_INSTANCE_ATTRIBUTES); + pcmk__xe_set(op, PCMK__XA_ATTR_SET_TYPE, PCMK_XE_INSTANCE_ATTRIBUTES); } add_op_attr(op, options); - crm_xml_add(op, PCMK__XA_ATTR_VALUE, value); - crm_xml_add(op, PCMK__XA_ATTR_DAMPENING, dampen); - crm_xml_add(op, PCMK__XA_ATTR_HOST, node); - crm_xml_add(op, PCMK__XA_ATTR_SET, set); - crm_xml_add_int(op, PCMK__XA_ATTR_IS_REMOTE, - pcmk_is_set(options, pcmk__node_attr_remote)); - crm_xml_add_int(op, PCMK__XA_ATTR_IS_PRIVATE, - pcmk_is_set(options, pcmk__node_attr_private)); - - if (pcmk_is_set(options, pcmk__node_attr_sync_local)) { - crm_xml_add(op, PCMK__XA_ATTR_SYNC_POINT, PCMK__VALUE_LOCAL); - } else if (pcmk_is_set(options, pcmk__node_attr_sync_cluster)) { - crm_xml_add(op, PCMK__XA_ATTR_SYNC_POINT, PCMK__VALUE_CLUSTER); + pcmk__xe_set(op, PCMK__XA_ATTR_VALUE, value); + pcmk__xe_set(op, PCMK__XA_ATTR_DAMPENING, dampen); + pcmk__xe_set(op, PCMK__XA_ATTR_HOST, node); + pcmk__xe_set(op, PCMK__XA_ATTR_SET, set); + pcmk__xe_set_int(op, PCMK__XA_ATTR_IS_REMOTE, + pcmk__is_set(options, pcmk__node_attr_remote)); + pcmk__xe_set_int(op, PCMK__XA_ATTR_IS_PRIVATE, + pcmk__is_set(options, pcmk__node_attr_private)); + + if (pcmk__is_set(options, pcmk__node_attr_sync_local)) { + pcmk__xe_set(op, PCMK__XA_ATTR_SYNC_POINT, PCMK__VALUE_LOCAL); + } else if (pcmk__is_set(options, pcmk__node_attr_sync_cluster)) { + pcmk__xe_set(op, PCMK__XA_ATTR_SYNC_POINT, PCMK__VALUE_CLUSTER); } } @@ -396,9 +401,9 @@ pcmk__attrd_api_update(pcmk_ipc_api_t *api, const char *node, const char *name, node = target; } - crm_debug("Asking %s to update '%s' to '%s' for %s", - pcmk_ipc_name(api, true), name, pcmk__s(value, "(null)"), - pcmk__s(node, "local node")); + pcmk__debug("Asking %s to update '%s' to '%s' for %s", + pcmk_ipc_name(api, true), name, pcmk__s(value, "(null)"), + pcmk__s(node, "local node")); request = create_attrd_op(user_name); populate_update_op(request, node, name, value, dampen, set, options); diff --git a/lib/common/ipc_client.c b/lib/common/ipc_client.c index 63483e7b2da..dcfe8f18afd 100644 --- a/lib/common/ipc_client.c +++ b/lib/common/ipc_client.c @@ -120,7 +120,7 @@ pcmk_new_ipc_api(pcmk_ipc_api_t **api, enum pcmk_ipc_server server) return ENOMEM; } } - crm_trace("Created %s API IPC object", pcmk_ipc_name(*api, true)); + pcmk__trace("Created %s API IPC object", pcmk_ipc_name(*api, true)); return pcmk_rc_ok; } @@ -168,7 +168,7 @@ ipc_post_disconnect(gpointer user_data) { pcmk_ipc_api_t *api = user_data; - crm_info("Disconnected from %s", pcmk_ipc_name(api, true)); + pcmk__info("Disconnected from %s", pcmk_ipc_name(api, true)); // Perform any daemon-specific handling needed if ((api->cmds != NULL) && (api->cmds->post_disconnect != NULL)) { @@ -192,7 +192,7 @@ ipc_post_disconnect(gpointer user_data) * or api->cmds because this function needed them. Do that now. */ free_daemon_specific_data(api); - crm_trace("Freeing IPC API object after disconnect"); + pcmk__trace("Freeing IPC API object after disconnect"); free(api); } } @@ -210,7 +210,7 @@ pcmk_free_ipc_api(pcmk_ipc_api_t *api) if (api == NULL) { return; } - crm_debug("Releasing %s IPC API", pcmk_ipc_name(api, true)); + pcmk__debug("Releasing %s IPC API", pcmk_ipc_name(api, true)); if (api->ipc != NULL) { if (api->mainloop_io != NULL) { @@ -229,7 +229,7 @@ pcmk_free_ipc_api(pcmk_ipc_api_t *api) } if (!free_on_disconnect) { free_daemon_specific_data(api); - crm_trace("Freeing IPC API object"); + pcmk__trace("Freeing IPC API object"); free(api); } } @@ -293,7 +293,7 @@ pcmk_ipc_is_connected(pcmk_ipc_api_t *api) static bool call_api_dispatch(pcmk_ipc_api_t *api, xmlNode *message) { - crm_log_xml_trace(message, "ipc-received"); + pcmk__log_xml_trace(message, "ipc-received"); if ((api->cmds != NULL) && (api->cmds->dispatch != NULL)) { return api->cmds->dispatch(api, message); } @@ -323,15 +323,15 @@ dispatch_ipc_data(const char *buffer, pcmk_ipc_api_t *api) xmlNode *msg; if (buffer == NULL) { - crm_warn("Empty message received from %s IPC", - pcmk_ipc_name(api, true)); + pcmk__warn("Empty message received from %s IPC", + pcmk_ipc_name(api, true)); return ENOMSG; } msg = pcmk__xml_parse(buffer); if (msg == NULL) { - crm_warn("Malformed message received from %s IPC", - pcmk_ipc_name(api, true)); + pcmk__warn("Malformed message received from %s IPC", + pcmk_ipc_name(api, true)); return EPROTO; } @@ -397,8 +397,8 @@ pcmk_poll_ipc(const pcmk_ipc_api_t *api, int timeout_ms) rc = pcmk__ipc_fd(api->ipc, &(pollfd.fd)); if (rc != pcmk_rc_ok) { - crm_debug("Could not obtain file descriptor for %s IPC: %s", - pcmk_ipc_name(api, true), pcmk_rc_str(rc)); + pcmk__debug("Could not obtain file descriptor for %s IPC: %s", + pcmk_ipc_name(api, true), pcmk_rc_str(rc)); return rc; } @@ -454,8 +454,8 @@ connect_with_main_loop(pcmk_ipc_api_t *api) if (rc != pcmk_rc_ok) { return rc; } - crm_debug("Connected to %s IPC (attached to main loop)", - pcmk_ipc_name(api, true)); + pcmk__debug("Connected to %s IPC (attached to main loop)", + pcmk_ipc_name(api, true)); /* After this point, api->mainloop_io owns api->ipc, so api->ipc * should not be explicitly freed. */ @@ -471,8 +471,8 @@ connect_without_main_loop(pcmk_ipc_api_t *api) if (rc != pcmk_rc_ok) { crm_ipc_close(api->ipc); } else { - crm_debug("Connected to %s IPC (without main loop)", - pcmk_ipc_name(api, true)); + pcmk__debug("Connected to %s IPC (without main loop)", + pcmk_ipc_name(api, true)); } return rc; } @@ -505,14 +505,14 @@ pcmk__connect_ipc(pcmk_ipc_api_t *api, enum pcmk_ipc_dispatch dispatch_type, } if (crm_ipc_connected(api->ipc)) { - crm_trace("Already connected to %s", pcmk_ipc_name(api, true)); + pcmk__trace("Already connected to %s", pcmk_ipc_name(api, true)); return pcmk_rc_ok; } api->dispatch_type = dispatch_type; - crm_debug("Attempting connection to %s (up to %d time%s)", - pcmk_ipc_name(api, true), attempts, pcmk__plural_s(attempts)); + pcmk__debug("Attempting connection to %s (up to %d time%s)", + pcmk_ipc_name(api, true), attempts, pcmk__plural_s(attempts)); for (int remaining = attempts - 1; remaining >= 0; --remaining) { switch (dispatch_type) { case pcmk_ipc_dispatch_main: @@ -531,9 +531,9 @@ pcmk__connect_ipc(pcmk_ipc_api_t *api, enum pcmk_ipc_dispatch dispatch_type, // Retry after soft error (interrupted by signal, etc.) pcmk__sleep_ms((attempts - remaining) * 500); - crm_debug("Re-attempting connection to %s (%d attempt%s remaining)", - pcmk_ipc_name(api, true), remaining, - pcmk__plural_s(remaining)); + pcmk__debug("Re-attempting connection to %s (%d attempt%s remaining)", + pcmk_ipc_name(api, true), remaining, + pcmk__plural_s(remaining)); } if (rc != pcmk_rc_ok) { @@ -563,8 +563,8 @@ pcmk_connect_ipc(pcmk_ipc_api_t *api, enum pcmk_ipc_dispatch dispatch_type) int rc = pcmk__connect_ipc(api, dispatch_type, 2); if (rc != pcmk_rc_ok) { - crm_err("Connection to %s failed: %s", - pcmk_ipc_name(api, true), pcmk_rc_str(rc)); + pcmk__err("Connection to %s failed: %s", pcmk_ipc_name(api, true), + pcmk_rc_str(rc)); } return rc; } @@ -664,7 +664,7 @@ pcmk__send_ipc_request(pcmk_ipc_api_t *api, const xmlNode *request) if ((api == NULL) || (api->ipc == NULL) || (request == NULL)) { return EINVAL; } - crm_log_xml_trace(request, "ipc-sent"); + pcmk__log_xml_trace(request, "ipc-sent"); // Synchronous dispatch requires waiting for a reply if ((api->dispatch_type == pcmk_ipc_dispatch_sync) @@ -750,13 +750,13 @@ create_purge_node_request(const pcmk_ipc_api_t *api, const char *node_name, switch (api->server) { case pcmk_ipc_attrd: request = pcmk__xe_create(NULL, __func__); - crm_xml_add(request, PCMK__XA_T, PCMK__VALUE_ATTRD); - crm_xml_add(request, PCMK__XA_SRC, crm_system_name); - crm_xml_add(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_PEER_REMOVE); + pcmk__xe_set(request, PCMK__XA_T, PCMK__VALUE_ATTRD); + pcmk__xe_set(request, PCMK__XA_SRC, crm_system_name); + pcmk__xe_set(request, PCMK_XA_TASK, PCMK__ATTRD_CMD_PEER_REMOVE); pcmk__xe_set_bool_attr(request, PCMK__XA_REAP, true); - crm_xml_add(request, PCMK__XA_ATTR_HOST, node_name); + pcmk__xe_set(request, PCMK__XA_ATTR_HOST, node_name); if (nodeid > 0) { - crm_xml_add_int(request, PCMK__XA_ATTR_HOST_ID, nodeid); + pcmk__xe_set_int(request, PCMK__XA_ATTR_HOST_ID, nodeid); } break; @@ -767,9 +767,9 @@ create_purge_node_request(const pcmk_ipc_api_t *api, const char *node_name, pcmk_ipc_name(api, false), CRM_OP_RM_NODE_CACHE, NULL); if (nodeid > 0) { - crm_xml_add_ll(request, PCMK_XA_ID, (long long) nodeid); + pcmk__xe_set_ll(request, PCMK_XA_ID, (long long) nodeid); } - crm_xml_add(request, PCMK_XA_UNAME, node_name); + pcmk__xe_set(request, PCMK_XA_UNAME, node_name); break; case pcmk_ipc_based: @@ -814,8 +814,9 @@ pcmk_ipc_purge_node(pcmk_ipc_api_t *api, const char *node_name, uint32_t nodeid) rc = pcmk__send_ipc_request(api, request); pcmk__xml_free(request); - crm_debug("%s peer cache purge of node %s[%lu]: rc=%d", - pcmk_ipc_name(api, true), node_name, (unsigned long) nodeid, rc); + pcmk__debug("%s peer cache purge of node %s[%" PRIu32 "]: rc=%d", + pcmk_ipc_name(api, true), pcmk__s(node_name, "(unnamed)"), + nodeid, rc); return rc; } @@ -854,22 +855,22 @@ crm_ipc_new(const char *name, size_t max_size) client = calloc(1, sizeof(crm_ipc_t)); if (client == NULL) { - crm_err("Could not create IPC connection: %s", strerror(errno)); + pcmk__err("Could not create IPC connection: %s", strerror(errno)); return NULL; } client->server_name = strdup(name); if (client->server_name == NULL) { - crm_err("Could not create %s IPC connection: %s", - name, strerror(errno)); + pcmk__err("Could not create %s IPC connection: %s", name, + strerror(errno)); free(client); return NULL; } client->buf_size = pcmk__ipc_buffer_size(max_size); client->buffer = malloc(client->buf_size); if (client->buffer == NULL) { - crm_err("Could not create %s IPC connection: %s", - name, strerror(errno)); + pcmk__err("Could not create %s IPC connection: %s", name, + strerror(errno)); free(client->server_name); free(client); return NULL; @@ -919,8 +920,7 @@ pcmk__connect_generic_ipc(crm_ipc_t *ipc) return -rc; } - rc = pcmk_daemon_user(&cl_uid, &cl_gid); - rc = pcmk_legacy2rc(rc); + rc = pcmk__daemon_user(&cl_uid, &cl_gid); if (rc != pcmk_rc_ok) { crm_ipc_close(ipc); return rc; @@ -930,12 +930,13 @@ pcmk__connect_generic_ipc(crm_ipc_t *ipc) &found_pid, &found_uid, &found_gid); if (rc != pcmk_rc_ok) { if (rc == pcmk_rc_ipc_unauthorized) { - crm_info("%s IPC provider authentication failed: process %lld has " - "uid %lld (expected %lld) and gid %lld (expected %lld)", - ipc->server_name, - (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) cl_uid, - (long long) found_gid, (long long) cl_gid); + pcmk__info("%s IPC provider authentication failed: process %lld " + "has uid %lld (expected %lld) and gid %lld (expected " + "%lld)", + ipc->server_name, + (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) cl_uid, + (long long) found_gid, (long long) cl_gid); } crm_ipc_close(ipc); return rc; @@ -974,8 +975,8 @@ crm_ipc_destroy(crm_ipc_t * client) { if (client) { if (client->ipc && qb_ipcc_is_connected(client->ipc)) { - crm_notice("Destroying active %s IPC connection", - client->server_name); + pcmk__notice("Destroying active %s IPC connection", + client->server_name); /* The next line is basically unsafe * * If this connection was attached to mainloop and mainloop is active, @@ -986,8 +987,8 @@ crm_ipc_destroy(crm_ipc_t * client) */ /* crm_ipc_close(client); */ } else { - crm_trace("Destroying inactive %s IPC connection", - client->server_name); + pcmk__trace("Destroying inactive %s IPC connection", + client->server_name); } free(client->buffer); free(client->server_name); @@ -1023,8 +1024,8 @@ crm_ipc_get_fd(crm_ipc_t * client) int fd = -1; if (pcmk__ipc_fd(client, &fd) != pcmk_rc_ok) { - crm_err("Could not obtain file descriptor for %s IPC", - ((client == NULL)? "unspecified" : client->server_name)); + pcmk__err("Could not obtain file descriptor for %s IPC", + ((client == NULL)? "unspecified" : client->server_name)); errno = EINVAL; return -EINVAL; } @@ -1037,15 +1038,15 @@ crm_ipc_connected(crm_ipc_t * client) bool rc = FALSE; if (client == NULL) { - crm_trace("No client"); + pcmk__trace("No client"); return FALSE; } else if (client->ipc == NULL) { - crm_trace("No connection"); + pcmk__trace("No connection"); return FALSE; } else if (client->pfd.fd < 0) { - crm_trace("Bad descriptor"); + pcmk__trace("Bad descriptor"); return FALSE; } @@ -1092,16 +1093,16 @@ crm_ipc_decompress(crm_ipc_t * client) unsigned int new_buf_size = QB_MAX((sizeof(pcmk__ipc_header_t) + size_u), client->max_buf_size); char *uncompressed = pcmk__assert_alloc(1, new_buf_size); - crm_trace("Decompressing message data %u bytes into %u bytes", - header->size_compressed, size_u); + pcmk__trace("Decompressing message data %u bytes into %u bytes", + header->size_compressed, size_u); rc = BZ2_bzBuffToBuffDecompress(uncompressed + sizeof(pcmk__ipc_header_t), &size_u, client->buffer + sizeof(pcmk__ipc_header_t), header->size_compressed, 1, 0); rc = pcmk__bzlib2rc(rc); if (rc != pcmk_rc_ok) { - crm_err("Decompression failed: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__err("Decompression failed: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); free(uncompressed); return rc; } @@ -1144,14 +1145,14 @@ crm_ipc_read(crm_ipc_t * client) return -EBADMSG; } - crm_trace("Received %s IPC event %d size=%u rc=%d text='%.100s'", - client->server_name, header->qb.id, header->qb.size, - client->msg_size, - client->buffer + sizeof(pcmk__ipc_header_t)); + pcmk__trace("Received %s IPC event %d size=%u rc=%d text='%.100s'", + client->server_name, header->qb.id, header->qb.size, + client->msg_size, + (client->buffer + sizeof(pcmk__ipc_header_t))); } else { - crm_trace("No message received from %s IPC: %s", - client->server_name, pcmk_strerror(client->msg_size)); + pcmk__trace("No message received from %s IPC: %s", + client->server_name, pcmk_strerror(client->msg_size)); if (client->msg_size == -EAGAIN) { return -EAGAIN; @@ -1159,7 +1160,7 @@ crm_ipc_read(crm_ipc_t * client) } if (!crm_ipc_connected(client) || client->msg_size == -ENOTCONN) { - crm_err("Connection to %s IPC failed", client->server_name); + pcmk__err("Connection to %s IPC failed", client->server_name); } if (header) { @@ -1213,8 +1214,8 @@ internal_ipc_get_reply(crm_ipc_t *client, int request_id, int ms_timeout, } /* get the reply */ - crm_trace("Expecting reply to %s IPC message %d", client->server_name, - request_id); + pcmk__trace("Expecting reply to %s IPC message %d", client->server_name, + request_id); do { xmlNode *xml = NULL; @@ -1224,8 +1225,9 @@ internal_ipc_get_reply(crm_ipc_t *client, int request_id, int ms_timeout, if (*bytes <= 0) { if (!crm_ipc_connected(client)) { - crm_err("%s IPC provider disconnected while waiting for message %d", - client->server_name, request_id); + pcmk__err("%s IPC provider disconnected while waiting for " + "message %d", + client->server_name, request_id); break; } @@ -1247,27 +1249,29 @@ internal_ipc_get_reply(crm_ipc_t *client, int request_id, int ms_timeout, xml = pcmk__xml_parse(crm_ipc_buffer(client)); if (hdr->qb.id < request_id) { - crm_err("Discarding old reply %d (need %d)", hdr->qb.id, request_id); - crm_log_xml_notice(xml, "OldIpcReply"); + pcmk__err("Discarding old reply %d (need %d)", hdr->qb.id, + request_id); + pcmk__log_xml_notice(xml, "OldIpcReply"); } else if (hdr->qb.id > request_id) { - crm_err("Discarding newer reply %d (need %d)", hdr->qb.id, request_id); - crm_log_xml_notice(xml, "ImpossibleReply"); + pcmk__err("Discarding newer reply %d (need %d)", hdr->qb.id, + request_id); + pcmk__log_xml_notice(xml, "ImpossibleReply"); pcmk__assert(hdr->qb.id <= request_id); } } while (time(NULL) < timeout || (timeout == 0 && *bytes == -EAGAIN)); if (*bytes > 0) { - crm_trace("Received %zd-byte reply %" PRId32 " to %s IPC %d: %.100s", - *bytes, hdr->qb.id, client->server_name, request_id, - crm_ipc_buffer(client)); + pcmk__trace("Received %zd-byte reply %" PRId32 " to %s IPC %d: %.100s", + *bytes, hdr->qb.id, client->server_name, request_id, + crm_ipc_buffer(client)); if (reply != NULL) { *reply = pcmk__xml_parse(crm_ipc_buffer(client)); } } else if (*bytes < 0) { rc = (int) -*bytes; // System errno - crm_trace("No reply to %s IPC %d: %s " QB_XS " rc=%d", - client->server_name, request_id, pcmk_rc_str(rc), rc); + pcmk__trace("No reply to %s IPC %d: %s " QB_XS " rc=%d", + client->server_name, request_id, pcmk_rc_str(rc), rc); } /* If bytes == 0, we'll return that to crm_ipc_send which will interpret * that as pcmk_rc_ok, log that the IPC request failed (since we did not @@ -1305,14 +1309,14 @@ crm_ipc_send(crm_ipc_t *client, const xmlNode *message, pcmk__ipc_header_t *header; if (client == NULL) { - crm_notice("Can't send IPC request without connection (bug?): %.100s", - message); + pcmk__notice("Can't send IPC request without connection (bug?): %.100s", + message); return -ENOTCONN; } else if (!crm_ipc_connected(client)) { /* Don't even bother */ - crm_notice("Can't send %s IPC requests: Connection closed", - client->server_name); + pcmk__notice("Can't send %s IPC requests: Connection closed", + client->server_name); return -ENOTCONN; } @@ -1323,13 +1327,14 @@ crm_ipc_send(crm_ipc_t *client, const xmlNode *message, if (client->need_reply) { qb_rc = qb_ipcc_recv(client->ipc, client->buffer, client->buf_size, ms_timeout); if (qb_rc < 0) { - crm_warn("Sending %s IPC disabled until pending reply received", - client->server_name); + pcmk__warn("Sending %s IPC disabled until pending reply received", + client->server_name); return -EALREADY; } else { - crm_notice("Sending %s IPC re-enabled after pending reply received", - client->server_name); + pcmk__notice("Sending %s IPC re-enabled after pending reply " + "received", + client->server_name); client->need_reply = FALSE; } } @@ -1338,31 +1343,33 @@ crm_ipc_send(crm_ipc_t *client, const xmlNode *message, CRM_LOG_ASSERT(id != 0); /* Crude wrap-around detection */ rc = pcmk__ipc_prepare_iov(id, message, client->max_buf_size, &iov, &bytes); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't prepare %s IPC request: %s " QB_XS " rc=%d", - client->server_name, pcmk_rc_str(rc), rc); + pcmk__warn("Couldn't prepare %s IPC request: %s " QB_XS " rc=%d", + client->server_name, pcmk_rc_str(rc), rc); return pcmk_rc2legacy(rc); } header = iov[0].iov_base; pcmk__set_ipc_flags(header->flags, client->server_name, flags); - if (pcmk_is_set(flags, crm_ipc_proxied)) { + if (pcmk__is_set(flags, crm_ipc_proxied)) { /* Don't look for a synchronous response */ pcmk__clear_ipc_flags(flags, "client", crm_ipc_client_response); } if(header->size_compressed) { if(factor < 10 && (client->max_buf_size / 10) < (bytes / factor)) { - crm_notice("Compressed message exceeds %d0%% of configured IPC " - "limit (%u bytes); consider setting PCMK_ipc_buffer to " - "%u or higher", - factor, client->max_buf_size, 2 * client->max_buf_size); + pcmk__notice("Compressed message exceeds %d0%% of configured IPC " + "limit (%u bytes); consider setting PCMK_ipc_buffer " + "to u or higher", + factor, client->max_buf_size, + (2 * client->max_buf_size)); factor++; } } - crm_trace("Sending %s IPC request %d of %u bytes using %dms timeout", - client->server_name, header->qb.id, header->qb.size, ms_timeout); + pcmk__trace("Sending %s IPC request %d of %u bytes using %dms timeout", + client->server_name, header->qb.id, header->qb.size, + ms_timeout); /* Send the IPC request, respecting any timeout we were passed */ if (ms_timeout > 0) { @@ -1379,9 +1386,9 @@ crm_ipc_send(crm_ipc_t *client, const xmlNode *message, } /* If we should not wait for a response, bail now */ - if (!pcmk_is_set(flags, crm_ipc_client_response)) { - crm_trace("Not waiting for reply to %s IPC request %d", - client->server_name, header->qb.id); + if (!pcmk__is_set(flags, crm_ipc_client_response)) { + pcmk__trace("Not waiting for reply to %s IPC request %d", + client->server_name, header->qb.id); goto send_cleanup; } @@ -1408,19 +1415,20 @@ crm_ipc_send(crm_ipc_t *client, const xmlNode *message, send_cleanup: if (!crm_ipc_connected(client)) { - crm_notice("Couldn't send %s IPC request %d: Connection closed " - QB_XS " rc=%d", client->server_name, header->qb.id, rc); + pcmk__notice("Couldn't send %s IPC request %d: Connection closed " + QB_XS " rc=%d", + client->server_name, header->qb.id, rc); } else if (rc == -ETIMEDOUT) { - crm_warn("%s IPC request %d failed: %s after %dms " QB_XS " rc=%d", - client->server_name, header->qb.id, pcmk_strerror(rc), - ms_timeout, rc); + pcmk__warn("%s IPC request %d failed: %s after %dms " QB_XS " rc=%d", + client->server_name, header->qb.id, pcmk_strerror(rc), + ms_timeout, rc); crm_write_blackbox(0, NULL); } else if (rc <= 0) { - crm_warn("%s IPC request %d failed: %s " QB_XS " rc=%d", - client->server_name, header->qb.id, - ((rc == 0)? "No bytes sent" : pcmk_strerror(rc)), rc); + pcmk__warn("%s IPC request %d failed: %s " QB_XS " rc=%d", + client->server_name, header->qb.id, + ((rc == 0)? "No bytes sent" : pcmk_strerror(rc)), rc); } pcmk_free_ipc_event(iov); @@ -1582,7 +1590,7 @@ pcmk__ipc_is_authentic_process_active(const char *name, uid_t refuid, c = qb_ipcc_connect(name, 0); #endif if (c == NULL) { - crm_info("Could not connect to %s IPC: %s", name, strerror(errno)); + pcmk__info("Could not connect to %s IPC: %s", name, strerror(errno)); rc = pcmk_rc_ipc_unresponsive; goto bail; } @@ -1598,8 +1606,8 @@ pcmk__ipc_is_authentic_process_active(const char *name, uid_t refuid, * for us. */ if (qb_ipcc_connect_continue(c) != 0) { - crm_info("Could not connect to %s IPC: %s", name, - (poll_rc == 0)?"timeout":strerror(errno)); + pcmk__info("Could not connect to %s IPC: %s", name, + ((poll_rc == 0)? "timeout" :strerror(errno))); rc = pcmk_rc_ipc_unresponsive; c = NULL; // qb_ipcc_connect_continue cleaned up for us goto bail; @@ -1609,26 +1617,27 @@ pcmk__ipc_is_authentic_process_active(const char *name, uid_t refuid, qb_rc = qb_ipcc_fd_get(c, &fd); if (qb_rc != 0) { rc = (int) -qb_rc; // System errno - crm_err("Could not get fd from %s IPC: %s " QB_XS " rc=%d", - name, pcmk_rc_str(rc), rc); + pcmk__err("Could not get fd from %s IPC: %s " QB_XS " rc=%d", + name, pcmk_rc_str(rc), rc); goto bail; } auth_rc = is_ipc_provider_expected(c, fd, refuid, refgid, &found_pid, &found_uid, &found_gid); if (auth_rc == pcmk_rc_ipc_unauthorized) { - crm_err("Daemon (IPC %s) effectively blocked with unauthorized" - " process %lld (uid: %lld, gid: %lld)", - name, (long long) PCMK__SPECIAL_PID_AS_0(found_pid), - (long long) found_uid, (long long) found_gid); + pcmk__err("Daemon (IPC %s) effectively blocked with unauthorized " + "process %lld (uid: %lld, gid: %lld)", + name, (long long) PCMK__SPECIAL_PID_AS_0(found_pid), + (long long) found_uid, (long long) found_gid); rc = pcmk_rc_ipc_unauthorized; goto bail; } if (auth_rc != pcmk_rc_ok) { rc = auth_rc; - crm_err("Could not get peer credentials from %s IPC: %s " - QB_XS " rc=%d", name, pcmk_rc_str(rc), rc); + pcmk__err("Could not get peer credentials from %s IPC: %s " + QB_XS " rc=%d", + name, pcmk_rc_str(rc), rc); goto bail; } @@ -1640,16 +1649,16 @@ pcmk__ipc_is_authentic_process_active(const char *name, uid_t refuid, if ((found_uid != refuid || found_gid != refgid) && strncmp(last_asked_name, name, sizeof(last_asked_name))) { if ((found_uid == 0) && (refuid != 0)) { - crm_warn("Daemon (IPC %s) runs as root, whereas the expected" - " credentials are %lld:%lld, hazard of violating" - " the least privilege principle", - name, (long long) refuid, (long long) refgid); + pcmk__warn("Daemon (IPC %s) runs as root, whereas the expected " + "credentials are %lld:%lld, hazard of violating the " + "least privilege principle", + name, (long long) refuid, (long long) refgid); } else { - crm_notice("Daemon (IPC %s) runs as %lld:%lld, whereas the" - " expected credentials are %lld:%lld, which may" - " mean a different set of privileges than expected", - name, (long long) found_uid, (long long) found_gid, - (long long) refuid, (long long) refgid); + pcmk__notice("Daemon (IPC %s) runs as %lld:%lld, whereas the " + "expected credentials are %lld:%lld, which may " + "mean a different set of privileges than expected", + name, (long long) found_uid, (long long) found_gid, + (long long) refuid, (long long) refgid); } memccpy(last_asked_name, name, '\0', sizeof(last_asked_name)); } @@ -1676,15 +1685,15 @@ crm_ipc_connect(crm_ipc_t *client) } if ((client != NULL) && (client->ipc == NULL)) { errno = (rc > 0)? rc : ENOTCONN; - crm_debug("Could not establish %s IPC connection: %s (%d)", - client->server_name, pcmk_rc_str(errno), errno); + pcmk__debug("Could not establish %s IPC connection: %s (%d)", + client->server_name, pcmk_rc_str(errno), errno); } else if (rc == pcmk_rc_ipc_unauthorized) { - crm_err("%s IPC provider authentication failed", - (client == NULL)? "Pacemaker" : client->server_name); + pcmk__err("%s IPC provider authentication failed", + (client == NULL)? "Pacemaker" : client->server_name); errno = ECONNABORTED; } else { - crm_err("Could not verify authenticity of %s IPC provider", - (client == NULL)? "Pacemaker" : client->server_name); + pcmk__err("Could not verify authenticity of %s IPC provider", + (client == NULL)? "Pacemaker" : client->server_name); errno = ENOTCONN; } return false; diff --git a/lib/common/ipc_common.c b/lib/common/ipc_common.c index df932f670f3..dd70222e46d 100644 --- a/lib/common/ipc_common.c +++ b/lib/common/ipc_common.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -39,30 +39,30 @@ pcmk__ipc_buffer_size(unsigned int max) if (rc != pcmk_rc_ok) { env_value = MAX_MSG_SIZE; max = QB_MAX(max, env_value); - crm_warn("Using %u as IPC buffer size because '%s' is not " - "a valid value for PCMK_" PCMK__ENV_IPC_BUFFER ": %s", - max, env_value_s, pcmk_rc_str(rc)); + pcmk__warn("Using %u as IPC buffer size because '%s' is not " + "a valid value for PCMK_" PCMK__ENV_IPC_BUFFER ": %s", + max, env_value_s, pcmk_rc_str(rc)); } else if (env_value <= 0LL) { env_value = MAX_MSG_SIZE; max = QB_MAX(max, env_value); - crm_warn("Using %u as IPC buffer size because PCMK_" - PCMK__ENV_IPC_BUFFER " (%s) is not a positive integer", - max, env_value_s); + pcmk__warn("Using %u as IPC buffer size because PCMK_" + PCMK__ENV_IPC_BUFFER " (%s) is not a positive integer", + max, env_value_s); } else if (env_value < MIN_MSG_SIZE) { env_value = MIN_MSG_SIZE; max = QB_MAX(max, env_value); - crm_debug("Using %u as IPC buffer size because PCMK_" - PCMK__ENV_IPC_BUFFER " (%s) is too small", - max, env_value_s); + pcmk__debug("Using %u as IPC buffer size because PCMK_" + PCMK__ENV_IPC_BUFFER " (%s) is too small", + max, env_value_s); } else if (env_value > UINT_MAX) { env_value = UINT_MAX; max = UINT_MAX; - crm_debug("Using %u as IPC buffer size because PCMK_" - PCMK__ENV_IPC_BUFFER " (%s) is too big", - max, env_value_s); + pcmk__debug("Using %u as IPC buffer size because PCMK_" + PCMK__ENV_IPC_BUFFER " (%s) is too big", + max, env_value_s); } } @@ -72,8 +72,8 @@ pcmk__ipc_buffer_size(unsigned int max) if (env_value == MAX_MSG_SIZE) { source = "default"; } - crm_debug("Using IPC buffer size %lld from %s (not %u)", - env_value, source, max); + pcmk__debug("Using IPC buffer size %lld from %s (not %u)", env_value, + source, max); max = env_value; } return max; @@ -107,12 +107,13 @@ bool pcmk__valid_ipc_header(const pcmk__ipc_header_t *header) { if (header == NULL) { - crm_err("IPC message without header"); + pcmk__err("IPC message without header"); return false; } else if (header->version > PCMK__IPC_VERSION) { - crm_err("Filtering incompatible v%d IPC message (only versions <= %d supported)", - header->version, PCMK__IPC_VERSION); + pcmk__err("Filtering incompatible v%d IPC message (only versions <= %d " + "supported)", + header->version, PCMK__IPC_VERSION); return false; } return true; diff --git a/lib/common/ipc_controld.c b/lib/common/ipc_controld.c index d73a58408d7..f2ef03b56c0 100644 --- a/lib/common/ipc_controld.c +++ b/lib/common/ipc_controld.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2024 the Pacemaker project contributors + * Copyright 2020-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -18,6 +18,7 @@ #include #include +#include // crm_meta_name() #include #include #include @@ -114,10 +115,10 @@ post_connect(pcmk_ipc_api_t *api) rc = pcmk__send_ipc_request(api, hello); pcmk__xml_free(hello); if (rc != pcmk_rc_ok) { - crm_info("Could not send IPC hello to %s: %s " QB_XS " rc=%s", - pcmk_ipc_name(api, true), pcmk_rc_str(rc), rc); + pcmk__info("Could not send IPC hello to %s: %s " QB_XS " rc=%s", + pcmk_ipc_name(api, true), pcmk_rc_str(rc), rc); } else { - crm_debug("Sent IPC hello to %s", pcmk_ipc_name(api, true)); + pcmk__debug("Sent IPC hello to %s", pcmk_ipc_name(api, true)); } return rc; } @@ -139,11 +140,11 @@ set_node_info_data(pcmk_controld_api_reply_t *data, xmlNode *msg_data) * @TODO: Improve handling after pcmk__node_status_t is refactored to handle * layer-specific data better. */ - crm_element_value_int(msg_data, PCMK_XA_ID, &(data->data.node_info.id)); + pcmk__xe_get_int(msg_data, PCMK_XA_ID, &(data->data.node_info.id)); - data->data.node_info.uuid = crm_element_value(msg_data, PCMK_XA_ID); - data->data.node_info.uname = crm_element_value(msg_data, PCMK_XA_UNAME); - data->data.node_info.state = crm_element_value(msg_data, PCMK_XA_CRMD); + data->data.node_info.uuid = pcmk__xe_get(msg_data, PCMK_XA_ID); + data->data.node_info.uname = pcmk__xe_get(msg_data, PCMK_XA_UNAME); + data->data.node_info.state = pcmk__xe_get(msg_data, PCMK_XA_CRMD); } static void @@ -153,11 +154,9 @@ set_ping_data(pcmk_controld_api_reply_t *data, xmlNode *msg_data) if (msg_data == NULL) { return; } - data->data.ping.sys_from = crm_element_value(msg_data, - PCMK__XA_CRM_SUBSYSTEM); - data->data.ping.fsa_state = crm_element_value(msg_data, - PCMK__XA_CRMD_STATE); - data->data.ping.result = crm_element_value(msg_data, PCMK_XA_RESULT); + data->data.ping.sys_from = pcmk__xe_get(msg_data, PCMK__XA_CRM_SUBSYSTEM); + data->data.ping.fsa_state = pcmk__xe_get(msg_data, PCMK__XA_CRMD_STATE); + data->data.ping.result = pcmk__xe_get(msg_data, PCMK_XA_RESULT); } static void @@ -173,12 +172,12 @@ set_nodes_data(pcmk_controld_api_reply_t *data, xmlNode *msg_data) long long id_ll = 0; node_info = pcmk__assert_alloc(1, sizeof(pcmk_controld_api_node_t)); - crm_element_value_ll(node, PCMK_XA_ID, &id_ll); + pcmk__xe_get_ll(node, PCMK_XA_ID, &id_ll); if (id_ll > 0) { node_info->id = id_ll; } - node_info->uname = crm_element_value(node, PCMK_XA_UNAME); - node_info->state = crm_element_value(node, PCMK__XA_IN_CCM); + node_info->uname = pcmk__xe_get(node, PCMK_XA_UNAME); + node_info->state = pcmk__xe_get(node, PCMK__XA_IN_CCM); data->data.nodes = g_list_prepend(data->data.nodes, node_info); } } @@ -187,7 +186,7 @@ static bool reply_expected(pcmk_ipc_api_t *api, const xmlNode *request) { // We only need to handle commands that API functions can send - return pcmk__str_any_of(crm_element_value(request, PCMK__XA_CRM_TASK), + return pcmk__str_any_of(pcmk__xe_get(request, PCMK__XA_CRM_TASK), PCMK__CONTROLD_CMD_NODES, CRM_OP_LRM_DELETE, CRM_OP_LRM_FAIL, @@ -224,40 +223,41 @@ dispatch(pcmk_ipc_api_t *api, xmlNode *reply) // Do some basic validation of the reply - value = crm_element_value(reply, PCMK__XA_SUBT); + value = pcmk__xe_get(reply, PCMK__XA_SUBT); if (pcmk__str_eq(value, PCMK__VALUE_REQUEST, pcmk__str_none)) { /* @COMPAT Controllers <3.0.0 set PCMK__XA_SUBT to PCMK__VALUE_REQUEST * for certain replies. Once we no longer support Pacemaker Remote nodes * connecting to cluster nodes <3.0.0, or rolling upgrades from <3.0.0, * we can drop this check. */ - crm_trace("Received a reply that was marked as a request " - "(bug unless sent by a controller <3.0.0)"); + pcmk__trace("Received a reply that was marked as a request (bug unless " + "sent by a controller <3.0.0)"); } else if (!pcmk__str_eq(value, PCMK__VALUE_RESPONSE, pcmk__str_none)) { - crm_info("Unrecognizable message from controller: " - "invalid message type '%s'", pcmk__s(value, "")); + pcmk__info("Unrecognizable message from controller: invalid message " + "type '%s'", + pcmk__s(value, "")); status = CRM_EX_PROTOCOL; goto done; } - if (pcmk__str_empty(crm_element_value(reply, PCMK_XA_REFERENCE))) { - crm_info("Unrecognizable message from controller: no reference"); + if (pcmk__str_empty(pcmk__xe_get(reply, PCMK_XA_REFERENCE))) { + pcmk__info("Unrecognizable message from controller: no reference"); status = CRM_EX_PROTOCOL; goto done; } - value = crm_element_value(reply, PCMK__XA_CRM_TASK); + value = pcmk__xe_get(reply, PCMK__XA_CRM_TASK); if (pcmk__str_empty(value)) { - crm_info("Unrecognizable message from controller: no command name"); + pcmk__info("Unrecognizable message from controller: no command name"); status = CRM_EX_PROTOCOL; goto done; } // Parse useful info from reply - reply_data.feature_set = crm_element_value(reply, PCMK_XA_VERSION); - reply_data.host_from = crm_element_value(reply, PCMK__XA_SRC); + reply_data.feature_set = pcmk__xe_get(reply, PCMK_XA_VERSION); + reply_data.host_from = pcmk__xe_get(reply, PCMK__XA_SRC); wrapper = pcmk__xe_first_child(reply, PCMK__XE_CRM_XML, NULL, NULL); msg_data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); @@ -279,8 +279,9 @@ dispatch(pcmk_ipc_api_t *api, xmlNode *reply) set_nodes_data(&reply_data, msg_data); } else { - crm_info("Unrecognizable message from controller: unknown command '%s'", - value); + pcmk__info("Unrecognizable message from controller: unknown command " + "'%s'", + value); status = CRM_EX_PROTOCOL; } @@ -339,8 +340,8 @@ create_controller_request(const pcmk_ipc_api_t *api, const char *op, } else { sys_to = CRM_SYSTEM_CRMD; } - sender_system = crm_strdup_printf("%s_%s", private->client_uuid, - pcmk__s(crm_system_name, "client")); + sender_system = pcmk__assert_asprintf("%s_%s", private->client_uuid, + pcmk__s(crm_system_name, "client")); request = pcmk__new_request(pcmk_ipc_controld, sender_system, node, sys_to, op, msg_data); free(sender_system); @@ -352,7 +353,7 @@ static int send_controller_request(pcmk_ipc_api_t *api, const xmlNode *request, bool reply_is_expected) { - if (crm_element_value(request, PCMK_XA_REFERENCE) == NULL) { + if (pcmk__xe_get(request, PCMK_XA_REFERENCE) == NULL) { return EINVAL; } if (reply_is_expected) { @@ -369,9 +370,9 @@ create_reprobe_message_data(const char *target_node, const char *router_node) xmlNode *msg_data; msg_data = pcmk__xe_create(NULL, "data_for_" CRM_OP_REPROBE); - crm_xml_add(msg_data, PCMK__META_ON_NODE, target_node); + pcmk__xe_set(msg_data, PCMK__META_ON_NODE, target_node); if ((router_node != NULL) && !pcmk__str_eq(router_node, target_node, pcmk__str_casei)) { - crm_xml_add(msg_data, PCMK__XA_ROUTER_NODE, router_node); + pcmk__xe_set(msg_data, PCMK__XA_ROUTER_NODE, router_node); } return msg_data; } @@ -400,9 +401,9 @@ pcmk_controld_api_reprobe(pcmk_ipc_api_t *api, const char *target_node, if (router_node == NULL) { router_node = target_node; } - crm_debug("Sending %s IPC request to reprobe %s via %s", - pcmk_ipc_name(api, true), pcmk__s(target_node, "local node"), - pcmk__s(router_node, "local node")); + pcmk__debug("Sending %s IPC request to reprobe %s via %s", + pcmk_ipc_name(api, true), pcmk__s(target_node, "local node"), + pcmk__s(router_node, "local node")); msg_data = create_reprobe_message_data(target_node, router_node); request = create_controller_request(api, CRM_OP_REPROBE, router_node, msg_data); @@ -432,7 +433,7 @@ pcmk_controld_api_node_info(pcmk_ipc_api_t *api, uint32_t nodeid) return EINVAL; } if (nodeid > 0) { - crm_xml_add_ll(request, PCMK_XA_ID, nodeid); + pcmk__xe_set_ll(request, PCMK_XA_ID, nodeid); } rc = send_controller_request(api, request, true); @@ -514,32 +515,32 @@ controller_resource_op(pcmk_ipc_api_t *api, const char *op, */ key = pcmk__transition_key(0, getpid(), 0, "xxxxxxxx-xrsc-opxx-xcrm-resourcexxxx"); - crm_xml_add(msg_data, PCMK__XA_TRANSITION_KEY, key); + pcmk__xe_set(msg_data, PCMK__XA_TRANSITION_KEY, key); free(key); - crm_xml_add(msg_data, PCMK__META_ON_NODE, target_node); + pcmk__xe_set(msg_data, PCMK__META_ON_NODE, target_node); if (!pcmk__str_eq(router_node, target_node, pcmk__str_casei)) { - crm_xml_add(msg_data, PCMK__XA_ROUTER_NODE, router_node); + pcmk__xe_set(msg_data, PCMK__XA_ROUTER_NODE, router_node); } if (cib_only) { // Indicate that only the CIB needs to be cleaned - crm_xml_add(msg_data, PCMK__XA_MODE, PCMK__VALUE_CIB); + pcmk__xe_set(msg_data, PCMK__XA_MODE, PCMK__VALUE_CIB); } xml_rsc = pcmk__xe_create(msg_data, PCMK_XE_PRIMITIVE); - crm_xml_add(xml_rsc, PCMK_XA_ID, rsc_id); - crm_xml_add(xml_rsc, PCMK__XA_LONG_ID, rsc_long_id); - crm_xml_add(xml_rsc, PCMK_XA_CLASS, standard); - crm_xml_add(xml_rsc, PCMK_XA_PROVIDER, provider); - crm_xml_add(xml_rsc, PCMK_XA_TYPE, type); + pcmk__xe_set(xml_rsc, PCMK_XA_ID, rsc_id); + pcmk__xe_set(xml_rsc, PCMK__XA_LONG_ID, rsc_long_id); + pcmk__xe_set(xml_rsc, PCMK_XA_CLASS, standard); + pcmk__xe_set(xml_rsc, PCMK_XA_PROVIDER, provider); + pcmk__xe_set(xml_rsc, PCMK_XA_TYPE, type); params = pcmk__xe_create(msg_data, PCMK__XE_ATTRIBUTES); - crm_xml_add(params, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(params, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); // The controller parses the timeout from the request key = crm_meta_name(PCMK_META_TIMEOUT); - crm_xml_add(params, key, "60000"); /* 1 minute */ //@TODO pass as arg + pcmk__xe_set(params, key, "60000"); /* 1 minute */ //@TODO pass as arg free(key); request = create_controller_request(api, op, router_node, msg_data); @@ -571,11 +572,11 @@ pcmk_controld_api_fail(pcmk_ipc_api_t *api, const char *standard, const char *provider, const char *type) { - crm_debug("Sending %s IPC request to fail %s (a.k.a. %s) on %s via %s", - pcmk_ipc_name(api, true), pcmk__s(rsc_id, "unknown resource"), - pcmk__s(rsc_long_id, "no other names"), - pcmk__s(target_node, "unspecified node"), - pcmk__s(router_node, "unspecified node")); + pcmk__debug("Sending %s IPC request to fail %s (a.k.a. %s) on %s via %s", + pcmk_ipc_name(api, true), pcmk__s(rsc_id, "unknown resource"), + pcmk__s(rsc_long_id, "no other names"), + pcmk__s(target_node, "unspecified node"), + pcmk__s(router_node, "unspecified node")); return controller_resource_op(api, CRM_OP_LRM_FAIL, target_node, router_node, false, rsc_id, rsc_long_id, standard, provider, type); @@ -604,11 +605,11 @@ pcmk_controld_api_refresh(pcmk_ipc_api_t *api, const char *target_node, const char *standard, const char *provider, const char *type, bool cib_only) { - crm_debug("Sending %s IPC request to refresh %s (a.k.a. %s) on %s via %s", - pcmk_ipc_name(api, true), pcmk__s(rsc_id, "unknown resource"), - pcmk__s(rsc_long_id, "no other names"), - pcmk__s(target_node, "unspecified node"), - pcmk__s(router_node, "unspecified node")); + pcmk__debug("Sending %s IPC request to refresh %s (a.k.a. %s) on %s via %s", + pcmk_ipc_name(api, true), pcmk__s(rsc_id, "unknown resource"), + pcmk__s(rsc_long_id, "no other names"), + pcmk__s(target_node, "unspecified node"), + pcmk__s(router_node, "unspecified node")); return controller_resource_op(api, CRM_OP_LRM_DELETE, target_node, router_node, cib_only, rsc_id, rsc_long_id, standard, provider, type); @@ -643,32 +644,33 @@ create_hello_message(const char *uuid, const char *client_name, if (pcmk__str_empty(uuid) || pcmk__str_empty(client_name) || pcmk__str_empty(major_version) || pcmk__str_empty(minor_version)) { - crm_err("Could not create IPC hello message from %s (UUID %s): " - "missing information", - client_name? client_name : "unknown client", - uuid? uuid : "unknown"); + pcmk__err("Could not create IPC hello message from %s (UUID %s): " + "missing information", + pcmk__s(client_name, "unknown client"), + pcmk__s(uuid, "unknown")); return NULL; } hello_node = pcmk__xe_create(NULL, PCMK__XE_OPTIONS); - crm_xml_add(hello_node, PCMK__XA_MAJOR_VERSION, major_version); - crm_xml_add(hello_node, PCMK__XA_MINOR_VERSION, minor_version); - crm_xml_add(hello_node, PCMK__XA_CLIENT_NAME, client_name); + pcmk__xe_set(hello_node, PCMK__XA_MAJOR_VERSION, major_version); + pcmk__xe_set(hello_node, PCMK__XA_MINOR_VERSION, minor_version); + pcmk__xe_set(hello_node, PCMK__XA_CLIENT_NAME, client_name); // @TODO Nothing uses this. Drop, or keep for debugging? - crm_xml_add(hello_node, PCMK__XA_CLIENT_UUID, uuid); + pcmk__xe_set(hello_node, PCMK__XA_CLIENT_UUID, uuid); - sender_system = crm_strdup_printf("%s_%s", uuid, client_name); + sender_system = pcmk__assert_asprintf("%s_%s", uuid, client_name); hello = pcmk__new_request(pcmk_ipc_controld, sender_system, NULL, NULL, CRM_OP_HELLO, hello_node); free(sender_system); pcmk__xml_free(hello_node); if (hello == NULL) { - crm_err("Could not create IPC hello message from %s (UUID %s): " - "Request creation failed", client_name, uuid); + pcmk__err("Could not create IPC hello message from %s (UUID %s): " + "Request creation failed", + client_name, uuid); return NULL; } - crm_trace("Created hello message from %s (UUID %s)", client_name, uuid); + pcmk__trace("Created hello message from %s (UUID %s)", client_name, uuid); return hello; } diff --git a/lib/common/ipc_pacemakerd.c b/lib/common/ipc_pacemakerd.c index 1ccf609eafe..dbd12527bcb 100644 --- a/lib/common/ipc_pacemakerd.c +++ b/lib/common/ipc_pacemakerd.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2024 the Pacemaker project contributors + * Copyright 2020-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -180,7 +180,7 @@ post_disconnect(pcmk_ipc_api_t *api) static bool reply_expected(pcmk_ipc_api_t *api, const xmlNode *request) { - const char *command = crm_element_value(request, PCMK__XA_CRM_TASK); + const char *command = pcmk__xe_get(request, PCMK__XA_CRM_TASK); if (command == NULL) { return false; @@ -200,75 +200,78 @@ dispatch(pcmk_ipc_api_t *api, xmlNode *reply) pcmk_pacemakerd_reply_unknown }; const char *value = NULL; - long long value_ll = 0; if (pcmk__xe_is(reply, PCMK__XE_ACK)) { long long int ack_status = 0; - const char *status = crm_element_value(reply, PCMK_XA_STATUS); + const char *status = pcmk__xe_get(reply, PCMK_XA_STATUS); int rc = pcmk__scan_ll(status, &ack_status, CRM_EX_OK); if (rc != pcmk_rc_ok) { - crm_warn("Ack reply from %s has invalid " PCMK_XA_STATUS - " '%s' (bug?)", - pcmk_ipc_name(api, true), pcmk__s(status, "")); + pcmk__warn("Ack reply from %s has invalid " PCMK_XA_STATUS " '%s' " + "(bug?)", + pcmk_ipc_name(api, true), pcmk__s(status, "")); } return ack_status == CRM_EX_INDETERMINATE; } - value = crm_element_value(reply, PCMK__XA_T); + value = pcmk__xe_get(reply, PCMK__XA_T); if (pcmk__parse_server(value) != pcmk_ipc_pacemakerd) { /* @COMPAT pacemakerd <3.0.0 sets PCMK__VALUE_CRMD as the message type, * so we can't enforce this check until we no longer support * Pacemaker Remote nodes connecting to cluster nodes older than that. */ - crm_trace("Message from %s has unexpected message type '%s' " - "(bug if not from pacemakerd <3.0.0)", - pcmk_ipc_name(api, true), pcmk__s(value, "")); + pcmk__trace("Message from %s has unexpected message type '%s' (bug if " + "not from pacemakerd <3.0.0)", + pcmk_ipc_name(api, true), pcmk__s(value, "")); } - value = crm_element_value(reply, PCMK__XA_SUBT); + value = pcmk__xe_get(reply, PCMK__XA_SUBT); if (!pcmk__str_eq(value, PCMK__VALUE_RESPONSE, pcmk__str_none)) { - crm_info("Unrecognizable message from %s: " - "message type '%s' not '" PCMK__VALUE_RESPONSE "'", - pcmk_ipc_name(api, true), pcmk__s(value, "")); + pcmk__info("Unrecognizable message from %s: message type '%s' not " + "'" PCMK__VALUE_RESPONSE "'", + pcmk_ipc_name(api, true), pcmk__s(value, "")); status = CRM_EX_PROTOCOL; goto done; } - if (pcmk__str_empty(crm_element_value(reply, PCMK_XA_REFERENCE))) { - crm_info("Unrecognizable message from %s: no reference", - pcmk_ipc_name(api, true)); + if (pcmk__str_empty(pcmk__xe_get(reply, PCMK_XA_REFERENCE))) { + pcmk__info("Unrecognizable message from %s: no reference", + pcmk_ipc_name(api, true)); status = CRM_EX_PROTOCOL; goto done; } - value = crm_element_value(reply, PCMK__XA_CRM_TASK); + value = pcmk__xe_get(reply, PCMK__XA_CRM_TASK); // Parse useful info from reply wrapper = pcmk__xe_first_child(reply, PCMK__XE_CRM_XML, NULL, NULL); msg_data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); - crm_element_value_ll(msg_data, PCMK_XA_CRM_TIMESTAMP, &value_ll); - if (pcmk__str_eq(value, CRM_OP_PING, pcmk__str_none)) { reply_data.reply_type = pcmk_pacemakerd_reply_ping; reply_data.data.ping.state = pcmk_pacemakerd_api_daemon_state_text2enum( - crm_element_value(msg_data, PCMK__XA_PACEMAKERD_STATE)); + pcmk__xe_get(msg_data, PCMK__XA_PACEMAKERD_STATE)); reply_data.data.ping.status = - pcmk__str_eq(crm_element_value(msg_data, PCMK_XA_RESULT), "ok", + pcmk__str_eq(pcmk__xe_get(msg_data, PCMK_XA_RESULT), "ok", pcmk__str_casei)?pcmk_rc_ok:pcmk_rc_error; - reply_data.data.ping.last_good = (value_ll < 0)? 0 : (time_t) value_ll; + + pcmk__xe_get_time(msg_data, PCMK_XA_CRM_TIMESTAMP, + &reply_data.data.ping.last_good); + if (reply_data.data.ping.last_good < 0) { + reply_data.data.ping.last_good = 0; + } + reply_data.data.ping.sys_from = - crm_element_value(msg_data, PCMK__XA_CRM_SUBSYSTEM); + pcmk__xe_get(msg_data, PCMK__XA_CRM_SUBSYSTEM); } else if (pcmk__str_eq(value, CRM_OP_QUIT, pcmk__str_none)) { - const char *op_status = crm_element_value(msg_data, PCMK__XA_OP_STATUS); + const char *op_status = pcmk__xe_get(msg_data, PCMK__XA_OP_STATUS); reply_data.reply_type = pcmk_pacemakerd_reply_shutdown; reply_data.data.shutdown.status = atoi(op_status); } else { - crm_info("Unrecognizable message from %s: unknown command '%s'", - pcmk_ipc_name(api, true), pcmk__s(value, "")); + pcmk__info("Unrecognizable message from %s: unknown command '%s'", + pcmk_ipc_name(api, true), pcmk__s(value, "")); status = CRM_EX_PROTOCOL; goto done; } @@ -309,8 +312,9 @@ do_pacemakerd_api_call(pcmk_ipc_api_t *api, const char *ipc_name, const char *ta private = api->api_data; pcmk__assert(private != NULL); - sender_system = crm_strdup_printf("%s_%s", private->client_uuid, - pcmk__ipc_sys_name(ipc_name, "client")); + sender_system = pcmk__assert_asprintf("%s_%s", private->client_uuid, + pcmk__ipc_sys_name(ipc_name, + "client")); cmd = pcmk__new_request(pcmk_ipc_pacemakerd, sender_system, NULL, CRM_SYSTEM_MCP, task, NULL); free(sender_system); @@ -318,8 +322,8 @@ do_pacemakerd_api_call(pcmk_ipc_api_t *api, const char *ipc_name, const char *ta if (cmd) { rc = pcmk__send_ipc_request(api, cmd); if (rc != pcmk_rc_ok) { - crm_debug("Couldn't send request to %s: %s rc=%d", - pcmk_ipc_name(api, true), pcmk_rc_str(rc), rc); + pcmk__debug("Couldn't send request to %s: %s rc=%d", + pcmk_ipc_name(api, true), pcmk_rc_str(rc), rc); } pcmk__xml_free(cmd); } else { diff --git a/lib/common/ipc_schedulerd.c b/lib/common/ipc_schedulerd.c index 55d2935e6d2..b1348933d54 100644 --- a/lib/common/ipc_schedulerd.c +++ b/lib/common/ipc_schedulerd.c @@ -1,5 +1,5 @@ /* - * Copyright 2021-2024 the Pacemaker project contributors + * Copyright 2021-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -63,7 +63,7 @@ post_connect(pcmk_ipc_api_t *api) static bool reply_expected(pcmk_ipc_api_t *api, const xmlNode *request) { - const char *command = crm_element_value(request, PCMK__XA_CRM_TASK); + const char *command = pcmk__xe_get(request, PCMK__XA_CRM_TASK); if (command == NULL) { return false; @@ -88,26 +88,26 @@ dispatch(pcmk_ipc_api_t *api, xmlNode *reply) return false; } - value = crm_element_value(reply, PCMK__XA_T); + value = pcmk__xe_get(reply, PCMK__XA_T); if (pcmk__parse_server(value) != pcmk_ipc_schedulerd) { - crm_info("Unrecognizable message from schedulerd: " - "unexpected message type '%s'", - pcmk__s(value, "")); + pcmk__info("Unrecognizable message from schedulerd: unexpected message " + "type '%s'", + pcmk__s(value, "")); status = CRM_EX_PROTOCOL; goto done; } - value = crm_element_value(reply, PCMK__XA_SUBT); + value = pcmk__xe_get(reply, PCMK__XA_SUBT); if (!pcmk__str_eq(value, PCMK__VALUE_RESPONSE, pcmk__str_none)) { - crm_info("Unrecognizable message from schedulerd: " - "message type '%s' not '" PCMK__VALUE_RESPONSE "'", - pcmk__s(value, "")); + pcmk__info("Unrecognizable message from schedulerd: message type '%s' " + "not '" PCMK__VALUE_RESPONSE "'", + pcmk__s(value, "")); status = CRM_EX_PROTOCOL; goto done; } - if (pcmk__str_empty(crm_element_value(reply, PCMK_XA_REFERENCE))) { - crm_info("Unrecognizable message from schedulerd: no reference"); + if (pcmk__str_empty(pcmk__xe_get(reply, PCMK_XA_REFERENCE))) { + pcmk__info("Unrecognizable message from schedulerd: no reference"); status = CRM_EX_PROTOCOL; goto done; } @@ -116,18 +116,19 @@ dispatch(pcmk_ipc_api_t *api, xmlNode *reply) wrapper = pcmk__xe_first_child(reply, PCMK__XE_CRM_XML, NULL, NULL); msg_data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL); - value = crm_element_value(reply, PCMK__XA_CRM_TASK); + value = pcmk__xe_get(reply, PCMK__XA_CRM_TASK); if (pcmk__str_eq(value, CRM_OP_PECALC, pcmk__str_none)) { reply_data.reply_type = pcmk_schedulerd_reply_graph; - reply_data.data.graph.reference = crm_element_value(reply, - PCMK_XA_REFERENCE); - reply_data.data.graph.input = crm_element_value(reply, - PCMK__XA_CRM_TGRAPH_IN); + reply_data.data.graph.reference = pcmk__xe_get(reply, + PCMK_XA_REFERENCE); + reply_data.data.graph.input = pcmk__xe_get(reply, + PCMK__XA_CRM_TGRAPH_IN); reply_data.data.graph.tgraph = msg_data; } else { - crm_info("Unrecognizable message from schedulerd: " - "unknown command '%s'", pcmk__s(value, "")); + pcmk__info("Unrecognizable message from schedulerd: unknown command " + "'%s'", + pcmk__s(value, "")); status = CRM_EX_PROTOCOL; goto done; } @@ -167,8 +168,8 @@ do_schedulerd_api_call(pcmk_ipc_api_t *api, const char *task, xmlNode *cib, char private = api->api_data; pcmk__assert(private != NULL); - sender_system = crm_strdup_printf("%s_%s", private->client_uuid, - pcmk__s(crm_system_name, "client")); + sender_system = pcmk__assert_asprintf("%s_%s", private->client_uuid, + pcmk__s(crm_system_name, "client")); cmd = pcmk__new_request(pcmk_ipc_schedulerd, sender_system, NULL, CRM_SYSTEM_PENGINE, task, cib); free(sender_system); @@ -176,11 +177,11 @@ do_schedulerd_api_call(pcmk_ipc_api_t *api, const char *task, xmlNode *cib, char if (cmd) { rc = pcmk__send_ipc_request(api, cmd); if (rc != pcmk_rc_ok) { - crm_debug("Couldn't send request to schedulerd: %s rc=%d", - pcmk_rc_str(rc), rc); + pcmk__debug("Couldn't send request to schedulerd: %s rc=%d", + pcmk_rc_str(rc), rc); } - *ref = strdup(crm_element_value(cmd, PCMK_XA_REFERENCE)); + *ref = strdup(pcmk__xe_get(cmd, PCMK_XA_REFERENCE)); pcmk__xml_free(cmd); } else { rc = ENOMSG; diff --git a/lib/common/ipc_server.c b/lib/common/ipc_server.c index 2a2d7910537..5b81d54801a 100644 --- a/lib/common/ipc_server.c +++ b/lib/common/ipc_server.c @@ -62,7 +62,7 @@ pcmk__find_client(const qb_ipcs_connection_t *c) return g_hash_table_lookup(client_connections, c); } - crm_trace("No client found for %p", c); + pcmk__trace("No client found for %p", c); return NULL; } @@ -81,7 +81,7 @@ pcmk__find_client_by_id(const char *id) } } } - crm_trace("No client found with id='%s'", pcmk__s(id, "")); + pcmk__trace("No client found with id='%s'", pcmk__s(id, "")); return NULL; } @@ -118,8 +118,8 @@ pcmk__client_cleanup(void) int active = g_hash_table_size(client_connections); if (active > 0) { - crm_warn("Exiting with %d active IPC client%s", - active, pcmk__plural_s(active)); + pcmk__warn("Exiting with %d active IPC client%s", active, + pcmk__plural_s(active)); } g_hash_table_destroy(client_connections); client_connections = NULL; @@ -143,8 +143,8 @@ pcmk__drop_all_clients(qb_ipcs_service_t *service) c = qb_ipcs_connection_next_get(service, last); /* There really shouldn't be anyone connected at this point */ - crm_notice("Disconnecting client %p, pid=%d...", - last, pcmk__client_pid(last)); + pcmk__notice("Disconnecting client %p, pid=%d...", last, + pcmk__client_pid(last)); qb_ipcs_disconnect(last); qb_ipcs_connection_unref(last); } @@ -169,8 +169,9 @@ client_from_connection(qb_ipcs_connection_t *c, void *key, uid_t uid_client) client->user = pcmk__uid2username(uid_client); if (client->user == NULL) { client->user = pcmk__str_copy("#unprivileged"); - crm_err("Unable to enforce ACLs for user ID %d, assuming unprivileged", - uid_client); + pcmk__err("Unable to enforce ACLs for user ID %d, assuming " + "unprivileged", + uid_client); } client->ipcs = c; pcmk__set_client_flags(client, pcmk__client_ipc); @@ -180,12 +181,12 @@ client_from_connection(qb_ipcs_connection_t *c, void *key, uid_t uid_client) } } - client->id = crm_generate_uuid(); + client->id = pcmk__generate_uuid(); if (key == NULL) { key = client->id; } if (client_connections == NULL) { - crm_trace("Creating IPC client table"); + pcmk__trace("Creating IPC client table"); client_connections = g_hash_table_new(g_direct_hash, g_direct_equal); } g_hash_table_insert(client_connections, key, client); @@ -215,18 +216,19 @@ pcmk__new_client(qb_ipcs_connection_t *c, uid_t uid_client, gid_t gid_client) CRM_CHECK(c != NULL, return NULL); - if (pcmk_daemon_user(&uid_cluster, &gid_cluster) < 0) { - static bool need_log = TRUE; + if (pcmk__daemon_user(&uid_cluster, &gid_cluster) != pcmk_rc_ok) { + static bool need_log = true; if (need_log) { - crm_warn("Could not find user and group IDs for user %s", - CRM_DAEMON_USER); - need_log = FALSE; + pcmk__warn("Could not find user and group IDs for user " + CRM_DAEMON_USER); + need_log = false; } } if (uid_client != 0) { - crm_trace("Giving group %u access to new IPC connection", gid_cluster); + pcmk__trace("Giving group %u access to new IPC connection", + gid_cluster); /* Passing -1 to chown(2) means don't change */ qb_ipcs_connection_auth_set(c, -1, gid_cluster, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); } @@ -239,8 +241,8 @@ pcmk__new_client(qb_ipcs_connection_t *c, uid_t uid_client, gid_t gid_client) pcmk__set_client_flags(client, pcmk__client_privileged); } - crm_debug("New IPC client %s for PID %u with uid %d and gid %d", - client->id, client->pid, uid_client, gid_client); + pcmk__debug("New IPC client %s for PID %u with uid %d and gid %d", + client->id, client->pid, uid_client, gid_client); return client; } @@ -289,13 +291,13 @@ pcmk__free_client(pcmk__client_t *c) if (client_connections) { if (c->ipcs) { - crm_trace("Destroying %p/%p (%d remaining)", - c, c->ipcs, g_hash_table_size(client_connections) - 1); + pcmk__trace("Destroying %p/%p (%u remaining)", c, c->ipcs, + (g_hash_table_size(client_connections) - 1)); g_hash_table_remove(client_connections, c->ipcs); } else { - crm_trace("Destroying remote connection %p (%d remaining)", - c, g_hash_table_size(client_connections) - 1); + pcmk__trace("Destroying remote connection %p (%u remaining)", c, + (g_hash_table_size(client_connections) - 1)); g_hash_table_remove(client_connections, c->id); } } @@ -305,7 +307,7 @@ pcmk__free_client(pcmk__client_t *c) } if (c->event_queue) { - crm_debug("Destroying %d events", g_queue_get_length(c->event_queue)); + pcmk__debug("Destroying %d events", g_queue_get_length(c->event_queue)); g_queue_free_full(c->event_queue, free_event); } @@ -346,7 +348,7 @@ pcmk__set_client_queue_max(pcmk__client_t *client, const char *qmax) orig_value = client->queue_max; - if (pcmk_is_set(client->flags, pcmk__client_privileged)) { + if (pcmk__is_set(client->flags, pcmk__client_privileged)) { rc = pcmk__scan_ll(qmax, &qmax_ll, 0LL); if (rc == pcmk_rc_ok) { if ((qmax_ll <= 0LL) || (qmax_ll > UINT_MAX)) { @@ -360,14 +362,14 @@ pcmk__set_client_queue_max(pcmk__client_t *client, const char *qmax) } if (rc != pcmk_rc_ok) { - crm_info("Could not set IPC threshold for client %s[%u] to %s: %s", - pcmk__client_name(client), client->pid, - pcmk__s(qmax, "default"), pcmk_rc_str(rc)); + pcmk__info("Could not set IPC threshold for client %s[%u] to %s: %s", + pcmk__client_name(client), client->pid, + pcmk__s(qmax, "default"), pcmk_rc_str(rc)); } else if (client->queue_max != orig_value) { - crm_debug("IPC threshold for client %s[%u] is now %u (was %u)", - pcmk__client_name(client), client->pid, - client->queue_max, orig_value); + pcmk__debug("IPC threshold for client %s[%u] is now %u (was %u)", + pcmk__client_name(client), client->pid, client->queue_max, + orig_value); } } @@ -412,7 +414,7 @@ pcmk__client_data2xml(pcmk__client_t *c, void *data, uint32_t *id, *flags = header->flags; } - if (pcmk_is_set(header->flags, crm_ipc_proxied)) { + if (pcmk__is_set(header->flags, crm_ipc_proxied)) { /* Mark this client as being the endpoint of a proxy connection. * Proxy connections responses are sent on the event channel, to avoid * blocking the controller serving as proxy. @@ -425,8 +427,8 @@ pcmk__client_data2xml(pcmk__client_t *c, void *data, uint32_t *id, unsigned int size_u = 1 + header->size_uncompressed; uncompressed = pcmk__assert_alloc(1, size_u); - crm_trace("Decompressing message data %u bytes into %u bytes", - header->size_compressed, size_u); + pcmk__trace("Decompressing message data %u bytes into %u bytes", + header->size_compressed, size_u); rc = BZ2_bzBuffToBuffDecompress(uncompressed, &size_u, text, header->size_compressed, 1, 0); text = uncompressed; @@ -434,8 +436,8 @@ pcmk__client_data2xml(pcmk__client_t *c, void *data, uint32_t *id, rc = pcmk__bzlib2rc(rc); if (rc != pcmk_rc_ok) { - crm_err("Decompression failed: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__err("Decompression failed: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); free(uncompressed); return NULL; } @@ -444,7 +446,7 @@ pcmk__client_data2xml(pcmk__client_t *c, void *data, uint32_t *id, pcmk__assert(text[header->size_uncompressed - 1] == 0); xml = pcmk__xml_parse(text); - crm_log_xml_trace(xml, "[IPC received]"); + pcmk__log_xml_trace(xml, "[IPC received]"); free(uncompressed); return xml; @@ -499,7 +501,7 @@ crm_ipcs_flush_events(pcmk__client_t *c) } else if (c->event_timer) { /* There is already a timer, wait until it goes off */ - crm_trace("Timer active for %p - %d", c->ipcs, c->event_timer); + pcmk__trace("Timer active for %p - %d", c->ipcs, c->event_timer); return rc; } @@ -528,20 +530,21 @@ crm_ipcs_flush_events(pcmk__client_t *c) sent++; header = event[0].iov_base; if (header->size_compressed) { - crm_trace("Event %" PRId32 " to %p[%u] (%zd compressed bytes) sent", - header->qb.id, c->ipcs, c->pid, qb_rc); + pcmk__trace("Event %" PRId32 " to %p[%u] (%zd compressed bytes) " + "sent", + header->qb.id, c->ipcs, c->pid, qb_rc); } else { - crm_trace("Event %" PRId32 " to %p[%u] (%zd bytes) sent: %.120s", - header->qb.id, c->ipcs, c->pid, qb_rc, - (char *) (event[1].iov_base)); + pcmk__trace("Event %" PRId32 " to %p[%u] (%zd bytes) sent: %.120s", + header->qb.id, c->ipcs, c->pid, qb_rc, + (const char *) event[1].iov_base); } pcmk_free_ipc_event(event); } queue_len -= sent; if (sent > 0 || queue_len) { - crm_trace("Sent %u events (%u remaining) for %p[%d]: %s (%zd)", - sent, queue_len, c->ipcs, c->pid, pcmk_rc_str(rc), qb_rc); + pcmk__trace("Sent %u events (%u remaining) for %p[%d]: %s (%zd)", sent, + queue_len, c->ipcs, c->pid, pcmk_rc_str(rc), qb_rc); } if (queue_len) { @@ -553,11 +556,13 @@ crm_ipcs_flush_events(pcmk__client_t *c) if (queue_len > QB_MAX(c->queue_max, PCMK_IPC_DEFAULT_QUEUE_MAX)) { if ((c->queue_backlog <= 1) || (queue_len < c->queue_backlog)) { /* Don't evict for a new or shrinking backlog */ - crm_warn("Client with process ID %u has a backlog of %u messages " - QB_XS " %p", c->pid, queue_len, c->ipcs); + pcmk__warn("Client with process ID %u has a backlog of %u " + "messages " QB_XS " %p", + c->pid, queue_len, c->ipcs); } else { - crm_err("Evicting client with process ID %u due to backlog of %u messages " - QB_XS " %p", c->pid, queue_len, c->ipcs); + pcmk__err("Evicting client with process ID %u due to backlog " + "of %u messages " QB_XS " %p", + c->pid, queue_len, c->ipcs); c->queue_backlog = 0; qb_ipcs_disconnect(c->ipcs); return rc; @@ -650,13 +655,13 @@ pcmk__ipc_prepare_iov(uint32_t request, const xmlNode *message, biggest = QB_MAX(header->size_compressed, biggest); } else { - crm_log_xml_trace(message, "EMSGSIZE"); + pcmk__log_xml_trace(message, "EMSGSIZE"); biggest = QB_MAX(header->size_uncompressed, biggest); - crm_err("Could not compress %u-byte message into less than IPC " - "limit of %u bytes; set PCMK_ipc_buffer to higher value " - "(%u bytes suggested)", - header->size_uncompressed, max_send_size, 4 * biggest); + pcmk__err("Could not compress %u-byte message into less than IPC " + "limit of %u bytes; set PCMK_ipc_buffer to higher value " + "(%u bytes suggested)", + header->size_uncompressed, max_send_size, (4 * biggest)); free(compressed); pcmk_free_ipc_event(iov); @@ -690,7 +695,7 @@ pcmk__ipc_send_iov(pcmk__client_t *c, struct iovec *iov, uint32_t flags) if (c->flags & pcmk__client_proxied) { /* _ALL_ replies to proxied connections need to be sent as events */ - if (!pcmk_is_set(flags, crm_ipc_server_event)) { + if (!pcmk__is_set(flags, crm_ipc_server_event)) { /* The proxied flag lets us know this was originally meant to be a * response, even though we're sending it over the event channel. */ @@ -705,13 +710,13 @@ pcmk__ipc_send_iov(pcmk__client_t *c, struct iovec *iov, uint32_t flags) header->qb.id = id++; /* We don't really use it, but doesn't hurt to set one */ if (flags & crm_ipc_server_free) { - crm_trace("Sending the original to %p[%d]", c->ipcs, c->pid); + pcmk__trace("Sending the original to %p[%d]", c->ipcs, c->pid); add_event(c, iov); } else { struct iovec *iov_copy = pcmk__new_ipc_event(); - crm_trace("Sending a copy to %p[%d]", c->ipcs, c->pid); + pcmk__trace("Sending a copy to %p[%d]", c->ipcs, c->pid); iov_copy[0].iov_len = iov[0].iov_len; iov_copy[0].iov_base = malloc(iov[0].iov_len); memcpy(iov_copy[0].iov_base, iov[0].iov_base, iov[0].iov_len); @@ -733,14 +738,14 @@ pcmk__ipc_send_iov(pcmk__client_t *c, struct iovec *iov, uint32_t flags) if (qb_rc < 0) { rc = (int) -qb_rc; } - crm_notice("Response %" PRId32 " to pid %u failed: %s " - QB_XS " bytes=%" PRId32 " rc=%zd ipcs=%p", - header->qb.id, c->pid, pcmk_rc_str(rc), - header->qb.size, qb_rc, c->ipcs); + pcmk__notice("Response %" PRId32 " to pid %u failed: %s " + QB_XS " bytes=%" PRId32 " rc=%zd ipcs=%p", + header->qb.id, c->pid, pcmk_rc_str(rc), + header->qb.size, qb_rc, c->ipcs); } else { - crm_trace("Response %" PRId32 " sent, %zd bytes to %p[%u]", - header->qb.id, qb_rc, c->ipcs, c->pid); + pcmk__trace("Response %" PRId32 " sent, %zd bytes to %p[%u]", + header->qb.id, qb_rc, c->ipcs, c->pid); } if (flags & crm_ipc_server_free) { @@ -755,7 +760,7 @@ pcmk__ipc_send_iov(pcmk__client_t *c, struct iovec *iov, uint32_t flags) } if ((rc == EPIPE) || (rc == ENOTCONN)) { - crm_trace("Client %p disconnected", c->ipcs); + pcmk__trace("Client %p disconnected", c->ipcs); } return rc; } @@ -777,8 +782,8 @@ pcmk__ipc_send_xml(pcmk__client_t *c, uint32_t request, const xmlNode *message, rc = pcmk__ipc_send_iov(c, iov, flags); } else { pcmk_free_ipc_event(iov); - crm_notice("IPC message to pid %d failed: %s " QB_XS " rc=%d", - c->pid, pcmk_rc_str(rc), rc); + pcmk__notice("IPC message to pid %d failed: %s " QB_XS " rc=%d", + c->pid, pcmk_rc_str(rc), rc); } return rc; } @@ -805,12 +810,12 @@ pcmk__ipc_create_ack_as(const char *function, int line, uint32_t flags, { xmlNode *ack = NULL; - if (pcmk_is_set(flags, crm_ipc_client_response)) { + if (pcmk__is_set(flags, crm_ipc_client_response)) { ack = pcmk__xe_create(NULL, tag); - crm_xml_add(ack, PCMK_XA_FUNCTION, function); - crm_xml_add_int(ack, PCMK__XA_LINE, line); - crm_xml_add_int(ack, PCMK_XA_STATUS, (int) status); - crm_xml_add(ack, PCMK__XA_IPC_PROTO_VERSION, ver); + pcmk__xe_set(ack, PCMK_XA_FUNCTION, function); + pcmk__xe_set_int(ack, PCMK__XA_LINE, line); + pcmk__xe_set_int(ack, PCMK_XA_STATUS, (int) status); + pcmk__xe_set(ack, PCMK__XA_IPC_PROTO_VERSION, ver); } return ack; } @@ -839,9 +844,9 @@ pcmk__ipc_send_ack_as(const char *function, int line, pcmk__client_t *c, xmlNode *ack = pcmk__ipc_create_ack_as(function, line, flags, tag, ver, status); if (ack != NULL) { - crm_trace("Ack'ing IPC message from client %s as <%s status=%d>", - pcmk__client_name(c), tag, status); - crm_log_xml_trace(ack, "sent-ack"); + pcmk__trace("Ack'ing IPC message from client %s as <%s status=%d>", + pcmk__client_name(c), tag, status); + pcmk__log_xml_trace(ack, "sent-ack"); c->request_id = 0; rc = pcmk__ipc_send_xml(c, request, ack, flags); pcmk__xml_free(ack); @@ -879,8 +884,10 @@ void pcmk__serve_based_ipc(qb_ipcs_service_t **ipcs_ro, QB_IPC_SHM, rw_cb); if (*ipcs_ro == NULL || *ipcs_rw == NULL || *ipcs_shm == NULL) { - crm_err("Failed to create the CIB manager: exiting and inhibiting respawn"); - crm_warn("Verify pacemaker and pacemaker_remote are not both enabled"); + pcmk__err("Failed to create the CIB manager: exiting and inhibiting " + "respawn"); + pcmk__warn("Verify pacemaker and pacemaker_remote are not both " + "enabled"); crm_exit(CRM_EX_FATAL); } } @@ -936,9 +943,9 @@ pcmk__serve_attrd_ipc(qb_ipcs_service_t **ipcs, *ipcs = mainloop_add_ipc_server(PCMK__VALUE_ATTRD, QB_IPC_NATIVE, cb); if (*ipcs == NULL) { - crm_crit("Exiting fatally because unable to serve " PCMK__SERVER_ATTRD - " IPC (verify pacemaker and pacemaker_remote are not both " - "enabled)"); + pcmk__crit("Exiting fatally because unable to serve " PCMK__SERVER_ATTRD + " IPC (verify pacemaker and pacemaker_remote are not both" + " enabled)"); crm_exit(CRM_EX_FATAL); } } @@ -960,8 +967,9 @@ pcmk__serve_fenced_ipc(qb_ipcs_service_t **ipcs, QB_LOOP_HIGH); if (*ipcs == NULL) { - crm_err("Failed to create fencer: exiting and inhibiting respawn."); - crm_warn("Verify pacemaker and pacemaker_remote are not both enabled."); + pcmk__err("Failed to create fencer: exiting and inhibiting respawn"); + pcmk__warn("Verify pacemaker and pacemaker_remote are not both " + "enabled"); crm_exit(CRM_EX_FATAL); } } @@ -982,8 +990,9 @@ pcmk__serve_pacemakerd_ipc(qb_ipcs_service_t **ipcs, *ipcs = mainloop_add_ipc_server(CRM_SYSTEM_MCP, QB_IPC_NATIVE, cb); if (*ipcs == NULL) { - crm_err("Couldn't start pacemakerd IPC server"); - crm_warn("Verify pacemaker and pacemaker_remote are not both enabled."); + pcmk__err("Couldn't start pacemakerd IPC server"); + pcmk__warn("Verify pacemaker and pacemaker_remote are not both " + "enabled"); /* sub-daemons are observed by pacemakerd. Thus we exit CRM_EX_FATAL * if we want to prevent pacemakerd from restarting them. * With pacemakerd we leave the exit-code shown to e.g. systemd diff --git a/lib/common/iso8601.c b/lib/common/iso8601.c index 007a64fff59..91eac184004 100644 --- a/lib/common/iso8601.c +++ b/lib/common/iso8601.c @@ -1,5 +1,5 @@ /* - * Copyright 2005-2024 the Pacemaker project contributors + * Copyright 2005-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -101,10 +101,14 @@ crm_get_utc_time(const crm_time_t *dt) utc->months = dt->months; } - crm_time_log(LOG_TRACE, "utc-source", dt, - crm_time_log_date | crm_time_log_timeofday | crm_time_log_with_timezone); - crm_time_log(LOG_TRACE, "utc-target", utc, - crm_time_log_date | crm_time_log_timeofday | crm_time_log_with_timezone); + crm_time_log(PCMK__LOG_TRACE, "utc-source", dt, + crm_time_log_date + |crm_time_log_timeofday + |crm_time_log_with_timezone); + crm_time_log(PCMK__LOG_TRACE, "utc-target", utc, + crm_time_log_date + |crm_time_log_timeofday + |crm_time_log_with_timezone); return utc; } @@ -182,8 +186,8 @@ crm_time_january1_weekday(int year) int G = YY + YY / 4; int jan1 = 1 + (((((C / 100) % 4) * 5) + G) % 7); - crm_trace("YY=%d, C=%d, G=%d", YY, C, G); - crm_trace("January 1 %.4d: %d", year, jan1); + pcmk__trace("YY=%d, C=%d, G=%d", YY, C, G); + pcmk__trace("January 1 %.4d: %d", year, jan1); return jan1; } @@ -279,7 +283,7 @@ crm_time_log_alias(int log_level, const char *file, const char *function, { char *date_s = crm_time_as_string(date_time, flags); - if (log_level == LOG_STDOUT) { + if (log_level == PCMK__LOG_STDOUT) { printf("%s%s%s\n", (prefix? prefix : ""), (prefix? ": " : ""), date_s); } else { @@ -302,8 +306,8 @@ crm_time_get_sec(int sec, uint32_t *h, uint32_t *m, uint32_t *s) minutes = seconds / 60; seconds -= 60 * minutes; - crm_trace("%d == %.2" PRIu32 ":%.2" PRIu32 ":%.2" PRIu32, - sec, hours, minutes, seconds); + pcmk__trace("%d == %.2" PRIu32 ":%.2" PRIu32 ":%.2" PRIu32, sec, hours, + minutes, seconds); *h = hours; *m = minutes; @@ -405,7 +409,8 @@ crm_time_get_gregorian(const crm_time_t *dt, uint32_t *y, uint32_t *m, *y = dt->years; *m = months; *d = days; - crm_trace("%.4d-%.3d -> %.4d-%.2d-%.2d", dt->years, dt->days, dt->years, months, days); + pcmk__trace("%.4d-%.3d -> %.4d-%.2d-%.2d", dt->years, dt->days, dt->years, + months, days); return TRUE; } @@ -437,7 +442,7 @@ crm_time_get_isoweek(const crm_time_t *dt, uint32_t *y, uint32_t *w, /* 7. Find if Y M D falls in YearNumber Y-1, WeekNumber 52 or 53 */ if (dt->days <= (8 - jan1) && jan1 > 4) { - crm_trace("year--, jan1=%d", jan1); + pcmk__trace("year--, jan1=%d", jan1); year_num = dt->years - 1; *w = crm_time_weeks_in_year(year_num); @@ -451,7 +456,8 @@ crm_time_get_isoweek(const crm_time_t *dt, uint32_t *y, uint32_t *w, int correction = 4 - *d; if ((dmax - dt->days) < correction) { - crm_trace("year++, jan1=%d, i=%d vs. %d", jan1, dmax - dt->days, correction); + pcmk__trace("year++, jan1=%d, i=%d vs. %d", jan1, (dmax - dt->days), + correction); year_num = dt->years + 1; *w = 1; } @@ -468,8 +474,8 @@ crm_time_get_isoweek(const crm_time_t *dt, uint32_t *y, uint32_t *w, } *y = year_num; - crm_trace("Converted %.4d-%.3d to %.4" PRIu32 "-W%.2" PRIu32 "-%" PRIu32, - dt->years, dt->days, *y, *w, *d); + pcmk__trace("Converted %.4d-%.3d to %.4" PRIu32 "-W%.2" PRIu32 "-%" PRIu32, + dt->years, dt->days, *y, *w, *d); return TRUE; } @@ -604,22 +610,22 @@ time_as_string_common(const crm_time_t *dt, int usec, uint32_t flags, * These never depend on time zone. */ - if (pcmk_is_set(flags, crm_time_log_duration)) { - crm_duration_as_string(dt, usec, pcmk_is_set(flags, crm_time_usecs), + if (pcmk__is_set(flags, crm_time_log_duration)) { + crm_duration_as_string(dt, usec, pcmk__is_set(flags, crm_time_usecs), result); return; } - if (pcmk_any_flags_set(flags, crm_time_seconds|crm_time_epoch)) { + if (pcmk__any_flags_set(flags, crm_time_seconds|crm_time_epoch)) { long long seconds = 0; - if (pcmk_is_set(flags, crm_time_seconds)) { + if (pcmk__is_set(flags, crm_time_seconds)) { seconds = crm_time_get_seconds(dt); } else { seconds = crm_time_get_seconds_since_epoch(dt); } - if (pcmk_is_set(flags, crm_time_usecs)) { + if (pcmk__is_set(flags, crm_time_usecs)) { sec_usec_as_string(seconds, usec, result, &offset); } else { snprintf(result, DATE_MAX, "%lld", seconds); @@ -628,16 +634,16 @@ time_as_string_common(const crm_time_t *dt, int usec, uint32_t flags, } // Convert to UTC if local timezone was not requested - if ((dt->offset != 0) && !pcmk_is_set(flags, crm_time_log_with_timezone)) { - crm_trace("UTC conversion"); + if ((dt->offset != 0) && !pcmk__is_set(flags, crm_time_log_with_timezone)) { + pcmk__trace("UTC conversion"); utc = crm_get_utc_time(dt); dt = utc; } // As readable string - if (pcmk_is_set(flags, crm_time_log_date)) { - if (pcmk_is_set(flags, crm_time_weeks)) { // YYYY-WW-D + if (pcmk__is_set(flags, crm_time_log_date)) { + if (pcmk__is_set(flags, crm_time_weeks)) { // YYYY-WW-D uint32_t y = 0; uint32_t w = 0; uint32_t d = 0; @@ -648,7 +654,7 @@ time_as_string_common(const crm_time_t *dt, int usec, uint32_t flags, y, w, d); } - } else if (pcmk_is_set(flags, crm_time_ordinal)) { // YYYY-DDD + } else if (pcmk__is_set(flags, crm_time_ordinal)) { // YYYY-DDD uint32_t y = 0; uint32_t d = 0; @@ -670,7 +676,7 @@ time_as_string_common(const crm_time_t *dt, int usec, uint32_t flags, } } - if (pcmk_is_set(flags, crm_time_log_timeofday)) { + if (pcmk__is_set(flags, crm_time_log_timeofday)) { uint32_t h = 0, m = 0, s = 0; if (offset > 0) { @@ -682,13 +688,13 @@ time_as_string_common(const crm_time_t *dt, int usec, uint32_t flags, "%.2" PRIu32 ":%.2" PRIu32 ":%.2" PRIu32, h, m, s); - if (pcmk_is_set(flags, crm_time_usecs)) { + if (pcmk__is_set(flags, crm_time_usecs)) { offset += snprintf(result + offset, DATE_MAX - offset, ".%06" PRIu32, QB_ABS(usec)); } } - if (pcmk_is_set(flags, crm_time_log_with_timezone) + if (pcmk__is_set(flags, crm_time_log_with_timezone) && (dt->offset != 0)) { crm_time_get_sec(dt->offset, &h, &m, &s); offset += snprintf(result + offset, DATE_MAX - offset, @@ -748,31 +754,34 @@ crm_time_parse_sec(const char *time_str, int *result) &hour, &minute, &second); } if (rc == 0) { - crm_err("%s is not a valid ISO 8601 time specification", time_str); + pcmk__err("%s is not a valid ISO 8601 time specification", time_str); errno = EINVAL; return FALSE; } - crm_trace("Got valid time: %.2" PRIu32 ":%.2" PRIu32 ":%.2" PRIu32, - hour, minute, second); + pcmk__trace("Got valid time: %.2" PRIu32 ":%.2" PRIu32 ":%.2" PRIu32, + hour, minute, second); if ((hour == 24) && (minute == 0) && (second == 0)) { // Equivalent to 00:00:00 of next day, return number of seconds in day } else if (hour >= 24) { - crm_err("%s is not a valid ISO 8601 time specification " - "because %" PRIu32 " is not a valid hour", time_str, hour); + pcmk__err("%s is not a valid ISO 8601 time specification " + "because %" PRIu32 " is not a valid hour", + time_str, hour); errno = EINVAL; return FALSE; } if (minute >= 60) { - crm_err("%s is not a valid ISO 8601 time specification " - "because %" PRIu32 " is not a valid minute", time_str, minute); + pcmk__err("%s is not a valid ISO 8601 time specification " + "because %" PRIu32 " is not a valid minute", + time_str, minute); errno = EINVAL; return FALSE; } if (second >= 60) { - crm_err("%s is not a valid ISO 8601 time specification " - "because %" PRIu32 " is not a valid second", time_str, second); + pcmk__err("%s is not a valid ISO 8601 time specification " + "because %" PRIu32 " is not a valid second", + time_str, second); errno = EINVAL; return FALSE; } @@ -866,8 +875,8 @@ crm_time_parse(const char *time_str, crm_time_t *a_time) return FALSE; } crm_time_get_sec(a_time->offset, &h, &m, &s); - crm_trace("Got tz: %c%2." PRIu32 ":%.2" PRIu32, - (a_time->offset < 0)? '-' : '+', h, m); + pcmk__trace("Got tz: %c%2." PRIu32 ":%.2" PRIu32, + (a_time->offset < 0)? '-' : '+', h, m); if (a_time->seconds == DAY_SECONDS) { // 24:00:00 == 00:00:00 of next day @@ -900,7 +909,7 @@ parse_date(const char *date_str) int rc = 0; if (pcmk__str_empty(date_str)) { - crm_err("No ISO 8601 date/time specification given"); + pcmk__err("No ISO 8601 date/time specification given"); goto invalid; } @@ -924,7 +933,8 @@ parse_date(const char *date_str) || isspace(date_str[5]))) { dt->days = 1; dt->years = 1970; - crm_time_log(LOG_TRACE, "Unpacked", dt, crm_time_log_date | crm_time_log_timeofday); + crm_time_log(PCMK__LOG_TRACE, "Unpacked", dt, + crm_time_log_date|crm_time_log_timeofday); return dt; } @@ -938,26 +948,27 @@ parse_date(const char *date_str) } if (rc == 3) { if ((month < 1U) || (month > 12U)) { - crm_err("'%s' is not a valid ISO 8601 date/time specification " - "because '%" PRIu32 "' is not a valid month", - date_str, month); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification " + "because '%" PRIu32 "' is not a valid month", + date_str, month); goto invalid; } else if ((year < 1U) || (year > INT_MAX)) { - crm_err("'%s' is not a valid ISO 8601 date/time specification " - "because '%" PRIu32 "' is not a valid year", - date_str, year); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification " + "because '%" PRIu32 "' is not a valid year", + date_str, year); goto invalid; } else if ((day < 1) || (day > INT_MAX) || (day > crm_time_days_in_month(month, year))) { - crm_err("'%s' is not a valid ISO 8601 date/time specification " - "because '%" PRIu32 "' is not a valid day of the month", - date_str, day); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification " + "because '%" PRIu32 "' is not a valid day of the month", + date_str, day); goto invalid; } else { dt->years = year; dt->days = get_ordinal_days(year, month, day); - crm_trace("Parsed Gregorian date '%.4" PRIu32 "-%.3d' " - "from date string '%s'", year, dt->days, date_str); + pcmk__trace("Parsed Gregorian date '%.4" PRIu32 "-%.3d' from date " + "string '%s'", + year, dt->days, date_str); } goto parse_time; } @@ -966,19 +977,19 @@ parse_date(const char *date_str) rc = sscanf(date_str, "%" SCNu32 "-%" SCNu32, &year, &day); if (rc == 2) { if ((year < 1U) || (year > INT_MAX)) { - crm_err("'%s' is not a valid ISO 8601 date/time specification " - "because '%" PRIu32 "' is not a valid year", - date_str, year); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification " + "because '%" PRIu32 "' is not a valid year", + date_str, year); goto invalid; } else if ((day < 1U) || (day > INT_MAX) || (day > year_days(year))) { - crm_err("'%s' is not a valid ISO 8601 date/time specification " - "because '%" PRIu32 "' is not a valid day of year %" - PRIu32 " (1-%d)", - date_str, day, year, year_days(year)); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification " + "because '%" PRIu32 "' is not a valid day of year %" + PRIu32 " (1-%d)", + date_str, day, year, year_days(year)); goto invalid; } - crm_trace("Parsed ordinal year %d and days %d from date string '%s'", - year, day, date_str); + pcmk__trace("Parsed ordinal year %d and days %d from date string '%s'", + year, day, date_str); dt->days = day; dt->years = year; goto parse_time; @@ -989,15 +1000,15 @@ parse_date(const char *date_str) &year, &week, &day); if (rc == 3) { if ((week < 1U) || (week > crm_time_weeks_in_year(year))) { - crm_err("'%s' is not a valid ISO 8601 date/time specification " - "because '%" PRIu32 "' is not a valid week of year %" - PRIu32 " (1-%d)", - date_str, week, year, crm_time_weeks_in_year(year)); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification " + "because '%" PRIu32 "' is not a valid week of year %" + PRIu32 " (1-%d)", + date_str, week, year, crm_time_weeks_in_year(year)); goto invalid; } else if ((day < 1U) || (day > 7U)) { - crm_err("'%s' is not a valid ISO 8601 date/time specification " - "because '%" PRIu32 "' is not a valid day of the week", - date_str, day); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification " + "because '%" PRIu32 "' is not a valid day of the week", + date_str, day); goto invalid; } else { /* @@ -1013,9 +1024,9 @@ parse_date(const char *date_str) */ int jan1 = crm_time_january1_weekday(year); - crm_trace("Parsed year %" PRIu32 " (Jan 1 = %d), week %" PRIu32 - ", and day %" PRIu32 " from date string '%s'", - year, jan1, week, day, date_str); + pcmk__trace("Parsed year %" PRIu32 " (Jan 1 = %d), week %" PRIu32 + ", and day %" PRIu32 " from date string '%s'", + year, jan1, week, day, date_str); dt->years = year; crm_time_add_days(dt, (week - 1) * 7); @@ -1031,7 +1042,7 @@ parse_date(const char *date_str) goto parse_time; } - crm_err("'%s' is not a valid ISO 8601 date/time specification", date_str); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification", date_str); goto invalid; parse_time: @@ -1048,10 +1059,11 @@ parse_date(const char *date_str) goto invalid; } - crm_time_log(LOG_TRACE, "Unpacked", dt, crm_time_log_date | crm_time_log_timeofday); + crm_time_log(PCMK__LOG_TRACE, "Unpacked", dt, + crm_time_log_date|crm_time_log_timeofday); if (crm_time_check(dt) == FALSE) { - crm_err("'%s' is not a valid ISO 8601 date/time specification", - date_str); + pcmk__err("'%s' is not a valid ISO 8601 date/time specification", + date_str); goto invalid; } return dt; @@ -1124,17 +1136,19 @@ crm_time_parse_duration(const char *period_s) crm_time_t *diff = NULL; if (pcmk__str_empty(period_s)) { - crm_err("No ISO 8601 time duration given"); + pcmk__err("No ISO 8601 time duration given"); goto invalid; } if (period_s[0] != 'P') { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because it does not start with a 'P'", period_s); + pcmk__err("'%s' is not a valid ISO 8601 time duration because it does " + "not start with a 'P'", + period_s); goto invalid; } if ((period_s[1] == '\0') || isspace(period_s[1])) { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because nothing follows 'P'", period_s); + pcmk__err("'%s' is not a valid ISO 8601 time duration because nothing " + "follows 'P'", + period_s); goto invalid; } @@ -1159,8 +1173,9 @@ crm_time_parse_duration(const char *period_s) // An integer must be next rc = parse_int(current, &an_int); if (rc == 0) { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because no valid integer at '%s'", period_s, current); + pcmk__err("'%s' is not a valid ISO 8601 time duration because no " + "valid integer at '%s'", + period_s, current); goto invalid; } current += rc; @@ -1177,10 +1192,10 @@ crm_time_parse_duration(const char *period_s) } else { // Minutes result = diff->seconds + an_int * 60LL; if ((result < INT_MIN) || (result > INT_MAX)) { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because integer at '%s' is too %s", - period_s, current - rc, - ((result > 0)? "large" : "small")); + pcmk__err("'%s' is not a valid ISO 8601 time duration " + "because integer at '%s' is too %s", + period_s, (current - rc), + ((result > 0)? "large" : "small")); goto invalid; } else { diff->seconds = (int) result; @@ -1192,10 +1207,10 @@ crm_time_parse_duration(const char *period_s) case 'W': result = diff->days + an_int * 7LL; if ((result < INT_MIN) || (result > INT_MAX)) { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because integer at '%s' is too %s", - period_s, current - rc, - ((result > 0)? "large" : "small")); + pcmk__err("'%s' is not a valid ISO 8601 time duration " + "because integer at '%s' is too %s", + period_s, (current - rc), + ((result > 0)? "large" : "small")); goto invalid; } else { diff->days = (int) result; @@ -1205,10 +1220,10 @@ crm_time_parse_duration(const char *period_s) case 'D': result = diff->days + (long long) an_int; if ((result < INT_MIN) || (result > INT_MAX)) { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because integer at '%s' is too %s", - period_s, current - rc, - ((result > 0)? "large" : "small")); + pcmk__err("'%s' is not a valid ISO 8601 time duration " + "because integer at '%s' is too %s", + period_s, (current - rc), + ((result > 0)? "large" : "small")); goto invalid; } else { diff->days = (int) result; @@ -1218,10 +1233,10 @@ crm_time_parse_duration(const char *period_s) case 'H': result = diff->seconds + (long long) an_int * HOUR_SECONDS; if ((result < INT_MIN) || (result > INT_MAX)) { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because integer at '%s' is too %s", - period_s, current - rc, - ((result > 0)? "large" : "small")); + pcmk__err("'%s' is not a valid ISO 8601 time duration " + "because integer at '%s' is too %s", + period_s, (current - rc), + ((result > 0)? "large" : "small")); goto invalid; } else { diff->seconds = (int) result; @@ -1231,10 +1246,10 @@ crm_time_parse_duration(const char *period_s) case 'S': result = diff->seconds + (long long) an_int; if ((result < INT_MIN) || (result > INT_MAX)) { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because integer at '%s' is too %s", - period_s, current - rc, - ((result > 0)? "large" : "small")); + pcmk__err("'%s' is not a valid ISO 8601 time duration " + "because integer at '%s' is too %s", + period_s, (current - rc), + ((result > 0)? "large" : "small")); goto invalid; } else { diff->seconds = (int) result; @@ -1242,21 +1257,23 @@ crm_time_parse_duration(const char *period_s) break; case '\0': - crm_err("'%s' is not a valid ISO 8601 time duration " - "because no units after %d", period_s, an_int); + pcmk__err("'%s' is not a valid ISO 8601 time duration because " + "no units after %d", + period_s, an_int); goto invalid; default: - crm_err("'%s' is not a valid ISO 8601 time duration " - "because '%c' is not a valid time unit", - period_s, current[0]); + pcmk__err("'%s' is not a valid ISO 8601 time duration because " + "'%c' is not a valid time unit", + period_s, current[0]); goto invalid; } } if (!crm_time_is_defined(diff)) { - crm_err("'%s' is not a valid ISO 8601 time duration " - "because no amounts and units given", period_s); + pcmk__err("'%s' is not a valid ISO 8601 time duration because no " + "amounts and units given", + period_s); goto invalid; } @@ -1286,7 +1303,7 @@ crm_time_parse_period(const char *period_str) crm_time_period_t *period = NULL; if (pcmk__str_empty(period_str)) { - crm_err("No ISO 8601 time period given"); + pcmk__err("No ISO 8601 time period given"); goto invalid; } @@ -1310,9 +1327,9 @@ crm_time_parse_period(const char *period_str) ++period_str; if (period_str[0] == 'P') { if (period->diff != NULL) { - crm_err("'%s' is not a valid ISO 8601 time period " - "because it has two durations", - original); + pcmk__err("'%s' is not a valid ISO 8601 time period because it " + "has two durations", + original); goto invalid; } period->diff = crm_time_parse_duration(period_str); @@ -1332,9 +1349,9 @@ crm_time_parse_period(const char *period_str) } else { // Only start given - crm_err("'%s' is not a valid ISO 8601 time period " - "because it has no duration or ending time", - original); + pcmk__err("'%s' is not a valid ISO 8601 time period because it has no " + "duration or ending time", + original); goto invalid; } @@ -1346,13 +1363,15 @@ crm_time_parse_period(const char *period_str) } if (crm_time_check(period->start) == FALSE) { - crm_err("'%s' is not a valid ISO 8601 time period " - "because the start is invalid", period_str); + pcmk__err("'%s' is not a valid ISO 8601 time period because the start " + "is invalid", + period_str); goto invalid; } if (crm_time_check(period->end) == FALSE) { - crm_err("'%s' is not a valid ISO 8601 time period " - "because the end is invalid", period_str); + pcmk__err("'%s' is not a valid ISO 8601 time period because the end is " + "invalid", + period_str); goto invalid; } return period; @@ -1383,7 +1402,7 @@ crm_time_free_period(crm_time_period_t *period) void crm_time_set(crm_time_t *target, const crm_time_t *source) { - crm_trace("target=%p, source=%p", target, source); + pcmk__trace("target=%p, source=%p", target, source); CRM_CHECK(target != NULL && source != NULL, return); @@ -1393,10 +1412,14 @@ crm_time_set(crm_time_t *target, const crm_time_t *source) target->seconds = source->seconds; target->offset = source->offset; - crm_time_log(LOG_TRACE, "source", source, - crm_time_log_date | crm_time_log_timeofday | crm_time_log_with_timezone); - crm_time_log(LOG_TRACE, "target", target, - crm_time_log_date | crm_time_log_timeofday | crm_time_log_with_timezone); + crm_time_log(PCMK__LOG_TRACE, "source", source, + crm_time_log_date + |crm_time_log_timeofday + |crm_time_log_with_timezone); + crm_time_log(PCMK__LOG_TRACE, "target", target, + crm_time_log_date + |crm_time_log_timeofday + |crm_time_log_with_timezone); } static void @@ -1437,8 +1460,8 @@ ha_set_tm_time(crm_time_t *target, const struct tm *source) /* tm_gmtoff == offset from UTC in seconds */ h_offset = GMTOFF(source) / HOUR_SECONDS; m_offset = (GMTOFF(source) - (HOUR_SECONDS * h_offset)) / 60; - crm_trace("Time offset is %lds (%.2d:%.2d)", - GMTOFF(source), h_offset, m_offset); + pcmk__trace("Time offset is %lds (%.2d:%.2d)", GMTOFF(source), h_offset, + m_offset); target->offset += HOUR_SECONDS * h_offset; target->offset += 60 * m_offset; @@ -1627,8 +1650,7 @@ pcmk__add_time_from_xml(crm_time_t *t, enum pcmk__time_component component, return pcmk_rc_ok; } - if (pcmk__scan_ll(crm_element_value(xml, attr), &value, - 0LL) != pcmk_rc_ok) { + if (pcmk__scan_ll(pcmk__xe_get(xml, attr), &value, 0LL) != pcmk_rc_ok) { return pcmk_rc_unpack_error; } @@ -1719,17 +1741,15 @@ crm_time_check(const crm_time_t *dt) && (dt->seconds >= 0) && (dt->seconds < DAY_SECONDS); } -#define do_cmp_field(l, r, field) \ - if(rc == 0) { \ - if(l->field > r->field) { \ - crm_trace("%s: %d > %d", \ - #field, l->field, r->field); \ - rc = 1; \ - } else if(l->field < r->field) { \ - crm_trace("%s: %d < %d", \ - #field, l->field, r->field); \ - rc = -1; \ - } \ +#define do_cmp_field(l, r, field) \ + if (rc == 0) { \ + if (l->field > r->field) { \ + pcmk__trace("%s: %d > %d", #field, l->field, r->field); \ + rc = 1; \ + } else if (l->field < r->field) { \ + pcmk__trace("%s: %d < %d", #field, l->field, r->field); \ + rc = -1; \ + } \ } int @@ -1769,8 +1789,8 @@ crm_time_add_seconds(crm_time_t *a_time, int extra) pcmk__assert(a_time != NULL); - crm_trace("Adding %d seconds (including %d whole day%s) to %d", - extra, days, pcmk__plural_s(days), a_time->seconds); + pcmk__trace("Adding %d seconds (including %d whole day%s) to %d", extra, + days, pcmk__plural_s(days), a_time->seconds); a_time->seconds += extra % DAY_SECONDS; @@ -1800,7 +1820,8 @@ crm_time_add_days(crm_time_t *a_time, int extra) { pcmk__assert(a_time != NULL); - crm_trace("Adding %d days to %.4d-%.3d", extra, a_time->years, a_time->days); + pcmk__trace("Adding %d days to %.4d-%.3d", extra, a_time->years, + a_time->days); if (extra > 0) { while ((a_time->days + (long long) extra) > ydays(a_time)) { @@ -1833,8 +1854,8 @@ crm_time_add_months(crm_time_t * a_time, int extra) uint32_t y, m, d, dmax; crm_time_get_gregorian(a_time, &y, &m, &d); - crm_trace("Adding %d months to %.4" PRIu32 "-%.2" PRIu32 "-%.2" PRIu32, - extra, y, m, d); + pcmk__trace("Adding %d months to %.4" PRIu32 "-%.2" PRIu32 "-%.2" PRIu32, + extra, y, m, d); if (extra > 0) { for (lpc = extra; lpc > 0; lpc--) { @@ -1860,13 +1881,13 @@ crm_time_add_months(crm_time_t * a_time, int extra) d = dmax; } - crm_trace("Calculated %.4" PRIu32 "-%.2" PRIu32 "-%.2" PRIu32, y, m, d); + pcmk__trace("Calculated %.4" PRIu32 "-%.2" PRIu32 "-%.2" PRIu32, y, m, d); a_time->years = y; a_time->days = get_ordinal_days(y, m, d); crm_time_get_gregorian(a_time, &y, &m, &d); - crm_trace("Got %.4" PRIu32 "-%.2" PRIu32 "-%.2" PRIu32, y, m, d); + pcmk__trace("Got %.4" PRIu32 "-%.2" PRIu32 "-%.2" PRIu32, y, m, d); } void diff --git a/lib/common/logging.c b/lib/common/logging.c index 022a4770be2..9900bc65a21 100644 --- a/lib/common/logging.c +++ b/lib/common/logging.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -225,7 +225,7 @@ chown_logfile(const char *filename, int logfd) uid_t pcmk_uid = 0; gid_t pcmk_gid = 0; struct stat st; - int rc; + int rc = pcmk_rc_ok; // Get the log file's current ownership and permissions if (fstat(logfd, &st) < 0) { @@ -234,11 +234,11 @@ chown_logfile(const char *filename, int logfd) // Any other errors don't prevent file from being used as log - rc = pcmk_daemon_user(&pcmk_uid, &pcmk_gid); - if (rc != pcmk_ok) { - rc = pcmk_legacy2rc(rc); - crm_warn("Not changing '%s' ownership because user information " - "unavailable: %s", filename, pcmk_rc_str(rc)); + rc = pcmk__daemon_user(&pcmk_uid, &pcmk_gid); + if (rc != pcmk_rc_ok) { + pcmk__warn("Not changing '%s' ownership because user information " + "unavailable: %s", + filename, pcmk_rc_str(rc)); return pcmk_rc_ok; } if ((st.st_gid == pcmk_gid) @@ -246,8 +246,8 @@ chown_logfile(const char *filename, int logfd) return pcmk_rc_ok; } if (fchown(logfd, pcmk_uid, pcmk_gid) < 0) { - crm_warn("Couldn't change '%s' ownership to user %s gid %d: %s", - filename, CRM_DAEMON_USER, pcmk_gid, strerror(errno)); + pcmk__warn("Couldn't change '%s' ownership to user %s gid %d: %s", + filename, CRM_DAEMON_USER, pcmk_gid, strerror(errno)); } return pcmk_rc_ok; } @@ -267,8 +267,8 @@ chmod_logfile(const char *filename, int logfd) } } if ((filemode != 0) && (fchmod(logfd, filemode) < 0)) { - crm_warn("Couldn't change '%s' mode to %04o: %s", - filename, filemode, strerror(errno)); + pcmk__warn("Couldn't change '%s' mode to %04o: %s", filename, filemode, + strerror(errno)); } } @@ -366,15 +366,15 @@ pcmk__add_logfile(const char *filename) logfile = fopen(filename, "a"); if (logfile == NULL) { rc = errno; - crm_warn("Logging to '%s' is disabled: %s " QB_XS " uid=%u gid=%u", - filename, strerror(rc), geteuid(), getegid()); + pcmk__warn("Logging to '%s' is disabled: %s " QB_XS " uid=%u gid=%u", + filename, strerror(rc), geteuid(), getegid()); return rc; } rc = set_logfile_permissions(filename, logfile); if (rc != pcmk_rc_ok) { - crm_warn("Logging to '%s' is disabled: %s " QB_XS " permissions", - filename, strerror(rc)); + pcmk__warn("Logging to '%s' is disabled: %s " QB_XS " permissions", + filename, strerror(rc)); fclose(logfile); return rc; } @@ -383,8 +383,8 @@ pcmk__add_logfile(const char *filename) fclose(logfile); fd = qb_log_file_open(filename); if (fd < 0) { - crm_warn("Logging to '%s' is disabled: %s " QB_XS " qb_log_file_open", - filename, strerror(-fd)); + pcmk__warn("Logging to '%s' is disabled: %s " QB_XS " qb_log_file_open", + filename, strerror(-fd)); return -fd; // == +errno } @@ -393,11 +393,11 @@ pcmk__add_logfile(const char *filename) setenv_logfile(filename); } else if (default_fd >= 0) { - crm_notice("Switching logging to %s", filename); + pcmk__notice("Switching logging to %s", filename); disable_logfile(default_fd); } - crm_notice("Additional logging available in %s", filename); + pcmk__notice("Additional logging available in %s", filename); enable_logfile(fd); have_logfile = true; return pcmk_rc_ok; @@ -450,10 +450,9 @@ crm_control_blackbox(int nsig, bool enable) if (blackbox_file_prefix == NULL) { pid_t pid = getpid(); - blackbox_file_prefix = crm_strdup_printf("%s/%s-%lu", - CRM_BLACKBOX_DIR, - crm_system_name, - (unsigned long) pid); + blackbox_file_prefix = pcmk__assert_asprintf(CRM_BLACKBOX_DIR "/%s-%lu", + crm_system_name, + (unsigned long) pid); } if (enable && qb_log_ctl(QB_LOG_BLACKBOX, QB_LOG_CONF_STATE_GET, 0) != QB_LOG_STATE_ENABLED) { @@ -465,7 +464,7 @@ crm_control_blackbox(int nsig, bool enable) qb_log_ctl(lpc, QB_LOG_CONF_FILE_SYNC, QB_TRUE); } - crm_notice("Initiated blackbox recorder: %s", blackbox_file_prefix); + pcmk__notice("Initiated blackbox recorder: %s", blackbox_file_prefix); /* Save to disk on abnormal termination */ crm_signal_handler(SIGSEGV, crm_trigger_blackbox); @@ -478,8 +477,9 @@ crm_control_blackbox(int nsig, bool enable) blackbox_trigger = qb_log_custom_open(blackbox_logger, NULL, NULL, NULL); qb_log_ctl(blackbox_trigger, QB_LOG_CONF_ENABLED, QB_TRUE); - crm_trace("Trigger: %d is %d %d", blackbox_trigger, - qb_log_ctl(blackbox_trigger, QB_LOG_CONF_STATE_GET, 0), QB_LOG_STATE_ENABLED); + pcmk__trace("Trigger: %d is %d %d", blackbox_trigger, + qb_log_ctl(blackbox_trigger, QB_LOG_CONF_STATE_GET, 0), + QB_LOG_STATE_ENABLED); crm_update_callsites(); @@ -540,14 +540,18 @@ crm_write_blackbox(int nsig, const struct qb_log_callsite *cs) snprintf(buffer, NAME_MAX, "%s.%d", blackbox_file_prefix, counter++); if (nsig == SIGTRAP) { - crm_notice("Blackbox dump requested, please see %s for contents", buffer); + pcmk__notice("Blackbox dump requested, please see %s for " + "contents", + buffer); } else if (cs) { syslog(LOG_NOTICE, "Problem detected at %s:%d (%s), please see %s for additional details", cs->function, cs->lineno, cs->filename, buffer); } else { - crm_notice("Problem detected, please see %s for additional details", buffer); + pcmk__notice("Problem detected, please see %s for additional " + "details", + buffer); } last = now; @@ -600,7 +604,8 @@ crm_log_filter_source(int source, const char *trace_files, const char *trace_fns qb_bit_set(cs->targets, source); } else if (trace_blackbox) { - char *key = crm_strdup_printf("%s:%d", cs->function, cs->lineno); + char *key = pcmk__assert_asprintf("%s:%d", cs->function, + cs->lineno); if (strstr(trace_blackbox, key) != NULL) { qb_bit_set(cs->targets, source); @@ -673,7 +678,8 @@ crm_log_filter(struct qb_log_callsite *cs) snprintf(token, sizeof(token), "%.*s", (int)(next - offset), offset); tag = g_quark_from_string(token); - crm_info("Created GQuark %u from token '%s' in '%s'", tag, token, trace_tags); + pcmk__info("Created GQuark %u from token '%s' in '%s'", tag, + token, trace_tags); if (next[0] != 0) { next++; @@ -722,16 +728,19 @@ crm_is_callsite_active(struct qb_log_callsite *cs, uint8_t level, uint32_t tags) void crm_update_callsites(void) { - static gboolean log = TRUE; + static bool log = true; if (log) { - log = FALSE; - crm_debug - ("Enabling callsites based on priority=%d, files=%s, functions=%s, formats=%s, tags=%s", - crm_log_level, pcmk__env_option(PCMK__ENV_TRACE_FILES), - pcmk__env_option(PCMK__ENV_TRACE_FUNCTIONS), - pcmk__env_option(PCMK__ENV_TRACE_FORMATS), - pcmk__env_option(PCMK__ENV_TRACE_TAGS)); + log = false; + pcmk__debug("Enabling callsites based on priority=%d, files=%s, " + "functions=%s, formats=%s, tags=%s", + crm_log_level, + pcmk__s(pcmk__env_option(PCMK__ENV_TRACE_FILES), ""), + pcmk__s(pcmk__env_option(PCMK__ENV_TRACE_FUNCTIONS), + ""), + pcmk__s(pcmk__env_option(PCMK__ENV_TRACE_FORMATS), + ""), + pcmk__s(pcmk__env_option(PCMK__ENV_TRACE_TAGS), "")); } qb_log_filter_fn_set(crm_log_filter); } @@ -739,7 +748,7 @@ crm_update_callsites(void) static gboolean crm_tracing_enabled(void) { - return (crm_log_level == LOG_TRACE) + return (crm_log_level == PCMK__LOG_TRACE) || (pcmk__env_option(PCMK__ENV_TRACE_FILES) != NULL) || (pcmk__env_option(PCMK__ENV_TRACE_FUNCTIONS) != NULL) || (pcmk__env_option(PCMK__ENV_TRACE_FORMATS) != NULL) @@ -926,8 +935,8 @@ crm_log_init(const char *entity, uint8_t level, gboolean daemon, gboolean to_std pcmk__is_daemon = daemon; crm_log_preinit(entity, argc, argv); - if (level > LOG_TRACE) { - level = LOG_TRACE; + if (level > PCMK__LOG_TRACE) { + level = PCMK__LOG_TRACE; } if(level > crm_log_level) { crm_log_level = level; @@ -993,7 +1002,7 @@ crm_log_init(const char *entity, uint8_t level, gboolean daemon, gboolean to_std } /* Summary */ - crm_trace("Quiet: %d, facility %s", quiet, f_copy); + pcmk__trace("Quiet: %d, facility %s", quiet, f_copy); pcmk__env_option(PCMK__ENV_LOGFILE); pcmk__env_option(PCMK__ENV_LOGFACILITY); @@ -1006,7 +1015,7 @@ crm_log_init(const char *entity, uint8_t level, gboolean daemon, gboolean to_std const char *user = getenv("USER"); if (user != NULL && !pcmk__strcase_any_of(user, "root", CRM_DAEMON_USER, NULL)) { - crm_trace("Not switching to corefile directory for %s", user); + pcmk__trace("Not switching to corefile directory for %s", user); pcmk__is_daemon = false; } } @@ -1019,13 +1028,14 @@ crm_log_init(const char *entity, uint8_t level, gboolean daemon, gboolean to_std crm_perror(LOG_ERR, "Cannot get name for uid: %d", user); } else if (!pcmk__strcase_any_of(pwent->pw_name, "root", CRM_DAEMON_USER, NULL)) { - crm_trace("Don't change active directory for regular user: %s", pwent->pw_name); + pcmk__trace("Don't change active directory for regular user: %s", + pwent->pw_name); } else if (chdir(CRM_CORE_DIR) < 0) { crm_perror(LOG_INFO, "Cannot change active directory to " CRM_CORE_DIR); } else { - crm_info("Changed active directory to " CRM_CORE_DIR); + pcmk__info("Changed active directory to " CRM_CORE_DIR); } /* Original meanings from signal(7) @@ -1054,12 +1064,12 @@ set_crm_log_level(unsigned int level) { unsigned int old = crm_log_level; - if (level > LOG_TRACE) { - level = LOG_TRACE; + if (level > PCMK__LOG_TRACE) { + level = PCMK__LOG_TRACE; } crm_log_level = level; crm_update_callsites(); - crm_trace("New log level: %d", level); + pcmk__trace("New log level: %d", level); return old; } @@ -1121,7 +1131,7 @@ crm_log_args(int argc, char **argv) } logged = true; arg_string = g_strjoinv(" ", argv); - crm_notice("Invoked: %s", arg_string); + pcmk__notice("Invoked: %s", arg_string); g_free(arg_string); } @@ -1132,13 +1142,13 @@ crm_log_output_fn(const char *file, const char *function, int line, int level, c const char *next = NULL; const char *offset = NULL; - if (level == LOG_NEVER) { + if (level == PCMK__LOG_NEVER) { return; } if (output == NULL) { - if (level != LOG_STDOUT) { - level = LOG_TRACE; + if (level != PCMK__LOG_STDOUT) { + level = PCMK__LOG_TRACE; } output = "-- empty --"; } @@ -1178,7 +1188,7 @@ pcmk__cli_init_logging(const char *name, unsigned int verbosity) * \param[in] text Prefix for each line * \param[in] xml XML to log * - * \note This does nothing when \p level is \p LOG_STDOUT. + * \note This does nothing when \p level is \c PCMK__LOG_STDOUT. * \note Do not call this function directly. It should be called only from the * \p do_crm_log_xml() macro. */ @@ -1217,7 +1227,7 @@ pcmk_log_xml_as(const char *file, const char *function, uint32_t line, * \param[in] level Priority at which to log the messages * \param[in] xml XML whose changes to log * - * \note This does nothing when \p level is \c LOG_STDOUT. + * \note This does nothing when \p level is \c PCMK__LOG_STDOUT. */ void pcmk__log_xml_changes_as(const char *file, const char *function, uint32_t line, @@ -1248,7 +1258,7 @@ pcmk__log_xml_changes_as(const char *file, const char *function, uint32_t line, * \param[in] level Priority at which to log the messages * \param[in] patchset XML patchset to log * - * \note This does nothing when \p level is \c LOG_STDOUT. + * \note This does nothing when \p level is \c PCMK__LOG_STDOUT. */ void pcmk__log_xml_patchset_as(const char *file, const char *function, uint32_t line, diff --git a/lib/common/mainloop.c b/lib/common/mainloop.c index 9529d523afa..cbf0abefe65 100644 --- a/lib/common/mainloop.c +++ b/lib/common/mainloop.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -115,7 +115,7 @@ crm_trigger_dispatch(GSource *source, GSourceFunc callback, gpointer userdata) int callback_rc = callback(trig->user_data); if (callback_rc < 0) { - crm_trace("Trigger handler %p not yet complete", trig); + pcmk__trace("Trigger handler %p not yet complete", trig); trig->running = TRUE; } else if (callback_rc == 0) { rc = G_SOURCE_REMOVE; @@ -127,7 +127,7 @@ crm_trigger_dispatch(GSource *source, GSourceFunc callback, gpointer userdata) static void crm_trigger_finalize(GSource * source) { - crm_trace("Trigger %p destroyed", source); + pcmk__trace("Trigger %p destroyed", source); } static GSourceFuncs crm_trigger_funcs = { @@ -163,7 +163,7 @@ mainloop_setup_trigger(GSource * source, int priority, int (*dispatch) (gpointer void mainloop_trigger_complete(crm_trigger_t * trig) { - crm_trace("Trigger handler %p complete", trig); + pcmk__trace("Trigger handler %p complete", trig); trig->running = FALSE; } @@ -251,9 +251,9 @@ crm_signal_dispatch(GSource *source, GSourceFunc callback, gpointer userdata) crm_signal_t *sig = (crm_signal_t *) source; if(sig->signal != SIGCHLD) { - crm_notice("Caught '%s' signal " QB_XS " %d (%s handler)", - strsignal(sig->signal), sig->signal, - (sig->handler? "invoking" : "no")); + pcmk__notice("Caught '%s' signal " QB_XS " %d (%s handler)", + strsignal(sig->signal), sig->signal, + ((sig->handler != NULL)? "invoking" : "no")); } sig->trigger.trigger = FALSE; @@ -308,8 +308,8 @@ crm_signal_handler(int sig, sighandler_t dispatch) struct sigaction old; if (sigemptyset(&mask) < 0) { - crm_err("Could not set handler for signal %d: %s", - sig, pcmk_rc_str(errno)); + pcmk__err("Could not set handler for signal %d: %s", sig, + pcmk_rc_str(errno)); return SIG_ERR; } @@ -319,8 +319,8 @@ crm_signal_handler(int sig, sighandler_t dispatch) sa.sa_mask = mask; if (sigaction(sig, &sa, &old) < 0) { - crm_err("Could not set handler for signal %d: %s", - sig, pcmk_rc_str(errno)); + pcmk__err("Could not set handler for signal %d: %s", sig, + pcmk_rc_str(errno)); return SIG_ERR; } return old.sa_handler; @@ -333,7 +333,7 @@ mainloop_destroy_signal_entry(int sig) if (tmp != NULL) { crm_signals[sig] = NULL; - crm_trace("Unregistering mainloop handler for signal %d", sig); + pcmk__trace("Unregistering mainloop handler for signal %d", sig); mainloop_destroy_trigger((crm_trigger_t *) tmp); } } @@ -364,15 +364,15 @@ mainloop_add_signal(int sig, void (*dispatch) (int sig)) } if (sig >= NSIG || sig < 0) { - crm_err("Signal %d is out of range", sig); + pcmk__err("Signal %d is out of range", sig); return FALSE; } else if (crm_signals[sig] != NULL && crm_signals[sig]->handler == dispatch) { - crm_trace("Signal handler for %d is already installed", sig); + pcmk__trace("Signal handler for %d is already installed", sig); return TRUE; } else if (crm_signals[sig] != NULL) { - crm_err("Different signal handler for %d is already installed", sig); + pcmk__err("Different signal handler for %d is already installed", sig); return FALSE; } @@ -397,7 +397,7 @@ gboolean mainloop_destroy_signal(int sig) { if (sig >= NSIG || sig < 0) { - crm_err("Signal %d is out of range", sig); + pcmk__err("Signal %d is out of range", sig); return FALSE; } else if (crm_signal_handler(sig, NULL) == SIG_ERR) { @@ -444,7 +444,7 @@ gio_read_socket(GIOChannel * gio, GIOCondition condition, gpointer data) struct gio_to_qb_poll *adaptor = (struct gio_to_qb_poll *)data; gint fd = g_io_channel_unix_get_fd(gio); - crm_trace("%p.%d %d", data, fd, condition); + pcmk__trace("%p.%d %d", data, fd, condition); /* if this assert get's hit, then there is a race condition between * when we destroy a fd and when mainloop actually gives it up */ @@ -462,7 +462,7 @@ gio_poll_destroy(gpointer data) pcmk__assert(adaptor->is_used >= 0); if (adaptor->is_used == 0) { - crm_trace("Marking adaptor %p unused", adaptor); + pcmk__trace("Marking adaptor %p unused", adaptor); adaptor->source = 0; } } @@ -514,25 +514,25 @@ gio_poll_dispatch_update(enum qb_loop_priority p, int32_t fd, int32_t evts, res = qb_array_index(gio_map, fd, (void **)&adaptor); if (res < 0) { - crm_err("Array lookup failed for fd=%d: %d", fd, res); + pcmk__err("Array lookup failed for fd=%d: %d", fd, res); return res; } - crm_trace("Adding fd=%d to mainloop as adaptor %p", fd, adaptor); + pcmk__trace("Adding fd=%d to mainloop as adaptor %p", fd, adaptor); if (add && adaptor->source) { - crm_err("Adaptor for descriptor %d is still in-use", fd); + pcmk__err("Adaptor for descriptor %d is still in-use", fd); return -EEXIST; } if (!add && !adaptor->is_used) { - crm_err("Adaptor for descriptor %d is not in-use", fd); + pcmk__err("Adaptor for descriptor %d is not in-use", fd); return -ENOENT; } /* channel is created with ref_count = 1 */ channel = g_io_channel_unix_new(fd); if (!channel) { - crm_err("No memory left to add fd=%d", fd); + pcmk__err("No memory left to add fd=%d", fd); return -ENOMEM; } @@ -564,7 +564,7 @@ gio_poll_dispatch_update(enum qb_loop_priority p, int32_t fd, int32_t evts, */ g_io_channel_unref(channel); - crm_trace("Added to mainloop with gsource id=%d", adaptor->source); + pcmk__trace("Added to mainloop with gsource id=%d", adaptor->source); if (adaptor->source > 0) { return 0; } @@ -591,7 +591,7 @@ gio_poll_dispatch_del(int32_t fd) { struct gio_to_qb_poll *adaptor; - crm_trace("Looking for fd=%d", fd); + pcmk__trace("Looking for fd=%d", fd); if (qb_array_index(gio_map, fd, (void **)&adaptor) == 0) { if (adaptor->source) { g_source_remove(adaptor->source); @@ -655,8 +655,8 @@ mainloop_add_ipc_server_with_prio(const char *name, enum qb_ipc_type type, server = qb_ipcs_create(name, 0, pick_ipc_type(type), callbacks); if (server == NULL) { - crm_err("Could not create %s IPC server: %s (%d)", - name, pcmk_rc_str(errno), errno); + pcmk__err("Could not create %s IPC server: %s (%d)", name, + pcmk_rc_str(errno), errno); return NULL; } @@ -670,7 +670,8 @@ mainloop_add_ipc_server_with_prio(const char *name, enum qb_ipc_type type, rc = qb_ipcs_run(server); if (rc < 0) { - crm_err("Could not start %s IPC server: %s (%d)", name, pcmk_strerror(rc), rc); + pcmk__err("Could not start %s IPC server: %s (%d)", name, + pcmk_strerror(rc), rc); return NULL; // qb_ipcs_run() destroys server on failure } @@ -726,17 +727,18 @@ mainloop_gio_callback(GIOChannel *gio, GIOCondition condition, gpointer data) do { read_rc = crm_ipc_read(client->ipc); if (read_rc <= 0) { - crm_trace("Could not read IPC message from %s: %s (%ld)", - client->name, pcmk_strerror(read_rc), read_rc); + pcmk__trace("Could not read IPC message from %s: %s (%ld)", + client->name, pcmk_strerror(read_rc), read_rc); } else if (client->dispatch_fn_ipc) { const char *buffer = crm_ipc_buffer(client->ipc); - crm_trace("New %ld-byte IPC message from %s " - "after I/O condition %d", - read_rc, client->name, (int) condition); + pcmk__trace("New %ld-byte IPC message from %s after I/O " + "condition %d", + read_rc, client->name, (int) condition); if (client->dispatch_fn_ipc(buffer, read_rc, client->userdata) < 0) { - crm_trace("Connection to %s no longer required", client->name); + pcmk__trace("Connection to %s no longer required", + client->name); rc = G_SOURCE_REMOVE; } } @@ -744,11 +746,12 @@ mainloop_gio_callback(GIOChannel *gio, GIOCondition condition, gpointer data) } while ((rc == G_SOURCE_CONTINUE) && (read_rc > 0) && --max > 0); } else { - crm_trace("New I/O event for %s after I/O condition %d", - client->name, (int) condition); + pcmk__trace("New I/O event for %s after I/O condition %d", + client->name, (int) condition); if (client->dispatch_fn_io) { if (client->dispatch_fn_io(client->userdata) < 0) { - crm_trace("Connection to %s no longer required", client->name); + pcmk__trace("Connection to %s no longer required", + client->name); rc = G_SOURCE_REMOVE; } } @@ -756,13 +759,13 @@ mainloop_gio_callback(GIOChannel *gio, GIOCondition condition, gpointer data) } if (client->ipc && !crm_ipc_connected(client->ipc)) { - crm_err("Connection to %s closed " QB_XS " client=%p condition=%d", - client->name, client, condition); + pcmk__err("Connection to %s closed " QB_XS " client=%p condition=%d", + client->name, client, condition); rc = G_SOURCE_REMOVE; } else if (condition & (G_IO_HUP | G_IO_NVAL | G_IO_ERR)) { - crm_trace("The connection %s[%p] has been closed (I/O condition=%d)", - client->name, client, condition); + pcmk__trace("The connection %s[%p] has been closed (I/O condition=%d)", + client->name, client, condition); rc = G_SOURCE_REMOVE; } else if ((condition & G_IO_IN) == 0) { @@ -793,7 +796,7 @@ mainloop_gio_callback(GIOChannel *gio, GIOCondition condition, gpointer data) G_IO_HUP Hung up (the connection has been broken, usually for pipes and sockets). G_IO_NVAL Invalid request. The file descriptor is not open. */ - crm_err("Strange condition: %d", condition); + pcmk__err("Strange condition: %d", condition); } /* G_SOURCE_REMOVE results in mainloop_gio_destroy() being called @@ -811,7 +814,7 @@ mainloop_gio_destroy(gpointer c) /* client->source is valid but about to be destroyed (ref_count == 0) in gmain.c * client->channel will still have ref_count > 0... should be == 1 */ - crm_trace("Destroying client %s[%p]", c_name, c); + pcmk__trace("Destroying client %s[%p]", c_name, c); if (client->ipc) { crm_ipc_close(client->ipc); @@ -831,7 +834,7 @@ mainloop_gio_destroy(gpointer c) crm_ipc_destroy(ipc); } - crm_trace("Destroyed client %s[%p]", c_name, c); + pcmk__trace("Destroyed client %s[%p]", c_name, c); free(client->name); client->name = NULL; free(client); @@ -871,14 +874,14 @@ pcmk__add_mainloop_ipc(crm_ipc_t *ipc, int priority, void *userdata, ipc_name = pcmk__s(crm_ipc_name(ipc), "Pacemaker"); rc = pcmk__connect_generic_ipc(ipc); if (rc != pcmk_rc_ok) { - crm_debug("Connection to %s failed: %s", ipc_name, pcmk_rc_str(rc)); + pcmk__debug("Connection to %s failed: %s", ipc_name, pcmk_rc_str(rc)); return rc; } rc = pcmk__ipc_fd(ipc, &fd); if (rc != pcmk_rc_ok) { - crm_debug("Could not obtain file descriptor for %s IPC: %s", - ipc_name, pcmk_rc_str(rc)); + pcmk__debug("Could not obtain file descriptor for %s IPC: %s", ipc_name, + pcmk_rc_str(rc)); crm_ipc_close(ipc); return rc; } @@ -922,7 +925,7 @@ mainloop_add_ipc_client(const char *name, int priority, size_t max_size, &source); if (rc != pcmk_rc_ok) { - if (crm_log_level == LOG_STDOUT) { + if (crm_log_level == PCMK__LOG_STDOUT) { fprintf(stderr, "Connection to %s failed: %s", name, pcmk_rc_str(rc)); } @@ -988,7 +991,8 @@ mainloop_add_fd(const char *name, int priority, int fd, void *userdata, * shortly after mainloop_gio_destroy() completes */ g_io_channel_unref(client->channel); - crm_trace("Added connection %d for %s[%p].%d", client->source, client->name, client, fd); + pcmk__trace("Added connection %d for %s[%p].%d", client->source, + client->name, client, fd); } else { errno = EINVAL; } @@ -1000,7 +1004,7 @@ void mainloop_del_fd(mainloop_io_t * client) { if (client != NULL) { - crm_trace("Removing client %s[%p]", client->name, client); + pcmk__trace("Removing client %s[%p]", client->name, client); if (client->source) { /* Results in mainloop_gio_destroy() being called just * before the source is removed from mainloop @@ -1047,7 +1051,7 @@ static void child_free(mainloop_child_t *child) { if (child->timerid != 0) { - crm_trace("Removing timer %d", child->timerid); + pcmk__trace("Removing timer %d", child->timerid); g_source_remove(child->timerid); child->timerid = 0; } @@ -1061,10 +1065,11 @@ child_kill_helper(mainloop_child_t *child) { int rc; if (child->flags & mainloop_leave_pid_group) { - crm_debug("Kill pid %d only. leave group intact.", child->pid); + pcmk__debug("Kill pid %lld only. leave group intact", + (long long) child->pid); rc = kill(child->pid, SIGKILL); } else { - crm_debug("Kill pid %d's group", child->pid); + pcmk__debug("Kill pid %lld's group", (long long) child->pid); rc = kill(-child->pid, SIGKILL); } @@ -1085,7 +1090,8 @@ child_timeout_callback(gpointer p) child->timerid = 0; if (child->timeout) { - crm_warn("%s process (PID %d) will not die!", child->desc, (int)child->pid); + pcmk__warn("%s process (PID %lld) will not die!", child->desc, + (long long) child->pid); return FALSE; } @@ -1096,7 +1102,8 @@ child_timeout_callback(gpointer p) } child->timeout = TRUE; - crm_debug("%s process (PID %d) timed out", child->desc, (int)child->pid); + pcmk__debug("%s process (PID %lld) timed out", child->desc, + (long long) child->pid); child->timerid = pcmk__create_timer(5000, child_timeout_callback, child); return FALSE; @@ -1114,8 +1121,8 @@ child_waitpid(mainloop_child_t *child, int flags) rc = waitpid(child->pid, &status, flags); if (rc == 0) { // WNOHANG in flags, and child status is not available - crm_trace("Child process %d (%s) still active", - child->pid, child->desc); + pcmk__trace("Child process %lld (%s) still active", + (long long) child->pid, child->desc); callback_needed = false; } else if (rc != child->pid) { @@ -1130,29 +1137,29 @@ child_waitpid(mainloop_child_t *child, int flags) */ signo = SIGCHLD; exitcode = 1; - crm_notice("Wait for child process %d (%s) interrupted: %s", - child->pid, child->desc, pcmk_rc_str(errno)); + pcmk__notice("Wait for child process %d (%s) interrupted: %s", + child->pid, child->desc, pcmk_rc_str(errno)); } else if (WIFEXITED(status)) { exitcode = WEXITSTATUS(status); - crm_trace("Child process %d (%s) exited with status %d", - child->pid, child->desc, exitcode); + pcmk__trace("Child process %lld (%s) exited with status %d", + (long long) child->pid, child->desc, exitcode); } else if (WIFSIGNALED(status)) { signo = WTERMSIG(status); - crm_trace("Child process %d (%s) exited with signal %d (%s)", - child->pid, child->desc, signo, strsignal(signo)); + pcmk__trace("Child process %lld (%s) exited with signal %d (%s)", + (long long) child->pid, child->desc, signo, + strsignal(signo)); #ifdef WCOREDUMP // AIX, SunOS, maybe others } else if (WCOREDUMP(status)) { core = 1; - crm_err("Child process %d (%s) dumped core", - child->pid, child->desc); + pcmk__err("Child process %d (%s) dumped core", child->pid, child->desc); #endif } else { // flags must contain WUNTRACED and/or WCONTINUED to reach this - crm_trace("Child process %d (%s) stopped or continued", - child->pid, child->desc); + pcmk__trace("Child process %lld (%s) stopped or continued", + (long long) child->pid, child->desc); callback_needed = false; } @@ -1171,8 +1178,8 @@ child_death_dispatch(int signal) iter = iter->next; if (child_waitpid(child, WNOHANG)) { - crm_trace("Removing completed process %d from child list", - child->pid); + pcmk__trace("Removing completed process %lld from child list", + (long long) child->pid); child_list = g_list_remove_link(child_list, saved); g_list_free(saved); child_free(child); @@ -1183,7 +1190,7 @@ child_death_dispatch(int signal) static gboolean child_signal_init(gpointer p) { - crm_trace("Installed SIGCHLD handler"); + pcmk__trace("Installed SIGCHLD handler"); /* Do NOT use g_child_watch_add() and friends, they rely on pthreads */ mainloop_add_signal(SIGCHLD, child_death_dispatch); @@ -1220,8 +1227,8 @@ mainloop_child_kill(pid_t pid) * return code/status). The blocking alternative would be to call * child_waitpid(match, 0). */ - crm_trace("Waiting for signal that child process %d completed", - match->pid); + pcmk__trace("Waiting for signal that child process %lld completed", + (long long) match->pid); return TRUE; } else if(rc != 0) { @@ -1301,10 +1308,10 @@ mainloop_timer_cb(gpointer user_data) */ if(t->cb) { - crm_trace("Invoking callbacks for timer %s", t->name); + pcmk__trace("Invoking callbacks for timer %s", t->name); repeat = t->repeat; if(t->cb(t->userdata) == FALSE) { - crm_trace("Timer %s complete", t->name); + pcmk__trace("Timer %s complete", t->name); repeat = FALSE; } } @@ -1331,7 +1338,7 @@ mainloop_timer_start(mainloop_timer_t *t) { mainloop_timer_stop(t); if(t && t->period_ms > 0) { - crm_trace("Starting timer %s", t->name); + pcmk__trace("Starting timer %s", t->name); t->id = pcmk__create_timer(t->period_ms, mainloop_timer_cb, t); } } @@ -1340,7 +1347,7 @@ void mainloop_timer_stop(mainloop_timer_t *t) { if(t && t->id != 0) { - crm_trace("Stopping timer %s", t->name); + pcmk__trace("Stopping timer %s", t->name); g_source_remove(t->id); t->id = 0; } @@ -1368,16 +1375,16 @@ mainloop_timer_add(const char *name, guint period_ms, bool repeat, GSourceFunc c mainloop_timer_t *t = pcmk__assert_alloc(1, sizeof(mainloop_timer_t)); if (name != NULL) { - t->name = crm_strdup_printf("%s-%u-%d", name, period_ms, repeat); + t->name = pcmk__assert_asprintf("%s-%u-%d", name, period_ms, repeat); } else { - t->name = crm_strdup_printf("%p-%u-%d", t, period_ms, repeat); + t->name = pcmk__assert_asprintf("%p-%u-%d", t, period_ms, repeat); } t->id = 0; t->period_ms = period_ms; t->repeat = repeat; t->cb = cb; t->userdata = userdata; - crm_trace("Created timer %s with %p %p", t->name, userdata, t->userdata); + pcmk__trace("Created timer %s with %p %p", t->name, userdata, t->userdata); return t; } @@ -1385,7 +1392,7 @@ void mainloop_timer_del(mainloop_timer_t *t) { if(t) { - crm_trace("Destroying timer %s", t->name); + pcmk__trace("Destroying timer %s", t->name); mainloop_timer_stop(t); free(t->name); free(t); diff --git a/lib/common/messages.c b/lib/common/messages.c index 242ae2796f3..f534ee68855 100644 --- a/lib/common/messages.c +++ b/lib/common/messages.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -73,9 +73,9 @@ pcmk__new_message_as(const char *origin, enum pcmk_ipc_server server, if (reply_to == NULL) { subtype = PCMK__VALUE_REQUEST; - message_id = crm_strdup_printf("%s-%s-%llu-%u", task, sender_system, - (unsigned long long) time(NULL), - message_counter++); + message_id = pcmk__assert_asprintf("%s-%s-%llu-%u", task, sender_system, + (unsigned long long) time(NULL), + message_counter++); reply_to = message_id; } @@ -123,17 +123,15 @@ xmlNode * pcmk__new_reply_as(const char *origin, const xmlNode *original_request, xmlNode *data) { - const char *message_type = crm_element_value(original_request, PCMK__XA_T); - const char *host_from = crm_element_value(original_request, PCMK__XA_SRC); - const char *sys_from = crm_element_value(original_request, - PCMK__XA_CRM_SYS_FROM); - const char *sys_to = crm_element_value(original_request, - PCMK__XA_CRM_SYS_TO); - const char *type = crm_element_value(original_request, PCMK__XA_SUBT); - const char *operation = crm_element_value(original_request, - PCMK__XA_CRM_TASK); - const char *crm_msg_reference = crm_element_value(original_request, - PCMK_XA_REFERENCE); + const char *message_type = pcmk__xe_get(original_request, PCMK__XA_T); + const char *host_from = pcmk__xe_get(original_request, PCMK__XA_SRC); + const char *sys_from = pcmk__xe_get(original_request, + PCMK__XA_CRM_SYS_FROM); + const char *sys_to = pcmk__xe_get(original_request, PCMK__XA_CRM_SYS_TO); + const char *type = pcmk__xe_get(original_request, PCMK__XA_SUBT); + const char *operation = pcmk__xe_get(original_request, PCMK__XA_CRM_TASK); + const char *crm_msg_reference = pcmk__xe_get(original_request, + PCMK_XA_REFERENCE); enum pcmk_ipc_server server = pcmk__parse_server(message_type); if (server == pcmk_ipc_unknown) { @@ -148,7 +146,8 @@ pcmk__new_reply_as(const char *origin, const xmlNode *original_request, } if (type == NULL) { - crm_warn("Cannot reply to invalid message: No message type specified"); + pcmk__warn("Cannot reply to invalid message: No message type " + "specified"); return NULL; } @@ -156,7 +155,7 @@ pcmk__new_reply_as(const char *origin, const xmlNode *original_request, /* Replies should only be generated for request messages, but it's possible * we expect replies to other messages right now so this can't be enforced. */ - crm_trace("Creating a reply for a non-request original message"); + pcmk__trace("Creating a reply for a non-request original message"); } // Since this is a reply, we reverse the sender and recipient info @@ -214,7 +213,7 @@ pcmk__process_request(pcmk__request_t *request, GHashTable *handlers) CRM_CHECK((request != NULL) && (request->op != NULL) && (handlers != NULL), return NULL); - if (pcmk_is_set(request->flags, pcmk__request_sync) + if (pcmk__is_set(request->flags, pcmk__request_sync) && (request->ipc_client != NULL)) { CRM_CHECK(request->ipc_client->request_id == request->ipc_id, return NULL); @@ -224,9 +223,9 @@ pcmk__process_request(pcmk__request_t *request, GHashTable *handlers) if (handler == NULL) { handler = g_hash_table_lookup(handlers, ""); // Default handler if (handler == NULL) { - crm_info("Ignoring %s request from %s %s with no handler", - request->op, pcmk__request_origin_type(request), - pcmk__request_origin(request)); + pcmk__info("Ignoring %s request from %s %s with no handler", + request->op, pcmk__request_origin_type(request), + pcmk__request_origin(request)); return NULL; } } diff --git a/lib/common/mock.c b/lib/common/mock.c index 08f025b1dd9..559ec5dd3aa 100644 --- a/lib/common/mock.c +++ b/lib/common/mock.c @@ -356,41 +356,30 @@ __wrap_fopen64(const char *pathname, const char *mode) } #endif -/* getpwnam_r() +/* getpwnam() * - * If pcmk__mock_getpwnam_r is set to true, later calls to getpwnam_r() must be + * If pcmk__mock_getpwnam is set to true, later calls to getpwnam() must be * preceded by: * - * expect_*(__wrap_getpwnam_r, name[, ...]); - * expect_*(__wrap_getpwnam_r, pwd[, ...]); - * expect_*(__wrap_getpwnam_r, buf[, ...]); - * expect_*(__wrap_getpwnam_r, buflen[, ...]); - * expect_*(__wrap_getpwnam_r, result[, ...]); - * will_return(__wrap_getpwnam_r, return_value); - * will_return(__wrap_getpwnam_r, ptr_to_result_struct); + * expect_*(__wrap_getpwnam, name[, ...]); + * will_return(__wrap_getpwnam, errno_to_set); + * will_return(__wrap_getpwnam, ptr_to_result_struct); * * expect_* functions: https://api.cmocka.org/group__cmocka__param.html */ -bool pcmk__mock_getpwnam_r = false; +bool pcmk__mock_getpwnam = false; -int -__wrap_getpwnam_r(const char *name, struct passwd *pwd, char *buf, - size_t buflen, struct passwd **result) +struct passwd * +__wrap_getpwnam(const char *name) { - if (pcmk__mock_getpwnam_r) { - int retval = mock_type(int); - + if (pcmk__mock_getpwnam) { check_expected_ptr(name); - check_expected_ptr(pwd); - check_expected_ptr(buf); - check_expected(buflen); - check_expected_ptr(result); - *result = mock_ptr_type(struct passwd *); - return retval; + errno = mock_type(int); + return mock_ptr_type(struct passwd *); } else { - return __real_getpwnam_r(name, pwd, buf, buflen, result); + return __real_getpwnam(name); } } diff --git a/lib/common/mock_private.h b/lib/common/mock_private.h index 272714f1871..5fa2d918fa6 100644 --- a/lib/common/mock_private.h +++ b/lib/common/mock_private.h @@ -1,5 +1,5 @@ /* - * Copyright 2021-2024 the Pacemaker project contributors + * Copyright 2021-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -74,11 +74,9 @@ struct group * __real_getgrent(void); void __wrap_endgrent(void); void __real_endgrent(void); -extern bool pcmk__mock_getpwnam_r; -int __real_getpwnam_r(const char *name, struct passwd *pwd, - char *buf, size_t buflen, struct passwd **result); -int __wrap_getpwnam_r(const char *name, struct passwd *pwd, - char *buf, size_t buflen, struct passwd **result); +extern bool pcmk__mock_getpwnam; +struct passwd *__real_getpwnam(const char *name); +struct passwd *__wrap_getpwnam(const char *name); extern bool pcmk__mock_readlink; ssize_t __real_readlink(const char *restrict path, char *restrict buf, diff --git a/lib/common/nodes.c b/lib/common/nodes.c index bf035434441..94a20bd13b0 100644 --- a/lib/common/nodes.c +++ b/lib/common/nodes.c @@ -22,6 +22,7 @@ void pcmk__free_node(gpointer user_data) { pcmk_node_t *node = user_data; + const bool is_remote = pcmk__is_pacemaker_remote_node(node); if (node == NULL) { return; @@ -34,8 +35,8 @@ pcmk__free_node(gpointer user_data) /* This may be called after freeing resources, which means that we can't * use node->private->name for Pacemaker Remote nodes. */ - crm_trace("Freeing node %s", (pcmk__is_pacemaker_remote_node(node)? - "(guest or remote)" : pcmk__node_name(node))); + pcmk__trace("Freeing node %s", + (is_remote? "(guest or remote)" : pcmk__node_name(node))); if (node->priv->attrs != NULL) { g_hash_table_destroy(node->priv->attrs); @@ -228,12 +229,12 @@ const char * pcmk_cib_node_shutdown(xmlNode *cib, const char *node) { if ((cib != NULL) && (node != NULL)) { - char *xpath = crm_strdup_printf(XP_SHUTDOWN, node); - xmlNode *match = pcmk__xpath_find_one(cib->doc, xpath, LOG_TRACE); + char *xpath = pcmk__assert_asprintf(XP_SHUTDOWN, node); + xmlNode *match = pcmk__xpath_find_one(cib->doc, xpath, PCMK__LOG_TRACE); free(xpath); if (match != NULL) { - return crm_element_value(match, PCMK_XA_VALUE); + return pcmk__xe_get(match, PCMK_XA_VALUE); } } return NULL; diff --git a/lib/common/nvpair.c b/lib/common/nvpair.c index 921119f8428..ae103ae510c 100644 --- a/lib/common/nvpair.c +++ b/lib/common/nvpair.c @@ -19,6 +19,7 @@ #include #include +#include // pcmk_nvpair_t, etc. #include #include #include "crmcommon_private.h" @@ -175,7 +176,8 @@ pcmk__scan_nvpair(const gchar *input, gchar **name, gchar **value) char * pcmk__format_nvpair(const char *name, const char *value, const char *units) { - return crm_strdup_printf("%s=\"%s%s\"", name, value, units ? units : ""); + return pcmk__assert_asprintf("%s=\"%s%s\"", name, value, + pcmk__s(units, "")); } /*! @@ -211,15 +213,15 @@ hash2smartfield(gpointer key, gpointer value, gpointer user_data) if (isdigit(name[0])) { xmlNode *tmp = pcmk__xe_create(xml_node, PCMK__XE_PARAM); - crm_xml_add(tmp, PCMK_XA_NAME, name); - crm_xml_add(tmp, PCMK_XA_VALUE, s_value); + pcmk__xe_set(tmp, PCMK_XA_NAME, name); + pcmk__xe_set(tmp, PCMK_XA_VALUE, s_value); - } else if (crm_element_value(xml_node, name) == NULL) { - crm_xml_add(xml_node, name, s_value); - crm_trace("dumped: %s=%s", name, s_value); + } else if (pcmk__xe_get(xml_node, name) == NULL) { + pcmk__xe_set(xml_node, name, s_value); + pcmk__trace("dumped: %s=%s", name, s_value); } else { - crm_trace("duplicate: %s=%s", name, s_value); + pcmk__trace("duplicate: %s=%s", name, s_value); } } @@ -242,11 +244,11 @@ hash2field(gpointer key, gpointer value, gpointer user_data) xmlNode *xml_node = user_data; - if (crm_element_value(xml_node, name) == NULL) { - crm_xml_add(xml_node, name, s_value); + if (pcmk__xe_get(xml_node, name) == NULL) { + pcmk__xe_set(xml_node, name, s_value); } else { - crm_trace("duplicate: %s=%s", name, s_value); + pcmk__trace("duplicate: %s=%s", name, s_value); } } @@ -311,13 +313,13 @@ crm_create_nvpair_xml(xmlNode *parent, const char *id, const char *name, nvp = pcmk__xe_create(parent, PCMK_XE_NVPAIR); if (id) { - crm_xml_add(nvp, PCMK_XA_ID, id); + pcmk__xe_set(nvp, PCMK_XA_ID, id); } else { pcmk__xe_set_id(nvp, "%s-%s", pcmk__s(pcmk__xe_id(parent), PCMK_XE_NVPAIR), name); } - crm_xml_add(nvp, PCMK_XA_NAME, name); - crm_xml_add(nvp, PCMK_XA_VALUE, value); + pcmk__xe_set(nvp, PCMK_XA_NAME, name); + pcmk__xe_set(nvp, PCMK_XA_VALUE, value); return nvp; } @@ -347,11 +349,11 @@ xml2list(const xmlNode *parent) nvpair_list = pcmk__xe_first_child(parent, PCMK__XE_ATTRIBUTES, NULL, NULL); if (nvpair_list == NULL) { - crm_trace("No attributes in %s", parent->name); - crm_log_xml_trace(parent, "No attributes for resource op"); + pcmk__trace("No attributes in %s", parent->name); + pcmk__log_xml_trace(parent, "No attributes for resource op"); } - crm_log_xml_trace(nvpair_list, "Unpacking"); + pcmk__log_xml_trace(nvpair_list, "Unpacking"); for (pIter = pcmk__xe_first_attr(nvpair_list); pIter != NULL; pIter = pIter->next) { @@ -359,7 +361,7 @@ xml2list(const xmlNode *parent) const char *p_name = (const char *)pIter->name; const char *p_value = pcmk__xml_attr_value(pIter); - crm_trace("Added %s=%s", p_name, p_value); + pcmk__trace("Added %s=%s", p_name, p_value); pcmk__insert_dup(nvpair_hash, p_name, p_value); } @@ -367,10 +369,10 @@ xml2list(const xmlNode *parent) for (child = pcmk__xe_first_child(nvpair_list, PCMK__XE_PARAM, NULL, NULL); child != NULL; child = pcmk__xe_next(child, PCMK__XE_PARAM)) { - const char *key = crm_element_value(child, PCMK_XA_NAME); - const char *value = crm_element_value(child, PCMK_XA_VALUE); + const char *key = pcmk__xe_get(child, PCMK_XA_NAME); + const char *value = pcmk__xe_get(child, PCMK_XA_VALUE); - crm_trace("Added %s=%s", key, value); + pcmk__trace("Added %s=%s", key, value); if (key != NULL && value != NULL) { pcmk__insert_dup(nvpair_hash, key, value); } @@ -405,8 +407,8 @@ unpack_nvpair(xmlNode *nvpair, void *userdata) return pcmk_rc_ok; } - name = crm_element_value(ref_nvpair, PCMK_XA_NAME); - value = crm_element_value(ref_nvpair, PCMK_XA_VALUE); + name = pcmk__xe_get(ref_nvpair, PCMK_XA_NAME); + value = pcmk__xe_get(ref_nvpair, PCMK_XA_VALUE); if ((name == NULL) || (value == NULL)) { return pcmk_rc_ok; // Not possible with schema validation enabled } @@ -424,8 +426,8 @@ unpack_nvpair(xmlNode *nvpair, void *userdata) } } else if ((old_value == NULL) || unpack_data->overwrite) { - crm_trace("Setting %s=\"%s\" (was %s)", - name, value, pcmk__s(old_value, "unset")); + pcmk__trace("Setting %s=\"%s\" (was %s)", name, value, + pcmk__s(old_value, "unset")); pcmk__insert_dup(unpack_data->values, name, value); } return pcmk_rc_ok; @@ -459,8 +461,9 @@ pcmk__unpack_nvpair_block(gpointer data, gpointer user_data) return; } - crm_trace("Adding name/value pairs from %s %s overwrite", - pcmk__xe_id(pair), (unpack_data->overwrite? "with" : "without")); + pcmk__trace("Adding name/value pairs from %s %s overwrite", + pcmk__xe_id(pair), + (unpack_data->overwrite? "with" : "without")); if (pcmk__xe_is(pair->children, PCMK__XE_ATTRIBUTES)) { pair = pair->children; } @@ -528,7 +531,7 @@ crm_meta_name(const char *attr_name) pcmk__assert(!pcmk__str_empty(attr_name)); - env_name = crm_strdup_printf(CRM_META "_%s", attr_name); + env_name = pcmk__assert_asprintf(CRM_META "_%s", attr_name); for (char *c = env_name; *c != '\0'; ++c) { if (*c == '-') { *c = '_'; @@ -631,8 +634,7 @@ pcmk__cmp_nvpair_blocks(gconstpointer a, gconstpointer b, gpointer user_data) pcmk__config_warn("Using 0 as %s score because '%s' " "is not a valid score: %s", pcmk__xe_id(pair_a), - crm_element_value(pair_a, PCMK_XA_SCORE), - pcmk_rc_str(rc)); + pcmk__xe_get(pair_a, PCMK_XA_SCORE), pcmk_rc_str(rc)); } rc = pcmk__xe_get_score(pair_b, PCMK_XA_SCORE, &score_b, 0); @@ -640,8 +642,7 @@ pcmk__cmp_nvpair_blocks(gconstpointer a, gconstpointer b, gpointer user_data) pcmk__config_warn("Using 0 as %s score because '%s' " "is not a valid score: %s", pcmk__xe_id(pair_b), - crm_element_value(pair_b, PCMK_XA_SCORE), - pcmk_rc_str(rc)); + pcmk__xe_get(pair_b, PCMK_XA_SCORE), pcmk_rc_str(rc)); } if (score_a < score_b) { @@ -704,7 +705,7 @@ pcmk__nvpair_add_xml_attr(gpointer data, gpointer user_data) pcmk_nvpair_t *pair = data; xmlNode *parent = user_data; - crm_xml_add(parent, pair->name, pair->value); + pcmk__xe_set(parent, pair->name, pair->value); } void @@ -721,7 +722,7 @@ hash2nvpair(gpointer key, gpointer value, gpointer user_data) xmlNode *xml_node = user_data; crm_create_nvpair_xml(xml_node, name, name, s_value); - crm_trace("dumped: name=%s value=%s", name, s_value); + pcmk__trace("dumped: name=%s value=%s", name, s_value); } // LCOV_EXCL_STOP diff --git a/lib/common/options.c b/lib/common/options.c index 7ed6bd99907..3dfc83e52e5 100644 --- a/lib/common/options.c +++ b/lib/common/options.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -16,6 +16,7 @@ #include #include +#include // pcmk_str_is_infinity(), etc. #include void @@ -1084,24 +1085,24 @@ pcmk__env_option(const char *option) int rv = snprintf(env_name, NAME_MAX, "%s%s", prefixes[i], option); if (rv < 0) { - crm_err("Failed to write %s%s to buffer: %s", prefixes[i], option, - strerror(errno)); + pcmk__err("Failed to write %s%s to buffer: %s", prefixes[i], option, + strerror(errno)); return NULL; } if (rv >= sizeof(env_name)) { - crm_trace("\"%s%s\" is too long", prefixes[i], option); + pcmk__trace("\"%s%s\" is too long", prefixes[i], option); continue; } value = getenv(env_name); if (value != NULL) { - crm_trace("Found %s = %s", env_name, value); + pcmk__trace("Found %s = %s", env_name, value); return value; } } - crm_trace("Nothing found for %s", option); + pcmk__trace("Nothing found for %s", option); return NULL; } @@ -1135,27 +1136,27 @@ pcmk__set_env_option(const char *option, const char *value, bool compat) int rv = snprintf(env_name, NAME_MAX, "%s%s", prefixes[i], option); if (rv < 0) { - crm_err("Failed to write %s%s to buffer: %s", prefixes[i], option, - strerror(errno)); + pcmk__err("Failed to write %s%s to buffer: %s", prefixes[i], option, + strerror(errno)); return; } if (rv >= sizeof(env_name)) { - crm_trace("\"%s%s\" is too long", prefixes[i], option); + pcmk__trace("\"%s%s\" is too long", prefixes[i], option); continue; } if (value != NULL) { - crm_trace("Setting %s to %s", env_name, value); + pcmk__trace("Setting %s to %s", env_name, value); rv = setenv(env_name, value, 1); } else { - crm_trace("Unsetting %s", env_name); + pcmk__trace("Unsetting %s", env_name); rv = unsetenv(env_name); } if (rv < 0) { - crm_err("Failed to %sset %s: %s", (value != NULL)? "" : "un", - env_name, strerror(errno)); + pcmk__err("Failed to %sset %s: %s", (value != NULL)? "" : "un", + env_name, strerror(errno)); } if (!compat && (value != NULL)) { @@ -1184,8 +1185,8 @@ pcmk__env_option_enabled(const char *daemon, const char *option) const char *value = pcmk__env_option(option); return (value != NULL) - && (crm_is_true(value) - || ((daemon != NULL) && (strstr(value, daemon) != NULL))); + && (pcmk__is_true(value) + || ((daemon != NULL) && (strstr(value, daemon) != NULL))); } @@ -1219,7 +1220,7 @@ pcmk__valid_interval_spec(const char *value) bool pcmk__valid_boolean(const char *value) { - return crm_str_to_boolean(value, NULL) == 1; + return pcmk__parse_bool(value, NULL) == pcmk_rc_ok; } /*! @@ -1369,18 +1370,18 @@ cluster_option_value(GHashTable *table, const pcmk__cluster_option_t *option) value = option->default_value; if (value == NULL) { - crm_trace("No value or default provided for cluster option '%s'", - option->name); + pcmk__trace("No value or default provided for cluster option '%s'", + option->name); return NULL; } CRM_CHECK((option->is_valid == NULL) || option->is_valid(value), - crm_err("Bug: default value for cluster option '%s' is invalid", - option->name); + pcmk__err("Bug: default value for cluster option '%s' is invalid", + option->name); return NULL); - crm_trace("Using default value '%s' for cluster option '%s'", - value, option->name); + pcmk__trace("Using default value '%s' for cluster option '%s'", value, + option->name); if (table != NULL) { pcmk__insert_dup(table, option->name, value); } @@ -1406,7 +1407,7 @@ pcmk__cluster_option(GHashTable *options, const char *name) return cluster_option_value(options, option); } } - CRM_CHECK(FALSE, crm_err("Bug: looking for unknown option '%s'", name)); + CRM_CHECK(FALSE, pcmk__err("Bug: looking for unknown option '%s'", name)); return NULL; } diff --git a/lib/common/options_display.c b/lib/common/options_display.c index 344405c3d8d..1a6d8467cad 100644 --- a/lib/common/options_display.c +++ b/lib/common/options_display.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -29,7 +29,7 @@ add_possible_values_default(pcmk__output_t *out, pcmk__assert(option->type != NULL); - if (pcmk_is_set(option->flags, pcmk__opt_generated)) { + if (pcmk__is_set(option->flags, pcmk__opt_generated)) { id = _("Possible values (generated by Pacemaker)"); } @@ -134,8 +134,8 @@ option_list_default(pcmk__output_t *out, va_list args) const bool all = (bool) va_arg(args, int); const bool show_deprecated = all - || pcmk_is_set(filter, pcmk__opt_deprecated); - const bool show_advanced = all || pcmk_is_set(filter, pcmk__opt_advanced); + || pcmk__is_set(filter, pcmk__opt_deprecated); + const bool show_advanced = all || pcmk__is_set(filter, pcmk__opt_advanced); bool old_fancy = false; GSList *deprecated = NULL; @@ -156,13 +156,13 @@ option_list_default(pcmk__output_t *out, va_list args) option->name != NULL; option++) { // Store deprecated and advanced options to display later if appropriate - if (pcmk_all_flags_set(option->flags, filter)) { - if (pcmk_is_set(option->flags, pcmk__opt_deprecated)) { + if (pcmk__all_flags_set(option->flags, filter)) { + if (pcmk__is_set(option->flags, pcmk__opt_deprecated)) { if (show_deprecated) { deprecated = g_slist_prepend(deprecated, (gpointer) option); } - } else if (pcmk_is_set(option->flags, pcmk__opt_advanced)) { + } else if (pcmk__is_set(option->flags, pcmk__opt_advanced)) { if (show_advanced) { advanced = g_slist_prepend(advanced, (gpointer) option); } @@ -229,7 +229,7 @@ add_desc_xml(pcmk__output_t *out, bool for_long, const char *desc) const char *tag = (for_long? PCMK_XE_LONGDESC : PCMK_XE_SHORTDESC); xmlNode *node = pcmk__output_create_xml_text_node(out, tag, desc); - crm_xml_add(node, PCMK_XA_LANG, PCMK__VALUE_EN); + pcmk__xe_set(node, PCMK_XA_LANG, PCMK__VALUE_EN); #ifdef ENABLE_NLS { @@ -243,7 +243,7 @@ add_desc_xml(pcmk__output_t *out, bool for_long, const char *desc) locale = strtok(setlocale(LC_ALL, NULL), "_"); } node = pcmk__output_create_xml_text_node(out, tag, _(desc)); - crm_xml_add(node, PCMK_XA_LANG, locale); + pcmk__xe_set(node, PCMK_XA_LANG, locale); } #endif } @@ -318,9 +318,9 @@ add_option_metadata_xml(pcmk__output_t *out, const char *type = option->type; const char *desc_long = option->description_long; const char *desc_short = option->description_short; - const bool advanced = pcmk_is_set(option->flags, pcmk__opt_advanced); - const bool deprecated = pcmk_is_set(option->flags, pcmk__opt_deprecated); - const bool generated = pcmk_is_set(option->flags, pcmk__opt_generated); + const bool advanced = pcmk__is_set(option->flags, pcmk__opt_advanced); + const bool deprecated = pcmk__is_set(option->flags, pcmk__opt_deprecated); + const bool generated = pcmk__is_set(option->flags, pcmk__opt_generated); // OCF requires "1"/"0" and does not allow "true"/"false // @COMPAT Variables no longer needed after we drop legacy mode @@ -349,8 +349,8 @@ add_option_metadata_xml(pcmk__output_t *out, type = map_legacy_option_type(type); if (option->values != NULL) { - desc_long_legacy = crm_strdup_printf("%s Allowed values: %s", - desc_long, option->values); + desc_long_legacy = pcmk__assert_asprintf("%s Allowed values: %s", + desc_long, option->values); desc_long = desc_long_legacy; } @@ -464,7 +464,7 @@ option_list_xml(pcmk__output_t *out, va_list args) for (const pcmk__cluster_option_t *option = option_list; option->name != NULL; option++) { - if (pcmk_all_flags_set(option->flags, filter)) { + if (pcmk__all_flags_set(option->flags, filter)) { add_option_metadata_xml(out, option); } } diff --git a/lib/common/output.c b/lib/common/output.c index 6ba9c16169c..5e096845cb0 100644 --- a/lib/common/output.c +++ b/lib/common/output.c @@ -1,5 +1,5 @@ /* - * Copyright 2019-2024 the Pacemaker project contributors + * Copyright 2019-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -182,8 +182,8 @@ pcmk__call_message(pcmk__output_t *out, const char *message_id, ...) { fn = g_hash_table_lookup(out->messages, message_id); if (fn == NULL) { - crm_debug("Called unknown output message '%s' for format '%s'", - message_id, out->fmt_name); + pcmk__debug("Called unknown output message '%s' for format '%s'", + message_id, out->fmt_name); return EINVAL; } @@ -302,8 +302,8 @@ pcmk__log_output_new(pcmk__output_t **out) pcmk__register_formats(NULL, formats); rc = pcmk__output_new(out, "log", NULL, (char **) argv); if ((rc != pcmk_rc_ok) || (*out == NULL)) { - crm_err("Can't log certain messages due to internal error: %s", - pcmk_rc_str(rc)); + pcmk__err("Can't log certain messages due to internal error: %s", + pcmk_rc_str(rc)); return rc; } return pcmk_rc_ok; @@ -331,8 +331,8 @@ pcmk__text_output_new(pcmk__output_t **out, const char *filename) pcmk__register_formats(NULL, formats); rc = pcmk__output_new(out, "text", filename, (char **) argv); if ((rc != pcmk_rc_ok) || (*out == NULL)) { - crm_err("Can't create text output object to internal error: %s", - pcmk_rc_str(rc)); + pcmk__err("Can't create text output object to internal error: %s", + pcmk_rc_str(rc)); return rc; } return pcmk_rc_ok; diff --git a/lib/common/output_html.c b/lib/common/output_html.c index 8b63cf326b0..e43359a3f9a 100644 --- a/lib/common/output_html.c +++ b/lib/common/output_html.c @@ -118,7 +118,7 @@ html_init(pcmk__output_t *out) { priv->root = pcmk__xe_create(NULL, "html"); xmlCreateIntSubset(priv->root->doc, (const xmlChar *) "html", NULL, NULL); - crm_xml_add(priv->root, PCMK_XA_LANG, PCMK__VALUE_EN); + pcmk__xe_set(priv->root, PCMK_XA_LANG, PCMK__VALUE_EN); g_queue_push_tail(priv->parent_q, priv->root); priv->errors = NULL; @@ -172,7 +172,7 @@ html_finish(pcmk__output_t *out, crm_exit_t exit_status, bool print, void **copy } charset_node = pcmk__xe_create(head_node, PCMK__XE_META); - crm_xml_add(charset_node, "charset", "utf-8"); + pcmk__xe_set(charset_node, "charset", "utf-8"); /* Add any extra header nodes the caller might have created. */ for (GSList *iter = extra_headers; iter != NULL; iter = iter->next) { @@ -231,7 +231,7 @@ html_subprocess_output(pcmk__output_t *out, int exit_status, pcmk__assert(out != NULL); - rc_buf = crm_strdup_printf("Return code: %d", exit_status); + rc_buf = pcmk__assert_asprintf("Return code: %d", exit_status); pcmk__output_create_xml_text_node(out, "h2", "Command Output"); pcmk__output_create_html_node(out, PCMK__XE_DIV, NULL, NULL, rc_buf); @@ -300,7 +300,7 @@ html_output_xml(pcmk__output_t *out, const char *name, const char *buf) { pcmk__assert(out != NULL); node = pcmk__output_create_html_node(out, "pre", NULL, NULL, buf); - crm_xml_add(node, PCMK_XA_LANG, "xml"); + pcmk__xe_set(node, PCMK_XA_LANG, "xml"); } G_GNUC_PRINTF(4, 5) @@ -365,7 +365,7 @@ html_list_item(pcmk__output_t *out, const char *name, const char *format, ...) { free(buf); if (name != NULL) { - crm_xml_add(item_node, PCMK_XA_CLASS, name); + pcmk__xe_set(item_node, PCMK_XA_CLASS, name); } } @@ -459,11 +459,11 @@ pcmk__output_create_html_node(pcmk__output_t *out, const char *element_name, con node = pcmk__output_create_xml_text_node(out, element_name, text); if (class_name != NULL) { - crm_xml_add(node, PCMK_XA_CLASS, class_name); + pcmk__xe_set(node, PCMK_XA_CLASS, class_name); } if (id != NULL) { - crm_xml_add(node, PCMK_XA_ID, id); + pcmk__xe_set(node, PCMK_XA_ID, id); } return node; @@ -512,7 +512,7 @@ pcmk__html_add_header(const char *name, ...) { } value = va_arg(ap, char *); - crm_xml_add(header_node, key, value); + pcmk__xe_set(header_node, key, value); } extra_headers = g_slist_append(extra_headers, header_node); diff --git a/lib/common/output_xml.c b/lib/common/output_xml.c index 3eaf6b57985..5c54d00a752 100644 --- a/lib/common/output_xml.c +++ b/lib/common/output_xml.c @@ -115,11 +115,11 @@ add_root_node(pcmk__output_t *out) if (priv->legacy_xml) { priv->root = pcmk__xe_create(NULL, PCMK_XE_CRM_MON); - crm_xml_add(priv->root, PCMK_XA_VERSION, PACEMAKER_VERSION); + pcmk__xe_set(priv->root, PCMK_XA_VERSION, PACEMAKER_VERSION); } else { priv->root = pcmk__xe_create(NULL, PCMK_XE_PACEMAKER_RESULT); - crm_xml_add(priv->root, PCMK_XA_API_VERSION, PCMK__API_VERSION); - crm_xml_add(priv->root, PCMK_XA_REQUEST, + pcmk__xe_set(priv->root, PCMK_XA_API_VERSION, PCMK__API_VERSION); + pcmk__xe_set(priv->root, PCMK_XA_REQUEST, pcmk__s(out->request, "libpacemaker")); } @@ -262,13 +262,13 @@ xml_subprocess_output(pcmk__output_t *out, int exit_status, if (proc_stdout != NULL) { child_node = pcmk__xe_create(node, PCMK_XE_OUTPUT); pcmk__xe_set_content(child_node, "%s", proc_stdout); - crm_xml_add(child_node, PCMK_XA_SOURCE, "stdout"); + pcmk__xe_set(child_node, PCMK_XA_SOURCE, "stdout"); } if (proc_stderr != NULL) { child_node = pcmk__xe_create(node, PCMK_XE_OUTPUT); pcmk__xe_set_content(child_node, "%s", proc_stderr); - crm_xml_add(child_node, PCMK_XA_SOURCE, "stderr"); + pcmk__xe_set(child_node, PCMK_XA_SOURCE, "stderr"); } free(rc_as_str); @@ -391,7 +391,7 @@ xml_list_item(pcmk__output_t *out, const char *name, const char *format, ...) { item_node = pcmk__output_create_xml_text_node(out, PCMK_XE_ITEM, buf); if (name != NULL) { - crm_xml_add(item_node, PCMK_XA_NAME, name); + pcmk__xe_set(item_node, PCMK_XA_NAME, name); } free(buf); @@ -415,8 +415,8 @@ xml_end_list(pcmk__output_t *out) { /* Do not free node here - it's still part of the document */ node = g_queue_pop_tail(priv->parent_q); - buf = crm_strdup_printf("%lu", xmlChildElementCount(node)); - crm_xml_add(node, PCMK_XA_COUNT, buf); + buf = pcmk__assert_asprintf("%lu", xmlChildElementCount(node)); + pcmk__xe_set(node, PCMK_XA_COUNT, buf); free(buf); } else { /* Do not free this result - it's still part of the document */ diff --git a/lib/common/patchset.c b/lib/common/patchset.c index 4f1fcbadf7b..e80071aff0d 100644 --- a/lib/common/patchset.c +++ b/lib/common/patchset.c @@ -21,11 +21,18 @@ #include // xmlNode #include +#include // xml_acl_disable() #include #include #include // CRM_XML_LOG_BASE, etc. #include "crmcommon_private.h" +static const char *const vfields[] = { + PCMK_XA_ADMIN_EPOCH, + PCMK_XA_EPOCH, + PCMK_XA_NUM_UPDATES, +}; + /* Add changes for specified XML to patchset. * For patchset format, refer to diff schema. */ @@ -47,7 +54,7 @@ add_xml_changes_to_patchset(xmlNode *xml, xmlNode *patchset) } // If this XML node is new, just report that - if (patchset && pcmk_is_set(nodepriv->flags, pcmk__xf_created)) { + if ((patchset != NULL) && pcmk__is_set(nodepriv->flags, pcmk__xf_created)) { GString *xpath = pcmk__element_xpath(xml->parent); if (xpath != NULL) { @@ -55,9 +62,9 @@ add_xml_changes_to_patchset(xmlNode *xml, xmlNode *patchset) change = pcmk__xe_create(patchset, PCMK_XE_CHANGE); - crm_xml_add(change, PCMK_XA_OPERATION, PCMK_VALUE_CREATE); - crm_xml_add(change, PCMK_XA_PATH, (const char *) xpath->str); - crm_xml_add_int(change, PCMK_XE_POSITION, position); + pcmk__xe_set(change, PCMK_XA_OPERATION, PCMK_VALUE_CREATE); + pcmk__xe_set(change, PCMK_XA_PATH, (const char *) xpath->str); + pcmk__xe_set_int(change, PCMK_XE_POSITION, position); pcmk__xml_copy(change, xml); g_string_free(xpath, TRUE); } @@ -71,7 +78,8 @@ add_xml_changes_to_patchset(xmlNode *xml, xmlNode *patchset) xmlNode *attr = NULL; nodepriv = pIter->_private; - if (!pcmk_any_flags_set(nodepriv->flags, pcmk__xf_deleted|pcmk__xf_dirty)) { + if (!pcmk__any_flags_set(nodepriv->flags, + pcmk__xf_deleted|pcmk__xf_dirty)) { continue; } @@ -81,8 +89,8 @@ add_xml_changes_to_patchset(xmlNode *xml, xmlNode *patchset) if (xpath != NULL) { change = pcmk__xe_create(patchset, PCMK_XE_CHANGE); - crm_xml_add(change, PCMK_XA_OPERATION, PCMK_VALUE_MODIFY); - crm_xml_add(change, PCMK_XA_PATH, (const char *) xpath->str); + pcmk__xe_set(change, PCMK_XA_OPERATION, PCMK_VALUE_MODIFY); + pcmk__xe_set(change, PCMK_XA_PATH, (const char *) xpath->str); change = pcmk__xe_create(change, PCMK_XE_CHANGE_LIST); g_string_free(xpath, TRUE); @@ -91,15 +99,15 @@ add_xml_changes_to_patchset(xmlNode *xml, xmlNode *patchset) attr = pcmk__xe_create(change, PCMK_XE_CHANGE_ATTR); - crm_xml_add(attr, PCMK_XA_NAME, (const char *) pIter->name); + pcmk__xe_set(attr, PCMK_XA_NAME, (const char *) pIter->name); if (nodepriv->flags & pcmk__xf_deleted) { - crm_xml_add(attr, PCMK_XA_OPERATION, "unset"); + pcmk__xe_set(attr, PCMK_XA_OPERATION, "unset"); } else { - crm_xml_add(attr, PCMK_XA_OPERATION, "set"); + pcmk__xe_set(attr, PCMK_XA_OPERATION, "set"); value = pcmk__xml_attr_value(pIter); - crm_xml_add(attr, PCMK_XA_VALUE, value); + pcmk__xe_set(attr, PCMK_XA_VALUE, value); } } @@ -112,9 +120,9 @@ add_xml_changes_to_patchset(xmlNode *xml, xmlNode *patchset) for (pIter = pcmk__xe_first_attr(xml); pIter != NULL; pIter = pIter->next) { nodepriv = pIter->_private; - if (!pcmk_is_set(nodepriv->flags, pcmk__xf_deleted)) { - value = crm_element_value(xml, (const char *) pIter->name); - crm_xml_add(result, (const char *)pIter->name, value); + if (!pcmk__is_set(nodepriv->flags, pcmk__xf_deleted)) { + value = pcmk__xe_get(xml, (const char *) pIter->name); + pcmk__xe_set(result, (const char *)pIter->name, value); } } } @@ -126,20 +134,19 @@ add_xml_changes_to_patchset(xmlNode *xml, xmlNode *patchset) } nodepriv = xml->_private; - if (patchset && pcmk_is_set(nodepriv->flags, pcmk__xf_moved)) { + if ((patchset != NULL) && pcmk__is_set(nodepriv->flags, pcmk__xf_moved)) { GString *xpath = pcmk__element_xpath(xml); - crm_trace("%s.%s moved to position %d", - xml->name, pcmk__xe_id(xml), - pcmk__xml_position(xml, pcmk__xf_skip)); + pcmk__trace("%s.%s moved to position %d", xml->name, pcmk__xe_id(xml), + pcmk__xml_position(xml, pcmk__xf_skip)); if (xpath != NULL) { change = pcmk__xe_create(patchset, PCMK_XE_CHANGE); - crm_xml_add(change, PCMK_XA_OPERATION, PCMK_VALUE_MOVE); - crm_xml_add(change, PCMK_XA_PATH, (const char *) xpath->str); - crm_xml_add_int(change, PCMK_XE_POSITION, - pcmk__xml_position(xml, pcmk__xf_deleted)); + pcmk__xe_set(change, PCMK_XA_OPERATION, PCMK_VALUE_MOVE); + pcmk__xe_set(change, PCMK_XA_PATH, (const char *) xpath->str); + pcmk__xe_set_int(change, PCMK_XE_POSITION, + pcmk__xml_position(xml, pcmk__xf_deleted)); g_string_free(xpath, TRUE); } } @@ -157,7 +164,7 @@ is_config_change(xmlNode *xml) if (config) { nodepriv = config->_private; } - if ((nodepriv != NULL) && pcmk_is_set(nodepriv->flags, pcmk__xf_dirty)) { + if ((nodepriv != NULL) && pcmk__is_set(nodepriv->flags, pcmk__xf_dirty)) { return TRUE; } @@ -185,11 +192,6 @@ xml_create_patchset_v2(xmlNode *source, xmlNode *target) xmlNode *v = NULL; xmlNode *version = NULL; xmlNode *patchset = NULL; - const char *vfields[] = { - PCMK_XA_ADMIN_EPOCH, - PCMK_XA_EPOCH, - PCMK_XA_NUM_UPDATES, - }; pcmk__assert(target != NULL); @@ -201,38 +203,38 @@ xml_create_patchset_v2(xmlNode *source, xmlNode *target) docpriv = target->doc->_private; patchset = pcmk__xe_create(NULL, PCMK_XE_DIFF); - crm_xml_add_int(patchset, PCMK_XA_FORMAT, 2); + pcmk__xe_set_int(patchset, PCMK_XA_FORMAT, 2); version = pcmk__xe_create(patchset, PCMK_XE_VERSION); v = pcmk__xe_create(version, PCMK_XE_SOURCE); for (lpc = 0; lpc < PCMK__NELEM(vfields); lpc++) { - const char *value = crm_element_value(source, vfields[lpc]); + const char *value = pcmk__xe_get(source, vfields[lpc]); if (value == NULL) { value = "1"; } - crm_xml_add(v, vfields[lpc], value); + pcmk__xe_set(v, vfields[lpc], value); } v = pcmk__xe_create(version, PCMK_XE_TARGET); for (lpc = 0; lpc < PCMK__NELEM(vfields); lpc++) { - const char *value = crm_element_value(target, vfields[lpc]); + const char *value = pcmk__xe_get(target, vfields[lpc]); if (value == NULL) { value = "1"; } - crm_xml_add(v, vfields[lpc], value); + pcmk__xe_set(v, vfields[lpc], value); } for (gIter = docpriv->deleted_objs; gIter; gIter = gIter->next) { pcmk__deleted_xml_t *deleted_obj = gIter->data; xmlNode *change = pcmk__xe_create(patchset, PCMK_XE_CHANGE); - crm_xml_add(change, PCMK_XA_OPERATION, PCMK_VALUE_DELETE); - crm_xml_add(change, PCMK_XA_PATH, deleted_obj->path); + pcmk__xe_set(change, PCMK_XA_OPERATION, PCMK_VALUE_DELETE); + pcmk__xe_set(change, PCMK_XA_PATH, deleted_obj->path); if (deleted_obj->position >= 0) { - crm_xml_add_int(change, PCMK_XE_POSITION, deleted_obj->position); + pcmk__xe_set_int(change, PCMK_XE_POSITION, deleted_obj->position); } } @@ -250,7 +252,7 @@ xml_create_patchset(int format, xmlNode *source, xmlNode *target, format = 2; } if (format != 2) { - crm_err("Unknown patch format: %d", format); + pcmk__err("Unknown patch format: %d", format); return NULL; } @@ -258,7 +260,7 @@ xml_create_patchset(int format, xmlNode *source, xmlNode *target, if ((target == NULL) || !pcmk__xml_doc_all_flags_set(target->doc, pcmk__xf_dirty)) { - crm_trace("No change %d", format); + pcmk__trace("No change %d", format); return NULL; } @@ -271,158 +273,196 @@ xml_create_patchset(int format, xmlNode *source, xmlNode *target, int counter = 0; if (*config_changed) { - crm_xml_add(target, PCMK_XA_NUM_UPDATES, "0"); + pcmk__xe_set(target, PCMK_XA_NUM_UPDATES, "0"); - crm_element_value_int(target, PCMK_XA_EPOCH, &counter); - crm_xml_add_int(target, PCMK_XA_EPOCH, counter + 1); + pcmk__xe_get_int(target, PCMK_XA_EPOCH, &counter); + pcmk__xe_set_int(target, PCMK_XA_EPOCH, counter + 1); } else { - crm_element_value_int(target, PCMK_XA_NUM_UPDATES, &counter); - crm_xml_add_int(target, PCMK_XA_NUM_UPDATES, counter + 1); + pcmk__xe_get_int(target, PCMK_XA_NUM_UPDATES, &counter); + pcmk__xe_set_int(target, PCMK_XA_NUM_UPDATES, counter + 1); } } return xml_create_patchset_v2(source, target); } +/*! + * \internal + * \brief Add a digest of a patchset's target XML to the patchset + * + * \param[in,out] patchset XML patchset + * \param[in] target Target XML + */ void -patchset_process_digest(xmlNode *patch, xmlNode *source, xmlNode *target, - bool with_digest) +pcmk__xml_patchset_add_digest(xmlNode *patchset, const xmlNode *target) { char *digest = NULL; - if ((patch == NULL) || (source == NULL) || (target == NULL) - || !with_digest) { - return; - } + CRM_CHECK((patchset != NULL) && (target != NULL), return); - /* We should always call xml_accept_changes() before calculating a digest. - * Otherwise, with an on-tracking dirty target, we could get a wrong digest. + /* If tracking is enabled and the document is dirty, we could get an + * incorrect digest. Call pcmk__xml_commit_changes() before calling this. */ - CRM_LOG_ASSERT(!pcmk__xml_doc_all_flags_set(target->doc, pcmk__xf_dirty)); + CRM_CHECK(!pcmk__xml_doc_all_flags_set(target->doc, pcmk__xf_dirty), + return); digest = pcmk__digest_xml(target, true); - crm_xml_add(patch, PCMK__XA_DIGEST, digest); + pcmk__xe_set(patchset, PCMK__XA_DIGEST, digest); free(digest); - - return; } -// Get CIB versions used for additions and deletions in a patchset -bool -xml_patch_versions(const xmlNode *patchset, int add[3], int del[3]) +/*! + * \internal + * \brief Get the source and target CIB versions from an XML patchset + * + * Each output object will contain, in order, the following version fields from + * the source and target: + * * \c PCMK_XA_ADMIN_EPOCH + * * \c PCMK_XA_EPOCH + * * \c PCMK_XA_NUM_UPDATES + * + * \param[in] patchset XML patchset + * \param[out] source Where to store versions from source CIB + * \param[out] target Where to store versions from target CIB + * + * \return Standard Pacemaker return code + */ +int +pcmk__xml_patchset_versions(const xmlNode *patchset, int source[3], + int target[3]) { - static const char *const vfields[] = { - PCMK_XA_ADMIN_EPOCH, - PCMK_XA_EPOCH, - PCMK_XA_NUM_UPDATES, - }; - - const xmlNode *version = pcmk__xe_first_child(patchset, PCMK_XE_VERSION, - NULL, NULL); - const xmlNode *source = pcmk__xe_first_child(version, PCMK_XE_SOURCE, NULL, - NULL); - const xmlNode *target = pcmk__xe_first_child(version, PCMK_XE_TARGET, NULL, - NULL); int format = 1; + const xmlNode *version = NULL; + const xmlNode *source_xml = NULL; + const xmlNode *target_xml = NULL; - crm_element_value_int(patchset, PCMK_XA_FORMAT, &format); + CRM_CHECK((patchset != NULL) && (source != NULL) && (target != NULL), + return EINVAL); + + pcmk__xe_get_int(patchset, PCMK_XA_FORMAT, &format); if (format != 2) { - crm_err("Unknown patch format: %d", format); - return -EINVAL; + pcmk__err("Unknown patch format: %d", format); + return EINVAL; } - if (source != NULL) { - for (int i = 0; i < PCMK__NELEM(vfields); i++) { - crm_element_value_int(source, vfields[i], &(del[i])); - crm_trace("Got %d for del[%s]", del[i], vfields[i]); - } + version = pcmk__xe_first_child(patchset, PCMK_XE_VERSION, NULL, NULL); + source_xml = pcmk__xe_first_child(version, PCMK_XE_SOURCE, NULL, NULL); + target_xml = pcmk__xe_first_child(version, PCMK_XE_TARGET, NULL, NULL); + + if ((source_xml == NULL) || (target_xml == NULL)) { + return EINVAL; } - if (target != NULL) { - for (int i = 0; i < PCMK__NELEM(vfields); i++) { - crm_element_value_int(target, vfields[i], &(add[i])); - crm_trace("Got %d for add[%s]", add[i], vfields[i]); + for (int i = 0; i < PCMK__NELEM(vfields); i++) { + if (pcmk__xe_get_int(source_xml, vfields[i], + &(source[i])) != pcmk_rc_ok) { + return EINVAL; } + pcmk__trace("Got %d for source[%s]", source[i], vfields[i]); + + if (pcmk__xe_get_int(target_xml, vfields[i], &(target[i])) + != pcmk_rc_ok) { + return EINVAL; + } + pcmk__trace("Got %d for target[%s]", target[i], vfields[i]); } - return pcmk_ok; + + return pcmk_rc_ok; } /*! * \internal * \brief Check whether patchset can be applied to current CIB * - * \param[in] xml Root of current CIB + * \param[in] cib_root Root of current CIB * \param[in] patchset Patchset to check * * \return Standard Pacemaker return code */ static int -xml_patch_version_check(const xmlNode *xml, const xmlNode *patchset) +check_patchset_versions(const xmlNode *cib_root, const xmlNode *patchset) { - int lpc = 0; - bool changed = FALSE; - - int this[] = { 0, 0, 0 }; - int add[] = { 0, 0, 0 }; - int del[] = { 0, 0, 0 }; - - const char *vfields[] = { - PCMK_XA_ADMIN_EPOCH, - PCMK_XA_EPOCH, - PCMK_XA_NUM_UPDATES, - }; + int current[] = { 0, 0, 0 }; + int source[] = { 0, 0, 0 }; + int target[] = { 0, 0, 0 }; + int rc = pcmk_rc_ok; - for (lpc = 0; lpc < PCMK__NELEM(vfields); lpc++) { - crm_element_value_int(xml, vfields[lpc], &(this[lpc])); - crm_trace("Got %d for this[%s]", this[lpc], vfields[lpc]); - if (this[lpc] < 0) { - this[lpc] = 0; + for (int i = 0; i < PCMK__NELEM(vfields); i++) { + /* @COMPAT We should probably fail with EINVAL for negative or invalid + * valid reason for such values to be present. + * + * Preserve behavior for xml_apply_patchset(). Use new behavior in + * libpacemaker replacement. + */ + if (pcmk__xe_get_int(cib_root, vfields[i], + &(current[i])) == pcmk_rc_ok) { + pcmk__trace("Got %d for current[%s]%s", current[i], vfields[i], + ((current[i] < 0)? ", using 0" : "")); + } else { + pcmk__debug("Failed to get value for current[%s], using 0", + vfields[i]); + } + if (current[i] < 0) { + current[i] = 0; } } - /* Set some defaults in case nothing is present */ - add[0] = this[0]; - add[1] = this[1]; - add[2] = this[2] + 1; - for (lpc = 0; lpc < PCMK__NELEM(vfields); lpc++) { - del[lpc] = this[lpc]; + /* Set some defaults in case nothing is present. + * + * @COMPAT We should probably skip this step, and fail immediately below if + * target[i] < source[i]. + * + * Preserve behavior for xml_apply_patchset(). Use new behavior in + * libpacemaker replacement. + */ + target[0] = current[0]; + target[1] = current[1]; + target[2] = current[2] + 1; + for (int i = 0; i < PCMK__NELEM(vfields); i++) { + source[i] = current[i]; } - xml_patch_versions(patchset, add, del); + rc = pcmk__xml_patchset_versions(patchset, source, target); + if (rc != pcmk_rc_ok) { + return rc; + } - for (lpc = 0; lpc < PCMK__NELEM(vfields); lpc++) { - if (this[lpc] < del[lpc]) { - crm_debug("Current %s is too low (%d.%d.%d < %d.%d.%d --> %d.%d.%d)", - vfields[lpc], this[0], this[1], this[2], - del[0], del[1], del[2], add[0], add[1], add[2]); + // Ensure current version matches patchset source version + for (int i = 0; i < PCMK__NELEM(vfields); i++) { + if (current[i] < source[i]) { + pcmk__debug("Current %s is too low " + "(%d.%d.%d < %d.%d.%d --> %d.%d.%d)", + vfields[i], current[0], current[1], current[2], + source[0], source[1], source[2], + target[0], target[1], target[2]); return pcmk_rc_diff_resync; - - } else if (this[lpc] > del[lpc]) { - crm_info("Current %s is too high (%d.%d.%d > %d.%d.%d --> %d.%d.%d) %p", - vfields[lpc], this[0], this[1], this[2], - del[0], del[1], del[2], add[0], add[1], add[2], patchset); - crm_log_xml_info(patchset, "OldPatch"); + } + if (current[i] > source[i]) { + pcmk__info("Current %s is too high " + "(%d.%d.%d > %d.%d.%d --> %d.%d.%d)", + vfields[i], current[0], current[1], current[2], + source[0], source[1], source[2], + target[0], target[1], target[2]); + pcmk__log_xml_info(patchset, "OldPatch"); return pcmk_rc_old_data; } } - for (lpc = 0; lpc < PCMK__NELEM(vfields); lpc++) { - if (add[lpc] > del[lpc]) { - changed = TRUE; + // Ensure target version is newer than source version + for (int i = 0; i < PCMK__NELEM(vfields); i++) { + if (target[i] > source[i]) { + pcmk__debug("Can apply patch %d.%d.%d to %d.%d.%d", + target[0], target[1], target[2], + current[0], current[1], current[2]); + return pcmk_rc_ok; } } - if (!changed) { - crm_notice("Versions did not change in patch %d.%d.%d", - add[0], add[1], add[2]); - return pcmk_rc_old_data; - } - - crm_debug("Can apply patch %d.%d.%d to %d.%d.%d", - add[0], add[1], add[2], this[0], this[1], this[2]); - return pcmk_rc_ok; + pcmk__notice("Versions did not change in patch %d.%d.%d", + target[0], target[1], target[2]); + return pcmk_rc_old_data; } // Return first child matching element name and optionally id or position @@ -478,7 +518,6 @@ search_v2_xpath(const xmlNode *top, const char *key, int target_position) char *remainder; char *id; char *tag; - char *path = NULL; int rc; size_t key_len; @@ -530,11 +569,17 @@ search_v2_xpath(const xmlNode *top, const char *key, int target_position) } while ((rc == 2) && target); if (target) { - crm_trace("Found %s for %s", - (path = (char *) xmlGetNodePath(target)), key); - free(path); + pcmk__if_tracing( + { + char *path = (char *) xmlGetNodePath(target); + + pcmk__trace("Found %s for %s", path, key); + free(path); + }, + {} + ); } else { - crm_debug("No match for %s", key); + pcmk__debug("No match for %s", key); } free(remainder); @@ -557,8 +602,8 @@ sort_change_obj_by_position(gconstpointer a, gconstpointer b) int position_a = -1; int position_b = -1; - crm_element_value_int(change_obj_a->change, PCMK_XE_POSITION, &position_a); - crm_element_value_int(change_obj_b->change, PCMK_XE_POSITION, &position_b); + pcmk__xe_get_int(change_obj_a->change, PCMK_XE_POSITION, &position_a); + pcmk__xe_get_int(change_obj_b->change, PCMK_XE_POSITION, &position_b); if (position_a < position_b) { return -1; @@ -590,31 +635,31 @@ apply_v2_patchset(xmlNode *xml, const xmlNode *patchset) for (change = pcmk__xml_first_child(patchset); change != NULL; change = pcmk__xml_next(change)) { xmlNode *match = NULL; - const char *op = crm_element_value(change, PCMK_XA_OPERATION); - const char *xpath = crm_element_value(change, PCMK_XA_PATH); + const char *op = pcmk__xe_get(change, PCMK_XA_OPERATION); + const char *xpath = pcmk__xe_get(change, PCMK_XA_PATH); int position = -1; if (op == NULL) { continue; } - crm_trace("Processing %s %s", change->name, op); + pcmk__trace("Processing %s %s", change->name, op); /* PCMK_VALUE_DELETE changes for XML comments are generated with * PCMK_XE_POSITION */ if (strcmp(op, PCMK_VALUE_DELETE) == 0) { - crm_element_value_int(change, PCMK_XE_POSITION, &position); + pcmk__xe_get_int(change, PCMK_XE_POSITION, &position); } match = search_v2_xpath(xml, xpath, position); - crm_trace("Performing %s on %s with %p", op, xpath, match); + pcmk__trace("Performing %s on %s with %p", op, xpath, match); if ((match == NULL) && (strcmp(op, PCMK_VALUE_DELETE) == 0)) { - crm_debug("No %s match for %s in %p", op, xpath, xml->doc); + pcmk__debug("No %s match for %s in %p", op, xpath, xml->doc); continue; } else if (match == NULL) { - crm_err("No %s match for %s in %p", op, xpath, xml->doc); + pcmk__err("No %s match for %s in %p", op, xpath, xml->doc); rc = pcmk_rc_diff_failed; continue; @@ -658,11 +703,11 @@ apply_v2_patchset(xmlNode *xml, const xmlNode *patchset) const char *name = (const char *) pIter->name; const char *value = pcmk__xml_attr_value(pIter); - crm_xml_add(match, name, value); + pcmk__xe_set(match, name, value); } } else { - crm_err("Unknown operation: %s", op); + pcmk__err("Unknown operation: %s", op); rc = pcmk_rc_diff_failed; } } @@ -678,10 +723,10 @@ apply_v2_patchset(xmlNode *xml, const xmlNode *patchset) change = change_obj->change; - op = crm_element_value(change, PCMK_XA_OPERATION); - xpath = crm_element_value(change, PCMK_XA_PATH); + op = pcmk__xe_get(change, PCMK_XA_OPERATION); + xpath = pcmk__xe_get(change, PCMK_XA_PATH); - crm_trace("Continue performing %s on %s with %p", op, xpath, match); + pcmk__trace("Continue performing %s on %s with %p", op, xpath, match); if (strcmp(op, PCMK_VALUE_CREATE) == 0) { int position = 0; @@ -689,7 +734,7 @@ apply_v2_patchset(xmlNode *xml, const xmlNode *patchset) xmlNode *match_child = NULL; match_child = match->children; - crm_element_value_int(change, PCMK_XE_POSITION, &position); + pcmk__xe_get_int(change, PCMK_XE_POSITION, &position); while ((match_child != NULL) && (position != pcmk__xml_position(match_child, pcmk__xf_skip))) { @@ -699,18 +744,18 @@ apply_v2_patchset(xmlNode *xml, const xmlNode *patchset) child = pcmk__xml_copy(match, change->children); if (match_child != NULL) { - crm_trace("Adding %s at position %d", child->name, position); + pcmk__trace("Adding %s at position %d", child->name, position); xmlAddPrevSibling(match_child, child); } else { - crm_trace("Adding %s at position %d (end)", - child->name, position); + pcmk__trace("Adding %s at position %d (end)", child->name, + position); } } else if (strcmp(op, PCMK_VALUE_MOVE) == 0) { int position = 0; - crm_element_value_int(change, PCMK_XE_POSITION, &position); + pcmk__xe_get_int(change, PCMK_XE_POSITION, &position); if (position != pcmk__xml_position(match, pcmk__xf_skip)) { xmlNode *match_child = NULL; int p = position; @@ -727,11 +772,13 @@ apply_v2_patchset(xmlNode *xml, const xmlNode *patchset) match_child = match_child->next; } - crm_trace("Moving %s to position %d (was %d, prev %p, %s %p)", - match->name, position, - pcmk__xml_position(match, pcmk__xf_skip), - match->prev, (match_child? "next":"last"), - (match_child? match_child : match->parent->last)); + pcmk__trace("Moving %s to position %d (was %d, prev %p, %s %p)", + match->name, position, + pcmk__xml_position(match, pcmk__xf_skip), + match->prev, + ((match_child != NULL)? "next" : "last"), + ((match_child != NULL)? match_child + : match->parent->last)); if (match_child) { xmlAddPrevSibling(match_child, match); @@ -742,15 +789,15 @@ apply_v2_patchset(xmlNode *xml, const xmlNode *patchset) } } else { - crm_trace("%s is already in position %d", - match->name, position); + pcmk__trace("%s is already in position %d", match->name, + position); } if (position != pcmk__xml_position(match, pcmk__xf_skip)) { - crm_err("Moved %s.%s to position %d instead of %d (%p)", - match->name, pcmk__xe_id(match), - pcmk__xml_position(match, pcmk__xf_skip), - position, match->prev); + pcmk__err("Moved %s.%s to position %d instead of %d (%p)", + match->name, pcmk__xe_id(match), + pcmk__xml_position(match, pcmk__xf_skip), + position, match->prev); rc = pcmk_rc_diff_failed; } } @@ -761,7 +808,7 @@ apply_v2_patchset(xmlNode *xml, const xmlNode *patchset) } int -xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version) +xml_apply_patchset(xmlNode *xml, const xmlNode *patchset, bool check_version) { int format = 1; int rc = pcmk_ok; @@ -772,16 +819,16 @@ xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version) return rc; } - pcmk__log_xml_patchset(LOG_TRACE, patchset); + pcmk__log_xml_patchset(PCMK__LOG_TRACE, patchset); if (check_version) { - rc = pcmk_rc2legacy(xml_patch_version_check(xml, patchset)); + rc = pcmk_rc2legacy(check_patchset_versions(xml, patchset)); if (rc != pcmk_ok) { return rc; } } - digest = crm_element_value(patchset, PCMK__XA_DIGEST); + digest = pcmk__xe_get(patchset, PCMK__XA_DIGEST); if (digest != NULL) { /* Make original XML available for logging in case result doesn't have * expected digest @@ -790,10 +837,10 @@ xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version) } if (rc == pcmk_ok) { - crm_element_value_int(patchset, PCMK_XA_FORMAT, &format); + pcmk__xe_get_int(patchset, PCMK_XA_FORMAT, &format); if (format != 2) { - crm_err("Unknown patch format: %d", format); + pcmk__err("Unknown patch format: %d", format); rc = -EINVAL; } else { @@ -806,21 +853,22 @@ xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version) new_digest = pcmk__digest_xml(xml, true); if (!pcmk__str_eq(new_digest, digest, pcmk__str_casei)) { - crm_info("v%d digest mis-match: expected %s, calculated %s", - format, digest, new_digest); + pcmk__info("v%d digest mis-match: expected %s, calculated %s", + format, digest, new_digest); rc = -pcmk_err_diff_failed; pcmk__if_tracing( { - save_xml_to_file(old, "PatchDigest:input", NULL); - save_xml_to_file(xml, "PatchDigest:result", NULL); - save_xml_to_file(patchset, "PatchDigest:diff", NULL); + pcmk__xml_write_temp_file(old, "PatchDigest:input", NULL); + pcmk__xml_write_temp_file(xml, "PatchDigest:result", NULL); + pcmk__xml_write_temp_file(patchset, "PatchDigest:diff", + NULL); }, {} ); } else { - crm_trace("v%d digest matched: expected %s, calculated %s", - format, digest, new_digest); + pcmk__trace("v%d digest matched: expected %s, calculated %s", + format, digest, new_digest); } free(new_digest); } @@ -828,6 +876,18 @@ xml_apply_patchset(xmlNode *xml, xmlNode *patchset, bool check_version) return rc; } +/*! + * \internal + * \brief Check whether a given CIB element was modified in a CIB patchset + * + * \param[in] patchset CIB XML patchset + * \param[in] element XML tag of CIB element to check (\c NULL is equivalent + * to \c PCMK_XE_CIB). Supported values include any CIB + * element supported by \c pcmk__cib_abs_xpath_for(). + * + * \retval \c true if \p element was modified + * \retval \c false otherwise + */ bool pcmk__cib_element_in_patchset(const xmlNode *patchset, const char *element) { @@ -839,9 +899,9 @@ pcmk__cib_element_in_patchset(const xmlNode *patchset, const char *element) pcmk__assert(patchset != NULL); - crm_element_value_int(patchset, PCMK_XA_FORMAT, &format); + pcmk__xe_get_int(patchset, PCMK_XA_FORMAT, &format); if (format != 2) { - crm_warn("Unknown patch format: %d", format); + pcmk__warn("Unknown patch format: %d", format); return false; } @@ -854,14 +914,14 @@ pcmk__cib_element_in_patchset(const xmlNode *patchset, const char *element) * @TODO Use POSIX word boundary instead of (/|$), if it works: * https://www.regular-expressions.info/wordboundaries.html. */ - element_regex = crm_strdup_printf("^%s(/|$)", element_xpath); + element_regex = pcmk__assert_asprintf("^%s(/|$)", element_xpath); for (const xmlNode *change = pcmk__xe_first_child(patchset, PCMK_XE_CHANGE, NULL, NULL); change != NULL; change = pcmk__xe_next(change, PCMK_XE_CHANGE)) { - const char *op = crm_element_value(change, PCMK_XA_OPERATION); - const char *diff_xpath = crm_element_value(change, PCMK_XA_PATH); + const char *op = pcmk__xe_get(change, PCMK_XA_OPERATION); + const char *diff_xpath = pcmk__xe_get(change, PCMK_XA_PATH); if (pcmk__str_eq(diff_xpath, element_regex, pcmk__str_regex)) { // Change to an existing element @@ -882,3 +942,70 @@ pcmk__cib_element_in_patchset(const xmlNode *patchset, const char *element) free(element_regex); return rc; } + +// Deprecated functions kept only for backward API compatibility +// LCOV_EXCL_START + +#include + +// Return value of true means failure; false means success +bool +xml_patch_versions(const xmlNode *patchset, int add[3], int del[3]) +{ + const xmlNode *version = pcmk__xe_first_child(patchset, PCMK_XE_VERSION, + NULL, NULL); + const xmlNode *source = pcmk__xe_first_child(version, PCMK_XE_SOURCE, NULL, + NULL); + const xmlNode *target = pcmk__xe_first_child(version, PCMK_XE_TARGET, NULL, + NULL); + int format = 1; + + pcmk__xe_get_int(patchset, PCMK_XA_FORMAT, &format); + if (format != 2) { + pcmk__err("Unknown patch format: %d", format); + return true; + } + + if (source != NULL) { + for (int i = 0; i < PCMK__NELEM(vfields); i++) { + pcmk__xe_get_int(source, vfields[i], &(del[i])); + pcmk__trace("Got %d for del[%s]", del[i], vfields[i]); + } + } + + if (target != NULL) { + for (int i = 0; i < PCMK__NELEM(vfields); i++) { + pcmk__xe_get_int(target, vfields[i], &(add[i])); + pcmk__trace("Got %d for add[%s]", add[i], vfields[i]); + } + } + return false; +} + +void +patchset_process_digest(xmlNode *patch, const xmlNode *source, + const xmlNode *target, bool with_digest) +{ + char *digest = NULL; + + if ((patch == NULL) || (source == NULL) || (target == NULL) + || !with_digest) { + return; + } + + /* We should always call pcmk__xml_commit_changes() before calculating a + * digest. Otherwise, with an on-tracking dirty target, we could get a wrong + * digest. + */ + CRM_LOG_ASSERT(!pcmk__xml_doc_all_flags_set(target->doc, pcmk__xf_dirty)); + + digest = pcmk__digest_xml(target, true); + + pcmk__xe_set(patch, PCMK__XA_DIGEST, digest); + free(digest); + + return; +} + +// LCOV_EXCL_STOP +// End deprecated API diff --git a/lib/common/patchset_display.c b/lib/common/patchset_display.c index 5ddbdbc5337..4c773b614d0 100644 --- a/lib/common/patchset_display.c +++ b/lib/common/patchset_display.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -44,11 +44,11 @@ xml_show_patchset_header(pcmk__output_t *out, const xmlNode *patchset) int add[] = { 0, 0, 0 }; int del[] = { 0, 0, 0 }; - xml_patch_versions(patchset, add, del); + pcmk__xml_patchset_versions(patchset, del, add); if ((add[0] != del[0]) || (add[1] != del[1]) || (add[2] != del[2])) { - const char *fmt = crm_element_value(patchset, PCMK_XA_FORMAT); - const char *digest = crm_element_value(patchset, PCMK__XA_DIGEST); + const char *fmt = pcmk__xe_get(patchset, PCMK_XA_FORMAT); + const char *digest = pcmk__xe_get(patchset, PCMK__XA_DIGEST); out->info(out, "Diff: --- %d.%d.%d %s", del[0], del[1], del[2], fmt); rc = out->info(out, "Diff: +++ %d.%d.%d %s", @@ -86,16 +86,17 @@ xml_show_patchset(pcmk__output_t *out, const xmlNode *patchset) NULL); change != NULL; change = pcmk__xe_next(change, NULL)) { - const char *op = crm_element_value(change, PCMK_XA_OPERATION); - const char *xpath = crm_element_value(change, PCMK_XA_PATH); + const char *op = pcmk__xe_get(change, PCMK_XA_OPERATION); + const char *xpath = pcmk__xe_get(change, PCMK_XA_PATH); if (op == NULL) { continue; } if (strcmp(op, PCMK_VALUE_CREATE) == 0) { - char *prefix = crm_strdup_printf(PCMK__XML_PREFIX_CREATED " %s: ", - xpath); + char *prefix = pcmk__assert_asprintf(PCMK__XML_PREFIX_CREATED + " %s: ", + xpath); temp_rc = pcmk__xml_show(out, prefix, change->children, 0, pcmk__xml_fmt_pretty|pcmk__xml_fmt_open); @@ -114,7 +115,7 @@ xml_show_patchset(pcmk__output_t *out, const xmlNode *patchset) free(prefix); } else if (strcmp(op, PCMK_VALUE_MOVE) == 0) { - const char *position = crm_element_value(change, PCMK_XE_POSITION); + const char *position = pcmk__xe_get(change, PCMK_XE_POSITION); temp_rc = out->info(out, PCMK__XML_PREFIX_MOVED " %s moved to offset %s", @@ -131,15 +132,15 @@ xml_show_patchset(pcmk__output_t *out, const xmlNode *patchset) NULL); child != NULL; child = pcmk__xe_next(child, NULL)) { - const char *name = crm_element_value(child, PCMK_XA_NAME); + const char *name = pcmk__xe_get(child, PCMK_XA_NAME); - op = crm_element_value(child, PCMK_XA_OPERATION); + op = pcmk__xe_get(child, PCMK_XA_OPERATION); if (op == NULL) { continue; } if (strcmp(op, "set") == 0) { - const char *value = crm_element_value(child, PCMK_XA_VALUE); + const char *value = pcmk__xe_get(child, PCMK_XA_VALUE); pcmk__add_separated_word(&buffer_set, 256, "@", ", "); pcmk__g_strcat(buffer_set, name, "=", value, NULL); @@ -166,7 +167,7 @@ xml_show_patchset(pcmk__output_t *out, const xmlNode *patchset) } else if (strcmp(op, PCMK_VALUE_DELETE) == 0) { int position = -1; - crm_element_value_int(change, PCMK_XE_POSITION, &position); + pcmk__xe_get_int(change, PCMK_XE_POSITION, &position); if (position >= 0) { temp_rc = out->info(out, "-- %s (%d)", xpath, position); } else { @@ -203,13 +204,13 @@ xml_patchset_default(pcmk__output_t *out, va_list args) int format = 1; if (patchset == NULL) { - crm_trace("Empty patch"); + pcmk__trace("Empty patch"); return pcmk_rc_no_output; } - crm_element_value_int(patchset, PCMK_XA_FORMAT, &format); + pcmk__xe_get_int(patchset, PCMK_XA_FORMAT, &format); if (format != 2) { - crm_err("Unknown patch format: %d", format); + pcmk__err("Unknown patch format: %d", format); return pcmk_rc_bad_xml_patch; } @@ -242,12 +243,12 @@ xml_patchset_log(pcmk__output_t *out, va_list args) uint8_t log_level = pcmk__output_get_log_level(out); int format = 1; - if (log_level == LOG_NEVER) { + if (log_level == PCMK__LOG_NEVER) { return pcmk_rc_no_output; } if (patchset == NULL) { - crm_trace("Empty patch"); + pcmk__trace("Empty patch"); return pcmk_rc_no_output; } @@ -262,9 +263,9 @@ xml_patchset_log(pcmk__output_t *out, va_list args) return pcmk_rc_no_output; } - crm_element_value_int(patchset, PCMK_XA_FORMAT, &format); + pcmk__xe_get_int(patchset, PCMK_XA_FORMAT, &format); if (format != 2) { - crm_err("Unknown patch format: %d", format); + pcmk__err("Unknown patch format: %d", format); return pcmk_rc_bad_xml_patch; } @@ -302,7 +303,7 @@ xml_patchset_xml(pcmk__output_t *out, va_list args) g_string_free(buf, TRUE); return pcmk_rc_ok; } - crm_trace("Empty patch"); + pcmk__trace("Empty patch"); return pcmk_rc_no_output; } diff --git a/lib/common/pid.c b/lib/common/pid.c index a82d7949aa3..f4ae4a13b57 100644 --- a/lib/common/pid.c +++ b/lib/common/pid.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -37,8 +37,8 @@ pcmk__pid_active(pid_t pid, const char *daemon) } rc = errno; if (last_asked_pid != pid) { - crm_info("Cannot examine PID %lld: %s", - (long long) pid, pcmk_rc_str(rc)); + pcmk__info("Cannot examine PID %lld: %s", (long long) pid, + pcmk_rc_str(rc)); last_asked_pid = pid; } return rc; /* errno != ESRCH */ @@ -59,13 +59,13 @@ pcmk__pid_active(pid_t pid, const char *daemon) } if (last_asked_pid != pid) { if (rc == EACCES) { - crm_info("Could not get executable for PID %lld: %s " - QB_XS " rc=%d", - (long long) pid, pcmk_rc_str(rc), rc); + pcmk__info("Could not get executable for PID %lld: %s " + QB_XS " rc=%d", + (long long) pid, pcmk_rc_str(rc), rc); } else { - crm_err("Could not get executable for PID %lld: %s " - QB_XS " rc=%d", - (long long) pid, pcmk_rc_str(rc), rc); + pcmk__err("Could not get executable for PID %lld: %s " + QB_XS " rc=%d", + (long long) pid, pcmk_rc_str(rc), rc); } last_asked_pid = pid; } @@ -139,7 +139,7 @@ pcmk__read_pidfile(const char *filename, pid_t *pid) } else { rc = pcmk_rc_ok; *pid = (pid_t) pid_read; - crm_trace("Read pid %lld from %s", pid_read, filename); + pcmk__trace("Read pid %lld from %s", pid_read, filename); } } else if (rc == 0) { rc = ENODATA; diff --git a/lib/common/probes.c b/lib/common/probes.c index 776b911e02d..2b513a44eaa 100644 --- a/lib/common/probes.c +++ b/lib/common/probes.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -51,11 +51,9 @@ pcmk_xe_is_probe(const xmlNode *xml) return false; } - pcmk__scan_min_int(crm_element_value(xml, PCMK_META_INTERVAL), - &interval_ms, 0); + pcmk__scan_min_int(pcmk__xe_get(xml, PCMK_META_INTERVAL), &interval_ms, 0); - return pcmk_is_probe(crm_element_value(xml, PCMK_XA_OPERATION), - interval_ms); + return pcmk_is_probe(pcmk__xe_get(xml, PCMK_XA_OPERATION), interval_ms); } /*! @@ -76,8 +74,8 @@ pcmk_xe_mask_probe_failure(const xmlNode *xml) return false; } - crm_element_value_int(xml, PCMK__XA_OP_STATUS, &exec_status); - crm_element_value_int(xml, PCMK__XA_RC_CODE, &exit_status); + pcmk__xe_get_int(xml, PCMK__XA_OP_STATUS, &exec_status); + pcmk__xe_get_int(xml, PCMK__XA_RC_CODE, &exit_status); return (exit_status == PCMK_OCF_NOT_INSTALLED) || (exit_status == PCMK_OCF_INVALID_PARAM) diff --git a/lib/common/procfs.c b/lib/common/procfs.c index a6b0d8e7ac8..e76bbd38f26 100644 --- a/lib/common/procfs.c +++ b/lib/common/procfs.c @@ -1,5 +1,5 @@ /* - * Copyright 2015-2024 the Pacemaker project contributors + * Copyright 2015-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -33,7 +33,10 @@ find_cib_loadfile(const char *server) { pid_t pid = pcmk__procfs_pid_of(server); - return pid? crm_strdup_printf("/proc/%lld/stat", (long long) pid) : NULL; + if (pid == 0) { + return NULL; + } + return pcmk__assert_asprintf("/proc/%lld/stat", (long long) pid); } /*! @@ -134,7 +137,8 @@ pcmk__procfs_pid_of(const char *name) dp = opendir("/proc"); if (dp == NULL) { - crm_notice("Can not read /proc directory to track existing components"); + pcmk__notice("Can not read /proc directory to track existing " + "components"); return 0; } @@ -143,7 +147,8 @@ pcmk__procfs_pid_of(const char *name) && pcmk__str_eq(entry_name, name, pcmk__str_casei) && (pcmk__pid_active(pid, NULL) == pcmk_rc_ok)) { - crm_info("Found %s active as process %lld", name, (long long) pid); + pcmk__info("Found %s active as process %lld", name, + (long long) pid); break; } pid = 0; @@ -286,7 +291,7 @@ pcmk__sysrq_trigger(char t) FILE *procf = fopen("/proc/sysrq-trigger", "a"); if (procf == NULL) { - crm_warn("Could not open sysrq-trigger: %s", strerror(errno)); + pcmk__warn("Could not open sysrq-trigger: %s", strerror(errno)); } else { fprintf(procf, "%c\n", t); fclose(procf); @@ -363,19 +368,19 @@ pcmk__throttle_cib_load(const char *server, float *load) loadfile = find_cib_loadfile(server); if (loadfile == NULL) { - crm_warn("Couldn't find CIB load file"); + pcmk__warn("Couldn't find CIB load file"); return false; } ticks_per_s = sysconf(_SC_CLK_TCK); - crm_trace("Found %s", loadfile); + pcmk__trace("Found %s", loadfile); } stream = fopen(loadfile, "r"); if (stream == NULL) { int rc = errno; - crm_warn("Couldn't read %s: %s (%d)", loadfile, pcmk_rc_str(rc), rc); + pcmk__warn("Couldn't read %s: %s (%d)", loadfile, pcmk_rc_str(rc), rc); free(loadfile); loadfile = NULL; return false; @@ -393,7 +398,7 @@ pcmk__throttle_cib_load(const char *server, float *load) free(comm); if (rc != 15) { - crm_err("Only %d of 15 fields found in %s", rc, loadfile); + pcmk__err("Only %d of 15 fields found in %s", rc, loadfile); fclose(stream); return false; @@ -406,12 +411,12 @@ pcmk__throttle_cib_load(const char *server, float *load) *load = delta_utime + delta_stime; /* Cast to a float before division */ *load /= ticks_per_s; *load /= elapsed; - crm_debug("cib load: %f (%lu ticks in %lds)", *load, - delta_utime + delta_stime, (long) elapsed); + pcmk__debug("cib load: %f (%lu ticks in %llds)", *load, + (delta_utime + delta_stime), (long long) elapsed); } else { - crm_debug("Init %lu + %lu ticks at %ld (%lu tps)", utime, stime, - (long) now, ticks_per_s); + pcmk__debug("Init %lu + %lu ticks at %lld (%lu tps)", utime, stime, + (long long) now, ticks_per_s); } last_call = now; @@ -442,7 +447,7 @@ pcmk__throttle_load_avg(float *load) stream = fopen(loadfile, "r"); if (stream == NULL) { int rc = errno; - crm_warn("Couldn't read %s: %s (%d)", loadfile, pcmk_rc_str(rc), rc); + pcmk__warn("Couldn't read %s: %s (%d)", loadfile, pcmk_rc_str(rc), rc); return false; } diff --git a/lib/common/remote.c b/lib/common/remote.c index 1cb9522a61a..8a33d20223e 100644 --- a/lib/common/remote.c +++ b/lib/common/remote.c @@ -105,9 +105,9 @@ localized_remote_header(pcmk__remote_t *remote) CRM_LOG_ASSERT(endian == ENDIAN_LOCAL); if(endian != ENDIAN_LOCAL) { - crm_err("Invalid message detected, endian mismatch: %" PRIx32 - " is neither %" PRIx32 " nor the swab'd %" PRIx32, - ENDIAN_LOCAL, header->endian, endian); + pcmk__err("Invalid message detected, endian mismatch: %" PRIx32 + " is neither %" PRIx32 " nor the swab'd %" PRIx32, + ENDIAN_LOCAL, header->endian, endian); return NULL; } @@ -137,26 +137,27 @@ send_tls(gnutls_session_t session, struct iovec *iov) return EINVAL; } - crm_trace("Sending TLS message of %zu bytes", unsent_len); + pcmk__trace("Sending TLS message of %zu bytes", unsent_len); while (true) { gnutls_rc = gnutls_record_send(session, unsent, unsent_len); if (gnutls_rc == GNUTLS_E_INTERRUPTED || gnutls_rc == GNUTLS_E_AGAIN) { - crm_trace("Retrying to send %zu bytes remaining", unsent_len); + pcmk__trace("Retrying to send %zu bytes remaining", unsent_len); } else if (gnutls_rc < 0) { // Caller can log as error if necessary - crm_info("TLS connection terminated: %s " QB_XS " rc=%zd", - gnutls_strerror((int) gnutls_rc), gnutls_rc); + pcmk__info("TLS connection terminated: %s " QB_XS " rc=%zd", + gnutls_strerror((int) gnutls_rc), gnutls_rc); return ECONNABORTED; } else if (gnutls_rc < unsent_len) { - crm_trace("Sent %zd of %zu bytes remaining", gnutls_rc, unsent_len); + pcmk__trace("Sent %zd of %zu bytes remaining", gnutls_rc, + unsent_len); unsent_len -= gnutls_rc; unsent += gnutls_rc; } else { - crm_trace("Sent all %zd bytes remaining", gnutls_rc); + pcmk__trace("Sent all %zd bytes remaining", gnutls_rc); break; } } @@ -174,8 +175,8 @@ send_plaintext(int sock, struct iovec *iov) return EINVAL; } - crm_debug("Sending plaintext message of %zu bytes to socket %d", - unsent_len, sock); + pcmk__debug("Sending plaintext message of %zu bytes to socket %d", + unsent_len, sock); while (true) { ssize_t write_rc = write(sock, unsent, unsent_len); @@ -183,24 +184,25 @@ send_plaintext(int sock, struct iovec *iov) int rc = errno; if ((rc == EINTR) || (rc == EAGAIN) || (rc == EWOULDBLOCK)) { - crm_trace("Retrying to send %zu bytes remaining to socket %d", - unsent_len, sock); + pcmk__trace("Retrying to send %zu bytes remaining to socket %d", + unsent_len, sock); continue; } // Caller can log as error if necessary - crm_info("Could not send message: %s " QB_XS " rc=%d socket=%d", - pcmk_rc_str(rc), rc, sock); + pcmk__info("Could not send message: %s " QB_XS " rc=%d socket=%d", + pcmk_rc_str(rc), rc, sock); return rc; } else if (write_rc < unsent_len) { - crm_trace("Sent %zd of %zu bytes remaining", write_rc, unsent_len); + pcmk__trace("Sent %zd of %zu bytes remaining", write_rc, + unsent_len); unsent += write_rc; unsent_len -= write_rc; } else { - crm_trace("Sent all %zd bytes remaining: %.100s", - write_rc, (char *) (iov->iov_base)); + pcmk__trace("Sent all %zd bytes remaining: %.100s", write_rc, + (const char *) iov->iov_base); return pcmk_rc_ok; } } @@ -270,8 +272,8 @@ pcmk__remote_send_xml(pcmk__remote_t *remote, const xmlNode *msg) rc = remote_send_iovs(remote, iov, 2); if (rc != pcmk_rc_ok) { - crm_err("Could not send remote message: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__err("Could not send remote message: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); } free(iov[0].iov_base); @@ -305,8 +307,8 @@ pcmk__remote_message_xml(pcmk__remote_t *remote) char *uncompressed = pcmk__assert_alloc(1, header->payload_offset + size_u); - crm_trace("Decompressing message data %d bytes into %d bytes", - header->payload_compressed, size_u); + pcmk__trace("Decompressing message data %d bytes into %d bytes", + header->payload_compressed, size_u); rc = BZ2_bzBuffToBuffDecompress(uncompressed + header->payload_offset, &size_u, remote->buffer + header->payload_offset, @@ -314,14 +316,15 @@ pcmk__remote_message_xml(pcmk__remote_t *remote) rc = pcmk__bzlib2rc(rc); if (rc != pcmk_rc_ok && header->version > REMOTE_MSG_VERSION) { - crm_warn("Couldn't decompress v%d message, we only understand v%d", - header->version, REMOTE_MSG_VERSION); + pcmk__warn("Couldn't decompress v%d message, we only understand " + "v%d", + header->version, REMOTE_MSG_VERSION); free(uncompressed); return NULL; } else if (rc != pcmk_rc_ok) { - crm_err("Decompression failed: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__err("Decompression failed: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); free(uncompressed); return NULL; } @@ -343,14 +346,15 @@ pcmk__remote_message_xml(pcmk__remote_t *remote) xml = pcmk__xml_parse(remote->buffer + header->payload_offset); if (xml == NULL && header->version > REMOTE_MSG_VERSION) { - crm_warn("Couldn't parse v%d message, we only understand v%d", - header->version, REMOTE_MSG_VERSION); + pcmk__warn("Couldn't parse v%d message, we only understand v%d", + header->version, REMOTE_MSG_VERSION); } else if (xml == NULL) { - crm_err("Couldn't parse: '%.120s'", remote->buffer + header->payload_offset); + pcmk__err("Couldn't parse: '%.120s'", + remote->buffer + header->payload_offset); } - crm_log_xml_trace(xml, "[remote msg]"); + pcmk__log_xml_trace(xml, "[remote msg]"); return xml; } @@ -363,7 +367,7 @@ get_remote_socket(const pcmk__remote_t *remote) if (remote->tcp_socket >= 0) { return remote->tcp_socket; } - crm_err("Remote connection type undetermined (bug?)"); + pcmk__err("Remote connection type undetermined (bug?)"); return -1; } @@ -389,7 +393,7 @@ pcmk__remote_ready(const pcmk__remote_t *remote, int timeout_ms) sock = get_remote_socket(remote); if (sock < 0) { - crm_trace("No longer connected"); + pcmk__trace("No longer connected"); return ENOTCONN; } @@ -446,7 +450,7 @@ pcmk__read_available_remote_data(pcmk__remote_t *remote) /* automatically grow the buffer when needed */ if(remote->buffer_size < read_len) { remote->buffer_size = 2 * read_len; - crm_trace("Expanding buffer to %zu bytes", remote->buffer_size); + pcmk__trace("Expanding buffer to %zu bytes", remote->buffer_size); remote->buffer = pcmk__realloc(remote->buffer, remote->buffer_size + 1); } @@ -459,8 +463,8 @@ pcmk__read_available_remote_data(pcmk__remote_t *remote) } else if (read_rc == GNUTLS_E_AGAIN) { rc = EAGAIN; } else if (read_rc < 0) { - crm_debug("TLS receive failed: %s (%zd)", - gnutls_strerror((int) read_rc), read_rc); + pcmk__debug("TLS receive failed: %s (%zd)", + gnutls_strerror((int) read_rc), read_rc); rc = EIO; } } else if (remote->tcp_socket >= 0) { @@ -471,7 +475,7 @@ pcmk__read_available_remote_data(pcmk__remote_t *remote) rc = errno; } } else { - crm_err("Remote connection type undetermined (bug?)"); + pcmk__err("Remote connection type undetermined (bug?)"); return ESOCKTNOSUPPORT; } @@ -480,32 +484,33 @@ pcmk__read_available_remote_data(pcmk__remote_t *remote) remote->buffer_offset += read_rc; /* always null terminate buffer, the +1 to alloc always allows for this. */ remote->buffer[remote->buffer_offset] = '\0'; - crm_trace("Received %zd more bytes (%zu total)", - read_rc, remote->buffer_offset); + pcmk__trace("Received %zd more bytes (%zu total)", read_rc, + remote->buffer_offset); } else if (read_rc == 0) { - crm_debug("End of remote data encountered after %zu bytes", - remote->buffer_offset); + pcmk__debug("End of remote data encountered after %zu bytes", + remote->buffer_offset); return ENOTCONN; } else if ((rc == EINTR) || (rc == EAGAIN) || (rc == EWOULDBLOCK)) { - crm_trace("No data available for non-blocking remote read: %s (%d)", - pcmk_rc_str(rc), rc); + pcmk__trace("No data available for non-blocking remote read: %s (%d)", + pcmk_rc_str(rc), rc); } else { - crm_debug("Error receiving remote data after %zu bytes: %s (%d)", - remote->buffer_offset, pcmk_rc_str(rc), rc); + pcmk__debug("Error receiving remote data after %zu bytes: %s (%d)", + remote->buffer_offset, pcmk_rc_str(rc), rc); return ENOTCONN; } header = localized_remote_header(remote); if(header) { if(remote->buffer_offset < header->size_total) { - crm_trace("Read partial remote message (%zu of %" PRIu32 " bytes)", - remote->buffer_offset, header->size_total); + pcmk__trace("Read partial remote message (%zu of %" PRIu32 + " bytes)", + remote->buffer_offset, header->size_total); } else { - crm_trace("Read full remote message of %zu bytes", - remote->buffer_offset); + pcmk__trace("Read full remote message of %zu bytes", + remote->buffer_offset); return pcmk_rc_ok; } } @@ -539,28 +544,30 @@ pcmk__read_remote_message(pcmk__remote_t *remote, int timeout_ms) remaining_timeout = timeout_ms; while (remaining_timeout > 0) { - crm_trace("Waiting for remote data (%d ms of %d ms timeout remaining)", - remaining_timeout, timeout_ms); + pcmk__trace("Waiting for remote data (%d ms of %d ms timeout " + "remaining)", + remaining_timeout, timeout_ms); rc = pcmk__remote_ready(remote, remaining_timeout); if (rc == ETIME) { - crm_err("Timed out (%d ms) while waiting for remote data", - remaining_timeout); + pcmk__err("Timed out (%d ms) while waiting for remote data", + remaining_timeout); return rc; } else if (rc != pcmk_rc_ok) { - crm_debug("Wait for remote data aborted (will retry): %s " - QB_XS " rc=%d", pcmk_rc_str(rc), rc); + pcmk__debug("Wait for remote data aborted (will retry): %s " + QB_XS " rc=%d", + pcmk_rc_str(rc), rc); } else { rc = pcmk__read_available_remote_data(remote); if (rc == pcmk_rc_ok) { return rc; } else if (rc == EAGAIN) { - crm_trace("Waiting for more remote data"); + pcmk__trace("Waiting for more remote data"); } else { - crm_debug("Could not receive remote data: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__debug("Could not receive remote data: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); } } @@ -613,15 +620,15 @@ check_connect_finished(gpointer userdata) rc = ETIMEDOUT; } } - crm_trace("Could not check socket %d for connection success: %s (%d)", - cb_data->sock, pcmk_rc_str(rc), rc); + pcmk__trace("Could not check socket %d for connection success: %s (%d)", + cb_data->sock, pcmk_rc_str(rc), rc); } else if (rc == 0) { // select() timeout if ((time(NULL) - cb_data->start) < pcmk__timeout_ms2s(cb_data->timeout_ms)) { return TRUE; // There is time left, so reschedule timer } - crm_debug("Timed out while waiting for socket %d connection success", - cb_data->sock); + pcmk__debug("Timed out while waiting for socket %d connection success", + cb_data->sock); rc = ETIMEDOUT; // select() returned number of file descriptors that are ready @@ -635,25 +642,27 @@ check_connect_finished(gpointer userdata) if (getsockopt(cb_data->sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { rc = errno; - crm_trace("Couldn't check socket %d for connection errors: %s (%d)", - cb_data->sock, pcmk_rc_str(rc), rc); + pcmk__trace("Couldn't check socket %d for connection errors: %s " + "(%d)", + cb_data->sock, pcmk_rc_str(rc), rc); } else if (error != 0) { rc = error; - crm_trace("Socket %d connected with error: %s (%d)", - cb_data->sock, pcmk_rc_str(rc), rc); + pcmk__trace("Socket %d connected with error: %s (%d)", + cb_data->sock, pcmk_rc_str(rc), rc); } else { rc = pcmk_rc_ok; } } else { // Should not be possible - crm_trace("select() succeeded, but socket %d not in resulting " - "read/write sets", cb_data->sock); + pcmk__trace("select() succeeded, but socket %d not in resulting " + "read/write sets", + cb_data->sock); rc = EAGAIN; } dispatch_done: if (rc == pcmk_rc_ok) { - crm_trace("Socket %d is connected", cb_data->sock); + pcmk__trace("Socket %d is connected", cb_data->sock); } else { close(cb_data->sock); cb_data->sock = -1; @@ -696,8 +705,8 @@ connect_socket_retry(int sock, const struct sockaddr *addr, socklen_t addrlen, rc = pcmk__set_nonblocking(sock); if (rc != pcmk_rc_ok) { - crm_warn("Could not set socket non-blocking: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__warn("Could not set socket non-blocking: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); return rc; } @@ -711,8 +720,8 @@ connect_socket_retry(int sock, const struct sockaddr *addr, socklen_t addrlen, break; default: - crm_warn("Could not connect socket: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__warn("Could not connect socket: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); return rc; } } @@ -743,8 +752,9 @@ connect_socket_retry(int sock, const struct sockaddr *addr, socklen_t addrlen, * working at the moment though. (See connect(2) regarding EINPROGRESS * for possible new handling needed.) */ - crm_trace("Scheduling check in %dms for whether connect to fd %d finished", - interval, sock); + pcmk__trace("Scheduling check in %dms for whether connect to fd %d " + "finished", + interval, sock); timer = pcmk__create_timer(interval, check_connect_finished, cb_data); if (timer_id) { *timer_id = timer; @@ -770,15 +780,15 @@ connect_socket_once(int sock, const struct sockaddr *addr, socklen_t addrlen) if (rc < 0) { rc = errno; - crm_warn("Could not connect socket: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__warn("Could not connect socket: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); return rc; } rc = pcmk__set_nonblocking(sock); if (rc != pcmk_rc_ok) { - crm_warn("Could not set socket non-blocking: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__warn("Could not set socket non-blocking: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); return rc; } @@ -826,13 +836,13 @@ pcmk__connect_remote(const char *host, int port, int timeout, int *timer_id, rc = pcmk__gaierror2rc(rc); if (rc != pcmk_rc_ok) { - crm_err("Unable to get IP address info for %s: %s", - server, pcmk_rc_str(rc)); + pcmk__err("Unable to get IP address info for %s: %s", server, + pcmk_rc_str(rc)); goto async_cleanup; } if (!res || !res->ai_addr) { - crm_err("Unable to get IP address info for %s: no result", server); + pcmk__err("Unable to get IP address info for %s: no result", server); rc = ENOTCONN; goto async_cleanup; } @@ -848,13 +858,14 @@ pcmk__connect_remote(const char *host, int port, int timeout, int *timer_id, if (rp->ai_canonname) { server = res->ai_canonname; } - crm_debug("Got canonical name %s for %s", server, host); + pcmk__debug("Got canonical name %s for %s", server, host); sock = socket(rp->ai_family, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) { rc = errno; - crm_warn("Could not create socket for remote connection to %s:%d: " - "%s " QB_XS " rc=%d", server, port, pcmk_rc_str(rc), rc); + pcmk__warn("Could not create socket for remote connection to " + "%s:%d: %s " QB_XS " rc=%d", + server, port, pcmk_rc_str(rc), rc); continue; } @@ -868,7 +879,7 @@ pcmk__connect_remote(const char *host, int port, int timeout, int *timer_id, memset(buffer, 0, PCMK__NELEM(buffer)); pcmk__sockaddr2str(addr, buffer); - crm_info("Attempting remote connection to %s:%d", buffer, port); + pcmk__info("Attempting remote connection to %s:%d", buffer, port); if (callback) { if (connect_socket_retry(sock, rp->ai_addr, rp->ai_addrlen, timeout, @@ -952,17 +963,18 @@ pcmk__accept_remote_connection(int ssock, int *csock) *csock = accept(ssock, (struct sockaddr *)&addr, &laddr); if (*csock == -1) { rc = errno; - crm_err("Could not accept remote client connection: %s " - QB_XS " rc=%d", pcmk_rc_str(rc), rc); + pcmk__err("Could not accept remote client connection: %s " + QB_XS " rc=%d", + pcmk_rc_str(rc), rc); return rc; } pcmk__sockaddr2str(&addr, addr_str); - crm_info("Accepted new remote client connection from %s", addr_str); + pcmk__info("Accepted new remote client connection from %s", addr_str); rc = pcmk__set_nonblocking(*csock); if (rc != pcmk_rc_ok) { - crm_err("Could not set socket non-blocking: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__err("Could not set socket non-blocking: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); close(*csock); *csock = -1; return rc; @@ -979,8 +991,9 @@ pcmk__accept_remote_connection(int ssock, int *csock) &optval, sizeof(optval)); if (rc < 0) { rc = errno; - crm_err("Could not set TCP timeout to %d ms on remote connection: " - "%s " QB_XS " rc=%d", optval, pcmk_rc_str(rc), rc); + pcmk__err("Could not set TCP timeout to %d ms on remote " + "connection: %s " QB_XS " rc=%d", + optval, pcmk_rc_str(rc), rc); close(*csock); *csock = -1; return rc; @@ -1008,9 +1021,9 @@ crm_default_remote_port(void) errno = 0; port = strtol(env, NULL, 10); if (errno || (port < 1) || (port > 65535)) { - crm_warn("Environment variable PCMK_" PCMK__ENV_REMOTE_PORT - " has invalid value '%s', using %d instead", - env, DEFAULT_REMOTE_PORT); + pcmk__warn("Environment variable PCMK_" PCMK__ENV_REMOTE_PORT + " has invalid value '%s', using %d instead", + env, DEFAULT_REMOTE_PORT); port = DEFAULT_REMOTE_PORT; } } else { diff --git a/lib/common/resources.c b/lib/common/resources.c index 18890a99af2..993344805c4 100644 --- a/lib/common/resources.c +++ b/lib/common/resources.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -56,7 +56,7 @@ pcmk_resource_id(const pcmk_resource_t *rsc) bool pcmk_resource_is_managed(const pcmk_resource_t *rsc) { - return (rsc == NULL)? false : pcmk_is_set(rsc->flags, pcmk__rsc_managed); + return (rsc == NULL)? false : pcmk__is_set(rsc->flags, pcmk__rsc_managed); } /*! diff --git a/lib/common/results.c b/lib/common/results.c index 568b8d448fb..d9b79c43d4c 100644 --- a/lib/common/results.c +++ b/lib/common/results.c @@ -130,8 +130,8 @@ log_assertion_as(const char *file, const char *function, int line, if (!pcmk__is_daemon) { crm_enable_stderr(TRUE); // Make sure command-line user sees message } - crm_err("%s: Triggered fatal assertion at %s:%d : %s", - function, file, line, assert_condition); + pcmk__err("%s: Triggered fatal assertion at %s:%d : %s", function, file, + line, assert_condition); } /* coverity[+kill] */ @@ -181,8 +181,8 @@ fail_assert_as(const char *file, const char *function, int line, pid = fork(); switch (pid) { case -1: // Fork failed - crm_warn("%s: Cannot dump core for non-fatal assertion at %s:%d " - ": %s", function, file, line, assert_condition); + pcmk__warn("%s: Cannot dump core for non-fatal assertion at %s:%d " + ": %s", function, file, line, assert_condition); break; case 0: // Child process: just abort to dump core @@ -190,8 +190,9 @@ fail_assert_as(const char *file, const char *function, int line, break; default: // Parent process: wait for child - crm_err("%s: Forked child [%d] to record non-fatal assertion at " - "%s:%d : %s", function, pid, file, line, assert_condition); + pcmk__err("%s: Forked child [%d] to record non-fatal assertion at " + "%s:%d : %s", + function, pid, file, line, assert_condition); crm_write_blackbox(SIGTRAP, NULL); do { if (waitpid(pid, &status, 0) == pid) { @@ -200,11 +201,12 @@ fail_assert_as(const char *file, const char *function, int line, } while (errno == EINTR); if (errno == ECHILD) { // crm_mon ignores SIGCHLD - crm_trace("Cannot wait on forked child [%d] " - "(SIGCHLD is probably ignored)", pid); + pcmk__trace("Cannot wait on forked child [%lld] (SIGCHLD is " + "probably ignored)", + (long long) pid); } else { - crm_err("Cannot wait on forked child [%d]: %s", - pid, pcmk_rc_str(errno)); + pcmk__err("Cannot wait on forked child [%lld]: %s", + (long long) pid, pcmk_rc_str(errno)); } break; } @@ -1060,9 +1062,9 @@ crm_exit(crm_exit_t exit_status) exit_status = CRM_EX_ERROR; } - crm_info("Exiting %s " QB_XS " with status %d (%s: %s)", - pcmk__s(crm_system_name, "process"), exit_status, - crm_exit_name(exit_status), crm_exit_str(exit_status)); + pcmk__info("Exiting %s " QB_XS " with status %d (%s: %s)", + pcmk__s(crm_system_name, "process"), exit_status, + crm_exit_name(exit_status), crm_exit_str(exit_status)); pcmk_common_cleanup(); exit(exit_status); } diff --git a/lib/common/rules.c b/lib/common/rules.c index e79ecb45aee..e11315bae9c 100644 --- a/lib/common/rules.c +++ b/lib/common/rules.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -59,7 +59,7 @@ pcmk__condition_type(const xmlNode *condition) // Expression types based on node attribute name - name = crm_element_value(condition, PCMK_XA_ATTRIBUTE); + name = pcmk__xe_get(condition, PCMK_XA_ATTRIBUTE); if (pcmk__str_any_of(name, CRM_ATTR_UNAME, CRM_ATTR_KIND, CRM_ATTR_ID, NULL)) { @@ -112,7 +112,7 @@ check_range(const xmlNode *date_spec, const char *id, const char *attr, uint32_t value) { int rc = pcmk_rc_ok; - const char *range = crm_element_value(date_spec, attr); + const char *range = pcmk__xe_get(date_spec, attr); long long low, high; if (range == NULL) { @@ -133,9 +133,9 @@ check_range(const xmlNode *date_spec, const char *id, const char *attr, rc = pcmk_rc_after_range; } - crm_trace(PCMK_XE_DATE_EXPRESSION " %s: " PCMK_XE_DATE_SPEC - " %s='%s' for %" PRIu32 ": %s", - id, attr, pcmk__s(range, ""), value, pcmk_rc_str(rc)); + pcmk__trace(PCMK_XE_DATE_EXPRESSION " %s: " PCMK_XE_DATE_SPEC + " %s='%s' for %" PRIu32 ": %s", + id, attr, pcmk__s(range, ""), value, pcmk_rc_str(rc)); return rc; } @@ -486,7 +486,7 @@ pcmk__evaluate_date_expression(const xmlNode *date_expression, return pcmk_rc_unpack_error; } - op = crm_element_value(date_expression, PCMK_XA_OPERATION); + op = pcmk__xe_get(date_expression, PCMK_XA_OPERATION); if (pcmk__str_eq(op, PCMK_VALUE_IN_RANGE, pcmk__str_null_matches|pcmk__str_casei)) { rc = evaluate_in_range(date_expression, id, now, next_change); @@ -520,8 +520,8 @@ pcmk__evaluate_date_expression(const xmlNode *date_expression, return pcmk_rc_unpack_error; } - crm_trace(PCMK_XE_DATE_EXPRESSION " %s (%s): %s (%d)", - id, op, pcmk_rc_str(rc), rc); + pcmk__trace(PCMK_XE_DATE_EXPRESSION " %s (%s): %s (%d)", id, op, + pcmk_rc_str(rc), rc); return rc; } @@ -761,8 +761,9 @@ pcmk__cmp_by_type(const char *value1, const char *value2, enum pcmk__type type) if ((pcmk__scan_ll(value1, &integer1, 0LL) != pcmk_rc_ok) || (pcmk__scan_ll(value2, &integer2, 0LL) != pcmk_rc_ok)) { - crm_warn("Comparing '%s' and '%s' as strings because " - "invalid as integers", value1, value2); + pcmk__warn("Comparing '%s' and '%s' as strings because " + "invalid as integers", + value1, value2); return strcasecmp(value1, value2); } return (integer1 < integer2)? -1 : (integer1 > integer2)? 1 : 0; @@ -777,8 +778,9 @@ pcmk__cmp_by_type(const char *value1, const char *value2, enum pcmk__type type) if ((pcmk__scan_double(value1, &num1, NULL, NULL) != pcmk_rc_ok) || (pcmk__scan_double(value2, &num2, NULL, NULL) != pcmk_rc_ok)) { - crm_warn("Comparing '%s' and '%s' as strings because invalid as " - "numbers", value1, value2); + pcmk__warn("Comparing '%s' and '%s' as strings because " + "invalid as numbers", + value1, value2); return strcasecmp(value1, value2); } return (num1 < num2)? -1 : (num1 > num2)? 1 : 0; @@ -786,7 +788,7 @@ pcmk__cmp_by_type(const char *value1, const char *value2, enum pcmk__type type) break; case pcmk__type_version: - return compare_version(value1, value2); + return pcmk__compare_versions(value1, value2); default: // Invalid type return 0; @@ -988,7 +990,7 @@ pcmk__evaluate_attr_expression(const xmlNode *expression, /* Get name of node attribute to compare (expanding any %0-%9 to * regular expression submatches) */ - attr = crm_element_value(expression, PCMK_XA_ATTRIBUTE); + attr = pcmk__xe_get(expression, PCMK_XA_ATTRIBUTE); if (attr == NULL) { pcmk__config_err("Treating " PCMK_XE_EXPRESSION " %s as not passing " "because " PCMK_XA_ATTRIBUTE " was not specified", id); @@ -1002,7 +1004,7 @@ pcmk__evaluate_attr_expression(const xmlNode *expression, } // Get and validate operation - op = crm_element_value(expression, PCMK_XA_OPERATION); + op = pcmk__xe_get(expression, PCMK_XA_OPERATION); comparison = pcmk__parse_comparison(op); if (comparison == pcmk__comparison_unknown) { // Not possible with schema validation enabled @@ -1020,7 +1022,7 @@ pcmk__evaluate_attr_expression(const xmlNode *expression, } // How reference value is obtained (literal, resource meta-attribute, etc.) - source_s = crm_element_value(expression, PCMK_XA_VALUE_SOURCE); + source_s = pcmk__xe_get(expression, PCMK_XA_VALUE_SOURCE); source = pcmk__parse_source(source_s); if (source == pcmk__source_unknown) { // Not possible with schema validation enabled @@ -1032,7 +1034,7 @@ pcmk__evaluate_attr_expression(const xmlNode *expression, } // Get and validate reference value - value = crm_element_value(expression, PCMK_XA_VALUE); + value = pcmk__xe_get(expression, PCMK_XA_VALUE); switch (comparison) { case pcmk__comparison_defined: case pcmk__comparison_undefined: @@ -1065,7 +1067,7 @@ pcmk__evaluate_attr_expression(const xmlNode *expression, } // Get and validate value type (after expanding reference value) - type_s = crm_element_value(expression, PCMK_XA_TYPE); + type_s = pcmk__xe_get(expression, PCMK_XA_TYPE); type = pcmk__parse_type(type_s, comparison, actual, reference); if (type == pcmk__type_unknown) { // Not possible with schema validation enabled @@ -1079,15 +1081,17 @@ pcmk__evaluate_attr_expression(const xmlNode *expression, switch (comparison) { case pcmk__comparison_defined: case pcmk__comparison_undefined: - crm_trace(PCMK_XE_EXPRESSION " %s result: %s (for attribute %s %s)", - id, pcmk_rc_str(rc), attr, op); + pcmk__trace(PCMK_XE_EXPRESSION " %s result: %s (for attribute %s " + "%s)", + id, pcmk_rc_str(rc), attr, op); break; default: - crm_trace(PCMK_XE_EXPRESSION " %s result: " - "%s (attribute %s %s '%s' via %s source as %s type)", - id, pcmk_rc_str(rc), attr, op, pcmk__s(reference, ""), - pcmk__s(source_s, "default"), pcmk__s(type_s, "default")); + pcmk__trace(PCMK_XE_EXPRESSION " %s result: %s (attribute %s %s " + "'%s' via %s source as %s type)", + id, pcmk_rc_str(rc), attr, op, pcmk__s(reference, ""), + pcmk__s(source_s, "default"), + pcmk__s(type_s, "default")); break; } @@ -1129,39 +1133,39 @@ pcmk__evaluate_rsc_expression(const xmlNode *rsc_expression, } // Compare resource standard - standard = crm_element_value(rsc_expression, PCMK_XA_CLASS); + standard = pcmk__xe_get(rsc_expression, PCMK_XA_CLASS); if ((standard != NULL) && !pcmk__str_eq(standard, rule_input->rsc_standard, pcmk__str_none)) { - crm_trace(PCMK_XE_RSC_EXPRESSION " %s is unsatisfied because " - "actual standard '%s' doesn't match '%s'", - id, pcmk__s(rule_input->rsc_standard, ""), standard); + pcmk__trace(PCMK_XE_RSC_EXPRESSION " %s is unsatisfied because actual " + "standard '%s' doesn't match '%s'", + id, pcmk__s(rule_input->rsc_standard, ""), standard); return pcmk_rc_op_unsatisfied; } // Compare resource provider - provider = crm_element_value(rsc_expression, PCMK_XA_PROVIDER); + provider = pcmk__xe_get(rsc_expression, PCMK_XA_PROVIDER); if ((provider != NULL) && !pcmk__str_eq(provider, rule_input->rsc_provider, pcmk__str_none)) { - crm_trace(PCMK_XE_RSC_EXPRESSION " %s is unsatisfied because " - "actual provider '%s' doesn't match '%s'", - id, pcmk__s(rule_input->rsc_provider, ""), provider); + pcmk__trace(PCMK_XE_RSC_EXPRESSION " %s is unsatisfied because actual " + "provider '%s' doesn't match '%s'", + id, pcmk__s(rule_input->rsc_provider, ""), provider); return pcmk_rc_op_unsatisfied; } // Compare resource agent type - type = crm_element_value(rsc_expression, PCMK_XA_TYPE); + type = pcmk__xe_get(rsc_expression, PCMK_XA_TYPE); if ((type != NULL) && !pcmk__str_eq(type, rule_input->rsc_agent, pcmk__str_none)) { - crm_trace(PCMK_XE_RSC_EXPRESSION " %s is unsatisfied because " - "actual agent '%s' doesn't match '%s'", - id, pcmk__s(rule_input->rsc_agent, ""), type); + pcmk__trace(PCMK_XE_RSC_EXPRESSION " %s is unsatisfied because actual " + "agent '%s' doesn't match '%s'", + id, pcmk__s(rule_input->rsc_agent, ""), type); return pcmk_rc_op_unsatisfied; } - crm_trace(PCMK_XE_RSC_EXPRESSION " %s is satisfied by %s%s%s:%s", - id, pcmk__s(standard, ""), - ((provider == NULL)? "" : ":"), pcmk__s(provider, ""), - pcmk__s(type, "")); + pcmk__trace(PCMK_XE_RSC_EXPRESSION " %s is satisfied by %s%s%s:%s", id, + pcmk__s(standard, ""), + ((provider != NULL)? ":" : ""), pcmk__s(provider, ""), + pcmk__s(type, "")); return pcmk_rc_ok; } @@ -1197,7 +1201,7 @@ pcmk__evaluate_op_expression(const xmlNode *op_expression, } // Validate operation name - name = crm_element_value(op_expression, PCMK_XA_NAME); + name = pcmk__xe_get(op_expression, PCMK_XA_NAME); if (name == NULL) { // Not possible with schema validation enabled pcmk__config_err("Treating " PCMK_XE_OP_EXPRESSION " %s as not " "passing because it has no " PCMK_XA_NAME, id); @@ -1205,7 +1209,7 @@ pcmk__evaluate_op_expression(const xmlNode *op_expression, } // Validate operation interval - interval_s = crm_element_value(op_expression, PCMK_META_INTERVAL); + interval_s = pcmk__xe_get(op_expression, PCMK_META_INTERVAL); if (pcmk_parse_interval_spec(interval_s, &interval_ms) != pcmk_rc_ok) { pcmk__config_err("Treating " PCMK_XE_OP_EXPRESSION " %s as not " "passing because '%s' is not a valid " @@ -1216,23 +1220,23 @@ pcmk__evaluate_op_expression(const xmlNode *op_expression, // Compare operation name if (!pcmk__str_eq(name, rule_input->op_name, pcmk__str_none)) { - crm_trace(PCMK_XE_OP_EXPRESSION " %s is unsatisfied because " - "actual name '%s' doesn't match '%s'", - id, pcmk__s(rule_input->op_name, ""), name); + pcmk__trace(PCMK_XE_OP_EXPRESSION " %s is unsatisfied because actual " + "name '%s' doesn't match '%s'", + id, pcmk__s(rule_input->op_name, ""), name); return pcmk_rc_op_unsatisfied; } // Compare operation interval (unspecified interval matches all) if ((interval_s != NULL) && (interval_ms != rule_input->op_interval_ms)) { - crm_trace(PCMK_XE_OP_EXPRESSION " %s is unsatisfied because " - "actual interval %s doesn't match %s", - id, pcmk__readable_interval(rule_input->op_interval_ms), - pcmk__readable_interval(interval_ms)); + pcmk__trace(PCMK_XE_OP_EXPRESSION " %s is unsatisfied because actual " + "interval %s doesn't match %s", + id, pcmk__readable_interval(rule_input->op_interval_ms), + pcmk__readable_interval(interval_ms)); return pcmk_rc_op_unsatisfied; } - crm_trace(PCMK_XE_OP_EXPRESSION " %s is satisfied (name %s, interval %s)", - id, name, pcmk__readable_interval(rule_input->op_interval_ms)); + pcmk__trace(PCMK_XE_OP_EXPRESSION " %s is satisfied (name %s, interval %s)", + id, name, pcmk__readable_interval(rule_input->op_interval_ms)); return pcmk_rc_ok; } @@ -1328,7 +1332,7 @@ pcmk_evaluate_rule(xmlNode *rule, const pcmk_rule_input_t *rule_input, return pcmk_rc_unpack_error; } - value = crm_element_value(rule, PCMK_XA_BOOLEAN_OP); + value = pcmk__xe_get(rule, PCMK_XA_BOOLEAN_OP); combine = pcmk__parse_combine(value); switch (combine) { case pcmk__combine_and: @@ -1370,6 +1374,7 @@ pcmk_evaluate_rule(xmlNode *rule, const pcmk_rule_input_t *rule_input, rc = pcmk_rc_ok; } - crm_trace("Rule %s is %ssatisfied", id, ((rc == pcmk_rc_ok)? "" : "not ")); + pcmk__trace("Rule %s is %ssatisfied", id, + ((rc == pcmk_rc_ok)? "" : "not ")); return rc; } diff --git a/lib/common/scheduler.c b/lib/common/scheduler.c index ceaa570b0fe..8a18b1460ce 100644 --- a/lib/common/scheduler.c +++ b/lib/common/scheduler.c @@ -266,7 +266,7 @@ pcmk_has_quorum(const pcmk_scheduler_t *scheduler) if (scheduler == NULL) { return false; } - return pcmk_is_set(scheduler->flags, pcmk__sched_quorate); + return pcmk__is_set(scheduler->flags, pcmk__sched_quorate); } /*! @@ -303,7 +303,7 @@ pcmk__scheduler_epoch_time(pcmk_scheduler_t *scheduler) return time(NULL); } if (scheduler->priv->now == NULL) { - crm_trace("Scheduler 'now' set to current time"); + pcmk__trace("Scheduler 'now' set to current time"); scheduler->priv->now = crm_time_new(NULL); } return crm_time_get_seconds_since_epoch(scheduler->priv->now); @@ -327,9 +327,9 @@ pcmk__update_recheck_time(time_t recheck, pcmk_scheduler_t *scheduler, && ((scheduler->priv->recheck_by == 0) || (scheduler->priv->recheck_by > recheck))) { scheduler->priv->recheck_by = recheck; - crm_debug("Updated next scheduler recheck to %s for %s", - pcmk__trim(ctime(&recheck)), - pcmk__s(reason, "some reason")); + pcmk__debug("Updated next scheduler recheck to %s for %s", + pcmk__trim(ctime(&recheck)), + pcmk__s(reason, "some reason")); } } @@ -364,8 +364,8 @@ pcmk__add_param_check(const xmlNode *rsc_history, pcmk_resource_t *rsc, CRM_CHECK((rsc_history != NULL) && (rsc != NULL) && (node != NULL), return); - crm_trace("Deferring checks of %s until after assignment", - pcmk__xe_id(rsc_history)); + pcmk__trace("Deferring checks of %s until after assignment", + pcmk__xe_id(rsc_history)); param_check = pcmk__assert_alloc(1, sizeof(struct param_check)); param_check->rsc_history = rsc_history; param_check->rsc = rsc; diff --git a/lib/common/schemas.c b/lib/common/schemas.c index 9e3f1c04626..0ea16437165 100644 --- a/lib/common/schemas.c +++ b/lib/common/schemas.c @@ -34,7 +34,7 @@ #define SCHEMA_ZERO { .v = { 0, 0 } } #define schema_strdup_printf(prefix, version, suffix) \ - crm_strdup_printf(prefix "%u.%u" suffix, (version).v[0], (version).v[1]) + pcmk__assert_asprintf(prefix "%u.%u" suffix, (version).v[0], (version).v[1]) typedef struct { xmlRelaxNGPtr rng; @@ -172,16 +172,16 @@ schema_filter(const struct dirent *a) pcmk__schema_version_t version = SCHEMA_ZERO; if (strstr(a->d_name, "pacemaker-") != a->d_name) { - /* crm_trace("%s - wrong prefix", a->d_name); */ + // pcmk__trace("%s - wrong prefix", a->d_name); } else if (!pcmk__ends_with_ext(a->d_name, ".rng")) { - /* crm_trace("%s - wrong suffix", a->d_name); */ + // pcmk__trace("%s - wrong suffix", a->d_name); } else if (!version_from_filename(a->d_name, &version)) { - /* crm_trace("%s - wrong format", a->d_name); */ + // pcmk__trace("%s - wrong format", a->d_name); } else { - /* crm_debug("%s - candidate", a->d_name); */ + // pcmk__debug("%s - candidate", a->d_name); rc = 1; } @@ -321,9 +321,6 @@ transform_filter(const struct dirent *entry) * \internal * \brief Compare transform files based on the version strings in their names * - * This is a crude version comparison that relies on the specific structure of - * these filenames. - * * \retval -1 if \p entry1 sorts before \p entry2 * \retval 0 if \p entry1 sorts equal to \p entry2 * \retval 1 if \p entry1 sorts after \p entry2 @@ -334,38 +331,9 @@ transform_filter(const struct dirent *entry) static int compare_transforms(const struct dirent **entry1, const struct dirent **entry2) { - unsigned char major1 = 0; - unsigned char major2 = 0; - unsigned char minor1 = 0; - unsigned char minor2 = 0; - unsigned char order1 = 0; - unsigned char order2 = 0; - - // If these made it through the filter, they should be of the right format - CRM_LOG_ASSERT(sscanf((*entry1)->d_name, "upgrade-%hhu.%hhu-%hhu.xsl", - &major1, &minor1, &order1) == 3); - CRM_LOG_ASSERT(sscanf((*entry2)->d_name, "upgrade-%hhu.%hhu-%hhu.xsl", - &major2, &minor2, &order2) == 3); - - if (major1 < major2) { - return -1; - } else if (major1 > major2) { - return 1; - } - - if (minor1 < minor2) { - return -1; - } else if (minor1 > minor2) { - return 1; - } - - if (order1 < order2) { - return -1; - } else if (order1 > order2) { - return 1; - } - - return 0; + // We already validated the format of each filename in transform_filter() + return pcmk__compare_versions((*entry1)->d_name + sizeof("upgrade-") - 1, + (*entry2)->d_name + sizeof("upgrade-") - 1); } /*! @@ -405,7 +373,8 @@ load_transforms_from_dir(const char *dir) if (num_matches < 0) { int rc = errno; - crm_warn("Could not load transforms from %s: %s", dir, pcmk_rc_str(rc)); + pcmk__warn("Could not load transforms from %s: %s", dir, + pcmk_rc_str(rc)); goto done; } @@ -418,8 +387,8 @@ load_transforms_from_dir(const char *dir) if (sscanf(namelist[i]->d_name, "upgrade-%hhu.%hhu-%hhu.xsl", &(version.v[0]), &(version.v[1]), &order) == 3) { - char *version_s = crm_strdup_printf("%hhu.%hhu", - version.v[0], version.v[1]); + char *version_s = pcmk__assert_asprintf("%hhu.%hhu", + version.v[0], version.v[1]); GList *list = g_hash_table_lookup(transforms, version_s); if (list == NULL) { @@ -460,7 +429,7 @@ pcmk__load_schemas_from_dir(const char *dir) if (max < 0) { int rc = errno; - crm_warn("Could not load schemas from %s: %s", dir, pcmk_rc_str(rc)); + pcmk__warn("Could not load schemas from %s: %s", dir, pcmk_rc_str(rc)); goto done; } @@ -471,8 +440,8 @@ pcmk__load_schemas_from_dir(const char *dir) pcmk__schema_version_t version = SCHEMA_ZERO; if (version_from_filename(namelist[lpc]->d_name, &version)) { - char *version_s = crm_strdup_printf("%hhu.%hhu", - version.v[0], version.v[1]); + char *version_s = pcmk__assert_asprintf("%hhu.%hhu", + version.v[0], version.v[1]); char *orig_key = NULL; GList *transform_list = NULL; @@ -492,8 +461,8 @@ pcmk__load_schemas_from_dir(const char *dir) } else { // Shouldn't be possible, but makes static analysis happy - crm_warn("Skipping schema '%s': could not parse version", - namelist[lpc]->d_name); + pcmk__warn("Skipping schema '%s': could not parse version", + namelist[lpc]->d_name); } } @@ -576,7 +545,7 @@ pcmk__schema_init(void) for (GList *iter = known_schemas; iter != NULL; iter = iter->next) { pcmk__schema_t *schema = iter->data; - crm_debug("Loaded schema %d: %s", schema_index, schema->name); + pcmk__debug("Loaded schema %d: %s", schema_index, schema->name); schema->schema_index = schema_index++; } } @@ -598,7 +567,7 @@ validate_with_relaxng(xmlDocPtr doc, xmlRelaxNGValidityErrorFunc error_handler, ctx = *cached_ctx; } else { - crm_debug("Creating RNG parser context"); + pcmk__debug("Creating RNG parser context"); ctx = pcmk__assert_alloc(1, sizeof(relaxng_ctx_cache_t)); ctx->parser = xmlRelaxNGNewParserCtxt(relaxng_file); @@ -618,7 +587,7 @@ validate_with_relaxng(xmlDocPtr doc, xmlRelaxNGValidityErrorFunc error_handler, ctx->rng = xmlRelaxNGParse(ctx->parser); CRM_CHECK(ctx->rng != NULL, - crm_err("Could not find/parse %s", relaxng_file); + pcmk__err("Could not find/parse %s", relaxng_file); goto cleanup); ctx->valid = xmlRelaxNGNewValidCtxt(ctx->rng); @@ -642,7 +611,7 @@ validate_with_relaxng(xmlDocPtr doc, xmlRelaxNGValidityErrorFunc error_handler, valid = false; } else if (rc < 0) { - crm_err("Internal libxml error during validation"); + pcmk__err("Internal libxml error during validation"); } cleanup: @@ -795,15 +764,15 @@ validate_with(xmlNode *xml, pcmk__schema_t *schema, file = pcmk__xml_artefact_path(pcmk__xml_artefact_ns_legacy_rng, schema->name); - crm_trace("Validating with %s (type=%d)", - pcmk__s(file, "missing schema"), schema->validator); + pcmk__trace("Validating with %s (type=%d)",pcmk__s(file, "missing schema"), + schema->validator); switch (schema->validator) { case pcmk__schema_validator_rng: cache = (relaxng_ctx_cache_t **) &(schema->cache); valid = validate_with_relaxng(xml->doc, error_handler, error_handler_context, file, cache); break; default: - crm_err("Unknown validator type: %d", schema->validator); + pcmk__err("Unknown validator type: %d", schema->validator); break; } @@ -832,7 +801,7 @@ pcmk__validate_xml(xmlNode *xml_blob, const char *validation, CRM_CHECK((xml_blob != NULL) && (xml_blob->doc != NULL), return false); if (validation == NULL) { - validation = crm_element_value(xml_blob, PCMK_XA_VALIDATE_WITH); + validation = pcmk__xe_get(xml_blob, PCMK_XA_VALIDATE_WITH); } pcmk__warn_if_schema_deprecated(validation); @@ -1076,14 +1045,14 @@ apply_upgrade(const xmlNode *input_xml, int schema_index, gboolean to_logs) const struct dirent *entry = iter->data; const char *transform = entry->d_name; - crm_debug("Upgrading schema from %s to %s: applying XSL transform %s", - schema->name, upgraded_schema->name, transform); + pcmk__debug("Upgrading schema from %s to %s: applying XSL transform %s", + schema->name, upgraded_schema->name, transform); new_xml = apply_transformation(input_xml, transform, to_logs); pcmk__xml_free(old_xml); if (new_xml == NULL) { - crm_err("XSL transform %s failed, aborting upgrade", transform); + pcmk__err("XSL transform %s failed, aborting upgrade", transform); return NULL; } input_xml = new_xml; @@ -1096,16 +1065,16 @@ apply_upgrade(const xmlNode *input_xml, int schema_index, gboolean to_logs) // Ensure result validates with its new schema if (!validate_with(new_xml, upgraded_schema, error_handler, GUINT_TO_POINTER(LOG_ERR))) { - crm_err("Schema upgrade from %s to %s failed: " - "XSL transform pipeline produced an invalid configuration", - schema->name, upgraded_schema->name); - crm_log_xml_debug(new_xml, "bad-transform-result"); + pcmk__err("Schema upgrade from %s to %s failed: XSL transform pipeline " + "produced an invalid configuration", + schema->name, upgraded_schema->name); + pcmk__log_xml_debug(new_xml, "bad-transform-result"); pcmk__xml_free(new_xml); return NULL; } - crm_info("Schema upgrade from %s to %s succeeded", - schema->name, upgraded_schema->name); + pcmk__info("Schema upgrade from %s to %s succeeded", schema->name, + upgraded_schema->name); return new_xml; } @@ -1120,7 +1089,7 @@ apply_upgrade(const xmlNode *input_xml, int schema_index, gboolean to_logs) static GList * get_configured_schema(const xmlNode *xml) { - const char *schema_name = crm_element_value(xml, PCMK_XA_VALIDATE_WITH); + const char *schema_name = pcmk__xe_get(xml, PCMK_XA_VALIDATE_WITH); pcmk__warn_if_schema_deprecated(schema_name); return pcmk__get_schema(schema_name); @@ -1188,7 +1157,7 @@ pcmk__update_schema(xmlNode **xml, const char *max_schema_name, bool transform, if (!validate_with(*xml, current_schema, error_handler, GUINT_TO_POINTER(LOG_ERR))) { - crm_debug("Schema %s does not validate", current_schema->name); + pcmk__debug("Schema %s does not validate", current_schema->name); if (best_schema != NULL) { /* we've satisfied the validation, no need to check further */ break; @@ -1197,7 +1166,7 @@ pcmk__update_schema(xmlNode **xml, const char *max_schema_name, bool transform, continue; // Try again with the next higher schema } - crm_debug("Schema %s validates", current_schema->name); + pcmk__debug("Schema %s validates", current_schema->name); rc = pcmk_rc_ok; best_schema = current_schema; if (current_schema->schema_index == max_schema_index) { @@ -1229,10 +1198,9 @@ pcmk__update_schema(xmlNode **xml, const char *max_schema_name, bool transform, if ((best_schema != NULL) && (best_schema->schema_index > original_schema->schema_index)) { - crm_info("%s the configuration schema to %s", - (transform? "Transformed" : "Upgraded"), - best_schema->name); - crm_xml_add(*xml, PCMK_XA_VALIDATE_WITH, best_schema->name); + pcmk__info("%s the configuration schema to %s", + (transform? "Transformed" : "Upgraded"), best_schema->name); + pcmk__xe_set(*xml, PCMK_XA_VALIDATE_WITH, best_schema->name); } return rc; } @@ -1278,8 +1246,7 @@ pcmk__update_configured_schema(xmlNode **xml, bool to_logs) entry = NULL; converted = pcmk__xml_copy(NULL, *xml); if (pcmk__update_schema(&converted, NULL, true, to_logs) == pcmk_rc_ok) { - new_schema_name = crm_element_value(converted, - PCMK_XA_VALIDATE_WITH); + new_schema_name = pcmk__xe_get(converted, PCMK_XA_VALIDATE_WITH); entry = pcmk__get_schema(new_schema_name); } schema = (entry == NULL)? NULL : entry->data; @@ -1340,9 +1307,9 @@ pcmk__update_configured_schema(xmlNode **xml, bool to_logs) original_schema->name, schema->name); } } else if (to_logs) { - crm_info("Configuration with %s schema was internally " - "upgraded to latest version %s", - original_schema->name, schema->name); + pcmk__info("Configuration with %s schema was internally " + "upgraded to latest version %s", + original_schema->name, schema->name); } } @@ -1403,7 +1370,8 @@ pcmk__schema_files_later_than(const char *name) lst = g_list_prepend(lst, pcmk__str_copy(entry->d_name)); } - lst = g_list_prepend(lst, crm_strdup_printf("%s.rng", schema->name)); + lst = g_list_prepend(lst, + pcmk__assert_asprintf("%s.rng", schema->name)); } return lst; @@ -1413,7 +1381,7 @@ static void append_href(xmlNode *xml, void *user_data) { GList **list = user_data; - char *href = crm_element_value_copy(xml, "href"); + char *href = pcmk__xe_get_copy(xml, "href"); if (href == NULL) { return; @@ -1470,14 +1438,14 @@ add_schema_file_to_xml(xmlNode *parent, const char *file, GList **already_includ * just assume it's an RNG file. */ if (!pcmk__ends_with(file, ".rng") && !pcmk__ends_with(file, ".xsl")) { - path = crm_strdup_printf("%s.rng", file); + path = pcmk__assert_asprintf("%s.rng", file); } else { path = pcmk__str_copy(file); } rc = read_file_contents(path, &contents); if (rc != pcmk_rc_ok || contents == NULL) { - crm_warn("Could not read schema file %s: %s", file, pcmk_rc_str(rc)); + pcmk__warn("Could not read schema file %s: %s", file, pcmk_rc_str(rc)); free(path); return; } @@ -1486,7 +1454,7 @@ add_schema_file_to_xml(xmlNode *parent, const char *file, GList **already_includ * as a CDATA block underneath it. */ file_node = pcmk__xe_create(parent, PCMK__XE_FILE); - crm_xml_add(file_node, PCMK_XA_PATH, path); + pcmk__xe_set(file_node, PCMK_XA_PATH, path); *already_included = g_list_prepend(*already_included, path); xmlAddChild(file_node, @@ -1528,7 +1496,7 @@ pcmk__build_schema_xml_node(xmlNode *parent, const char *name, GList **already_i { xmlNode *schema_node = pcmk__xe_create(parent, PCMK__XA_SCHEMA); - crm_xml_add(schema_node, PCMK_XA_VERSION, name); + pcmk__xe_set(schema_node, PCMK_XA_VERSION, name); add_schema_file_to_xml(schema_node, name, already_included); if (schema_node->children == NULL) { @@ -1585,7 +1553,7 @@ cli_config_update(xmlNode **xml, int *best_version, gboolean to_logs) int rc = pcmk__update_configured_schema(xml, to_logs); if (best_version != NULL) { - const char *name = crm_element_value(*xml, PCMK_XA_VALIDATE_WITH); + const char *name = pcmk__xe_get(*xml, PCMK_XA_VALIDATE_WITH); if (name == NULL) { *best_version = -1; diff --git a/lib/common/scores.c b/lib/common/scores.c index 5c36fc70374..8e165ed8053 100644 --- a/lib/common/scores.c +++ b/lib/common/scores.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,8 @@ #include // strcpy(), strdup() #include // size_t +#include // pcmk_parse_score(), etc. + int pcmk__score_red = 0; int pcmk__score_green = 0; int pcmk__score_yellow = 0; diff --git a/lib/common/strings.c b/lib/common/strings.c index 55eacf72be4..d7acbbe4dc4 100644 --- a/lib/common/strings.c +++ b/lib/common/strings.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,6 +10,7 @@ #include #include +#include // va_list, etc. #include #include #include @@ -47,25 +48,27 @@ scan_ll(const char *text, long long *result, long long default_value, local_result = strtoll(text, &local_end_text, 10); if (errno == ERANGE) { rc = errno; - crm_debug("Integer parsed from '%s' was clipped to %lld", - text, local_result); + pcmk__debug("Integer parsed from '%s' was clipped to %lld", text, + local_result); } else if (local_end_text == text) { rc = pcmk_rc_bad_input; local_result = default_value; - crm_debug("Could not parse integer from '%s' (using %lld instead): " - "No digits found", text, default_value); + pcmk__debug("Could not parse integer from '%s' (using %lld " + "instead): No digits found", + text, default_value); } else if (errno != 0) { rc = errno; local_result = default_value; - crm_debug("Could not parse integer from '%s' (using %lld instead): " - "%s", text, default_value, pcmk_rc_str(rc)); + pcmk__debug("Could not parse integer from '%s' (using %lld " + "instead): %s", + text, default_value, pcmk_rc_str(rc)); } if ((end_text == NULL) && !pcmk__str_empty(local_end_text)) { - crm_debug("Characters left over after parsing '%s': '%s'", - text, local_end_text); + pcmk__debug("Characters left over after parsing '%s': '%s'", + text, local_end_text); } errno = rc; } @@ -121,11 +124,12 @@ pcmk__scan_min_int(const char *text, int *result, int minimum) rc = pcmk__scan_ll(text, &result_ll, (long long) minimum); if (result_ll < (long long) minimum) { - crm_warn("Clipped '%s' to minimum acceptable value %d", text, minimum); + pcmk__warn("Clipped '%s' to minimum acceptable value %d", text, + minimum); result_ll = (long long) minimum; } else if (result_ll > INT_MAX) { - crm_warn("Clipped '%s' to maximum integer %d", text, INT_MAX); + pcmk__warn("Clipped '%s' to maximum integer %d", text, INT_MAX); result_ll = (long long) INT_MAX; rc = EOVERFLOW; } @@ -153,12 +157,13 @@ pcmk__scan_port(const char *text, int *port) int rc = pcmk__scan_ll(text, &port_ll, -1LL); if (rc != pcmk_rc_ok) { - crm_warn("'%s' is not a valid port: %s", text, pcmk_rc_str(rc)); + pcmk__warn("'%s' is not a valid port: %s", text, pcmk_rc_str(rc)); } else if ((text != NULL) // wasn't default or invalid && ((port_ll < 0LL) || (port_ll > 65535LL))) { - crm_warn("Ignoring port specification '%s' " - "not in valid range (0-65535)", text); + pcmk__warn("Ignoring port specification '%s' not in valid range " + "(0-65535)", + text); rc = (port_ll < 0LL)? pcmk_rc_before_range : pcmk_rc_after_range; port_ll = -1LL; } @@ -201,7 +206,7 @@ pcmk__scan_double(const char *text, double *result, const char *default_text, if (text == NULL) { rc = EINVAL; - crm_debug("No text and no default conversion value supplied"); + pcmk__debug("No text and no default conversion value supplied"); } else { errno = 0; @@ -227,26 +232,27 @@ pcmk__scan_double(const char *text, double *result, const char *default_text, over_under = "under"; } - crm_debug("Floating-point value parsed from '%s' would %sflow " - "(using %g instead)", text, over_under, *result); + pcmk__debug("Floating-point value parsed from '%s' would %sflow " + "(using %g instead)", + text, over_under, *result); } else if (errno != 0) { rc = errno; // strtod() set *result = 0 on parse failure *result = PCMK__PARSE_DBL_DEFAULT; - crm_debug("Could not parse floating-point value from '%s' (using " - "%.1f instead): %s", text, PCMK__PARSE_DBL_DEFAULT, - pcmk_rc_str(rc)); + pcmk__debug("Could not parse floating-point value from '%s' (using " + "%.1f instead): %s", + text, PCMK__PARSE_DBL_DEFAULT, pcmk_rc_str(rc)); } else if (local_end_text == text) { // errno == 0, but nothing was parsed rc = EINVAL; *result = PCMK__PARSE_DBL_DEFAULT; - crm_debug("Could not parse floating-point value from '%s' (using " - "%.1f instead): No digits found", text, - PCMK__PARSE_DBL_DEFAULT); + pcmk__debug("Could not parse floating-point value from '%s' (using " + "%.1f instead): No digits found", + text, PCMK__PARSE_DBL_DEFAULT); } else if (QB_ABS(*result) <= DBL_MIN) { /* @@ -264,20 +270,21 @@ pcmk__scan_double(const char *text, double *result, const char *default_text, for (const char *p = text; p != local_end_text; p++) { if (strchr("0.eE", *p) == NULL) { rc = pcmk_rc_underflow; - crm_debug("Floating-point value parsed from '%s' would " - "underflow (using %g instead)", text, *result); + pcmk__debug("Floating-point value parsed from '%s' would " + "underflow (using %g instead)", text, *result); break; } } } else { - crm_trace("Floating-point value parsed successfully from " - "'%s': %g", text, *result); + pcmk__trace("Floating-point value parsed successfully from '%s': " + "%g", + text, *result); } if ((end_text == NULL) && !pcmk__str_empty(local_end_text)) { - crm_debug("Characters left over after parsing '%s': '%s'", - text, local_end_text); + pcmk__debug("Characters left over after parsing '%s': '%s'", text, + local_end_text); } } @@ -320,14 +327,16 @@ pcmk__guint_from_hash(GHashTable *table, const char *key, guint default_val, rc = pcmk__scan_ll(value, &value_ll, 0LL); if (rc != pcmk_rc_ok) { - crm_warn("Using default (%u) for %s because '%s' is not a " - "valid integer: %s", default_val, key, value, pcmk_rc_str(rc)); + pcmk__warn("Using default (%u) for %s because '%s' is not a valid " + "integer: %s", + default_val, key, value, pcmk_rc_str(rc)); return rc; } if ((value_ll < 0) || (value_ll > G_MAXUINT)) { - crm_warn("Using default (%u) for %s because '%s' is not in valid range", - default_val, key, value); + pcmk__warn("Using default (%u) for %s because '%s' is not in valid " + "range", + default_val, key, value); return ERANGE; } @@ -337,116 +346,18 @@ pcmk__guint_from_hash(GHashTable *table, const char *key, guint default_val, return pcmk_rc_ok; } -/*! - * \brief Parse a time+units string and return milliseconds equivalent - * - * \param[in] input String with a nonnegative number and optional unit - * (optionally with whitespace before and/or after the - * number). If missing, the unit defaults to seconds. - * - * \return Milliseconds corresponding to string expression, or - * \c PCMK__PARSE_INT_DEFAULT on error - */ -long long -crm_get_msec(const char *input) -{ - char *units = NULL; // Do not free; will point to part of input - long long multiplier = 1000; - long long divisor = 1; - long long msec = PCMK__PARSE_INT_DEFAULT; - int rc = pcmk_rc_ok; - - if (input == NULL) { - return PCMK__PARSE_INT_DEFAULT; - } - - // Skip initial whitespace - while (isspace(*input)) { - input++; - } - - rc = scan_ll(input, &msec, PCMK__PARSE_INT_DEFAULT, &units); - - if ((rc == ERANGE) && (msec > 0)) { - crm_warn("'%s' will be clipped to %lld", input, msec); - - } else if ((rc != pcmk_rc_ok) || (msec < 0)) { - crm_warn("'%s' is not a valid time duration: %s", - input, ((rc == pcmk_rc_ok)? "Negative" : pcmk_rc_str(rc))); - return PCMK__PARSE_INT_DEFAULT; - } - - /* If the number is a decimal, scan_ll() reads only the integer part. Skip - * any remaining digits or decimal characters. - * - * @COMPAT Well-formed and malformed decimals are both accepted inputs. For - * example, "3.14 ms" and "3.1.4 ms" are treated the same as "3ms" and - * parsed successfully. At a compatibility break, decide if this is still - * desired. - */ - while (isdigit(*units) || (*units == '.')) { - units++; - } - - // Skip any additional whitespace after the number - while (isspace(*units)) { - units++; - } - - /* @COMPAT Use exact comparisons. Currently, we match too liberally, and the - * second strncasecmp() in each case is redundant. - */ - if ((*units == '\0') - || (strncasecmp(units, "s", 1) == 0) - || (strncasecmp(units, "sec", 3) == 0)) { - multiplier = 1000; - divisor = 1; - - } else if ((strncasecmp(units, "ms", 2) == 0) - || (strncasecmp(units, "msec", 4) == 0)) { - multiplier = 1; - divisor = 1; - - } else if ((strncasecmp(units, "us", 2) == 0) - || (strncasecmp(units, "usec", 4) == 0)) { - multiplier = 1; - divisor = 1000; - - } else if ((strncasecmp(units, "m", 1) == 0) - || (strncasecmp(units, "min", 3) == 0)) { - multiplier = 60 * 1000; - divisor = 1; - - } else if ((strncasecmp(units, "h", 1) == 0) - || (strncasecmp(units, "hr", 2) == 0)) { - multiplier = 60 * 60 * 1000; - divisor = 1; - - } else { - // Invalid units - return PCMK__PARSE_INT_DEFAULT; - } - - // Apply units, capping at LLONG_MAX - if (msec > (LLONG_MAX / multiplier)) { - return LLONG_MAX; - } - return (msec * multiplier) / divisor; -} - /*! * \brief Parse milliseconds from a Pacemaker interval specification * * \param[in] input Pacemaker time interval specification (a bare number * of seconds; a number with a unit, optionally with * whitespace before and/or after the number; or an ISO - * 8601 duration) + * 8601 duration) (can be \c NULL) * \param[out] result_ms Where to store milliseconds equivalent of \p input on * success (limited to the range of an unsigned integer), * or 0 if \p input is \c NULL or invalid * - * \return Standard Pacemaker return code (specifically, \c pcmk_rc_ok if - * \p input is valid or \c NULL, and \c EINVAL otherwise) + * \return Standard Pacemaker return code */ int pcmk_parse_interval_spec(const char *input, guint *result_ms) @@ -469,14 +380,18 @@ pcmk_parse_interval_spec(const char *input, guint *result_ms) } } else { - msec = crm_get_msec(input); + rc = pcmk__parse_ms(input, &msec); } if (msec < 0) { - crm_warn("Using 0 instead of invalid interval specification '%s'", - input); + pcmk__warn("Using 0 instead of invalid interval specification '%s'", + input); msec = 0; - rc = EINVAL; + + if (rc == pcmk_rc_ok) { + // Preserve any error from pcmk__parse_ms() + rc = EINVAL; + } } done: @@ -486,38 +401,6 @@ pcmk_parse_interval_spec(const char *input, guint *result_ms) return rc; } -gboolean -crm_is_true(const char *s) -{ - gboolean ret = FALSE; - - return (crm_str_to_boolean(s, &ret) < 0)? FALSE : ret; -} - -int -crm_str_to_boolean(const char *s, int *ret) -{ - if (s == NULL) { - return -1; - } - - if (pcmk__strcase_any_of(s, PCMK_VALUE_TRUE, "on", "yes", "y", "1", NULL)) { - if (ret != NULL) { - *ret = TRUE; - } - return 1; - } - - if (pcmk__strcase_any_of(s, PCMK_VALUE_FALSE, PCMK_VALUE_OFF, "no", "n", - "0", NULL)) { - if (ret != NULL) { - *ret = FALSE; - } - return 1; - } - return -1; -} - /*! * \internal * \brief Replace any trailing newlines in a string with \0's @@ -859,14 +742,14 @@ pcmk__compress(const char *data, unsigned int length, unsigned int max, *result_len = max; rc = BZ2_bzBuffToBuffCompress(compressed, result_len, uncompressed, length, - CRM_BZ2_BLOCKS, 0, CRM_BZ2_WORK); + PCMK__BZ2_BLOCKS, 0, PCMK__BZ2_WORK); rc = pcmk__bzlib2rc(rc); free(uncompressed); if (rc != pcmk_rc_ok) { - crm_err("Compression of %d bytes failed: %s " QB_XS " rc=%d", - length, pcmk_rc_str(rc), rc); + pcmk__err("Compression of %d bytes failed: %s " QB_XS " rc=%d", length, + pcmk_rc_str(rc), rc); free(compressed); return rc; } @@ -874,31 +757,57 @@ pcmk__compress(const char *data, unsigned int length, unsigned int max, #ifdef CLOCK_MONOTONIC clock_gettime(CLOCK_MONOTONIC, &after_t); - crm_trace("Compressed %d bytes into %d (ratio %d:1) in %.0fms", - length, *result_len, length / (*result_len), - (after_t.tv_sec - before_t.tv_sec) * 1000 + - (after_t.tv_nsec - before_t.tv_nsec) / 1e6); + pcmk__trace("Compressed %d bytes into %d (ratio %d:1) in %.0fms", length, + *result_len, (length / *result_len), + (((after_t.tv_sec - before_t.tv_sec) * 1000) + + ((after_t.tv_nsec - before_t.tv_nsec) / 1e6))); #else - crm_trace("Compressed %d bytes into %d (ratio %d:1)", - length, *result_len, length / (*result_len)); + pcmk__trace("Compressed %d bytes into %d (ratio %d:1)", length, *result_len, + (length / *result_len)); #endif *result = compressed; return pcmk_rc_ok; } -char * -crm_strdup_printf(char const *format, ...) +/*! + * \internal + * \brief Parse a boolean value from a string + * + * Valid input strings (case-insensitive) are as follows: + * * \c PCMK_VALUE_TRUE, \c "on", \c "yes", \c "y", or \c "1" for \c true + * * \c PCMK_VALUE_FALSE, \c PCMK_VALUE_OFF, \c "no", \c "n", or \c "0" for + * \c false + * + * \param[in] input Input string + * \param[out] result Where to store parsed boolean value (can be \c NULL) + * + * \retval \c true if \p input was successfully parsed to a boolean value + * \retval \c false otherwise + */ +int +pcmk__parse_bool(const char *input, bool *result) { - va_list ap; - int len = 0; - char *string = NULL; + bool local_result = false; - va_start(ap, format); - len = vasprintf(&string, format, ap); - pcmk__assert(len > 0); - va_end(ap); - return string; + CRM_CHECK(input != NULL, return EINVAL); + + if (pcmk__strcase_any_of(input, PCMK_VALUE_TRUE, "on", "yes", "y", "1", + NULL)) { + local_result = true; + + } else if (pcmk__strcase_any_of(input, PCMK_VALUE_FALSE, PCMK_VALUE_OFF, + "no", "n", "0", NULL)) { + local_result = false; + + } else { + return pcmk_rc_bad_input; + } + + if (result != NULL) { + *result = local_result; + } + return pcmk_rc_ok; } int @@ -914,7 +823,7 @@ pcmk__parse_ll_range(const char *srcstring, long long *start, long long *end) // cppcheck-suppress ctunullpointer *end = PCMK__PARSE_INT_DEFAULT; - crm_trace("Attempting to decode: [%s]", srcstring); + pcmk__trace("Attempting to decode: [%s]", srcstring); if (pcmk__str_eq(srcstring, "", pcmk__str_null_matches)) { return ENODATA; } else if (pcmk__str_eq(srcstring, "-", pcmk__str_none)) { @@ -964,6 +873,138 @@ pcmk__parse_ll_range(const char *srcstring, long long *start, long long *end) return pcmk_rc_ok; } +/*! + * \internal + * \brief Get multiplier and divisor corresponding to given units string + * + * Multiplier and divisor convert from a number of seconds to an equivalent + * number of the unit described by the units string. + * + * \param[in] units String describing a unit of time (may be empty, + * \c "s", \c "sec", \c "ms", \c "msec", \c "us", + * \c "usec", \c "m", \c "min", \c "h", or \c "hr") + * \param[out] multiplier Number of units in one second, if unit is smaller + * than one second, or 1 otherwise (unchanged on error) + * \param[out] divisor Number of seconds in one unit, if unit is larger + * than one second, or 1 otherwise (unchanged on error) + * + * \return Standard Pacemaker return code + */ +static int +get_multiplier_divisor(const char *units, long long *multiplier, + long long *divisor) +{ + /* @COMPAT Use exact comparisons. Currently, we match too liberally, and the + * second strncasecmp() in each case is redundant. + */ + if ((*units == '\0') + || (strncasecmp(units, "s", 1) == 0) + || (strncasecmp(units, "sec", 3) == 0)) { + *multiplier = 1000; + *divisor = 1; + + } else if ((strncasecmp(units, "ms", 2) == 0) + || (strncasecmp(units, "msec", 4) == 0)) { + *multiplier = 1; + *divisor = 1; + + } else if ((strncasecmp(units, "us", 2) == 0) + || (strncasecmp(units, "usec", 4) == 0)) { + *multiplier = 1; + *divisor = 1000; + + } else if ((strncasecmp(units, "m", 1) == 0) + || (strncasecmp(units, "min", 3) == 0)) { + *multiplier = 60 * 1000; + *divisor = 1; + + } else if ((strncasecmp(units, "h", 1) == 0) + || (strncasecmp(units, "hr", 2) == 0)) { + *multiplier = 60 * 60 * 1000; + *divisor = 1; + + } else { + // Invalid units + return pcmk_rc_bad_input; + } + + return pcmk_rc_ok; +} + +/*! + * \internal + * \brief Parse a time and units string into a milliseconds value + * + * \param[in] input String with a nonnegative number and optional unit + * (optionally with whitespace before and/or after the + * number). If absent, the unit defaults to seconds. + * \param[out] result Where to store result in milliseconds (unchanged on error + * except \c ERANGE) + * + * \return Standard Pacemaker return code + */ +int +pcmk__parse_ms(const char *input, long long *result) +{ + long long local_result = 0; + char *units = NULL; // Do not free; will point to part of input + long long multiplier = 1000; + long long divisor = 1; + int rc = pcmk_rc_ok; + + CRM_CHECK((input != NULL) && (result != NULL), return EINVAL); + + rc = scan_ll(input, &local_result, 0, &units); + if ((rc == pcmk_rc_ok) || (rc == ERANGE)) { + int units_rc = pcmk_rc_ok; + + /* If the number is a decimal, scan_ll() reads only the integer part. + * Skip any remaining digits or decimal characters. + * + * @COMPAT Well-formed and malformed decimals are both accepted inputs. + * For example, "3.14 ms" and "3.1.4 ms" are treated the same as "3ms" + * and parsed successfully. At a compatibility break, decide if this is + * still desired. + */ + for (; isdigit(*units) || (*units == '.'); units++); + + // Skip any additional whitespace after the number + for (; isspace(*units); units++); + + // Validate units and get conversion constants + units_rc = get_multiplier_divisor(units, &multiplier, &divisor); + if (units_rc != pcmk_rc_ok) { + rc = units_rc; + } + } + + if (rc == ERANGE) { + pcmk__warn("'%s' will be clipped to %lld", input, local_result); + + /* Continue through rest of body before returning ERANGE + * + * @COMPAT Improve handling of overflow. Units won't necessarily be + * respected right now, for one thing. + */ + + } else if (rc != pcmk_rc_ok) { + pcmk__warn("'%s' is not a valid time duration: %s", input, + pcmk_rc_str(rc)); + return rc; + } + + // Apply units, capping at LLONG_MAX + if (local_result > (LLONG_MAX / multiplier)) { + *result = LLONG_MAX; + } else if (local_result < (LLONG_MIN / multiplier)) { + *result = LLONG_MIN; + } else { + *result = (local_result * multiplier) / divisor; + } + + return rc; +} + /*! * \internal * \brief Find a string in a list of strings @@ -1166,7 +1207,7 @@ int pcmk__strcmp(const char *s1, const char *s2, uint32_t flags) { /* If this flag is set, the second string is a regex. */ - if (pcmk_is_set(flags, pcmk__str_regex)) { + if (pcmk__is_set(flags, pcmk__str_regex)) { regex_t r_patt; int reg_flags = REG_EXTENDED | REG_NOSUB; int regcomp_rc = 0; @@ -1176,13 +1217,14 @@ pcmk__strcmp(const char *s1, const char *s2, uint32_t flags) return 1; } - if (pcmk_is_set(flags, pcmk__str_casei)) { + if (pcmk__is_set(flags, pcmk__str_casei)) { reg_flags |= REG_ICASE; } regcomp_rc = regcomp(&r_patt, s2, reg_flags); if (regcomp_rc != 0) { rc = 1; - crm_err("Bad regex '%s' for update: %s", s2, strerror(regcomp_rc)); + pcmk__err("Bad regex '%s' for update: %s", s2, + strerror(regcomp_rc)); } else { rc = regexec(&r_patt, s1, 0, NULL, 0); regfree(&r_patt); @@ -1202,7 +1244,7 @@ pcmk__strcmp(const char *s1, const char *s2, uint32_t flags) * are NULL. If neither one is NULL, we need to continue and compare * them normally. */ - if (pcmk_is_set(flags, pcmk__str_null_matches)) { + if (pcmk__is_set(flags, pcmk__str_null_matches)) { if (s1 == NULL || s2 == NULL) { return 0; } @@ -1221,13 +1263,13 @@ pcmk__strcmp(const char *s1, const char *s2, uint32_t flags) * are "*". If neither one is, we need to continue and compare them * normally. */ - if (pcmk_is_set(flags, pcmk__str_star_matches)) { + if (pcmk__is_set(flags, pcmk__str_star_matches)) { if (strcmp(s1, "*") == 0 || strcmp(s2, "*") == 0) { return 0; } } - if (pcmk_is_set(flags, pcmk__str_casei)) { + if (pcmk__is_set(flags, pcmk__str_casei)) { return strcasecmp(s1, s2); } else { return strcmp(s1, s2); @@ -1285,6 +1327,34 @@ pcmk__str_update(char **str, const char *value) } } +/*! + * \internal + * \brief Print to an allocated string using \c printf()-style formatting + * + * This is like \c asprintf() but asserts on any error. The return value cannot + * be \c NULL, but it may be an empty string, depending on the format string and + * variadic arguments. + * + * \param[in] format \c printf() format string + * \param[in] ... \c printf() format arguments + * + * \return Newly allocated string (guaranteed not to be \c NULL). + * + * \note The caller is responsible for freeing the return value using \c free(). + */ +char * +pcmk__assert_asprintf(const char *format, ...) +{ + char *result = NULL; + va_list ap; + + va_start(ap, format); + pcmk__assert(vasprintf(&result, format, ap) >= 0); + va_end(ap); + + return result; +} + /*! * \internal * \brief Append a list of strings to a destination \p GString @@ -1313,3 +1383,144 @@ pcmk__g_strcat(GString *buffer, ...) } va_end(ap); } + +// Deprecated functions kept only for backward API compatibility +// LCOV_EXCL_START + +#include + +long long +crm_get_msec(const char *input) +{ + char *units = NULL; // Do not free; will point to part of input + long long multiplier = 1000; + long long divisor = 1; + long long msec = PCMK__PARSE_INT_DEFAULT; + int rc = pcmk_rc_ok; + + if (input == NULL) { + return PCMK__PARSE_INT_DEFAULT; + } + + // Skip initial whitespace + while (isspace(*input)) { + input++; + } + + rc = scan_ll(input, &msec, PCMK__PARSE_INT_DEFAULT, &units); + + if ((rc == ERANGE) && (msec > 0)) { + pcmk__warn("'%s' will be clipped to %lld", input, msec); + + } else if ((rc != pcmk_rc_ok) || (msec < 0)) { + pcmk__warn("'%s' is not a valid time duration: %s", input, + ((rc == pcmk_rc_ok)? "Negative" : pcmk_rc_str(rc))); + return PCMK__PARSE_INT_DEFAULT; + } + + /* If the number is a decimal, scan_ll() reads only the integer part. Skip + * any remaining digits or decimal characters. + * + * @COMPAT Well-formed and malformed decimals are both accepted inputs. For + * example, "3.14 ms" and "3.1.4 ms" are treated the same as "3ms" and + * parsed successfully. At a compatibility break, decide if this is still + * desired. + */ + while (isdigit(*units) || (*units == '.')) { + units++; + } + + // Skip any additional whitespace after the number + while (isspace(*units)) { + units++; + } + + /* @COMPAT Use exact comparisons. Currently, we match too liberally, and the + * second strncasecmp() in each case is redundant. + */ + if ((*units == '\0') + || (strncasecmp(units, "s", 1) == 0) + || (strncasecmp(units, "sec", 3) == 0)) { + multiplier = 1000; + divisor = 1; + + } else if ((strncasecmp(units, "ms", 2) == 0) + || (strncasecmp(units, "msec", 4) == 0)) { + multiplier = 1; + divisor = 1; + + } else if ((strncasecmp(units, "us", 2) == 0) + || (strncasecmp(units, "usec", 4) == 0)) { + multiplier = 1; + divisor = 1000; + + } else if ((strncasecmp(units, "m", 1) == 0) + || (strncasecmp(units, "min", 3) == 0)) { + multiplier = 60 * 1000; + divisor = 1; + + } else if ((strncasecmp(units, "h", 1) == 0) + || (strncasecmp(units, "hr", 2) == 0)) { + multiplier = 60 * 60 * 1000; + divisor = 1; + + } else { + // Invalid units + return PCMK__PARSE_INT_DEFAULT; + } + + // Apply units, capping at LLONG_MAX + if (msec > (LLONG_MAX / multiplier)) { + return LLONG_MAX; + } + return (msec * multiplier) / divisor; +} + +gboolean +crm_is_true(const char *s) +{ + gboolean ret = FALSE; + + return (crm_str_to_boolean(s, &ret) < 0)? FALSE : ret; +} + +int +crm_str_to_boolean(const char *s, int *ret) +{ + if (s == NULL) { + return -1; + } + + if (pcmk__strcase_any_of(s, PCMK_VALUE_TRUE, "on", "yes", "y", "1", NULL)) { + if (ret != NULL) { + *ret = TRUE; + } + return 1; + } + + if (pcmk__strcase_any_of(s, PCMK_VALUE_FALSE, PCMK_VALUE_OFF, "no", "n", + "0", NULL)) { + if (ret != NULL) { + *ret = FALSE; + } + return 1; + } + return -1; +} + +char * +crm_strdup_printf(char const *format, ...) +{ + va_list ap; + int len = 0; + char *string = NULL; + + va_start(ap, format); + len = vasprintf(&string, format, ap); + pcmk__assert(len > 0); + va_end(ap); + return string; +} + +// LCOV_EXCL_STOP +// End deprecated API diff --git a/lib/common/tests/acl/Makefile.am b/lib/common/tests/acl/Makefile.am index d8b8b06cbe2..e9e001283f4 100644 --- a/lib/common/tests/acl/Makefile.am +++ b/lib/common/tests/acl/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2021-2024 the Pacemaker project contributors +# Copyright 2021-2025 the Pacemaker project contributors # # The version control history for this file may have further details. # @@ -15,7 +15,6 @@ include $(top_srcdir)/mk/unittest.mk check_PROGRAMS = pcmk__is_user_in_group_test \ pcmk_acl_required_test \ - xml_acl_denied_test \ - xml_acl_enabled_test + xml_acl_denied_test TESTS = $(check_PROGRAMS) diff --git a/lib/common/tests/acl/xml_acl_enabled_test.c b/lib/common/tests/acl/xml_acl_enabled_test.c deleted file mode 100644 index 6a920a3c73c..00000000000 --- a/lib/common/tests/acl/xml_acl_enabled_test.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2020-2024 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include -#include - -#include "../../crmcommon_private.h" - -static void -is_xml_acl_enabled_without_node(void **state) -{ - xmlNode *test_xml = pcmk__xe_create(NULL, "test_xml"); - assert_false(xml_acl_enabled(test_xml)); - - test_xml->doc->_private = NULL; - assert_false(xml_acl_enabled(test_xml)); - - test_xml->doc = NULL; - assert_false(xml_acl_enabled(test_xml)); - - test_xml = NULL; - assert_false(xml_acl_enabled(test_xml)); -} - -static void -is_xml_acl_enabled_with_node(void **state) -{ - xml_doc_private_t *docpriv; - - xmlNode *test_xml = pcmk__xe_create(NULL, "test_xml"); - - // allocate memory for _private, which is NULL by default - test_xml->doc->_private = pcmk__assert_alloc(1, sizeof(xml_doc_private_t)); - - assert_false(xml_acl_enabled(test_xml)); - - // cast _private from void* to xml_doc_private_t* - docpriv = test_xml->doc->_private; - - // enable an irrelevant flag - docpriv->flags |= pcmk__xf_acl_denied; - - assert_false(xml_acl_enabled(test_xml)); - - // enable pcmk__xf_acl_enabled - docpriv->flags |= pcmk__xf_acl_enabled; - - assert_true(xml_acl_enabled(test_xml)); -} - -PCMK__UNIT_TEST(pcmk__xml_test_setup_group, pcmk__xml_test_teardown_group, - cmocka_unit_test(is_xml_acl_enabled_without_node), - cmocka_unit_test(is_xml_acl_enabled_with_node)) diff --git a/lib/common/tests/digest/Makefile.am b/lib/common/tests/digest/Makefile.am index 223a5053d39..1210b22e070 100644 --- a/lib/common/tests/digest/Makefile.am +++ b/lib/common/tests/digest/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2024 the Pacemaker project contributors +# Copyright 2024-2025 the Pacemaker project contributors # # The version control history for this file may have further details. # @@ -12,6 +12,6 @@ include $(top_srcdir)/mk/tap.mk include $(top_srcdir)/mk/unittest.mk # Add "_test" to the end of all test program names to simplify .gitignore. -check_PROGRAMS = crm_md5sum_test +check_PROGRAMS = pcmk__md5sum_test TESTS = $(check_PROGRAMS) diff --git a/lib/common/tests/digest/crm_md5sum_test.c b/lib/common/tests/digest/pcmk__md5sum_test.c similarity index 70% rename from lib/common/tests/digest/crm_md5sum_test.c rename to lib/common/tests/digest/pcmk__md5sum_test.c index ece4ced2c32..c9f6db1bae5 100644 --- a/lib/common/tests/digest/crm_md5sum_test.c +++ b/lib/common/tests/digest/pcmk__md5sum_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,19 +11,21 @@ #include +#include "crmcommon_private.h" // pcmk__md5sum() + static void null_arg_test(void **state) { - assert_null(crm_md5sum(NULL)); + assert_null(pcmk__md5sum(NULL)); } static void basic_usage_test(void **state) { - char *result = crm_md5sum("abcdefghijklmnopqrstuvwxyz"); + gchar *result = pcmk__md5sum("abcdefghijklmnopqrstuvwxyz"); assert_string_equal(result, "c3fcd3d76192e4007dfb496cca67e13b"); - free(result); + g_free(result); } PCMK__UNIT_TEST(NULL, NULL, diff --git a/lib/common/tests/flags/Makefile.am b/lib/common/tests/flags/Makefile.am index 6af5dd3213b..9a9e708913a 100644 --- a/lib/common/tests/flags/Makefile.am +++ b/lib/common/tests/flags/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2020-2024 the Pacemaker project contributors +# Copyright 2020-2025 the Pacemaker project contributors # # The version control history for this file may have further details. # @@ -14,7 +14,7 @@ include $(top_srcdir)/mk/unittest.mk # Add "_test" to the end of all test program names to simplify .gitignore. check_PROGRAMS = pcmk__clear_flags_as_test \ pcmk__set_flags_as_test \ - pcmk_all_flags_set_test \ - pcmk_any_flags_set_test + pcmk__all_flags_set_test \ + pcmk__any_flags_set_test TESTS = $(check_PROGRAMS) diff --git a/lib/common/tests/flags/pcmk__all_flags_set_test.c b/lib/common/tests/flags/pcmk__all_flags_set_test.c new file mode 100644 index 00000000000..6dc78264dc1 --- /dev/null +++ b/lib/common/tests/flags/pcmk__all_flags_set_test.c @@ -0,0 +1,33 @@ +/* + * Copyright 2020-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU General Public License version 2 + * or later (GPLv2+) WITHOUT ANY WARRANTY. + */ + +#include + +#include + +static void +all_set(void **state) { + assert_false(pcmk__all_flags_set(0x000, 0x003)); + assert_true(pcmk__all_flags_set(0x00f, 0x003)); + assert_false(pcmk__all_flags_set(0x00f, 0x010)); + assert_false(pcmk__all_flags_set(0x00f, 0x011)); + assert_true(pcmk__all_flags_set(0x000, 0x000)); + assert_true(pcmk__all_flags_set(0x00f, 0x000)); +} + +static void +one_is_set(void **state) { + // pcmk__is_set() is a simple macro alias for pcmk__all_flags_set() + assert_true(pcmk__is_set(0x00f, 0x001)); + assert_false(pcmk__is_set(0x00f, 0x010)); +} + +PCMK__UNIT_TEST(NULL, NULL, + cmocka_unit_test(all_set), + cmocka_unit_test(one_is_set)) diff --git a/lib/common/tests/flags/pcmk__any_flags_set_test.c b/lib/common/tests/flags/pcmk__any_flags_set_test.c new file mode 100644 index 00000000000..724a77b0161 --- /dev/null +++ b/lib/common/tests/flags/pcmk__any_flags_set_test.c @@ -0,0 +1,26 @@ +/* + * Copyright 2020-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU General Public License version 2 + * or later (GPLv2+) WITHOUT ANY WARRANTY. + */ + +#include + +#include + +static void +any_set(void **state) { + assert_false(pcmk__any_flags_set(0x000, 0x000)); + assert_false(pcmk__any_flags_set(0x000, 0x001)); + assert_true(pcmk__any_flags_set(0x00f, 0x001)); + assert_false(pcmk__any_flags_set(0x00f, 0x010)); + assert_true(pcmk__any_flags_set(0x00f, 0x011)); + assert_false(pcmk__any_flags_set(0x000, 0x000)); + assert_false(pcmk__any_flags_set(0x00f, 0x000)); +} + +PCMK__UNIT_TEST(NULL, NULL, + cmocka_unit_test(any_set)) diff --git a/lib/common/tests/flags/pcmk__clear_flags_as_test.c b/lib/common/tests/flags/pcmk__clear_flags_as_test.c index 07dbe28e5b2..fa9d2800d2b 100644 --- a/lib/common/tests/flags/pcmk__clear_flags_as_test.c +++ b/lib/common/tests/flags/pcmk__clear_flags_as_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 the Pacemaker project contributors + * Copyright 2020-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,26 +13,32 @@ static void clear_none(void **state) { - assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0x00f, NULL), 0x0f0); - assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0xf0f, NULL), 0x0f0); + assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0x00f, NULL), + 0x0f0); + assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0xf0f, NULL), + 0x0f0); } static void clear_some(void **state) { - assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0x020, NULL), 0x0d0); - assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0x030, NULL), 0x0c0); + assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0x020, NULL), + 0x0d0); + assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0x030, NULL), + 0x0c0); } static void clear_all(void **state) { - assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0x0f0, NULL), 0x000); - assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0xfff, NULL), 0x000); + assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0x0f0, NULL), + 0x000); + assert_int_equal(pcmk__clear_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0xfff, NULL), + 0x000); } PCMK__UNIT_TEST(NULL, NULL, diff --git a/lib/common/tests/flags/pcmk__set_flags_as_test.c b/lib/common/tests/flags/pcmk__set_flags_as_test.c index cd14c85f360..20fb29bab6e 100644 --- a/lib/common/tests/flags/pcmk__set_flags_as_test.c +++ b/lib/common/tests/flags/pcmk__set_flags_as_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 the Pacemaker project contributors + * Copyright 2020-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,12 +13,15 @@ static void set_flags(void **state) { - assert_int_equal(pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0x00f, NULL), 0x0ff); - assert_int_equal(pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0xf0f, NULL), 0xfff); - assert_int_equal(pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, "Test", - "test", 0x0f0, 0xfff, NULL), 0xfff); + assert_int_equal(pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0x00f, NULL), + 0x0ff); + assert_int_equal(pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0xf0f, NULL), + 0xfff); + assert_int_equal(pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, + "Test", "test", 0x0f0, 0xfff, NULL), + 0xfff); } PCMK__UNIT_TEST(NULL, NULL, diff --git a/lib/common/tests/flags/pcmk_all_flags_set_test.c b/lib/common/tests/flags/pcmk_all_flags_set_test.c deleted file mode 100644 index 512ccce0652..00000000000 --- a/lib/common/tests/flags/pcmk_all_flags_set_test.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2020-2021 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include - -static void -all_set(void **state) { - assert_false(pcmk_all_flags_set(0x000, 0x003)); - assert_true(pcmk_all_flags_set(0x00f, 0x003)); - assert_false(pcmk_all_flags_set(0x00f, 0x010)); - assert_false(pcmk_all_flags_set(0x00f, 0x011)); - assert_true(pcmk_all_flags_set(0x000, 0x000)); - assert_true(pcmk_all_flags_set(0x00f, 0x000)); -} - -static void -one_is_set(void **state) { - // pcmk_is_set() is a simple macro alias for pcmk_all_flags_set() - assert_true(pcmk_is_set(0x00f, 0x001)); - assert_false(pcmk_is_set(0x00f, 0x010)); -} - -PCMK__UNIT_TEST(NULL, NULL, - cmocka_unit_test(all_set), - cmocka_unit_test(one_is_set)) diff --git a/lib/common/tests/flags/pcmk_any_flags_set_test.c b/lib/common/tests/flags/pcmk_any_flags_set_test.c deleted file mode 100644 index dc3aabca140..00000000000 --- a/lib/common/tests/flags/pcmk_any_flags_set_test.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2020-2021 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include - -static void -any_set(void **state) { - assert_false(pcmk_any_flags_set(0x000, 0x000)); - assert_false(pcmk_any_flags_set(0x000, 0x001)); - assert_true(pcmk_any_flags_set(0x00f, 0x001)); - assert_false(pcmk_any_flags_set(0x00f, 0x010)); - assert_true(pcmk_any_flags_set(0x00f, 0x011)); - assert_false(pcmk_any_flags_set(0x000, 0x000)); - assert_false(pcmk_any_flags_set(0x00f, 0x000)); -} - -PCMK__UNIT_TEST(NULL, NULL, - cmocka_unit_test(any_set)) diff --git a/lib/common/tests/iso8601/crm_time_add_days_test.c b/lib/common/tests/iso8601/crm_time_add_days_test.c index a41a0085b86..c9ad3616d78 100644 --- a/lib/common/tests/iso8601/crm_time_add_days_test.c +++ b/lib/common/tests/iso8601/crm_time_add_days_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -174,8 +174,9 @@ year_out_of_range(void **state) char *expected_datetime = NULL; // Year too large - orig_datetime = crm_strdup_printf("%d-01-01 00:00:00 +00:00", INT_MAX); - expected_datetime = crm_strdup_printf("%d-12-31 00:00:00 +00:00", INT_MAX); + orig_datetime = pcmk__assert_asprintf("%d-01-01 00:00:00 +00:00", INT_MAX); + expected_datetime = pcmk__assert_asprintf("%d-12-31 00:00:00 +00:00", + INT_MAX); assert_add_days(orig_datetime, 400, expected_datetime); free(orig_datetime); free(expected_datetime); diff --git a/lib/common/tests/iso8601/crm_time_add_years_test.c b/lib/common/tests/iso8601/crm_time_add_years_test.c index 3b269bb1bfa..8ea6b4d1c46 100644 --- a/lib/common/tests/iso8601/crm_time_add_years_test.c +++ b/lib/common/tests/iso8601/crm_time_add_years_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -64,7 +64,8 @@ out_of_range(void **state) { char *expected_datetime = NULL; - expected_datetime = crm_strdup_printf("%d-01-01 00:00:00 +00:00", INT_MAX); + expected_datetime = pcmk__assert_asprintf("%d-01-01 00:00:00 +00:00", + INT_MAX); assert_add_years("2024-01-01 00:00:00 +00:00", INT_MAX, expected_datetime); free(expected_datetime); diff --git a/lib/common/tests/messages/pcmk__new_message_as_test.c b/lib/common/tests/messages/pcmk__new_message_as_test.c index f8a64255b2d..0f28f97660c 100644 --- a/lib/common/tests/messages/pcmk__new_message_as_test.c +++ b/lib/common/tests/messages/pcmk__new_message_as_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,7 +13,6 @@ #include // xmlNode #include // pcmk_ipc_controld -#include // crm_element_value() #include // pcmk__new_message_as() #include // pcmk__server_message_type() #include // pcmk__xe_create(), etc. @@ -42,19 +41,18 @@ optional_arguments_null(void **state) message = pcmk__new_message_as("fn", pcmk_ipc_controld, NULL, "ss", NULL, NULL, "op", NULL); assert_non_null(message); - assert_string_equal(crm_element_value(message, PCMK_XA_ORIGIN), "fn"); - assert_string_equal(crm_element_value(message, PCMK__XA_T), + assert_string_equal(pcmk__xe_get(message, PCMK_XA_ORIGIN), "fn"); + assert_string_equal(pcmk__xe_get(message, PCMK__XA_T), pcmk__server_message_type(pcmk_ipc_controld)); - assert_string_equal(crm_element_value(message, PCMK__XA_SUBT), + assert_string_equal(pcmk__xe_get(message, PCMK__XA_SUBT), PCMK__VALUE_REQUEST); - assert_string_equal(crm_element_value(message, PCMK_XA_VERSION), + assert_string_equal(pcmk__xe_get(message, PCMK_XA_VERSION), CRM_FEATURE_SET); - assert_non_null(crm_element_value(message, PCMK_XA_REFERENCE)); - assert_string_equal(crm_element_value(message, PCMK__XA_CRM_SYS_FROM), - "ss"); - assert_null(crm_element_value(message, PCMK__XA_CRM_HOST_TO)); - assert_null(crm_element_value(message, PCMK__XA_CRM_SYS_TO)); - assert_string_equal(crm_element_value(message, PCMK__XA_CRM_TASK), "op"); + assert_non_null(pcmk__xe_get(message, PCMK_XA_REFERENCE)); + assert_string_equal(pcmk__xe_get(message, PCMK__XA_CRM_SYS_FROM), "ss"); + assert_null(pcmk__xe_get(message, PCMK__XA_CRM_HOST_TO)); + assert_null(pcmk__xe_get(message, PCMK__XA_CRM_SYS_TO)); + assert_string_equal(pcmk__xe_get(message, PCMK__XA_CRM_TASK), "op"); assert_null(message->children); pcmk__xml_free(message); } @@ -70,10 +68,9 @@ optional_arguments_nonnull(void **state) pcmk__xml_free(data); assert_non_null(message); - assert_string_equal(crm_element_value(message, PCMK_XA_REFERENCE), "rt"); - assert_string_equal(crm_element_value(message, PCMK__XA_CRM_HOST_TO), - "node1"); - assert_string_equal(crm_element_value(message, PCMK__XA_CRM_SYS_TO), "rs"); + assert_string_equal(pcmk__xe_get(message, PCMK_XA_REFERENCE), "rt"); + assert_string_equal(pcmk__xe_get(message, PCMK__XA_CRM_HOST_TO), "node1"); + assert_string_equal(pcmk__xe_get(message, PCMK__XA_CRM_SYS_TO), "rs"); assert_non_null(message->children); assert_null(message->children->next); assert_string_equal((const char *) (message->children->name), diff --git a/lib/common/tests/nodes/pcmk_foreach_active_resource_test.c b/lib/common/tests/nodes/pcmk_foreach_active_resource_test.c index c453316e47a..39a3b6157eb 100644 --- a/lib/common/tests/nodes/pcmk_foreach_active_resource_test.c +++ b/lib/common/tests/nodes/pcmk_foreach_active_resource_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -36,7 +36,7 @@ static pcmk_resource_t rsc3 = { static bool fn(pcmk_resource_t *rsc, void *user_data) { - char *expected_id = crm_strdup_printf("rsc%d", counter); + char *expected_id = pcmk__assert_asprintf("rsc%d", counter); assert_string_equal(rsc->id, expected_id); free(expected_id); diff --git a/lib/common/tests/nvpair/crm_meta_name_test.c b/lib/common/tests/nvpair/crm_meta_name_test.c index 7c6c32b6816..377d3743ca8 100644 --- a/lib/common/tests/nvpair/crm_meta_name_test.c +++ b/lib/common/tests/nvpair/crm_meta_name_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,7 @@ #include +#include // crm_meta_value() #include #include diff --git a/lib/common/tests/nvpair/crm_meta_value_test.c b/lib/common/tests/nvpair/crm_meta_value_test.c index ffe9619c546..59f46d7acf3 100644 --- a/lib/common/tests/nvpair/crm_meta_value_test.c +++ b/lib/common/tests/nvpair/crm_meta_value_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,7 @@ #include +#include // crm_meta_value() #include #include diff --git a/lib/common/tests/nvpair/pcmk__xe_get_flags_test.c b/lib/common/tests/nvpair/pcmk__xe_get_flags_test.c index 3462405ba56..b91b1fa85d0 100644 --- a/lib/common/tests/nvpair/pcmk__xe_get_flags_test.c +++ b/lib/common/tests/nvpair/pcmk__xe_get_flags_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -28,7 +28,7 @@ assert_flags(const char *value, int expected_rc, unsigned int expected_flags) xmlNode *xml = pcmk__xe_create(NULL, "element"); assert_non_null(xml); - crm_xml_add(xml, "attribute", value); + pcmk__xe_set(xml, "attribute", value); // Without output argument assert_int_equal(pcmk__xe_get_flags(xml, "attribute", NULL, DEFAULT_VALUE), @@ -92,7 +92,7 @@ no_attr_default(void **state) static void invalid_attr_default(void **state) { - char *too_big = crm_strdup_printf("%lld", UINT32_MAX + 1LL); + char *too_big = pcmk__assert_asprintf("%lld", UINT32_MAX + 1LL); assert_flags("x", pcmk_rc_bad_input, DEFAULT_VALUE); assert_flags("-1", pcmk_rc_bad_input, DEFAULT_VALUE); diff --git a/lib/common/tests/nvpair/pcmk__xe_set_bool_attr_test.c b/lib/common/tests/nvpair/pcmk__xe_set_bool_attr_test.c index 37527a73921..8cd5a72f610 100644 --- a/lib/common/tests/nvpair/pcmk__xe_set_bool_attr_test.c +++ b/lib/common/tests/nvpair/pcmk__xe_set_bool_attr_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2021-2024 the Pacemaker project contributors + * Copyright 2021-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -21,8 +21,8 @@ set_attr(void **state) pcmk__xe_set_bool_attr(node, "a", true); pcmk__xe_set_bool_attr(node, "b", false); - assert_string_equal(crm_element_value(node, "a"), PCMK_VALUE_TRUE); - assert_string_equal(crm_element_value(node, "b"), PCMK_VALUE_FALSE); + assert_string_equal(pcmk__xe_get(node, "a"), PCMK_VALUE_TRUE); + assert_string_equal(pcmk__xe_get(node, "b"), PCMK_VALUE_FALSE); pcmk__xml_free(node); } diff --git a/lib/common/tests/nvpair/pcmk_unpack_nvpair_blocks_test.c b/lib/common/tests/nvpair/pcmk_unpack_nvpair_blocks_test.c index 1792c00332a..4454439fadd 100644 --- a/lib/common/tests/nvpair/pcmk_unpack_nvpair_blocks_test.c +++ b/lib/common/tests/nvpair/pcmk_unpack_nvpair_blocks_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -15,6 +15,7 @@ #include #include +#include // pcmk_unpack_nvpair_blocks() #include /* The test XML is designed so that: diff --git a/lib/common/tests/patchset/pcmk__cib_element_in_patchset_test.c b/lib/common/tests/patchset/pcmk__cib_element_in_patchset_test.c index 79afff35a78..dfe9e859f92 100644 --- a/lib/common/tests/patchset/pcmk__cib_element_in_patchset_test.c +++ b/lib/common/tests/patchset/pcmk__cib_element_in_patchset_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -37,8 +37,8 @@ assert_in_patchset(const char *source_s, const char *target_s, xmlNode *target = pcmk__xml_parse(target_s); xmlNode *patchset = NULL; - xml_track_changes(target, NULL, NULL, false); - xml_calculate_significant_changes(source, target); + pcmk__xml_doc_set_flags(target->doc, pcmk__xf_ignore_attr_pos); + pcmk__xml_mark_changes(source, target); patchset = xml_create_patchset(2, source, target, NULL, false); if (reference) { diff --git a/lib/common/tests/probes/pcmk_xe_mask_probe_failure_test.c b/lib/common/tests/probes/pcmk_xe_mask_probe_failure_test.c index 2e12eb4c4bf..8a6cb880a35 100644 --- a/lib/common/tests/probes/pcmk_xe_mask_probe_failure_test.c +++ b/lib/common/tests/probes/pcmk_xe_mask_probe_failure_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2021-2024 the Pacemaker project contributors + * Copyright 2021-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -40,12 +40,12 @@ op_does_not_have_right_values_test(void **state) { assert_false(pcmk_xe_mask_probe_failure(node)); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"\"/>", - PCMK_OCF_OK); + PCMK_OCF_OK); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); @@ -58,142 +58,142 @@ check_values_test(void **state) { char *s = NULL; /* PCMK_EXEC_NOT_SUPPORTED */ - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_OK, PCMK_EXEC_NOT_SUPPORTED); + PCMK_OCF_OK, PCMK_EXEC_NOT_SUPPORTED); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_NOT_SUPPORTED); + PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_NOT_SUPPORTED); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); /* PCMK_EXEC_DONE */ - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_OK, PCMK_EXEC_DONE); + PCMK_OCF_OK, PCMK_EXEC_DONE); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_INVALID_PARAM, PCMK_EXEC_DONE); + PCMK_OCF_INVALID_PARAM, PCMK_EXEC_DONE); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_DONE); + PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_DONE); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_CONFIGURED, PCMK_EXEC_DONE); + PCMK_OCF_NOT_CONFIGURED, PCMK_EXEC_DONE); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_RUNNING, PCMK_EXEC_DONE); + PCMK_OCF_NOT_RUNNING, PCMK_EXEC_DONE); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); /* PCMK_EXEC_NOT_INSTALLED */ - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_OK, PCMK_EXEC_NOT_INSTALLED); + PCMK_OCF_OK, PCMK_EXEC_NOT_INSTALLED); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_NOT_INSTALLED); + PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_NOT_INSTALLED); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); /* PCMK_EXEC_ERROR */ - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_OK, PCMK_EXEC_ERROR); + PCMK_OCF_OK, PCMK_EXEC_ERROR); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_INVALID_PARAM, PCMK_EXEC_ERROR); + PCMK_OCF_INVALID_PARAM, PCMK_EXEC_ERROR); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_ERROR); + PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_ERROR); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " @@ -204,124 +204,124 @@ check_values_test(void **state) { free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_RUNNING, PCMK_EXEC_ERROR); + PCMK_OCF_NOT_RUNNING, PCMK_EXEC_ERROR); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); /* PCMK_EXEC_ERROR_HARD */ - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_OK, PCMK_EXEC_ERROR_HARD); + PCMK_OCF_OK, PCMK_EXEC_ERROR_HARD); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_INVALID_PARAM, PCMK_EXEC_ERROR_HARD); + PCMK_OCF_INVALID_PARAM, PCMK_EXEC_ERROR_HARD); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_ERROR_HARD); + PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_ERROR_HARD); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_CONFIGURED, PCMK_EXEC_ERROR_HARD); + PCMK_OCF_NOT_CONFIGURED, PCMK_EXEC_ERROR_HARD); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_RUNNING, PCMK_EXEC_ERROR_HARD); + PCMK_OCF_NOT_RUNNING, PCMK_EXEC_ERROR_HARD); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); /* PCMK_EXEC_ERROR_FATAL */ - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_OK, PCMK_EXEC_ERROR_FATAL); + PCMK_OCF_OK, PCMK_EXEC_ERROR_FATAL); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_INVALID_PARAM, PCMK_EXEC_ERROR_FATAL); + PCMK_OCF_INVALID_PARAM, PCMK_EXEC_ERROR_FATAL); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_ERROR_FATAL); + PCMK_OCF_NOT_INSTALLED, PCMK_EXEC_ERROR_FATAL); node = pcmk__xml_parse(s); assert_true(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_CONFIGURED, PCMK_EXEC_ERROR_FATAL); + PCMK_OCF_NOT_CONFIGURED, PCMK_EXEC_ERROR_FATAL); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); pcmk__xml_free(node); - s = crm_strdup_printf("<" PCMK__XE_LRM_RSC_OP " " + s = pcmk__assert_asprintf("<" PCMK__XE_LRM_RSC_OP " " PCMK_XA_OPERATION "=\"" PCMK_ACTION_MONITOR "\" " PCMK_META_INTERVAL "=\"0\" " PCMK__XA_RC_CODE "=\"%d\" " PCMK__XA_OP_STATUS "=\"%d\"/>", - PCMK_OCF_NOT_RUNNING, PCMK_EXEC_ERROR_FATAL); + PCMK_OCF_NOT_RUNNING, PCMK_EXEC_ERROR_FATAL); node = pcmk__xml_parse(s); assert_false(pcmk_xe_mask_probe_failure(node)); free(s); diff --git a/lib/common/tests/rules/pcmk__cmp_by_type_test.c b/lib/common/tests/rules/pcmk__cmp_by_type_test.c index cf468f1fa52..fe041545eb1 100644 --- a/lib/common/tests/rules/pcmk__cmp_by_type_test.c +++ b/lib/common/tests/rules/pcmk__cmp_by_type_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,7 +11,6 @@ #include // INT_MIN, INT_MAX -#include // crm_strdup_printf() #include #include #include "crmcommon_private.h" @@ -46,8 +45,8 @@ compare_string_type(void **state) static void compare_integer_type(void **state) { - char *int_min = crm_strdup_printf("%d", INT_MIN); - char *int_max = crm_strdup_printf("%d", INT_MAX); + char *int_min = pcmk__assert_asprintf("%d", INT_MIN); + char *int_max = pcmk__assert_asprintf("%d", INT_MAX); assert_int_equal(pcmk__cmp_by_type("0", "0", pcmk__type_integer), 0); assert_true(pcmk__cmp_by_type("0", "1", pcmk__type_integer) < 0); diff --git a/lib/common/tests/rules/pcmk_evaluate_rule_test.c b/lib/common/tests/rules/pcmk_evaluate_rule_test.c index e2dd9e3d506..ac31f7efd68 100644 --- a/lib/common/tests/rules/pcmk_evaluate_rule_test.c +++ b/lib/common/tests/rules/pcmk_evaluate_rule_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -88,7 +88,7 @@ good_idref(void **state) xmlNode *rule_xml = pcmk__xe_create(parent_xml, PCMK_XE_RULE); crm_time_t *next_change = crm_time_new_undefined(); - crm_xml_add(rule_xml, PCMK_XA_ID_REF, "r"); + pcmk__xe_set(rule_xml, PCMK_XA_ID_REF, "r"); assert_int_equal(pcmk_evaluate_rule(rule_xml, &rule_input, next_change), pcmk_rc_ok); @@ -103,7 +103,7 @@ bad_idref(void **state) xmlNode *rule_xml = pcmk__xe_create(parent_xml, PCMK_XE_RULE); crm_time_t *next_change = crm_time_new_undefined(); - crm_xml_add(rule_xml, PCMK_XA_ID_REF, "x"); + pcmk__xe_set(rule_xml, PCMK_XA_ID_REF, "x"); assert_int_equal(pcmk_evaluate_rule(rule_xml, &rule_input, next_change), pcmk_rc_unpack_error); diff --git a/lib/common/tests/schemas/pcmk__build_schema_xml_node_test.c b/lib/common/tests/schemas/pcmk__build_schema_xml_node_test.c index 9cb29ad7b2f..17ff072eb8b 100644 --- a/lib/common/tests/schemas/pcmk__build_schema_xml_node_test.c +++ b/lib/common/tests/schemas/pcmk__build_schema_xml_node_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the Pacemaker project contributors + * Copyright 2023-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -85,12 +85,11 @@ single_schema(void **state) */ schema_node = pcmk__xe_first_child(parent, NULL, NULL, NULL); assert_string_equal("pacemaker-3.0", - crm_element_value(schema_node, PCMK_XA_VERSION)); + pcmk__xe_get(schema_node, PCMK_XA_VERSION)); file_node = pcmk__xe_first_child(schema_node, NULL, NULL, NULL); while (file_node != NULL && rngs1[i] != NULL) { - assert_string_equal(rngs1[i], - crm_element_value(file_node, PCMK_XA_PATH)); + assert_string_equal(rngs1[i], pcmk__xe_get(file_node, PCMK_XA_PATH)); assert_int_equal(pcmk__xml_first_child(file_node)->type, XML_CDATA_SECTION_NODE); file_node = pcmk__xe_next(file_node, NULL); @@ -121,12 +120,11 @@ multiple_schemas(void **state) */ schema_node = pcmk__xe_first_child(parent, NULL, NULL, NULL); assert_string_equal("pacemaker-2.0", - crm_element_value(schema_node, PCMK_XA_VERSION)); + pcmk__xe_get(schema_node, PCMK_XA_VERSION)); file_node = pcmk__xe_first_child(schema_node, NULL, NULL, NULL); while (file_node != NULL && rngs2[i] != NULL) { - assert_string_equal(rngs2[i], - crm_element_value(file_node, PCMK_XA_PATH)); + assert_string_equal(rngs2[i], pcmk__xe_get(file_node, PCMK_XA_PATH)); assert_int_equal(pcmk__xml_first_child(file_node)->type, XML_CDATA_SECTION_NODE); file_node = pcmk__xe_next(file_node, NULL); @@ -135,14 +133,13 @@ multiple_schemas(void **state) schema_node = pcmk__xe_next(schema_node, NULL); assert_string_equal("pacemaker-2.1", - crm_element_value(schema_node, PCMK_XA_VERSION)); + pcmk__xe_get(schema_node, PCMK_XA_VERSION)); file_node = pcmk__xe_first_child(schema_node, NULL, NULL, NULL); i = 0; while (file_node != NULL && rngs3[i] != NULL) { - assert_string_equal(rngs3[i], - crm_element_value(file_node, PCMK_XA_PATH)); + assert_string_equal(rngs3[i], pcmk__xe_get(file_node, PCMK_XA_PATH)); assert_int_equal(pcmk__xml_first_child(file_node)->type, XML_CDATA_SECTION_NODE); file_node = pcmk__xe_next(file_node, NULL); diff --git a/lib/common/tests/schemas/pcmk__schema_init_test.c b/lib/common/tests/schemas/pcmk__schema_init_test.c index 19c20cc7dab..9750292cd63 100644 --- a/lib/common/tests/schemas/pcmk__schema_init_test.c +++ b/lib/common/tests/schemas/pcmk__schema_init_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the Pacemaker project contributors + * Copyright 2023-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -26,8 +26,8 @@ symlink_schema(const char *tmpdir, const char *target_file, const char *link_fil char *oldpath = NULL; char *newpath = NULL; - oldpath = crm_strdup_printf("%s/%s", PCMK__TEST_SCHEMA_DIR, target_file); - newpath = crm_strdup_printf("%s/%s", tmpdir, link_file); + oldpath = pcmk__assert_asprintf(PCMK__TEST_SCHEMA_DIR "/%s", target_file); + newpath = pcmk__assert_asprintf("%s/%s", tmpdir, link_file); rc = symlink(oldpath, newpath); @@ -57,7 +57,7 @@ setup(void **state) * to be anything special - we can just copy existing schemas but give * them new names. */ - dir = crm_strdup_printf("%s/test-schemas.XXXXXX", pcmk__get_tmpdir()); + dir = pcmk__assert_asprintf("%s/test-schemas.XXXXXX", pcmk__get_tmpdir()); remote_schema_dir = mkdtemp(dir); if (remote_schema_dir == NULL) { diff --git a/lib/common/tests/scores/pcmk__add_scores_test.c b/lib/common/tests/scores/pcmk__add_scores_test.c index 952cf978adb..830f8426bb5 100644 --- a/lib/common/tests/scores/pcmk__add_scores_test.c +++ b/lib/common/tests/scores/pcmk__add_scores_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,7 @@ #include +#include // PCMK_SCORE_INFINITY #include static void diff --git a/lib/common/tests/scores/pcmk_parse_score_test.c b/lib/common/tests/scores/pcmk_parse_score_test.c index 3861ef45992..a79a1f74450 100644 --- a/lib/common/tests/scores/pcmk_parse_score_test.c +++ b/lib/common/tests/scores/pcmk_parse_score_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -90,7 +90,7 @@ special_values(void **state) static void outside_limits(void **state) { - char *very_long = crm_strdup_printf(" %lld0", LLONG_MAX); + char *very_long = pcmk__assert_asprintf(" %lld0", LLONG_MAX); // Still within int range assert_score(B(PCMK_SCORE_INFINITY) "00", pcmk_rc_ok, PCMK_SCORE_INFINITY); diff --git a/lib/common/tests/scores/pcmk_readable_score_test.c b/lib/common/tests/scores/pcmk_readable_score_test.c index c3d66f6ab1f..8f6b939579e 100644 --- a/lib/common/tests/scores/pcmk_readable_score_test.c +++ b/lib/common/tests/scores/pcmk_readable_score_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,7 @@ #include +#include // pcmk_readable_score() #include static void diff --git a/lib/common/tests/scores/pcmk_str_is_infinity_test.c b/lib/common/tests/scores/pcmk_str_is_infinity_test.c index fff58ab170a..06ff1d3b2de 100644 --- a/lib/common/tests/scores/pcmk_str_is_infinity_test.c +++ b/lib/common/tests/scores/pcmk_str_is_infinity_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 the Pacemaker project contributors + * Copyright 2020-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,7 @@ #include +#include // pcmk_str_is_infinity() #include static void diff --git a/lib/common/tests/scores/pcmk_str_is_minus_infinity_test.c b/lib/common/tests/scores/pcmk_str_is_minus_infinity_test.c index 477b0550216..9223eb260b7 100644 --- a/lib/common/tests/scores/pcmk_str_is_minus_infinity_test.c +++ b/lib/common/tests/scores/pcmk_str_is_minus_infinity_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 the Pacemaker project contributors + * Copyright 2020-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,7 @@ #include +#include // pcmk_str_is_minus_infinity() #include static void diff --git a/lib/common/tests/strings/Makefile.am b/lib/common/tests/strings/Makefile.am index e61f41f51d2..6e945010748 100644 --- a/lib/common/tests/strings/Makefile.am +++ b/lib/common/tests/strings/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2020-2024 the Pacemaker project contributors +# Copyright 2020-2025 the Pacemaker project contributors # # The version control history for this file may have further details. # @@ -12,17 +12,16 @@ include $(top_srcdir)/mk/tap.mk include $(top_srcdir)/mk/unittest.mk # Add "_test" to the end of all test program names to simplify .gitignore. -check_PROGRAMS = crm_get_msec_test \ - crm_is_true_test \ - crm_str_to_boolean_test \ - pcmk__add_word_test \ +check_PROGRAMS = pcmk__add_word_test \ pcmk__btoa_test \ pcmk__compress_test \ pcmk__ends_with_test \ pcmk__g_strcat_test \ pcmk__guint_from_hash_test \ pcmk__numeric_strcasecmp_test \ + pcmk__parse_bool_test \ pcmk__parse_ll_range_test \ + pcmk__parse_ms_test \ pcmk__s_test \ pcmk__scan_double_test \ pcmk__scan_ll_test \ diff --git a/lib/common/tests/strings/crm_get_msec_test.c b/lib/common/tests/strings/crm_get_msec_test.c deleted file mode 100644 index 14b87cfaeca..00000000000 --- a/lib/common/tests/strings/crm_get_msec_test.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2021-2024 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include - -static void -bad_input(void **state) { - assert_int_equal(crm_get_msec(NULL), PCMK__PARSE_INT_DEFAULT); - assert_int_equal(crm_get_msec(" "), PCMK__PARSE_INT_DEFAULT); - assert_int_equal(crm_get_msec("abcxyz"), PCMK__PARSE_INT_DEFAULT); - assert_int_equal(crm_get_msec("100xs"), PCMK__PARSE_INT_DEFAULT); - assert_int_equal(crm_get_msec(" 100 xs "), PCMK__PARSE_INT_DEFAULT); - assert_int_equal(crm_get_msec("-100ms"), PCMK__PARSE_INT_DEFAULT); - - assert_int_equal(crm_get_msec("3.xs"), PCMK__PARSE_INT_DEFAULT); - assert_int_equal(crm_get_msec(" 3. xs "), PCMK__PARSE_INT_DEFAULT); - assert_int_equal(crm_get_msec("3.14xs"), PCMK__PARSE_INT_DEFAULT); - assert_int_equal(crm_get_msec(" 3.14 xs "), PCMK__PARSE_INT_DEFAULT); -} - -static void -good_input(void **state) { - assert_int_equal(crm_get_msec("100"), 100000); - assert_int_equal(crm_get_msec(" 100 "), 100000); - assert_int_equal(crm_get_msec("\t100\n"), 100000); - - assert_int_equal(crm_get_msec("100ms"), 100); - assert_int_equal(crm_get_msec(" 100 ms "), 100); - assert_int_equal(crm_get_msec("100 MSEC"), 100); - assert_int_equal(crm_get_msec("1000US"), 1); - assert_int_equal(crm_get_msec("1000usec"), 1); - assert_int_equal(crm_get_msec("12s"), 12000); - assert_int_equal(crm_get_msec("12 sec"), 12000); - assert_int_equal(crm_get_msec("1m"), 60000); - assert_int_equal(crm_get_msec("13 min"), 780000); - assert_int_equal(crm_get_msec("2\th"), 7200000); - assert_int_equal(crm_get_msec("1 hr"), 3600000); - - assert_int_equal(crm_get_msec("3."), 3000); - assert_int_equal(crm_get_msec(" 3. ms "), 3); - assert_int_equal(crm_get_msec("3.14"), 3000); - assert_int_equal(crm_get_msec(" 3.14 ms "), 3); - - // Questionable - assert_int_equal(crm_get_msec("3.14."), 3000); - assert_int_equal(crm_get_msec(" 3.14. ms "), 3); - assert_int_equal(crm_get_msec("3.14.159"), 3000); - assert_int_equal(crm_get_msec(" 3.14.159 "), 3000); - assert_int_equal(crm_get_msec("3.14.159ms"), 3); - assert_int_equal(crm_get_msec(" 3.14.159 ms "), 3); - - // Questionable - assert_int_equal(crm_get_msec(" 100 mshr "), 100); - assert_int_equal(crm_get_msec(" 100 ms hr "), 100); - assert_int_equal(crm_get_msec(" 100 sasdf "), 100000); - assert_int_equal(crm_get_msec(" 100 s asdf "), 100000); - assert_int_equal(crm_get_msec(" 3.14 shour "), 3000); - assert_int_equal(crm_get_msec(" 3.14 s hour "), 3000); - assert_int_equal(crm_get_msec(" 3.14 ms!@#$ "), 3); -} - -static void -overflow(void **state) { - assert_int_equal(crm_get_msec("9223372036854775807s"), LLONG_MAX); -} - -PCMK__UNIT_TEST(NULL, NULL, - cmocka_unit_test(bad_input), - cmocka_unit_test(good_input), - cmocka_unit_test(overflow)) diff --git a/lib/common/tests/strings/crm_is_true_test.c b/lib/common/tests/strings/crm_is_true_test.c deleted file mode 100644 index 74baa7f0e8b..00000000000 --- a/lib/common/tests/strings/crm_is_true_test.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2021-2024 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include - -static void -bad_input(void **state) { - assert_false(crm_is_true(NULL)); -} - -static void -is_true(void **state) { - assert_true(crm_is_true("true")); - assert_true(crm_is_true("TrUe")); - assert_true(crm_is_true("on")); - assert_true(crm_is_true("ON")); - assert_true(crm_is_true("yes")); - assert_true(crm_is_true("yES")); - assert_true(crm_is_true("y")); - assert_true(crm_is_true("Y")); - assert_true(crm_is_true("1")); -} - -static void -is_false(void **state) { - assert_false(crm_is_true("false")); - assert_false(crm_is_true("fAlSe")); - assert_false(crm_is_true(PCMK_VALUE_OFF)); - assert_false(crm_is_true("OFF")); - assert_false(crm_is_true("no")); - assert_false(crm_is_true("No")); - assert_false(crm_is_true("n")); - assert_false(crm_is_true("N")); - assert_false(crm_is_true("0")); - - assert_false(crm_is_true("")); - assert_false(crm_is_true("blahblah")); - - assert_false(crm_is_true("truedat")); - assert_false(crm_is_true("onnn")); - assert_false(crm_is_true("yep")); - assert_false(crm_is_true("Y!")); - assert_false(crm_is_true("100")); -} - -PCMK__UNIT_TEST(NULL, NULL, - cmocka_unit_test(bad_input), - cmocka_unit_test(is_true), - cmocka_unit_test(is_false)) diff --git a/lib/common/tests/strings/crm_str_to_boolean_test.c b/lib/common/tests/strings/crm_str_to_boolean_test.c deleted file mode 100644 index c0e31769968..00000000000 --- a/lib/common/tests/strings/crm_str_to_boolean_test.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2021-2024 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include - -static void -bad_input(void **state) { - assert_int_equal(crm_str_to_boolean(NULL, NULL), -1); - assert_int_equal(crm_str_to_boolean("", NULL), -1); - assert_int_equal(crm_str_to_boolean("blahblah", NULL), -1); -} - -static void -is_true(void **state) { - int ret; - - assert_int_equal(crm_str_to_boolean("true", &ret), 1); - assert_true(ret); - assert_int_equal(crm_str_to_boolean("TrUe", &ret), 1); - assert_true(ret); - assert_int_equal(crm_str_to_boolean("on", &ret), 1); - assert_true(ret); - assert_int_equal(crm_str_to_boolean("ON", &ret), 1); - assert_true(ret); - assert_int_equal(crm_str_to_boolean("yes", &ret), 1); - assert_true(ret); - assert_int_equal(crm_str_to_boolean("yES", &ret), 1); - assert_true(ret); - assert_int_equal(crm_str_to_boolean("y", &ret), 1); - assert_true(ret); - assert_int_equal(crm_str_to_boolean("Y", &ret), 1); - assert_true(ret); - assert_int_equal(crm_str_to_boolean("1", &ret), 1); - assert_true(ret); - - // Ensure it still validates the string with a NULL result argument - assert_int_equal(crm_str_to_boolean("true", NULL), 1); - assert_int_equal(crm_str_to_boolean("on", NULL), 1); - assert_int_equal(crm_str_to_boolean("yes", NULL), 1); - assert_int_equal(crm_str_to_boolean("y", NULL), 1); - assert_int_equal(crm_str_to_boolean("1", NULL), 1); -} - -static void -is_not_true(void **state) { - assert_int_equal(crm_str_to_boolean("truedat", NULL), -1); - assert_int_equal(crm_str_to_boolean("onnn", NULL), -1); - assert_int_equal(crm_str_to_boolean("yep", NULL), -1); - assert_int_equal(crm_str_to_boolean("Y!", NULL), -1); - assert_int_equal(crm_str_to_boolean("100", NULL), -1); -} - -static void -is_false(void **state) { - int ret; - - assert_int_equal(crm_str_to_boolean("false", &ret), 1); - assert_false(ret); - assert_int_equal(crm_str_to_boolean("fAlSe", &ret), 1); - assert_false(ret); - assert_int_equal(crm_str_to_boolean(PCMK_VALUE_OFF, &ret), 1); - assert_false(ret); - assert_int_equal(crm_str_to_boolean("OFF", &ret), 1); - assert_false(ret); - assert_int_equal(crm_str_to_boolean("no", &ret), 1); - assert_false(ret); - assert_int_equal(crm_str_to_boolean("No", &ret), 1); - assert_false(ret); - assert_int_equal(crm_str_to_boolean("n", &ret), 1); - assert_false(ret); - assert_int_equal(crm_str_to_boolean("N", &ret), 1); - assert_false(ret); - assert_int_equal(crm_str_to_boolean("0", &ret), 1); - assert_false(ret); - - // Ensure it still validates the string with a NULL result argument - assert_int_equal(crm_str_to_boolean("false", NULL), 1); - assert_int_equal(crm_str_to_boolean(PCMK_VALUE_OFF, NULL), 1); - assert_int_equal(crm_str_to_boolean("no", NULL), 1); - assert_int_equal(crm_str_to_boolean("n", NULL), 1); - assert_int_equal(crm_str_to_boolean("0", NULL), 1); -} - -static void -is_not_false(void **state) { - assert_int_equal(crm_str_to_boolean("falseee", NULL), -1); - assert_int_equal(crm_str_to_boolean("of", NULL), -1); - assert_int_equal(crm_str_to_boolean("nope", NULL), -1); - assert_int_equal(crm_str_to_boolean("N!", NULL), -1); - assert_int_equal(crm_str_to_boolean("000", NULL), -1); -} - -PCMK__UNIT_TEST(NULL, NULL, - cmocka_unit_test(bad_input), - cmocka_unit_test(is_true), - cmocka_unit_test(is_not_true), - cmocka_unit_test(is_false), - cmocka_unit_test(is_not_false)) diff --git a/lib/common/tests/strings/pcmk__parse_bool_test.c b/lib/common/tests/strings/pcmk__parse_bool_test.c new file mode 100644 index 00000000000..ad431701b03 --- /dev/null +++ b/lib/common/tests/strings/pcmk__parse_bool_test.c @@ -0,0 +1,120 @@ +/* + * Copyright 2021-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU General Public License version 2 + * or later (GPLv2+) WITHOUT ANY WARRANTY. + */ + +#include + +#include + +/*! + * \internal + * \brief Check a call with given input against expected return value and result + * + * \param[in] input Input string + * \param[in] expected_rc Expected return code + * \param[in] expected_result Expected parsed value (ignored unless + * \p expected_rc is \c pcmk_rc_ok) + */ +static void +assert_parse_bool(const char *input, int expected_rc, bool expected_result) +{ + bool result = false; + + // Ensure we still validate the string with a NULL result argument + assert_int_equal(pcmk__parse_bool(input, NULL), expected_rc); + + if (expected_rc != pcmk_rc_ok) { + // Make sure the value of result does not change on failure + expected_result = result; + } + + assert_int_equal(pcmk__parse_bool(input, &result), expected_rc); + if (expected_result) { + assert_true(result); + } else { + assert_false(result); + } + + // Repeat with result initially set to true + result = true; + if (expected_rc != pcmk_rc_ok) { + expected_result = result; + } + + assert_int_equal(pcmk__parse_bool(input, &result), expected_rc); + if (expected_result) { + assert_true(result); + } else { + assert_false(result); + } +} + +static void +bad_input(void **state) +{ + // Dumps core via CRM_CHECK() + assert_parse_bool(NULL, EINVAL, false); + + assert_parse_bool("", pcmk_rc_bad_input, false); + assert_parse_bool("blahblah", pcmk_rc_bad_input, false); +} + +static void +is_true(void **state) +{ + assert_parse_bool("true", pcmk_rc_ok, true); + assert_parse_bool("TrUe", pcmk_rc_ok, true); + assert_parse_bool("on", pcmk_rc_ok, true); + assert_parse_bool("ON", pcmk_rc_ok, true); + assert_parse_bool("yes", pcmk_rc_ok, true); + assert_parse_bool("yES", pcmk_rc_ok, true); + assert_parse_bool("y", pcmk_rc_ok, true); + assert_parse_bool("Y", pcmk_rc_ok, true); + assert_parse_bool("1", pcmk_rc_ok, true); +} + +static void +is_not_true(void **state) +{ + assert_parse_bool("truedat", pcmk_rc_bad_input, false); + assert_parse_bool("onnn", pcmk_rc_bad_input, false); + assert_parse_bool("yep", pcmk_rc_bad_input, false); + assert_parse_bool("Y!", pcmk_rc_bad_input, false); + assert_parse_bool("100", pcmk_rc_bad_input, false); +} + +static void +is_false(void **state) +{ + assert_parse_bool("false", pcmk_rc_ok, false); + assert_parse_bool("fAlSe", pcmk_rc_ok, false); + assert_parse_bool("off", pcmk_rc_ok, false); + assert_parse_bool("OFF", pcmk_rc_ok, false); + assert_parse_bool("no", pcmk_rc_ok, false); + assert_parse_bool("No", pcmk_rc_ok, false); + assert_parse_bool("n", pcmk_rc_ok, false); + assert_parse_bool("N", pcmk_rc_ok, false); + assert_parse_bool("0", pcmk_rc_ok, false); +} + +static void +is_not_false(void **state) +{ + assert_parse_bool("falseee", pcmk_rc_bad_input, false); + assert_parse_bool("of", pcmk_rc_bad_input, false); + assert_parse_bool("nope", pcmk_rc_bad_input, false); + assert_parse_bool("N!", pcmk_rc_bad_input, false); + assert_parse_bool("000", pcmk_rc_bad_input, false); +} + +PCMK__UNIT_TEST(NULL, NULL, + cmocka_unit_test(bad_input), + cmocka_unit_test(is_true), + cmocka_unit_test(is_not_true), + cmocka_unit_test(is_false), + cmocka_unit_test(is_not_false)) diff --git a/lib/common/tests/strings/pcmk__parse_ms_test.c b/lib/common/tests/strings/pcmk__parse_ms_test.c new file mode 100644 index 00000000000..00cc67b6907 --- /dev/null +++ b/lib/common/tests/strings/pcmk__parse_ms_test.c @@ -0,0 +1,111 @@ +/* + * Copyright 2021-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU General Public License version 2 + * or later (GPLv2+) WITHOUT ANY WARRANTY. + */ + +#include + +#include + +//! Magic initial value to test whether a "result" output variable has changed +static const long long magic = -12345678; + +static void +assert_parse_ms(const char *input, int expected_rc, long long expected_result) +{ + long long result = magic; + + assert_int_equal(pcmk__parse_ms(input, &result), expected_rc); + assert_in_range(result, expected_result, expected_result); +} + +static void +null_output(void **state) +{ + // These dump core with CRM_CHECK() + assert_int_equal(pcmk__parse_ms(NULL, NULL), EINVAL); + assert_int_equal(pcmk__parse_ms("1", NULL), EINVAL); +} + +static void +bad_input(void **state) +{ + assert_parse_ms(NULL, EINVAL, magic); + assert_parse_ms(" ", pcmk_rc_bad_input, magic); + assert_parse_ms("abcxyz", pcmk_rc_bad_input, magic); + assert_parse_ms("100xs", pcmk_rc_bad_input, magic); + assert_parse_ms(" 100 xs ", pcmk_rc_bad_input, magic); + + assert_parse_ms("3.xs", pcmk_rc_bad_input, magic); + assert_parse_ms(" 3. xs ", pcmk_rc_bad_input, magic); + assert_parse_ms("3.14xs", pcmk_rc_bad_input, magic); + assert_parse_ms(" 3.14 xs ", pcmk_rc_bad_input, magic); +} + +static void +good_input(void **state) +{ + assert_parse_ms("100", pcmk_rc_ok, 100000); + assert_parse_ms(" 100 ", pcmk_rc_ok, 100000); + assert_parse_ms("\t100\n", pcmk_rc_ok, 100000); + + assert_parse_ms("100ms", pcmk_rc_ok, 100); + assert_parse_ms(" 100 ms ", pcmk_rc_ok, 100); + assert_parse_ms("100 MSEC", pcmk_rc_ok, 100); + assert_parse_ms("-100ms", pcmk_rc_ok, -100); + assert_parse_ms("1000US", pcmk_rc_ok, 1); + assert_parse_ms("1000usec", pcmk_rc_ok, 1); + assert_parse_ms("12s", pcmk_rc_ok, 12000); + assert_parse_ms("12 sec", pcmk_rc_ok, 12000); + assert_parse_ms("1m", pcmk_rc_ok, 60000); + assert_parse_ms("13 min", pcmk_rc_ok, 780000); + assert_parse_ms("2\th", pcmk_rc_ok, 7200000); + assert_parse_ms("1 hr", pcmk_rc_ok, 3600000); + + assert_parse_ms("3.", pcmk_rc_ok, 3000); + assert_parse_ms(" 3. ms ", pcmk_rc_ok, 3); + assert_parse_ms("3.14", pcmk_rc_ok, 3000); + assert_parse_ms(" 3.14 ms ", pcmk_rc_ok, 3); + + // Questionable + assert_parse_ms("3.14.", pcmk_rc_ok, 3000); + assert_parse_ms(" 3.14. ms ", pcmk_rc_ok, 3); + assert_parse_ms("3.14.159", pcmk_rc_ok, 3000); + assert_parse_ms(" 3.14.159 ", pcmk_rc_ok, 3000); + assert_parse_ms("3.14.159ms", pcmk_rc_ok, 3); + assert_parse_ms(" 3.14.159 ms ", pcmk_rc_ok, 3); + + // Questionable + assert_parse_ms(" 100 mshr ", pcmk_rc_ok, 100); + assert_parse_ms(" 100 ms hr ", pcmk_rc_ok, 100); + assert_parse_ms(" 100 sasdf ", pcmk_rc_ok, 100000); + assert_parse_ms(" 100 s asdf ", pcmk_rc_ok, 100000); + assert_parse_ms(" 3.14 shour ", pcmk_rc_ok, 3000); + assert_parse_ms(" 3.14 s hour ", pcmk_rc_ok, 3000); + assert_parse_ms(" 3.14 ms!@#$ ", pcmk_rc_ok, 3); +} + +static void +overflow(void **state) +{ + char *input = NULL; + + input = pcmk__assert_asprintf("%llu", (unsigned long long) LLONG_MAX + 1); + assert_parse_ms(input, ERANGE, LLONG_MAX); + free(input); + + // Hopefully we can rely on two's complement integers + input = pcmk__assert_asprintf("-%llu", (unsigned long long) LLONG_MIN + 1); + assert_parse_ms(input, ERANGE, LLONG_MIN); + free(input); +} + +PCMK__UNIT_TEST(NULL, NULL, + cmocka_unit_test(null_output), + cmocka_unit_test(bad_input), + cmocka_unit_test(good_input), + cmocka_unit_test(overflow)) diff --git a/lib/common/tests/strings/pcmk__scan_ll_test.c b/lib/common/tests/strings/pcmk__scan_ll_test.c index e5f284d6768..b70a92427e1 100644 --- a/lib/common/tests/strings/pcmk__scan_ll_test.c +++ b/lib/common/tests/strings/pcmk__scan_ll_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the Pacemaker project contributors + * Copyright 2023-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -53,7 +53,7 @@ static void out_of_range(void **state) { long long result = 0LL; - char *very_long = crm_strdup_printf(" %lld0", LLONG_MAX); + char *very_long = pcmk__assert_asprintf(" %lld0", LLONG_MAX); assert_int_equal(pcmk__scan_ll(very_long, &result, 47), ERANGE); assert_true(result == LLONG_MAX); diff --git a/lib/common/tests/utils/Makefile.am b/lib/common/tests/utils/Makefile.am index 988fda9014a..682ca21babe 100644 --- a/lib/common/tests/utils/Makefile.am +++ b/lib/common/tests/utils/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2020-2024 the Pacemaker project contributors +# Copyright 2020-2025 the Pacemaker project contributors # # The version control history for this file may have further details. # @@ -12,13 +12,13 @@ include $(top_srcdir)/mk/tap.mk include $(top_srcdir)/mk/unittest.mk # Add "_test" to the end of all test program names to simplify .gitignore. -check_PROGRAMS = compare_version_test \ - crm_user_lookup_test \ - pcmk_daemon_user_test \ +check_PROGRAMS = pcmk__compare_versions_test \ + pcmk__daemon_user_test \ pcmk__fail_attr_name_test \ pcmk__failcount_name_test \ pcmk__getpid_s_test \ pcmk__lastfailure_name_test \ + pcmk__lookup_user_test \ pcmk__realloc_test \ pcmk__timeout_ms2s_test diff --git a/lib/common/tests/utils/compare_version_test.c b/lib/common/tests/utils/compare_version_test.c deleted file mode 100644 index d191f4abbb8..00000000000 --- a/lib/common/tests/utils/compare_version_test.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2022-2023 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include - -static void -empty_params(void **state) -{ - assert_int_equal(compare_version(NULL, NULL), 0); - assert_int_equal(compare_version(NULL, "abc"), -1); - assert_int_equal(compare_version(NULL, "1.0.1"), -1); - assert_int_equal(compare_version("abc", NULL), 1); - assert_int_equal(compare_version("1.0.1", NULL), 1); -} - -static void -equal_versions(void **state) -{ - assert_int_equal(compare_version("0.4.7", "0.4.7"), 0); - assert_int_equal(compare_version("1.0", "1.0"), 0); -} - -static void -unequal_versions(void **state) -{ - assert_int_equal(compare_version("0.4.7", "0.4.8"), -1); - assert_int_equal(compare_version("0.4.8", "0.4.7"), 1); - - assert_int_equal(compare_version("0.2.3", "0.3"), -1); - assert_int_equal(compare_version("0.3", "0.2.3"), 1); - - assert_int_equal(compare_version("0.99", "1.0"), -1); - assert_int_equal(compare_version("1.0", "0.99"), 1); -} - -static void -shorter_versions(void **state) -{ - assert_int_equal(compare_version("1.0", "1.0.1"), -1); - assert_int_equal(compare_version("1.0.1", "1.0"), 1); - assert_int_equal(compare_version("1.0", "1"), 0); - assert_int_equal(compare_version("1", "1.2"), -1); - assert_int_equal(compare_version("1.2", "1"), 1); -} - -PCMK__UNIT_TEST(NULL, NULL, - cmocka_unit_test(empty_params), - cmocka_unit_test(equal_versions), - cmocka_unit_test(unequal_versions), - cmocka_unit_test(shorter_versions)) diff --git a/lib/common/tests/utils/crm_user_lookup_test.c b/lib/common/tests/utils/crm_user_lookup_test.c deleted file mode 100644 index 5842ec5027b..00000000000 --- a/lib/common/tests/utils/crm_user_lookup_test.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2022 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include - -#include "crmcommon_private.h" -#include "mock_private.h" - -#include -#include - -static void -calloc_fails(void **state) -{ - uid_t uid; - gid_t gid; - - pcmk__mock_calloc = true; // calloc() will return NULL - - expect_value(__wrap_calloc, nmemb, 1); - expect_value(__wrap_calloc, size, PCMK__PW_BUFFER_LEN); - assert_int_equal(crm_user_lookup("hauser", &uid, &gid), -ENOMEM); - - pcmk__mock_calloc = false; // Use real calloc() -} - -static void -getpwnam_r_fails(void **state) -{ - uid_t uid; - gid_t gid; - - // Set getpwnam_r() return value and result parameter - pcmk__mock_getpwnam_r = true; - - expect_string(__wrap_getpwnam_r, name, "hauser"); - expect_any(__wrap_getpwnam_r, pwd); - expect_any(__wrap_getpwnam_r, buf); - expect_value(__wrap_getpwnam_r, buflen, PCMK__PW_BUFFER_LEN); - expect_any(__wrap_getpwnam_r, result); - will_return(__wrap_getpwnam_r, EIO); - will_return(__wrap_getpwnam_r, NULL); - - assert_int_equal(crm_user_lookup("hauser", &uid, &gid), -EIO); - - pcmk__mock_getpwnam_r = false; -} - -static void -no_matching_pwent(void **state) -{ - uid_t uid; - gid_t gid; - - // Set getpwnam_r() return value and result parameter - pcmk__mock_getpwnam_r = true; - - expect_string(__wrap_getpwnam_r, name, "hauser"); - expect_any(__wrap_getpwnam_r, pwd); - expect_any(__wrap_getpwnam_r, buf); - expect_value(__wrap_getpwnam_r, buflen, PCMK__PW_BUFFER_LEN); - expect_any(__wrap_getpwnam_r, result); - will_return(__wrap_getpwnam_r, 0); - will_return(__wrap_getpwnam_r, NULL); - - assert_int_equal(crm_user_lookup("hauser", &uid, &gid), -EINVAL); - - pcmk__mock_getpwnam_r = false; -} - -static void -entry_found(void **state) -{ - uid_t uid; - gid_t gid; - - /* We don't care about any of the other fields of the password entry, so just - * leave them blank. - */ - struct passwd returned_ent = { .pw_uid = 1000, .pw_gid = 1000 }; - - /* Test getpwnam_r returning a valid passwd entry, but we don't pass uid or gid. */ - - // Set getpwnam_r() return value and result parameter - pcmk__mock_getpwnam_r = true; - - expect_string(__wrap_getpwnam_r, name, "hauser"); - expect_any(__wrap_getpwnam_r, pwd); - expect_any(__wrap_getpwnam_r, buf); - expect_value(__wrap_getpwnam_r, buflen, PCMK__PW_BUFFER_LEN); - expect_any(__wrap_getpwnam_r, result); - will_return(__wrap_getpwnam_r, 0); - will_return(__wrap_getpwnam_r, &returned_ent); - - assert_int_equal(crm_user_lookup("hauser", NULL, NULL), 0); - - /* Test getpwnam_r returning a valid passwd entry, and we do pass uid and gid. */ - - // Set getpwnam_r() return value and result parameter - expect_string(__wrap_getpwnam_r, name, "hauser"); - expect_any(__wrap_getpwnam_r, pwd); - expect_any(__wrap_getpwnam_r, buf); - expect_value(__wrap_getpwnam_r, buflen, PCMK__PW_BUFFER_LEN); - expect_any(__wrap_getpwnam_r, result); - will_return(__wrap_getpwnam_r, 0); - will_return(__wrap_getpwnam_r, &returned_ent); - - assert_int_equal(crm_user_lookup("hauser", &uid, &gid), 0); - assert_int_equal(uid, 1000); - assert_int_equal(gid, 1000); - - pcmk__mock_getpwnam_r = false; -} - -PCMK__UNIT_TEST(NULL, NULL, - cmocka_unit_test(calloc_fails), - cmocka_unit_test(getpwnam_r_fails), - cmocka_unit_test(no_matching_pwent), - cmocka_unit_test(entry_found)) diff --git a/lib/common/tests/utils/pcmk__compare_versions_test.c b/lib/common/tests/utils/pcmk__compare_versions_test.c new file mode 100644 index 00000000000..4ea0fe26655 --- /dev/null +++ b/lib/common/tests/utils/pcmk__compare_versions_test.c @@ -0,0 +1,318 @@ +/* + * Copyright 2022-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU General Public License version 2 + * or later (GPLv2+) WITHOUT ANY WARRANTY. + */ + +#include + +#include + +/*! + * \internal + * \brief Compare two version strings in both directions + * + * \param[in] v1 First argument for \c pcmk__compare_versions() + * \param[in] v2 Second argument for \c pcmk__compare_versions() + * \param[in] expected_rc Expected return code from + * pcmk__compare_versions(v1, v2) + */ +static void +assert_compare_version(const char *v1, const char *v2, int expected_rc) +{ + assert_int_equal(pcmk__compare_versions(v1, v2), expected_rc); + + if (v1 != v2) { + /* Try reverse order even if expected_rc == 0, if v1 and v2 are + * different strings + */ + assert_int_equal(pcmk__compare_versions(v2, v1), -expected_rc); + } +} + +static void +empty_params(void **state) +{ + assert_compare_version(NULL, NULL, 0); + assert_compare_version(NULL, "", 0); + assert_compare_version("", "", 0); + + assert_compare_version(NULL, "1.0.1", -1); + assert_compare_version("", "1.0.1", -1); + + // NULL or empty is treated as equal to an invalid version + assert_compare_version(NULL, "abc", 0); + assert_compare_version("", "abc", 0); +} + +static void +equal_versions(void **state) +{ + assert_compare_version("0.4.7", "0.4.7", 0); + assert_compare_version("1.0", "1.0", 0); +} + +static void +unequal_versions(void **state) +{ + assert_compare_version("0.4.7", "0.4.8", -1); + assert_compare_version("0.2.3", "0.3", -1); + assert_compare_version("0.99", "1.0", -1); +} + +static void +shorter_versions(void **state) +{ + assert_compare_version("1.0", "1.0.1", -1); + assert_compare_version("1.0", "1", 0); + assert_compare_version("1", "1.2", -1); + assert_compare_version("1.0.0", "1.0", 0); + assert_compare_version("1.0.0", "1.2", -1); + assert_compare_version("0.99", "1", -1); +} + +static void +leading_zeros(void **state) +{ + // Equal to self + assert_compare_version("00001.0", "00001.0", 0); + + // Leading zeros in each segment are ignored + assert_compare_version("0001.0", "1", 0); + assert_compare_version("0.0001", "0.1", 0); + assert_compare_version("0001.1", "1.0001", 0); +} + +static void +negative_sign(void **state) +{ + // Equal to self + assert_compare_version("-1", "-1", 0); + assert_compare_version("1.-1.5", "1.-1.5", 0); + + // Negative version is treated as 0 (invalid) + assert_compare_version("-1", "0", 0); + assert_compare_version("-1", "0.0", 0); + assert_compare_version("-1", "0.1", -1); + assert_compare_version("-1", "1.0", -1); + + assert_compare_version("-1", "-0", 0); + assert_compare_version("-1", "-0.0", 0); + assert_compare_version("-1", "-0.1", 0); + assert_compare_version("-1", "-1.0", 0); + assert_compare_version("-1", "-2.0", 0); + + // Negative sign inside version is treated as garbage + assert_compare_version("1.-1.5", "1.0", 0); + assert_compare_version("1.-1.5", "1.0.5", -1); + + assert_compare_version("1.-1.5", "1.-0", 0); + assert_compare_version("1.-1.5", "1.-0.5", 0); + + assert_compare_version("1.-1.5", "1.-1", 0); + assert_compare_version("1.-1.5", "1.-1.9", 0); + + assert_compare_version("1.-1.5", "1.-2", 0); + assert_compare_version("1.-1.5", "1.-2.5", 0); + + assert_compare_version("1.-1.5", "2.0.5", -1); + assert_compare_version("1.-1.5", "0.0.5", 1); +} + +static void +positive_sign(void **state) +{ + // Equal to self + assert_compare_version("+1", "+1", 0); + assert_compare_version("1.+1.5", "1.+1.5", 0); + + // @FIXME Treat version with explicit positive sign as 0 (invalid) + assert_compare_version("+1", "0", 0); + assert_compare_version("+1", "0.0", 0); + assert_compare_version("+1", "0.1", -1); + assert_compare_version("+1", "1.0", -1); + assert_compare_version("+1", "2.0", -1); + + assert_compare_version("+1", "+0", 0); + assert_compare_version("+1", "+0.0", 0); + assert_compare_version("+1", "+0.1", 0); + assert_compare_version("+1", "+1.0", 0); + assert_compare_version("+1", "+2.0", 0); + + // @FIXME Treat positive sign inside version as garbage + assert_compare_version("1.+1.5", "1.0", 0); + assert_compare_version("1.+1.5", "1.0.5", -1); + + assert_compare_version("1.+1.5", "1.+0", 0); + assert_compare_version("1.+1.5", "1.+0.5", 0); + + assert_compare_version("1.+1.5", "1.+1", 0); + assert_compare_version("1.+1.5", "1.+1.9", 0); + + assert_compare_version("1.+1.5", "1.+2", 0); + assert_compare_version("1.+1.5", "1.+2.5", 0); + + assert_compare_version("1.+1.5", "2.0.5", -1); + assert_compare_version("1.+1.5", "0.0.5", 1); +} + +static void +hex_digits(void **state) +{ + // Equal to self + assert_compare_version("a", "a", 0); + + // Hex digits > 9 are garbage + assert_compare_version("a", "0", 0); + assert_compare_version("a111", "0", 0); + assert_compare_version("a", "1", -1); + assert_compare_version("a111", "1", -1); + + assert_compare_version("1a", "1", 0); + assert_compare_version("1a111", "1", 0); + assert_compare_version("1a", "2", -1); + assert_compare_version("1a111", "2", -1); + assert_compare_version("1a", "0", 1); + assert_compare_version("1a111", "0", 1); +} + +static void +bare_dot(void **state) +{ + // Equal to self + assert_compare_version(".", ".", 0); + + // Bare dot is treated as 0 + assert_compare_version(".", "0", 0); + assert_compare_version(".", "0.1", -1); + assert_compare_version(".", "1.0", -1); +} + +static void +leading_dot(void **state) +{ + // Equal to self + assert_compare_version(".0", ".0", 0); + assert_compare_version(".1", ".1", 0); + + // Version with leading dot is treated as 0 + assert_compare_version(".0", "0", 0); + assert_compare_version(".0", "0.0", 0); + assert_compare_version(".0", "0.0.0", 0); + assert_compare_version(".0", "0.1", -1); + + assert_compare_version(".1", "0", 0); + assert_compare_version(".1", "0.0", 0); + assert_compare_version(".1", "0.0.0", 0); + assert_compare_version(".1", "0.1", -1); + assert_compare_version(".1", "0.1.0", -1); +} + +static void +trailing_dot(void **state) +{ + // Equal to self + assert_compare_version("0.", "0.", 0); + assert_compare_version("0.1.", "0.1.", 0); + + // Trailing dot is ignored + assert_compare_version("0.", "0", 0); + assert_compare_version("0.", "0.0", 0); + assert_compare_version("0.", "0.1", -1); + assert_compare_version("0.1.", "0.1", 0); + assert_compare_version("0.1.", "0.1.0", 0); + assert_compare_version("0.1.", "0.2", -1); + assert_compare_version("0.1.", "0", 1); +} + +static void +leading_spaces(void **state) +{ + // Equal to self + assert_compare_version(" ", " ", 0); + assert_compare_version(" 1", " 1", 0); + + // Leading spaces are ignored + assert_compare_version(" 1", "1.0", 0); + assert_compare_version("1", " 1.0", 0); + assert_compare_version(" 1", " 1.0", 0); + assert_compare_version(" 1", "1.1", -1); + assert_compare_version("1", " 1.1", -1); + assert_compare_version(" 1", " 1.1", -1); +} + +static void +trailing_spaces(void **state) +{ + // Equal to self + assert_compare_version("1 ", "1 ", 0); + + // Trailing spaces are ignored + assert_compare_version("1 ", "1.0", 0); + assert_compare_version("1", "1.0 ", 0); + assert_compare_version("1 ", "1.0 ", 0); + assert_compare_version("1 ", "1.1", -1); + assert_compare_version("1", "1.1 ", -1); + assert_compare_version("1 ", "1.1 ", -1); +} + +static void +leading_garbage(void **state) +{ + // Equal to self + assert_compare_version("@1", "@1", 0); + + // Version with leading garbage is treated as 0 + assert_compare_version("@1", "0", 0); + assert_compare_version("@1", "1", -1); + + assert_compare_version("@0.1", "0", 0); + assert_compare_version("@0.1", "1", -1); +} + +static void +trailing_garbage(void **state) +{ + // Equal to self + assert_compare_version("0.1@", "0.1@", 0); + + // Trailing garbage is ignored + assert_compare_version("0.1@", "0.1", 0); + assert_compare_version("0.1.@", "0.1", 0); + assert_compare_version("0.1 @", "0.1", 0); + assert_compare_version("0.1. @", "0.1", 0); + assert_compare_version("0.1 .@", "0.1", 0); + + // This includes more numbers after spaces + assert_compare_version("0.1 1", "0.1", 0); + assert_compare_version("0.1. 1", "0.1", 0); + assert_compare_version("0.1 .1", "0.1", 0); + + // Second consecutive dot is treated as garbage + assert_compare_version("1..", "1", 0); + assert_compare_version("1..1", "1", 0); + assert_compare_version("1..", "1.0.0", 0); + assert_compare_version("1..1", "1.0.0", 0); + assert_compare_version("1..", "1.0.1", -1); + assert_compare_version("1..1", "1.0.1", -1); +} + +PCMK__UNIT_TEST(NULL, NULL, + cmocka_unit_test(empty_params), + cmocka_unit_test(equal_versions), + cmocka_unit_test(unequal_versions), + cmocka_unit_test(shorter_versions), + cmocka_unit_test(leading_zeros), + cmocka_unit_test(negative_sign), + cmocka_unit_test(positive_sign), + cmocka_unit_test(hex_digits), + cmocka_unit_test(bare_dot), + cmocka_unit_test(leading_dot), + cmocka_unit_test(trailing_dot), + cmocka_unit_test(leading_spaces), + cmocka_unit_test(trailing_spaces), + cmocka_unit_test(leading_garbage), + cmocka_unit_test(trailing_garbage)) diff --git a/lib/common/tests/utils/pcmk__daemon_user_test.c b/lib/common/tests/utils/pcmk__daemon_user_test.c new file mode 100644 index 00000000000..1cbd01315b7 --- /dev/null +++ b/lib/common/tests/utils/pcmk__daemon_user_test.c @@ -0,0 +1,81 @@ +/* + * Copyright 2022-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU General Public License version 2 + * or later (GPLv2+) WITHOUT ANY WARRANTY. + */ + +#include + +#include + +#include "crmcommon_private.h" +#include "mock_private.h" + +#include +#include + +static void +no_matching_pwent(void **state) +{ + uid_t uid = 0; + gid_t gid = 0; + + pcmk__mock_getpwnam = true; + + expect_string(__wrap_getpwnam, name, "hacluster"); + will_return(__wrap_getpwnam, 0); + will_return(__wrap_getpwnam, NULL); + + assert_int_equal(pcmk__daemon_user(&uid, &gid), ENOENT); + + pcmk__mock_getpwnam = false; +} + +static void +entry_found(void **state) +{ + uid_t uid = 0; + gid_t gid = 0; + + // We don't care about the other fields of the passwd entry + struct passwd returned_ent = { .pw_uid = 1000, .pw_gid = 1000 }; + + // Test getpwnam() returning a valid passwd entry with null output args + + pcmk__mock_getpwnam = true; + + expect_string(__wrap_getpwnam, name, "hacluster"); + will_return(__wrap_getpwnam, 0); + will_return(__wrap_getpwnam, &returned_ent); + + assert_int_equal(pcmk__daemon_user(NULL, NULL), pcmk_rc_ok); + + // Test getpwnam() returning a valid passwd entry with non-NULL outputs + + /* We don't need to call expect_*() or will_return() again because + * pcmk__daemon_user() will have cached the uid/gid from the previous call + * and won't make another call to getpwnam(). + */ + assert_int_equal(pcmk__daemon_user(&uid, NULL), pcmk_rc_ok); + assert_int_equal(uid, 1000); + assert_int_equal(gid, 0); + + uid = 0; + assert_int_equal(pcmk__daemon_user(NULL, &gid), pcmk_rc_ok); + assert_int_equal(uid, 0); + assert_int_equal(gid, 1000); + + gid = 0; + assert_int_equal(pcmk__daemon_user(&uid, &gid), pcmk_rc_ok); + assert_int_equal(uid, 1000); + assert_int_equal(gid, 1000); + + pcmk__mock_getpwnam = false; +} + +PCMK__UNIT_TEST(NULL, NULL, + cmocka_unit_test(no_matching_pwent), + cmocka_unit_test(entry_found)) diff --git a/lib/common/tests/utils/pcmk__lookup_user_test.c b/lib/common/tests/utils/pcmk__lookup_user_test.c new file mode 100644 index 00000000000..58fa6ae59d4 --- /dev/null +++ b/lib/common/tests/utils/pcmk__lookup_user_test.c @@ -0,0 +1,147 @@ +/* + * Copyright 2022-2025 the Pacemaker project contributors + * + * The version control history for this file may have further details. + * + * This source code is licensed under the GNU General Public License version 2 + * or later (GPLv2+) WITHOUT ANY WARRANTY. + */ + +#include + +#include + +#include "crmcommon_private.h" +#include "mock_private.h" + +#include +#include + +/*! + * \internal + * \brief Perform one test of \c pcmk__lookup_user() + * + * \param[in] name \c name argument for \c pcmk__lookup_user() + * \param[in] uid \c uid argument for \c pcmk__lookup_user() + * (unchanged upon return) + * \param[in] gid \c gid argument for \c pcmk__lookup_user() + * (unchanged upon return) + * \param[in] expected_rc Expected return code of \c pcmk__lookup_user() + * \param[in] expected_uid Expected value at \p *uid after + * \c pcmk__lookup_user() call + * \param[in] expected_gid Expected value at \p *gid after + * \c pcmk__lookup_user() call + */ +static void +assert_lookup_user(const char *name, uid_t *uid, gid_t *gid, int expected_rc, + uid_t expected_uid, gid_t expected_gid) +{ + uid_t uid_orig = ((uid != NULL)? *uid : 0); + gid_t gid_orig = ((gid != NULL)? *gid : 0); + + assert_int_equal(pcmk__lookup_user(name, uid, gid), expected_rc); + + if (uid != NULL) { + assert_int_equal(*uid, expected_uid); + *uid = uid_orig; + } + if (gid != NULL) { + assert_int_equal(*gid, expected_gid); + *gid = gid_orig; + } +} + +static void +null_name(void **state) +{ + uid_t uid = 0; + gid_t gid = 0; + + // These dump core via CRM_CHECK() + assert_lookup_user(NULL, NULL, NULL, EINVAL, 0, 0); + assert_lookup_user(NULL, NULL, &gid, EINVAL, 0, 0); + assert_lookup_user(NULL, &uid, NULL, EINVAL, 0, 0); + assert_lookup_user(NULL, &uid, &gid, EINVAL, 0, 0); +} + +static void +getpwnam_fails(void **state) +{ + uid_t uid = 0; + gid_t gid = 0; + + pcmk__mock_getpwnam = true; + + expect_string(__wrap_getpwnam, name, "hauser"); + will_return(__wrap_getpwnam, EIO); // errno + will_return(__wrap_getpwnam, NULL); // return value + assert_lookup_user("hauser", &uid, &gid, EIO, 0, 0); + + pcmk__mock_getpwnam = false; +} + +static void +no_matching_pwent(void **state) +{ + uid_t uid = 0; + gid_t gid = 0; + + pcmk__mock_getpwnam = true; + + /* errno may or may not be set when no matching passwd entry is found. + * However, if the return value is NULL and errno == 0, then we can be sure + * no entry was found. In other words, it's sufficient but not necessary. So + * this is our test case for "no matching entry," and we should return + * ENOENT. + */ + expect_string(__wrap_getpwnam, name, "hauser"); + will_return(__wrap_getpwnam, 0); // errno + will_return(__wrap_getpwnam, NULL); // return value + assert_lookup_user("hauser", &uid, &gid, ENOENT, 0, 0); + + pcmk__mock_getpwnam = false; +} + +static void +entry_found(void **state) +{ + uid_t uid = 0; + gid_t gid = 0; + + // We don't care about the other fields of the passwd entry + struct passwd returned_ent = { .pw_uid = 1000, .pw_gid = 1000 }; + + pcmk__mock_getpwnam = true; + + // NULL uid and NULL gid + expect_string(__wrap_getpwnam, name, "hauser"); + will_return(__wrap_getpwnam, 0); + will_return(__wrap_getpwnam, &returned_ent); + assert_lookup_user("hauser", NULL, NULL, pcmk_rc_ok, 0, 0); + + // Non-NULL uid and NULL gid + expect_string(__wrap_getpwnam, name, "hauser"); + will_return(__wrap_getpwnam, 0); + will_return(__wrap_getpwnam, &returned_ent); + assert_lookup_user("hauser", &uid, NULL, pcmk_rc_ok, 1000, 0); + + // NULL uid and non-NULL gid + expect_string(__wrap_getpwnam, name, "hauser"); + will_return(__wrap_getpwnam, 0); + will_return(__wrap_getpwnam, &returned_ent); + assert_lookup_user("hauser", NULL, &gid, pcmk_rc_ok, 0, 1000); + + // Non-NULL uid and non-NULL gid + expect_string(__wrap_getpwnam, name, "hauser"); + will_return(__wrap_getpwnam, 0); + will_return(__wrap_getpwnam, &returned_ent); + assert_lookup_user("hauser", &uid, &gid, pcmk_rc_ok, 1000, 1000); + + pcmk__mock_getpwnam = false; +} + +PCMK__UNIT_TEST(NULL, NULL, + cmocka_unit_test(null_name), + cmocka_unit_test(getpwnam_fails), + cmocka_unit_test(no_matching_pwent), + cmocka_unit_test(entry_found)) diff --git a/lib/common/tests/utils/pcmk_daemon_user_test.c b/lib/common/tests/utils/pcmk_daemon_user_test.c deleted file mode 100644 index a63ca737359..00000000000 --- a/lib/common/tests/utils/pcmk_daemon_user_test.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2022 the Pacemaker project contributors - * - * The version control history for this file may have further details. - * - * This source code is licensed under the GNU General Public License version 2 - * or later (GPLv2+) WITHOUT ANY WARRANTY. - */ - -#include - -#include - -#include "crmcommon_private.h" -#include "mock_private.h" - -#include -#include - -static void -no_matching_pwent(void **state) -{ - uid_t uid; - gid_t gid; - - // Set getpwnam_r() return value and result parameter - pcmk__mock_getpwnam_r = true; - - expect_string(__wrap_getpwnam_r, name, "hacluster"); - expect_any(__wrap_getpwnam_r, pwd); - expect_any(__wrap_getpwnam_r, buf); - expect_value(__wrap_getpwnam_r, buflen, PCMK__PW_BUFFER_LEN); - expect_any(__wrap_getpwnam_r, result); - will_return(__wrap_getpwnam_r, ENOENT); - will_return(__wrap_getpwnam_r, NULL); - - assert_int_equal(pcmk_daemon_user(&uid, &gid), -ENOENT); - - pcmk__mock_getpwnam_r = false; -} - -static void -entry_found(void **state) -{ - uid_t uid; - gid_t gid; - - /* We don't care about any of the other fields of the password entry, so just - * leave them blank. - */ - struct passwd returned_ent = { .pw_uid = 1000, .pw_gid = 1000 }; - - /* Test getpwnam_r returning a valid passwd entry, but we don't pass uid or gid. */ - - // Set getpwnam_r() return value and result parameter - pcmk__mock_getpwnam_r = true; - - expect_string(__wrap_getpwnam_r, name, "hacluster"); - expect_any(__wrap_getpwnam_r, pwd); - expect_any(__wrap_getpwnam_r, buf); - expect_value(__wrap_getpwnam_r, buflen, PCMK__PW_BUFFER_LEN); - expect_any(__wrap_getpwnam_r, result); - will_return(__wrap_getpwnam_r, 0); - will_return(__wrap_getpwnam_r, &returned_ent); - - assert_int_equal(pcmk_daemon_user(NULL, NULL), 0); - - /* Test getpwnam_r returning a valid passwd entry, and we do pass uid and gid. */ - - /* We don't need to call will_return() again because pcmk_daemon_user() - * will have cached the uid/gid from the previous call and won't make - * another call to getpwnam_r(). - */ - assert_int_equal(pcmk_daemon_user(&uid, &gid), 0); - assert_int_equal(uid, 1000); - assert_int_equal(gid, 1000); - - pcmk__mock_getpwnam_r = false; -} - -PCMK__UNIT_TEST(NULL, NULL, - cmocka_unit_test(no_matching_pwent), - cmocka_unit_test(entry_found)) diff --git a/lib/common/tests/xml/pcmk__xml_new_doc_test.c b/lib/common/tests/xml/pcmk__xml_new_doc_test.c index 762aec4007b..28b99b77e2b 100644 --- a/lib/common/tests/xml/pcmk__xml_new_doc_test.c +++ b/lib/common/tests/xml/pcmk__xml_new_doc_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -29,8 +29,7 @@ create_document_node(void **state) { docpriv = doc->_private; assert_non_null(docpriv); assert_int_equal(docpriv->check, PCMK__XML_DOC_PRIVATE_MAGIC); - assert_true(pcmk_all_flags_set(docpriv->flags, - pcmk__xf_dirty|pcmk__xf_created)); + assert_int_equal(docpriv->flags, pcmk__xf_none); pcmk__xml_free_doc(doc); } diff --git a/lib/common/tests/xml_comment/pcmk__xc_create_test.c b/lib/common/tests/xml_comment/pcmk__xc_create_test.c index 4e25adc130c..280c50ae420 100644 --- a/lib/common/tests/xml_comment/pcmk__xc_create_test.c +++ b/lib/common/tests/xml_comment/pcmk__xc_create_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -19,14 +19,14 @@ */ static void -assert_comment(xmlDoc *doc, const char *content) +assert_comment(const char *content) { + xmlDoc *doc = pcmk__xml_new_doc(); + xml_doc_private_t *docpriv = doc->_private; xmlNode *node = NULL; xml_node_private_t *nodepriv = NULL; - xml_doc_private_t *docpriv = doc->_private; - // Also clears existing doc flags - xml_track_changes((xmlNode *) doc, NULL, NULL, false); + pcmk__xml_doc_set_flags(doc, pcmk__xf_tracking); node = pcmk__xc_create(doc, content); assert_non_null(node); @@ -43,12 +43,13 @@ assert_comment(xmlDoc *doc, const char *content) nodepriv = node->_private; assert_non_null(nodepriv); assert_int_equal(nodepriv->check, PCMK__XML_NODE_PRIVATE_MAGIC); - assert_true(pcmk_all_flags_set(nodepriv->flags, - pcmk__xf_dirty|pcmk__xf_created)); + assert_true(pcmk__all_flags_set(nodepriv->flags, + pcmk__xf_dirty|pcmk__xf_created)); - assert_true(pcmk_is_set(docpriv->flags, pcmk__xf_dirty)); + assert_true(pcmk__is_set(docpriv->flags, pcmk__xf_dirty)); pcmk__xml_free(node); + pcmk__xml_free_doc(doc); } static void @@ -61,15 +62,8 @@ null_doc(void **state) static void with_doc(void **state) { - xmlDoc *doc = pcmk__xml_new_doc(); - - assert_non_null(doc); - assert_non_null(doc->_private); - - assert_comment(doc, NULL); - assert_comment(doc, "some content"); - - pcmk__xml_free_doc(doc); + assert_comment(NULL); + assert_comment("some content"); } PCMK__UNIT_TEST(pcmk__xml_test_setup_group, pcmk__xml_test_teardown_group, diff --git a/lib/common/tests/xml_element/pcmk__xe_copy_attrs_test.c b/lib/common/tests/xml_element/pcmk__xe_copy_attrs_test.c index a66098ed108..c8583fbe7af 100644 --- a/lib/common/tests/xml_element/pcmk__xe_copy_attrs_test.c +++ b/lib/common/tests/xml_element/pcmk__xe_copy_attrs_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -39,10 +39,10 @@ no_source_attrs(void **state) assert_ptr_equal(target->properties, NULL); // Ensure copying from empty source doesn't delete target attributes - crm_xml_add(target, "attr", "value"); + pcmk__xe_set(target, "attr", "value"); assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none), pcmk_rc_ok); - assert_string_equal(crm_element_value(target, "attr"), "value"); + assert_string_equal(pcmk__xe_get(target, "attr"), "value"); pcmk__xml_free(src); pcmk__xml_free(target); @@ -54,12 +54,12 @@ copy_one(void **state) xmlNode *src = pcmk__xe_create(NULL, "test"); xmlNode *target = pcmk__xe_create(NULL, "test"); - crm_xml_add(src, "attr", "value"); + pcmk__xe_set(src, "attr", "value"); assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none), pcmk_rc_ok); - assert_string_equal(crm_element_value(src, "attr"), - crm_element_value(target, "attr")); + assert_string_equal(pcmk__xe_get(src, "attr"), + pcmk__xe_get(target, "attr")); pcmk__xml_free(src); pcmk__xml_free(target); @@ -79,12 +79,12 @@ copy_multiple(void **state) assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none), pcmk_rc_ok); - assert_string_equal(crm_element_value(src, "attr1"), - crm_element_value(target, "attr1")); - assert_string_equal(crm_element_value(src, "attr2"), - crm_element_value(target, "attr2")); - assert_string_equal(crm_element_value(src, "attr3"), - crm_element_value(target, "attr3")); + assert_string_equal(pcmk__xe_get(src, "attr1"), + pcmk__xe_get(target, "attr1")); + assert_string_equal(pcmk__xe_get(src, "attr2"), + pcmk__xe_get(target, "attr2")); + assert_string_equal(pcmk__xe_get(src, "attr3"), + pcmk__xe_get(target, "attr3")); pcmk__xml_free(src); pcmk__xml_free(target); @@ -96,14 +96,14 @@ overwrite(void **state) xmlNode *src = pcmk__xe_create(NULL, "test"); xmlNode *target = pcmk__xe_create(NULL, "test"); - crm_xml_add(src, "attr", "src_value"); - crm_xml_add(target, "attr", "target_value"); + pcmk__xe_set(src, "attr", "src_value"); + pcmk__xe_set(target, "attr", "target_value"); // Overwrite enabled by default assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none), pcmk_rc_ok); - assert_string_equal(crm_element_value(src, "attr"), - crm_element_value(target, "attr")); + assert_string_equal(pcmk__xe_get(src, "attr"), + pcmk__xe_get(target, "attr")); pcmk__xml_free(src); pcmk__xml_free(target); } @@ -114,21 +114,21 @@ no_overwrite(void **state) xmlNode *src = pcmk__xe_create(NULL, "test"); xmlNode *target = pcmk__xe_create(NULL, "test"); - crm_xml_add(src, "attr", "src_value"); - crm_xml_add(target, "attr", "target_value"); + pcmk__xe_set(src, "attr", "src_value"); + pcmk__xe_set(target, "attr", "target_value"); assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_no_overwrite), pcmk_rc_ok); - assert_string_not_equal(crm_element_value(src, "attr"), - crm_element_value(target, "attr")); + assert_string_not_equal(pcmk__xe_get(src, "attr"), + pcmk__xe_get(target, "attr")); // no_overwrite doesn't prevent copy if there's no conflict pcmk__xe_remove_attr(target, "attr"); assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_no_overwrite), pcmk_rc_ok); - assert_string_equal(crm_element_value(src, "attr"), - crm_element_value(target, "attr")); + assert_string_equal(pcmk__xe_get(src, "attr"), + pcmk__xe_get(target, "attr")); pcmk__xml_free(src); pcmk__xml_free(target); @@ -140,15 +140,15 @@ score_update(void **state) xmlNode *src = pcmk__xe_create(NULL, "test"); xmlNode *target = pcmk__xe_create(NULL, "test"); - crm_xml_add(src, "plus_plus_attr", "plus_plus_attr++"); - crm_xml_add(src, "plus_two_attr", "plus_two_attr+=2"); - crm_xml_add(target, "plus_plus_attr", "1"); - crm_xml_add(target, "plus_two_attr", "1"); + pcmk__xe_set(src, "plus_plus_attr", "plus_plus_attr++"); + pcmk__xe_set(src, "plus_two_attr", "plus_two_attr+=2"); + pcmk__xe_set(target, "plus_plus_attr", "1"); + pcmk__xe_set(target, "plus_two_attr", "1"); assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_score_update), pcmk_rc_ok); - assert_string_equal(crm_element_value(target, "plus_plus_attr"), "2"); - assert_string_equal(crm_element_value(target, "plus_two_attr"), "3"); + assert_string_equal(pcmk__xe_get(target, "plus_plus_attr"), "2"); + assert_string_equal(pcmk__xe_get(target, "plus_two_attr"), "3"); pcmk__xml_free(src); pcmk__xml_free(target); @@ -160,17 +160,17 @@ no_score_update(void **state) xmlNode *src = pcmk__xe_create(NULL, "test"); xmlNode *target = pcmk__xe_create(NULL, "test"); - crm_xml_add(src, "plus_plus_attr", "plus_plus_attr++"); - crm_xml_add(src, "plus_two_attr", "plus_two_attr+=2"); - crm_xml_add(target, "plus_plus_attr", "1"); - crm_xml_add(target, "plus_two_attr", "1"); + pcmk__xe_set(src, "plus_plus_attr", "plus_plus_attr++"); + pcmk__xe_set(src, "plus_two_attr", "plus_two_attr+=2"); + pcmk__xe_set(target, "plus_plus_attr", "1"); + pcmk__xe_set(target, "plus_two_attr", "1"); // Score update disabled by default assert_int_equal(pcmk__xe_copy_attrs(target, src, pcmk__xaf_none), pcmk_rc_ok); - assert_string_equal(crm_element_value(target, "plus_plus_attr"), + assert_string_equal(pcmk__xe_get(target, "plus_plus_attr"), "plus_plus_attr++"); - assert_string_equal(crm_element_value(target, "plus_two_attr"), + assert_string_equal(pcmk__xe_get(target, "plus_two_attr"), "plus_two_attr+=2"); pcmk__xml_free(src); diff --git a/lib/common/tests/xml_element/pcmk__xe_first_child_test.c b/lib/common/tests/xml_element/pcmk__xe_first_child_test.c index 0cb1c703a67..41ea91b1177 100644 --- a/lib/common/tests/xml_element/pcmk__xe_first_child_test.c +++ b/lib/common/tests/xml_element/pcmk__xe_first_child_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -71,12 +71,12 @@ find_attrB(void **state) { /* Find the first node with attrB */ result = pcmk__xe_first_child(xml, NULL, "attrB", NULL); assert_non_null(result); - assert_string_equal(crm_element_value(result, PCMK_XA_ID), "3"); + assert_string_equal(pcmk__xe_get(result, PCMK_XA_ID), "3"); /* Find the first nodeB with attrB */ result = pcmk__xe_first_child(xml, "nodeB", "attrB", NULL); assert_non_null(result); - assert_string_equal(crm_element_value(result, PCMK_XA_ID), "5"); + assert_string_equal(pcmk__xe_get(result, PCMK_XA_ID), "5"); pcmk__xml_free(xml); } @@ -89,12 +89,12 @@ find_attrA_matching(void **state) { /* Find attrA=456 */ result = pcmk__xe_first_child(xml, NULL, "attrA", "456"); assert_non_null(result); - assert_string_equal(crm_element_value(result, PCMK_XA_ID), "2"); + assert_string_equal(pcmk__xe_get(result, PCMK_XA_ID), "2"); /* Find a nodeB with attrA=123 */ result = pcmk__xe_first_child(xml, "nodeB", "attrA", "123"); assert_non_null(result); - assert_string_equal(crm_element_value(result, PCMK_XA_ID), "4"); + assert_string_equal(pcmk__xe_get(result, PCMK_XA_ID), "4"); pcmk__xml_free(xml); } diff --git a/lib/common/tests/xml_element/pcmk__xe_get_score_test.c b/lib/common/tests/xml_element/pcmk__xe_get_score_test.c index 9fcd47fd42a..ef2acce9ae5 100644 --- a/lib/common/tests/xml_element/pcmk__xe_get_score_test.c +++ b/lib/common/tests/xml_element/pcmk__xe_get_score_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -27,7 +27,7 @@ assert_score(const char *score_s, int expected_rc, int expected_score) int rc = pcmk_rc_ok; xmlNode *xml = pcmk__xe_create(NULL, __func__); - crm_xml_add(xml, "test_attr", score_s); + pcmk__xe_set(xml, "test_attr", score_s); rc = pcmk__xe_get_score(xml, "test_attr", &score, default_score); assert_int_equal(rc, expected_rc); assert_int_equal(score, expected_score); @@ -73,11 +73,11 @@ null_score(void **state) assert_int_equal(pcmk__xe_get_score(xml, "test_attr", NULL, default_score), pcmk_rc_ok); - crm_xml_add(xml, "test_attr", "0"); + pcmk__xe_set(xml, "test_attr", "0"); assert_int_equal(pcmk__xe_get_score(xml, "test_attr", NULL, default_score), pcmk_rc_ok); - crm_xml_add(xml, "test_attr", "foo"); + pcmk__xe_set(xml, "test_attr", "foo"); assert_int_equal(pcmk__xe_get_score(xml, "test_attr", NULL, default_score), pcmk_rc_bad_input); @@ -119,7 +119,7 @@ special_values(void **state) static void outside_limits(void **state) { - char *very_long = crm_strdup_printf(" %lld0", LLONG_MAX); + char *very_long = pcmk__assert_asprintf(" %lld0", LLONG_MAX); // Still within int range assert_score(B(PCMK_SCORE_INFINITY) "00", pcmk_rc_ok, PCMK_SCORE_INFINITY); diff --git a/lib/common/tests/xml_element/pcmk__xe_set_score_test.c b/lib/common/tests/xml_element/pcmk__xe_set_score_test.c index 62a88939609..08b1a8d3c88 100644 --- a/lib/common/tests/xml_element/pcmk__xe_set_score_test.c +++ b/lib/common/tests/xml_element/pcmk__xe_set_score_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -33,9 +33,9 @@ assert_set_score(const char *initial, const char *new, const char *name = "X"; xmlNode *test_xml = pcmk__xe_create(NULL, "test_xml"); - crm_xml_add(test_xml, name, initial); + pcmk__xe_set(test_xml, name, initial); assert_int_equal(pcmk__xe_set_score(test_xml, name, new), reference_rc); - assert_string_equal(crm_element_value(test_xml, name), reference_val); + assert_string_equal(pcmk__xe_get(test_xml, name), reference_val); pcmk__xml_free(test_xml); } @@ -66,11 +66,11 @@ name_is_NULL(void **state) { xmlNode *test_xml = pcmk__xe_create(NULL, "test_xml"); - crm_xml_add(test_xml, "X", "5"); + pcmk__xe_set(test_xml, "X", "5"); // Dumps core via CRM_CHECK() assert_int_equal(pcmk__xe_set_score(test_xml, NULL, "X++"), EINVAL); - assert_string_equal(crm_element_value(test_xml, "X"), "5"); + assert_string_equal(pcmk__xe_get(test_xml, "X"), "5"); pcmk__xml_free(test_xml); } diff --git a/lib/common/tests/xml_element/pcmk__xe_sort_attrs_test.c b/lib/common/tests/xml_element/pcmk__xe_sort_attrs_test.c index b5265b1d494..e7aad245639 100644 --- a/lib/common/tests/xml_element/pcmk__xe_sort_attrs_test.c +++ b/lib/common/tests/xml_element/pcmk__xe_sort_attrs_test.c @@ -102,7 +102,7 @@ nothing_to_sort(void **state) pcmk__xml_free(reference_xml); // Only one attribute - crm_xml_add(test_xml, "name", "value"); + pcmk__xe_set(test_xml, "name", "value"); reference_xml = pcmk__xml_copy(NULL, test_xml); assert_order(test_xml, reference_xml); pcmk__xml_free(reference_xml); @@ -118,9 +118,9 @@ already_sorted(void **state) xmlAttr *attr = NULL; - crm_xml_add(test_xml, "admin", "john"); - crm_xml_add(test_xml, "dummy", "value"); - crm_xml_add(test_xml, "location", "usa"); + pcmk__xe_set(test_xml, "admin", "john"); + pcmk__xe_set(test_xml, "dummy", "value"); + pcmk__xe_set(test_xml, "location", "usa"); // Set flags in test_xml's attributes for testing flag preservation attr = xmlHasProp(test_xml, (const xmlChar *) "admin"); @@ -137,7 +137,7 @@ already_sorted(void **state) xml_node_private_t *nodepriv = attr->_private; if (nodepriv != NULL) { - pcmk__set_xml_flags(nodepriv, pcmk__xf_lazy); + pcmk__set_xml_flags(nodepriv, pcmk__xf_ignore_attr_pos); } } @@ -161,9 +161,9 @@ need_sort(void **state) xmlAttr *attr = NULL; - crm_xml_add(test_xml, "location", "usa"); - crm_xml_add(test_xml, "admin", "john"); - crm_xml_add(test_xml, "dummy", "value"); + pcmk__xe_set(test_xml, "location", "usa"); + pcmk__xe_set(test_xml, "admin", "john"); + pcmk__xe_set(test_xml, "dummy", "value"); // Set flags in test_xml's attributes for testing flag preservation attr = xmlHasProp(test_xml, (const xmlChar *) "location"); @@ -171,7 +171,7 @@ need_sort(void **state) xml_node_private_t *nodepriv = attr->_private; if (nodepriv != NULL) { - pcmk__set_xml_flags(nodepriv, pcmk__xf_lazy); + pcmk__set_xml_flags(nodepriv, pcmk__xf_ignore_attr_pos); } } diff --git a/lib/common/tests/xml_idref/pcmk__xe_dereference_children_test.c b/lib/common/tests/xml_idref/pcmk__xe_dereference_children_test.c index 70a35a4ae1f..9f41f2f1c58 100644 --- a/lib/common/tests/xml_idref/pcmk__xe_dereference_children_test.c +++ b/lib/common/tests/xml_idref/pcmk__xe_dereference_children_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -59,8 +59,8 @@ assert_deref(const char *xml_string, const char *element_name, ...) assert_null(list); } else { while (list != NULL) { - const char *value = crm_element_value((xmlNode *) list->data, - "testattr"); + const char *value = pcmk__xe_get((xmlNode *) list->data, + "testattr"); assert_true(g_hash_table_remove(table, value)); list = list->next; diff --git a/lib/common/tls.c b/lib/common/tls.c index 9d9652643c4..0745532703b 100644 --- a/lib/common/tls.c +++ b/lib/common/tls.c @@ -28,9 +28,9 @@ get_gnutls_priorities(gnutls_credentials_type_t cred_type) } if (cred_type == GNUTLS_CRD_ANON) { - return crm_strdup_printf("%s:+ANON-DH", prio_base); + return pcmk__assert_asprintf("%s:+ANON-DH", prio_base); } else if (cred_type == GNUTLS_CRD_PSK) { - return crm_strdup_printf("%s:+DHE-PSK:+PSK", prio_base); + return pcmk__assert_asprintf("%s:+DHE-PSK:+PSK", prio_base); } else { return strdup(prio_base); } @@ -67,7 +67,7 @@ tls_load_x509_data(pcmk__tls_t *tls) tls->ca_file, GNUTLS_X509_FMT_PEM); if (rc <= 0) { - crm_err("Failed to set X509 CA file: %s", gnutls_strerror(rc)); + pcmk__err("Failed to set X509 CA file: %s", gnutls_strerror(rc)); return ENODATA; } @@ -79,8 +79,7 @@ tls_load_x509_data(pcmk__tls_t *tls) tls->crl_file, GNUTLS_X509_FMT_PEM); if (rc < 0) { - crm_err("Failed to set X509 CRL file: %s", - gnutls_strerror(rc)); + pcmk__err("Failed to set X509 CRL file: %s", gnutls_strerror(rc)); return ENODATA; } } @@ -93,8 +92,7 @@ tls_load_x509_data(pcmk__tls_t *tls) GNUTLS_X509_FMT_PEM, NULL, GNUTLS_PKCS_PLAIN); if (rc < 0) { - crm_err("Failed to set X509 cert/key pair: %s", - gnutls_strerror(rc)); + pcmk__err("Failed to set X509 cert/key pair: %s", gnutls_strerror(rc)); return ENODATA; } @@ -123,7 +121,7 @@ verify_peer_cert(gnutls_session_t session) * to check status to see whether the cert is valid or not. */ if (rc != GNUTLS_E_SUCCESS) { - crm_err("Failed to verify peer certificate: %s", gnutls_strerror(rc)); + pcmk__err("Failed to verify peer certificate: %s", gnutls_strerror(rc)); return -1; } @@ -134,7 +132,7 @@ verify_peer_cert(gnutls_session_t session) type = gnutls_certificate_type_get(session); gnutls_certificate_verification_status_print(status, type, &out, 0); - crm_err("Peer certificate invalid: %s", out.data); + pcmk__err("Peer certificate invalid: %s", out.data); gnutls_free(out.data); return GNUTLS_E_CERTIFICATE_VERIFICATION_ERROR; } @@ -142,7 +140,7 @@ verify_peer_cert(gnutls_session_t session) static void _gnutls_log_func(int level, const char *msg) { - crm_trace("%s", msg); + pcmk__trace("%s", msg); } void @@ -298,8 +296,8 @@ pcmk__init_tls_dh(gnutls_dh_params_t *dh_params) dh_bits = dh_max_bits; } - crm_info("Generating Diffie-Hellman parameters with %u-bit prime for TLS", - dh_bits); + pcmk__info("Generating Diffie-Hellman parameters with %u-bit prime for TLS", + dh_bits); rc = gnutls_dh_params_generate2(*dh_params, dh_bits); if (rc != GNUTLS_E_SUCCESS) { goto error; @@ -308,8 +306,9 @@ pcmk__init_tls_dh(gnutls_dh_params_t *dh_params) return pcmk_rc_ok; error: - crm_err("Could not initialize Diffie-Hellman parameters for TLS: %s " - QB_XS " rc=%d", gnutls_strerror(rc), rc); + pcmk__err("Could not initialize Diffie-Hellman parameters for TLS: %s " + QB_XS " rc=%d", + gnutls_strerror(rc), rc); return EPROTO; } @@ -364,7 +363,7 @@ pcmk__new_tls_session(pcmk__tls_t *tls, int csock) } else if (tls->cred_type == GNUTLS_CRD_PSK) { rc = gnutls_credentials_set(session, tls->cred_type, tls->credentials.psk_c); } else { - crm_err("Unknown credential type: %d", tls->cred_type); + pcmk__err("Unknown credential type: %d", tls->cred_type); rc = EINVAL; goto error; } @@ -392,10 +391,11 @@ pcmk__new_tls_session(pcmk__tls_t *tls, int csock) return session; error: - crm_err("Could not initialize %s TLS %s session: %s " QB_XS " rc=%d priority='%s'", - tls_cred_str(tls->cred_type), - (conn_type == GNUTLS_SERVER)? "server" : "client", - gnutls_strerror(rc), rc, prio); + pcmk__err("Could not initialize %s TLS %s session: %s " + QB_XS " rc=%d priority='%s'", + tls_cred_str(tls->cred_type), + ((conn_type == GNUTLS_SERVER)? "server" : "client"), + gnutls_strerror(rc), rc, prio); free(prio); if (session != NULL) { gnutls_deinit(session); @@ -443,8 +443,8 @@ pcmk__read_handshake_data(const pcmk__client_t *client) */ return EAGAIN; } else if (rc != GNUTLS_E_SUCCESS) { - crm_err("TLS handshake with remote client failed: %s " - QB_XS " rc=%d", gnutls_strerror(rc), rc); + pcmk__err("TLS handshake with remote client failed: %s " QB_XS " rc=%d", + gnutls_strerror(rc), rc); return EPROTO; } return pcmk_rc_ok; diff --git a/lib/common/unittest.c b/lib/common/unittest.c index 6bf4d94e973..c05fc80e580 100644 --- a/lib/common/unittest.c +++ b/lib/common/unittest.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -25,8 +25,8 @@ pcmk__assert_validates(xmlNode *xml) gchar *err = NULL; gint status; GError *gerr = NULL; - char *xmllint_input = crm_strdup_printf("%s/test-xmllint.XXXXXX", - pcmk__get_tmpdir()); + char *xmllint_input = pcmk__assert_asprintf("%s/test-xmllint.XXXXXX", + pcmk__get_tmpdir()); int fd; int rc; @@ -50,8 +50,8 @@ pcmk__assert_validates(xmlNode *xml) fail_msg("PCMK_schema_directory is not set in test environment"); } - cmd = crm_strdup_printf("xmllint --relaxng %s/api/api-result.rng %s", - schema_dir, xmllint_input); + cmd = pcmk__assert_asprintf("xmllint --relaxng %s/api/api-result.rng %s", + schema_dir, xmllint_input); if (!g_spawn_command_line_sync(cmd, &out, &err, &status, &gerr)) { unlink(xmllint_input); @@ -111,13 +111,14 @@ pcmk__xml_test_teardown_group(void **state) char * pcmk__cib_test_copy_cib(const char *in_file) { - char *in_path = crm_strdup_printf("%s/%s", getenv("PCMK_CTS_CLI_DIR"), in_file); + char *in_path = pcmk__assert_asprintf("%s/%s", getenv("PCMK_CTS_CLI_DIR"), + in_file); char *out_path = NULL; char *contents = NULL; int fd; /* Copy the CIB over to a temp location so we can modify it. */ - out_path = crm_strdup_printf("%s/test-cib.XXXXXX", pcmk__get_tmpdir()); + out_path = pcmk__assert_asprintf("%s/test-cib.XXXXXX", pcmk__get_tmpdir()); fd = mkstemp(out_path); if (fd < 0) { diff --git a/lib/common/utils.c b/lib/common/utils.c index f49f5c0b1bb..e173f66859c 100644 --- a/lib/common/utils.c +++ b/lib/common/utils.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -20,6 +20,7 @@ #include #include #include +#include // regex_t, etc. #include #include @@ -96,176 +97,176 @@ pcmk__is_user_in_group(const char *user, const char *group) } int -crm_user_lookup(const char *name, uid_t * uid, gid_t * gid) +pcmk__lookup_user(const char *name, uid_t *uid, gid_t *gid) { - int rc = pcmk_ok; - char *buffer = NULL; - struct passwd pwd; struct passwd *pwentry = NULL; - buffer = calloc(1, PCMK__PW_BUFFER_LEN); - if (buffer == NULL) { - return -ENOMEM; - } + CRM_CHECK(name != NULL, return EINVAL); - rc = getpwnam_r(name, &pwd, buffer, PCMK__PW_BUFFER_LEN, &pwentry); - if (pwentry) { - if (uid) { - *uid = pwentry->pw_uid; - } - if (gid) { - *gid = pwentry->pw_gid; - } - crm_trace("User %s has uid=%d gid=%d", name, pwentry->pw_uid, pwentry->pw_gid); + // getpwnam() is not thread-safe, but Pacemaker is single-threaded + errno = 0; + pwentry = getpwnam(name); + if (pwentry == NULL) { + /* Either an error occurred or no passwd entry was found. + * + * The value of errno is implementation-dependent if no passwd entry is + * found. The POSIX specification does not consider it an error. + * POSIX.1-2008 specifies that errno shall not be changed in this case, + * while POSIX.1-2001 does not specify the value of errno in this case. + * The man page on Linux notes that a variety of values have been + * observed in practice. So an implementation may set errno to an + * arbitrary value, despite the POSIX specification. + * + * However, if pwentry == NULL and errno == 0, then we know that no + * matching entry was found and there was no error. So we default to + * ENOENT as our return code. + */ + return ((errno != 0)? errno : ENOENT); + } - } else { - rc = rc? -rc : -EINVAL; - crm_info("User %s lookup: %s", name, pcmk_strerror(rc)); + if (uid != NULL) { + *uid = pwentry->pw_uid; + } + if (gid != NULL) { + *gid = pwentry->pw_gid; } + pcmk__trace("User %s has uid=%lld gid=%lld", name, + (long long) pwentry->pw_uid, (long long) pwentry->pw_gid); - free(buffer); - return rc; + return pcmk_rc_ok; } /*! - * \brief Get user and group IDs of pacemaker daemon user + * \internal + * \brief Get user and group IDs of Pacemaker daemon user * - * \param[out] uid If non-NULL, where to store daemon user ID - * \param[out] gid If non-NULL, where to store daemon group ID + * \param[out] uid Where to store daemon user ID (can be \c NULL) + * \param[out] gid Where to store daemon group ID (can be \c NULL) * - * \return pcmk_ok on success, -errno otherwise + * \return Standard Pacemaker return code */ int -pcmk_daemon_user(uid_t *uid, gid_t *gid) +pcmk__daemon_user(uid_t *uid, gid_t *gid) { - static uid_t daemon_uid; - static gid_t daemon_gid; + static uid_t daemon_uid = 0; + static gid_t daemon_gid = 0; static bool found = false; - int rc = pcmk_ok; if (!found) { - rc = crm_user_lookup(CRM_DAEMON_USER, &daemon_uid, &daemon_gid); - if (rc == pcmk_ok) { - found = true; + int rc = pcmk__lookup_user(CRM_DAEMON_USER, &daemon_uid, &daemon_gid); + + if (rc != pcmk_rc_ok) { + return rc; } + found = true; } - if (found) { - if (uid) { - *uid = daemon_uid; - } - if (gid) { - *gid = daemon_gid; - } + + if (uid != NULL) { + *uid = daemon_uid; } - return rc; + if (gid != NULL) { + *gid = daemon_gid; + } + return pcmk_rc_ok; } /*! * \internal - * \brief Return the integer equivalent of a portion of a string + * \brief Compare two version strings to determine which one is higher * - * \param[in] text Pointer to beginning of string portion - * \param[out] end_text This will point to next character after integer - */ -static int -version_helper(const char *text, const char **end_text) -{ - int atoi_result = -1; - - pcmk__assert(end_text != NULL); - - errno = 0; - - if (text != NULL && text[0] != 0) { - /* seemingly sacrificing const-correctness -- because while strtol - doesn't modify the input, it doesn't want to artificially taint the - "end_text" pointer-to-pointer-to-first-char-in-string with constness - in case the input wasn't actually constant -- by semantic definition - not a single character will get modified so it shall be perfectly - safe to make compiler happy with dropping "const" qualifier here */ - atoi_result = (int) strtol(text, (char **) end_text, 10); - - if (errno == EINVAL) { - crm_err("Conversion of '%s' %c failed", text, text[0]); - atoi_result = -1; - } - } - return atoi_result; -} - -/* - * version1 < version2 : -1 - * version1 = version2 : 0 - * version1 > version2 : 1 + * A valid version string is of the form specified by the regex + * [0-9]+(\.[0-9]+)*. + * + * Leading whitespace and trailing garbage are allowed and ignored. + * + * For each string, we get all segments until the first invalid character. A + * segment is a series of digits, and segments are delimited by a single dot. + * The two strings are compared segment by segment, until either we find a + * difference or we've processed all segments in both strings. + * + * If one string runs out of segments to compare before the other string does, + * we treat it as if it has enough padding \c "0" segments to finish the + * comparisons. + * + * Segments are compared by calling \c strtoll() to parse them to long long + * integers and then performing standard integer comparison. + * + * \param[in] version1 First version to compare + * \param[in] version2 Second version to compare + * + * \retval -1 if \p version1 evaluates to a lower version than \p version2 + * \retval 1 if \p version1 evaluates to a higher version than \p version2 + * \retval 0 if \p version1 and \p version2 evaluate to an equal version + * + * \note Each version segment's parsed value must fit into a long long. */ int -compare_version(const char *version1, const char *version2) +pcmk__compare_versions(const char *version1, const char *version2) { + regex_t regex; + regmatch_t pmatch1[1]; + regmatch_t pmatch2[1]; + regoff_t off1 = 0; + regoff_t off2 = 0; + + bool has_match1 = false; + bool has_match2 = false; int rc = 0; - int lpc = 0; - const char *ver1_iter, *ver2_iter; - if (version1 == NULL && version2 == NULL) { + if (version1 == version2) { return 0; - } else if (version1 == NULL) { - return -1; - } else if (version2 == NULL) { - return 1; } - ver1_iter = version1; - ver2_iter = version2; + // Parse each version string as digit segments delimited by dots + pcmk__assert(regcomp(®ex, "^[[:digit:]]+\\.?", REG_EXTENDED) == 0); - while (1) { - int digit1 = 0; - int digit2 = 0; - - lpc++; + if (version1 != NULL) { + // Skip leading whitespace + for (; isspace(*version1); version1++); + has_match1 = (regexec(®ex, version1, 1, pmatch1, 0) == 0); + } + if (version2 != NULL) { + for (; isspace(*version2); version2++); + has_match2 = (regexec(®ex, version2, 1, pmatch2, 0) == 0); + } - if (ver1_iter == ver2_iter) { - break; - } + while (has_match1 || has_match2) { + long long value1 = 0; + long long value2 = 0; - if (ver1_iter != NULL) { - digit1 = version_helper(ver1_iter, &ver1_iter); + if (has_match1) { + value1 = strtoll(version1 + off1 + pmatch1[0].rm_so, NULL, 10); } - - if (ver2_iter != NULL) { - digit2 = version_helper(ver2_iter, &ver2_iter); + if (has_match2) { + value2 = strtoll(version2 + off2 + pmatch2[0].rm_so, NULL, 10); } - if (digit1 < digit2) { + if (value1 < value2) { + pcmk__trace("%s < %s", version1, version2); rc = -1; - break; - - } else if (digit1 > digit2) { - rc = 1; - break; + goto done; } - - if (ver1_iter != NULL && *ver1_iter == '.') { - ver1_iter++; - } - if (ver1_iter != NULL && *ver1_iter == '\0') { - ver1_iter = NULL; + if (value1 > value2) { + pcmk__trace("%s > %s", version1, version2); + rc = 1; + goto done; } - if (ver2_iter != NULL && *ver2_iter == '.') { - ver2_iter++; + // Compare next segments + if (has_match1) { + off1 += pmatch1[0].rm_eo; + has_match1 = (regexec(®ex, version1 + off1, 1, pmatch1, 0) == 0); } - if (ver2_iter != NULL && *ver2_iter == 0) { - ver2_iter = NULL; + if (has_match2) { + off2 += pmatch2[0].rm_eo; + has_match2 = (regexec(®ex, version2 + off2, 1, pmatch2, 0) == 0); } } - if (rc == 0) { - crm_trace("%s == %s (%d)", version1, version2, lpc); - } else if (rc < 0) { - crm_trace("%s < %s (%d)", version1, version2, lpc); - } else if (rc > 0) { - crm_trace("%s > %s (%d)", version1, version2, lpc); - } + pcmk__trace("%s == %s", version1, version2); +done: + regfree(®ex); return rc; } @@ -289,8 +290,8 @@ pcmk__daemonize(const char *name, const char *pidfile) /* Check before we even try... */ rc = pcmk__pidfile_matches(pidfile, 1, name, &pid); if ((rc != pcmk_rc_ok) && (rc != ENOENT)) { - crm_err("%s: already running [pid %lld in %s]", - name, (long long) pid, pidfile); + pcmk__err("%s: already running [pid %lld in %s]", name, (long long) pid, + pidfile); printf("%s: already running [pid %lld in %s]\n", name, (long long) pid, pidfile); crm_exit(CRM_EX_ERROR); @@ -308,8 +309,8 @@ pcmk__daemonize(const char *name, const char *pidfile) rc = pcmk__lock_pidfile(pidfile, name); if (rc != pcmk_rc_ok) { - crm_err("Could not lock '%s' for %s: %s " QB_XS " rc=%d", - pidfile, name, pcmk_rc_str(rc), rc); + pcmk__err("Could not lock '%s' for %s: %s " QB_XS " rc=%d", pidfile, + name, pcmk_rc_str(rc), rc); printf("Could not lock '%s' for %s: %s (%d)\n", pidfile, name, pcmk_rc_str(rc), rc); crm_exit(CRM_EX_ERROR); @@ -327,17 +328,37 @@ pcmk__daemonize(const char *name, const char *pidfile) pcmk__open_devnull(O_WRONLY); // stderr (fd 2) } +/* @FIXME uuid.h is an optional header per configure.ac, and we include it + * conditionally above. But uuid_generate() and uuid_unparse() depend on it, on + * many or perhaps all systems with libuuid. So it's not clear how it would ever + * be optional in practice. + * + * Note that these functions are not POSIX, although there is probably no good + * portable alternative. + * + * We do list libuuid as a build dependency in INSTALL.md already. + */ + #ifdef HAVE_UUID_UUID_H -# include -#endif +#include +#endif // HAVE_UUID_UUID_H +/*! + * \internal + * \brief Generate a 37-byte (36 bytes plus null terminator) UUID string + * + * \return Newly allocated UUID string + * + * \note The caller is responsible for freeing the return value using \c free(). + */ char * -crm_generate_uuid(void) +pcmk__generate_uuid(void) { - unsigned char uuid[16]; - char *buffer = malloc(37); /* Including NUL byte */ + uuid_t uuid; + + // uuid_unparse() converts a UUID to a 37-byte string (including null byte) + char *buffer = pcmk__assert_alloc(37, sizeof(char)); - pcmk__mem_assert(buffer); uuid_generate(uuid); uuid_unparse(uuid, buffer); return buffer; @@ -450,7 +471,7 @@ pcmk__timeout_ms2s(guint timeout_ms) static void _gnutls_log_func(int level, const char *msg) { - crm_trace("%s", msg); + pcmk__trace("%s", msg); } void @@ -496,5 +517,168 @@ crm_is_daemon_name(const char *name) NULL); } +char * +crm_generate_uuid(void) +{ + return pcmk__generate_uuid(); +} + +#define PW_BUFFER_LEN 500 + +int +crm_user_lookup(const char *name, uid_t * uid, gid_t * gid) +{ + int rc = pcmk_ok; + char *buffer = NULL; + struct passwd pwd; + struct passwd *pwentry = NULL; + + buffer = calloc(1, PW_BUFFER_LEN); + if (buffer == NULL) { + return -ENOMEM; + } + + rc = getpwnam_r(name, &pwd, buffer, PW_BUFFER_LEN, &pwentry); + if (pwentry) { + if (uid) { + *uid = pwentry->pw_uid; + } + if (gid) { + *gid = pwentry->pw_gid; + } + pcmk__trace("User %s has uid=%d gid=%d", name, pwentry->pw_uid, + pwentry->pw_gid); + + } else { + rc = rc? -rc : -EINVAL; + pcmk__info("User %s lookup: %s", name, pcmk_strerror(rc)); + } + + free(buffer); + return rc; +} + +int +pcmk_daemon_user(uid_t *uid, gid_t *gid) +{ + static uid_t daemon_uid; + static gid_t daemon_gid; + static bool found = false; + int rc = pcmk_ok; + + if (!found) { + rc = crm_user_lookup(CRM_DAEMON_USER, &daemon_uid, &daemon_gid); + if (rc == pcmk_ok) { + found = true; + } + } + if (found) { + if (uid) { + *uid = daemon_uid; + } + if (gid) { + *gid = daemon_gid; + } + } + return rc; +} + +static int +version_helper(const char *text, const char **end_text) +{ + int atoi_result = -1; + + pcmk__assert(end_text != NULL); + + errno = 0; + + if (text != NULL && text[0] != 0) { + /* seemingly sacrificing const-correctness -- because while strtol + doesn't modify the input, it doesn't want to artificially taint the + "end_text" pointer-to-pointer-to-first-char-in-string with constness + in case the input wasn't actually constant -- by semantic definition + not a single character will get modified so it shall be perfectly + safe to make compiler happy with dropping "const" qualifier here */ + atoi_result = (int) strtol(text, (char **) end_text, 10); + + if (errno == EINVAL) { + pcmk__err("Conversion of '%s' %c failed", text, text[0]); + atoi_result = -1; + } + } + return atoi_result; +} + +int +compare_version(const char *version1, const char *version2) +{ + int rc = 0; + int lpc = 0; + const char *ver1_iter, *ver2_iter; + + if (version1 == NULL && version2 == NULL) { + return 0; + } else if (version1 == NULL) { + return -1; + } else if (version2 == NULL) { + return 1; + } + + ver1_iter = version1; + ver2_iter = version2; + + while (1) { + int digit1 = 0; + int digit2 = 0; + + lpc++; + + if (ver1_iter == ver2_iter) { + break; + } + + if (ver1_iter != NULL) { + digit1 = version_helper(ver1_iter, &ver1_iter); + } + + if (ver2_iter != NULL) { + digit2 = version_helper(ver2_iter, &ver2_iter); + } + + if (digit1 < digit2) { + rc = -1; + break; + + } else if (digit1 > digit2) { + rc = 1; + break; + } + + if (ver1_iter != NULL && *ver1_iter == '.') { + ver1_iter++; + } + if (ver1_iter != NULL && *ver1_iter == '\0') { + ver1_iter = NULL; + } + + if (ver2_iter != NULL && *ver2_iter == '.') { + ver2_iter++; + } + if (ver2_iter != NULL && *ver2_iter == 0) { + ver2_iter = NULL; + } + } + + if (rc == 0) { + pcmk__trace("%s == %s (%d)", version1, version2, lpc); + } else if (rc < 0) { + pcmk__trace("%s < %s (%d)", version1, version2, lpc); + } else if (rc > 0) { + pcmk__trace("%s > %s (%d)", version1, version2, lpc); + } + + return rc; +} + // LCOV_EXCL_STOP // End deprecated API diff --git a/lib/common/watchdog.c b/lib/common/watchdog.c index 6fc28ba98f2..9b4c6a01e48 100644 --- a/lib/common/watchdog.c +++ b/lib/common/watchdog.c @@ -1,5 +1,5 @@ /* - * Copyright 2013-2024 the Pacemaker project contributors + * Copyright 2013-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -20,6 +20,8 @@ #include #include +#include // QB_MIN(), QB_MAX() + static pid_t sbd_pid = 0; /*! @@ -32,22 +34,23 @@ static void panic_local_nonroot(pid_t ppid) { if (ppid > 1) { // pacemakerd is still our parent - crm_emerg("Escalating panic to " PCMK__SERVER_PACEMAKERD "[%lld]", - (long long) ppid); + pcmk__emerg("Escalating panic to " PCMK__SERVER_PACEMAKERD "[%lld]", + (long long) ppid); } else { // Signal (non-parent) pacemakerd if possible ppid = pcmk__procfs_pid_of(PCMK__SERVER_PACEMAKERD); if (ppid > 0) { union sigval signal_value; - crm_emerg("Signaling " PCMK__SERVER_PACEMAKERD "[%lld] to panic", - (long long) ppid); + pcmk__emerg("Signaling " PCMK__SERVER_PACEMAKERD "[%lld] to panic", + (long long) ppid); memset(&signal_value, 0, sizeof(signal_value)); if (sigqueue(ppid, SIGQUIT, signal_value) < 0) { - crm_emerg("Exiting after signal failure: %s", strerror(errno)); + pcmk__emerg("Exiting after signal failure: %s", + strerror(errno)); } } else { - crm_emerg("Exiting with no known " PCMK__SERVER_PACEMAKERD - "process"); + pcmk__emerg("Exiting with no known " PCMK__SERVER_PACEMAKERD + "process"); } } crm_exit(CRM_EX_PANIC); @@ -89,9 +92,10 @@ panic_local(void) reboot_cmd = RB_POWEROFF; #endif } else { - crm_warn("Using default '" PCMK_VALUE_REBOOT "' for local option PCMK_" - PCMK__ENV_PANIC_ACTION " because '%s' is not a valid value", - full_panic_action); + pcmk__warn("Using default '" PCMK_VALUE_REBOOT "' for local option " + "PCMK_" PCMK__ENV_PANIC_ACTION " because '%s' is not a " + "valid value", + full_panic_action); pcmk__sysrq_trigger('b'); } @@ -99,7 +103,7 @@ panic_local(void) reboot(reboot_cmd); // Even reboot failed, nothing left to do but exit - crm_emerg("Exiting after reboot failed: %s", strerror(errno)); + pcmk__emerg("Exiting after reboot failed: %s", strerror(errno)); if (getppid() > 1) { // pacemakerd is parent process crm_exit(CRM_EX_PANIC); } else { // This is pacemakerd, or an orphaned subdaemon @@ -120,7 +124,7 @@ panic_sbd(void) memset(&signal_value, 0, sizeof(signal_value)); /* TODO: Arrange for a slightly less brutal option? */ if(sigqueue(sbd_pid, SIGKILL, signal_value) < 0) { - crm_emerg("Panicking directly because couldn't signal sbd"); + pcmk__emerg("Panicking directly because couldn't signal sbd"); panic_local(); } @@ -146,12 +150,12 @@ void pcmk__panic(const char *reason) { if (pcmk__locate_sbd() > 1) { - crm_emerg("Signaling sbd[%lld] to panic the system: %s", - (long long) sbd_pid, reason); + pcmk__emerg("Signaling sbd[%lld] to panic the system: %s", + (long long) sbd_pid, reason); panic_sbd(); } else { - crm_emerg("Panicking the system directly: %s", reason); + pcmk__emerg("Panicking the system directly: %s", reason); panic_local(); } } @@ -173,33 +177,45 @@ pcmk__locate_sbd(void) /* Read the pid file */ rc = pcmk__pidfile_matches(pidfile, 0, SBIN_DIR "/sbd", &sbd_pid); if (rc == pcmk_rc_ok) { - crm_trace("SBD detected at pid %lld (via PID file %s)", - (long long) sbd_pid, pidfile); + pcmk__trace("SBD detected at pid %lld (via PID file %s)", + (long long) sbd_pid, pidfile); } else { /* Fall back to /proc for systems that support it */ sbd_pid = pcmk__procfs_pid_of("sbd"); if (sbd_pid != 0) { - crm_trace("SBD detected at pid %lld (via procfs)", - (long long) sbd_pid); + pcmk__trace("SBD detected at pid %lld (via procfs)", + (long long) sbd_pid); } } if(sbd_pid < 0) { sbd_pid = 0; - crm_trace("SBD not detected"); + pcmk__trace("SBD not detected"); } return sbd_pid; } +// 0 <= return value <= LONG_MAX long pcmk__get_sbd_watchdog_timeout(void) { - static long sbd_timeout = -2; + static long sbd_timeout = -1; + + if (sbd_timeout == -1) { + const char *timeout = getenv("SBD_WATCHDOG_TIMEOUT"); + long long timeout_ms = 0; + + if ((timeout != NULL) + && (pcmk__parse_ms(timeout, &timeout_ms) == pcmk_rc_ok) + && (timeout_ms >= 0)) { - if (sbd_timeout == -2) { - sbd_timeout = crm_get_msec(getenv("SBD_WATCHDOG_TIMEOUT")); + sbd_timeout = (long) QB_MIN(timeout_ms, LONG_MAX); + + } else { + sbd_timeout = 0; + } } return sbd_timeout; } @@ -207,32 +223,35 @@ pcmk__get_sbd_watchdog_timeout(void) bool pcmk__get_sbd_sync_resource_startup(void) { - static int sync_resource_startup = PCMK__SBD_SYNC_DEFAULT; + static bool sync_resource_startup = PCMK__SBD_SYNC_DEFAULT; static bool checked_sync_resource_startup = false; if (!checked_sync_resource_startup) { const char *sync_env = getenv("SBD_SYNC_RESOURCE_STARTUP"); if (sync_env == NULL) { - crm_trace("Defaulting to %sstart-up synchronization with sbd", - (PCMK__SBD_SYNC_DEFAULT? "" : "no ")); - - } else if (crm_str_to_boolean(sync_env, &sync_resource_startup) < 0) { - crm_warn("Defaulting to %sstart-up synchronization with sbd " - "because environment value '%s' is invalid", - (PCMK__SBD_SYNC_DEFAULT? "" : "no "), sync_env); + pcmk__trace("Defaulting to %sstart-up synchronization with sbd", + (PCMK__SBD_SYNC_DEFAULT? "" : "no ")); + + } else if (pcmk__parse_bool(sync_env, + &sync_resource_startup) != pcmk_rc_ok) { + pcmk__warn("Defaulting to %sstart-up synchronization with sbd " + "because environment value '%s' is invalid", + (PCMK__SBD_SYNC_DEFAULT? "" : "no "), sync_env); } checked_sync_resource_startup = true; } - return sync_resource_startup != 0; + return sync_resource_startup; } +// 0 <= return value <= min(LONG_MAX, (2 * SBD timeout)) long pcmk__auto_stonith_watchdog_timeout(void) { long sbd_timeout = pcmk__get_sbd_watchdog_timeout(); + long long st_timeout = 2 * (long long) sbd_timeout; - return (sbd_timeout <= 0)? 0 : (2 * sbd_timeout); + return (long) QB_MIN(st_timeout, LONG_MAX); } bool @@ -242,24 +261,30 @@ pcmk__valid_stonith_watchdog_timeout(const char *value) * specific string like "auto" (but not both) to mean "auto-calculate the * timeout." Reject other values that aren't parsable as timeouts. */ - long st_timeout = value? crm_get_msec(value) : 0; + long long st_timeout = 0; + + if ((value != NULL) && (pcmk__parse_ms(value, &st_timeout) == pcmk_rc_ok)) { + st_timeout = QB_MIN(st_timeout, LONG_MAX); + } if (st_timeout < 0) { st_timeout = pcmk__auto_stonith_watchdog_timeout(); - crm_debug("Using calculated value %ld for " - PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " (%s)", - st_timeout, value); + + // At this point, 0 <= sbd_timeout <= st_timeout + pcmk__debug("Using calculated value %lld for " + PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " (%s)", + st_timeout, value); } if (st_timeout == 0) { - crm_debug("Watchdog may be enabled but " - PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " is disabled (%s)", - value? value : "default"); + pcmk__debug("Watchdog may be enabled but " + PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " is disabled (%s)", + pcmk__s(value, "default")); } else if (pcmk__locate_sbd() == 0) { - crm_emerg("Shutting down: " PCMK_OPT_STONITH_WATCHDOG_TIMEOUT - " configured (%s) but SBD not active", - pcmk__s(value, "auto")); + pcmk__emerg("Shutting down: " PCMK_OPT_STONITH_WATCHDOG_TIMEOUT + " configured (%s) but SBD not active", + pcmk__s(value, "auto")); crm_exit(CRM_EX_FATAL); return false; @@ -267,15 +292,18 @@ pcmk__valid_stonith_watchdog_timeout(const char *value) long sbd_timeout = pcmk__get_sbd_watchdog_timeout(); if (st_timeout < sbd_timeout) { - crm_emerg("Shutting down: " PCMK_OPT_STONITH_WATCHDOG_TIMEOUT - " (%s) too short (must be >%ldms)", - value, sbd_timeout); + /* Passed-in value for PCMK_OPT_STONITH_WATCHDOG_TIMEOUT was + * parsable, positive, and less than the SBD_WATCHDOG_TIMEOUT + */ + pcmk__emerg("Shutting down: " PCMK_OPT_STONITH_WATCHDOG_TIMEOUT + " (%s) too short (must be >%ldms)", + value, sbd_timeout); crm_exit(CRM_EX_FATAL); return false; } - crm_info("Watchdog configured with " PCMK_OPT_STONITH_WATCHDOG_TIMEOUT - " %s and SBD timeout %ldms", - value, sbd_timeout); + pcmk__info("Watchdog configured with " PCMK_OPT_STONITH_WATCHDOG_TIMEOUT + " %s and SBD timeout %ldms", + value, sbd_timeout); } return true; } diff --git a/lib/common/xml.c b/lib/common/xml.c index 74bf14aa845..3bb372912e1 100644 --- a/lib/common/xml.c +++ b/lib/common/xml.c @@ -123,7 +123,7 @@ pcmk__xml_set_parent_flags(xmlNode *xml, uint64_t flags) * \brief Set flags for an XML document * * \param[in,out] doc XML document - * \param[in] flags Group of enum xml_private_flags + * \param[in] flags Group of enum pcmk__xml_flags */ void pcmk__xml_doc_set_flags(xmlDoc *doc, uint32_t flags) @@ -140,7 +140,7 @@ pcmk__xml_doc_set_flags(xmlDoc *doc, uint32_t flags) * \brief Check whether the given flags are set for an XML document * * \param[in] doc XML document to check - * \param[in] flags Group of enum xml_private_flags + * \param[in] flags Group of enum pcmk__xml_flags * * \return \c true if all of \p flags are set for \p doc, or \c false otherwise */ @@ -150,7 +150,7 @@ pcmk__xml_doc_all_flags_set(const xmlDoc *doc, uint32_t flags) if (doc != NULL) { xml_doc_private_t *docpriv = doc->_private; - return (docpriv != NULL) && pcmk_all_flags_set(docpriv->flags, flags); + return (docpriv != NULL) && pcmk__all_flags_set(docpriv->flags, flags); } return false; } @@ -281,12 +281,16 @@ reset_xml_private_data(xml_doc_private_t *docpriv) static bool new_private_data(xmlNode *node, void *user_data) { + bool tracking = false; + CRM_CHECK(node != NULL, return true); if (node->_private != NULL) { return true; } + tracking = pcmk__xml_doc_all_flags_set(node->doc, pcmk__xf_tracking); + switch (node->type) { case XML_DOCUMENT_NODE: { @@ -295,7 +299,6 @@ new_private_data(xmlNode *node, void *user_data) docpriv->check = PCMK__XML_DOC_PRIVATE_MAGIC; node->_private = docpriv; - pcmk__set_xml_flags(docpriv, pcmk__xf_dirty|pcmk__xf_created); } break; @@ -308,7 +311,9 @@ new_private_data(xmlNode *node, void *user_data) nodepriv->check = PCMK__XML_NODE_PRIVATE_MAGIC; node->_private = nodepriv; - pcmk__set_xml_flags(nodepriv, pcmk__xf_dirty|pcmk__xf_created); + if (tracking) { + pcmk__set_xml_flags(nodepriv, pcmk__xf_dirty|pcmk__xf_created); + } for (xmlAttr *iter = pcmk__xe_first_attr(node); iter != NULL; iter = iter->next) { @@ -328,7 +333,7 @@ new_private_data(xmlNode *node, void *user_data) return true; } - if (pcmk__xml_doc_all_flags_set(node->doc, pcmk__xf_tracking)) { + if (tracking) { pcmk__mark_xml_node_dirty(node); } return true; @@ -397,26 +402,6 @@ pcmk__xml_free_private_data(xmlNode *xml) pcmk__xml_tree_foreach(xml, free_private_data, NULL); } -void -xml_track_changes(xmlNode * xml, const char *user, xmlNode *acl_source, bool enforce_acls) -{ - if (xml == NULL) { - return; - } - - xml_accept_changes(xml); - crm_trace("Tracking changes%s to %p", enforce_acls?" with ACLs":"", xml); - pcmk__xml_doc_set_flags(xml->doc, pcmk__xf_tracking); - if(enforce_acls) { - if(acl_source == NULL) { - acl_source = xml; - } - pcmk__xml_doc_set_flags(xml->doc, pcmk__xf_acl_enabled); - pcmk__unpack_acl(acl_source, xml, user); - pcmk__apply_acl(xml); - } -} - /*! * \internal * \brief Return ordinal position of an XML node among its siblings @@ -427,14 +412,14 @@ xml_track_changes(xmlNode * xml, const char *user, xmlNode *acl_source, bool enf * \return Ordinal position of \p xml (starting with 0) */ int -pcmk__xml_position(const xmlNode *xml, enum xml_private_flags ignore_if_set) +pcmk__xml_position(const xmlNode *xml, enum pcmk__xml_flags ignore_if_set) { int position = 0; for (const xmlNode *cIter = xml; cIter->prev; cIter = cIter->prev) { xml_node_private_t *nodepriv = ((xmlNode*)cIter->prev)->_private; - if (!pcmk_is_set(nodepriv->flags, ignore_if_set)) { + if (!pcmk__is_set(nodepriv->flags, ignore_if_set)) { position++; } } @@ -454,7 +439,7 @@ pcmk__xml_position(const xmlNode *xml, enum xml_private_flags ignore_if_set) * \note This is compatible with \c pcmk__xml_tree_foreach(). */ static bool -accept_attr_deletions(xmlNode *xml, void *user_data) +commit_attr_deletions(xmlNode *xml, void *user_data) { pcmk__xml_reset_node_flags(xml, NULL); pcmk__xe_remove_matching_attrs(xml, true, pcmk__marked_as_deleted, NULL); @@ -463,47 +448,42 @@ accept_attr_deletions(xmlNode *xml, void *user_data) /*! * \internal - * \brief Find first child XML node matching another given XML node - * - * \param[in] haystack XML whose children should be checked - * \param[in] needle XML to match (comment content or element name and ID) - * \param[in] exact If true and needle is a comment, position must match + * \brief Finalize all pending changes to an XML document and reset private data + * + * Clear the ACL user and all flags, unpacked ACLs, and deleted node records for + * the document; clear all flags on each node in the tree; and delete any + * attributes that are marked for deletion. + * + * \param[in,out] doc XML document + * + * \note When change tracking is enabled, "deleting" an attribute simply marks + * it for deletion (using \c pcmk__xf_deleted) until changes are + * committed. Freeing a node (using \c pcmk__xml_free()) adds a deleted + * node record (\c pcmk__deleted_xml_t) to the node's document before + * freeing it. + * \note This function clears all flags, not just flags that indicate changes. + * In particular, note that it clears the \c pcmk__xf_tracking flag, thus + * disabling tracking. */ -xmlNode * -pcmk__xml_match(const xmlNode *haystack, const xmlNode *needle, bool exact) -{ - CRM_CHECK(needle != NULL, return NULL); - - if (needle->type == XML_COMMENT_NODE) { - return pcmk__xc_match(haystack, needle, exact); - - } else { - const char *id = pcmk__xe_id(needle); - const char *attr = (id == NULL)? NULL : PCMK_XA_ID; - - return pcmk__xe_first_child(haystack, (const char *) needle->name, attr, - id); - } -} - void -xml_accept_changes(xmlNode * xml) +pcmk__xml_commit_changes(xmlDoc *doc) { - xmlNode *top = NULL; xml_doc_private_t *docpriv = NULL; - if(xml == NULL) { + if (doc == NULL) { return; } - crm_trace("Accepting changes to %p", xml); - docpriv = xml->doc->_private; - top = xmlDocGetRootElement(xml->doc); + docpriv = doc->_private; + if (docpriv == NULL) { + return; + } - if (pcmk_is_set(docpriv->flags, pcmk__xf_dirty)) { - pcmk__xml_tree_foreach(top, accept_attr_deletions, NULL); + if (pcmk__is_set(docpriv->flags, pcmk__xf_dirty)) { + pcmk__xml_tree_foreach(xmlDocGetRootElement(doc), commit_attr_deletions, + NULL); } - reset_xml_private_data(xml->doc->_private); + reset_xml_private_data(docpriv); docpriv->flags = pcmk__xf_none; } @@ -588,8 +568,8 @@ pcmk__xml_is_name_start_char(const char *utf8, int *len) for (int i = 0; (i < 4) && (utf8[i] != '\0'); i++) { g_string_append_printf(buf, " 0x%.2X", utf8[i]); } - crm_info("Invalid UTF-8 character (bytes:%s)", - (pcmk__str_empty(buf->str)? " " : buf->str)); + pcmk__info("Invalid UTF-8 character (bytes:%s)", + (pcmk__str_empty(buf->str)? " " : buf->str)); g_string_free(buf, TRUE); return false; } @@ -649,8 +629,8 @@ pcmk__xml_is_name_char(const char *utf8, int *len) for (int i = 0; (i < 4) && (utf8[i] != '\0'); i++) { g_string_append_printf(buf, " 0x%.2X", utf8[i]); } - crm_info("Invalid UTF-8 character (bytes:%s)", - (pcmk__str_empty(buf->str)? " " : buf->str)); + pcmk__info("Invalid UTF-8 character (bytes:%s)", + (pcmk__str_empty(buf->str)? " " : buf->str)); g_string_free(buf, TRUE); return false; } @@ -751,15 +731,17 @@ pcmk__xml_free_node(xmlNode *xml) * \param[in] position Position of \p node among its siblings for change * tracking (negative to calculate automatically if * needed) + * + * \return Standard Pacemaker return code */ -static void +static int free_xml_with_position(xmlNode *node, int position) { xmlDoc *doc = NULL; xml_node_private_t *nodepriv = NULL; if (node == NULL) { - return; + return pcmk_rc_ok; } doc = node->doc; nodepriv = node->_private; @@ -769,23 +751,27 @@ free_xml_with_position(xmlNode *node, int position) * free the root element without write permission. */ pcmk__xml_free_doc(doc); - return; + return pcmk_rc_ok; } if (!pcmk__check_acl(node, NULL, pcmk__xf_acl_write)) { - GString *xpath = NULL; - - pcmk__if_tracing({}, return); - xpath = pcmk__element_xpath(node); - qb_log_from_external_source(__func__, __FILE__, - "Cannot remove %s %x", LOG_TRACE, - __LINE__, 0, xpath->str, nodepriv->flags); - g_string_free(xpath, TRUE); - return; + pcmk__if_tracing( + { + GString *xpath = pcmk__element_xpath(node); + + qb_log_from_external_source(__func__, __FILE__, + "Cannot remove %s %x", + PCMK__LOG_TRACE, __LINE__, 0, + xpath->str, nodepriv->flags); + g_string_free(xpath, TRUE); + }, + {} + ); + return EACCES; } if (pcmk__xml_doc_all_flags_set(node->doc, pcmk__xf_tracking) - && !pcmk_is_set(nodepriv->flags, pcmk__xf_created)) { + && !pcmk__is_set(nodepriv->flags, pcmk__xf_created)) { xml_doc_private_t *docpriv = doc->_private; GString *xpath = pcmk__element_xpath(node); @@ -793,7 +779,7 @@ free_xml_with_position(xmlNode *node, int position) if (xpath != NULL) { pcmk__deleted_xml_t *deleted_obj = NULL; - crm_trace("Deleting %s %p from %p", xpath->str, node, doc); + pcmk__trace("Deleting %s %p from %p", xpath->str, node, doc); deleted_obj = pcmk__assert_alloc(1, sizeof(pcmk__deleted_xml_t)); deleted_obj->path = g_string_free(xpath, FALSE); @@ -816,6 +802,7 @@ free_xml_with_position(xmlNode *node, int position) } } pcmk__xml_free_node(node); + return pcmk_rc_ok; } /*! @@ -1101,21 +1088,6 @@ pcmk__xml_escape(const char *text, enum pcmk__xml_escape_type type) return g_string_free(copy, FALSE); } -/*! - * \internal - * \brief Set a flag on all attributes of an XML element - * - * \param[in,out] xml XML node to set flags on - * \param[in] flag XML private flag to set - */ -static void -set_attrs_flag(xmlNode *xml, enum xml_private_flags flag) -{ - for (xmlAttr *attr = pcmk__xe_first_attr(xml); attr; attr = attr->next) { - pcmk__set_xml_flags((xml_node_private_t *) (attr->_private), flag); - } -} - /*! * \internal * \brief Add an XML attribute to a node, marked as deleted @@ -1142,7 +1114,7 @@ mark_attr_deleted(xmlNode *new_xml, const char *element, const char *attr_name, * checking ACLs) */ pcmk__clear_xml_flags(docpriv, pcmk__xf_tracking); - crm_xml_add(new_xml, attr_name, old_value); + pcmk__xe_set(new_xml, attr_name, old_value); pcmk__set_xml_flags(docpriv, pcmk__xf_tracking); // Reset flags (so the attribute doesn't appear as newly created) @@ -1153,8 +1125,8 @@ mark_attr_deleted(xmlNode *new_xml, const char *element, const char *attr_name, // Check ACLs and mark restored value for later removal pcmk__xa_remove(attr, false); - crm_trace("XML attribute %s=%s was removed from %s", - attr_name, old_value, element); + pcmk__trace("XML attribute %s=%s was removed from %s", attr_name, old_value, + element); } /* @@ -1166,18 +1138,18 @@ mark_attr_changed(xmlNode *new_xml, const char *element, const char *attr_name, const char *old_value) { xml_doc_private_t *docpriv = new_xml->doc->_private; - char *vcopy = crm_element_value_copy(new_xml, attr_name); + char *vcopy = pcmk__xe_get_copy(new_xml, attr_name); - crm_trace("XML attribute %s was changed from '%s' to '%s' in %s", - attr_name, old_value, vcopy, element); + pcmk__trace("XML attribute %s was changed from '%s' to '%s' in %s", + attr_name, old_value, vcopy, element); // Restore the original value (without checking ACLs) pcmk__clear_xml_flags(docpriv, pcmk__xf_tracking); - crm_xml_add(new_xml, attr_name, old_value); + pcmk__xe_set(new_xml, attr_name, old_value); pcmk__set_xml_flags(docpriv, pcmk__xf_tracking); // Change it back to the new value, to check ACLs - crm_xml_add(new_xml, attr_name, vcopy); + pcmk__xe_set(new_xml, attr_name, vcopy); free(vcopy); } @@ -1198,8 +1170,8 @@ mark_attr_moved(xmlNode *new_xml, const char *element, xmlAttr *old_attr, { xml_node_private_t *nodepriv = new_attr->_private; - crm_trace("XML attribute %s moved from position %d to %d in %s", - old_attr->name, p_old, p_new, element); + pcmk__trace("XML attribute %s moved from position %d to %d in %s", + old_attr->name, p_old, p_new, element); // Mark document, element, and all element's parents as changed pcmk__mark_xml_node_dirty(new_xml); @@ -1240,7 +1212,7 @@ xml_diff_old_attrs(xmlNode *old_xml, xmlNode *new_xml) pcmk__xf_skip); int old_pos = pcmk__xml_position((xmlNode*) old_attr, pcmk__xf_skip); - const char *new_value = crm_element_value(new_xml, name); + const char *new_value = pcmk__xe_get(new_xml, name); // This attribute isn't new pcmk__clear_xml_flags(nodepriv, pcmk__xf_created); @@ -1251,11 +1223,11 @@ xml_diff_old_attrs(xmlNode *old_xml, xmlNode *new_xml) } else if ((old_pos != new_pos) && !pcmk__xml_doc_all_flags_set(new_xml->doc, - pcmk__xf_lazy + pcmk__xf_ignore_attr_pos |pcmk__xf_tracking)) { - /* pcmk__xf_tracking is always set by xml_calculate_changes() - * before this function is called, so only the pcmk__xf_lazy - * check is truly relevant. + /* pcmk__xf_tracking is always set by pcmk__xml_mark_changes() + * before this function is called, so only the + * pcmk__xf_ignore_attr_pos check is truly relevant. */ mark_attr_moved(new_xml, (const char *) old_xml->name, old_attr, new_attr, old_pos, new_pos); @@ -1283,12 +1255,11 @@ mark_created_attrs(xmlNode *new_xml) xml_node_private_t *nodepriv = attr_iter->_private; attr_iter = attr_iter->next; - if (pcmk_is_set(nodepriv->flags, pcmk__xf_created)) { + if (pcmk__is_set(nodepriv->flags, pcmk__xf_created)) { const char *attr_name = (const char *) new_attr->name; - crm_trace("Created new attribute %s=%s in %s", - attr_name, pcmk__xml_attr_value(new_attr), - new_xml->name); + pcmk__trace("Created new attribute %s=%s in %s", attr_name, + pcmk__xml_attr_value(new_attr), new_xml->name); /* Check ACLs (we can't use the remove-then-create trick because it * would modify the attribute position). @@ -1313,159 +1284,364 @@ mark_created_attrs(xmlNode *new_xml) static void xml_diff_attrs(xmlNode *old_xml, xmlNode *new_xml) { - set_attrs_flag(new_xml, pcmk__xf_created); // cleared later if not really new + // Cleared later if attributes are not really new + for (xmlAttr *attr = pcmk__xe_first_attr(new_xml); attr != NULL; + attr = attr->next) { + xml_node_private_t *nodepriv = attr->_private; + + pcmk__set_xml_flags(nodepriv, pcmk__xf_created); + } + xml_diff_old_attrs(old_xml, new_xml); mark_created_attrs(new_xml); } /*! * \internal - * \brief Add an XML child element to a node, marked as deleted + * \brief Add a deleted object record for an old XML child if ACLs allow + * + * This is intended to be called for a child of an old XML element that is not + * present as a child of a new XML element. + * + * Add a temporary copy of the old child to the new XML. Then check whether ACLs + * would have allowed the deletion of that element. If so, add a deleted object + * record for it to the new XML's document, and set the \c pcmk__xf_skip flag on + * the old child. + * + * The temporary copy is removed before returning. The new XML and all of its + * ancestors will have the \c pcmk__xf_dirty flag set because of the creation, + * however. * - * When calculating XML changes, we need to know when a child element has been - * deleted. Add the child back to the new XML, so that we can check the removal - * against ACLs, and mark it as deleted for later removal after differences have - * been calculated. + * \param[in,out] old_child Child of old XML + * \param[in,out] new_parent New XML that does not contain \p old_child * - * \param[in,out] old_child Child element from original XML - * \param[in,out] new_parent New XML to add marked copy to + * \note The deletion is checked using the new XML's ACLs. The ACLs may have + * also changed between the old and new XML trees. Callers should take + * reasonable action if there were ACL changes that themselves would have + * been denied. */ static void mark_child_deleted(xmlNode *old_child, xmlNode *new_parent) { + int pos = pcmk__xml_position(old_child, pcmk__xf_skip); + // Re-create the child element so we can check ACLs xmlNode *candidate = pcmk__xml_copy(new_parent, old_child); // Clear flags on new child and its children pcmk__xml_tree_foreach(candidate, pcmk__xml_reset_node_flags, NULL); - // Check whether ACLs allow the deletion + // free_xml_with_position() will check whether ACLs allow the deletion pcmk__apply_acl(xmlDocGetRootElement(candidate->doc)); - // Remove the child again (which will track it in document's deleted_objs) - free_xml_with_position(candidate, - pcmk__xml_position(old_child, pcmk__xf_skip)); - - if (pcmk__xml_match(new_parent, old_child, true) == NULL) { - pcmk__set_xml_flags((xml_node_private_t *) (old_child->_private), - pcmk__xf_skip); + /* Try to remove the child again (which will track it in document's + * deleted_objs on success) + */ + if (free_xml_with_position(candidate, pos) != pcmk_rc_ok) { + // ACLs denied deletion in free_xml_with_position. Free candidate here. + pcmk__xml_free_node(candidate); } + + pcmk__set_xml_flags((xml_node_private_t *) old_child->_private, + pcmk__xf_skip); } +/*! + * \internal + * \brief Mark a new child as moved and set \c pcmk__xf_skip as appropriate + * + * \param[in,out] old_child Child of old XML + * \param[in,out] new_child Child of new XML that matches \p old_child + * \param[in] old_pos Position of \p old_child among its siblings + * \param[in] new_pos Position of \p new_child among its siblings + */ static void -mark_child_moved(xmlNode *old_child, xmlNode *new_parent, xmlNode *new_child, - int p_old, int p_new) +mark_child_moved(xmlNode *old_child, xmlNode *new_child, int old_pos, + int new_pos) { + const char *id_s = pcmk__s(pcmk__xe_id(new_child), ""); + xmlNode *new_parent = new_child->parent; xml_node_private_t *nodepriv = new_child->_private; - crm_trace("Child element %s with " - PCMK_XA_ID "='%s' moved from position %d to %d under %s", - new_child->name, pcmk__s(pcmk__xe_id(new_child), ""), - p_old, p_new, new_parent->name); + pcmk__trace("Child element %s with " PCMK_XA_ID "='%s' moved from position " + "%d to %d under %s", + new_child->name, id_s, old_pos, new_pos, new_parent->name); pcmk__mark_xml_node_dirty(new_parent); pcmk__set_xml_flags(nodepriv, pcmk__xf_moved); - if (p_old > p_new) { + /* @TODO Figure out and document why we skip the old child in future + * position calculations if the old position is higher, and skip the new + * child in future position calculations if the new position is higher. This + * goes back to 9bb15b38, and there's no explanation in the commit message. + */ + if (old_pos > new_pos) { nodepriv = old_child->_private; - } else { - nodepriv = new_child->_private; } pcmk__set_xml_flags(nodepriv, pcmk__xf_skip); } -// Given original and new XML, mark new XML portions that have changed -static void -mark_xml_changes(xmlNode *old_xml, xmlNode *new_xml, bool check_top) +/*! + * \internal + * \brief Check whether a new XML child comment matches an old XML child comment + * + * Two comments match if they have the same position among their siblings and + * the same contents. + * + * If \p new_comment has the \c pcmk__xf_skip flag set, then it is automatically + * considered not to match. + * + * \param[in] old_comment Old XML child element + * \param[in] new_comment New XML child element + * + * \retval \c true if \p new_comment matches \p old_comment + * \retval \c false otherwise + */ +static bool +new_comment_matches(const xmlNode *old_comment, const xmlNode *new_comment) { - xmlNode *old_child = NULL; - xmlNode *new_child = NULL; - xml_node_private_t *nodepriv = NULL; + xml_node_private_t *nodepriv = new_comment->_private; - CRM_CHECK(new_xml != NULL, return); - if (old_xml == NULL) { - mark_xml_tree_dirty_created(new_xml); - pcmk__apply_creation_acl(new_xml, check_top); - return; + if (pcmk__is_set(nodepriv->flags, pcmk__xf_skip)) { + /* @TODO Should we also return false if old_comment has pcmk__xf_skip + * set? This preserves existing behavior at time of writing. + */ + return false; + } + if (pcmk__xml_position(old_comment, pcmk__xf_skip) + != pcmk__xml_position(new_comment, pcmk__xf_skip)) { + return false; } + return pcmk__xc_matches(old_comment, new_comment); +} - nodepriv = new_xml->_private; - CRM_CHECK(nodepriv != NULL, return); +/*! + * \internal + * \brief Check whether a new XML child element matches an old XML child element + * + * Two elements match if they have the same name and, if \p match_ids is + * \c true, the same ID. (Both IDs can be \c NULL in this case.) + * + * \param[in] old_element Old XML child element + * \param[in] new_element New XML child element + * \param[in] match_ids If \c true, require IDs to match (or both to be + * \c NULL) + * + * \retval \c true if \p new_element matches \p old_element + * \retval \c false otherwise + */ +static bool +new_element_matches(const xmlNode *old_element, const xmlNode *new_element, + bool match_ids) +{ + if (!pcmk__xe_is(new_element, (const char *) old_element->name)) { + return false; + } + return !match_ids + || pcmk__str_eq(pcmk__xe_id(old_element), pcmk__xe_id(new_element), + pcmk__str_none); +} - if(nodepriv->flags & pcmk__xf_processed) { - /* Avoid re-comparing nodes */ - return; +/*! + * \internal + * \brief Check whether a new XML child node matches an old XML child node + * + * Node types must be the same in order to match. + * + * For comments, a match is a comment at the same position with the same + * content. + * + * For elements, a match is an element with the same name and, if required, the + * same ID. (Both IDs can be \c NULL in this case.) + * + * For other node types, there is no match. + * + * \param[in] old_child Child of old XML + * \param[in] new_child Child of new XML + * \param[in] match_ids If \c true, require element IDs to match (or both to be + * \c NULL) + * + * \retval \c true if \p new_child matches \p old_child + * \retval \c false otherwise + */ +static bool +new_child_matches(const xmlNode *old_child, const xmlNode *new_child, + bool match_ids) +{ + if (old_child->type != new_child->type) { + return false; } - pcmk__set_xml_flags(nodepriv, pcmk__xf_processed); - xml_diff_attrs(old_xml, new_xml); + switch (old_child->type) { + case XML_COMMENT_NODE: + return new_comment_matches(old_child, new_child); + case XML_ELEMENT_NODE: + return new_element_matches(old_child, new_child, match_ids); + default: + return false; + } +} - // Check for differences in the original children - for (old_child = pcmk__xml_first_child(old_xml); old_child != NULL; +/*! + * \internal + * \brief Find matching XML node pairs between old and new XML's children + * + * A node that is part of a matching pair has its _private:match member + * set to the matching node. + * + * \param[in,out] old_xml Old XML + * \param[in,out] new_xml New XML + * \param[in] comments_ids If \c true, match comments and require element + * IDs to match; otherwise, skip comments and match + * elements by name only + */ +static void +find_matching_children(xmlNode *old_xml, xmlNode *new_xml, bool comments_ids) +{ + for (xmlNode *old_child = pcmk__xml_first_child(old_xml); old_child != NULL; old_child = pcmk__xml_next(old_child)) { - new_child = pcmk__xml_match(new_xml, old_child, true); - - if (new_child != NULL) { - mark_xml_changes(old_child, new_child, true); + xml_node_private_t *old_nodepriv = old_child->_private; - } else { - mark_child_deleted(old_child, new_xml); + if ((old_nodepriv == NULL) || (old_nodepriv->match != NULL)) { + // Can't process, or we already found a match for this old child + continue; + } + if (!comments_ids && (old_child->type != XML_ELEMENT_NODE)) { + /* We only match comments and elements, and we're not matching + * comments during this call + */ + continue; } - } - - // Check for moved or created children - new_child = pcmk__xml_first_child(new_xml); - while (new_child != NULL) { - xmlNode *next = pcmk__xml_next(new_child); - - old_child = pcmk__xml_match(old_xml, new_child, true); - if (old_child == NULL) { - // This is a newly created child - nodepriv = new_child->_private; - pcmk__set_xml_flags(nodepriv, pcmk__xf_skip); + for (xmlNode *new_child = pcmk__xml_first_child(new_xml); + new_child != NULL; new_child = pcmk__xml_next(new_child)) { - // May free new_child - mark_xml_changes(old_child, new_child, true); + xml_node_private_t *new_nodepriv = new_child->_private; - } else { - /* Check for movement, we already checked for differences */ - int p_new = pcmk__xml_position(new_child, pcmk__xf_skip); - int p_old = pcmk__xml_position(old_child, pcmk__xf_skip); + if ((new_nodepriv == NULL) || (new_nodepriv->match != NULL)) { + /* Can't process, or this new child already matched some old + * child + */ + continue; + } - if(p_old != p_new) { - mark_child_moved(old_child, new_xml, new_child, p_old, p_new); + if (new_child_matches(old_child, new_child, comments_ids)) { + old_nodepriv->match = new_child; + new_nodepriv->match = old_child; + break; } } - - new_child = next; } } +/*! + * \internal + * \brief Mark changes between two XML trees + * + * Set flags in a new XML tree to indicate changes relative to an old XML tree. + * + * \param[in,out] old_xml XML before changes + * \param[in,out] new_xml XML after changes + * + * \note This may set \c pcmk__xf_skip on parts of \p old_xml. + */ void -xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml) +pcmk__xml_mark_changes(xmlNode *old_xml, xmlNode *new_xml) { - if (new_xml != NULL) { - pcmk__xml_doc_set_flags(new_xml->doc, pcmk__xf_lazy); + /* This function may set the xml_node_private_t:match member on children of + * old_xml and new_xml, but it clears that member before returning. + * + * @TODO Ensure we handle (for example, by copying) or reject user-created + * XML that is missing xml_node_private_t at top level or in any children. + * Similarly, check handling of node types for which we don't create private + * data. For now, we'll skip them in the loops below. + */ + CRM_CHECK((old_xml != NULL) && (new_xml != NULL), return); + if ((old_xml->_private == NULL) || (new_xml->_private == NULL)) { + return; } - xml_calculate_changes(old_xml, new_xml); -} -// Called functions may set the \p pcmk__xf_skip flag on parts of \p old_xml -void -xml_calculate_changes(xmlNode *old_xml, xmlNode *new_xml) -{ - CRM_CHECK((old_xml != NULL) && (new_xml != NULL) - && pcmk__xe_is(old_xml, (const char *) new_xml->name) - && pcmk__str_eq(pcmk__xe_id(old_xml), pcmk__xe_id(new_xml), - pcmk__str_none), - return); + pcmk__xml_doc_set_flags(new_xml->doc, pcmk__xf_tracking); + xml_diff_attrs(old_xml, new_xml); - if (!pcmk__xml_doc_all_flags_set(new_xml->doc, pcmk__xf_tracking)) { - xml_track_changes(new_xml, NULL, NULL, FALSE); + find_matching_children(old_xml, new_xml, true); + find_matching_children(old_xml, new_xml, false); + + // Process matches (changed children) and deletions + for (xmlNode *old_child = pcmk__xml_first_child(old_xml); old_child != NULL; + old_child = pcmk__xml_next(old_child)) { + + xml_node_private_t *nodepriv = old_child->_private; + xmlNode *new_child = NULL; + + if (nodepriv == NULL) { + continue; + } + + if (nodepriv->match == NULL) { + // No match in new XML means the old child was deleted + mark_child_deleted(old_child, new_xml); + continue; + } + + /* Fetch the match and clear old_child->_private's match member. + * new_child->_private's match member is handled in the new_xml loop. + */ + new_child = nodepriv->match; + nodepriv->match = NULL; + + pcmk__assert(old_child->type == new_child->type); + + if (old_child->type == XML_COMMENT_NODE) { + // Comments match only if their positions and contents match + continue; + } + + pcmk__xml_mark_changes(old_child, new_child); } - mark_xml_changes(old_xml, new_xml, FALSE); + /* Mark unmatched new children as created, and mark matched new children as + * moved if their positions changed. Grab the next new child in advance, + * since new_child may get freed in the loop body. + */ + for (xmlNode *new_child = pcmk__xml_first_child(new_xml), + *next = pcmk__xml_next(new_child); + new_child != NULL; + new_child = next, next = pcmk__xml_next(new_child)) { + + xml_node_private_t *nodepriv = new_child->_private; + + if (nodepriv == NULL) { + continue; + } + + if (nodepriv->match != NULL) { + /* Fetch the match and clear new_child->_private's match member. Any + * changes were marked in the old_xml loop. Mark the move. + * + * We might be able to mark the move earlier, when we mark changes + * for matches in the old_xml loop, consolidating both actions. We'd + * have to think about whether the timing of setting the + * pcmk__xf_skip flag makes any difference. + */ + xmlNode *old_child = nodepriv->match; + int old_pos = pcmk__xml_position(old_child, pcmk__xf_skip); + int new_pos = pcmk__xml_position(new_child, pcmk__xf_skip); + + if (old_pos != new_pos) { + mark_child_moved(old_child, new_child, old_pos, new_pos); + } + nodepriv->match = NULL; + continue; + } + + // No match in old XML means the new child is newly created + pcmk__set_xml_flags(nodepriv, pcmk__xf_skip); + mark_xml_tree_dirty_created(new_child); + + // Check whether creation was allowed (may free new_child) + pcmk__apply_creation_acl(new_child, true); + } } /*! @@ -1528,10 +1704,10 @@ pcmk__xml_artefact_root(enum pcmk__xml_artefact_ns ns) break; case pcmk__xml_artefact_ns_base_rng: case pcmk__xml_artefact_ns_base_xslt: - ret = crm_strdup_printf("%s/base", base); + ret = pcmk__assert_asprintf("%s/base", base); break; default: - crm_err("XML artefact family specified as %u not recognized", ns); + pcmk__err("XML artefact family specified as %u not recognized", ns); } return ret; } @@ -1545,21 +1721,21 @@ find_artefact(enum pcmk__xml_artefact_ns ns, const char *path, const char *files case pcmk__xml_artefact_ns_legacy_rng: case pcmk__xml_artefact_ns_base_rng: if (pcmk__ends_with(filespec, ".rng")) { - ret = crm_strdup_printf("%s/%s", path, filespec); + ret = pcmk__assert_asprintf("%s/%s", path, filespec); } else { - ret = crm_strdup_printf("%s/%s.rng", path, filespec); + ret = pcmk__assert_asprintf("%s/%s.rng", path, filespec); } break; case pcmk__xml_artefact_ns_legacy_xslt: case pcmk__xml_artefact_ns_base_xslt: if (pcmk__ends_with(filespec, ".xsl")) { - ret = crm_strdup_printf("%s/%s", path, filespec); + ret = pcmk__assert_asprintf("%s/%s", path, filespec); } else { - ret = crm_strdup_printf("%s/%s.xsl", path, filespec); + ret = pcmk__assert_asprintf("%s/%s.xsl", path, filespec); } break; default: - crm_err("XML artefact family specified as %u not recognized", ns); + pcmk__err("XML artefact family specified as %u not recognized", ns); } return ret; @@ -1656,5 +1832,77 @@ xml_document_dirty(xmlNode *xml) && pcmk__xml_doc_all_flags_set(xml->doc, pcmk__xf_dirty); } +void +xml_accept_changes(xmlNode *xml) +{ + if (xml != NULL) { + pcmk__xml_commit_changes(xml->doc); + } +} + +void +xml_track_changes(xmlNode *xml, const char *user, xmlNode *acl_source, + bool enforce_acls) +{ + if (xml == NULL) { + return; + } + + pcmk__xml_commit_changes(xml->doc); + pcmk__trace("Tracking changes%s to %p", (enforce_acls? " with ACLs" : ""), + xml); + pcmk__xml_doc_set_flags(xml->doc, pcmk__xf_tracking); + if (enforce_acls) { + if (acl_source == NULL) { + acl_source = xml; + } + pcmk__xml_doc_set_flags(xml->doc, pcmk__xf_acl_enabled); + pcmk__unpack_acl(acl_source, xml, user); + pcmk__apply_acl(xml); + } +} + +void +xml_calculate_changes(xmlNode *old_xml, xmlNode *new_xml) +{ + CRM_CHECK((old_xml != NULL) && (new_xml != NULL) + && pcmk__xe_is(old_xml, (const char *) new_xml->name) + && pcmk__str_eq(pcmk__xe_id(old_xml), pcmk__xe_id(new_xml), + pcmk__str_none), + return); + + if (!pcmk__xml_doc_all_flags_set(new_xml->doc, pcmk__xf_tracking)) { + // Ensure tracking has a clean start (pcmk__xml_mark_changes() enables) + pcmk__xml_commit_changes(new_xml->doc); + } + + pcmk__xml_mark_changes(old_xml, new_xml); +} + +void +xml_calculate_significant_changes(xmlNode *old_xml, xmlNode *new_xml) +{ + CRM_CHECK((old_xml != NULL) && (new_xml != NULL) + && pcmk__xe_is(old_xml, (const char *) new_xml->name) + && pcmk__str_eq(pcmk__xe_id(old_xml), pcmk__xe_id(new_xml), + pcmk__str_none), + return); + + /* BUG: If pcmk__xf_tracking is not set for new_xml when this function is + * called, then we unset pcmk__xf_ignore_attr_pos via + * pcmk__xml_commit_changes(). Since this function is about to be + * deprecated, it's not worth fixing this and changing the user-facing + * behavior. + */ + pcmk__xml_doc_set_flags(new_xml->doc, pcmk__xf_ignore_attr_pos); + + if (!pcmk__xml_doc_all_flags_set(new_xml->doc, pcmk__xf_tracking)) { + // Ensure tracking has a clean start (pcmk__xml_mark_changes() enables) + pcmk__xml_commit_changes(new_xml->doc); + } + + pcmk__xml_mark_changes(old_xml, new_xml); +} + // LCOV_EXCL_STOP // End deprecated API diff --git a/lib/common/xml_attr.c b/lib/common/xml_attr.c index 54f263a33de..8621053bc6a 100644 --- a/lib/common/xml_attr.c +++ b/lib/common/xml_attr.c @@ -54,8 +54,8 @@ pcmk__xa_remove(xmlAttr *attr, bool force) if (!force && !pcmk__check_acl(element, NULL, pcmk__xf_acl_write)) { // ACLs apply to element, not to particular attributes - crm_trace("ACLs prevent removal of attributes from %s element", - (const char *) element->name); + pcmk__trace("ACLs prevent removal of attributes from %s element", + element->name); return EPERM; } @@ -90,7 +90,7 @@ pcmk__marked_as_deleted(xmlAttrPtr a, void *user_data) { xml_node_private_t *nodepriv = a->_private; - if (pcmk_is_set(nodepriv->flags, pcmk__xf_deleted)) { + if (pcmk__is_set(nodepriv->flags, pcmk__xf_deleted)) { return true; } nodepriv->flags = pcmk__xf_none; @@ -117,7 +117,7 @@ pcmk__dump_xml_attr(const xmlAttr *attr, GString *buffer) } nodepriv = attr->_private; - if (nodepriv && pcmk_is_set(nodepriv->flags, pcmk__xf_deleted)) { + if ((nodepriv != NULL) && pcmk__is_set(nodepriv->flags, pcmk__xf_deleted)) { return; } diff --git a/lib/common/xml_comment.c b/lib/common/xml_comment.c index 2bc2848ef69..ae4443ca9f8 100644 --- a/lib/common/xml_comment.c +++ b/lib/common/xml_comment.c @@ -9,6 +9,7 @@ #include +#include // bool, false #include // NULL #include // xmlDoc, xmlNode, etc. @@ -41,44 +42,47 @@ pcmk__xc_create(xmlDoc *doc, const char *content) /*! * \internal - * \brief Find a comment with matching content in specified XML + * \brief Check whether two comments have matching content (case-insensitive) * - * \param[in] root XML to search - * \param[in] search_comment Comment whose content should be searched for - * \param[in] exact If true, comment must also be at same position + * \param[in] comment1 First comment node to compare + * \param[in] comment2 Second comment node to compare + * + * \return \c true if \p comment1 and \p comment2 have matching content (by + * case-insensitive string comparison), or \c false otherwise */ -xmlNode * -pcmk__xc_match(const xmlNode *root, const xmlNode *search_comment, bool exact) +bool +pcmk__xc_matches(const xmlNode *comment1, const xmlNode *comment2) { - xmlNode *a_child = NULL; - int search_offset = pcmk__xml_position(search_comment, pcmk__xf_skip); - - CRM_CHECK(search_comment->type == XML_COMMENT_NODE, return NULL); + pcmk__assert((comment1 != NULL) && (comment1->type == XML_COMMENT_NODE) + && (comment2 != NULL) && (comment2->type == XML_COMMENT_NODE)); - for (a_child = pcmk__xml_first_child(root); a_child != NULL; - a_child = pcmk__xml_next(a_child)) { - if (exact) { - int offset = pcmk__xml_position(a_child, pcmk__xf_skip); - xml_node_private_t *nodepriv = a_child->_private; + return pcmk__str_eq((const char *) comment1->content, + (const char *) comment2->content, pcmk__str_casei); +} - if (offset < search_offset) { - continue; +/*! + * \internal + * \brief Find a comment with matching content among children of specified XML + * + * \param[in] parent XML whose children to search + * \param[in] search Comment whose content should be searched for + * + * \return Matching comment, or \c NULL if no match is found + */ +static xmlNode * +match_xc_child(const xmlNode *parent, const xmlNode *search) +{ + pcmk__assert((search != NULL) && (search->type == XML_COMMENT_NODE)); - } else if (offset > search_offset) { - return NULL; - } + for (xmlNode *child = pcmk__xml_first_child(parent); child != NULL; + child = pcmk__xml_next(child)) { - if (pcmk_is_set(nodepriv->flags, pcmk__xf_skip)) { - continue; - } + if (child->type != XML_COMMENT_NODE) { + continue; } - if (a_child->type == XML_COMMENT_NODE - && pcmk__str_eq((const char *)a_child->content, (const char *)search_comment->content, pcmk__str_casei)) { - return a_child; - - } else if (exact) { - return NULL; + if (pcmk__xc_matches(child, search)) { + return child; } } @@ -103,7 +107,7 @@ pcmk__xc_update(xmlNode *parent, xmlNode *target, xmlNode *update) CRM_CHECK(update->type == XML_COMMENT_NODE, return); if (target == NULL) { - target = pcmk__xc_match(parent, update, false); + target = match_xc_child(parent, update); } if (target == NULL) { diff --git a/lib/common/xml_display.c b/lib/common/xml_display.c index d886d34c4bb..f8227376467 100644 --- a/lib/common/xml_display.c +++ b/lib/common/xml_display.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -59,8 +59,9 @@ static int show_xml_comment(pcmk__output_t *out, const xmlNode *data, int depth, uint32_t options) { - if (pcmk_is_set(options, pcmk__xml_fmt_open)) { - int width = pcmk_is_set(options, pcmk__xml_fmt_pretty)? (2 * depth) : 0; + if (pcmk__is_set(options, pcmk__xml_fmt_open)) { + int width = + pcmk__is_set(options, pcmk__xml_fmt_pretty)? (2 * depth) : 0; return out->info(out, "%*s", width, "", (const char *) data->content); @@ -91,11 +92,11 @@ static int show_xml_element(pcmk__output_t *out, GString *buffer, const char *prefix, const xmlNode *data, int depth, uint32_t options) { - int spaces = pcmk_is_set(options, pcmk__xml_fmt_pretty)? (2 * depth) : 0; + int spaces = pcmk__is_set(options, pcmk__xml_fmt_pretty)? (2 * depth) : 0; int rc = pcmk_rc_no_output; - if (pcmk_is_set(options, pcmk__xml_fmt_open)) { - const char *hidden = crm_element_value(data, PCMK__XA_HIDDEN); + if (pcmk__is_set(options, pcmk__xml_fmt_open)) { + const char *hidden = pcmk__xe_get(data, PCMK__XA_HIDDEN); g_string_truncate(buffer, 0); @@ -111,7 +112,8 @@ show_xml_element(pcmk__output_t *out, GString *buffer, const char *prefix, const char *p_value = pcmk__xml_attr_value(attr); gchar *p_copy = NULL; - if (pcmk_is_set(nodepriv->flags, pcmk__xf_deleted)) { + if ((nodepriv == NULL) + || pcmk__is_set(nodepriv->flags, pcmk__xf_deleted)) { continue; } @@ -131,7 +133,7 @@ show_xml_element(pcmk__output_t *out, GString *buffer, const char *prefix, } if ((data->children != NULL) - && pcmk_is_set(options, pcmk__xml_fmt_children)) { + && pcmk__is_set(options, pcmk__xml_fmt_children)) { g_string_append_c(buffer, '>'); } else { @@ -147,7 +149,7 @@ show_xml_element(pcmk__output_t *out, GString *buffer, const char *prefix, return rc; } - if (pcmk_is_set(options, pcmk__xml_fmt_children)) { + if (pcmk__is_set(options, pcmk__xml_fmt_children)) { for (const xmlNode *child = pcmk__xml_first_child(data); child != NULL; child = pcmk__xml_next(child)) { @@ -159,7 +161,7 @@ show_xml_element(pcmk__output_t *out, GString *buffer, const char *prefix, } } - if (pcmk_is_set(options, pcmk__xml_fmt_close)) { + if (pcmk__is_set(options, pcmk__xml_fmt_close)) { int temp_rc = out->info(out, "%s%s%*s", pcmk__s(prefix, ""), pcmk__str_empty(prefix)? "" : " ", @@ -265,7 +267,11 @@ show_xml_changes_recursive(pcmk__output_t *out, const xmlNode *data, int depth, int rc = pcmk_rc_no_output; int temp_rc = pcmk_rc_no_output; - if (pcmk_all_flags_set(nodepriv->flags, pcmk__xf_dirty|pcmk__xf_created)) { + if (nodepriv == NULL) { + return pcmk_rc_no_output; + } + + if (pcmk__all_flags_set(nodepriv->flags, pcmk__xf_dirty|pcmk__xf_created)) { // Newly created return pcmk__xml_show(out, PCMK__XML_PREFIX_CREATED, data, depth, options @@ -274,13 +280,13 @@ show_xml_changes_recursive(pcmk__output_t *out, const xmlNode *data, int depth, |pcmk__xml_fmt_close); } - if (pcmk_is_set(nodepriv->flags, pcmk__xf_dirty)) { + if (pcmk__is_set(nodepriv->flags, pcmk__xf_dirty)) { // Modified or moved - bool pretty = pcmk_is_set(options, pcmk__xml_fmt_pretty); + bool pretty = pcmk__is_set(options, pcmk__xml_fmt_pretty); int spaces = pretty? (2 * depth) : 0; const char *prefix = PCMK__XML_PREFIX_MODIFIED; - if (pcmk_is_set(nodepriv->flags, pcmk__xf_moved)) { + if (pcmk__is_set(nodepriv->flags, pcmk__xf_moved)) { prefix = PCMK__XML_PREFIX_MOVED; } @@ -295,23 +301,23 @@ show_xml_changes_recursive(pcmk__output_t *out, const xmlNode *data, int depth, nodepriv = attr->_private; - if (pcmk_is_set(nodepriv->flags, pcmk__xf_deleted)) { + if (pcmk__is_set(nodepriv->flags, pcmk__xf_deleted)) { const char *value = pcmk__xml_attr_value(attr); temp_rc = out->info(out, "%s %*s @%s=%s", PCMK__XML_PREFIX_DELETED, spaces, "", name, value); - } else if (pcmk_is_set(nodepriv->flags, pcmk__xf_dirty)) { + } else if (pcmk__is_set(nodepriv->flags, pcmk__xf_dirty)) { const char *value = pcmk__xml_attr_value(attr); - if (pcmk_is_set(nodepriv->flags, pcmk__xf_created)) { + if (pcmk__is_set(nodepriv->flags, pcmk__xf_created)) { prefix = PCMK__XML_PREFIX_CREATED; - } else if (pcmk_is_set(nodepriv->flags, pcmk__xf_modified)) { + } else if (pcmk__is_set(nodepriv->flags, pcmk__xf_modified)) { prefix = PCMK__XML_PREFIX_MODIFIED; - } else if (pcmk_is_set(nodepriv->flags, pcmk__xf_moved)) { + } else if (pcmk__is_set(nodepriv->flags, pcmk__xf_moved)) { prefix = PCMK__XML_PREFIX_MOVED; } else { @@ -368,7 +374,7 @@ pcmk__xml_show_changes(pcmk__output_t *out, const xmlNode *xml) pcmk__assert((out != NULL) && (xml != NULL) && (xml->doc != NULL)); docpriv = xml->doc->_private; - if (!pcmk_is_set(docpriv->flags, pcmk__xf_dirty)) { + if (!pcmk__is_set(docpriv->flags, pcmk__xf_dirty)) { return rc; } diff --git a/lib/common/xml_element.c b/lib/common/xml_element.c index 2361f8ff645..1b296cd402a 100644 --- a/lib/common/xml_element.c +++ b/lib/common/xml_element.c @@ -21,8 +21,8 @@ #include // xmlChar #include -#include // crm_xml_add(), etc. #include // pcmk_rc_ok, etc. +#include // pcmk_parse_score() #include #include "crmcommon_private.h" @@ -68,7 +68,7 @@ pcmk__xe_first_child(const xmlNode *parent, const char *node_name, return child; } - value = crm_element_value(child, attr_n); + value = pcmk__xe_get(child, attr_n); if ((attr_v == NULL) && (value != NULL)) { // attr_v == NULL: Attribute attr_n must be set (to any value) @@ -81,12 +81,11 @@ pcmk__xe_first_child(const xmlNode *parent, const char *node_name, } if (attr_n == NULL) { - crm_trace("%s XML has no child element of %s type", - (const char *) parent->name, pcmk__s(node_name, "any")); + pcmk__trace("%s XML has no child element of %s type", parent->name, + pcmk__s(node_name, "any")); } else { - crm_trace("%s XML has no child element of %s type with %s='%s'", - (const char *) parent->name, pcmk__s(node_name, "any"), - attr_n, attr_v); + pcmk__trace("%s XML has no child element of %s type with %s='%s'", + parent->name, pcmk__s(node_name, "any"), attr_n, attr_v); } return NULL; } @@ -133,7 +132,7 @@ pcmk__xe_get_score(const xmlNode *xml, const char *name, int *score, const char *value = NULL; CRM_CHECK((xml != NULL) && (name != NULL), return EINVAL); - value = crm_element_value(xml, name); + value = pcmk__xe_get(xml, name); return pcmk_parse_score(value, score, default_score); } @@ -180,7 +179,7 @@ pcmk__xe_set_score(xmlNode *target, const char *name, const char *value) return pcmk_rc_ok; } - old_value = crm_element_value(target, name); + old_value = pcmk__xe_get(target, name); // If no previous value, skip to default case and set the value unexpanded. if (old_value != NULL) { @@ -204,8 +203,9 @@ pcmk__xe_set_score(xmlNode *target, const char *name, const char *value) rc = pcmk_parse_score(old_value, &old_value_i, 0); if (rc != pcmk_rc_ok) { // @TODO This is inconsistent with old_value==NULL - crm_trace("Using 0 before incrementing %s because '%s' " - "is not a score", name, old_value); + pcmk__trace("Using 0 before incrementing %s because '%s' " + "is not a score", + name, old_value); } } @@ -216,19 +216,20 @@ pcmk__xe_set_score(xmlNode *target, const char *name, const char *value) rc = pcmk_parse_score(++v, &add, 0); if (rc != pcmk_rc_ok) { // @TODO We should probably skip expansion instead - crm_trace("Not incrementing %s because '%s' does not have " - "a valid increment", name, value); + pcmk__trace("Not incrementing %s because '%s' does not " + "have a valid increment", + name, value); } } - crm_xml_add_int(target, name, pcmk__add_scores(old_value_i, add)); + pcmk__xe_set_int(target, name, pcmk__add_scores(old_value_i, add)); return pcmk_rc_ok; } } // Default case: set the attribute unexpanded (with value treated literally) if (old_value != value) { - crm_xml_add(target, name, value); + pcmk__xe_set(target, name, value); } return pcmk_rc_ok; } @@ -257,15 +258,15 @@ pcmk__xe_copy_attrs(xmlNode *target, const xmlNode *src, uint32_t flags) const char *name = (const char *) attr->name; const char *value = pcmk__xml_attr_value(attr); - if (pcmk_is_set(flags, pcmk__xaf_no_overwrite) - && (crm_element_value(target, name) != NULL)) { + if (pcmk__is_set(flags, pcmk__xaf_no_overwrite) + && (pcmk__xe_get(target, name) != NULL)) { continue; } - if (pcmk_is_set(flags, pcmk__xaf_score_update)) { + if (pcmk__is_set(flags, pcmk__xaf_score_update)) { pcmk__xe_set_score(target, name, value); } else { - crm_xml_add(target, name, value); + pcmk__xe_set(target, name, value); } } @@ -510,7 +511,7 @@ pcmk__xe_set_id(xmlNode *node, const char *format, ...) if (!xmlValidateNameValue((const xmlChar *) id)) { pcmk__xml_sanitize_id(id); } - crm_xml_add(node, PCMK_XA_ID, id); + pcmk__xe_set(node, PCMK_XA_ID, id); free(id); } @@ -526,12 +527,11 @@ const char * pcmk__xe_add_last_written(xmlNode *xe) { char *now_s = pcmk__epoch2str(NULL, 0); - const char *result = NULL; - result = crm_xml_add(xe, PCMK_XA_CIB_LAST_WRITTEN, - pcmk__s(now_s, "Could not determine current time")); + pcmk__xe_set(xe, PCMK_XA_CIB_LAST_WRITTEN, + pcmk__s(now_s, "Could not determine current time")); free(now_s); - return result; + return pcmk__xe_get(xe, PCMK_XA_CIB_LAST_WRITTEN); } /*! @@ -575,8 +575,8 @@ update_xe(xmlNode *parent, xmlNode *target, xmlNode *update, uint32_t flags) const char *update_id_val = NULL; char *trace_s = NULL; - crm_log_xml_trace(update, "update"); - crm_log_xml_trace(target, "target"); + pcmk__log_xml_trace(update, "update"); + pcmk__log_xml_trace(target, "target"); CRM_CHECK(update != NULL, goto done); @@ -595,7 +595,7 @@ update_xe(xmlNode *parent, xmlNode *target, xmlNode *update, uint32_t flags) update_id_attr = PCMK_XA_ID; } else { - update_id_val = crm_element_value(update, PCMK_XA_ID_REF); + update_id_val = pcmk__xe_get(update, PCMK_XA_ID_REF); if (update_id_val != NULL) { update_id_attr = PCMK_XA_ID_REF; } @@ -604,11 +604,11 @@ update_xe(xmlNode *parent, xmlNode *target, xmlNode *update, uint32_t flags) pcmk__if_tracing( { if (update_id_attr != NULL) { - trace_s = crm_strdup_printf("<%s %s=%s/>", - update_name, update_id_attr, - update_id_val); + trace_s = pcmk__assert_asprintf("<%s %s=%s/>", + update_name, update_id_attr, + update_id_val); } else { - trace_s = crm_strdup_printf("<%s/>", update_name); + trace_s = pcmk__assert_asprintf("<%s/>", update_name); } }, {} @@ -623,11 +623,11 @@ update_xe(xmlNode *parent, xmlNode *target, xmlNode *update, uint32_t flags) if (target == NULL) { // Recursive call with no existing matching child target = pcmk__xe_create(parent, update_name); - crm_trace("Added %s", pcmk__s(trace_s, update_name)); + pcmk__trace("Added %s", pcmk__s(trace_s, update_name)); } else { // Either recursive call with match, or top-level call - crm_trace("Found node %s to update", pcmk__s(trace_s, update_name)); + pcmk__trace("Found node %s to update", pcmk__s(trace_s, update_name)); } CRM_CHECK(pcmk__xe_is(target, (const char *) update->name), return); @@ -637,11 +637,11 @@ update_xe(xmlNode *parent, xmlNode *target, xmlNode *update, uint32_t flags) for (xmlNode *child = pcmk__xml_first_child(update); child != NULL; child = pcmk__xml_next(child)) { - crm_trace("Updating child of %s", pcmk__s(trace_s, update_name)); + pcmk__trace("Updating child of %s", pcmk__s(trace_s, update_name)); update_xe(target, NULL, child, flags); } - crm_trace("Finished with %s", pcmk__s(trace_s, update_name)); + pcmk__trace("Finished with %s", pcmk__s(trace_s, update_name)); done: free(trace_s); @@ -679,7 +679,7 @@ delete_xe_if_matching(xmlNode *xml, void *user_data) attr = attr->next) { const char *search_val = pcmk__xml_attr_value(attr); - const char *xml_val = crm_element_value(xml, (const char *) attr->name); + const char *xml_val = pcmk__xe_get(xml, (const char *) attr->name); if (!pcmk__str_eq(search_val, xml_val, pcmk__str_casei)) { // No match: an attr in xml doesn't match the attr in search @@ -687,8 +687,8 @@ delete_xe_if_matching(xmlNode *xml, void *user_data) } } - crm_log_xml_trace(xml, "delete-match"); - crm_log_xml_trace(search, "delete-search"); + pcmk__log_xml_trace(xml, "delete-match"); + pcmk__log_xml_trace(search, "delete-search"); pcmk__xml_free(xml); // Found a match and deleted it; stop traversing tree @@ -760,7 +760,7 @@ replace_node(xmlNode *old, xmlNode *new) // Replaced sections may have included relevant ACLs pcmk__apply_acl(new); } - xml_calculate_changes(old, new); + pcmk__xml_mark_changes(old, new); pcmk__xml_free_node(old); } @@ -803,8 +803,8 @@ replace_xe_if_matching(xmlNode *xml, void *user_data) return true; } - crm_log_xml_trace(xml, "replace-match"); - crm_log_xml_trace(replace, "replace-with"); + pcmk__log_xml_trace(xml, "replace-match"); + pcmk__log_xml_trace(replace, "replace-with"); replace_node(xml, replace); // Found a match and replaced it; stop traversing tree @@ -895,8 +895,8 @@ update_xe_if_matching(xmlNode *xml, void *user_data) return true; } - crm_log_xml_trace(xml, "update-match"); - crm_log_xml_trace(update, "update-with"); + pcmk__log_xml_trace(xml, "update-match"); + pcmk__log_xml_trace(update, "update-with"); update_xe(NULL, xml, update, data->flags); // Found a match and replaced it; stop traversing tree @@ -960,9 +960,7 @@ pcmk__xe_set_propv(xmlNodePtr node, va_list pairs) } value = va_arg(pairs, const char *); - if (value != NULL) { - crm_xml_add(node, name, value); - } + pcmk__xe_set(node, name, value); } } @@ -1002,234 +1000,98 @@ pcmk__xe_foreach_child(xmlNode *xml, const char *child_element_name, // XML attribute handling /*! - * \brief Create an XML attribute with specified name and value + * \internal + * \brief Retrieve the value of an XML attribute * - * \param[in,out] node XML node to modify - * \param[in] name Attribute name to set - * \param[in] value Attribute value to set + * \param[in] xml XML element whose attribute to get + * \param[in] attr_name Attribute name * - * \return New value on success, \c NULL otherwise - * \note This does nothing if node, name, or value are \c NULL or empty. + * \return Value of specified attribute (may be \c NULL) */ const char * -crm_xml_add(xmlNode *node, const char *name, const char *value) +pcmk__xe_get(const xmlNode *xml, const char *attr_name) { - // @TODO Replace with internal function that returns the new attribute - bool dirty = FALSE; xmlAttr *attr = NULL; - CRM_CHECK(node != NULL, return NULL); - CRM_CHECK(name != NULL, return NULL); - - if (value == NULL) { - return NULL; - } - - if (pcmk__xml_doc_all_flags_set(node->doc, pcmk__xf_tracking)) { - const char *old = crm_element_value(node, name); - - if (old == NULL || value == NULL || strcmp(old, value) != 0) { - dirty = TRUE; - } - } + CRM_CHECK((xml != NULL) && (attr_name != NULL), return NULL); - if (dirty && (pcmk__check_acl(node, name, pcmk__xf_acl_create) == FALSE)) { - crm_trace("Cannot add %s=%s to %s", name, value, node->name); + attr = xmlHasProp(xml, (const xmlChar *) attr_name); + if ((attr == NULL) || (attr->children == NULL)) { return NULL; } - attr = xmlSetProp(node, (const xmlChar *) name, (const xmlChar *) value); - - /* If the attribute already exists, this does nothing. Attribute values - * don't get private data. - */ - pcmk__xml_new_private_data((xmlNode *) attr); - - if (dirty) { - pcmk__mark_xml_attr_dirty(attr); - } - - CRM_CHECK(attr && attr->children && attr->children->content, return NULL); - return (char *)attr->children->content; + return (const char *) attr->children->content; } - /*! - * \brief Create an XML attribute with specified name and integer value - * - * This is like \c crm_xml_add() but taking an integer value. - * - * \param[in,out] node XML node to modify - * \param[in] name Attribute name to set - * \param[in] value Attribute value to set + * \internal + * \brief Set an XML attribute value * - * \return New value as string on success, \c NULL otherwise - * \note This does nothing if node or name are \c NULL or empty. - */ -const char * -crm_xml_add_int(xmlNode *node, const char *name, int value) -{ - char *number = pcmk__itoa(value); - const char *added = crm_xml_add(node, name, number); - - free(number); - return added; -} - -/*! - * \brief Create an XML attribute with specified name and unsigned value + * This also performs change tracking if enabled and checks ACLs if enabled. + * Upon ACL denial, the attribute is not updated. * - * This is like \c crm_xml_add() but taking a guint value. + * \param[in,out] xml XML element whose attribute to set + * \param[in] attr_name Attribute name + * \param[in] value Attribute value to set * - * \param[in,out] node XML node to modify - * \param[in] name Attribute name to set - * \param[in] ms Attribute value to set + * \return Standard Pacemaker return code * - * \return New value as string on success, \c NULL otherwise - * \note This does nothing if node or name are \c NULL or empty. + * \note This does nothing and returns \c pcmk_rc_ok if \p value is \c NULL. */ -const char * -crm_xml_add_ms(xmlNode *node, const char *name, guint ms) +int +pcmk__xe_set(xmlNode *xml, const char *attr_name, const char *value) { - char *number = crm_strdup_printf("%u", ms); - const char *added = crm_xml_add(node, name, number); - - free(number); - return added; -} - -// Maximum size of null-terminated string representation of 64-bit integer -// -9223372036854775808 -#define LLSTRSIZE 21 + bool dirty = false; + xmlAttr *attr = NULL; -/*! - * \brief Create an XML attribute with specified name and long long int value - * - * This is like \c crm_xml_add() but taking a long long int value. It is a - * useful equivalent for defined types like time_t, etc. - * - * \param[in,out] xml XML node to modify - * \param[in] name Attribute name to set - * \param[in] value Attribute value to set - * - * \return New value as string on success, \c NULL otherwise - * \note This does nothing if xml or name are \c NULL or empty. - * This does not support greater than 64-bit values. - */ -const char * -crm_xml_add_ll(xmlNode *xml, const char *name, long long value) -{ - char s[LLSTRSIZE] = { '\0', }; + CRM_CHECK((xml != NULL) && (attr_name != NULL), return EINVAL); - if (snprintf(s, LLSTRSIZE, "%lld", (long long) value) == LLSTRSIZE) { - return NULL; + if (value == NULL) { + return pcmk_rc_ok; } - return crm_xml_add(xml, name, s); -} -/*! - * \brief Create XML attributes for seconds and microseconds - * - * This is like \c crm_xml_add() but taking a struct timeval. - * - * \param[in,out] xml XML node to modify - * \param[in] name_sec Name of XML attribute for seconds - * \param[in] name_usec Name of XML attribute for microseconds (or NULL) - * \param[in] value Time value to set - * - * \return New seconds value as string on success, \c NULL otherwise - * \note This does nothing if xml, name_sec, or value is \c NULL. - */ -const char * -crm_xml_add_timeval(xmlNode *xml, const char *name_sec, const char *name_usec, - const struct timeval *value) -{ - const char *added = NULL; + /* @TODO Can we return early if dirty is false? Or does anything rely on + * "cleanly" resetting the value? If so, try to preserve existing behavior + * for public API functions that depend on this. + */ + if (pcmk__xml_doc_all_flags_set(xml->doc, pcmk__xf_tracking)) { + const char *old_value = pcmk__xe_get(xml, attr_name); - if (xml && name_sec && value) { - added = crm_xml_add_ll(xml, name_sec, (long long) value->tv_sec); - if (added && name_usec) { - // Any error is ignored (we successfully added seconds) - crm_xml_add_ll(xml, name_usec, (long long) value->tv_usec); + if (!pcmk__str_eq(old_value, value, pcmk__str_none)) { + dirty = true; } } - return added; -} - -/*! - * \brief Retrieve the value of an XML attribute - * - * \param[in] data XML node to check - * \param[in] name Attribute name to check - * - * \return Value of specified attribute (may be \c NULL) - */ -const char * -crm_element_value(const xmlNode *data, const char *name) -{ - xmlAttr *attr = NULL; - - if (data == NULL) { - crm_err("Couldn't find %s in NULL", name ? name : ""); - CRM_LOG_ASSERT(data != NULL); - return NULL; - } else if (name == NULL) { - crm_err("Couldn't find NULL in %s", data->name); - return NULL; + if (dirty && !pcmk__check_acl(xml, attr_name, pcmk__xf_acl_create)) { + pcmk__trace("Cannot add %s=%s to %s", attr_name, value, xml->name); + return EACCES; } - attr = xmlHasProp(data, (const xmlChar *) name); - if (!attr || !attr->children) { - return NULL; - } - return (const char *) attr->children->content; -} + attr = xmlSetProp(xml, (const xmlChar *) attr_name, + (const xmlChar *) value); -/*! - * \brief Retrieve the integer value of an XML attribute - * - * This is like \c crm_element_value() but getting the value as an integer. - * - * \param[in] data XML node to check - * \param[in] name Attribute name to check - * \param[out] dest Where to store element value - * - * \return 0 on success, -1 otherwise - */ -int -crm_element_value_int(const xmlNode *data, const char *name, int *dest) -{ - const char *value = NULL; + // These should never be NULL -- out of memory? + CRM_CHECK((attr != NULL) && (attr->children != NULL) + && (attr->children->content != NULL), + xmlRemoveProp(attr); return ENXIO); - CRM_CHECK(dest != NULL, return -1); - value = crm_element_value(data, name); - if (value) { - long long value_ll; - int rc = pcmk__scan_ll(value, &value_ll, 0LL); + /* If the attribute already exists, this does nothing. Attribute values + * don't get private data. + */ + pcmk__xml_new_private_data((xmlNode *) attr); - *dest = PCMK__PARSE_INT_DEFAULT; - if (rc != pcmk_rc_ok) { - crm_warn("Using default for %s " - "because '%s' is not a valid integer: %s", - name, value, pcmk_rc_str(rc)); - } else if ((value_ll < INT_MIN) || (value_ll > INT_MAX)) { - crm_warn("Using default for %s because '%s' is out of range", - name, value); - } else { - *dest = (int) value_ll; - return 0; - } + if (dirty) { + pcmk__mark_xml_attr_dirty(attr); } - return -1; + + return pcmk_rc_ok; } /*! * \internal * \brief Retrieve a flag group from an XML attribute value * - * This is like \c crm_element_value() except getting the value as a 32-bit - * unsigned integer. + * This is like \c pcmk__xe_get() but returns the value as a \c uint32_t. * * \param[in] xml XML node to check * \param[in] name Attribute name to check (must not be NULL) @@ -1257,7 +1119,7 @@ pcmk__xe_get_flags(const xmlNode *xml, const char *name, uint32_t *dest, if (xml == NULL) { return pcmk_rc_ok; } - value = crm_element_value(xml, name); + value = pcmk__xe_get(xml, name); if (value == NULL) { return pcmk_rc_ok; } @@ -1277,157 +1139,322 @@ pcmk__xe_get_flags(const xmlNode *xml, const char *name, uint32_t *dest, } /*! - * \brief Retrieve the long long integer value of an XML attribute + * \internal + * \brief Retrieve a \c guint value from an XML attribute * - * This is like \c crm_element_value() but getting the value as a long long int. + * This is like \c pcmk__xe_get() but returns the value as a \c guint. * - * \param[in] data XML node to check - * \param[in] name Attribute name to check - * \param[out] dest Where to store element value + * \param[in] xml XML element whose attribute to get + * \param[in] attr Attribute name + * \param[out] dest Where to store attribute value (unchanged on error) * - * \return 0 on success, -1 otherwise + * \return Standard Pacemaker return code */ int -crm_element_value_ll(const xmlNode *data, const char *name, long long *dest) +pcmk__xe_get_guint(const xmlNode *xml, const char *attr, guint *dest) { - const char *value = NULL; + long long value_ll = 0; + int rc = pcmk_rc_ok; - CRM_CHECK(dest != NULL, return -1); - value = crm_element_value(data, name); - if (value != NULL) { - int rc = pcmk__scan_ll(value, dest, PCMK__PARSE_INT_DEFAULT); + CRM_CHECK((xml != NULL) && (attr != NULL) && (dest != NULL), return EINVAL); - if (rc == pcmk_rc_ok) { - return 0; - } - crm_warn("Using default for %s " - "because '%s' is not a valid integer: %s", - name, value, pcmk_rc_str(rc)); + rc = pcmk__xe_get_ll(xml, attr, &value_ll); + if (rc != pcmk_rc_ok) { + return rc; } - return -1; + + if ((value_ll < 0) || (value_ll > G_MAXUINT)) { + return ERANGE; + } + *dest = (guint) value_ll; + return pcmk_rc_ok; +} + +/*! + * \internal + * \brief Set an XML attribute using a \c guint value + * + * This is like \c pcmk__xe_set() but takes a \c guint. + * + * \param[in,out] xml XML node to modify + * \param[in] attr Attribute name + * \param[in] value Attribute value to set + */ +void +pcmk__xe_set_guint(xmlNode *xml, const char *attr, guint value) +{ + char *value_s = NULL; + + CRM_CHECK((xml != NULL) && (attr != NULL), return); + + value_s = pcmk__assert_asprintf("%u", value); + pcmk__xe_set(xml, attr, value_s); + free(value_s); } /*! - * \brief Retrieve the millisecond value of an XML attribute + * \internal + * \brief Retrieve an \c int value from an XML attribute * - * This is like \c crm_element_value() but returning the value as a guint. + * This is like \c pcmk__xe_get() but returns the value as an \c int. * - * \param[in] data XML node to check - * \param[in] name Attribute name to check - * \param[out] dest Where to store attribute value + * \param[in] xml XML element whose attribute to get + * \param[in] attr Attribute name + * \param[out] dest Where to store element value (unchanged on error) * - * \return \c pcmk_ok on success, -1 otherwise + * \return Standard Pacemaker return code */ int -crm_element_value_ms(const xmlNode *data, const char *name, guint *dest) +pcmk__xe_get_int(const xmlNode *xml, const char *attr, int *dest) { - const char *value = NULL; - long long value_ll; + long long value_ll = 0; int rc = pcmk_rc_ok; - CRM_CHECK(dest != NULL, return -1); - *dest = 0; - value = crm_element_value(data, name); - rc = pcmk__scan_ll(value, &value_ll, 0LL); + CRM_CHECK((xml != NULL) && (attr != NULL) && (dest != NULL), return EINVAL); + + rc = pcmk__xe_get_ll(xml, attr, &value_ll); if (rc != pcmk_rc_ok) { - crm_warn("Using default for %s " - "because '%s' is not valid milliseconds: %s", - name, value, pcmk_rc_str(rc)); - return -1; + return rc; } - if ((value_ll < 0) || (value_ll > G_MAXUINT)) { - crm_warn("Using default for %s because '%s' is out of range", - name, value); - return -1; + + if ((value_ll < INT_MIN) || (value_ll > INT_MAX)) { + return ERANGE; } - *dest = (guint) value_ll; - return pcmk_ok; + + *dest = (int) value_ll; + return pcmk_rc_ok; } /*! - * \brief Retrieve the seconds-since-epoch value of an XML attribute - * - * This is like \c crm_element_value() but returning the value as a time_t. + * \internal + * \brief Set an XML attribute using an \c int value. * - * \param[in] xml XML node to check - * \param[in] name Attribute name to check - * \param[out] dest Where to store attribute value + * This is like \c pcmk__xe_set() but takes an \c int. * - * \return \c pcmk_ok on success, -1 otherwise + * \param[in,out] xml XML node to modify + * \param[in] attr Attribute name + * \param[in] value Attribute value to set */ -int -crm_element_value_epoch(const xmlNode *xml, const char *name, time_t *dest) +void +pcmk__xe_set_int(xmlNode *xml, const char *attr, int value) { - long long value_ll = 0; + char *value_s = NULL; - if (crm_element_value_ll(xml, name, &value_ll) < 0) { - return -1; - } + CRM_CHECK((xml != NULL) && (attr != NULL), return); - /* Unfortunately, we can't do any bounds checking, since time_t has neither - * standardized bounds nor constants defined for them. - */ - *dest = (time_t) value_ll; - return pcmk_ok; + value_s = pcmk__itoa(value); + pcmk__xe_set(xml, attr, value_s); + free(value_s); } /*! - * \brief Retrieve the value of XML second/microsecond attributes as time + * \internal + * \brief Retrieve a long long value from an XML attribute * - * This is like \c crm_element_value() but returning value as a struct timeval. + * This is like \c pcmk__xe_get() but returns the value as a long long. * - * \param[in] xml XML to parse - * \param[in] name_sec Name of XML attribute for seconds - * \param[in] name_usec Name of XML attribute for microseconds - * \param[out] dest Where to store result + * \param[in] xml XML element whose attribute to get + * \param[in] attr Attribute name + * \param[out] dest Where to store element value (unchanged on error) * - * \return \c pcmk_ok on success, -errno on error - * \note Values default to 0 if XML or XML attribute does not exist + * \return Standard Pacemaker return code */ int -crm_element_value_timeval(const xmlNode *xml, const char *name_sec, - const char *name_usec, struct timeval *dest) +pcmk__xe_get_ll(const xmlNode *xml, const char *attr, long long *dest) { - long long value_i = 0; - - CRM_CHECK(dest != NULL, return -EINVAL); - dest->tv_sec = 0; - dest->tv_usec = 0; - - if (xml == NULL) { - return pcmk_ok; - } + const char *value = NULL; + long long value_ll = 0; + int rc = pcmk_rc_ok; - /* Unfortunately, we can't do any bounds checking, since there are no - * constants provided for the bounds of time_t and suseconds_t, and - * calculating them isn't worth the effort. If there are XML values - * beyond the native sizes, there will probably be worse problems anyway. - */ + CRM_CHECK((xml != NULL) && (attr != NULL) && (dest != NULL), return EINVAL); - // Parse seconds - errno = 0; - if (crm_element_value_ll(xml, name_sec, &value_i) < 0) { - return -errno; + value = pcmk__xe_get(xml, attr); + if (value == NULL) { + return ENXIO; } - dest->tv_sec = (time_t) value_i; - // Parse microseconds - if (crm_element_value_ll(xml, name_usec, &value_i) < 0) { - return -errno; + rc = pcmk__scan_ll(value, &value_ll, PCMK__PARSE_INT_DEFAULT); + if (rc != pcmk_rc_ok) { + return rc; } - dest->tv_usec = (suseconds_t) value_i; - return pcmk_ok; + *dest = value_ll; + return pcmk_rc_ok; } /*! * \internal - * \brief Get a date/time object from an XML attribute value + * \brief Set an XML attribute using a long long value * - * \param[in] xml XML with attribute to parse (from CIB) - * \param[in] attr Name of attribute to parse - * \param[out] t Where to create date/time object - * (\p *t must be NULL initially) + * This is like \c pcmk__xe_set() but takes a long long. + * + * \param[in,out] xml XML node to modify + * \param[in] attr Attribute name + * \param[in] value Attribute value to set + * + * \return Standard Pacemaker return code + */ +int +pcmk__xe_set_ll(xmlNode *xml, const char *attr, long long value) +{ + char *value_s = NULL; + int rc = pcmk_rc_ok; + + CRM_CHECK((xml != NULL) && (attr != NULL), return EINVAL); + + value_s = pcmk__assert_asprintf("%lld", value); + + rc = pcmk__xe_set(xml, attr, value_s); + free(value_s); + return rc; +} + +/*! + * \internal + * \brief Retrieve a \c time_t value from an XML attribute + * + * This is like \c pcmk__xe_get() but returns the value as a \c time_t. + * + * \param[in] xml XML element whose attribute to get + * \param[in] attr Attribute name + * \param[out] dest Where to store attribute value (unchanged on error) + * + * \return Standard Pacemaker return code + */ +int +pcmk__xe_get_time(const xmlNode *xml, const char *attr, time_t *dest) +{ + long long value_ll = 0; + int rc = pcmk_rc_ok; + + CRM_CHECK((xml != NULL) && (attr != NULL) && (dest != NULL), return EINVAL); + + rc = pcmk__xe_get_ll(xml, attr, &value_ll); + if (rc != pcmk_rc_ok) { + return rc; + } + + /* We don't do any bounds checking, since there are no constants provided + * for the bounds of time_t, and calculating them isn't worth the effort. If + * there are XML values beyond the native sizes, there will likely be worse + * problems anyway. + */ + *dest = (time_t) value_ll; + return pcmk_rc_ok; +} + +/*! + * \internal + * \brief Set an XML attribute using a \c time_t value + * + * This is like \c pcmk__xe_set() but takes a \c time_t. + * + * \param[in,out] xml XML element whose attribute to set + * \param[in] attr Attribute name + * \param[in] value Attribute value to set (in seconds) + */ +void +pcmk__xe_set_time(xmlNode *xml, const char *attr, time_t value) +{ + // Could be inline, but keep it underneath pcmk__xe_get_time() + CRM_CHECK((xml != NULL) && (attr != NULL), return); + + pcmk__xe_set_ll(xml, attr, (long long) value); +} + +/*! + * \internal + * \brief Retrieve the values of XML second/microsecond attributes as time + * + * This is like \c pcmk__xe_get() but returns the value as a + * struct timeval. + * + * \param[in] xml XML element whose attributes to get + * \param[in] sec_attr Name of XML attribute for seconds + * \param[in] usec_attr Name of XML attribute for microseconds + * \param[out] dest Where to store result (unchanged on error) + * + * \return Standard Pacemaker return code + */ +int +pcmk__xe_get_timeval(const xmlNode *xml, const char *sec_attr, + const char *usec_attr, struct timeval *dest) +{ + long long value_ll = 0; + struct timeval result = { 0, 0 }; + int rc = pcmk_rc_ok; + + // Could allow one of sec_attr and usec_attr to be NULL in the future + CRM_CHECK((xml != NULL) && (sec_attr != NULL) && (usec_attr != NULL) + && (dest != NULL), return EINVAL); + + // No bounds checking; see comment in pcmk__xe_get_time() + + // Parse seconds + rc = pcmk__xe_get_time(xml, sec_attr, &(result.tv_sec)); + if (rc != pcmk_rc_ok) { + return rc; + } + + // Parse microseconds + rc = pcmk__xe_get_ll(xml, usec_attr, &value_ll); + if (rc != pcmk_rc_ok) { + return rc; + } + result.tv_usec = (suseconds_t) value_ll; + + *dest = result; + return pcmk_rc_ok; +} + +/*! + * \internal + * \brief Set XML attribute values for seconds and microseconds + * + * This is like \c pcmk__xe_set() but takes a struct timeval *. + * + * \param[in,out] xml XML element whose attributes to set + * \param[in] sec_attr Name of XML attribute for seconds + * \param[in] usec_attr Name of XML attribute for microseconds + * \param[in] value Attribute values to set + * + * \note This does nothing if \p value is \c NULL. + */ +void +pcmk__xe_set_timeval(xmlNode *xml, const char *sec_attr, const char *usec_attr, + const struct timeval *value) +{ + CRM_CHECK((xml != NULL) && (sec_attr != NULL) && (usec_attr != NULL), + return); + + if (value == NULL) { + return; + } + if (pcmk__xe_set_ll(xml, sec_attr, + (long long) value->tv_sec) != pcmk_rc_ok) { + return; + } + + /* Seconds were added successfully. Ignore any errors adding microseconds. + * + * It would be nice to make this atomic: revert the seconds attribute if + * adding the microseconds attribute fails. That's somewhat complicated due + * to change tracking: the chain of parents is already marked dirty, etc. In + * practice, microseconds should succeed if seconds succeeded, unless it's + * due to memory allocation failure. Nothing checks the return values of + * these setter functions at time of writing, anyway. + */ + pcmk__xe_set_ll(xml, usec_attr, (long long) value->tv_usec); +} + +/*! + * \internal + * \brief Get a date/time object from an XML attribute value + * + * \param[in] xml XML with attribute to parse (from CIB) + * \param[in] attr Name of attribute to parse + * \param[out] t Where to create date/time object + * (\p *t must be NULL initially) * * \return Standard Pacemaker return code * \note The caller is responsible for freeing \p *t using crm_time_free(). @@ -1441,7 +1468,7 @@ pcmk__xe_get_datetime(const xmlNode *xml, const char *attr, crm_time_t **t) return EINVAL; } - value = crm_element_value(xml, attr); + value = pcmk__xe_get(xml, attr); if (value != NULL) { *t = crm_time_new(value); if (*t == NULL) { @@ -1451,23 +1478,6 @@ pcmk__xe_get_datetime(const xmlNode *xml, const char *attr, crm_time_t **t) return pcmk_rc_ok; } -/*! - * \brief Retrieve a copy of the value of an XML attribute - * - * This is like \c crm_element_value() but allocating new memory for the result. - * - * \param[in] data XML node to check - * \param[in] name Attribute name to check - * - * \return Value of specified attribute (may be \c NULL) - * \note The caller is responsible for freeing the result. - */ -char * -crm_element_value_copy(const xmlNode *data, const char *name) -{ - return pcmk__str_copy(crm_element_value(data, name)); -} - /*! * \internal * \brief Add a boolean attribute to an XML node. @@ -1479,7 +1489,7 @@ crm_element_value_copy(const xmlNode *data, const char *name) void pcmk__xe_set_bool_attr(xmlNodePtr node, const char *name, bool value) { - crm_xml_add(node, name, pcmk__btoa(value)); + pcmk__xe_set(node, name, pcmk__btoa(value)); } /*! @@ -1501,7 +1511,6 @@ int pcmk__xe_get_bool_attr(const xmlNode *node, const char *name, bool *value) { const char *xml_value = NULL; - int ret, rc; if (node == NULL) { return ENODATA; @@ -1509,19 +1518,13 @@ pcmk__xe_get_bool_attr(const xmlNode *node, const char *name, bool *value) return EINVAL; } - xml_value = crm_element_value(node, name); + xml_value = pcmk__xe_get(node, name); if (xml_value == NULL) { return ENODATA; } - rc = crm_str_to_boolean(xml_value, &ret); - if (rc == 1) { - *value = ret; - return pcmk_rc_ok; - } else { - return pcmk_rc_bad_input; - } + return pcmk__parse_bool(xml_value, value); } /*! @@ -1549,6 +1552,7 @@ pcmk__xe_attr_is_true(const xmlNode *node, const char *name) #include // gboolean, GSList +#include // pcmk_free_nvpairs() #include // pcmk_xml_attrs2nvpairs(), etc. #include // crm_xml_sanitize_id() #include @@ -1559,6 +1563,47 @@ expand_idref(xmlNode *input, xmlNode *top) return pcmk__xe_resolve_idref(input, top); } +const char * +crm_xml_add(xmlNode *node, const char *name, const char *value) +{ + bool dirty = FALSE; + xmlAttr *attr = NULL; + + CRM_CHECK(node != NULL, return NULL); + CRM_CHECK(name != NULL, return NULL); + + if (value == NULL) { + return NULL; + } + + if (pcmk__xml_doc_all_flags_set(node->doc, pcmk__xf_tracking)) { + const char *old = pcmk__xe_get(node, name); + + if (old == NULL || value == NULL || strcmp(old, value) != 0) { + dirty = TRUE; + } + } + + if (dirty && (pcmk__check_acl(node, name, pcmk__xf_acl_create) == FALSE)) { + pcmk__trace("Cannot add %s=%s to %s", name, value, node->name); + return NULL; + } + + attr = xmlSetProp(node, (const xmlChar *) name, (const xmlChar *) value); + + /* If the attribute already exists, this does nothing. Attribute values + * don't get private data. + */ + pcmk__xml_new_private_data((xmlNode *) attr); + + if (dirty) { + pcmk__mark_xml_attr_dirty(attr); + } + + CRM_CHECK(attr && attr->children && attr->children->content, return NULL); + return (char *)attr->children->content; +} + void crm_xml_set_id(xmlNode *xml, const char *format, ...) { @@ -1566,7 +1611,7 @@ crm_xml_set_id(xmlNode *xml, const char *format, ...) int len = 0; char *id = NULL; - /* equivalent to crm_strdup_printf() */ + // Equivalent to pcmk__assert_asprintf() va_start(ap, format); len = vasprintf(&id, format, ap); va_end(ap); @@ -1605,5 +1650,213 @@ sorted_xml(xmlNode *input, xmlNode *parent, gboolean recursive) return result; } +const char * +crm_element_value(const xmlNode *data, const char *name) +{ + xmlAttr *attr = NULL; + + if (data == NULL) { + pcmk__err("Couldn't find %s in NULL", pcmk__s(name, "")); + CRM_LOG_ASSERT(data != NULL); + return NULL; + + } else if (name == NULL) { + pcmk__err("Couldn't find NULL in %s", data->name); + return NULL; + } + + attr = xmlHasProp(data, (const xmlChar *) name); + if (!attr || !attr->children) { + return NULL; + } + return (const char *) attr->children->content; +} + +const char * +crm_copy_xml_element(const xmlNode *obj1, xmlNode *obj2, const char *element) +{ + const char *value = crm_element_value(obj1, element); + + crm_xml_add(obj2, element, value); + return value; +} + +int +crm_element_value_ll(const xmlNode *data, const char *name, long long *dest) +{ + const char *value = NULL; + + CRM_CHECK(dest != NULL, return -1); + value = crm_element_value(data, name); + if (value != NULL) { + int rc = pcmk__scan_ll(value, dest, PCMK__PARSE_INT_DEFAULT); + + if (rc == pcmk_rc_ok) { + return 0; + } + pcmk__warn("Using default for %s because '%s' is not a valid integer: " + "%s", + name, value, pcmk_rc_str(rc)); + } + return -1; +} + +int +crm_element_value_timeval(const xmlNode *xml, const char *name_sec, + const char *name_usec, struct timeval *dest) +{ + long long value_i = 0; + + CRM_CHECK(dest != NULL, return -EINVAL); + dest->tv_sec = 0; + dest->tv_usec = 0; + + if (xml == NULL) { + return pcmk_ok; + } + + // No bounds checking; see comment in pcmk__xe_get_time() + + // Parse seconds + errno = 0; + if (crm_element_value_ll(xml, name_sec, &value_i) < 0) { + return -errno; + } + dest->tv_sec = (time_t) value_i; + + // Parse microseconds + if (crm_element_value_ll(xml, name_usec, &value_i) < 0) { + return -errno; + } + dest->tv_usec = (suseconds_t) value_i; + + return pcmk_ok; +} + +int +crm_element_value_epoch(const xmlNode *xml, const char *name, time_t *dest) +{ + long long value_ll = 0; + + if (crm_element_value_ll(xml, name, &value_ll) < 0) { + return -1; + } + + // No bounds checking; see comment in pcmk__xe_get_time() + *dest = (time_t) value_ll; + return pcmk_ok; +} + +int +crm_element_value_ms(const xmlNode *data, const char *name, guint *dest) +{ + const char *value = NULL; + long long value_ll; + int rc = pcmk_rc_ok; + + CRM_CHECK(dest != NULL, return -1); + *dest = 0; + value = crm_element_value(data, name); + rc = pcmk__scan_ll(value, &value_ll, 0LL); + if (rc != pcmk_rc_ok) { + pcmk__warn("Using default for %s because '%s' is not valid " + "milliseconds: %s", + name, value, pcmk_rc_str(rc)); + return -1; + } + if ((value_ll < 0) || (value_ll > G_MAXUINT)) { + pcmk__warn("Using default for %s because '%s' is out of range", name, + value); + return -1; + } + *dest = (guint) value_ll; + return pcmk_ok; +} + +int +crm_element_value_int(const xmlNode *data, const char *name, int *dest) +{ + const char *value = NULL; + + CRM_CHECK(dest != NULL, return -1); + value = crm_element_value(data, name); + if (value) { + long long value_ll; + int rc = pcmk__scan_ll(value, &value_ll, 0LL); + + *dest = PCMK__PARSE_INT_DEFAULT; + if (rc != pcmk_rc_ok) { + pcmk__warn("Using default for %s because '%s' is not a valid " + "integer: %s", + name, value, pcmk_rc_str(rc)); + } else if ((value_ll < INT_MIN) || (value_ll > INT_MAX)) { + pcmk__warn("Using default for %s because '%s' is out of range", + name, value); + } else { + *dest = (int) value_ll; + return 0; + } + } + return -1; +} + +char * +crm_element_value_copy(const xmlNode *data, const char *name) +{ + CRM_CHECK((data != NULL) && (name != NULL), return NULL); + return pcmk__str_copy(pcmk__xe_get(data, name)); +} + +// Maximum size of null-terminated string representation of 64-bit integer +// -9223372036854775808 +#define LLSTRSIZE 21 + +const char * +crm_xml_add_ll(xmlNode *xml, const char *name, long long value) +{ + char s[LLSTRSIZE] = { '\0', }; + + if (snprintf(s, LLSTRSIZE, "%lld", (long long) value) == LLSTRSIZE) { + return NULL; + } + return crm_xml_add(xml, name, s); +} + +const char * +crm_xml_add_timeval(xmlNode *xml, const char *name_sec, const char *name_usec, + const struct timeval *value) +{ + const char *added = NULL; + + if (xml && name_sec && value) { + added = crm_xml_add_ll(xml, name_sec, (long long) value->tv_sec); + if (added && name_usec) { + // Any error is ignored (we successfully added seconds) + crm_xml_add_ll(xml, name_usec, (long long) value->tv_usec); + } + } + return added; +} + +const char * +crm_xml_add_ms(xmlNode *node, const char *name, guint ms) +{ + char *number = pcmk__assert_asprintf("%u", ms); + const char *added = crm_xml_add(node, name, number); + + free(number); + return added; +} + +const char * +crm_xml_add_int(xmlNode *node, const char *name, int value) +{ + char *number = pcmk__itoa(value); + const char *added = crm_xml_add(node, name, number); + + free(number); + return added; +} + // LCOV_EXCL_STOP // End deprecated API diff --git a/lib/common/xml_idref.c b/lib/common/xml_idref.c index c91b4d5bd26..513a3085b2a 100644 --- a/lib/common/xml_idref.c +++ b/lib/common/xml_idref.c @@ -48,7 +48,7 @@ pcmk__add_idref(GHashTable *table, const char *id, const char *referrer) } } idref->refs = g_list_append(idref->refs, pcmk__str_copy(referrer)); - crm_trace("Added ID %s referrer %s", id, referrer); + pcmk__trace("Added ID %s referrer %s", id, referrer); } /*! @@ -92,7 +92,7 @@ pcmk__xe_resolve_idref(xmlNode *xml, xmlNode *search) return NULL; } - ref = crm_element_value(xml, PCMK_XA_ID_REF); + ref = pcmk__xe_get(xml, PCMK_XA_ID_REF); if (ref == NULL) { return xml; } @@ -101,7 +101,7 @@ pcmk__xe_resolve_idref(xmlNode *xml, xmlNode *search) search = xml; } - xpath = crm_strdup_printf("//%s[@" PCMK_XA_ID "='%s']", xml->name, ref); + xpath = pcmk__assert_asprintf("//%s[@" PCMK_XA_ID "='%s']", xml->name, ref); result = pcmk__xpath_find_one(search->doc, xpath, LOG_DEBUG); if (result == NULL) { // Not possible with schema validation enabled diff --git a/lib/common/xml_io.c b/lib/common/xml_io.c index 559bb06f226..6df12101237 100644 --- a/lib/common/xml_io.c +++ b/lib/common/xml_io.c @@ -53,8 +53,8 @@ decompress_file(const char *filename) bz_file = BZ2_bzReadOpen(&rc, input, 0, 0, NULL, 0); rc = pcmk__bzlib2rc(rc); if (rc != pcmk_rc_ok) { - crm_err("Could not prepare to read compressed %s: %s " - QB_XS " rc=%d", filename, pcmk_rc_str(rc), rc); + pcmk__err("Could not prepare to read compressed %s: %s " QB_XS " rc=%d", + filename, pcmk_rc_str(rc), rc); goto done; } @@ -65,7 +65,7 @@ decompress_file(const char *filename) read_len = BZ2_bzRead(&rc, bz_file, buffer + length, PCMK__BUFFER_SIZE); if ((rc == BZ_OK) || (rc == BZ_STREAM_END)) { - crm_trace("Read %ld bytes from file: %d", (long) read_len, rc); + pcmk__trace("Read %ld bytes from file: %d", (long) read_len, rc); length += read_len; } } while (rc == BZ_OK); @@ -73,8 +73,8 @@ decompress_file(const char *filename) rc = pcmk__bzlib2rc(rc); if (rc != pcmk_rc_ok) { rc = pcmk__bzlib2rc(rc); - crm_err("Could not read compressed %s: %s " QB_XS " rc=%d", - filename, pcmk_rc_str(rc), rc); + pcmk__err("Could not read compressed %s: %s " QB_XS " rc=%d", filename, + pcmk_rc_str(rc), rc); free(buffer); buffer = NULL; } else { @@ -146,7 +146,7 @@ pcmk__xml_read(const char *filename) last_error = xmlCtxtGetLastError(ctxt); if ((last_error != NULL) && (xml != NULL)) { - crm_log_xml_debug(xml, "partial"); + pcmk__log_xml_debug(xml, "partial"); pcmk__xml_free(xml); xml = NULL; } @@ -192,7 +192,7 @@ pcmk__xml_parse(const char *input) last_error = xmlCtxtGetLastError(ctxt); if ((last_error != NULL) && (xml != NULL)) { - crm_log_xml_debug(xml, "partial"); + pcmk__log_xml_debug(xml, "partial"); pcmk__xml_free(xml); xml = NULL; } @@ -214,9 +214,9 @@ static void dump_xml_element(const xmlNode *data, uint32_t options, GString *buffer, int depth) { - bool pretty = pcmk_is_set(options, pcmk__xml_fmt_pretty); - bool filtered = pcmk_is_set(options, pcmk__xml_fmt_filtered); - int spaces = pretty? (2 * depth) : 0; + const bool pretty = pcmk__is_set(options, pcmk__xml_fmt_pretty); + const bool filtered = pcmk__is_set(options, pcmk__xml_fmt_filtered); + const int spaces = pretty? (2 * depth) : 0; for (int lpc = 0; lpc < spaces; lpc++) { g_string_append_c(buffer, ' '); @@ -274,8 +274,8 @@ static void dump_xml_text(const xmlNode *data, uint32_t options, GString *buffer, int depth) { - bool pretty = pcmk_is_set(options, pcmk__xml_fmt_pretty); - int spaces = pretty? (2 * depth) : 0; + const bool pretty = pcmk__is_set(options, pcmk__xml_fmt_pretty); + const int spaces = pretty? (2 * depth) : 0; const char *content = (const char *) data->content; gchar *content_esc = NULL; @@ -309,8 +309,8 @@ static void dump_xml_cdata(const xmlNode *data, uint32_t options, GString *buffer, int depth) { - bool pretty = pcmk_is_set(options, pcmk__xml_fmt_pretty); - int spaces = pretty? (2 * depth) : 0; + const bool pretty = pcmk__is_set(options, pcmk__xml_fmt_pretty); + const int spaces = pretty? (2 * depth) : 0; for (int lpc = 0; lpc < spaces; lpc++) { g_string_append_c(buffer, ' '); @@ -337,8 +337,8 @@ static void dump_xml_comment(const xmlNode *data, uint32_t options, GString *buffer, int depth) { - bool pretty = pcmk_is_set(options, pcmk__xml_fmt_pretty); - int spaces = pretty? (2 * depth) : 0; + const bool pretty = pcmk__is_set(options, pcmk__xml_fmt_pretty); + const int spaces = pretty? (2 * depth) : 0; for (int lpc = 0; lpc < spaces; lpc++) { g_string_append_c(buffer, ' '); @@ -371,7 +371,7 @@ pcmk__xml_string(const xmlNode *data, uint32_t options, GString *buffer, int depth) { if (data == NULL) { - crm_trace("Nothing to dump"); + pcmk__trace("Nothing to dump"); return; } @@ -384,7 +384,7 @@ pcmk__xml_string(const xmlNode *data, uint32_t options, GString *buffer, dump_xml_element(data, options, buffer, depth); break; case XML_TEXT_NODE: - if (pcmk_is_set(options, pcmk__xml_fmt_text)) { + if (pcmk__is_set(options, pcmk__xml_fmt_text)) { dump_xml_text(data, options, buffer, depth); } break; @@ -395,8 +395,8 @@ pcmk__xml_string(const xmlNode *data, uint32_t options, GString *buffer, dump_xml_cdata(data, options, buffer, depth); break; default: - crm_warn("Cannot convert XML %s node to text " QB_XS " type=%d", - pcmk__xml_element_type_text(data->type), data->type); + pcmk__warn("Cannot convert XML %s node to text " QB_XS " type=%d", + pcmk__xml_element_type_text(data->type), data->type); break; } } @@ -424,18 +424,18 @@ write_compressed_stream(char *text, const char *filename, FILE *stream, rc = pcmk__bzlib2rc(rc); if (rc != pcmk_rc_ok) { - crm_warn("Not compressing %s: could not prepare file stream: %s " - QB_XS " rc=%d", - filename, pcmk_rc_str(rc), rc); + pcmk__warn("Not compressing %s: could not prepare file stream: %s " + QB_XS " rc=%d", + filename, pcmk_rc_str(rc), rc); goto done; } BZ2_bzWrite(&rc, bz_file, text, strlen(text)); rc = pcmk__bzlib2rc(rc); if (rc != pcmk_rc_ok) { - crm_warn("Not compressing %s: could not compress data: %s " - QB_XS " rc=%d errno=%d", - filename, pcmk_rc_str(rc), rc, errno); + pcmk__warn("Not compressing %s: could not compress data: %s " + QB_XS " rc=%d errno=%d", + filename, pcmk_rc_str(rc), rc, errno); goto done; } @@ -443,14 +443,14 @@ write_compressed_stream(char *text, const char *filename, FILE *stream, bz_file = NULL; rc = pcmk__bzlib2rc(rc); if (rc != pcmk_rc_ok) { - crm_warn("Not compressing %s: could not write compressed data: %s " - QB_XS " rc=%d errno=%d", - filename, pcmk_rc_str(rc), rc, errno); + pcmk__warn("Not compressing %s: could not write compressed data: %s " + QB_XS " rc=%d errno=%d", + filename, pcmk_rc_str(rc), rc, errno); goto done; } - crm_trace("Compressed XML for %s from %u bytes to %u", - filename, bytes_in, *bytes_out); + pcmk__trace("Compressed XML for %s from %u bytes to %u", filename, bytes_in, + *bytes_out); done: if (bz_file != NULL) { @@ -481,11 +481,11 @@ write_xml_stream(const xmlNode *xml, const char *filename, FILE *stream, pcmk__xml_string(xml, pcmk__xml_fmt_pretty, buffer, 0); CRM_CHECK(!pcmk__str_empty(buffer->str), - crm_log_xml_info(xml, "dump-failed"); + pcmk__log_xml_info(xml, "dump-failed"); rc = pcmk_rc_error; goto done); - crm_log_xml_trace(xml, "writing"); + pcmk__log_xml_trace(xml, "writing"); if (compress && (write_compressed_stream(buffer->str, filename, stream, @@ -515,7 +515,7 @@ write_xml_stream(const xmlNode *xml, const char *filename, FILE *stream, } fclose(stream); - crm_trace("Saved %u bytes to %s as XML", bytes_out, filename); + pcmk__trace("Saved %u bytes to %s as XML", bytes_out, filename); g_string_free(buffer, TRUE); return rc; @@ -600,20 +600,59 @@ pcmk__xml2fd(int fd, xmlNode *cur) return pcmk_rc_ok; } +/*! + * \internal + * \brief Write XML to a file in a temporary directory + * + * \param[in] xml XML to write + * \param[in] desc Description of \p xml + * \param[in] filename Base name of file to write (\c NULL to create a name + * based on a generated UUID) + */ +void +pcmk__xml_write_temp_file(const xmlNode *xml, const char *desc, + const char *filename) +{ + char *path = NULL; + char *uuid = NULL; + + CRM_CHECK((xml != NULL) && (desc != NULL), return); + + if (filename == NULL) { + uuid = pcmk__generate_uuid(); + filename = uuid; + } + path = pcmk__assert_asprintf("%s/%s", pcmk__get_tmpdir(), filename); + + pcmk__info("Saving %s to %s", desc, path); + pcmk__xml_write_file(xml, filename, false); + + free(path); + free(uuid); +} + +// Deprecated functions kept only for backward API compatibility +// LCOV_EXCL_START + +#include + void save_xml_to_file(const xmlNode *xml, const char *desc, const char *filename) { char *f = NULL; if (filename == NULL) { - char *uuid = crm_generate_uuid(); + char *uuid = pcmk__generate_uuid(); - f = crm_strdup_printf("%s/%s", pcmk__get_tmpdir(), uuid); + f = pcmk__assert_asprintf("%s/%s", pcmk__get_tmpdir(), uuid); filename = f; free(uuid); } - crm_info("Saving %s to %s", desc, filename); + pcmk__info("Saving %s to %s", desc, filename); pcmk__xml_write_file(xml, filename, false); free(f); } + +// LCOV_EXCL_STOP +// End deprecated API diff --git a/lib/common/xpath.c b/lib/common/xpath.c index e774bc7525a..73cc4611853 100644 --- a/lib/common/xpath.c +++ b/lib/common/xpath.c @@ -118,8 +118,9 @@ pcmk__xpath_match_element(xmlNode *match) // Probably an attribute; return parent element instead return match->parent; } - crm_err("Cannot get element from XPath expression match of type %s", - pcmk__xml_element_type_text(match->type)); + pcmk__err("Cannot get element from XPath expression match of type " + "%s", + pcmk__xml_element_type_text(match->type)); return NULL; } } @@ -221,7 +222,7 @@ pcmk__xpath_find_one(xmlDoc *doc, const char *path, uint8_t level) goto done; } - if (level >= LOG_NEVER) { + if (level >= PCMK__LOG_NEVER) { // For no matches or multiple matches, the rest is just logging goto done; } @@ -332,7 +333,7 @@ pcmk__xpath_node_id(const char *xpath, const char *node) return retval; } - patt = crm_strdup_printf("/%s[@" PCMK_XA_ID "=", node); + patt = pcmk__assert_asprintf("/%s[@" PCMK_XA_ID "=", node); start = strstr(xpath, patt); if (!start) { @@ -357,7 +358,7 @@ output_attr_child(xmlNode *child, void *userdata) pcmk__output_t *out = userdata; out->info(out, " Value: %s \t(id=%s)", - crm_element_value(child, PCMK_XA_VALUE), + pcmk__xe_get(child, PCMK_XA_VALUE), pcmk__s(pcmk__xe_id(child), "")); return pcmk_rc_ok; } @@ -407,7 +408,7 @@ getXpathResult(xmlXPathObjectPtr xpathObj, int index) CRM_CHECK(xpathObj != NULL, return NULL); if (index >= max) { - crm_err("Requested index %d of only %d items", index, max); + pcmk__err("Requested index %d of only %d items", index, max); return NULL; } else if(xpathObj->nodesetval->nodeTab[index] == NULL) { @@ -435,7 +436,7 @@ getXpathResult(xmlXPathObjectPtr xpathObj, int index) && (match->parent->type == XML_ELEMENT_NODE)) { return match->parent; } - crm_warn("Unsupported XPath match type %d (bug?)", match->type); + pcmk__warn("Unsupported XPath match type %d (bug?)", match->type); return NULL; } } @@ -544,14 +545,14 @@ get_xpath_object(const char *xpath, xmlNode * xml_obj, int error_level) max = pcmk__xpath_num_results(xpathObj); if (max == 0) { - if (error_level < LOG_NEVER) { + if (error_level < PCMK__LOG_NEVER) { do_crm_log(error_level, "No match for %s in %s", xpath, pcmk__s(nodePath, "unknown path")); crm_log_xml_explicit(xml_obj, "Unexpected Input"); } } else if (max > 1) { - if (error_level < LOG_NEVER) { + if (error_level < PCMK__LOG_NEVER) { int lpc = 0; do_crm_log(error_level, "Too many matches for %s in %s", diff --git a/lib/fencing/st_actions.c b/lib/fencing/st_actions.c index d085ff8ab30..686c080eebc 100644 --- a/lib/fencing/st_actions.c +++ b/lib/fencing/st_actions.c @@ -79,7 +79,8 @@ log_action(stonith_action_t *action, pid_t pid) */ if (action->result.action_stderr != NULL) { /* Logging the whole string confuses syslog when the string is xml */ - char *prefix = crm_strdup_printf("%s[%d] stderr:", action->agent, pid); + char *prefix = pcmk__assert_asprintf("%s[%d] stderr:", action->agent, + pid); crm_log_output(LOG_WARNING, prefix, action->result.action_stderr); free(prefix); @@ -100,8 +101,8 @@ append_config_arg(gpointer key, gpointer value, gpointer user_data) && (strstr(key, CRM_META) == NULL) && !pcmk__str_eq(key, PCMK_XA_CRM_FEATURE_SET, pcmk__str_none)) { - crm_trace("Passing %s=%s with fence action", - (const char *) key, (const char *) (value? value : "")); + pcmk__trace("Passing %s=%s with fence action", (const char *) key, + pcmk__s((const char *) value, "")); pcmk__insert_dup((GHashTable *) user_data, key, pcmk__s(value, "")); } } @@ -139,8 +140,8 @@ make_args(const char *agent, const char *action, const char *target, snprintf(buffer, sizeof(buffer), "pcmk_%s_action", action); value = g_hash_table_lookup(device_args, buffer); if (value) { - crm_debug("Substituting '%s' for fence action %s targeting %s", - value, action, pcmk__s(target, "no node")); + pcmk__debug("Substituting '%s' for fence action %s targeting %s", + value, action, pcmk__s(target, "no node")); action = value; } } @@ -161,11 +162,12 @@ make_args(const char *agent, const char *action, const char *target, // If the target's node ID was specified, pass it, too if (target_nodeid != 0) { - char *nodeid = crm_strdup_printf("%" PRIu32, target_nodeid); + char *nodeid = pcmk__assert_asprintf("%" PRIu32, target_nodeid); // cts-fencing looks for this log message - crm_info("Passing '%s' as nodeid with fence action '%s' targeting %s", - nodeid, action, pcmk__s(target, "no node")); + pcmk__info("Passing '%s' as nodeid with fence action '%s' " + "targeting %s", + nodeid, action, pcmk__s(target, "no node")); g_hash_table_insert(arg_list, strdup("nodeid"), nodeid); } @@ -193,8 +195,8 @@ make_args(const char *agent, const char *action, const char *target, if (alias == NULL) { alias = target; } - crm_debug("Passing %s='%s' with fence action %s targeting %s", - param, alias, action, pcmk__s(target, "no node")); + pcmk__debug("Passing %s='%s' with fence action %s targeting %s", + param, alias, action, pcmk__s(target, "no node")); pcmk__insert_dup(arg_list, param, alias); } } @@ -271,8 +273,8 @@ stonith__action_create(const char *agent, const char *action_name, action->args = make_args(agent, action_name, target, target_nodeid, device_args, port_map, host_arg); - crm_debug("Preparing '%s' action targeting %s using agent %s", - action_name, pcmk__s(target, "no node"), agent); + pcmk__debug("Preparing '%s' action targeting %s using agent %s", + action_name, pcmk__s(target, "no node"), agent); action->agent = strdup(agent); action->action = strdup(action_name); action->timeout = action->remaining_timeout = timeout_sec; @@ -302,8 +304,9 @@ update_remaining_timeout(stonith_action_t * action) int diff = time(NULL) - action->initial_start_time; if (action->tries >= action->max_retries) { - crm_info("Attempted to execute agent %s (%s) the maximum number of times (%d) allowed", - action->agent, action->action, action->max_retries); + pcmk__info("Attempted to execute agent %s (%s) the maximum number of " + "times (%d) allowed", + action->agent, action->action, action->max_retries); action->remaining_timeout = 0; } else if ((action->result.execution_status != PCMK_EXEC_TIMEOUT) && (diff < (action->timeout * 0.7))) { @@ -447,16 +450,16 @@ stonith__xe_set_result(xmlNode *xml, const pcmk__action_result_t *result) rc = pcmk_rc2legacy(stonith__result2rc(result)); } - crm_xml_add_int(xml, PCMK__XA_OP_STATUS, (int) execution_status); - crm_xml_add_int(xml, PCMK__XA_RC_CODE, exit_status); - crm_xml_add(xml, PCMK_XA_EXIT_REASON, exit_reason); - crm_xml_add(xml, PCMK__XA_ST_OUTPUT, action_stdout); + pcmk__xe_set_int(xml, PCMK__XA_OP_STATUS, (int) execution_status); + pcmk__xe_set_int(xml, PCMK__XA_RC_CODE, exit_status); + pcmk__xe_set(xml, PCMK_XA_EXIT_REASON, exit_reason); + pcmk__xe_set(xml, PCMK__XA_ST_OUTPUT, action_stdout); /* @COMPAT Peers in rolling upgrades, Pacemaker Remote nodes, and external * code that use libstonithd <=2.1.2 don't check for the full result, and * need a legacy return code instead. */ - crm_xml_add_int(xml, PCMK__XA_ST_RC, rc); + pcmk__xe_set_int(xml, PCMK__XA_ST_RC, rc); } /*! @@ -472,7 +475,7 @@ stonith__find_xe_with_result(xmlNode *xml) { xmlNode *match = pcmk__xpath_find_one(xml->doc, "//*[@" PCMK__XA_RC_CODE "]", - LOG_NEVER); + PCMK__LOG_NEVER); if (match == NULL) { /* @COMPAT Peers <=2.1.2 in a rolling upgrade provide only a legacy @@ -501,20 +504,20 @@ stonith__xe_get_result(const xmlNode *xml, pcmk__action_result_t *result) CRM_CHECK((xml != NULL) && (result != NULL), return); - exit_reason = crm_element_value(xml, PCMK_XA_EXIT_REASON); - action_stdout = crm_element_value_copy(xml, PCMK__XA_ST_OUTPUT); + exit_reason = pcmk__xe_get(xml, PCMK_XA_EXIT_REASON); + action_stdout = pcmk__xe_get_copy(xml, PCMK__XA_ST_OUTPUT); // A result must include an exit status and execution status - if ((crm_element_value_int(xml, PCMK__XA_RC_CODE, &exit_status) < 0) - || (crm_element_value_int(xml, PCMK__XA_OP_STATUS, - &execution_status) < 0)) { + if ((pcmk__xe_get_int(xml, PCMK__XA_RC_CODE, &exit_status) != pcmk_rc_ok) + || (pcmk__xe_get_int(xml, PCMK__XA_OP_STATUS, + &execution_status) != pcmk_rc_ok)) { int rc = pcmk_ok; exit_status = CRM_EX_ERROR; /* @COMPAT Peers <=2.1.2 in rolling upgrades provide only a legacy * return code, not a full result, so check for that. */ - if (crm_element_value_int(xml, PCMK__XA_ST_RC, &rc) == 0) { + if (pcmk__xe_get_int(xml, PCMK__XA_ST_RC, &rc) == pcmk_rc_ok) { if ((rc == pcmk_ok) || (rc == -EINPROGRESS)) { exit_status = CRM_EX_OK; } @@ -572,8 +575,8 @@ stonith_action_async_forked(svc_action_t *svc_action) pcmk__set_result(&(action->result), PCMK_OCF_UNKNOWN, PCMK_EXEC_PENDING, NULL); - crm_trace("Child process %d performing action '%s' successfully forked", - action->pid, action->action); + pcmk__trace("Child process %d performing action '%s' successfully forked", + action->pid, action->action); } /*! @@ -590,7 +593,7 @@ stonith_action_to_svc(stonith_action_t *action) { static int stonith_sequence = 0; - char *path = crm_strdup_printf(PCMK__FENCE_BINDIR "/%s", action->agent); + char *path = pcmk__assert_asprintf(PCMK__FENCE_BINDIR "/%s", action->agent); svc_action_t *svc_action = services_action_create_generic(path, NULL); free(path); @@ -602,15 +605,15 @@ stonith_action_to_svc(stonith_action_t *action) svc_action->timeout = action->remaining_timeout * 1000; svc_action->standard = pcmk__str_copy(PCMK_RESOURCE_CLASS_STONITH); - svc_action->id = crm_strdup_printf("%s_%s_%dof%d", action->agent, - action->action, action->tries, - action->max_retries); + svc_action->id = pcmk__assert_asprintf("%s_%s_%dof%d", action->agent, + action->action, action->tries, + action->max_retries); svc_action->agent = pcmk__str_copy(action->agent); svc_action->sequence = stonith_sequence++; svc_action->params = action->args; svc_action->cb_data = (void *) action; svc_action->flags = pcmk__set_flags_as(__func__, __LINE__, - LOG_TRACE, "Action", + PCMK__LOG_TRACE, "Action", svc_action->id, svc_action->flags, SVC_ACTION_NON_BLOCKED, "SVC_ACTION_NON_BLOCKED"); @@ -639,10 +642,10 @@ internal_stonith_action_execute(stonith_action_t * action) action->initial_start_time = time(NULL); } else { // Later attempt after earlier failure - crm_info("Attempt %d to execute '%s' action of agent %s " - "(%ds timeout remaining)", - action->tries, action->action, action->agent, - action->remaining_timeout); + pcmk__info("Attempt %d to execute '%s' action of agent %s (%ds timeout " + "remaining)", + action->tries, action->action, action->agent, + action->remaining_timeout); is_retry = 1; } diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c index a2c541c366b..c89939adc62 100644 --- a/lib/fencing/st_client.c +++ b/lib/fencing/st_client.c @@ -24,6 +24,7 @@ #include #include #include +#include // hash2field() #include #include @@ -182,7 +183,8 @@ stonith__watchdog_fencing_enabled_for_node_api(stonith_t *st, const char *node) int rc = stonith_api->cmds->connect(stonith_api, "stonith-api", NULL); if (rc != pcmk_ok) { - crm_err("Failed connecting to Stonith-API for watchdog-fencing-query."); + pcmk__err("Failed connecting to Stonith-API for " + "watchdog-fencing-query"); } } @@ -197,10 +199,11 @@ stonith__watchdog_fencing_enabled_for_node_api(stonith_t *st, const char *node) * panic on that answer */ if (rc == -ENODEV) { - crm_notice("Cluster does not have watchdog fencing device"); + pcmk__notice("Cluster does not have watchdog fencing " + "device"); } else { - crm_warn("Could not check for watchdog fencing device: %s", - pcmk_strerror(rc)); + pcmk__warn("Could not check for watchdog fencing device: %s", + pcmk_strerror(rc)); } } else if (list[0] == '\0') { rv = TRUE; @@ -222,10 +225,10 @@ stonith__watchdog_fencing_enabled_for_node_api(stonith_t *st, const char *node) stonith_api_delete(stonith_api); } } else { - crm_err("Stonith-API for watchdog-fencing-query couldn't be created."); + pcmk__err("Stonith-API for watchdog-fencing-query couldn't be created"); } - crm_trace("Pacemaker assumes node %s %sto do watchdog-fencing.", - node, rv?"":"not "); + pcmk__trace("Pacemaker assumes node %s %sto do watchdog-fencing", node, + (rv? "" : "not ")); return rv; } @@ -274,7 +277,7 @@ stonith_connection_destroy(gpointer user_data) stonith_private_t *native = NULL; struct notify_blob_s blob; - crm_trace("Sending destroyed notification"); + pcmk__trace("Sending destroyed notification"); blob.stonith = stonith; blob.xml = pcmk__xe_create(NULL, PCMK__XE_NOTIFY); @@ -284,8 +287,8 @@ stonith_connection_destroy(gpointer user_data) free(native->token); native->token = NULL; stonith->state = stonith_disconnected; - crm_xml_add(blob.xml, PCMK__XA_T, PCMK__VALUE_ST_NOTIFY); - crm_xml_add(blob.xml, PCMK__XA_SUBT, PCMK__VALUE_ST_NOTIFY_DISCONNECT); + pcmk__xe_set(blob.xml, PCMK__XA_T, PCMK__VALUE_ST_NOTIFY); + pcmk__xe_set(blob.xml, PCMK__XA_SUBT, PCMK__VALUE_ST_NOTIFY_DISCONNECT); foreach_notify_entry(native, stonith_send_notification, &blob); pcmk__xml_free(blob.xml); @@ -310,15 +313,15 @@ create_device_registration_xml(const char *id, enum stonith_namespace standard, } #endif - crm_xml_add(data, PCMK_XA_ID, id); - crm_xml_add(data, PCMK__XA_ST_ORIGIN, __func__); - crm_xml_add(data, PCMK_XA_AGENT, agent); + pcmk__xe_set(data, PCMK_XA_ID, id); + pcmk__xe_set(data, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set(data, PCMK_XA_AGENT, agent); if ((standard != st_namespace_any) && (standard != st_namespace_invalid)) { - crm_xml_add(data, PCMK__XA_NAMESPACE, - stonith_namespace2text(standard)); + pcmk__xe_set(data, PCMK__XA_NAMESPACE, + stonith_namespace2text(standard)); } if (rsc_provides) { - crm_xml_add(data, PCMK__XA_RSC_PROVIDES, rsc_provides); + pcmk__xe_set(data, PCMK__XA_RSC_PROVIDES, rsc_provides); } for (; params; params = params->next) { @@ -354,8 +357,8 @@ stonith_api_remove_device(stonith_t * st, int call_options, const char *name) xmlNode *data = NULL; data = pcmk__xe_create(NULL, PCMK__XE_ST_DEVICE_ID); - crm_xml_add(data, PCMK__XA_ST_ORIGIN, __func__); - crm_xml_add(data, PCMK_XA_ID, name); + pcmk__xe_set(data, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set(data, PCMK_XA_ID, name); rc = stonith_send_command(st, STONITH_OP_DEVICE_DEL, data, NULL, call_options, 0); pcmk__xml_free(data); @@ -373,20 +376,20 @@ stonith_api_remove_level_full(stonith_t *st, int options, CRM_CHECK(node || pattern || (attr && value), return -EINVAL); data = pcmk__xe_create(NULL, PCMK_XE_FENCING_LEVEL); - crm_xml_add(data, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_ST_ORIGIN, __func__); if (node) { - crm_xml_add(data, PCMK_XA_TARGET, node); + pcmk__xe_set(data, PCMK_XA_TARGET, node); } else if (pattern) { - crm_xml_add(data, PCMK_XA_TARGET_PATTERN, pattern); + pcmk__xe_set(data, PCMK_XA_TARGET_PATTERN, pattern); } else { - crm_xml_add(data, PCMK_XA_TARGET_ATTRIBUTE, attr); - crm_xml_add(data, PCMK_XA_TARGET_VALUE, value); + pcmk__xe_set(data, PCMK_XA_TARGET_ATTRIBUTE, attr); + pcmk__xe_set(data, PCMK_XA_TARGET_VALUE, value); } - crm_xml_add_int(data, PCMK_XA_INDEX, level); + pcmk__xe_set_int(data, PCMK_XA_INDEX, level); rc = stonith_send_command(st, STONITH_OP_LEVEL_DEL, data, NULL, options, 0); pcmk__xml_free(data); @@ -427,19 +430,19 @@ create_level_registration_xml(const char *node, const char *pattern, data = pcmk__xe_create(NULL, PCMK_XE_FENCING_LEVEL); - crm_xml_add(data, PCMK__XA_ST_ORIGIN, __func__); - crm_xml_add_int(data, PCMK_XA_ID, level); - crm_xml_add_int(data, PCMK_XA_INDEX, level); + pcmk__xe_set(data, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set_int(data, PCMK_XA_ID, level); + pcmk__xe_set_int(data, PCMK_XA_INDEX, level); if (node) { - crm_xml_add(data, PCMK_XA_TARGET, node); + pcmk__xe_set(data, PCMK_XA_TARGET, node); } else if (pattern) { - crm_xml_add(data, PCMK_XA_TARGET_PATTERN, pattern); + pcmk__xe_set(data, PCMK_XA_TARGET_PATTERN, pattern); } else { - crm_xml_add(data, PCMK_XA_TARGET_ATTRIBUTE, attr); - crm_xml_add(data, PCMK_XA_TARGET_VALUE, value); + pcmk__xe_set(data, PCMK_XA_TARGET_ATTRIBUTE, attr); + pcmk__xe_set(data, PCMK_XA_TARGET_VALUE, value); } for (; device_list; device_list = device_list->next) { @@ -447,7 +450,7 @@ create_level_registration_xml(const char *node, const char *pattern, } if (list != NULL) { - crm_xml_add(data, PCMK_XA_DEVICES, (const char *) list->str); + pcmk__xe_set(data, PCMK_XA_DEVICES, (const char *) list->str); g_string_free(list, TRUE); } return data; @@ -487,7 +490,7 @@ stonith_api_device_list(stonith_t *stonith, int call_options, enum stonith_namespace ns = stonith_text2namespace(namespace_s); if (devices == NULL) { - crm_err("Parameter error: stonith_api_device_list"); + pcmk__err("Parameter error: stonith_api_device_list"); return -EFAULT; } @@ -522,8 +525,8 @@ stonith_api_device_metadata(stonith_t *stonith, int call_options, timeout_sec = PCMK_DEFAULT_ACTION_TIMEOUT_MS; } - crm_trace("Looking up metadata for %s agent %s", - stonith_namespace2text(ns), agent); + pcmk__trace("Looking up metadata for %s agent %s", + stonith_namespace2text(ns), agent); switch (ns) { case st_namespace_rhcs: @@ -535,8 +538,8 @@ stonith_api_device_metadata(stonith_t *stonith, int call_options, #endif default: - crm_err("Can't get fence agent '%s' meta-data: No such agent", - agent); + pcmk__err("Can't get fence agent '%s' meta-data: No such agent", + agent); break; } return -ENODEV; @@ -555,9 +558,9 @@ stonith_api_query(stonith_t * stonith, int call_options, const char *target, CRM_CHECK(devices != NULL, return -EINVAL); data = pcmk__xe_create(NULL, PCMK__XE_ST_DEVICE_ID); - crm_xml_add(data, PCMK__XA_ST_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_ST_TARGET, target); - crm_xml_add(data, PCMK__XA_ST_DEVICE_ACTION, PCMK_ACTION_OFF); + pcmk__xe_set(data, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_ST_TARGET, target); + pcmk__xe_set(data, PCMK__XA_ST_DEVICE_ACTION, PCMK_ACTION_OFF); rc = stonith_send_command(stonith, STONITH_OP_QUERY, data, &output, call_options, timeout); if (rc < 0) { @@ -575,11 +578,11 @@ stonith_api_query(stonith_t * stonith, int call_options, const char *target, if(match != NULL) { xmlChar *match_path = xmlGetNodePath(match); - crm_info("//*[@" PCMK_XA_AGENT "][%d] = %s", lpc, match_path); + pcmk__info("//*[@" PCMK_XA_AGENT "][%d] = %s", lpc, match_path); free(match_path); *devices = stonith_key_value_add(*devices, NULL, - crm_element_value(match, - PCMK_XA_ID)); + pcmk__xe_get(match, + PCMK_XA_ID)); } } @@ -612,10 +615,10 @@ stonith_api_call(stonith_t *stonith, int call_options, const char *id, xmlNode *data = NULL; data = pcmk__xe_create(NULL, PCMK__XE_ST_DEVICE_ID); - crm_xml_add(data, PCMK__XA_ST_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_ST_DEVICE_ID, id); - crm_xml_add(data, PCMK__XA_ST_DEVICE_ACTION, action); - crm_xml_add(data, PCMK__XA_ST_TARGET, target); + pcmk__xe_set(data, PCMK__XA_ST_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_ST_DEVICE_ID, id); + pcmk__xe_set(data, PCMK__XA_ST_DEVICE_ACTION, action); + pcmk__xe_set(data, PCMK__XA_ST_TARGET, target); rc = stonith_send_command(stonith, STONITH_OP_EXEC, data, output, call_options, timeout_sec); @@ -637,7 +640,7 @@ stonith_api_list(stonith_t * stonith, int call_options, const char *id, char **l if (output && list_info) { const char *list_str; - list_str = crm_element_value(output, PCMK__XA_ST_OUTPUT); + list_str = pcmk__xe_get(output, PCMK__XA_ST_OUTPUT); if (list_str) { *list_info = strdup(list_str); @@ -674,11 +677,11 @@ stonith_api_fence_with_delay(stonith_t * stonith, int call_options, const char * xmlNode *data = NULL; data = pcmk__xe_create(NULL, __func__); - crm_xml_add(data, PCMK__XA_ST_TARGET, node); - crm_xml_add(data, PCMK__XA_ST_DEVICE_ACTION, action); - crm_xml_add_int(data, PCMK__XA_ST_TIMEOUT, timeout); - crm_xml_add_int(data, PCMK__XA_ST_TOLERANCE, tolerance); - crm_xml_add_int(data, PCMK__XA_ST_DELAY, delay); + pcmk__xe_set(data, PCMK__XA_ST_TARGET, node); + pcmk__xe_set(data, PCMK__XA_ST_DEVICE_ACTION, action); + pcmk__xe_set_int(data, PCMK__XA_ST_TIMEOUT, timeout); + pcmk__xe_set_int(data, PCMK__XA_ST_TOLERANCE, tolerance); + pcmk__xe_set_int(data, PCMK__XA_ST_DELAY, delay); rc = stonith_send_command(stonith, STONITH_OP_FENCE, data, NULL, call_options, timeout); pcmk__xml_free(data); @@ -715,7 +718,7 @@ stonith_api_history(stonith_t * stonith, int call_options, const char *node, if (node) { data = pcmk__xe_create(NULL, __func__); - crm_xml_add(data, PCMK__XA_ST_TARGET, node); + pcmk__xe_set(data, PCMK__XA_ST_TARGET, node); } stonith__set_call_options(call_options, node, st_opt_sync_call); @@ -727,26 +730,28 @@ stonith_api_history(stonith_t * stonith, int call_options, const char *node, xmlNode *op = NULL; xmlNode *reply = pcmk__xpath_find_one(output->doc, "//" PCMK__XE_ST_HISTORY, - LOG_NEVER); + PCMK__LOG_NEVER); for (op = pcmk__xe_first_child(reply, NULL, NULL, NULL); op != NULL; op = pcmk__xe_next(op, NULL)) { - stonith_history_t *kvp; - long long completed; - long long completed_nsec = 0L; - - kvp = pcmk__assert_alloc(1, sizeof(stonith_history_t)); - kvp->target = crm_element_value_copy(op, PCMK__XA_ST_TARGET); - kvp->action = crm_element_value_copy(op, PCMK__XA_ST_DEVICE_ACTION); - kvp->origin = crm_element_value_copy(op, PCMK__XA_ST_ORIGIN); - kvp->delegate = crm_element_value_copy(op, PCMK__XA_ST_DELEGATE); - kvp->client = crm_element_value_copy(op, PCMK__XA_ST_CLIENTNAME); - crm_element_value_ll(op, PCMK__XA_ST_DATE, &completed); - kvp->completed = (time_t) completed; - crm_element_value_ll(op, PCMK__XA_ST_DATE_NSEC, &completed_nsec); - kvp->completed_nsec = completed_nsec; - crm_element_value_int(op, PCMK__XA_ST_STATE, &kvp->state); - kvp->exit_reason = crm_element_value_copy(op, PCMK_XA_EXIT_REASON); + stonith_history_t *kvp = + pcmk__assert_alloc(1, sizeof(stonith_history_t)); + long long completed_nsec = 0LL; + + kvp->target = pcmk__xe_get_copy(op, PCMK__XA_ST_TARGET); + kvp->action = pcmk__xe_get_copy(op, PCMK__XA_ST_DEVICE_ACTION); + kvp->origin = pcmk__xe_get_copy(op, PCMK__XA_ST_ORIGIN); + kvp->delegate = pcmk__xe_get_copy(op, PCMK__XA_ST_DELEGATE); + kvp->client = pcmk__xe_get_copy(op, PCMK__XA_ST_CLIENTNAME); + pcmk__xe_get_time(op, PCMK__XA_ST_DATE, &kvp->completed); + + pcmk__xe_get_ll(op, PCMK__XA_ST_DATE_NSEC, &completed_nsec); + if ((completed_nsec >= LONG_MIN) && (completed_nsec <= LONG_MAX)) { + kvp->completed_nsec = (long) completed_nsec; + } + + pcmk__xe_get_int(op, PCMK__XA_ST_STATE, &kvp->state); + kvp->exit_reason = pcmk__xe_get_copy(op, PCMK_XA_EXIT_REASON); if (last) { last->next = kvp; @@ -797,12 +802,12 @@ stonithlib_GCompareFunc(gconstpointer a, gconstpointer b) return 0; } else if (((long)a_client->notify) < ((long)b_client->notify)) { - crm_err("callbacks for %s are not equal: %p vs. %p", - a_client->event, a_client->notify, b_client->notify); + pcmk__err("callbacks for %s are not equal: %p vs. %p", + a_client->event, a_client->notify, b_client->notify); return -1; } - crm_err("callbacks for %s are not equal: %p vs. %p", - a_client->event, a_client->notify, b_client->notify); + pcmk__err("callbacks for %s are not equal: %p vs. %p", + a_client->event, a_client->notify, b_client->notify); return 1; } return rc; @@ -816,11 +821,12 @@ stonith_create_op(int call_id, const char *token, const char *op, xmlNode * data CRM_CHECK(token != NULL, return NULL); op_msg = pcmk__xe_create(NULL, PCMK__XE_STONITH_COMMAND); - crm_xml_add(op_msg, PCMK__XA_T, PCMK__VALUE_STONITH_NG); - crm_xml_add(op_msg, PCMK__XA_ST_OP, op); - crm_xml_add_int(op_msg, PCMK__XA_ST_CALLID, call_id); - crm_trace("Sending call options: %.8lx, %d", (long)call_options, call_options); - crm_xml_add_int(op_msg, PCMK__XA_ST_CALLOPT, call_options); + pcmk__xe_set(op_msg, PCMK__XA_T, PCMK__VALUE_STONITH_NG); + pcmk__xe_set(op_msg, PCMK__XA_ST_OP, op); + pcmk__xe_set_int(op_msg, PCMK__XA_ST_CALLID, call_id); + pcmk__trace("Sending call options: %.8lx, %d", (long) call_options, + call_options); + pcmk__xe_set_int(op_msg, PCMK__XA_ST_CALLOPT, call_options); if (data != NULL) { xmlNode *wrapper = pcmk__xe_create(op_msg, PCMK__XE_ST_CALLDATA); @@ -848,7 +854,7 @@ stonith_api_signoff(stonith_t * stonith) { stonith_private_t *native = stonith->st_private; - crm_debug("Disconnecting from the fencer"); + pcmk__debug("Disconnecting from the fencer"); if (native->source != NULL) { /* Attached to mainloop */ @@ -948,9 +954,9 @@ invoke_registered_callbacks(stonith_t *stonith, const xmlNode *msg, int call_id) } else { // We have the fencer reply - if ((crm_element_value_int(msg, PCMK__XA_ST_CALLID, &call_id) != 0) + if ((pcmk__xe_get_int(msg, PCMK__XA_ST_CALLID, &call_id) != pcmk_rc_ok) || (call_id <= 0)) { - crm_log_xml_warn(msg, "Bad fencer reply"); + pcmk__log_xml_warn(msg, "Bad fencer reply"); } stonith__xe_get_result(msg, &result); } @@ -962,22 +968,23 @@ invoke_registered_callbacks(stonith_t *stonith, const xmlNode *msg, int call_id) if ((cb_info != NULL) && (cb_info->callback != NULL) && (pcmk__result_ok(&result) || !(cb_info->only_success))) { - crm_trace("Invoking callback %s for call %d", - pcmk__s(cb_info->id, "without ID"), call_id); + pcmk__trace("Invoking callback %s for call %d", + pcmk__s(cb_info->id, "without ID"), call_id); invoke_fence_action_callback(stonith, call_id, &result, cb_info->user_data, cb_info->callback); } else if ((private->op_callback == NULL) && !pcmk__result_ok(&result)) { - crm_warn("Fencing action without registered callback failed: %d (%s%s%s)", - result.exit_status, - pcmk_exec_status_str(result.execution_status), - ((result.exit_reason == NULL)? "" : ": "), - ((result.exit_reason == NULL)? "" : result.exit_reason)); - crm_log_xml_debug(msg, "Failed fence update"); + pcmk__warn("Fencing action without registered callback failed: %d " + "(%s%s%s)", + result.exit_status, + pcmk_exec_status_str(result.execution_status), + ((result.exit_reason != NULL)? ": " : ""), + pcmk__s(result.exit_reason, "")); + pcmk__log_xml_debug(msg, "Failed fence update"); } if (private->op_callback != NULL) { - crm_trace("Invoking global callback for call %d", call_id); + pcmk__trace("Invoking global callback for call %d", call_id); invoke_fence_action_callback(stonith, call_id, &result, NULL, private->op_callback); } @@ -993,7 +1000,8 @@ stonith_async_timeout_handler(gpointer data) { struct timer_rec_s *timer = data; - crm_err("Async call %d timed out after %dms", timer->call_id, timer->timeout); + pcmk__err("Async call %d timed out after %dms", timer->call_id, + timer->timeout); invoke_registered_callbacks(timer->stonith, NULL, timer->call_id); /* Always return TRUE, never remove the handler @@ -1061,13 +1069,13 @@ stonith_dispatch_internal(const char *buffer, ssize_t length, gpointer userdata) blob.stonith = st; blob.xml = pcmk__xml_parse(buffer); if (blob.xml == NULL) { - crm_warn("Received malformed message from fencer: %s", buffer); + pcmk__warn("Received malformed message from fencer: %s", buffer); return 0; } /* do callbacks */ - type = crm_element_value(blob.xml, PCMK__XA_T); - crm_trace("Activating %s callbacks...", type); + type = pcmk__xe_get(blob.xml, PCMK__XA_T); + pcmk__trace("Activating %s callbacks...", type); if (pcmk__str_eq(type, PCMK__VALUE_STONITH_NG, pcmk__str_none)) { invoke_registered_callbacks(st, blob.xml, 0); @@ -1080,13 +1088,13 @@ stonith_dispatch_internal(const char *buffer, ssize_t length, gpointer userdata) int call_id = 0; int timeout = 0; - crm_element_value_int(blob.xml, PCMK__XA_ST_TIMEOUT, &timeout); - crm_element_value_int(blob.xml, PCMK__XA_ST_CALLID, &call_id); + pcmk__xe_get_int(blob.xml, PCMK__XA_ST_TIMEOUT, &timeout); + pcmk__xe_get_int(blob.xml, PCMK__XA_ST_CALLID, &call_id); update_callback_timeout(call_id, timeout, st); } else { - crm_err("Unknown message type: %s", type); - crm_log_xml_warn(blob.xml, "BadReply"); + pcmk__err("Unknown message type: %s", type); + pcmk__log_xml_warn(blob.xml, "BadReply"); } pcmk__xml_free(blob.xml); @@ -1110,8 +1118,8 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd) native = stonith->st_private; pcmk__assert(native != NULL); - crm_debug("Attempting fencer connection by %s with%s mainloop", - display_name, (stonith_fd? "out" : "")); + pcmk__debug("Attempting fencer connection by %s with%s mainloop", + display_name, ((stonith_fd != 0)? "out" : "")); stonith->state = stonith_connected_command; if (stonith_fd) { @@ -1122,8 +1130,8 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd) if (rc == pcmk_rc_ok) { rc = pcmk__ipc_fd(native->ipc, stonith_fd); if (rc != pcmk_rc_ok) { - crm_debug("Couldn't get file descriptor for IPC: %s", - pcmk_rc_str(rc)); + pcmk__debug("Couldn't get file descriptor for IPC: %s", + pcmk_rc_str(rc)); } } if (rc != pcmk_rc_ok) { @@ -1146,38 +1154,41 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd) xmlNode *reply = NULL; xmlNode *hello = pcmk__xe_create(NULL, PCMK__XE_STONITH_COMMAND); - crm_xml_add(hello, PCMK__XA_T, PCMK__VALUE_STONITH_NG); - crm_xml_add(hello, PCMK__XA_ST_OP, CRM_OP_REGISTER); - crm_xml_add(hello, PCMK__XA_ST_CLIENTNAME, name); + pcmk__xe_set(hello, PCMK__XA_T, PCMK__VALUE_STONITH_NG); + pcmk__xe_set(hello, PCMK__XA_ST_OP, CRM_OP_REGISTER); + pcmk__xe_set(hello, PCMK__XA_ST_CLIENTNAME, name); rc = crm_ipc_send(native->ipc, hello, crm_ipc_client_response, -1, &reply); if (rc < 0) { - crm_debug("Couldn't register with the fencer: %s " - QB_XS " rc=%d", pcmk_strerror(rc), rc); + pcmk__debug("Couldn't register with the fencer: %s " QB_XS " rc=%d", + pcmk_strerror(rc), rc); rc = -ECOMM; } else if (reply == NULL) { - crm_debug("Couldn't register with the fencer: no reply"); + pcmk__debug("Couldn't register with the fencer: no reply"); rc = -EPROTO; } else { - const char *msg_type = crm_element_value(reply, PCMK__XA_ST_OP); + const char *msg_type = pcmk__xe_get(reply, PCMK__XA_ST_OP); - native->token = crm_element_value_copy(reply, PCMK__XA_ST_CLIENTID); + native->token = pcmk__xe_get_copy(reply, PCMK__XA_ST_CLIENTID); if (!pcmk__str_eq(msg_type, CRM_OP_REGISTER, pcmk__str_none)) { - 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"); + pcmk__debug("Couldn't register with the fencer: invalid reply " + "type '%s'", + pcmk__s(msg_type, "(missing)")); + pcmk__log_xml_debug(reply, "Invalid fencer reply"); rc = -EPROTO; } else if (native->token == NULL) { - crm_debug("Couldn't register with the fencer: no token in reply"); - crm_log_xml_debug(reply, "Invalid fencer reply"); + pcmk__debug("Couldn't register with the fencer: no token in " + "reply"); + pcmk__log_xml_debug(reply, "Invalid fencer reply"); rc = -EPROTO; } else { - crm_debug("Connection to fencer by %s succeeded (registration token: %s)", - display_name, native->token); + pcmk__debug("Connection to fencer by %s succeeded " + "(registration token: %s)", + display_name, native->token); rc = pcmk_ok; } } @@ -1187,8 +1198,9 @@ stonith_api_signon(stonith_t * stonith, const char *name, int *stonith_fd) } if (rc != pcmk_ok) { - crm_debug("Connection attempt to fencer by %s failed: %s " - QB_XS " rc=%d", display_name, pcmk_strerror(rc), rc); + pcmk__debug("Connection attempt to fencer by %s failed: %s " + QB_XS " rc=%d", + display_name, pcmk_strerror(rc), rc); stonith->cmds->disconnect(stonith); } return rc; @@ -1203,11 +1215,11 @@ stonith_set_notification(stonith_t * stonith, const char *callback, int enabled) if (stonith->state != stonith_disconnected) { - crm_xml_add(notify_msg, PCMK__XA_ST_OP, STONITH_OP_NOTIFY); + pcmk__xe_set(notify_msg, PCMK__XA_ST_OP, STONITH_OP_NOTIFY); if (enabled) { - crm_xml_add(notify_msg, PCMK__XA_ST_NOTIFY_ACTIVATE, callback); + pcmk__xe_set(notify_msg, PCMK__XA_ST_NOTIFY_ACTIVATE, callback); } else { - crm_xml_add(notify_msg, PCMK__XA_ST_NOTIFY_DEACTIVATE, callback); + pcmk__xe_set(notify_msg, PCMK__XA_ST_NOTIFY_DEACTIVATE, callback); } rc = crm_ipc_send(native->ipc, notify_msg, crm_ipc_client_response, -1, NULL); @@ -1232,7 +1244,8 @@ stonith_api_add_notification(stonith_t * stonith, const char *event, stonith_private_t *private = NULL; private = stonith->st_private; - crm_trace("Adding callback for %s events (%d)", event, g_list_length(private->notify_list)); + pcmk__trace("Adding callback for %s events (%u)", event, + g_list_length(private->notify_list)); new_client = pcmk__assert_alloc(1, sizeof(stonith_notify_client_t)); new_client->event = event; @@ -1241,7 +1254,7 @@ stonith_api_add_notification(stonith_t * stonith, const char *event, list_item = g_list_find_custom(private->notify_list, new_client, stonithlib_GCompareFunc); if (list_item != NULL) { - crm_warn("Callback already present"); + pcmk__warn("Callback already present"); free(new_client); return -ENOTUNIQ; @@ -1250,7 +1263,7 @@ stonith_api_add_notification(stonith_t * stonith, const char *event, stonith_set_notification(stonith, event, 1); - crm_trace("Callback added (%d)", g_list_length(private->notify_list)); + pcmk__trace("Callback added (%u)", g_list_length(private->notify_list)); } return pcmk_ok; } @@ -1262,7 +1275,7 @@ del_notify_entry(gpointer data, gpointer user_data) stonith_t * stonith = user_data; if (!entry->delete) { - crm_debug("Removing callback for %s events", entry->event); + pcmk__debug("Removing callback for %s events", entry->event); stonith_api_del_notification(stonith, entry->event); } } @@ -1276,12 +1289,12 @@ stonith_api_del_notification(stonith_t * stonith, const char *event) if (event == NULL) { foreach_notify_entry(private, del_notify_entry, stonith); - crm_trace("Removed callback"); + pcmk__trace("Removed callback"); return pcmk_ok; } - crm_debug("Removing callback for %s events", event); + pcmk__debug("Removing callback for %s events", event); new_client = pcmk__assert_alloc(1, sizeof(stonith_notify_client_t)); new_client->event = event; @@ -1302,10 +1315,10 @@ stonith_api_del_notification(stonith_t * stonith, const char *event) free(list_client); } - crm_trace("Removed callback"); + pcmk__trace("Removed callback"); } else { - crm_trace("Callback not present"); + pcmk__trace("Callback not present"); } free(new_client); return pcmk_ok; @@ -1330,13 +1343,14 @@ stonith_api_add_callback(stonith_t * stonith, int call_id, int timeout, int opti if (!(options & st_opt_report_only_success)) { pcmk__action_result_t result = PCMK__UNKNOWN_RESULT; - crm_trace("Call failed, calling %s: %s", callback_name, pcmk_strerror(call_id)); + pcmk__trace("Call failed, calling %s: %s", callback_name, + pcmk_strerror(call_id)); pcmk__set_result(&result, CRM_EX_ERROR, stonith__legacy2status(call_id), NULL); invoke_fence_action_callback(stonith, call_id, &result, user_data, callback); } else { - crm_warn("Fencer call failed: %s", pcmk_strerror(call_id)); + pcmk__warn("Fencer call failed: %s", pcmk_strerror(call_id)); } return FALSE; } @@ -1354,7 +1368,7 @@ stonith_api_add_callback(stonith_t * stonith, int call_id, int timeout, int opti pcmk__intkey_table_insert(private->stonith_op_callback_table, call_id, blob); - crm_trace("Added callback to %s for call %d", callback_name, call_id); + pcmk__trace("Added callback to %s for call %d", callback_name, call_id); return TRUE; } @@ -1365,7 +1379,7 @@ stonith_dump_pending_op(gpointer key, gpointer value, gpointer user_data) int call = GPOINTER_TO_INT(key); stonith_callback_client_t *blob = value; - crm_debug("Call %d (%s): pending", call, pcmk__s(blob->id, "no ID")); + pcmk__debug("Call %d (%s): pending", call, pcmk__s(blob->id, "no ID")); } void @@ -1389,7 +1403,7 @@ stonith_dump_pending_callbacks(stonith_t * stonith) static xmlNode * get_event_data_xml(xmlNode *msg, const char *ntype) { - char *data_addr = crm_strdup_printf("//%s", ntype); + char *data_addr = pcmk__assert_asprintf("//%s", ntype); xmlNode *data = pcmk__xpath_find_one(msg->doc, data_addr, LOG_DEBUG); free(data_addr); @@ -1424,11 +1438,11 @@ xml_to_event(xmlNode *msg) event->opaque = pcmk__assert_alloc(1, sizeof(struct event_private)); event_private = (struct event_private *) event->opaque; - crm_log_xml_trace(msg, "stonith_notify"); + pcmk__log_xml_trace(msg, "stonith_notify"); // All notification types have the operation result and notification subtype stonith__xe_get_result(msg, &event_private->result); - event->operation = crm_element_value_copy(msg, PCMK__XA_ST_OP); + event->operation = pcmk__xe_get_copy(msg, PCMK__XA_ST_OP); // @COMPAT The API originally provided the result as a legacy return code event->result = pcmk_rc2legacy(stonith__result2rc(&event_private->result)); @@ -1440,19 +1454,17 @@ xml_to_event(xmlNode *msg) xmlNode *data = get_event_data_xml(msg, event->operation); if (data == NULL) { - crm_err("No data for %s event", event->operation); - crm_log_xml_notice(msg, "BadEvent"); + pcmk__err("No data for %s event", event->operation); + pcmk__log_xml_notice(msg, "BadEvent"); } else { - event->origin = crm_element_value_copy(data, PCMK__XA_ST_ORIGIN); - event->action = crm_element_value_copy(data, - PCMK__XA_ST_DEVICE_ACTION); - event->target = crm_element_value_copy(data, PCMK__XA_ST_TARGET); - event->executioner = crm_element_value_copy(data, - PCMK__XA_ST_DELEGATE); - event->id = crm_element_value_copy(data, PCMK__XA_ST_REMOTE_OP); - event->client_origin = - crm_element_value_copy(data, PCMK__XA_ST_CLIENTNAME); - event->device = crm_element_value_copy(data, PCMK__XA_ST_DEVICE_ID); + event->origin = pcmk__xe_get_copy(data, PCMK__XA_ST_ORIGIN); + event->action = pcmk__xe_get_copy(data, PCMK__XA_ST_DEVICE_ACTION); + event->target = pcmk__xe_get_copy(data, PCMK__XA_ST_TARGET); + event->executioner = pcmk__xe_get_copy(data, PCMK__XA_ST_DELEGATE); + event->id = pcmk__xe_get_copy(data, PCMK__XA_ST_REMOTE_OP); + event->client_origin = pcmk__xe_get_copy(data, + PCMK__XA_ST_CLIENTNAME); + event->device = pcmk__xe_get_copy(data, PCMK__XA_ST_DEVICE_ID); } } else if (pcmk__str_any_of(event->operation, @@ -1462,10 +1474,10 @@ xml_to_event(xmlNode *msg) xmlNode *data = get_event_data_xml(msg, event->operation); if (data == NULL) { - crm_err("No data for %s event", event->operation); - crm_log_xml_notice(msg, "BadEvent"); + pcmk__err("No data for %s event", event->operation); + pcmk__log_xml_notice(msg, "BadEvent"); } else { - event->device = crm_element_value_copy(data, PCMK__XA_ST_DEVICE_ID); + event->device = pcmk__xe_get_copy(data, PCMK__XA_ST_DEVICE_ID); } } @@ -1499,34 +1511,34 @@ stonith_send_notification(gpointer data, gpointer user_data) const char *event = NULL; if (blob->xml == NULL) { - crm_warn("Skipping callback - NULL message"); + pcmk__warn("Skipping callback - NULL message"); return; } - event = crm_element_value(blob->xml, PCMK__XA_SUBT); + event = pcmk__xe_get(blob->xml, PCMK__XA_SUBT); if (entry == NULL) { - crm_warn("Skipping callback - NULL callback client"); + pcmk__warn("Skipping callback - NULL callback client"); return; } else if (entry->delete) { - crm_trace("Skipping callback - marked for deletion"); + pcmk__trace("Skipping callback - marked for deletion"); return; } else if (entry->notify == NULL) { - crm_warn("Skipping callback - NULL callback"); + pcmk__warn("Skipping callback - NULL callback"); return; } else if (!pcmk__str_eq(entry->event, event, pcmk__str_none)) { - crm_trace("Skipping callback - event mismatch %p/%s vs. %s", entry, entry->event, event); + pcmk__trace("Skipping callback - event mismatch %p/%s vs. %s", entry, entry->event, event); return; } st_event = xml_to_event(blob->xml); - crm_trace("Invoking callback for %p/%s event...", entry, event); + pcmk__trace("Invoking callback for %p/%s event...", entry, event); entry->notify(blob->stonith, st_event); - crm_trace("Callback invoked..."); + pcmk__trace("Callback invoked..."); event_free(st_event); } @@ -1582,14 +1594,14 @@ stonith_send_command(stonith_t * stonith, const char *op, xmlNode * data, xmlNod return -EINVAL; } - crm_xml_add_int(op_msg, PCMK__XA_ST_TIMEOUT, timeout); - crm_trace("Sending %s message to fencer with timeout %ds", op, timeout); + pcmk__xe_set_int(op_msg, PCMK__XA_ST_TIMEOUT, timeout); + pcmk__trace("Sending %s message to fencer with timeout %ds", op, timeout); if (data) { - const char *delay_s = crm_element_value(data, PCMK__XA_ST_DELAY); + const char *delay_s = pcmk__xe_get(data, PCMK__XA_ST_DELAY); if (delay_s) { - crm_xml_add(op_msg, PCMK__XA_ST_DELAY, delay_s); + pcmk__xe_set(op_msg, PCMK__XA_ST_DELAY, delay_s); } } @@ -1611,27 +1623,27 @@ stonith_send_command(stonith_t * stonith, const char *op, xmlNode * data, xmlNod goto done; } - crm_log_xml_trace(op_reply, "Reply"); + pcmk__log_xml_trace(op_reply, "Reply"); if (!(call_options & st_opt_sync_call)) { - crm_trace("Async call %d, returning", stonith->call_id); + pcmk__trace("Async call %d, returning", stonith->call_id); pcmk__xml_free(op_reply); return stonith->call_id; } - crm_element_value_int(op_reply, PCMK__XA_ST_CALLID, &reply_id); + pcmk__xe_get_int(op_reply, PCMK__XA_ST_CALLID, &reply_id); if (reply_id == stonith->call_id) { pcmk__action_result_t result = PCMK__UNKNOWN_RESULT; - crm_trace("Synchronous reply %d received", reply_id); + pcmk__trace("Synchronous reply %d received", reply_id); stonith__xe_get_result(op_reply, &result); rc = pcmk_rc2legacy(stonith__result2rc(&result)); pcmk__reset_result(&result); if ((call_options & st_opt_discard_reply) || output_data == NULL) { - crm_trace("Discarding reply"); + pcmk__trace("Discarding reply"); } else { *output_data = op_reply; @@ -1639,15 +1651,16 @@ stonith_send_command(stonith_t * stonith, const char *op, xmlNode * data, xmlNod } } else if (reply_id <= 0) { - crm_err("Received bad reply: No id set"); - crm_log_xml_err(op_reply, "Bad reply"); + pcmk__err("Received bad reply: No id set"); + pcmk__log_xml_err(op_reply, "Bad reply"); pcmk__xml_free(op_reply); op_reply = NULL; rc = -ENOMSG; } else { - crm_err("Received bad reply: %d (wanted %d)", reply_id, stonith->call_id); - crm_log_xml_err(op_reply, "Old reply"); + pcmk__err("Received bad reply: %d (wanted %d)", reply_id, + stonith->call_id); + pcmk__log_xml_err(op_reply, "Old reply"); pcmk__xml_free(op_reply); op_reply = NULL; rc = -ENOMSG; @@ -1655,7 +1668,7 @@ stonith_send_command(stonith_t * stonith, const char *op, xmlNode * data, xmlNod done: if (!crm_ipc_connected(native->ipc)) { - crm_err("Fencer disconnected"); + pcmk__err("Fencer disconnected"); free(native->token); native->token = NULL; stonith->state = stonith_disconnected; } @@ -1683,7 +1696,7 @@ stonith_dispatch(stonith_t * st) } if (!crm_ipc_connected(private->ipc)) { - crm_err("Connection closed"); + pcmk__err("Connection closed"); stay_connected = FALSE; } } @@ -1696,11 +1709,11 @@ stonith_api_free(stonith_t * stonith) { int rc = pcmk_ok; - crm_trace("Destroying %p", stonith); + pcmk__trace("Destroying %p", stonith); if (stonith->state != stonith_disconnected) { - crm_trace("Unregistering notifications and disconnecting %p first", - stonith); + pcmk__trace("Unregistering notifications and disconnecting %p first", + stonith); stonith->cmds->remove_notification(stonith, NULL); rc = stonith->cmds->disconnect(stonith); } @@ -1708,10 +1721,12 @@ stonith_api_free(stonith_t * stonith) if (stonith->state == stonith_disconnected) { stonith_private_t *private = stonith->st_private; - crm_trace("Removing %d callbacks", g_hash_table_size(private->stonith_op_callback_table)); + pcmk__trace("Removing %u callbacks", + g_hash_table_size(private->stonith_op_callback_table)); g_hash_table_destroy(private->stonith_op_callback_table); - crm_trace("Destroying %d notification clients", g_list_length(private->notify_list)); + pcmk__trace("Destroying %u notification clients", + g_list_length(private->notify_list)); g_list_free_full(private->notify_list, free); free(stonith->st_private); @@ -1719,7 +1734,8 @@ stonith_api_free(stonith_t * stonith) free(stonith); } else { - crm_err("Not free'ing active connection: %s (%d)", pcmk_strerror(rc), rc); + pcmk__err("Not free'ing active connection: %s (%d)", pcmk_strerror(rc), + rc); } return rc; @@ -1728,7 +1744,7 @@ stonith_api_free(stonith_t * stonith) void stonith_api_delete(stonith_t * stonith) { - crm_trace("Destroying %p", stonith); + pcmk__trace("Destroying %p", stonith); if(stonith) { stonith->cmds->free(stonith); } @@ -1765,8 +1781,9 @@ stonith__validate(stonith_t *st, int call_options, const char *rsc_id, #if PCMK__ENABLE_CIBSECRETS rc = pcmk__substitute_secrets(rsc_id, params); if (rc != pcmk_rc_ok) { - crm_warn("Could not replace secret parameters for validation of %s: %s", - agent, pcmk_rc_str(rc)); + pcmk__warn("Could not replace secret parameters for validation of %s: " + "%s", + agent, pcmk_rc_str(rc)); // rc is standard return value, don't return it in this function } #endif @@ -1804,9 +1821,10 @@ stonith__validate(stonith_t *st, int call_options, const char *rsc_id, rc = errno; if (error_output) { - *error_output = crm_strdup_printf("Agent %s not found", agent); + *error_output = pcmk__assert_asprintf("Agent %s not found", + agent); } else { - crm_err("Agent %s not found", agent); + pcmk__err("Agent %s not found", agent); } break; @@ -1816,10 +1834,11 @@ stonith__validate(stonith_t *st, int call_options, const char *rsc_id, rc = errno; if (error_output) { - *error_output = crm_strdup_printf("Agent %s does not support validation", - agent); + *error_output = pcmk__assert_asprintf("Agent %s does not " + "support validation", + agent); } else { - crm_err("Agent %s does not support validation", agent); + pcmk__err("Agent %s does not support validation", agent); } break; @@ -1946,14 +1965,14 @@ stonith_api_connect_retry(stonith_t *st, const char *name, int max_attempts) 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 " - QB_XS " rc=%d", - attempt, max_attempts, pcmk_strerror(rc), rc); + pcmk__notice("Fencer connection attempt %d of %d failed (retrying " + "in 2s): %s " QB_XS " rc=%d", + attempt, max_attempts, pcmk_strerror(rc), rc); sleep(2); } } - crm_notice("Could not connect to fencer: %s " QB_XS " rc=%d", - pcmk_strerror(rc), rc); + pcmk__notice("Could not connect to fencer: %s " QB_XS " rc=%d", + pcmk_strerror(rc), rc); return rc; } @@ -2121,7 +2140,7 @@ stonith_agent_exists(const char *agent, int timeout) st = stonith_api_new(); if (st == NULL) { - crm_err("Could not list fence agents: API memory allocation failed"); + pcmk__err("Could not list fence agents: API memory allocation failed"); return FALSE; } st->cmds->list_agents(st, st_opt_sync_call, NULL, &devices, timeout == 0 ? 120 : timeout); @@ -2171,7 +2190,7 @@ parse_list_line(const char *line, int len, GList **output) * @TODO Document or eliminate the implied restriction of target names */ if (strstr(line, "invalid") || strstr(line, "variable")) { - crm_debug("Skipping list output line: %s", line); + pcmk__debug("Skipping list output line: %s", line); return; } @@ -2199,9 +2218,9 @@ parse_list_line(const char *line, int len, GList **output) */ rc = sscanf(line + entry_start, "%[a-zA-Z0-9_-.]", entry); if (rc != 1) { - crm_warn("Could not parse list output entry: %s " - QB_XS " entry_start=%d position=%d", - line + entry_start, entry_start, i); + pcmk__warn("Could not parse list output entry: %s " + QB_XS " entry_start=%d position=%d", + (line + entry_start), entry_start, i); free(entry); } else if (pcmk__strcase_any_of(entry, PCMK_ACTION_ON, @@ -2456,7 +2475,7 @@ stonith__device_parameter_flags(uint32_t *device_flags, const char *device_name, continue; } - parameter = crm_element_value(match, PCMK_XA_NAME); + parameter = pcmk__xe_get(match, PCMK_XA_NAME); if (pcmk__str_eq(parameter, "plug", pcmk__str_casei)) { stonith__set_device_flags(*device_flags, device_name, @@ -2540,8 +2559,8 @@ stonith__metadata_async(const char *agent, int timeout_sec, pcmk__action_result_t result = { .exit_status = CRM_EX_NOSUCH, .execution_status = PCMK_EXEC_ERROR_HARD, - .exit_reason = crm_strdup_printf("No such agent '%s'", - agent), + .exit_reason = pcmk__assert_asprintf("No such agent '%s'", + agent), .action_stdout = NULL, .action_stderr = NULL, }; @@ -2701,33 +2720,37 @@ stonith__event_description(const stonith_event_t *event) if (pcmk__str_eq(event->operation, PCMK__VALUE_ST_NOTIFY_HISTORY, pcmk__str_none)) { - return crm_strdup_printf("Fencing history may have changed"); + return pcmk__assert_asprintf("Fencing history may have changed"); } else if (pcmk__str_eq(event->operation, STONITH_OP_DEVICE_ADD, pcmk__str_none)) { - return crm_strdup_printf("A fencing device (%s) was added", device); + return pcmk__assert_asprintf("A fencing device (%s) was added", device); } else if (pcmk__str_eq(event->operation, STONITH_OP_DEVICE_DEL, pcmk__str_none)) { - return crm_strdup_printf("A fencing device (%s) was removed", device); + return pcmk__assert_asprintf("A fencing device (%s) was removed", + device); } else if (pcmk__str_eq(event->operation, STONITH_OP_LEVEL_ADD, pcmk__str_none)) { - return crm_strdup_printf("A fencing topology level (%s) was added", - device); + return pcmk__assert_asprintf("A fencing topology level (%s) was added", + device); } else if (pcmk__str_eq(event->operation, STONITH_OP_LEVEL_DEL, pcmk__str_none)) { - return crm_strdup_printf("A fencing topology level (%s) was removed", - device); + return pcmk__assert_asprintf("A fencing topology level (%s) was " + "removed", + device); } // event->operation should be PCMK__VALUE_ST_NOTIFY_FENCE at this point - return crm_strdup_printf("Operation %s of %s by %s for %s@%s: %s%s%s%s (ref=%s)", - action, target, executioner, origin, origin_node, - status, - ((reason == NULL)? "" : " ("), pcmk__s(reason, ""), - ((reason == NULL)? "" : ")"), - pcmk__s(event->id, "(none)")); + return pcmk__assert_asprintf("Operation %s of %s by %s for %s@%s: %s%s%s%s " + "(ref=%s)", + action, target, executioner, origin, + origin_node, status, + ((reason == NULL)? "" : " ("), + pcmk__s(reason, ""), + ((reason == NULL)? "" : ")"), + pcmk__s(event->id, "(none)")); } diff --git a/lib/fencing/st_lha.c b/lib/fencing/st_lha.c index 7c42c69270a..8de64971f1c 100644 --- a/lib/fencing/st_lha.c +++ b/lib/fencing/st_lha.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -67,14 +67,14 @@ find_library_function(void **handle, const char *lib, const char *fn) if (*handle == NULL) { *handle = dlopen(lib, RTLD_LAZY); if ((*handle) == NULL) { - crm_err("Could not open %s: %s", lib, dlerror()); + pcmk__err("Could not open %s: %s", lib, dlerror()); return NULL; } } a_function = dlsym(*handle, fn); if (a_function == NULL) { - crm_err("Could not find %s in %s: %s", fn, lib, dlerror()); + pcmk__err("Could not find %s in %s: %s", fn, lib, dlerror()); } return a_function; @@ -141,7 +141,7 @@ stonith__list_lha_agents(stonith_key_value_t **devices) } for (entry = type_list; entry != NULL && *entry; ++entry) { - crm_trace("Added: %s", *entry); + pcmk__trace("Added: %s", *entry); *devices = stonith_key_value_add(*devices, NULL, *entry); count++; } @@ -221,21 +221,21 @@ stonith__lha_metadata(const char *agent, int timeout, char **output) meta_longdesc = pcmk__str_copy(st_info_fn(stonith_obj, ST_DEVICEDESCR)); if (meta_longdesc == NULL) { - crm_warn("no long description in %s's metadata.", agent); + pcmk__warn("No long description in %s's metadata", agent); meta_longdesc = pcmk__str_copy(no_parameter_info); } meta_shortdesc = pcmk__str_copy(st_info_fn(stonith_obj, ST_DEVICEID)); if (meta_shortdesc == NULL) { - crm_warn("no short description in %s's metadata.", agent); + pcmk__warn("No short description in %s's metadata", agent); meta_shortdesc = pcmk__str_copy(no_parameter_info); } meta_param = pcmk__str_copy(st_info_fn(stonith_obj, ST_CONF_XML)); if (meta_param == NULL) { - crm_warn("no list of parameters in %s's metadata.", agent); + pcmk__warn("No list of parameters in %s's metadata", agent); meta_param = pcmk__str_copy(no_parameter_info); } @@ -256,18 +256,18 @@ stonith__lha_metadata(const char *agent, int timeout, char **output) pcmk__xml_escape_text); } - /* @TODO This needs a string that's parsable by crm_get_msec(). In + /* @TODO This needs a string that's parsable by pcmk__parse_ms(). In * general, pcmk__readable_interval() doesn't provide that. It works * here because PCMK_DEFAULT_ACTION_TIMEOUT_MS is 20000 -> "20s". */ timeout_str = pcmk__readable_interval(PCMK_DEFAULT_ACTION_TIMEOUT_MS); - buffer = crm_strdup_printf(META_TEMPLATE, agent, - ((meta_longdesc_esc != NULL) ? - meta_longdesc_esc : meta_longdesc), - ((meta_shortdesc_esc != NULL) ? - meta_shortdesc_esc : meta_shortdesc), - meta_param, timeout_str, timeout_str, - timeout_str); + buffer = pcmk__assert_asprintf(META_TEMPLATE, agent, + pcmk__s(meta_longdesc_esc, + meta_longdesc), + pcmk__s(meta_shortdesc_esc, + meta_shortdesc), + meta_param, timeout_str, timeout_str, + timeout_str); g_free(meta_longdesc_esc); g_free(meta_shortdesc_esc); diff --git a/lib/fencing/st_output.c b/lib/fencing/st_output.c index 786f9d5a2dd..98b836b76de 100644 --- a/lib/fencing/st_output.c +++ b/lib/fencing/st_output.c @@ -1,5 +1,5 @@ /* - * Copyright 2019-2024 the Pacemaker project contributors + * Copyright 2019-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -102,7 +102,7 @@ stonith__history_description(const stonith_history_t *history, stonith_action_str(history->action), " of ", history->target, NULL); - if (!pcmk_is_set(show_opts, pcmk_show_failed_detail)) { + if (!pcmk__is_set(show_opts, pcmk_show_failed_detail)) { // More human-friendly if (((history->state == st_failed) || (history->state == st_done)) && (history->delegate != NULL)) { @@ -123,7 +123,7 @@ stonith__history_description(const stonith_history_t *history, pcmk__g_strcat(str, " (", history->exit_reason, ")", NULL); } - if (pcmk_is_set(show_opts, pcmk_show_failed_detail)) { + if (pcmk__is_set(show_opts, pcmk_show_failed_detail)) { // More technical g_string_append(str, ": "); @@ -190,7 +190,8 @@ failed_history(pcmk__output_t *out, va_list args) PCMK__OUTPUT_LIST_HEADER(out, print_spacer, rc, "Failed Fencing Actions"); out->message(out, "stonith-event", hp, - pcmk_all_flags_set(section_opts, pcmk_section_fencing_all), + pcmk__all_flags_set(section_opts, + pcmk_section_fencing_all), false, stonith__later_succeeded(hp, history), show_opts); out->increment_list(out); } @@ -220,8 +221,8 @@ stonith_history(pcmk__output_t *out, va_list args) if (hp->state != st_failed) { PCMK__OUTPUT_LIST_HEADER(out, print_spacer, rc, "Fencing History"); out->message(out, "stonith-event", hp, - pcmk_all_flags_set(section_opts, - pcmk_section_fencing_all), + pcmk__all_flags_set(section_opts, + pcmk_section_fencing_all), false, stonith__later_succeeded(hp, history), show_opts); out->increment_list(out); } @@ -252,7 +253,8 @@ full_history(pcmk__output_t *out, va_list args) PCMK__OUTPUT_LIST_HEADER(out, print_spacer, rc, "Fencing History"); out->message(out, "stonith-event", hp, - pcmk_all_flags_set(section_opts, pcmk_section_fencing_all), + pcmk__all_flags_set(section_opts, + pcmk_section_fencing_all), false, stonith__later_succeeded(hp, history), show_opts); out->increment_list(out); } @@ -283,8 +285,8 @@ full_history_xml(pcmk__output_t *out, va_list args) PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Fencing History"); out->message(out, "stonith-event", hp, - pcmk_all_flags_set(section_opts, - pcmk_section_fencing_all), + pcmk__all_flags_set(section_opts, + pcmk_section_fencing_all), false, stonith__later_succeeded(hp, history), show_opts); out->increment_list(out); } @@ -311,7 +313,8 @@ last_fenced_html(pcmk__output_t *out, va_list args) { time_t when = va_arg(args, time_t); if (when) { - char *buf = crm_strdup_printf("Node %s last fenced at: %s", target, ctime(&when)); + char *buf = pcmk__assert_asprintf("Node %s last fenced at: %s", target, + ctime(&when)); pcmk__output_create_html_node(out, PCMK__XE_DIV, NULL, NULL, buf); free(buf); return pcmk_rc_ok; @@ -381,7 +384,8 @@ pending_actions(pcmk__output_t *out, va_list args) PCMK__OUTPUT_LIST_HEADER(out, print_spacer, rc, "Pending Fencing Actions"); out->message(out, "stonith-event", hp, - pcmk_all_flags_set(section_opts, pcmk_section_fencing_all), + pcmk__all_flags_set(section_opts, + pcmk_section_fencing_all), false, stonith__later_succeeded(hp, history), show_opts); out->increment_list(out); } @@ -474,7 +478,7 @@ stonith_event_xml(pcmk__output_t *out, va_list args) break; case st_done: - crm_xml_add(node, PCMK_XA_STATUS, PCMK_VALUE_SUCCESS); + pcmk__xe_set(node, PCMK_XA_STATUS, PCMK_VALUE_SUCCESS); break; default: { @@ -489,14 +493,14 @@ stonith_event_xml(pcmk__output_t *out, va_list args) } if (event->delegate != NULL) { - crm_xml_add(node, PCMK_XA_DELEGATE, event->delegate); + pcmk__xe_set(node, PCMK_XA_DELEGATE, event->delegate); } if ((event->state == st_failed) || (event->state == st_done)) { char *time_s = timespec_string(event->completed, event->completed_nsec, true); - crm_xml_add(node, PCMK_XA_COMPLETED, time_s); + pcmk__xe_set(node, PCMK_XA_COMPLETED, time_s); free(time_s); } @@ -512,15 +516,17 @@ validate_agent_html(pcmk__output_t *out, va_list args) { const char *output = va_arg(args, const char *); const char *error_output = va_arg(args, const char *); int rc = va_arg(args, int); + const char *rc_s = (rc == pcmk_rc_ok)? "succeeded" : "failed"; if (device) { - char *buf = crm_strdup_printf("Validation of %s on %s %s", agent, device, - rc ? "failed" : "succeeded"); + char *buf = pcmk__assert_asprintf("Validation of %s on %s %s", agent, + device, rc_s); + pcmk__output_create_html_node(out, PCMK__XE_DIV, NULL, NULL, buf); free(buf); } else { - char *buf = crm_strdup_printf("Validation of %s %s", agent, - rc ? "failed" : "succeeded"); + char *buf = pcmk__assert_asprintf("Validation of %s %s", agent, rc_s); + pcmk__output_create_html_node(out, PCMK__XE_DIV, NULL, NULL, buf); free(buf); } @@ -568,7 +574,7 @@ validate_agent_xml(pcmk__output_t *out, va_list args) { NULL); if (device != NULL) { - crm_xml_add(node, PCMK_XA_DEVICE, device); + pcmk__xe_set(node, PCMK_XA_DEVICE, device); } pcmk__output_xml_push_parent(out, node); diff --git a/lib/fencing/st_rhcs.c b/lib/fencing/st_rhcs.c index 6d0c6f94476..dd6c07d1755 100644 --- a/lib/fencing/st_rhcs.c +++ b/lib/fencing/st_rhcs.c @@ -45,7 +45,7 @@ rhcs_agent_filter(const struct dirent *entry) } // glibc doesn't enforce PATH_MAX, so don't limit buf size - buf = crm_strdup_printf(PCMK__FENCE_BINDIR "/%s", entry->d_name); + buf = pcmk__assert_asprintf(PCMK__FENCE_BINDIR "/%s", entry->d_name); if ((stat(buf, &sb) != 0) || !S_ISREG(sb.st_mode)) { goto done; } @@ -75,7 +75,7 @@ stonith__list_rhcs_agents(stonith_key_value_t **devices) if (file_num < 0) { int rc = errno; - crm_err("Could not list " PCMK__FENCE_BINDIR ": %s", pcmk_rc_str(rc)); + pcmk__err("Could not list " PCMK__FENCE_BINDIR ": %s", pcmk_rc_str(rc)); free(namelist); return 0; } @@ -97,8 +97,9 @@ stonith_rhcs_parameter_not_required(xmlNode *metadata, const char *parameter) CRM_CHECK(metadata != NULL, return); CRM_CHECK(parameter != NULL, return); - xpath = crm_strdup_printf("//" PCMK_XE_PARAMETER "[@" PCMK_XA_NAME "='%s']", - parameter); + xpath = pcmk__assert_asprintf("//" PCMK_XE_PARAMETER + "[@" PCMK_XA_NAME "='%s']", + parameter); /* Fudge metadata so that the parameter isn't required in config * Pacemaker handles and adds it */ xpathObj = pcmk__xpath_search(metadata->doc, xpath); @@ -106,7 +107,7 @@ stonith_rhcs_parameter_not_required(xmlNode *metadata, const char *parameter) xmlNode *tmp = pcmk__xpath_result(xpathObj, 0); if (tmp != NULL) { - crm_xml_add(tmp, "required", "0"); + pcmk__xe_set(tmp, "required", "0"); } } xmlXPathFreeObject(xpathObj); @@ -136,31 +137,32 @@ stonith__rhcs_get_metadata(const char *agent, int timeout_sec, if (result == NULL) { if (rc < 0) { - crm_warn("Could not execute metadata action for %s: %s " - QB_XS " rc=%d", agent, pcmk_strerror(rc), rc); + pcmk__warn("Could not execute metadata action for %s: %s " + QB_XS " rc=%d", + agent, pcmk_strerror(rc), rc); } stonith__destroy_action(action); return rc; } if (result->execution_status != PCMK_EXEC_DONE) { - crm_warn("Could not execute metadata action for %s: %s", - agent, pcmk_exec_status_str(result->execution_status)); + pcmk__warn("Could not execute metadata action for %s: %s", agent, + pcmk_exec_status_str(result->execution_status)); rc = pcmk_rc2legacy(stonith__result2rc(result)); stonith__destroy_action(action); return rc; } if (!pcmk__result_ok(result)) { - crm_warn("Metadata action for %s returned error code %d", - agent, result->exit_status); + pcmk__warn("Metadata action for %s returned error code %d", agent, + result->exit_status); rc = pcmk_rc2legacy(stonith__result2rc(result)); stonith__destroy_action(action); return rc; } if (result->action_stdout == NULL) { - crm_warn("Metadata action for %s returned no data", agent); + pcmk__warn("Metadata action for %s returned no data", agent); stonith__destroy_action(action); return -ENODATA; } @@ -169,7 +171,7 @@ stonith__rhcs_get_metadata(const char *agent, int timeout_sec, stonith__destroy_action(action); if (xml == NULL) { - crm_warn("Metadata for %s is invalid", agent); + pcmk__warn("Metadata for %s is invalid", agent); return -pcmk_err_schema_validation; } @@ -190,12 +192,12 @@ stonith__rhcs_get_metadata(const char *agent, int timeout_sec, timeout_str = pcmk__readable_interval(PCMK_DEFAULT_ACTION_TIMEOUT_MS); tmp = pcmk__xe_create(actions, PCMK_XE_ACTION); - crm_xml_add(tmp, PCMK_XA_NAME, PCMK_ACTION_STOP); - crm_xml_add(tmp, PCMK_META_TIMEOUT, timeout_str); + pcmk__xe_set(tmp, PCMK_XA_NAME, PCMK_ACTION_STOP); + pcmk__xe_set(tmp, PCMK_META_TIMEOUT, timeout_str); tmp = pcmk__xe_create(actions, PCMK_XE_ACTION); - crm_xml_add(tmp, PCMK_XA_NAME, PCMK_ACTION_START); - crm_xml_add(tmp, PCMK_META_TIMEOUT, timeout_str); + pcmk__xe_set(tmp, PCMK_XA_NAME, PCMK_ACTION_START); + pcmk__xe_set(tmp, PCMK_META_TIMEOUT, timeout_str); } xmlXPathFreeObject(xpathObj); @@ -257,7 +259,7 @@ bool stonith__agent_is_rhcs(const char *agent) { struct stat prop; - char *buffer = crm_strdup_printf(PCMK__FENCE_BINDIR "/%s", agent); + char *buffer = pcmk__assert_asprintf(PCMK__FENCE_BINDIR "/%s", agent); int rc = stat(buffer, &prop); free(buffer); @@ -285,11 +287,11 @@ stonith__rhcs_validate(stonith_t *st, int call_options, const char *target, uint32_t device_flags = 0; stonith__device_parameter_flags(&device_flags, agent, metadata); - if (pcmk_is_set(device_flags, st_device_supports_parameter_port)) { + if (pcmk__is_set(device_flags, st_device_supports_parameter_port)) { host_arg = "port"; - } else if (pcmk_is_set(device_flags, - st_device_supports_parameter_plug)) { + } else if (pcmk__is_set(device_flags, + st_device_supports_parameter_plug)) { host_arg = "plug"; } } diff --git a/lib/lrmd/lrmd_alerts.c b/lib/lrmd/lrmd_alerts.c index 59e8ed8cd9f..1bc5abb7e9d 100644 --- a/lib/lrmd/lrmd_alerts.c +++ b/lib/lrmd/lrmd_alerts.c @@ -1,5 +1,5 @@ /* - * Copyright 2015-2024 the Pacemaker project contributors + * Copyright 2015-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -30,7 +30,7 @@ alert_key2param(lrmd_key_value_t *head, enum pcmk__alert_keys_e name, if (value == NULL) { value = ""; } - crm_trace("Setting alert key %s = '%s'", pcmk__alert_keys[name], value); + pcmk__trace("Setting alert key %s = '%s'", pcmk__alert_keys[name], value); return lrmd_key_value_add(head, pcmk__alert_keys[name], value); } @@ -49,7 +49,7 @@ static lrmd_key_value_t * alert_key2param_ms(lrmd_key_value_t *head, enum pcmk__alert_keys_e name, guint value) { - char *value_s = crm_strdup_printf("%u", value); + char *value_s = pcmk__assert_asprintf("%u", value); head = alert_key2param(head, name, value_s); free(value_s); @@ -62,8 +62,8 @@ set_ev_kv(gpointer key, gpointer value, gpointer user_data) lrmd_key_value_t **head = (lrmd_key_value_t **) user_data; if (value) { - crm_trace("Setting environment variable %s='%s'", - (char*)key, (char*)value); + pcmk__trace("Setting environment variable %s='%s'", (const char*) key, + (const char *) value); *head = lrmd_key_value_add(*head, key, value); } } @@ -141,25 +141,25 @@ exec_alert_list(lrmd_t *lrmd, const GList *alert_list, lrmd_key_value_t *head = NULL; int rc; - if (!pcmk_is_set(entry->flags, kind)) { - crm_trace("Filtering unwanted %s alert to %s via %s", - kind_s, entry->recipient, entry->id); + if (!pcmk__is_set(entry->flags, kind)) { + pcmk__trace("Filtering unwanted %s alert to %s via %s", kind_s, + entry->recipient, entry->id); continue; } if ((kind == pcmk__alert_attribute) && !is_target_alert(entry->select_attribute_name, attr_name)) { - crm_trace("Filtering unwanted attribute '%s' alert to %s via %s", - attr_name, entry->recipient, entry->id); + pcmk__trace("Filtering unwanted attribute '%s' alert to %s via %s", + attr_name, entry->recipient, entry->id); continue; } if (now == NULL) { now = pcmk__time_hr_now(&epoch); } - crm_info("Sending %s alert via %s to %s", - kind_s, entry->id, entry->recipient); + pcmk__info("Sending %s alert via %s to %s", kind_s, entry->id, + entry->recipient); /* Make a copy of the parameters, because each alert will be unique */ for (head = params; head != NULL; head = head->next) { @@ -195,8 +195,8 @@ exec_alert_list(lrmd_t *lrmd, const GList *alert_list, rc = lrmd->cmds->exec_alert(lrmd, entry->id, entry->path, entry->timeout, copy_params); if (rc < 0) { - crm_err("Could not execute alert %s: %s " QB_XS " rc=%d", - entry->id, pcmk_strerror(rc), rc); + pcmk__err("Could not execute alert %s: %s " QB_XS " rc=%d", + entry->id, pcmk_strerror(rc), rc); any_failure = TRUE; } else { any_success = TRUE; diff --git a/lib/lrmd/lrmd_client.c b/lib/lrmd/lrmd_client.c index 23879814f5c..fa8ff81d71e 100644 --- a/lib/lrmd/lrmd_client.c +++ b/lib/lrmd/lrmd_client.c @@ -30,6 +30,7 @@ #include #include #include +#include // hash2smartfield(), xml2list() #include #include #include @@ -267,8 +268,7 @@ lrmd_dispatch_internal(gpointer data, gpointer user_data) lrmd_t *lrmd = user_data; const char *type; - const char *proxy_session = crm_element_value(msg, - PCMK__XA_LRMD_IPC_SESSION); + const char *proxy_session = pcmk__xe_get(msg, PCMK__XA_LRMD_IPC_SESSION); lrmd_private_t *native = lrmd->lrmd_private; lrmd_event_data_t event = { 0, }; @@ -278,14 +278,14 @@ lrmd_dispatch_internal(gpointer data, gpointer user_data) return; } else if (!native->callback) { /* no callback set */ - crm_trace("notify event received but client has not set callback"); + pcmk__trace("notify event received but client has not set callback"); return; } event.remote_nodename = native->remote_nodename; - type = crm_element_value(msg, PCMK__XA_LRMD_OP); - crm_element_value_int(msg, PCMK__XA_LRMD_CALLID, &event.call_id); - event.rsc_id = crm_element_value(msg, PCMK__XA_LRMD_RSC_ID); + type = pcmk__xe_get(msg, PCMK__XA_LRMD_OP); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_CALLID, &event.call_id); + event.rsc_id = pcmk__xe_get(msg, PCMK__XA_LRMD_RSC_ID); if (pcmk__str_eq(type, LRMD_OP_RSC_REG, pcmk__str_none)) { event.type = lrmd_event_register; @@ -295,45 +295,37 @@ lrmd_dispatch_internal(gpointer data, gpointer user_data) int rc = 0; int exec_time = 0; int queue_time = 0; - time_t epoch = 0; - crm_element_value_int(msg, PCMK__XA_LRMD_TIMEOUT, &event.timeout); - crm_element_value_ms(msg, PCMK__XA_LRMD_RSC_INTERVAL, - &event.interval_ms); - crm_element_value_int(msg, PCMK__XA_LRMD_RSC_START_DELAY, - &event.start_delay); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_TIMEOUT, &event.timeout); + pcmk__xe_get_guint(msg, PCMK__XA_LRMD_RSC_INTERVAL, &event.interval_ms); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_RSC_START_DELAY, + &event.start_delay); - crm_element_value_int(msg, PCMK__XA_LRMD_EXEC_RC, &rc); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_EXEC_RC, &rc); event.rc = (enum ocf_exitcode) rc; - crm_element_value_int(msg, PCMK__XA_LRMD_EXEC_OP_STATUS, - &event.op_status); - crm_element_value_int(msg, PCMK__XA_LRMD_RSC_DELETED, - &event.rsc_deleted); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_EXEC_OP_STATUS, &event.op_status); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_RSC_DELETED, &event.rsc_deleted); - crm_element_value_epoch(msg, PCMK__XA_LRMD_RUN_TIME, &epoch); - event.t_run = epoch; + pcmk__xe_get_time(msg, PCMK__XA_LRMD_RUN_TIME, &event.t_run); + pcmk__xe_get_time(msg, PCMK__XA_LRMD_RCCHANGE_TIME, &event.t_rcchange); - crm_element_value_epoch(msg, PCMK__XA_LRMD_RCCHANGE_TIME, &epoch); - event.t_rcchange = epoch; - - crm_element_value_int(msg, PCMK__XA_LRMD_EXEC_TIME, &exec_time); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_EXEC_TIME, &exec_time); CRM_LOG_ASSERT(exec_time >= 0); event.exec_time = QB_MAX(0, exec_time); - crm_element_value_int(msg, PCMK__XA_LRMD_QUEUE_TIME, &queue_time); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_QUEUE_TIME, &queue_time); CRM_LOG_ASSERT(queue_time >= 0); event.queue_time = QB_MAX(0, queue_time); - event.op_type = crm_element_value(msg, PCMK__XA_LRMD_RSC_ACTION); - event.user_data = crm_element_value(msg, - PCMK__XA_LRMD_RSC_USERDATA_STR); + event.op_type = pcmk__xe_get(msg, PCMK__XA_LRMD_RSC_ACTION); + event.user_data = pcmk__xe_get(msg, PCMK__XA_LRMD_RSC_USERDATA_STR); event.type = lrmd_event_exec_complete; /* output and exit_reason may be freed by a callback */ - event.output = crm_element_value_copy(msg, PCMK__XA_LRMD_RSC_OUTPUT); + event.output = pcmk__xe_get_copy(msg, PCMK__XA_LRMD_RSC_OUTPUT); lrmd__set_result(&event, event.rc, event.op_status, - crm_element_value(msg, PCMK__XA_LRMD_RSC_EXIT_REASON)); + pcmk__xe_get(msg, PCMK__XA_LRMD_RSC_EXIT_REASON)); event.params = xml2list(msg); } else if (pcmk__str_eq(type, LRMD_OP_NEW_CLIENT, pcmk__str_none)) { @@ -344,7 +336,7 @@ lrmd_dispatch_internal(gpointer data, gpointer user_data) return; } - crm_trace("op %s notify event received", type); + pcmk__trace("op %s notify event received", type); native->callback(&event); if (event.params) { @@ -389,11 +381,11 @@ handle_remote_msg(xmlNode *xml, lrmd_t *lrmd) lrmd_private_t *native = lrmd->lrmd_private; const char *msg_type = NULL; - msg_type = crm_element_value(xml, PCMK__XA_LRMD_REMOTE_MSG_TYPE); + msg_type = pcmk__xe_get(xml, PCMK__XA_LRMD_REMOTE_MSG_TYPE); if (pcmk__str_eq(msg_type, "notify", pcmk__str_casei)) { lrmd_dispatch_internal(xml, lrmd); } else if (pcmk__str_eq(msg_type, "reply", pcmk__str_casei)) { - const char *op = crm_element_value(xml, PCMK__XA_LRMD_OP); + const char *op = pcmk__xe_get(xml, PCMK__XA_LRMD_OP); if (native->expected_late_replies > 0) { native->expected_late_replies--; @@ -407,9 +399,10 @@ handle_remote_msg(xmlNode *xml, lrmd_t *lrmd) } } else { int reply_id = 0; - crm_element_value_int(xml, PCMK__XA_LRMD_CALLID, &reply_id); + + pcmk__xe_get_int(xml, PCMK__XA_LRMD_CALLID, &reply_id); /* if this happens, we want to know about it */ - crm_err("Got outdated Pacemaker Remote reply %d", reply_id); + pcmk__err("Got outdated Pacemaker Remote reply %d", reply_id); } } } @@ -433,7 +426,7 @@ process_pending_notifies(gpointer userdata) return G_SOURCE_CONTINUE; } - crm_trace("Processing pending notifies"); + pcmk__trace("Processing pending notifies"); g_list_foreach(native->pending_notify, lrmd_dispatch_internal, lrmd); g_list_free_full(native->pending_notify, lrmd_free_xml); native->pending_notify = NULL; @@ -458,11 +451,11 @@ lrmd_tls_dispatch(gpointer userdata) int rc = pcmk_rc_ok; if (!remote_executor_connected(lrmd)) { - crm_trace("TLS dispatch triggered after disconnect"); + pcmk__trace("TLS dispatch triggered after disconnect"); return -1; } - crm_trace("TLS dispatch triggered"); + pcmk__trace("TLS dispatch triggered"); rc = pcmk__remote_ready(native->remote, 0); if (rc == pcmk_rc_ok) { @@ -470,8 +463,8 @@ lrmd_tls_dispatch(gpointer userdata) } if (rc != pcmk_rc_ok && rc != ETIME) { - crm_info("Lost %s executor connection while reading data", - (native->remote_nodename? native->remote_nodename : "local")); + pcmk__info("Lost %s executor connection while reading data", + pcmk__s(native->remote_nodename, "local")); lrmd_tls_disconnect(lrmd); return -1; } @@ -516,8 +509,8 @@ lrmd_poll(lrmd_t * lrmd, int timeout) } } default: - crm_err("Unsupported executor connection type (bug?): %d", - native->type); + pcmk__err("Unsupported executor connection type (bug?): %d", + native->type); return -EPROTONOSUPPORT; } } @@ -545,12 +538,12 @@ lrmd_dispatch(lrmd_t * lrmd) lrmd_tls_dispatch(lrmd); break; default: - crm_err("Unsupported executor connection type (bug?): %d", - private->type); + pcmk__err("Unsupported executor connection type (bug?): %d", + private->type); } if (lrmd_api_is_connected(lrmd) == FALSE) { - crm_err("Connection closed"); + pcmk__err("Connection closed"); return FALSE; } @@ -566,10 +559,10 @@ lrmd_create_op(const char *token, const char *op, xmlNode *data, int timeout, CRM_CHECK(token != NULL, return NULL); op_msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_COMMAND); - crm_xml_add(op_msg, PCMK__XA_T, PCMK__VALUE_LRMD); - crm_xml_add(op_msg, PCMK__XA_LRMD_OP, op); - crm_xml_add_int(op_msg, PCMK__XA_LRMD_TIMEOUT, timeout); - crm_xml_add_int(op_msg, PCMK__XA_LRMD_CALLOPT, options); + pcmk__xe_set(op_msg, PCMK__XA_T, PCMK__VALUE_LRMD); + pcmk__xe_set(op_msg, PCMK__XA_LRMD_OP, op); + pcmk__xe_set_int(op_msg, PCMK__XA_LRMD_TIMEOUT, timeout); + pcmk__xe_set_int(op_msg, PCMK__XA_LRMD_CALLOPT, options); if (data != NULL) { xmlNode *wrapper = pcmk__xe_create(op_msg, PCMK__XE_LRMD_CALLDATA); @@ -577,8 +570,8 @@ lrmd_create_op(const char *token, const char *op, xmlNode *data, int timeout, pcmk__xml_copy(wrapper, data); } - crm_trace("Created executor %s command with call options %.8lx (%d)", - op, (long)options, options); + pcmk__trace("Created executor %s command with call options %.8lx (%d)", + op, (long) options, options); return op_msg; } @@ -590,15 +583,15 @@ lrmd_ipc_connection_destroy(gpointer userdata) switch (native->type) { case pcmk__client_ipc: - crm_info("Disconnected from local executor"); + pcmk__info("Disconnected from local executor"); break; case pcmk__client_tls: - crm_info("Disconnected from remote executor on %s", - native->remote_nodename); + pcmk__info("Disconnected from remote executor on %s", + native->remote_nodename); break; default: - crm_err("Unsupported executor connection type %d (bug?)", - native->type); + pcmk__err("Unsupported executor connection type %d (bug?)", + native->type); } /* Prevent these from being cleaned up in lrmd_api_disconnect() */ @@ -619,7 +612,7 @@ lrmd_tls_connection_destroy(gpointer userdata) lrmd_t *lrmd = userdata; lrmd_private_t *native = lrmd->lrmd_private; - crm_info("TLS connection destroyed"); + pcmk__info("TLS connection destroyed"); if (native->remote->tls_session) { gnutls_bye(native->remote->tls_session, GNUTLS_SHUT_RDWR); @@ -667,8 +660,8 @@ int lrmd__remote_send_xml(pcmk__remote_t *session, xmlNode *msg, uint32_t id, const char *msg_type) { - crm_xml_add_int(msg, PCMK__XA_LRMD_REMOTE_MSG_ID, id); - crm_xml_add(msg, PCMK__XA_LRMD_REMOTE_MSG_TYPE, msg_type); + pcmk__xe_set_int(msg, PCMK__XA_LRMD_REMOTE_MSG_ID, id); + pcmk__xe_set(msg, PCMK__XA_LRMD_REMOTE_MSG_TYPE, msg_type); return pcmk__remote_send_xml(session, msg); } @@ -715,32 +708,33 @@ read_remote_reply(lrmd_t *lrmd, int total_timeout, int expected_reply_id, } } - crm_element_value_int(*reply, PCMK__XA_LRMD_REMOTE_MSG_ID, &reply_id); - msg_type = crm_element_value(*reply, PCMK__XA_LRMD_REMOTE_MSG_TYPE); + pcmk__xe_get_int(*reply, PCMK__XA_LRMD_REMOTE_MSG_ID, &reply_id); + msg_type = pcmk__xe_get(*reply, PCMK__XA_LRMD_REMOTE_MSG_TYPE); if (!msg_type) { - crm_err("Empty msg type received while waiting for reply"); + pcmk__err("Empty msg type received while waiting for reply"); pcmk__xml_free(*reply); *reply = NULL; } else if (pcmk__str_eq(msg_type, "notify", pcmk__str_casei)) { /* got a notify while waiting for reply, trigger the notify to be processed later */ - crm_info("queueing notify"); + pcmk__info("queueing notify"); native->pending_notify = g_list_append(native->pending_notify, *reply); if (native->process_notify) { - crm_info("notify trigger set."); + pcmk__info("notify trigger set"); mainloop_set_trigger(native->process_notify); } *reply = NULL; } else if (!pcmk__str_eq(msg_type, "reply", pcmk__str_casei)) { /* msg isn't a reply, make some noise */ - crm_err("Expected a reply, got %s", msg_type); + pcmk__err("Expected a reply, got %s", msg_type); pcmk__xml_free(*reply); *reply = NULL; } else if (reply_id != expected_reply_id) { if (native->expected_late_replies > 0) { native->expected_late_replies--; } else { - crm_err("Got outdated reply, expected id %d got id %d", expected_reply_id, reply_id); + pcmk__err("Got outdated reply, expected id %d got id %d", + expected_reply_id, reply_id); } pcmk__xml_free(*reply); *reply = NULL; @@ -769,8 +763,9 @@ send_remote_message(lrmd_t *lrmd, xmlNode *msg) rc = lrmd__remote_send_xml(native->remote, msg, global_remote_msg_id, "request"); if (rc != pcmk_rc_ok) { - crm_err("Disconnecting because TLS message could not be sent to " - "Pacemaker Remote: %s", pcmk_rc_str(rc)); + pcmk__err("Disconnecting because TLS message could not be sent to " + "Pacemaker Remote: %s", + pcmk_rc_str(rc)); lrmd_tls_disconnect(lrmd); } return rc; @@ -793,9 +788,9 @@ lrmd_tls_send_recv(lrmd_t * lrmd, xmlNode * msg, int timeout, xmlNode ** reply) rc = read_remote_reply(lrmd, timeout, global_remote_msg_id, &xml); if (rc != pcmk_rc_ok) { - crm_err("Disconnecting remote after request %d reply not received: %s " - QB_XS " rc=%d timeout=%dms", - global_remote_msg_id, pcmk_rc_str(rc), rc, timeout); + pcmk__err("Disconnecting remote after request %d reply not received: " + "%s " QB_XS " rc=%d timeout=%dms", + global_remote_msg_id, pcmk_rc_str(rc), rc, timeout); lrmd_tls_disconnect(lrmd); } @@ -822,8 +817,8 @@ lrmd_send_xml(lrmd_t * lrmd, xmlNode * msg, int timeout, xmlNode ** reply) rc = lrmd_tls_send_recv(lrmd, msg, timeout, reply); break; default: - crm_err("Unsupported executor connection type (bug?): %d", - native->type); + pcmk__err("Unsupported executor connection type (bug?): %d", + native->type); rc = -EPROTONOSUPPORT; } @@ -851,8 +846,8 @@ lrmd_send_xml_no_reply(lrmd_t * lrmd, xmlNode * msg) rc = pcmk_rc2legacy(rc); break; default: - crm_err("Unsupported executor connection type (bug?): %d", - native->type); + pcmk__err("Unsupported executor connection type (bug?): %d", + native->type); rc = -EPROTONOSUPPORT; } @@ -870,8 +865,8 @@ lrmd_api_is_connected(lrmd_t * lrmd) case pcmk__client_tls: return remote_executor_connected(lrmd); default: - crm_err("Unsupported executor connection type (bug?): %d", - native->type); + pcmk__err("Unsupported executor connection type (bug?): %d", + native->type); return 0; } } @@ -909,12 +904,12 @@ lrmd_send_command(lrmd_t *lrmd, const char *op, xmlNode *data, } if (op == NULL) { - crm_err("No operation specified"); + pcmk__err("No operation specified"); return -EINVAL; } CRM_LOG_ASSERT(native->token != NULL); - crm_trace("Sending %s op to executor", op); + pcmk__trace("Sending %s op to executor", op); op_msg = lrmd_create_op(native->token, op, data, timeout, options); @@ -939,13 +934,13 @@ lrmd_send_command(lrmd_t *lrmd, const char *op, xmlNode *data, } rc = pcmk_ok; - crm_trace("%s op reply received", op); - if (crm_element_value_int(op_reply, PCMK__XA_LRMD_RC, &rc) != 0) { + pcmk__trace("%s op reply received", op); + if (pcmk__xe_get_int(op_reply, PCMK__XA_LRMD_RC, &rc) != pcmk_rc_ok) { rc = -ENOMSG; goto done; } - crm_log_xml_trace(op_reply, "Reply"); + pcmk__log_xml_trace(op_reply, "Reply"); if (output_data) { *output_data = op_reply; @@ -954,7 +949,7 @@ lrmd_send_command(lrmd_t *lrmd, const char *op, xmlNode *data, done: if (lrmd_api_is_connected(lrmd) == FALSE) { - crm_err("Executor disconnected"); + pcmk__err("Executor disconnected"); } pcmk__xml_free(op_msg); @@ -969,7 +964,7 @@ lrmd_api_poke_connection(lrmd_t * lrmd) lrmd_private_t *native = lrmd->lrmd_private; xmlNode *data = pcmk__xe_create(NULL, PCMK__XE_LRMD_RSC); - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); rc = lrmd_send_command(lrmd, LRMD_OP_POKE, data, NULL, 0, 0, (native->type == pcmk__client_ipc)); pcmk__xml_free(data); @@ -986,12 +981,12 @@ lrmd__validate_remote_settings(lrmd_t *lrmd, GHashTable *hash) lrmd_private_t *native = lrmd->lrmd_private; xmlNode *data = pcmk__xe_create(NULL, PCMK__XA_LRMD_OP); - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); value = g_hash_table_lookup(hash, PCMK_OPT_STONITH_WATCHDOG_TIMEOUT); if ((value) && (stonith__watchdog_fencing_enabled_for_node(native->remote_nodename))) { - crm_xml_add(data, PCMK__XA_LRMD_WATCHDOG, value); + pcmk__xe_set(data, PCMK__XA_LRMD_WATCHDOG, value); } rc = lrmd_send_command(lrmd, LRMD_OP_CHECK, data, NULL, 0, 0, @@ -1005,10 +1000,10 @@ lrmd_handshake_hello_msg(const char *name, bool is_proxy) { xmlNode *hello = pcmk__xe_create(NULL, PCMK__XE_LRMD_COMMAND); - crm_xml_add(hello, PCMK__XA_T, PCMK__VALUE_LRMD); - crm_xml_add(hello, PCMK__XA_LRMD_OP, CRM_OP_REGISTER); - crm_xml_add(hello, PCMK__XA_LRMD_CLIENTNAME, name); - crm_xml_add(hello, PCMK__XA_LRMD_PROTOCOL_VERSION, LRMD_PROTOCOL_VERSION); + pcmk__xe_set(hello, PCMK__XA_T, PCMK__VALUE_LRMD); + pcmk__xe_set(hello, PCMK__XA_LRMD_OP, CRM_OP_REGISTER); + pcmk__xe_set(hello, PCMK__XA_LRMD_CLIENTNAME, name); + pcmk__xe_set(hello, PCMK__XA_LRMD_PROTOCOL_VERSION, LRMD_PROTOCOL_VERSION); /* advertise that we are a proxy provider */ if (is_proxy) { @@ -1022,40 +1017,40 @@ static int process_lrmd_handshake_reply(xmlNode *reply, lrmd_private_t *native) { int rc = pcmk_rc_ok; - const char *version = crm_element_value(reply, PCMK__XA_LRMD_PROTOCOL_VERSION); - const char *msg_type = crm_element_value(reply, PCMK__XA_LRMD_OP); - const char *tmp_ticket = crm_element_value(reply, PCMK__XA_LRMD_CLIENTID); - const char *start_state = crm_element_value(reply, PCMK__XA_NODE_START_STATE); - long long uptime = -1; + const char *version = pcmk__xe_get(reply, PCMK__XA_LRMD_PROTOCOL_VERSION); + const char *msg_type = pcmk__xe_get(reply, PCMK__XA_LRMD_OP); + const char *tmp_ticket = pcmk__xe_get(reply, PCMK__XA_LRMD_CLIENTID); + const char *start_state = pcmk__xe_get(reply, PCMK__XA_NODE_START_STATE); - crm_element_value_int(reply, PCMK__XA_LRMD_RC, &rc); + pcmk__xe_get_int(reply, PCMK__XA_LRMD_RC, &rc); rc = pcmk_legacy2rc(rc); /* The remote executor may add its uptime to the XML reply, which is useful * in handling transient attributes when the connection to the remote node * unexpectedly drops. If no parameter is given, just default to -1. */ - crm_element_value_ll(reply, PCMK__XA_UPTIME, &uptime); - native->remote->uptime = uptime; + native->remote->uptime = -1; + pcmk__xe_get_time(reply, PCMK__XA_UPTIME, &native->remote->uptime); if (start_state) { native->remote->start_state = strdup(start_state); } if (rc == EPROTO) { - crm_err("Executor protocol version mismatch between client (%s) and server (%s)", - LRMD_PROTOCOL_VERSION, version); - crm_log_xml_err(reply, "Protocol Error"); + pcmk__err("Executor protocol version mismatch between client " + "(" LRMD_PROTOCOL_VERSION ") and server (%s)", + version); + pcmk__log_xml_err(reply, "Protocol Error"); } else if (!pcmk__str_eq(msg_type, CRM_OP_REGISTER, pcmk__str_casei)) { - crm_err("Invalid registration message: %s", msg_type); - crm_log_xml_err(reply, "Bad reply"); + pcmk__err("Invalid registration message: %s", msg_type); + pcmk__log_xml_err(reply, "Bad reply"); rc = EPROTO; } else if (tmp_ticket == NULL) { - crm_err("No registration token provided"); - crm_log_xml_err(reply, "Bad reply"); + pcmk__err("No registration token provided"); + pcmk__log_xml_err(reply, "Bad reply"); rc = EPROTO; } else { - crm_trace("Obtained registration token: %s", tmp_ticket); + pcmk__trace("Obtained registration token: %s", tmp_ticket); native->token = strdup(tmp_ticket); native->peer_version = strdup(version?version:"1.0"); /* Included since 1.1 */ rc = pcmk_rc_ok; @@ -1078,7 +1073,7 @@ lrmd_handshake(lrmd_t * lrmd, const char *name) crm_perror(LOG_DEBUG, "Couldn't complete registration with the executor API: %d", rc); rc = ECOMM; } else if (reply == NULL) { - crm_err("Did not receive registration reply"); + pcmk__err("Did not receive registration reply"); rc = EPROTO; } else { rc = process_lrmd_handshake_reply(reply, native); @@ -1124,7 +1119,7 @@ lrmd_ipc_connect(lrmd_t * lrmd, int *fd) .destroy = lrmd_ipc_connection_destroy }; - crm_info("Connecting to executor"); + pcmk__info("Connecting to executor"); if (fd) { /* No mainloop */ @@ -1135,7 +1130,7 @@ lrmd_ipc_connect(lrmd_t * lrmd, int *fd) rc = pcmk__ipc_fd(native->ipc, fd); } if (rc != pcmk_rc_ok) { - crm_err("Connection to executor failed: %s", pcmk_rc_str(rc)); + pcmk__err("Connection to executor failed: %s", pcmk_rc_str(rc)); rc = -ENOTCONN; } } @@ -1145,7 +1140,7 @@ lrmd_ipc_connect(lrmd_t * lrmd, int *fd) } if (native->ipc == NULL) { - crm_debug("Could not connect to the executor API"); + pcmk__debug("Could not connect to the executor API"); rc = -ENOTCONN; } @@ -1197,8 +1192,8 @@ read_gnutls_key(const char *location, gnutls_datum_t *key) if (next == EOF) { if (!feof(stream)) { - crm_warn("Pacemaker Remote key read was partially successful " - "(copy in memory may be corrupted)"); + pcmk__warn("Pacemaker Remote key read was partially successful " + "(copy in memory may be corrupted)"); } break; } @@ -1245,7 +1240,7 @@ clear_key_cache(struct key_cache_s *key_cache) if ((key_cache->updated != 0) || (key_cache->location != NULL)) { key_cache->updated = 0; key_cache->location = NULL; - crm_debug("Cleared Pacemaker Remote key cache"); + pcmk__debug("Cleared Pacemaker Remote key cache"); } } @@ -1253,8 +1248,8 @@ static void get_cached_key(struct key_cache_s *key_cache, gnutls_datum_t *key) { copy_gnutls_datum(key, &(key_cache->key)); - crm_debug("Using cached Pacemaker Remote key from %s", - pcmk__s(key_cache->location, "unknown location")); + pcmk__debug("Using cached Pacemaker Remote key from %s", + pcmk__s(key_cache->location, "unknown location")); } static void @@ -1264,8 +1259,8 @@ cache_key(struct key_cache_s *key_cache, gnutls_datum_t *key, key_cache->updated = time(NULL); key_cache->location = location; copy_gnutls_datum(&(key_cache->key), key); - crm_debug("Using (and cacheing) Pacemaker Remote key from %s", - pcmk__s(location, "unknown location")); + pcmk__debug("Using (and cacheing) Pacemaker Remote key from %s", + pcmk__s(location, "unknown location")); } /*! @@ -1339,8 +1334,8 @@ lrmd__init_remote_key(gnutls_datum_t *key) return pcmk_rc_ok; } - crm_warn("Could not read Pacemaker Remote key from %s: %s", - env_location, pcmk_rc_str(rc)); + pcmk__warn("Could not read Pacemaker Remote key from %s: %s", + env_location, pcmk_rc_str(rc)); return ENOKEY; } @@ -1350,8 +1345,9 @@ lrmd__init_remote_key(gnutls_datum_t *key) return pcmk_rc_ok; } - crm_warn("Could not read Pacemaker Remote key from default location %s: %s", - DEFAULT_REMOTE_KEY_LOCATION, pcmk_rc_str(rc)); + pcmk__warn("Could not read Pacemaker Remote key from default location " + DEFAULT_REMOTE_KEY_LOCATION ": %s", + pcmk_rc_str(rc)); return ENOKEY; } @@ -1374,10 +1370,10 @@ tls_handshake_failed(lrmd_t *lrmd, int tls_rc, int rc) { lrmd_private_t *native = lrmd->lrmd_private; - crm_warn("Disconnecting after TLS handshake with " - "Pacemaker Remote server %s:%d failed: %s", - native->server, native->port, - (rc == EPROTO)? gnutls_strerror(tls_rc) : pcmk_rc_str(rc)); + pcmk__warn("Disconnecting after TLS handshake with Pacemaker Remote server " + "%s:%d failed: %s", + native->server, native->port, + ((rc == EPROTO)? gnutls_strerror(tls_rc) : pcmk_rc_str(rc))); report_async_connection_result(lrmd, pcmk_rc2legacy(rc)); gnutls_deinit(native->remote->tls_session); @@ -1398,8 +1394,8 @@ tls_handshake_succeeded(lrmd_t *lrmd) */ pcmk__tls_check_cert_expiration(native->remote->tls_session); - crm_info("TLS connection to Pacemaker Remote server %s:%d succeeded", - native->server, native->port); + pcmk__info("TLS connection to Pacemaker Remote server %s:%d succeeded", + native->server, native->port); rc = add_tls_to_mainloop(lrmd, true); /* If add_tls_to_mainloop failed, report that right now. Otherwise, we have @@ -1448,8 +1444,8 @@ add_tls_to_mainloop(lrmd_t *lrmd, bool do_api_handshake) lrmd_private_t *native = lrmd->lrmd_private; int rc = pcmk_rc_ok; - char *name = crm_strdup_printf("pacemaker-remote-%s:%d", - native->server, native->port); + char *name = pcmk__assert_asprintf("pacemaker-remote-%s:%d", + native->server, native->port); struct mainloop_fd_callbacks tls_fd_callbacks = { .dispatch = lrmd_tls_dispatch, @@ -1528,9 +1524,9 @@ lrmd_tcp_connect_cb(void *userdata, int rc, int sock) if (rc != pcmk_rc_ok) { lrmd_tls_connection_destroy(lrmd); - crm_info("Could not connect to Pacemaker Remote at %s:%d: %s " - QB_XS " rc=%d", - native->server, native->port, pcmk_rc_str(rc), rc); + pcmk__info("Could not connect to Pacemaker Remote at %s:%d: %s " + QB_XS " rc=%d", + native->server, native->port, pcmk_rc_str(rc), rc); report_async_connection_result(lrmd, pcmk_rc2legacy(rc)); return; } @@ -1554,9 +1550,9 @@ lrmd_tcp_connect_cb(void *userdata, int rc, int sock) rc = lrmd__init_remote_key(&psk_key); if (rc != pcmk_rc_ok) { - crm_info("Could not connect to Pacemaker Remote at %s:%d: %s " - QB_XS " rc=%d", - native->server, native->port, pcmk_rc_str(rc), rc); + pcmk__info("Could not connect to Pacemaker Remote at %s:%d: %s " + QB_XS " rc=%d", + native->server, native->port, pcmk_rc_str(rc), rc); lrmd_tls_connection_destroy(lrmd); report_async_connection_result(lrmd, pcmk_rc2legacy(rc)); return; @@ -1612,9 +1608,9 @@ lrmd_tls_connect_async(lrmd_t * lrmd, int timeout /*ms */ ) rc = pcmk__connect_remote(native->server, native->port, timeout, &timer_id, &(native->sock), lrmd, lrmd_tcp_connect_cb); if (rc != pcmk_rc_ok) { - crm_warn("Pacemaker Remote connection to %s:%d failed: %s " - QB_XS " rc=%d", - native->server, native->port, pcmk_rc_str(rc), rc); + pcmk__warn("Pacemaker Remote connection to %s:%d failed: %s " + QB_XS " rc=%d", + native->server, native->port, pcmk_rc_str(rc), rc); return rc; } native->async_timer = timer_id; @@ -1632,9 +1628,9 @@ lrmd_tls_connect(lrmd_t * lrmd, int *fd) rc = pcmk__connect_remote(native->server, native->port, 0, NULL, &(native->sock), NULL, NULL); if (rc != pcmk_rc_ok) { - crm_warn("Pacemaker Remote connection to %s:%d failed: %s " - QB_XS " rc=%d", - native->server, native->port, pcmk_rc_str(rc), rc); + pcmk__warn("Pacemaker Remote connection to %s:%d failed: %s " + QB_XS " rc=%d", + native->server, native->port, pcmk_rc_str(rc), rc); lrmd_tls_connection_destroy(lrmd); return ENOTCONN; } @@ -1671,8 +1667,9 @@ lrmd_tls_connect(lrmd_t * lrmd, int *fd) return EKEYREJECTED; } - crm_info("Client TLS connection established with Pacemaker Remote server %s:%d", native->server, - native->port); + pcmk__info("Client TLS connection established with Pacemaker Remote server " + "%s:%d", + native->server, native->port); if (fd) { *fd = native->sock; @@ -1697,8 +1694,8 @@ lrmd_api_connect(lrmd_t * lrmd, const char *name, int *fd) rc = pcmk_rc2legacy(rc); break; default: - crm_err("Unsupported executor connection type (bug?): %d", - native->type); + pcmk__err("Unsupported executor connection type (bug?): %d", + native->type); rc = -EPROTONOSUPPORT; } @@ -1732,8 +1729,8 @@ lrmd_api_connect_async(lrmd_t * lrmd, const char *name, int timeout) rc = pcmk_rc2legacy(rc); break; default: - crm_err("Unsupported executor connection type (bug?): %d", - native->type); + pcmk__err("Unsupported executor connection type (bug?): %d", + native->type); rc = -EPROTONOSUPPORT; } @@ -1801,17 +1798,17 @@ lrmd_api_disconnect(lrmd_t * lrmd) switch (native->type) { case pcmk__client_ipc: - crm_debug("Disconnecting from local executor"); + pcmk__debug("Disconnecting from local executor"); lrmd_ipc_disconnect(lrmd); break; case pcmk__client_tls: - crm_debug("Disconnecting from remote executor on %s", - native->remote_nodename); + pcmk__debug("Disconnecting from remote executor on %s", + native->remote_nodename); lrmd_tls_disconnect(lrmd); break; default: - crm_err("Unsupported executor connection type (bug?): %d", - native->type); + pcmk__err("Unsupported executor connection type (bug?): %d", + native->type); rc = -EPROTONOSUPPORT; } @@ -1835,18 +1832,18 @@ lrmd_api_register_rsc(lrmd_t * lrmd, if (!class || !type || !rsc_id) { return -EINVAL; } - if (pcmk_is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider) + if (pcmk__is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider) && (provider == NULL)) { return -EINVAL; } data = pcmk__xe_create(NULL, PCMK__XE_LRMD_RSC); - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_LRMD_RSC_ID, rsc_id); - crm_xml_add(data, PCMK__XA_LRMD_CLASS, class); - crm_xml_add(data, PCMK__XA_LRMD_PROVIDER, provider); - crm_xml_add(data, PCMK__XA_LRMD_TYPE, type); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_ID, rsc_id); + pcmk__xe_set(data, PCMK__XA_LRMD_CLASS, class); + pcmk__xe_set(data, PCMK__XA_LRMD_PROVIDER, provider); + pcmk__xe_set(data, PCMK__XA_LRMD_TYPE, type); rc = lrmd_send_command(lrmd, LRMD_OP_RSC_REG, data, NULL, 0, options, true); pcmk__xml_free(data); @@ -1859,8 +1856,8 @@ lrmd_api_unregister_rsc(lrmd_t * lrmd, const char *rsc_id, enum lrmd_call_option int rc = pcmk_ok; xmlNode *data = pcmk__xe_create(NULL, PCMK__XE_LRMD_RSC); - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_LRMD_RSC_ID, rsc_id); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_ID, rsc_id); rc = lrmd_send_command(lrmd, LRMD_OP_RSC_UNREG, data, NULL, 0, options, true); pcmk__xml_free(data); @@ -1910,8 +1907,8 @@ lrmd_api_get_rsc_info(lrmd_t * lrmd, const char *rsc_id, enum lrmd_call_options const char *provider = NULL; const char *type = NULL; - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_LRMD_RSC_ID, rsc_id); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_ID, rsc_id); lrmd_send_command(lrmd, LRMD_OP_RSC_INFO, data, &output, 0, options, true); pcmk__xml_free(data); @@ -1919,15 +1916,15 @@ lrmd_api_get_rsc_info(lrmd_t * lrmd, const char *rsc_id, enum lrmd_call_options return NULL; } - class = crm_element_value(output, PCMK__XA_LRMD_CLASS); - provider = crm_element_value(output, PCMK__XA_LRMD_PROVIDER); - type = crm_element_value(output, PCMK__XA_LRMD_TYPE); + class = pcmk__xe_get(output, PCMK__XA_LRMD_CLASS); + provider = pcmk__xe_get(output, PCMK__XA_LRMD_PROVIDER); + type = pcmk__xe_get(output, PCMK__XA_LRMD_TYPE); if (!class || !type) { pcmk__xml_free(output); return NULL; - } else if (pcmk_is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider) - && !provider) { + } else if (pcmk__is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider) + && (provider == NULL)) { pcmk__xml_free(output); return NULL; } @@ -1965,8 +1962,8 @@ lrmd_api_get_recurring_ops(lrmd_t *lrmd, const char *rsc_id, int timeout_ms, // Send request if (rsc_id) { data = pcmk__xe_create(NULL, PCMK__XE_LRMD_RSC); - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_LRMD_RSC_ID, rsc_id); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_ID, rsc_id); } rc = lrmd_send_command(lrmd, LRMD_OP_GET_RECURRING, data, &output_xml, timeout_ms, options, true); @@ -1984,9 +1981,10 @@ lrmd_api_get_recurring_ops(lrmd_t *lrmd, const char *rsc_id, int timeout_ms, (rsc_xml != NULL) && (rc == pcmk_ok); rsc_xml = pcmk__xe_next(rsc_xml, PCMK__XE_LRMD_RSC)) { - rsc_id = crm_element_value(rsc_xml, PCMK__XA_LRMD_RSC_ID); + rsc_id = pcmk__xe_get(rsc_xml, PCMK__XA_LRMD_RSC_ID); if (rsc_id == NULL) { - crm_err("Could not parse recurring operation information from executor"); + pcmk__err("Could not parse recurring operation information from " + "executor"); continue; } for (const xmlNode *op_xml = pcmk__xe_first_child(rsc_xml, @@ -2002,12 +2000,12 @@ lrmd_api_get_recurring_ops(lrmd_t *lrmd, const char *rsc_id, int timeout_ms, break; } op_info->rsc_id = strdup(rsc_id); - op_info->action = crm_element_value_copy(op_xml, - PCMK__XA_LRMD_RSC_ACTION); + op_info->action = pcmk__xe_get_copy(op_xml, + PCMK__XA_LRMD_RSC_ACTION); op_info->interval_ms_s = - crm_element_value_copy(op_xml, PCMK__XA_LRMD_RSC_INTERVAL); - op_info->timeout_ms_s = - crm_element_value_copy(op_xml, PCMK__XA_LRMD_TIMEOUT); + pcmk__xe_get_copy(op_xml, PCMK__XA_LRMD_RSC_INTERVAL); + op_info->timeout_ms_s = pcmk__xe_get_copy(op_xml, + PCMK__XA_LRMD_TIMEOUT); *output = g_list_prepend(*output, op_info); } } @@ -2039,7 +2037,7 @@ lrmd_internal_proxy_dispatch(lrmd_t *lrmd, xmlNode *msg) lrmd_private_t *native = lrmd->lrmd_private; if (native->proxy_callback) { - crm_log_xml_trace(msg, "PROXY_INBOUND"); + pcmk__log_xml_trace(msg, "PROXY_INBOUND"); native->proxy_callback(lrmd, native->proxy_callback_userdata, msg); } } @@ -2050,9 +2048,9 @@ lrmd_internal_proxy_send(lrmd_t * lrmd, xmlNode *msg) if (lrmd == NULL) { return -ENOTCONN; } - crm_xml_add(msg, PCMK__XA_LRMD_OP, CRM_OP_IPC_FWD); + pcmk__xe_set(msg, PCMK__XA_LRMD_OP, CRM_OP_IPC_FWD); - crm_log_xml_trace(msg, "PROXY_OUTBOUND"); + pcmk__log_xml_trace(msg, "PROXY_OUTBOUND"); return lrmd_send_xml_no_reply(lrmd, msg); } @@ -2063,7 +2061,8 @@ stonith_get_metadata(const char *provider, const char *type, char **output) stonith_t *stonith_api = stonith_api_new(); if (stonith_api == NULL) { - crm_err("Could not get fence agent meta-data: API memory allocation failed"); + pcmk__err("Could not get fence agent meta-data: API memory allocation " + "failed"); return -ENOMEM; } @@ -2123,15 +2122,15 @@ lrmd_api_get_metadata_params(lrmd_t *lrmd, const char *standard, } if (!services_action_sync(action)) { - crm_err("Failed to retrieve meta-data for %s:%s:%s", - standard, provider, type); + pcmk__err("Failed to retrieve meta-data for %s:%s:%s", standard, + provider, type); services_action_free(action); return -EIO; } if (!action->stdout_data) { - crm_err("Failed to receive meta-data for %s:%s:%s", - standard, provider, type); + pcmk__err("Failed to receive meta-data for %s:%s:%s", standard, + provider, type); services_action_free(action); return -EIO; } @@ -2154,13 +2153,13 @@ lrmd_api_exec(lrmd_t *lrmd, const char *rsc_id, const char *action, xmlNode *args = pcmk__xe_create(data, PCMK__XE_ATTRIBUTES); lrmd_key_value_t *tmp = NULL; - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_LRMD_RSC_ID, rsc_id); - crm_xml_add(data, PCMK__XA_LRMD_RSC_ACTION, action); - crm_xml_add(data, PCMK__XA_LRMD_RSC_USERDATA_STR, userdata); - crm_xml_add_ms(data, PCMK__XA_LRMD_RSC_INTERVAL, interval_ms); - crm_xml_add_int(data, PCMK__XA_LRMD_TIMEOUT, timeout); - crm_xml_add_int(data, PCMK__XA_LRMD_RSC_START_DELAY, start_delay); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_ID, rsc_id); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_ACTION, action); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_USERDATA_STR, userdata); + pcmk__xe_set_guint(data, PCMK__XA_LRMD_RSC_INTERVAL, interval_ms); + pcmk__xe_set_int(data, PCMK__XA_LRMD_TIMEOUT, timeout); + pcmk__xe_set_int(data, PCMK__XA_LRMD_RSC_START_DELAY, start_delay); for (tmp = params; tmp; tmp = tmp->next) { hash2smartfield((gpointer) tmp->key, (gpointer) tmp->value, args); @@ -2183,10 +2182,10 @@ lrmd_api_exec_alert(lrmd_t *lrmd, const char *alert_id, const char *alert_path, xmlNode *args = pcmk__xe_create(data, PCMK__XE_ATTRIBUTES); lrmd_key_value_t *tmp = NULL; - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_LRMD_ALERT_ID, alert_id); - crm_xml_add(data, PCMK__XA_LRMD_ALERT_PATH, alert_path); - crm_xml_add_int(data, PCMK__XA_LRMD_TIMEOUT, timeout); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_ALERT_ID, alert_id); + pcmk__xe_set(data, PCMK__XA_LRMD_ALERT_PATH, alert_path); + pcmk__xe_set_int(data, PCMK__XA_LRMD_TIMEOUT, timeout); for (tmp = params; tmp; tmp = tmp->next) { hash2smartfield((gpointer) tmp->key, (gpointer) tmp->value, args); @@ -2207,10 +2206,10 @@ lrmd_api_cancel(lrmd_t *lrmd, const char *rsc_id, const char *action, int rc = pcmk_ok; xmlNode *data = pcmk__xe_create(NULL, PCMK__XE_LRMD_RSC); - crm_xml_add(data, PCMK__XA_LRMD_ORIGIN, __func__); - crm_xml_add(data, PCMK__XA_LRMD_RSC_ACTION, action); - crm_xml_add(data, PCMK__XA_LRMD_RSC_ID, rsc_id); - crm_xml_add_ms(data, PCMK__XA_LRMD_RSC_INTERVAL, interval_ms); + pcmk__xe_set(data, PCMK__XA_LRMD_ORIGIN, __func__); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_ACTION, action); + pcmk__xe_set(data, PCMK__XA_LRMD_RSC_ID, rsc_id); + pcmk__xe_set_guint(data, PCMK__XA_LRMD_RSC_INTERVAL, interval_ms); rc = lrmd_send_command(lrmd, LRMD_OP_RSC_CANCEL, data, NULL, 0, 0, true); pcmk__xml_free(data); return rc; @@ -2225,7 +2224,7 @@ list_stonith_agents(lrmd_list_t ** resources) stonith_key_value_t *dIter = NULL; if (stonith_api == NULL) { - crm_err("Could not list fence agents: API memory allocation failed"); + pcmk__err("Could not list fence agents: API memory allocation failed"); return -ENOMEM; } stonith_api->cmds->list_agents(stonith_api, st_opt_sync_call, NULL, @@ -2276,7 +2275,7 @@ lrmd_api_list_agents(lrmd_t * lrmd, lrmd_list_t ** resources, const char *class, } } if (rc == 0) { - crm_notice("No agents found for class %s", class); + pcmk__notice("No agents found for class %s", class); rc = -EPROTONOSUPPORT; } return rc; diff --git a/lib/lrmd/lrmd_output.c b/lib/lrmd/lrmd_output.c index 49900e55f83..2e3271c82c2 100644 --- a/lib/lrmd/lrmd_output.c +++ b/lib/lrmd/lrmd_output.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2024 the Pacemaker project contributors + * Copyright 2020-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -81,7 +81,7 @@ lrmd__agents_list_xml(pcmk__output_t *out, va_list args) { NULL); if (!pcmk__str_empty(provider)) { - crm_xml_add(node, PCMK_XA_PROVIDER, provider); + pcmk__xe_set(node, PCMK_XA_PROVIDER, provider); } rc = xml_list(out, list, PCMK_XE_AGENT); @@ -96,10 +96,11 @@ lrmd__agents_list(pcmk__output_t *out, va_list args) { const char *agent_spec = va_arg(args, const char *); const char *provider = va_arg(args, const char *); - int rc; - char *title = crm_strdup_printf("%s agents", pcmk__str_empty(provider) ? agent_spec : provider); + const char *desc = pcmk__str_empty(provider)? agent_spec : provider; + char *title = pcmk__assert_asprintf("%s agents", + pcmk__s(desc, "(unknown)")); + int rc = default_list(out, list, title); - rc = default_list(out, list, title); free(title); return rc; } @@ -116,7 +117,7 @@ lrmd__providers_list_xml(pcmk__output_t *out, va_list args) { NULL); if (agent_spec != NULL) { - crm_xml_add(node, PCMK_XA_AGENT, agent_spec); + pcmk__xe_set(node, PCMK_XA_AGENT, agent_spec); } rc = xml_list(out, list, PCMK_XE_PROVIDER); diff --git a/lib/lrmd/proxy_common.c b/lib/lrmd/proxy_common.c index e02a89b352e..dece80c7d45 100644 --- a/lib/lrmd/proxy_common.c +++ b/lib/lrmd/proxy_common.c @@ -30,8 +30,8 @@ remote_proxy_notify_destroy(lrmd_t *lrmd, const char *session_id) { /* sending to the remote node that an ipc connection has been destroyed */ xmlNode *msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_DESTROY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_SESSION, session_id); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_DESTROY); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_SESSION, session_id); lrmd_internal_proxy_send(lrmd, msg); pcmk__xml_free(msg); } @@ -46,7 +46,7 @@ void remote_proxy_ack_shutdown(lrmd_t *lrmd) { xmlNode *msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_SHUTDOWN_ACK); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_SHUTDOWN_ACK); lrmd_internal_proxy_send(lrmd, msg); pcmk__xml_free(msg); } @@ -61,7 +61,7 @@ void remote_proxy_nack_shutdown(lrmd_t *lrmd) { xmlNode *msg = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); - crm_xml_add(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_SHUTDOWN_NACK); + pcmk__xe_set(msg, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_SHUTDOWN_NACK); lrmd_internal_proxy_send(lrmd, msg); pcmk__xml_free(msg); } @@ -73,8 +73,8 @@ remote_proxy_relay_event(remote_proxy_t *proxy, xmlNode *msg) xmlNode *event = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); xmlNode *wrapper = NULL; - crm_xml_add(event, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_EVENT); - crm_xml_add(event, PCMK__XA_LRMD_IPC_SESSION, proxy->session_id); + pcmk__xe_set(event, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_EVENT); + pcmk__xe_set(event, PCMK__XA_LRMD_IPC_SESSION, proxy->session_id); wrapper = pcmk__xe_create(event, PCMK__XE_LRMD_IPC_MSG); pcmk__xml_copy(wrapper, msg); @@ -91,9 +91,9 @@ remote_proxy_relay_response(remote_proxy_t *proxy, xmlNode *msg, int msg_id) xmlNode *response = pcmk__xe_create(NULL, PCMK__XE_LRMD_IPC_PROXY); xmlNode *wrapper = NULL; - crm_xml_add(response, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_RESPONSE); - crm_xml_add(response, PCMK__XA_LRMD_IPC_SESSION, proxy->session_id); - crm_xml_add_int(response, PCMK__XA_LRMD_IPC_MSG_ID, msg_id); + pcmk__xe_set(response, PCMK__XA_LRMD_IPC_OP, LRMD_IPC_OP_RESPONSE); + pcmk__xe_set(response, PCMK__XA_LRMD_IPC_SESSION, proxy->session_id); + pcmk__xe_set_int(response, PCMK__XA_LRMD_IPC_MSG_ID, msg_id); wrapper = pcmk__xe_create(response, PCMK__XE_LRMD_IPC_MSG); pcmk__xml_copy(wrapper, msg); @@ -108,7 +108,7 @@ remote_proxy_end_session(remote_proxy_t *proxy) if (proxy == NULL) { return; } - crm_trace("ending session ID %s", proxy->session_id); + pcmk__trace("ending session ID %s", proxy->session_id); if (proxy->source) { mainloop_del_ipc_client(proxy->source); @@ -120,7 +120,7 @@ remote_proxy_free(gpointer data) { remote_proxy_t *proxy = data; - crm_trace("freed proxy session ID %s", proxy->session_id); + pcmk__trace("freed proxy session ID %s", proxy->session_id); free(proxy->node_name); free(proxy->session_id); free(proxy); @@ -136,18 +136,22 @@ remote_proxy_dispatch(const char *buffer, ssize_t length, gpointer userdata) xml = pcmk__xml_parse(buffer); if (xml == NULL) { - crm_warn("Received a NULL msg from IPC service."); + pcmk__warn("Received a NULL msg from IPC service."); return 1; } flags = crm_ipc_buffer_flags(proxy->ipc); if (flags & crm_ipc_proxied_relay_response) { - crm_trace("Passing response back to %.8s on %s: %.200s - request id: %d", proxy->session_id, proxy->node_name, buffer, proxy->last_request_id); + pcmk__trace("Passing response back to %.8s on %s: %.200s - request id: " + "%d", + proxy->session_id, proxy->node_name, buffer, + proxy->last_request_id); remote_proxy_relay_response(proxy, xml, proxy->last_request_id); proxy->last_request_id = 0; } else { - crm_trace("Passing event back to %.8s on %s: %.200s", proxy->session_id, proxy->node_name, buffer); + pcmk__trace("Passing event back to %.8s on %s: %.200s", + proxy->session_id, proxy->node_name, buffer); remote_proxy_relay_event(proxy, xml); } pcmk__xml_free(xml); @@ -160,7 +164,7 @@ remote_proxy_disconnected(gpointer userdata) { remote_proxy_t *proxy = userdata; - crm_trace("destroying %p", proxy); + pcmk__trace("destroying %p", proxy); proxy->source = NULL; proxy->ipc = NULL; @@ -180,7 +184,7 @@ remote_proxy_new(lrmd_t *lrmd, struct ipc_client_callbacks *proxy_callbacks, remote_proxy_t *proxy = NULL; if(channel == NULL) { - crm_err("No channel specified to proxy"); + pcmk__err("No channel specified to proxy"); remote_proxy_notify_destroy(lrmd, session_id); return NULL; } @@ -206,8 +210,9 @@ remote_proxy_new(lrmd_t *lrmd, struct ipc_client_callbacks *proxy_callbacks, } } - crm_trace("new remote proxy client established to %s on %s, session id %s", - channel, node_name, session_id); + pcmk__trace("new remote proxy client established to %s on %s, session id " + "%s", + channel, node_name, session_id); g_hash_table_insert(proxy_table, proxy->session_id, proxy); return proxy; @@ -216,8 +221,8 @@ remote_proxy_new(lrmd_t *lrmd, struct ipc_client_callbacks *proxy_callbacks, void remote_proxy_cb(lrmd_t *lrmd, const char *node_name, xmlNode *msg) { - const char *op = crm_element_value(msg, PCMK__XA_LRMD_IPC_OP); - const char *session = crm_element_value(msg, PCMK__XA_LRMD_IPC_SESSION); + const char *op = pcmk__xe_get(msg, PCMK__XA_LRMD_IPC_OP); + const char *session = pcmk__xe_get(msg, PCMK__XA_LRMD_IPC_SESSION); remote_proxy_t *proxy = g_hash_table_lookup(proxy_table, session); int msg_id = 0; @@ -228,7 +233,7 @@ remote_proxy_cb(lrmd_t *lrmd, const char *node_name, xmlNode *msg) CRM_CHECK(op != NULL, return); CRM_CHECK(session != NULL, return); - crm_element_value_int(msg, PCMK__XA_LRMD_IPC_MSG_ID, &msg_id); + pcmk__xe_get_int(msg, PCMK__XA_LRMD_IPC_MSG_ID, &msg_id); /* This is msg from remote ipc client going to real ipc server */ if (pcmk__str_eq(op, LRMD_IPC_OP_DESTROY, pcmk__str_casei)) { @@ -237,7 +242,7 @@ remote_proxy_cb(lrmd_t *lrmd, const char *node_name, xmlNode *msg) } else if (pcmk__str_eq(op, LRMD_IPC_OP_REQUEST, pcmk__str_casei)) { uint32_t flags = 0U; int rc = pcmk_rc_ok; - const char *name = crm_element_value(msg, PCMK__XA_LRMD_IPC_CLIENT); + const char *name = pcmk__xe_get(msg, PCMK__XA_LRMD_IPC_CLIENT); xmlNode *wrapper = pcmk__xe_first_child(msg, PCMK__XE_LRMD_IPC_MSG, NULL, NULL); @@ -260,29 +265,30 @@ remote_proxy_cb(lrmd_t *lrmd, const char *node_name, xmlNode *msg) return; } proxy->last_request_id = 0; - crm_xml_add(request, PCMK_XE_ACL_ROLE, "pacemaker-remote"); + pcmk__xe_set(request, PCMK_XE_ACL_ROLE, "pacemaker-remote"); rc = pcmk__xe_get_flags(msg, PCMK__XA_LRMD_IPC_MSG_FLAGS, &flags, 0U); if (rc != pcmk_rc_ok) { - crm_warn("Couldn't parse controller flags from remote request: %s", - pcmk_rc_str(rc)); + pcmk__warn("Couldn't parse controller flags from remote request: " + "%s", + pcmk_rc_str(rc)); } pcmk__assert(node_name != NULL); pcmk__update_acl_user(request, PCMK__XA_LRMD_IPC_USER, node_name); - if (pcmk_is_set(flags, crm_ipc_proxied)) { - const char *type = crm_element_value(request, PCMK__XA_T); + if (pcmk__is_set(flags, crm_ipc_proxied)) { + const char *type = pcmk__xe_get(request, PCMK__XA_T); int rc = 0; if (pcmk__str_eq(type, PCMK__VALUE_ATTRD, pcmk__str_none) - && (crm_element_value(request, PCMK__XA_ATTR_HOST) == NULL) - && pcmk__str_any_of(crm_element_value(request, PCMK_XA_TASK), + && (pcmk__xe_get(request, PCMK__XA_ATTR_HOST) == NULL) + && pcmk__str_any_of(pcmk__xe_get(request, PCMK_XA_TASK), PCMK__ATTRD_CMD_UPDATE, PCMK__ATTRD_CMD_UPDATE_BOTH, PCMK__ATTRD_CMD_UPDATE_DELAY, NULL)) { - crm_xml_add(request, PCMK__XA_ATTR_HOST, proxy->node_name); + pcmk__xe_set(request, PCMK__XA_ATTR_HOST, proxy->node_name); } rc = crm_ipc_send(proxy->ipc, request, flags, 5000, NULL); @@ -290,19 +296,23 @@ remote_proxy_cb(lrmd_t *lrmd, const char *node_name, xmlNode *msg) if(rc < 0) { xmlNode *op_reply = pcmk__xe_create(NULL, PCMK__XE_NACK); - crm_err("Could not relay %s request %d from %s to %s for %s: %s (%d)", - op, msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), name, pcmk_strerror(rc), rc); + pcmk__err("Could not relay %s request %d from %s to %s for %s: " + "%s (%d)", + op, msg_id, proxy->node_name, + crm_ipc_name(proxy->ipc), name, pcmk_strerror(rc), + rc); /* Send a n'ack so the caller doesn't block */ - crm_xml_add(op_reply, PCMK_XA_FUNCTION, __func__); - crm_xml_add_int(op_reply, PCMK__XA_LINE, __LINE__); - crm_xml_add_int(op_reply, PCMK_XA_RC, rc); + pcmk__xe_set(op_reply, PCMK_XA_FUNCTION, __func__); + pcmk__xe_set_int(op_reply, PCMK__XA_LINE, __LINE__); + pcmk__xe_set_int(op_reply, PCMK_XA_RC, rc); remote_proxy_relay_response(proxy, op_reply, msg_id); pcmk__xml_free(op_reply); } else { - crm_trace("Relayed %s request %d from %s to %s for %s", - op, msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), name); + pcmk__trace("Relayed %s request %d from %s to %s for %s", op, + msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), + name); proxy->last_request_id = msg_id; } @@ -311,16 +321,20 @@ remote_proxy_cb(lrmd_t *lrmd, const char *node_name, xmlNode *msg) xmlNode *op_reply = NULL; // @COMPAT pacemaker_remoted <= 1.1.10 - crm_trace("Relaying %s request %d from %s to %s for %s", - op, msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), name); + pcmk__trace("Relaying %s request %d from %s to %s for %s", op, + msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), + name); rc = crm_ipc_send(proxy->ipc, request, flags, 10000, &op_reply); if(rc < 0) { - crm_err("Could not relay %s request %d from %s to %s for %s: %s (%d)", - op, msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), name, pcmk_strerror(rc), rc); + pcmk__err("Could not relay %s request %d from %s to %s for %s: " + "%s (%d)", + op, msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), + name, pcmk_strerror(rc), rc); } else { - crm_trace("Relayed %s request %d from %s to %s for %s", - op, msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), name); + pcmk__trace("Relayed %s request %d from %s to %s for %s", op, + msg_id, proxy->node_name, crm_ipc_name(proxy->ipc), + name); } if(op_reply) { @@ -329,6 +343,6 @@ remote_proxy_cb(lrmd_t *lrmd, const char *node_name, xmlNode *msg) } } } else { - crm_err("Unknown proxy operation: %s", op); + pcmk__err("Unknown proxy operation: %s", op); } } diff --git a/lib/pacemaker/libpacemaker_private.h b/lib/pacemaker/libpacemaker_private.h index 58435a62173..3fc52cedd7a 100644 --- a/lib/pacemaker/libpacemaker_private.h +++ b/lib/pacemaker/libpacemaker_private.h @@ -1,5 +1,5 @@ /* - * Copyright 2021-2024 the Pacemaker project contributors + * Copyright 2021-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -20,8 +20,10 @@ #include // guint, gpointer, GList, GHashTable #include // xmlNode +#include // PCMK__LOG_TRACE #include // pcmk_action_t, pcmk_node_t, etc. #include // pcmk__location_t, etc. +#include // pcmk__idref_t (indirectly) #include // cib_t #include // lrmd_event_data_t #include // pe__const_top_resource(), etc. @@ -67,14 +69,14 @@ enum pcmk__updated { #define pcmk__set_updated_flags(au_flags, action, flags_to_set) do { \ au_flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Action update", \ + PCMK__LOG_TRACE, "Action update", \ (action)->uuid, au_flags, \ (flags_to_set), #flags_to_set); \ } while (0) #define pcmk__clear_updated_flags(au_flags, action, flags_to_clear) do { \ au_flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Action update", \ + PCMK__LOG_TRACE, "Action update", \ (action)->uuid, au_flags, \ (flags_to_clear), #flags_to_clear); \ } while (0) diff --git a/lib/pacemaker/pcmk_acl.c b/lib/pacemaker/pcmk_acl.c index 96f07969b31..37c031d207e 100644 --- a/lib/pacemaker/pcmk_acl.c +++ b/lib/pacemaker/pcmk_acl.c @@ -24,6 +24,7 @@ #include #include +#include // pcmk_acl_required() #include #include #include @@ -221,8 +222,8 @@ pcmk__acl_annotate_permissions(const char *cred, const xmlDoc *cib_doc, return pcmk_rc_already; } - validation = crm_element_value(xmlDocGetRootElement(cib_doc), - PCMK_XA_VALIDATE_WITH); + validation = pcmk__xe_get(xmlDocGetRootElement(cib_doc), + PCMK_XA_VALIDATE_WITH); if (pcmk__cmp_schemas_by_name(PCMK__COMPAT_ACL_2_MIN_INCL, validation) > 0) { @@ -239,8 +240,8 @@ pcmk__acl_annotate_permissions(const char *cred, const xmlDoc *cib_doc, ret = annotate_with_siblings(target); if (ret == pcmk_rc_ok) { - char *content = crm_strdup_printf("ACLs as evaluated for user %s", - cred); + char *content = pcmk__assert_asprintf("ACLs as evaluated for user %s", + cred); comment = pcmk__xc_create(target->doc, content); xmlAddPrevSibling(xmlDocGetRootElement(target->doc), comment); @@ -334,7 +335,7 @@ pcmk__acl_evaled_render(xmlDoc *annotated_doc, enum pcmk__acl_render_how how, xslt = xsltParseStylesheetDoc(xslt_doc); /* acquires xslt_doc! */ if (xslt == NULL) { - crm_crit("Problem in parsing %s", sfile); + pcmk__crit("Problem in parsing %s", sfile); rc = EINVAL; goto done; } diff --git a/lib/pacemaker/pcmk_cluster_queries.c b/lib/pacemaker/pcmk_cluster_queries.c index 2f91a687380..b41a4536f79 100644 --- a/lib/pacemaker/pcmk_cluster_queries.c +++ b/lib/pacemaker/pcmk_cluster_queries.c @@ -368,9 +368,9 @@ ipc_connect(data_t *data, enum pcmk_ipc_server server, pcmk_ipc_callback_t cb, /* EREMOTEIO may be expected and acceptable for some callers * on a Pacemaker Remote node */ - crm_debug("Ignoring %s connection failure: No " - "Pacemaker Remote connection", - pcmk_ipc_name(api, true)); + pcmk__debug("Ignoring %s connection failure: No Pacemaker " + "Remote connection", + pcmk_ipc_name(api, true)); rc = pcmk_rc_ok; } else { out->err(out, "error: Could not connect to %s: %s", @@ -814,8 +814,8 @@ remote_node_print_helper(xmlNode *result, void *user_data) { struct node_data *data = user_data; pcmk__output_t *out = data->out; - const char *name = crm_element_value(result, PCMK_XA_UNAME); - const char *id = crm_element_value(result, data->field); + const char *name = pcmk__xe_get(result, PCMK_XA_UNAME); + const char *id = pcmk__xe_get(result, data->field); // node name and node id are the same for remote/guest nodes out->message(out, "crmadmin-node", data->type, diff --git a/lib/pacemaker/pcmk_graph_consumer.c b/lib/pacemaker/pcmk_graph_consumer.c index 745ff4b525a..5a4b0636b6d 100644 --- a/lib/pacemaker/pcmk_graph_consumer.c +++ b/lib/pacemaker/pcmk_graph_consumer.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,8 @@ #include #include +#include // crm_meta_value() +#include // PCMK_SCORE_INFINITY #include #include #include @@ -35,7 +37,7 @@ free_graph_action(gpointer user_data) pcmk__graph_action_t *action = user_data; if (action->timer != 0) { - crm_warn("Cancelling timer for graph action %d", action->id); + pcmk__warn("Cancelling timer for graph action %d", action->id); g_source_remove(action->timer); } if (action->params != NULL) { @@ -104,7 +106,7 @@ pcmk__free_graph(pcmk__graph_t *graph) static void update_synapse_ready(pcmk__graph_synapse_t *synapse, int action_id) { - if (pcmk_is_set(synapse->flags, pcmk__synapse_ready)) { + if (pcmk__is_set(synapse->flags, pcmk__synapse_ready)) { return; // All inputs have already been confirmed } @@ -115,18 +117,18 @@ update_synapse_ready(pcmk__graph_synapse_t *synapse, int action_id) pcmk__graph_action_t *prereq = (pcmk__graph_action_t *) lpc->data; if (prereq->id == action_id) { - crm_trace("Confirming input %d of synapse %d", - action_id, synapse->id); + pcmk__trace("Confirming input %d of synapse %d", action_id, + synapse->id); pcmk__set_graph_action_flags(prereq, pcmk__graph_action_confirmed); - } else if (!pcmk_is_set(prereq->flags, pcmk__graph_action_confirmed)) { + } else if (!pcmk__is_set(prereq->flags, pcmk__graph_action_confirmed)) { pcmk__clear_synapse_flags(synapse, pcmk__synapse_ready); - crm_trace("Synapse %d still not ready after action %d", - synapse->id, action_id); + pcmk__trace("Synapse %d still not ready after action %d", + synapse->id, action_id); } } - if (pcmk_is_set(synapse->flags, pcmk__synapse_ready)) { - crm_trace("Synapse %d is now ready to execute", synapse->id); + if (pcmk__is_set(synapse->flags, pcmk__synapse_ready)) { + pcmk__trace("Synapse %d is now ready to execute", synapse->id); } } @@ -146,21 +148,22 @@ update_synapse_confirmed(pcmk__graph_synapse_t *synapse, int action_id) pcmk__graph_action_t *action = (pcmk__graph_action_t *) lpc->data; if (action->id == action_id) { - crm_trace("Confirmed action %d of synapse %d", - action_id, synapse->id); + pcmk__trace("Confirmed action %d of synapse %d", action_id, + synapse->id); pcmk__set_graph_action_flags(action, pcmk__graph_action_confirmed); - } else if (all_confirmed && - !pcmk_is_set(action->flags, pcmk__graph_action_confirmed)) { + } else if (all_confirmed + && !pcmk__is_set(action->flags, + pcmk__graph_action_confirmed)) { all_confirmed = false; - crm_trace("Synapse %d still not confirmed after action %d", - synapse->id, action_id); + pcmk__trace("Synapse %d still not confirmed after action %d", + synapse->id, action_id); } } if (all_confirmed - && !pcmk_is_set(synapse->flags, pcmk__synapse_confirmed)) { - crm_trace("Confirmed synapse %d", synapse->id); + && !pcmk__is_set(synapse->flags, pcmk__synapse_confirmed)) { + pcmk__trace("Confirmed synapse %d", synapse->id); pcmk__set_synapse_flags(synapse, pcmk__synapse_confirmed); } } @@ -178,14 +181,14 @@ pcmk__update_graph(pcmk__graph_t *graph, const pcmk__graph_action_t *action) for (GList *lpc = graph->synapses; lpc != NULL; lpc = lpc->next) { pcmk__graph_synapse_t *synapse = (pcmk__graph_synapse_t *) lpc->data; - if (pcmk_any_flags_set(synapse->flags, - pcmk__synapse_confirmed|pcmk__synapse_failed)) { + if (pcmk__any_flags_set(synapse->flags, + pcmk__synapse_confirmed|pcmk__synapse_failed)) { continue; // This synapse already completed - } else if (pcmk_is_set(synapse->flags, pcmk__synapse_executed)) { + } else if (pcmk__is_set(synapse->flags, pcmk__synapse_executed)) { update_synapse_confirmed(synapse, action->id); - } else if (!pcmk_is_set(action->flags, pcmk__graph_action_failed) + } else if (!pcmk__is_set(action->flags, pcmk__graph_action_failed) || (synapse->priority == PCMK_SCORE_INFINITY)) { update_synapse_ready(synapse, action->id); } @@ -215,7 +218,7 @@ pcmk__set_graph_functions(pcmk__graph_functions_t *fns) pcmk__assert((fns != NULL) && (fns->rsc != NULL) && (fns->cluster != NULL) && (fns->pseudo != NULL) && (fns->fence != NULL)); - crm_debug("Setting custom functions for executing transition graphs"); + pcmk__debug("Setting custom functions for executing transition graphs"); graph_fns = fns; } @@ -237,21 +240,21 @@ should_fire_synapse(pcmk__graph_t *graph, pcmk__graph_synapse_t *synapse) for (lpc = synapse->inputs; lpc != NULL; lpc = lpc->next) { pcmk__graph_action_t *prereq = (pcmk__graph_action_t *) lpc->data; - if (!(pcmk_is_set(prereq->flags, pcmk__graph_action_confirmed))) { - crm_trace("Input %d for synapse %d not yet confirmed", - prereq->id, synapse->id); + if (!(pcmk__is_set(prereq->flags, pcmk__graph_action_confirmed))) { + pcmk__trace("Input %d for synapse %d not yet confirmed", prereq->id, + synapse->id); pcmk__clear_synapse_flags(synapse, pcmk__synapse_ready); break; - } else if (pcmk_is_set(prereq->flags, pcmk__graph_action_failed)) { - crm_trace("Input %d for synapse %d confirmed but failed", - prereq->id, synapse->id); + } else if (pcmk__is_set(prereq->flags, pcmk__graph_action_failed)) { + pcmk__trace("Input %d for synapse %d confirmed but failed", + prereq->id, synapse->id); pcmk__clear_synapse_flags(synapse, pcmk__synapse_ready); break; } } - if (pcmk_is_set(synapse->flags, pcmk__synapse_ready)) { - crm_trace("Synapse %d is ready to execute", synapse->id); + if (pcmk__is_set(synapse->flags, pcmk__synapse_ready)) { + pcmk__trace("Synapse %d is ready to execute", synapse->id); } else { return false; } @@ -263,14 +266,14 @@ should_fire_synapse(pcmk__graph_t *graph, pcmk__graph_synapse_t *synapse) /* None of the below applies to pseudo ops */ } else if (synapse->priority < graph->abort_priority) { - crm_trace("Skipping synapse %d: priority %d is less than " - "abort priority %d", - synapse->id, synapse->priority, graph->abort_priority); + pcmk__trace("Skipping synapse %d: priority %d is less than abort " + "priority %d", + synapse->id, synapse->priority, graph->abort_priority); graph->skipped++; return false; } else if (graph_fns->allowed && !(graph_fns->allowed(graph, a))) { - crm_trace("Deferring synapse %d: not allowed", synapse->id); + pcmk__trace("Deferring synapse %d: not allowed", synapse->id); return false; } } @@ -293,33 +296,32 @@ initiate_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) const char *id = pcmk__xe_id(action->xml); CRM_CHECK(id != NULL, return EINVAL); - CRM_CHECK(!pcmk_is_set(action->flags, pcmk__graph_action_executed), + CRM_CHECK(!pcmk__is_set(action->flags, pcmk__graph_action_executed), return pcmk_rc_already); pcmk__set_graph_action_flags(action, pcmk__graph_action_executed); switch (action->type) { case pcmk__pseudo_graph_action: - crm_trace("Executing pseudo-action %d (%s)", action->id, id); + pcmk__trace("Executing pseudo-action %d (%s)", action->id, id); return graph_fns->pseudo(graph, action); case pcmk__rsc_graph_action: - crm_trace("Executing resource action %d (%s)", action->id, id); + pcmk__trace("Executing resource action %d (%s)", action->id, id); return graph_fns->rsc(graph, action); case pcmk__cluster_graph_action: - if (pcmk__str_eq(crm_element_value(action->xml, PCMK_XA_OPERATION), + if (pcmk__str_eq(pcmk__xe_get(action->xml, PCMK_XA_OPERATION), PCMK_ACTION_STONITH, pcmk__str_none)) { - crm_trace("Executing fencing action %d (%s)", - action->id, id); + pcmk__trace("Executing fencing action %d (%s)", action->id, id); return graph_fns->fence(graph, action); } - crm_trace("Executing cluster action %d (%s)", action->id, id); + pcmk__trace("Executing cluster action %d (%s)", action->id, id); return graph_fns->cluster(graph, action); default: - crm_err("Unsupported graph action type <%s " PCMK_XA_ID "='%s'> " - "(bug?)", - action->xml->name, id); + pcmk__err("Unsupported graph action type <%s " PCMK_XA_ID "='%s'> " + "(bug?)", + action->xml->name, id); return EINVAL; } } @@ -342,10 +344,10 @@ fire_synapse(pcmk__graph_t *graph, pcmk__graph_synapse_t *synapse) int rc = initiate_action(graph, action); if (rc != pcmk_rc_ok) { - crm_err("Failed initiating <%s " PCMK_XA_ID "=%d> in synapse %d: " - "%s", - action->xml->name, action->id, synapse->id, - pcmk_rc_str(rc)); + pcmk__err("Failed initiating <%s " PCMK_XA_ID "=%d> in synapse %d: " + "%s", + action->xml->name, action->id, synapse->id, + pcmk_rc_str(rc)); pcmk__set_synapse_flags(synapse, pcmk__synapse_confirmed); pcmk__set_graph_action_flags(action, pcmk__graph_action_confirmed @@ -384,11 +386,12 @@ pseudo_action_dummy(pcmk__graph_t *graph, pcmk__graph_action_t *action) } if (action->id == fail) { - crm_err("Dummy event handler: pretending action %d failed", action->id); + pcmk__err("Dummy event handler: pretending action %d failed", + action->id); pcmk__set_graph_action_flags(action, pcmk__graph_action_failed); graph->abort_priority = PCMK_SCORE_INFINITY; } else { - crm_trace("Dummy event handler: action %d initiated", action->id); + pcmk__trace("Dummy event handler: action %d initiated", action->id); } pcmk__set_graph_action_flags(action, pcmk__graph_action_confirmed); pcmk__update_graph(graph, action); @@ -435,16 +438,17 @@ pcmk__execute_graph(pcmk__graph_t *graph) for (lpc = graph->synapses; lpc != NULL; lpc = lpc->next) { pcmk__graph_synapse_t *synapse = (pcmk__graph_synapse_t *) lpc->data; - if (pcmk_is_set(synapse->flags, pcmk__synapse_confirmed)) { + if (pcmk__is_set(synapse->flags, pcmk__synapse_confirmed)) { graph->completed++; - } else if (!pcmk_is_set(synapse->flags, pcmk__synapse_failed) - && pcmk_is_set(synapse->flags, pcmk__synapse_executed)) { + } else if (!pcmk__is_set(synapse->flags, pcmk__synapse_failed) + && pcmk__is_set(synapse->flags, pcmk__synapse_executed)) { graph->pending++; } } - crm_trace("Executing graph %d (%d synapses already completed, %d pending)", - graph->id, graph->completed, graph->pending); + pcmk__trace("Executing graph %d (%d synapses already completed, %d " + "pending)", + graph->id, graph->completed, graph->pending); // Execute any synapses that are ready for (lpc = graph->synapses; lpc != NULL; lpc = lpc->next) { @@ -453,35 +457,35 @@ pcmk__execute_graph(pcmk__graph_t *graph) if ((graph->batch_limit > 0) && (graph->pending >= graph->batch_limit)) { - crm_debug("Throttling graph execution: batch limit (%d) reached", - graph->batch_limit); + pcmk__debug("Throttling graph execution: batch limit (%d) reached", + graph->batch_limit); break; - } else if (pcmk_is_set(synapse->flags, pcmk__synapse_failed)) { + } else if (pcmk__is_set(synapse->flags, pcmk__synapse_failed)) { graph->skipped++; continue; - } else if (pcmk_any_flags_set(synapse->flags, - pcmk__synapse_confirmed - |pcmk__synapse_executed)) { + } else if (pcmk__any_flags_set(synapse->flags, + pcmk__synapse_confirmed + |pcmk__synapse_executed)) { continue; // Already handled } else if (should_fire_synapse(graph, synapse)) { graph->fired++; if (fire_synapse(graph, synapse) != pcmk_rc_ok) { - crm_err("Synapse %d failed to fire", synapse->id); + pcmk__err("Synapse %d failed to fire", synapse->id); log_level = LOG_ERR; graph->abort_priority = PCMK_SCORE_INFINITY; graph->incomplete++; graph->fired--; } - if (!(pcmk_is_set(synapse->flags, pcmk__synapse_confirmed))) { + if (!(pcmk__is_set(synapse->flags, pcmk__synapse_confirmed))) { graph->pending++; } } else { - crm_trace("Synapse %d cannot fire", synapse->id); + pcmk__trace("Synapse %d cannot fire", synapse->id); graph->incomplete++; } } @@ -540,9 +544,9 @@ unpack_action(pcmk__graph_synapse_t *parent, xmlNode *xml_action) const char *value = pcmk__xe_id(xml_action); if (value == NULL) { - crm_err("Ignoring transition graph action without " PCMK_XA_ID - " (bug?)"); - crm_log_xml_trace(xml_action, "invalid"); + pcmk__err("Ignoring transition graph action without " PCMK_XA_ID + " (bug?)"); + pcmk__log_xml_trace(xml_action, "invalid"); return NULL; } @@ -556,16 +560,17 @@ unpack_action(pcmk__graph_synapse_t *parent, xmlNode *xml_action) action_type = pcmk__cluster_graph_action; } else { - crm_err("Ignoring transition graph action of unknown type '%s' (bug?)", - xml_action->name); - crm_log_xml_trace(xml_action, "invalid"); + pcmk__err("Ignoring transition graph action of unknown type '%s' " + "(bug?)", + xml_action->name); + pcmk__log_xml_trace(xml_action, "invalid"); return NULL; } action = calloc(1, sizeof(pcmk__graph_action_t)); if (action == NULL) { crm_perror(LOG_CRIT, "Cannot unpack transition graph action"); - crm_log_xml_trace(xml_action, "lost"); + pcmk__log_xml_trace(xml_action, "lost"); return NULL; } @@ -595,7 +600,7 @@ unpack_action(pcmk__graph_synapse_t *parent, xmlNode *xml_action) action->interval_ms = 0; } - crm_trace("Action %d has timer set to %dms", action->id, action->timeout); + pcmk__trace("Action %d has timer set to %dms", action->id, action->timeout); return action; } @@ -616,7 +621,7 @@ unpack_synapse(pcmk__graph_t *new_graph, const xmlNode *xml_synapse) xmlNode *action_set = NULL; pcmk__graph_synapse_t *new_synapse = NULL; - crm_trace("Unpacking synapse %s", pcmk__xe_id(xml_synapse)); + pcmk__trace("Unpacking synapse %s", pcmk__xe_id(xml_synapse)); new_synapse = calloc(1, sizeof(pcmk__graph_synapse_t)); if (new_synapse == NULL) { @@ -625,7 +630,7 @@ unpack_synapse(pcmk__graph_t *new_graph, const xmlNode *xml_synapse) pcmk__scan_min_int(pcmk__xe_id(xml_synapse), &(new_synapse->id), 0); - value = crm_element_value(xml_synapse, PCMK__XA_PRIORITY); + value = pcmk__xe_get(xml_synapse, PCMK__XA_PRIORITY); pcmk__scan_min_int(value, &(new_synapse->priority), 0); CRM_CHECK(new_synapse->id >= 0, @@ -633,8 +638,8 @@ unpack_synapse(pcmk__graph_t *new_graph, const xmlNode *xml_synapse) new_graph->num_synapses++; - crm_trace("Unpacking synapse %s action sets", - crm_element_value(xml_synapse, PCMK_XA_ID)); + pcmk__trace("Unpacking synapse %s action sets", + pcmk__xe_get(xml_synapse, PCMK_XA_ID)); for (action_set = pcmk__xe_first_child(xml_synapse, PCMK__XE_ACTION_SET, NULL, NULL); @@ -652,15 +657,15 @@ unpack_synapse(pcmk__graph_t *new_graph, const xmlNode *xml_synapse) continue; } - crm_trace("Adding action %d to synapse %d", - new_action->id, new_synapse->id); + pcmk__trace("Adding action %d to synapse %d", new_action->id, + new_synapse->id); new_graph->num_actions++; new_synapse->actions = g_list_append(new_synapse->actions, new_action); } } - crm_trace("Unpacking synapse %s inputs", pcmk__xe_id(xml_synapse)); + pcmk__trace("Unpacking synapse %s inputs", pcmk__xe_id(xml_synapse)); for (xmlNode *inputs = pcmk__xe_first_child(xml_synapse, PCMK__XE_INPUTS, NULL, NULL); @@ -682,8 +687,8 @@ unpack_synapse(pcmk__graph_t *new_graph, const xmlNode *xml_synapse) continue; } - crm_trace("Adding input %d to synapse %d", - new_input->id, new_synapse->id); + pcmk__trace("Adding input %d to synapse %d", new_input->id, + new_synapse->id); new_synapse->inputs = g_list_append(new_synapse->inputs, new_input); @@ -739,18 +744,18 @@ pcmk__unpack_graph(const xmlNode *xml_graph, const char *reference) // Parse top-level attributes from PCMK__XE_TRANSITION_GRAPH if (xml_graph != NULL) { - const char *buf = crm_element_value(xml_graph, "transition_id"); + const char *buf = pcmk__xe_get(xml_graph, "transition_id"); CRM_CHECK(buf != NULL, pcmk__free_graph(new_graph); return NULL); pcmk__scan_min_int(buf, &(new_graph->id), 1); - buf = crm_element_value(xml_graph, PCMK_OPT_CLUSTER_DELAY); + buf = pcmk__xe_get(xml_graph, PCMK_OPT_CLUSTER_DELAY); CRM_CHECK(buf != NULL, pcmk__free_graph(new_graph); return NULL); pcmk_parse_interval_spec(buf, &(new_graph->network_delay)); - buf = crm_element_value(xml_graph, PCMK_OPT_STONITH_TIMEOUT); + buf = pcmk__xe_get(xml_graph, PCMK_OPT_STONITH_TIMEOUT); if (buf == NULL) { new_graph->stonith_timeout = new_graph->network_delay; } else { @@ -758,25 +763,22 @@ pcmk__unpack_graph(const xmlNode *xml_graph, const char *reference) } // Use 0 (dynamic limit) as default/invalid, -1 (no limit) as minimum - buf = crm_element_value(xml_graph, PCMK_OPT_BATCH_LIMIT); + buf = pcmk__xe_get(xml_graph, PCMK_OPT_BATCH_LIMIT); if ((buf == NULL) || (pcmk__scan_min_int(buf, &(new_graph->batch_limit), -1) != pcmk_rc_ok)) { new_graph->batch_limit = 0; } - buf = crm_element_value(xml_graph, PCMK_OPT_MIGRATION_LIMIT); + buf = pcmk__xe_get(xml_graph, PCMK_OPT_MIGRATION_LIMIT); pcmk__scan_min_int(buf, &(new_graph->migration_limit), -1); new_graph->failed_stop_offset = - crm_element_value_copy(xml_graph, PCMK__XA_FAILED_STOP_OFFSET); + pcmk__xe_get_copy(xml_graph, PCMK__XA_FAILED_STOP_OFFSET); new_graph->failed_start_offset = - crm_element_value_copy(xml_graph, PCMK__XA_FAILED_START_OFFSET); + pcmk__xe_get_copy(xml_graph, PCMK__XA_FAILED_START_OFFSET); - if (crm_element_value_epoch(xml_graph, "recheck-by", - &(new_graph->recheck_by)) != pcmk_ok) { - new_graph->recheck_by = 0; - } + pcmk__xe_get_time(xml_graph, "recheck-by", &(new_graph->recheck_by)); } // Unpack each child element @@ -795,9 +797,9 @@ pcmk__unpack_graph(const xmlNode *xml_graph, const char *reference) } } - crm_debug("Unpacked transition %d from %s: %d actions in %d synapses", - new_graph->id, new_graph->source, new_graph->num_actions, - new_graph->num_synapses); + pcmk__debug("Unpacked transition %d from %s: %d actions in %d synapses", + new_graph->id, new_graph->source, new_graph->num_actions, + new_graph->num_synapses); return new_graph; } @@ -835,11 +837,11 @@ pcmk__event_from_graph_action(const xmlNode *resource, action_resource = pcmk__xe_first_child(action->xml, PCMK_XE_PRIMITIVE, NULL, NULL); - CRM_CHECK(action_resource != NULL, crm_log_xml_warn(action->xml, "invalid"); - return NULL); + CRM_CHECK(action_resource != NULL, + pcmk__log_xml_warn(action->xml, "invalid"); return NULL); op = lrmd_new_event(pcmk__xe_id(action_resource), - crm_element_value(action->xml, PCMK_XA_OPERATION), + pcmk__xe_get(action->xml, PCMK_XA_OPERATION), action->interval_ms); lrmd__set_result(op, rc, status, exit_reason); op->t_run = time(NULL); @@ -856,8 +858,8 @@ pcmk__event_from_graph_action(const xmlNode *resource, int tmp = 0; - crm_element_value_int(xop, PCMK__XA_CALL_ID, &tmp); - crm_debug("Got call_id=%d for %s", tmp, pcmk__xe_id(resource)); + pcmk__xe_get_int(xop, PCMK__XA_CALL_ID, &tmp); + pcmk__debug("Got call_id=%d for %s", tmp, pcmk__xe_id(resource)); if (tmp > op->call_id) { op->call_id = tmp; } diff --git a/lib/pacemaker/pcmk_graph_logging.c b/lib/pacemaker/pcmk_graph_logging.c index a7d27d866fc..3e340b0010c 100644 --- a/lib/pacemaker/pcmk_graph_logging.c +++ b/lib/pacemaker/pcmk_graph_logging.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -87,16 +87,16 @@ find_graph_action_by_id(const pcmk__graph_t *graph, int id) static const char * synapse_state_str(pcmk__graph_synapse_t *synapse) { - if (pcmk_is_set(synapse->flags, pcmk__synapse_failed)) { + if (pcmk__is_set(synapse->flags, pcmk__synapse_failed)) { return "Failed"; - } else if (pcmk_is_set(synapse->flags, pcmk__synapse_confirmed)) { + } else if (pcmk__is_set(synapse->flags, pcmk__synapse_confirmed)) { return "Completed"; - } else if (pcmk_is_set(synapse->flags, pcmk__synapse_executed)) { + } else if (pcmk__is_set(synapse->flags, pcmk__synapse_executed)) { return "In-flight"; - } else if (pcmk_is_set(synapse->flags, pcmk__synapse_ready)) { + } else if (pcmk__is_set(synapse->flags, pcmk__synapse_ready)) { return "Ready"; } return "Pending"; @@ -124,10 +124,10 @@ synapse_pending_inputs(const pcmk__graph_t *graph, for (const GList *lpc = synapse->inputs; lpc != NULL; lpc = lpc->next) { const pcmk__graph_action_t *input = (pcmk__graph_action_t *) lpc->data; - if (pcmk_is_set(input->flags, pcmk__graph_action_failed)) { + if (pcmk__is_set(input->flags, pcmk__graph_action_failed)) { pcmk__add_word(&pending, 1024, pcmk__xe_id(input->xml)); - } else if (pcmk_is_set(input->flags, pcmk__graph_action_confirmed)) { + } else if (pcmk__is_set(input->flags, pcmk__graph_action_confirmed)) { // Confirmed successful inputs are not pending } else if (find_graph_action_by_id(graph, input->id) != NULL) { @@ -145,8 +145,8 @@ log_unresolved_inputs(unsigned int log_level, pcmk__graph_t *graph, { for (GList *lpc = synapse->inputs; lpc != NULL; lpc = lpc->next) { pcmk__graph_action_t *input = (pcmk__graph_action_t *) lpc->data; - const char *key = crm_element_value(input->xml, PCMK__XA_OPERATION_KEY); - const char *host = crm_element_value(input->xml, PCMK__META_ON_NODE); + const char *key = pcmk__xe_get(input->xml, PCMK__XA_OPERATION_KEY); + const char *host = pcmk__xe_get(input->xml, PCMK__META_ON_NODE); if (find_graph_action_by_id(graph, input->id) == NULL) { do_crm_log(log_level, @@ -161,11 +161,11 @@ static void log_synapse_action(unsigned int log_level, pcmk__graph_synapse_t *synapse, pcmk__graph_action_t *action, const char *pending_inputs) { - const char *key = crm_element_value(action->xml, PCMK__XA_OPERATION_KEY); - const char *host = crm_element_value(action->xml, PCMK__META_ON_NODE); - char *desc = crm_strdup_printf("%s %s op %s", - synapse_state_str(synapse), - actiontype2text(action->type), key); + const char *key = pcmk__xe_get(action->xml, PCMK__XA_OPERATION_KEY); + const char *host = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); + char *desc = pcmk__assert_asprintf("%s %s op %s", + synapse_state_str(synapse), + actiontype2text(action->type), key); do_crm_log(log_level, "[Action %4d]: %-50s%s%s (priority: %d, waiting: %s)", @@ -181,7 +181,7 @@ log_synapse(unsigned int log_level, pcmk__graph_t *graph, GString *g_pending = NULL; const char *pending = "none"; - if (!pcmk_is_set(synapse->flags, pcmk__synapse_executed)) { + if (!pcmk__is_set(synapse->flags, pcmk__synapse_executed)) { g_pending = synapse_pending_inputs(graph, synapse); if (g_pending != NULL) { @@ -198,7 +198,7 @@ log_synapse(unsigned int log_level, pcmk__graph_t *graph, g_string_free(g_pending, TRUE); } - if (!pcmk_is_set(synapse->flags, pcmk__synapse_executed)) { + if (!pcmk__is_set(synapse->flags, pcmk__synapse_executed)) { log_unresolved_inputs(log_level, graph, synapse); } } @@ -213,8 +213,8 @@ void pcmk__log_graph(unsigned int log_level, pcmk__graph_t *graph) { if ((graph == NULL) || (graph->num_actions == 0)) { - if (log_level == LOG_TRACE) { - crm_debug("Empty transition graph"); + if (log_level == PCMK__LOG_TRACE) { + pcmk__debug("Empty transition graph"); } return; } diff --git a/lib/pacemaker/pcmk_graph_producer.c b/lib/pacemaker/pcmk_graph_producer.c index e6cff3e26c8..4d6ed1f43fd 100644 --- a/lib/pacemaker/pcmk_graph_producer.c +++ b/lib/pacemaker/pcmk_graph_producer.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,6 +12,7 @@ #include #include #include +#include // hash2field(), etc. #include #include @@ -23,13 +24,13 @@ // Convenience macros for logging action properties #define action_type_str(flags) \ - (pcmk_is_set((flags), pcmk__action_pseudo)? "pseudo-action" : "action") + (pcmk__is_set((flags), pcmk__action_pseudo)? "pseudo-action" : "action") #define action_optional_str(flags) \ - (pcmk_is_set((flags), pcmk__action_optional)? "optional" : "required") + (pcmk__is_set((flags), pcmk__action_optional)? "optional" : "required") #define action_runnable_str(flags) \ - (pcmk_is_set((flags), pcmk__action_runnable)? "runnable" : "unrunnable") + (pcmk__is_set((flags), pcmk__action_runnable)? "runnable" : "unrunnable") #define action_node_str(a) \ (((a)->node == NULL)? "no node" : (a)->node->priv->name) @@ -47,7 +48,7 @@ add_node_to_xml_by_id(const char *id, xmlNode *xml) xmlNode *node_xml; node_xml = pcmk__xe_create(xml, PCMK_XE_NODE); - crm_xml_add(node_xml, PCMK_XA_ID, id); + pcmk__xe_set(node_xml, PCMK_XA_ID, id); return node_xml; } @@ -92,21 +93,21 @@ add_maintenance_nodes(xmlNode *xml, const pcmk_scheduler_t *scheduler) continue; } if ((node->details->maintenance - && !pcmk_is_set(node->priv->flags, pcmk__node_remote_maint)) + && !pcmk__is_set(node->priv->flags, pcmk__node_remote_maint)) || (!node->details->maintenance - && pcmk_is_set(node->priv->flags, pcmk__node_remote_maint))) { + && pcmk__is_set(node->priv->flags, pcmk__node_remote_maint))) { if (maintenance != NULL) { - crm_xml_add(add_node_to_xml_by_id(node->priv->id, - maintenance), - PCMK__XA_NODE_IN_MAINTENANCE, - (node->details->maintenance? "1" : "0")); + pcmk__xe_set(add_node_to_xml_by_id(node->priv->id, + maintenance), + PCMK__XA_NODE_IN_MAINTENANCE, + (node->details->maintenance? "1" : "0")); } count++; } } - crm_trace("%s %d nodes in need of maintenance mode update in state", - ((maintenance == NULL)? "Counted" : "Added"), count); + pcmk__trace("%s %d nodes in need of maintenance mode update in state", + ((maintenance == NULL)? "Counted" : "Added"), count); return count; } @@ -165,8 +166,8 @@ add_downed_nodes(xmlNode *xml, const pcmk_action_t *action) } } else if ((action->rsc != NULL) - && pcmk_is_set(action->rsc->flags, - pcmk__rsc_is_remote_connection) + && pcmk__is_set(action->rsc->flags, + pcmk__rsc_is_remote_connection) && pcmk__str_eq(action->task, PCMK_ACTION_STOP, pcmk__str_none)) { @@ -231,10 +232,10 @@ add_node_details(const pcmk_action_t *action, xmlNode *xml) { pcmk_node_t *router_node = pcmk__connection_host_for_action(action); - crm_xml_add(xml, PCMK__META_ON_NODE, action->node->priv->name); - crm_xml_add(xml, PCMK__META_ON_NODE_UUID, action->node->priv->id); + pcmk__xe_set(xml, PCMK__META_ON_NODE, action->node->priv->name); + pcmk__xe_set(xml, PCMK__META_ON_NODE_UUID, action->node->priv->id); if (router_node != NULL) { - crm_xml_add(xml, PCMK__XA_ROUTER_NODE, router_node->priv->name); + pcmk__xe_set(xml, PCMK__XA_ROUTER_NODE, router_node->priv->name); } } @@ -260,15 +261,15 @@ add_resource_details(const pcmk_action_t *action, xmlNode *action_xml) * completes. */ if (pcmk__action_locks_rsc_to_node(action)) { - crm_xml_add_ll(action_xml, PCMK_OPT_SHUTDOWN_LOCK, - (long long) action->rsc->priv->lock_time); + pcmk__xe_set_time(action_xml, PCMK_OPT_SHUTDOWN_LOCK, + action->rsc->priv->lock_time); } // List affected resource rsc_xml = pcmk__xe_create(action_xml, (const char *) action->rsc->priv->xml->name); - if (pcmk_is_set(action->rsc->flags, pcmk__rsc_removed) + if (pcmk__is_set(action->rsc->flags, pcmk__rsc_removed) && (action->rsc->priv->history_id != NULL)) { /* Use the numbered instance name here, because if there is more * than one instance on a node, we need to make sure the command @@ -278,16 +279,16 @@ add_resource_details(const pcmk_action_t *action, xmlNode *action_xml) * unique meta-attribute might have just been toggled from on to * off. */ - crm_debug("Using orphan clone name %s instead of history ID %s", - action->rsc->id, action->rsc->priv->history_id); - crm_xml_add(rsc_xml, PCMK_XA_ID, action->rsc->priv->history_id); - crm_xml_add(rsc_xml, PCMK__XA_LONG_ID, action->rsc->id); + pcmk__debug("Using orphan clone name %s instead of history ID %s", + action->rsc->id, action->rsc->priv->history_id); + pcmk__xe_set(rsc_xml, PCMK_XA_ID, action->rsc->priv->history_id); + pcmk__xe_set(rsc_xml, PCMK__XA_LONG_ID, action->rsc->id); - } else if (!pcmk_is_set(action->rsc->flags, pcmk__rsc_unique)) { + } else if (!pcmk__is_set(action->rsc->flags, pcmk__rsc_unique)) { const char *xml_id = pcmk__xe_id(action->rsc->priv->xml); - crm_debug("Using anonymous clone name %s for %s (aka %s)", - xml_id, action->rsc->id, action->rsc->priv->history_id); + pcmk__debug("Using anonymous clone name %s for %s (aka %s)", xml_id, + action->rsc->id, action->rsc->priv->history_id); /* ID is what we'd like client to use * LONG_ID is what they might know it as instead @@ -303,25 +304,25 @@ add_resource_details(const pcmk_action_t *action, xmlNode *action_xml) * 'instance free' name will correspond to an orphan * and fall into the clause above instead */ - crm_xml_add(rsc_xml, PCMK_XA_ID, xml_id); + pcmk__xe_set(rsc_xml, PCMK_XA_ID, xml_id); if ((action->rsc->priv->history_id != NULL) && !pcmk__str_eq(xml_id, action->rsc->priv->history_id, pcmk__str_none)) { - crm_xml_add(rsc_xml, PCMK__XA_LONG_ID, - action->rsc->priv->history_id); + pcmk__xe_set(rsc_xml, PCMK__XA_LONG_ID, + action->rsc->priv->history_id); } else { - crm_xml_add(rsc_xml, PCMK__XA_LONG_ID, action->rsc->id); + pcmk__xe_set(rsc_xml, PCMK__XA_LONG_ID, action->rsc->id); } } else { pcmk__assert(action->rsc->priv->history_id == NULL); - crm_xml_add(rsc_xml, PCMK_XA_ID, action->rsc->id); + pcmk__xe_set(rsc_xml, PCMK_XA_ID, action->rsc->id); } for (int lpc = 0; lpc < PCMK__NELEM(attr_list); lpc++) { - crm_xml_add(rsc_xml, attr_list[lpc], - g_hash_table_lookup(action->rsc->priv->meta, - attr_list[lpc])); + pcmk__xe_set(rsc_xml, attr_list[lpc], + g_hash_table_lookup(action->rsc->priv->meta, + attr_list[lpc])); } } @@ -344,7 +345,7 @@ add_action_attributes(pcmk_action_t *action, xmlNode *action_xml) */ args_xml = pcmk__xe_create(action_xml, PCMK__XE_ATTRIBUTES); - crm_xml_add(args_xml, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); + pcmk__xe_set(args_xml, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); g_hash_table_foreach(action->extra, hash2field, args_xml); if ((rsc != NULL) && (action->node != NULL)) { @@ -403,7 +404,7 @@ create_graph_action(xmlNode *parent, pcmk_action_t *action, bool skip_details, if (pcmk__str_eq(action->task, PCMK_ACTION_STONITH, pcmk__str_none)) { /* All fences need node info; guest node fences are pseudo-events */ - if (pcmk_is_set(action->flags, pcmk__action_pseudo)) { + if (pcmk__is_set(action->flags, pcmk__action_pseudo)) { action_xml = pcmk__xe_create(parent, PCMK__XE_PSEUDO_EVENT); } else { action_xml = pcmk__xe_create(parent, PCMK__XE_CRM_EVENT); @@ -418,9 +419,9 @@ create_graph_action(xmlNode *parent, pcmk_action_t *action, bool skip_details, pcmk__str_none)) { // CIB-only clean-up for shutdown locks action_xml = pcmk__xe_create(parent, PCMK__XE_CRM_EVENT); - crm_xml_add(action_xml, PCMK__XA_MODE, PCMK__VALUE_CIB); + pcmk__xe_set(action_xml, PCMK__XA_MODE, PCMK__VALUE_CIB); - } else if (pcmk_is_set(action->flags, pcmk__action_pseudo)) { + } else if (pcmk__is_set(action->flags, pcmk__action_pseudo)) { if (pcmk__str_eq(action->task, PCMK_ACTION_MAINTENANCE_NODES, pcmk__str_none)) { needs_maintenance_info = true; @@ -432,8 +433,8 @@ create_graph_action(xmlNode *parent, pcmk_action_t *action, bool skip_details, action_xml = pcmk__xe_create(parent, PCMK__XE_RSC_OP); } - crm_xml_add_int(action_xml, PCMK_XA_ID, action->id); - crm_xml_add(action_xml, PCMK_XA_OPERATION, action->task); + pcmk__xe_set_int(action_xml, PCMK_XA_ID, action->id); + pcmk__xe_set(action_xml, PCMK_XA_OPERATION, action->task); if ((action->rsc != NULL) && (action->rsc->priv->history_id != NULL)) { char *clone_key = NULL; @@ -444,12 +445,12 @@ create_graph_action(xmlNode *parent, pcmk_action_t *action, bool skip_details, interval_ms = 0; } clone_key = clone_op_key(action, interval_ms); - crm_xml_add(action_xml, PCMK__XA_OPERATION_KEY, clone_key); - crm_xml_add(action_xml, "internal_" PCMK__XA_OPERATION_KEY, - action->uuid); + pcmk__xe_set(action_xml, PCMK__XA_OPERATION_KEY, clone_key); + pcmk__xe_set(action_xml, "internal_" PCMK__XA_OPERATION_KEY, + action->uuid); free(clone_key); } else { - crm_xml_add(action_xml, PCMK__XA_OPERATION_KEY, action->uuid); + pcmk__xe_set(action_xml, PCMK__XA_OPERATION_KEY, action->uuid); } if (needs_node_info && (action->node != NULL)) { @@ -465,7 +466,7 @@ create_graph_action(xmlNode *parent, pcmk_action_t *action, bool skip_details, } if ((action->rsc != NULL) - && !pcmk_is_set(action->flags, pcmk__action_pseudo)) { + && !pcmk__is_set(action->flags, pcmk__action_pseudo)) { // This is a real resource action, so add resource details add_resource_details(action, action_xml); @@ -495,16 +496,16 @@ create_graph_action(xmlNode *parent, pcmk_action_t *action, bool skip_details, static bool should_add_action_to_graph(pcmk_action_t *action) { - if (!pcmk_is_set(action->flags, pcmk__action_runnable)) { - crm_trace("Ignoring action %s (%d): unrunnable", - action->uuid, action->id); + if (!pcmk__is_set(action->flags, pcmk__action_runnable)) { + pcmk__trace("Ignoring action %s (%d): unrunnable", action->uuid, + action->id); return false; } - if (pcmk_is_set(action->flags, pcmk__action_optional) - && !pcmk_is_set(action->flags, pcmk__action_always_in_graph)) { - crm_trace("Ignoring action %s (%d): optional", - action->uuid, action->id); + if (pcmk__is_set(action->flags, pcmk__action_optional) + && !pcmk__is_set(action->flags, pcmk__action_always_in_graph)) { + pcmk__trace("Ignoring action %s (%d): optional", action->uuid, + action->id); return false; } @@ -512,7 +513,7 @@ should_add_action_to_graph(pcmk_action_t *action) * with the exception of monitors and cancellation of recurring monitors. */ if ((action->rsc != NULL) - && !pcmk_is_set(action->rsc->flags, pcmk__rsc_managed) + && !pcmk__is_set(action->rsc->flags, pcmk__rsc_managed) && !pcmk__str_eq(action->task, PCMK_ACTION_MONITOR, pcmk__str_none)) { const char *interval_ms_s; @@ -524,8 +525,8 @@ should_add_action_to_graph(pcmk_action_t *action) */ interval_ms_s = g_hash_table_lookup(action->meta, PCMK_META_INTERVAL); if (pcmk__str_eq(interval_ms_s, "0", pcmk__str_null_matches)) { - crm_trace("Ignoring action %s (%d): for unmanaged resource (%s)", - action->uuid, action->id, action->rsc->id); + pcmk__trace("Ignoring action %s (%d): for unmanaged resource (%s)", + action->uuid, action->id, action->rsc->id); return false; } } @@ -533,7 +534,7 @@ should_add_action_to_graph(pcmk_action_t *action) /* Always add pseudo-actions, fence actions, and shutdown actions (already * determined to be required and runnable by this point) */ - if (pcmk_is_set(action->flags, pcmk__action_pseudo) + if (pcmk__is_set(action->flags, pcmk__action_pseudo) || pcmk__strcase_any_of(action->task, PCMK_ACTION_STONITH, PCMK_ACTION_DO_SHUTDOWN, NULL)) { return true; @@ -548,17 +549,17 @@ should_add_action_to_graph(pcmk_action_t *action) return false; } - if (pcmk_is_set(action->flags, pcmk__action_on_dc)) { - crm_trace("Action %s (%d) should be dumped: " - "can run on DC instead of %s", - action->uuid, action->id, pcmk__node_name(action->node)); + if (pcmk__is_set(action->flags, pcmk__action_on_dc)) { + pcmk__trace("Action %s (%d) should be dumped: " + "can run on DC instead of %s", + action->uuid, action->id, pcmk__node_name(action->node)); } else if (pcmk__is_guest_or_bundle_node(action->node) - && !pcmk_is_set(action->node->priv->flags, - pcmk__node_remote_reset)) { - crm_trace("Action %s (%d) should be dumped: " - "assuming will be runnable on guest %s", - action->uuid, action->id, pcmk__node_name(action->node)); + && !pcmk__is_set(action->node->priv->flags, + pcmk__node_remote_reset)) { + pcmk__trace("Action %s (%d) should be dumped: " + "assuming will be runnable on guest %s", + action->uuid, action->id, pcmk__node_name(action->node)); } else if (!action->node->details->online) { pcmk__sched_err(action->scheduler, @@ -590,10 +591,10 @@ should_add_action_to_graph(pcmk_action_t *action) static bool ordering_can_change_actions(const pcmk__related_action_t *ordering) { - return pcmk_any_flags_set(ordering->flags, - ~(pcmk__ar_then_implies_first_graphed - |pcmk__ar_first_implies_then_graphed - |pcmk__ar_ordered)); + return pcmk__any_flags_set(ordering->flags, + ~(pcmk__ar_then_implies_first_graphed + |pcmk__ar_first_implies_then_graphed + |pcmk__ar_ordered)); } /*! @@ -616,51 +617,51 @@ should_add_input_to_graph(const pcmk_action_t *action, } if (input->flags == pcmk__ar_none) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "ordering disabled", - action->uuid, action->id, - input->action->uuid, input->action->id); + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "ordering disabled", + action->uuid, action->id, + input->action->uuid, input->action->id); return false; - } else if (!pcmk_is_set(input->action->flags, pcmk__action_runnable) + } else if (!pcmk__is_set(input->action->flags, pcmk__action_runnable) && !ordering_can_change_actions(input)) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "optional and input unrunnable", - action->uuid, action->id, - input->action->uuid, input->action->id); + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "optional and input unrunnable", + action->uuid, action->id, + input->action->uuid, input->action->id); return false; - } else if (!pcmk_is_set(input->action->flags, pcmk__action_runnable) - && pcmk_is_set(input->flags, pcmk__ar_min_runnable)) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "minimum number of instances required but input unrunnable", - action->uuid, action->id, - input->action->uuid, input->action->id); + } else if (!pcmk__is_set(input->action->flags, pcmk__action_runnable) + && pcmk__is_set(input->flags, pcmk__ar_min_runnable)) { + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "minimum number of instances required but input unrunnable", + action->uuid, action->id, + input->action->uuid, input->action->id); return false; - } else if (pcmk_is_set(input->flags, pcmk__ar_unmigratable_then_blocks) - && !pcmk_is_set(input->action->flags, pcmk__action_runnable)) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "input blocked if 'then' unmigratable", - action->uuid, action->id, - input->action->uuid, input->action->id); + } else if (pcmk__is_set(input->flags, pcmk__ar_unmigratable_then_blocks) + && !pcmk__is_set(input->action->flags, pcmk__action_runnable)) { + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "input blocked if 'then' unmigratable", + action->uuid, action->id, + input->action->uuid, input->action->id); return false; - } else if (pcmk_is_set(input->flags, pcmk__ar_if_first_unmigratable) - && pcmk_is_set(input->action->flags, pcmk__action_migratable)) { - crm_trace("Ignoring %s (%d) input %s (%d): ordering applies " - "only if input is unmigratable, but it is migratable", - action->uuid, action->id, - input->action->uuid, input->action->id); + } else if (pcmk__is_set(input->flags, pcmk__ar_if_first_unmigratable) + && pcmk__is_set(input->action->flags, pcmk__action_migratable)) { + pcmk__trace("Ignoring %s (%d) input %s (%d): ordering applies " + "only if input is unmigratable, but it is migratable", + action->uuid, action->id, + input->action->uuid, input->action->id); return false; } else if ((input->flags == pcmk__ar_ordered) - && pcmk_is_set(input->action->flags, pcmk__action_migratable) + && pcmk__is_set(input->action->flags, pcmk__action_migratable) && pcmk__ends_with(input->action->uuid, "_stop_0")) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "optional but stop in migration", - action->uuid, action->id, - input->action->uuid, input->action->id); + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "optional but stop in migration", + action->uuid, action->id, + input->action->uuid, input->action->id); return false; } else if (input->flags == pcmk__ar_if_on_same_node_or_target) { @@ -677,31 +678,31 @@ should_add_input_to_graph(const pcmk_action_t *action, * executed. */ if (!pcmk__same_node(input_node, assigned)) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "migration target %s is not same as input node %s", - action->uuid, action->id, - input->action->uuid, input->action->id, - (assigned? assigned->priv->name : ""), - (input_node? input_node->priv->name : "")); + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "migration target %s is not same as input node %s", + action->uuid, action->id, + input->action->uuid, input->action->id, + pcmk__node_name(assigned), + pcmk__node_name(input_node)); input->flags = pcmk__ar_none; return false; } } else if (!pcmk__same_node(input_node, action->node)) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "not on same node (%s vs %s)", - action->uuid, action->id, - input->action->uuid, input->action->id, - (action->node? action->node->priv->name : ""), - (input_node? input_node->priv->name : "")); + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "not on same node (%s vs %s)", + action->uuid, action->id, + input->action->uuid, input->action->id, + pcmk__node_name(action->node), + pcmk__node_name(input_node)); input->flags = pcmk__ar_none; return false; - } else if (pcmk_is_set(input->action->flags, pcmk__action_optional)) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "ordering optional", - action->uuid, action->id, - input->action->uuid, input->action->id); + } else if (pcmk__is_set(input->action->flags, pcmk__action_optional)) { + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "ordering optional", + action->uuid, action->id, + input->action->uuid, input->action->id); input->flags = pcmk__ar_none; return false; } @@ -709,52 +710,52 @@ should_add_input_to_graph(const pcmk_action_t *action, } else if (input->flags == pcmk__ar_if_required_on_same_node) { if (input->action->node && action->node && !pcmk__same_node(input->action->node, action->node)) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "not on same node (%s vs %s)", - action->uuid, action->id, - input->action->uuid, input->action->id, - pcmk__node_name(action->node), - pcmk__node_name(input->action->node)); + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "not on same node (%s vs %s)", + action->uuid, action->id, + input->action->uuid, input->action->id, + pcmk__node_name(action->node), + pcmk__node_name(input->action->node)); input->flags = pcmk__ar_none; return false; - } else if (pcmk_is_set(input->action->flags, pcmk__action_optional)) { - crm_trace("Ignoring %s (%d) input %s (%d): optional", - action->uuid, action->id, - input->action->uuid, input->action->id); + } else if (pcmk__is_set(input->action->flags, pcmk__action_optional)) { + pcmk__trace("Ignoring %s (%d) input %s (%d): optional", + action->uuid, action->id, + input->action->uuid, input->action->id); input->flags = pcmk__ar_none; return false; } } else if (input->action->rsc && input->action->rsc != action->rsc - && pcmk_is_set(input->action->rsc->flags, pcmk__rsc_failed) - && !pcmk_is_set(input->action->rsc->flags, pcmk__rsc_managed) + && pcmk__is_set(input->action->rsc->flags, pcmk__rsc_failed) + && !pcmk__is_set(input->action->rsc->flags, pcmk__rsc_managed) && pcmk__ends_with(input->action->uuid, "_stop_0") && pcmk__is_clone(action->rsc)) { - crm_warn("Ignoring requirement that %s complete before %s:" - " unmanaged failed resources cannot prevent clone shutdown", - input->action->uuid, action->uuid); + pcmk__warn("Ignoring requirement that %s complete before %s: unmanaged " + "failed resources cannot prevent clone shutdown", + input->action->uuid, action->uuid); return false; - } else if (pcmk_is_set(input->action->flags, pcmk__action_optional) - && !pcmk_any_flags_set(input->action->flags, - pcmk__action_always_in_graph - |pcmk__action_added_to_graph) + } else if (pcmk__is_set(input->action->flags, pcmk__action_optional) + && !pcmk__any_flags_set(input->action->flags, + pcmk__action_always_in_graph + |pcmk__action_added_to_graph) && !should_add_action_to_graph(input->action)) { - crm_trace("Ignoring %s (%d) input %s (%d): " - "input optional", - action->uuid, action->id, - input->action->uuid, input->action->id); + pcmk__trace("Ignoring %s (%d) input %s (%d): " + "input optional", + action->uuid, action->id, + input->action->uuid, input->action->id); return false; } - crm_trace("%s (%d) input %s %s (%d) on %s should be dumped: %s %s %#.6x", - action->uuid, action->id, action_type_str(input->action->flags), - input->action->uuid, input->action->id, - action_node_str(input->action), - action_runnable_str(input->action->flags), - action_optional_str(input->action->flags), input->flags); + pcmk__trace("%s (%d) input %s %s (%d) on %s should be dumped: %s %s %#.6x", + action->uuid, action->id, action_type_str(input->action->flags), + input->action->uuid, input->action->id, + action_node_str(input->action), + action_runnable_str(input->action->flags), + action_optional_str(input->action->flags), input->flags); return true; } @@ -776,13 +777,10 @@ pcmk__graph_has_loop(const pcmk_action_t *init_action, { bool has_loop = false; - if (pcmk_is_set(input->action->flags, pcmk__action_detect_loop)) { - crm_trace("Breaking tracking loop: %s@%s -> %s@%s (%#.6x)", - input->action->uuid, - input->action->node? input->action->node->priv->name : "", - action->uuid, - action->node? action->node->priv->name : "", - input->flags); + if (pcmk__is_set(input->action->flags, pcmk__action_detect_loop)) { + pcmk__trace("Breaking tracking loop: %s@%s -> %s@%s (%#.6x)", + input->action->uuid, pcmk__node_name(input->action->node), + action->uuid, pcmk__node_name(action->node), input->flags); return false; } @@ -792,25 +790,20 @@ pcmk__graph_has_loop(const pcmk_action_t *init_action, } if (input->action == init_action) { - crm_debug("Input loop found in %s@%s ->...-> %s@%s", - action->uuid, - action->node? action->node->priv->name : "", - init_action->uuid, - init_action->node? init_action->node->priv->name : ""); + pcmk__debug("Input loop found in %s@%s ->...-> %s@%s", + action->uuid, pcmk__node_name(action->node), + init_action->uuid, pcmk__node_name(init_action->node)); return true; } pcmk__set_action_flags(input->action, pcmk__action_detect_loop); - crm_trace("Checking inputs of action %s@%s input %s@%s (%#.6x)" - "for graph loop with %s@%s ", - action->uuid, - action->node? action->node->priv->name : "", - input->action->uuid, - input->action->node? input->action->node->priv->name : "", - input->flags, - init_action->uuid, - init_action->node? init_action->node->priv->name : ""); + pcmk__trace("Checking inputs of action %s@%s input %s@%s (%#.6x)" + "for graph loop with %s@%s ", + action->uuid, pcmk__node_name(action->node), + input->action->uuid, pcmk__node_name(input->action->node), + input->flags, + init_action->uuid, pcmk__node_name(init_action->node)); // Recursively check input itself for loops for (GList *iter = input->action->actions_before; @@ -827,12 +820,9 @@ pcmk__graph_has_loop(const pcmk_action_t *init_action, pcmk__clear_action_flags(input->action, pcmk__action_detect_loop); if (!has_loop) { - crm_trace("No input loop found in %s@%s -> %s@%s (%#.6x)", - input->action->uuid, - input->action->node? input->action->node->priv->name : "", - action->uuid, - action->node? action->node->priv->name : "", - input->flags); + pcmk__trace("No input loop found in %s@%s -> %s@%s (%#.6x)", + input->action->uuid, pcmk__node_name(input->action->node), + action->uuid, pcmk__node_name(action->node), input->flags); } return has_loop; } @@ -852,7 +842,7 @@ create_graph_synapse(const pcmk_action_t *action, pcmk_scheduler_t *scheduler) int synapse_priority = 0; xmlNode *syn = pcmk__xe_create(scheduler->priv->graph, PCMK__XE_SYNAPSE); - crm_xml_add_int(syn, PCMK_XA_ID, scheduler->priv->synapse_count++); + pcmk__xe_set_int(syn, PCMK_XA_ID, scheduler->priv->synapse_count++); if (action->rsc != NULL) { synapse_priority = action->rsc->priv->priority; @@ -861,7 +851,7 @@ create_graph_synapse(const pcmk_action_t *action, pcmk_scheduler_t *scheduler) synapse_priority = action->priority; } if (synapse_priority > 0) { - crm_xml_add_int(syn, PCMK__XA_PRIORITY, synapse_priority); + pcmk__xe_set_int(syn, PCMK__XA_PRIORITY, synapse_priority); } return syn; } @@ -896,21 +886,20 @@ add_action_to_graph(gpointer data, gpointer user_data) * the action to the graph, so that crm_simulate's dot graphs don't have * duplicates). */ - if (!pcmk_is_set(action->flags, pcmk__action_inputs_deduplicated)) { + if (!pcmk__is_set(action->flags, pcmk__action_inputs_deduplicated)) { pcmk__deduplicate_action_inputs(action); pcmk__set_action_flags(action, pcmk__action_inputs_deduplicated); } - if (pcmk_is_set(action->flags, pcmk__action_added_to_graph) + if (pcmk__is_set(action->flags, pcmk__action_added_to_graph) || !should_add_action_to_graph(action)) { return; // Already added, or shouldn't be } pcmk__set_action_flags(action, pcmk__action_added_to_graph); - crm_trace("Adding action %d (%s%s%s) to graph", - action->id, action->uuid, - ((action->node == NULL)? "" : " on "), - ((action->node == NULL)? "" : action->node->priv->name)); + pcmk__trace("Adding action %d (%s%s%s) to graph", + action->id, action->uuid, ((action->node != NULL)? " on " : ""), + pcmk__node_name(action->node)); syn = create_graph_synapse(action, scheduler); set = pcmk__xe_create(syn, PCMK__XE_ACTION_SET); @@ -943,29 +932,28 @@ void pcmk__log_transition_summary(const pcmk_scheduler_t *scheduler, const char *filename) { - if (pcmk_is_set(scheduler->flags, pcmk__sched_processing_error) + if (pcmk__is_set(scheduler->flags, pcmk__sched_processing_error) || pcmk__config_has_error) { - crm_err("Calculated transition %d (with errors)%s%s", - transition_id, - (filename == NULL)? "" : ", saving inputs in ", - (filename == NULL)? "" : filename); + pcmk__err("Calculated transition %d (with errors)%s%s", + transition_id, + ((filename != NULL)? ", saving inputs in " : ""), + ((filename != NULL)? filename : "")); - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_processing_warning) + } else if (pcmk__is_set(scheduler->flags, pcmk__sched_processing_warning) || pcmk__config_has_warning) { - crm_warn("Calculated transition %d (with warnings)%s%s", - transition_id, - (filename == NULL)? "" : ", saving inputs in ", - (filename == NULL)? "" : filename); + pcmk__warn("Calculated transition %d (with warnings)%s%s", + transition_id, + ((filename != NULL)? ", saving inputs in " : ""), + pcmk__s(filename, "")); } else { - crm_notice("Calculated transition %d%s%s", - transition_id, - (filename == NULL)? "" : ", saving inputs in ", - (filename == NULL)? "" : filename); + pcmk__notice("Calculated transition %d%s%s", transition_id, + ((filename != NULL)? ", saving inputs in " : ""), + pcmk__s(filename, "")); } if (pcmk__config_has_error) { - crm_notice("Configuration errors found during scheduler processing," - " please run \"crm_verify -L\" to identify issues"); + pcmk__notice("Configuration errors found during scheduler processing, " + "please run \"crm_verify -L\" to identify issues"); } } @@ -1012,47 +1000,44 @@ pcmk__create_graph(pcmk_scheduler_t *scheduler) int rc = pcmk_rc_ok; transition_id++; - crm_trace("Creating transition graph %d", transition_id); + pcmk__trace("Creating transition graph %d", transition_id); scheduler->priv->graph = pcmk__xe_create(NULL, PCMK__XE_TRANSITION_GRAPH); value = pcmk__cluster_option(config_hash, PCMK_OPT_CLUSTER_DELAY); - crm_xml_add(scheduler->priv->graph, PCMK_OPT_CLUSTER_DELAY, value); + pcmk__xe_set(scheduler->priv->graph, PCMK_OPT_CLUSTER_DELAY, value); value = pcmk__cluster_option(config_hash, PCMK_OPT_STONITH_TIMEOUT); - crm_xml_add(scheduler->priv->graph, PCMK_OPT_STONITH_TIMEOUT, value); + pcmk__xe_set(scheduler->priv->graph, PCMK_OPT_STONITH_TIMEOUT, value); - crm_xml_add(scheduler->priv->graph, PCMK__XA_FAILED_STOP_OFFSET, - PCMK_VALUE_INFINITY); + pcmk__xe_set(scheduler->priv->graph, PCMK__XA_FAILED_STOP_OFFSET, + PCMK_VALUE_INFINITY); - if (pcmk_is_set(scheduler->flags, pcmk__sched_start_failure_fatal)) { - crm_xml_add(scheduler->priv->graph, PCMK__XA_FAILED_START_OFFSET, - PCMK_VALUE_INFINITY); + if (pcmk__is_set(scheduler->flags, pcmk__sched_start_failure_fatal)) { + pcmk__xe_set(scheduler->priv->graph, PCMK__XA_FAILED_START_OFFSET, + PCMK_VALUE_INFINITY); } else { - crm_xml_add(scheduler->priv->graph, PCMK__XA_FAILED_START_OFFSET, "1"); + pcmk__xe_set(scheduler->priv->graph, PCMK__XA_FAILED_START_OFFSET, "1"); } value = pcmk__cluster_option(config_hash, PCMK_OPT_BATCH_LIMIT); - crm_xml_add(scheduler->priv->graph, PCMK_OPT_BATCH_LIMIT, value); + pcmk__xe_set(scheduler->priv->graph, PCMK_OPT_BATCH_LIMIT, value); - crm_xml_add_int(scheduler->priv->graph, "transition_id", transition_id); + pcmk__xe_set_int(scheduler->priv->graph, "transition_id", transition_id); value = pcmk__cluster_option(config_hash, PCMK_OPT_MIGRATION_LIMIT); rc = pcmk__scan_ll(value, &limit, 0LL); if (rc != pcmk_rc_ok) { - crm_warn("Ignoring invalid value '%s' for " PCMK_OPT_MIGRATION_LIMIT - ": %s", value, pcmk_rc_str(rc)); + pcmk__warn("Ignoring invalid value '%s' for " PCMK_OPT_MIGRATION_LIMIT + ": %s", + value, pcmk_rc_str(rc)); } else if (limit > 0) { - crm_xml_add(scheduler->priv->graph, PCMK_OPT_MIGRATION_LIMIT, value); + pcmk__xe_set(scheduler->priv->graph, PCMK_OPT_MIGRATION_LIMIT, value); } if (scheduler->priv->recheck_by > 0) { - char *recheck_epoch = NULL; - - recheck_epoch = crm_strdup_printf("%llu", (unsigned long long) - scheduler->priv->recheck_by); - crm_xml_add(scheduler->priv->graph, "recheck-by", recheck_epoch); - free(recheck_epoch); + pcmk__xe_set_time(scheduler->priv->graph, "recheck-by", + scheduler->priv->recheck_by); } /* The following code will de-duplicate action inputs, so nothing past this @@ -1078,31 +1063,33 @@ pcmk__create_graph(pcmk_scheduler_t *scheduler) if ((action->rsc != NULL) && (action->node != NULL) && action->node->details->shutdown - && !pcmk_is_set(action->rsc->flags, pcmk__rsc_maintenance) - && !pcmk_any_flags_set(action->flags, - pcmk__action_optional|pcmk__action_runnable) + && !pcmk__is_set(action->rsc->flags, pcmk__rsc_maintenance) + && !pcmk__any_flags_set(action->flags, + pcmk__action_optional|pcmk__action_runnable) && pcmk__str_eq(action->task, PCMK_ACTION_STOP, pcmk__str_none)) { /* Eventually we should just ignore the 'fence' case, but for now * it's the best way to detect (in CTS) when CIB resource updates * are being lost. */ - if (pcmk_is_set(scheduler->flags, pcmk__sched_quorate) + if (pcmk__is_set(scheduler->flags, pcmk__sched_quorate) || (scheduler->no_quorum_policy == pcmk_no_quorum_ignore)) { - const bool managed = pcmk_is_set(action->rsc->flags, - pcmk__rsc_managed); - const bool failed = pcmk_is_set(action->rsc->flags, - pcmk__rsc_failed); - - crm_crit("Cannot %s %s because of %s:%s%s (%s)", - action->node->details->unclean? "fence" : "shut down", - pcmk__node_name(action->node), action->rsc->id, - (managed? " blocked" : " unmanaged"), - (failed? " failed" : ""), action->uuid); + + const bool unclean = action->node->details->unclean; + const bool managed = pcmk__is_set(action->rsc->flags, + pcmk__rsc_managed); + const bool failed = pcmk__is_set(action->rsc->flags, + pcmk__rsc_failed); + + pcmk__crit("Cannot %s %s because of %s:%s%s (%s)", + (unclean? "fence" : "shut down"), + pcmk__node_name(action->node), action->rsc->id, + (managed? " blocked" : " unmanaged"), + (failed? " failed" : ""), action->uuid); } } add_action_to_graph((gpointer) action, (gpointer) scheduler); } - crm_log_xml_trace(scheduler->priv->graph, "graph"); + pcmk__log_xml_trace(scheduler->priv->graph, "graph"); } diff --git a/lib/pacemaker/pcmk_injections.c b/lib/pacemaker/pcmk_injections.c index 206731d64ea..d205bf2ebee 100644 --- a/lib/pacemaker/pcmk_injections.c +++ b/lib/pacemaker/pcmk_injections.c @@ -23,6 +23,7 @@ #include #include #include +#include // crm_create_nvpair_xml() #include #include #include @@ -66,14 +67,14 @@ inject_transient_attr(pcmk__output_t *out, xmlNode *cib_node, NULL); if (attrs == NULL) { attrs = pcmk__xe_create(cib_node, PCMK__XE_TRANSIENT_ATTRIBUTES); - crm_xml_add(attrs, PCMK_XA_ID, node_uuid); + pcmk__xe_set(attrs, PCMK_XA_ID, node_uuid); } instance_attrs = pcmk__xe_first_child(attrs, PCMK_XE_INSTANCE_ATTRIBUTES, NULL, NULL); if (instance_attrs == NULL) { instance_attrs = pcmk__xe_create(attrs, PCMK_XE_INSTANCE_ATTRIBUTES); - crm_xml_add(instance_attrs, PCMK_XA_ID, node_uuid); + pcmk__xe_set(instance_attrs, PCMK_XA_ID, node_uuid); } crm_create_nvpair_xml(instance_attrs, NULL, name, value); @@ -121,7 +122,7 @@ pcmk__inject_failcount(pcmk__output_t *out, cib_t *cib_conn, xmlNode *cib_node, pcmk__xe_id(cib_node), NULL, NULL, NULL, name, NULL, &output) == pcmk_rc_ok) { - if (crm_element_value_int(output, PCMK_XA_VALUE, &failcount) != 0) { + if (pcmk__xe_get_int(output, PCMK_XA_VALUE, &failcount) != pcmk_rc_ok) { failcount = 0; } } @@ -158,15 +159,15 @@ static void create_node_entry(cib_t *cib_conn, const char *node) { int rc = pcmk_ok; - char *xpath = crm_strdup_printf(XPATH_NODE_CONFIG, node); + char *xpath = pcmk__assert_asprintf(XPATH_NODE_CONFIG, node); rc = cib_conn->cmds->query(cib_conn, xpath, NULL, cib_xpath|cib_sync_call); if (rc == -ENXIO) { // Only add if not already existing xmlNode *cib_object = pcmk__xe_create(NULL, PCMK_XE_NODE); - crm_xml_add(cib_object, PCMK_XA_ID, node); // Use node name as ID - crm_xml_add(cib_object, PCMK_XA_UNAME, node); + pcmk__xe_set(cib_object, PCMK_XA_ID, node); // Use node name as ID + pcmk__xe_set(cib_object, PCMK_XA_UNAME, node); cib_conn->cmds->create(cib_conn, PCMK_XE_NODES, cib_object, cib_sync_call); /* Not bothering with subsequent query to see if it exists, @@ -211,7 +212,7 @@ create_op(const xmlNode *cib_resource, const char *task, guint interval_ms, int tmp = 0; - crm_element_value_int(xop, PCMK__XA_CALL_ID, &tmp); + pcmk__xe_get_int(xop, PCMK__XA_CALL_ID, &tmp); if (tmp > op->call_id) { op->call_id = tmp; } @@ -258,7 +259,7 @@ pcmk__inject_node(cib_t *cib_conn, const char *node, const char *uuid) { int rc = pcmk_ok; xmlNode *cib_object = NULL; - char *xpath = crm_strdup_printf(XPATH_NODE_STATE, node); + char *xpath = pcmk__assert_asprintf(XPATH_NODE_STATE, node); bool duplicate = false; char *found_uuid = NULL; @@ -270,9 +271,9 @@ pcmk__inject_node(cib_t *cib_conn, const char *node, const char *uuid) cib_xpath|cib_sync_call); if ((cib_object != NULL) && (pcmk__xe_id(cib_object) == NULL)) { - crm_err("Detected multiple " PCMK__XE_NODE_STATE " entries for " - "xpath=%s, bailing", - xpath); + pcmk__err("Detected multiple " PCMK__XE_NODE_STATE " entries for " + "xpath=%s, bailing", + xpath); duplicate = true; goto done; } @@ -285,8 +286,8 @@ pcmk__inject_node(cib_t *cib_conn, const char *node, const char *uuid) } if (found_uuid) { - char *xpath_by_uuid = crm_strdup_printf(XPATH_NODE_STATE_BY_ID, - found_uuid); + char *xpath_by_uuid = pcmk__assert_asprintf(XPATH_NODE_STATE_BY_ID, + found_uuid); /* It's possible that a PCMK__XE_NODE_STATE entry doesn't have a * PCMK_XA_UNAME yet @@ -295,14 +296,15 @@ pcmk__inject_node(cib_t *cib_conn, const char *node, const char *uuid) cib_xpath|cib_sync_call); if ((cib_object != NULL) && (pcmk__xe_id(cib_object) == NULL)) { - crm_err("Can't inject node state for %s because multiple " - "state entries found for ID %s", node, found_uuid); + pcmk__err("Can't inject node state for %s because multiple " + "state entries found for ID %s", + node, found_uuid); duplicate = true; free(xpath_by_uuid); goto done; } else if (cib_object != NULL) { - crm_xml_add(cib_object, PCMK_XA_UNAME, node); + pcmk__xe_set(cib_object, PCMK_XA_UNAME, node); rc = cib_conn->cmds->modify(cib_conn, PCMK_XE_STATUS, cib_object, cib_sync_call); @@ -314,15 +316,15 @@ pcmk__inject_node(cib_t *cib_conn, const char *node, const char *uuid) if (rc == -ENXIO) { cib_object = pcmk__xe_create(NULL, PCMK__XE_NODE_STATE); - crm_xml_add(cib_object, PCMK_XA_ID, found_uuid); - crm_xml_add(cib_object, PCMK_XA_UNAME, node); + pcmk__xe_set(cib_object, PCMK_XA_ID, found_uuid); + pcmk__xe_set(cib_object, PCMK_XA_UNAME, node); cib_conn->cmds->create(cib_conn, PCMK_XE_STATUS, cib_object, cib_sync_call); pcmk__xml_free(cib_object); rc = cib_conn->cmds->query(cib_conn, xpath, &cib_object, cib_xpath|cib_sync_call); - crm_trace("Injecting node state for %s (rc=%d)", node, rc); + pcmk__trace("Injecting node state for %s (rc=%d)", node, rc); } done: @@ -330,7 +332,7 @@ pcmk__inject_node(cib_t *cib_conn, const char *node, const char *uuid) free(xpath); if (duplicate) { - crm_log_xml_warn(cib_object, "Duplicates"); + pcmk__log_xml_warn(cib_object, "Duplicates"); crm_exit(CRM_EX_SOFTWARE); return NULL; // not reached, but makes static analysis happy } @@ -369,7 +371,7 @@ pcmk__inject_node_state_change(cib_t *cib_conn, const char *node, bool up) PCMK_XA_EXPECTED, CRMD_JOINSTATE_DOWN, NULL); } - crm_xml_add(cib_node, PCMK_XA_CRM_DEBUG_ORIGIN, crm_system_name); + pcmk__xe_set(cib_node, PCMK_XA_CRM_DEBUG_ORIGIN, crm_system_name); return cib_node; } @@ -386,9 +388,10 @@ pcmk__inject_node_state_change(cib_t *cib_conn, const char *node, bool up) static xmlNode * find_resource_xml(xmlNode *cib_node, const char *resource) { - const char *node = crm_element_value(cib_node, PCMK_XA_UNAME); - char *xpath = crm_strdup_printf(XPATH_RSC_HISTORY, node, resource); - xmlNode *match = pcmk__xpath_find_one(cib_node->doc, xpath, LOG_TRACE); + const char *node = pcmk__xe_get(cib_node, PCMK_XA_UNAME); + char *xpath = pcmk__assert_asprintf(XPATH_RSC_HISTORY, node, resource); + xmlNode *match = pcmk__xpath_find_one(cib_node->doc, xpath, + PCMK__LOG_TRACE); free(xpath); return match; @@ -453,22 +456,22 @@ pcmk__inject_resource_history(pcmk__output_t *out, xmlNode *cib_node, out->err(out, "Invalid class for %s: %s", resource, rclass); return NULL; - } else if (pcmk_is_set(pcmk_get_ra_caps(rclass), pcmk_ra_cap_provider) + } else if (pcmk__is_set(pcmk_get_ra_caps(rclass), pcmk_ra_cap_provider) && (rprovider == NULL)) { // @TODO query configuration for provider out->err(out, "Please specify the provider for resource %s", resource); return NULL; } - crm_info("Injecting new resource %s into node state '%s'", - lrm_name, pcmk__xe_id(cib_node)); + pcmk__info("Injecting new resource %s into node state '%s'", lrm_name, + pcmk__xe_id(cib_node)); lrm = pcmk__xe_first_child(cib_node, PCMK__XE_LRM, NULL, NULL); if (lrm == NULL) { const char *node_uuid = pcmk__xe_id(cib_node); lrm = pcmk__xe_create(cib_node, PCMK__XE_LRM); - crm_xml_add(lrm, PCMK_XA_ID, node_uuid); + pcmk__xe_set(lrm, PCMK_XA_ID, node_uuid); } container = pcmk__xe_first_child(lrm, PCMK__XE_LRM_RESOURCES, NULL, NULL); @@ -479,11 +482,11 @@ pcmk__inject_resource_history(pcmk__output_t *out, xmlNode *cib_node, cib_resource = pcmk__xe_create(container, PCMK__XE_LRM_RESOURCE); // If we're creating a new entry, use the preferred name - crm_xml_add(cib_resource, PCMK_XA_ID, lrm_name); + pcmk__xe_set(cib_resource, PCMK_XA_ID, lrm_name); - crm_xml_add(cib_resource, PCMK_XA_CLASS, rclass); - crm_xml_add(cib_resource, PCMK_XA_PROVIDER, rprovider); - crm_xml_add(cib_resource, PCMK_XA_TYPE, rtype); + pcmk__xe_set(cib_resource, PCMK_XA_CLASS, rclass); + pcmk__xe_set(cib_resource, PCMK_XA_PROVIDER, rprovider); + pcmk__xe_set(cib_resource, PCMK_XA_TYPE, rtype); return cib_resource; } @@ -518,8 +521,8 @@ set_ticket_state_attr(pcmk__output_t *out, const char *ticket_id, } if (rc == pcmk_rc_ok) { // Ticket state found, use it - crm_debug("Injecting attribute into existing ticket state %s", - ticket_id); + pcmk__debug("Injecting attribute into existing ticket state %s", + ticket_id); xml_top = ticket_state_xml; } else if (rc == ENXIO) { // No ticket state, create it @@ -528,7 +531,7 @@ set_ticket_state_attr(pcmk__output_t *out, const char *ticket_id, xml_top = pcmk__xe_create(NULL, PCMK_XE_STATUS); xml_obj = pcmk__xe_create(xml_top, PCMK_XE_TICKETS); ticket_state_xml = pcmk__xe_create(xml_obj, PCMK__XE_TICKET_STATE); - crm_xml_add(ticket_state_xml, PCMK_XA_ID, ticket_id); + pcmk__xe_set(ticket_state_xml, PCMK_XA_ID, ticket_id); } else { // Error return rc; @@ -536,7 +539,7 @@ set_ticket_state_attr(pcmk__output_t *out, const char *ticket_id, // Add the attribute to the ticket state pcmk__xe_set_bool_attr(ticket_state_xml, attr_name, attr_value); - crm_log_xml_debug(xml_top, "Update"); + pcmk__log_xml_debug(xml_top, "Update"); // Commit the change to the CIB rc = cib->cmds->modify(cib, PCMK_XE_STATUS, xml_top, cib_sync_call); @@ -598,9 +601,9 @@ inject_action(pcmk__output_t *out, const char *spec, cib_t *cib, goto done; } - rclass = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); - rtype = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); - rprovider = crm_element_value(rsc->priv->xml, PCMK_XA_PROVIDER); + rclass = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); + rtype = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); + rprovider = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER); cib_node = pcmk__inject_node(cib, node, NULL); pcmk__assert(cib_node != NULL); @@ -609,8 +612,8 @@ inject_action(pcmk__output_t *out, const char *spec, cib_t *cib, infinity = true; } else if (pcmk__str_eq(task, PCMK_ACTION_START, pcmk__str_none) - && pcmk_is_set(scheduler->flags, - pcmk__sched_start_failure_fatal)) { + && pcmk__is_set(scheduler->flags, + pcmk__sched_start_failure_fatal)) { infinity = true; } @@ -660,8 +663,8 @@ pcmk__inject_scheduler_input(pcmk_scheduler_t *scheduler, cib_t *cib, if (injections->quorum != NULL) { xmlNode *top = pcmk__xe_create(NULL, PCMK_XE_CIB); - /* crm_xml_add(top, PCMK_XA_DC_UUID, dc_uuid); */ - crm_xml_add(top, PCMK_XA_HAVE_QUORUM, injections->quorum); + /* pcmk__xe_set(top, PCMK_XA_DC_UUID, dc_uuid); */ + pcmk__xe_set(top, PCMK_XA_HAVE_QUORUM, injections->quorum); rc = cib->cmds->modify(cib, NULL, top, cib_sync_call); pcmk__assert(rc == pcmk_ok); @@ -701,17 +704,17 @@ pcmk__inject_scheduler_input(pcmk_scheduler_t *scheduler, cib_t *cib, pcmk__assert(rc == pcmk_ok); pcmk__xml_free(cib_node); - xpath = crm_strdup_printf("//" PCMK__XE_NODE_STATE - "[@" PCMK_XA_UNAME "='%s']" - "/" PCMK__XE_LRM, - node); + xpath = pcmk__assert_asprintf("//" PCMK__XE_NODE_STATE + "[@" PCMK_XA_UNAME "='%s']" + "/" PCMK__XE_LRM, + node); cib->cmds->remove(cib, xpath, NULL, cib_xpath|cib_sync_call); free(xpath); - xpath = crm_strdup_printf("//" PCMK__XE_NODE_STATE - "[@" PCMK_XA_UNAME "='%s']" - "/" PCMK__XE_TRANSIENT_ATTRIBUTES, - node); + xpath = pcmk__assert_asprintf("//" PCMK__XE_NODE_STATE + "[@" PCMK_XA_UNAME "='%s']" + "/" PCMK__XE_TRANSIENT_ATTRIBUTES, + node); cib->cmds->remove(cib, xpath, NULL, cib_xpath|cib_sync_call); free(xpath); } @@ -722,7 +725,7 @@ pcmk__inject_scheduler_input(pcmk_scheduler_t *scheduler, cib_t *cib, out->message(out, "inject-modify-node", "Failing", node); cib_node = pcmk__inject_node_state_change(cib, node, true); - crm_xml_add(cib_node, PCMK__XA_IN_CCM, PCMK_VALUE_FALSE); + pcmk__xe_set(cib_node, PCMK__XA_IN_CCM, PCMK_VALUE_FALSE); pcmk__assert(cib_node != NULL); rc = cib->cmds->modify(cib, PCMK_XE_STATUS, cib_node, cib_sync_call); diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c index eca11a0c7d2..9926008e8e6 100644 --- a/lib/pacemaker/pcmk_output.c +++ b/lib/pacemaker/pcmk_output.c @@ -1,5 +1,5 @@ /* - * Copyright 2019-2024 the Pacemaker project contributors + * Copyright 2019-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,6 +10,7 @@ #include #include #include +#include // pcmk_readable_score() #include #include #include // stonith__* @@ -26,15 +27,17 @@ colocations_header(pcmk_resource_t *rsc, pcmk__colocation_t *cons, char *retval = NULL; if (cons->primary_role > pcmk_role_started) { - retval = crm_strdup_printf("%s (score=%s, %s role=%s, id=%s)", - rsc->id, pcmk_readable_score(cons->score), - (dependents? "needs" : "with"), - pcmk_role_text(cons->primary_role), - cons->id); + retval = pcmk__assert_asprintf("%s (score=%s, %s role=%s, id=%s)", + rsc->id, + pcmk_readable_score(cons->score), + (dependents? "needs" : "with"), + pcmk_role_text(cons->primary_role), + cons->id); } else { - retval = crm_strdup_printf("%s (score=%s, id=%s)", - rsc->id, pcmk_readable_score(cons->score), - cons->id); + retval = pcmk__assert_asprintf("%s (score=%s, id=%s)", + rsc->id, + pcmk_readable_score(cons->score), + cons->id); } return retval; } @@ -151,60 +154,60 @@ rsc_action_item(pcmk__output_t *out, va_list args) if (need_role && (origin == NULL)) { /* Starting and promoting a promotable clone instance */ - details = crm_strdup_printf("%s -> %s %s", - pcmk_role_text(rsc->priv->orig_role), - pcmk_role_text(rsc->priv->next_role), - pcmk__node_name(destination)); + details = pcmk__assert_asprintf("%s -> %s %s", + pcmk_role_text(rsc->priv->orig_role), + pcmk_role_text(rsc->priv->next_role), + pcmk__node_name(destination)); } else if (origin == NULL) { /* Starting a resource */ - details = crm_strdup_printf("%s", pcmk__node_name(destination)); + details = pcmk__assert_asprintf("%s", pcmk__node_name(destination)); } else if (need_role && (destination == NULL)) { /* Stopping a promotable clone instance */ - details = crm_strdup_printf("%s %s", - pcmk_role_text(rsc->priv->orig_role), - pcmk__node_name(origin)); + details = pcmk__assert_asprintf("%s %s", + pcmk_role_text(rsc->priv->orig_role), + pcmk__node_name(origin)); } else if (destination == NULL) { /* Stopping a resource */ - details = crm_strdup_printf("%s", pcmk__node_name(origin)); + details = pcmk__assert_asprintf("%s", pcmk__node_name(origin)); } else if (need_role && same_role && same_host) { /* Recovering, restarting or re-promoting a promotable clone instance */ - details = crm_strdup_printf("%s %s", - pcmk_role_text(rsc->priv->orig_role), - pcmk__node_name(origin)); + details = pcmk__assert_asprintf("%s %s", + pcmk_role_text(rsc->priv->orig_role), + pcmk__node_name(origin)); } else if (same_role && same_host) { /* Recovering or Restarting a normal resource */ - details = crm_strdup_printf("%s", pcmk__node_name(origin)); + details = pcmk__assert_asprintf("%s", pcmk__node_name(origin)); } else if (need_role && same_role) { /* Moving a promotable clone instance */ - details = crm_strdup_printf("%s -> %s %s", pcmk__node_name(origin), - pcmk__node_name(destination), - pcmk_role_text(rsc->priv->orig_role)); + details = pcmk__assert_asprintf("%s -> %s %s", pcmk__node_name(origin), + pcmk__node_name(destination), + pcmk_role_text(rsc->priv->orig_role)); } else if (same_role) { /* Moving a normal resource */ - details = crm_strdup_printf("%s -> %s", pcmk__node_name(origin), - pcmk__node_name(destination)); + details = pcmk__assert_asprintf("%s -> %s", pcmk__node_name(origin), + pcmk__node_name(destination)); } else if (same_host) { /* Promoting or demoting a promotable clone instance */ - details = crm_strdup_printf("%s -> %s %s", - pcmk_role_text(rsc->priv->orig_role), - pcmk_role_text(rsc->priv->next_role), - pcmk__node_name(origin)); + details = pcmk__assert_asprintf("%s -> %s %s", + pcmk_role_text(rsc->priv->orig_role), + pcmk_role_text(rsc->priv->next_role), + pcmk__node_name(origin)); } else { /* Moving and promoting/demoting */ - details = crm_strdup_printf("%s %s -> %s %s", - pcmk_role_text(rsc->priv->orig_role), - pcmk__node_name(origin), - pcmk_role_text(rsc->priv->next_role), - pcmk__node_name(destination)); + details = pcmk__assert_asprintf("%s %s -> %s %s", + pcmk_role_text(rsc->priv->orig_role), + pcmk__node_name(origin), + pcmk_role_text(rsc->priv->next_role), + pcmk__node_name(destination)); } len = strlen(details); @@ -213,13 +216,13 @@ rsc_action_item(pcmk__output_t *out, va_list args) } if ((source->reason != NULL) - && !pcmk_is_set(action->flags, pcmk__action_runnable)) { - reason = crm_strdup_printf("due to %s (blocked)", source->reason); + && !pcmk__is_set(action->flags, pcmk__action_runnable)) { + reason = pcmk__assert_asprintf("due to %s (blocked)", source->reason); } else if (source->reason) { - reason = crm_strdup_printf("due to %s", source->reason); + reason = pcmk__assert_asprintf("due to %s", source->reason); - } else if (!pcmk_is_set(action->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(action->flags, pcmk__action_runnable)) { reason = strdup("blocked"); } @@ -292,7 +295,7 @@ rsc_action_item_xml(pcmk__output_t *out, va_list args) } else if (origin == NULL) { /* Starting a resource */ - crm_xml_add(xml, PCMK_XA_NODE, destination->priv->name); + pcmk__xe_set(xml, PCMK_XA_NODE, destination->priv->name); } else if (need_role && (destination == NULL)) { /* Stopping a promotable clone instance */ @@ -304,7 +307,7 @@ rsc_action_item_xml(pcmk__output_t *out, va_list args) } else if (destination == NULL) { /* Stopping a resource */ - crm_xml_add(xml, PCMK_XA_NODE, origin->priv->name); + pcmk__xe_set(xml, PCMK_XA_NODE, origin->priv->name); } else if (need_role && same_role && same_host) { /* Recovering, restarting or re-promoting a promotable clone instance */ @@ -316,7 +319,7 @@ rsc_action_item_xml(pcmk__output_t *out, va_list args) } else if (same_role && same_host) { /* Recovering or Restarting a normal resource */ - crm_xml_add(xml, PCMK_XA_SOURCE, origin->priv->name); + pcmk__xe_set(xml, PCMK_XA_SOURCE, origin->priv->name); } else if (need_role && same_role) { /* Moving a promotable clone instance */ @@ -357,16 +360,16 @@ rsc_action_item_xml(pcmk__output_t *out, va_list args) } if ((source->reason != NULL) - && !pcmk_is_set(action->flags, pcmk__action_runnable)) { + && !pcmk__is_set(action->flags, pcmk__action_runnable)) { pcmk__xe_set_props(xml, PCMK_XA_REASON, source->reason, PCMK_XA_BLOCKED, PCMK_VALUE_TRUE, NULL); } else if (source->reason != NULL) { - crm_xml_add(xml, PCMK_XA_REASON, source->reason); + pcmk__xe_set(xml, PCMK_XA_REASON, source->reason); - } else if (!pcmk_is_set(action->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(action->flags, pcmk__action_runnable)) { pcmk__xe_set_bool_attr(xml, PCMK_XA_BLOCKED, true); } @@ -382,7 +385,7 @@ rsc_is_colocated_with_list(pcmk__output_t *out, va_list args) { int rc = pcmk_rc_no_output; - if (pcmk_is_set(rsc->flags, pcmk__rsc_detect_loop)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_detect_loop)) { return rc; } @@ -399,7 +402,7 @@ rsc_is_colocated_with_list(pcmk__output_t *out, va_list args) { PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Resources %s is colocated with", rsc->id); - if (pcmk_is_set(cons->primary->flags, pcmk__rsc_detect_loop)) { + if (pcmk__is_set(cons->primary->flags, pcmk__rsc_detect_loop)) { out->list_item(out, NULL, "%s (id=%s - loop)", cons->primary->id, cons->id); continue; @@ -433,7 +436,7 @@ rsc_is_colocated_with_list_xml(pcmk__output_t *out, va_list args) { int rc = pcmk_rc_no_output; - if (pcmk_is_set(rsc->flags, pcmk__rsc_detect_loop)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_detect_loop)) { return rc; } @@ -446,7 +449,7 @@ rsc_is_colocated_with_list_xml(pcmk__output_t *out, va_list args) { lpc != NULL; lpc = lpc->next) { pcmk__colocation_t *cons = (pcmk__colocation_t *) lpc->data; - if (pcmk_is_set(cons->primary->flags, pcmk__rsc_detect_loop)) { + if (pcmk__is_set(cons->primary->flags, pcmk__rsc_detect_loop)) { colocations_xml_node(out, cons->primary, cons); continue; } @@ -471,7 +474,7 @@ rscs_colocated_with_list(pcmk__output_t *out, va_list args) { int rc = pcmk_rc_no_output; - if (pcmk_is_set(rsc->flags, pcmk__rsc_detect_loop)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_detect_loop)) { return rc; } @@ -488,7 +491,7 @@ rscs_colocated_with_list(pcmk__output_t *out, va_list args) { PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Resources colocated with %s", rsc->id); - if (pcmk_is_set(cons->dependent->flags, pcmk__rsc_detect_loop)) { + if (pcmk__is_set(cons->dependent->flags, pcmk__rsc_detect_loop)) { out->list_item(out, NULL, "%s (id=%s - loop)", cons->dependent->id, cons->id); continue; @@ -522,7 +525,7 @@ rscs_colocated_with_list_xml(pcmk__output_t *out, va_list args) { int rc = pcmk_rc_no_output; - if (pcmk_is_set(rsc->flags, pcmk__rsc_detect_loop)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_detect_loop)) { return rc; } @@ -535,7 +538,7 @@ rscs_colocated_with_list_xml(pcmk__output_t *out, va_list args) { lpc != NULL; lpc = lpc->next) { pcmk__colocation_t *cons = (pcmk__colocation_t *) lpc->data; - if (pcmk_is_set(cons->dependent->flags, pcmk__rsc_detect_loop)) { + if (pcmk__is_set(cons->dependent->flags, pcmk__rsc_detect_loop)) { colocations_xml_node(out, cons->dependent, cons); continue; } @@ -777,9 +780,9 @@ pacemakerd_health_html(pcmk__output_t *out, va_list args) |crm_time_log_with_timezone); } - msg = crm_strdup_printf("Status of %s: '%s' (last updated %s)", - sys_from, state_s, - pcmk__s(last_updated_s, "at unknown time")); + msg = pcmk__assert_asprintf("Status of %s: '%s' (last updated %s)", + sys_from, state_s, + pcmk__s(last_updated_s, "at unknown time")); pcmk__output_create_html_node(out, "li", NULL, NULL, msg); free(msg); @@ -992,13 +995,14 @@ digests_text(pcmk__output_t *out, va_list args) const char *node_desc = "unknown node"; if (interval_ms != 0) { - action_desc = crm_strdup_printf("%ums-interval %s action", interval_ms, - ((task == NULL)? "unknown" : task)); + action_desc = pcmk__assert_asprintf("%ums-interval %s action", + interval_ms, + pcmk__s(task, "unknown")); } else if (pcmk__str_eq(task, PCMK_ACTION_MONITOR, pcmk__str_none)) { action_desc = strdup("probe action"); } else { - action_desc = crm_strdup_printf("%s action", - ((task == NULL)? "unknown" : task)); + action_desc = pcmk__assert_asprintf("%s action", + pcmk__s(task, "unknown")); } if ((rsc != NULL) && (rsc->id != NULL)) { rsc_desc = rsc->id; @@ -1038,8 +1042,8 @@ add_digest_xml(xmlNode *parent, const char *type, const char *digest, if (digest != NULL) { xmlNodePtr digest_xml = pcmk__xe_create(parent, PCMK_XE_DIGEST); - crm_xml_add(digest_xml, PCMK_XA_TYPE, pcmk__s(type, "unspecified")); - crm_xml_add(digest_xml, PCMK_XA_HASH, digest); + pcmk__xe_set(digest_xml, PCMK_XA_TYPE, pcmk__s(type, "unspecified")); + pcmk__xe_set(digest_xml, PCMK_XA_HASH, digest); pcmk__xml_copy(digest_xml, digest_source); } } @@ -1055,7 +1059,7 @@ digests_xml(pcmk__output_t *out, va_list args) guint interval_ms = va_arg(args, guint); const pcmk__op_digest_t *digests = va_arg(args, const pcmk__op_digest_t *); - char *interval_s = crm_strdup_printf("%ums", interval_ms); + char *interval_s = pcmk__assert_asprintf("%ums", interval_ms); xmlNode *xml = NULL; xml = pcmk__output_create_xml_node(out, PCMK_XE_DIGESTS, @@ -1081,13 +1085,14 @@ digests_xml(pcmk__output_t *out, va_list args) if ((current != NULL) && current->details->unclean) { \ /* It will be a pseudo op */ \ } else if (stop == NULL) { \ - crm_err("%s:%d: No stop action exists for %s", \ - __func__, lineno, rsc->id); \ + pcmk__err("%s:%d: No stop action exists for %s", \ + __func__, lineno, rsc->id); \ pcmk__assert(stop != NULL); \ - } else if (pcmk_is_set(stop->flags, pcmk__action_optional)) { \ - crm_err("%s:%d: Action %s is still optional", \ - __func__, lineno, stop->uuid); \ - pcmk__assert(!pcmk_is_set(stop->flags, pcmk__action_optional)); \ + } else if (pcmk__is_set(stop->flags, pcmk__action_optional)) { \ + pcmk__err("%s:%d: Action %s is still optional", \ + __func__, lineno, stop->uuid); \ + pcmk__assert(!pcmk__is_set(stop->flags, \ + pcmk__action_optional)); \ } \ } while (0) @@ -1112,9 +1117,9 @@ rsc_action_default(pcmk__output_t *out, va_list args) pcmk_action_t *demote = NULL; pcmk_action_t *reason_op = NULL; - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed) - || (current == NULL && next == NULL)) { - const bool managed = pcmk_is_set(rsc->flags, pcmk__rsc_managed); + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed) + || ((current == NULL) && (next == NULL))) { + const bool managed = pcmk__is_set(rsc->flags, pcmk__rsc_managed); pcmk__rsc_info(rsc, "Leave %s\t(%s%s)", rsc->id, pcmk_role_text(rsc->priv->orig_role), @@ -1133,7 +1138,7 @@ rsc_action_default(pcmk__output_t *out, va_list args) } if ((start == NULL) - || !pcmk_is_set(start->flags, pcmk__action_runnable)) { + || !pcmk__is_set(start->flags, pcmk__action_runnable)) { start_node = NULL; } else { start_node = current; @@ -1143,7 +1148,7 @@ rsc_action_default(pcmk__output_t *out, va_list args) if (possible_matches) { stop = possible_matches->data; g_list_free(possible_matches); - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_stop_unexpected)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_stop_unexpected)) { /* The resource is multiply active with PCMK_META_MULTIPLE_ACTIVE set to * PCMK_VALUE_STOP_UNEXPECTED, and not stopping on its current node, but * it should be stopping elsewhere. @@ -1183,19 +1188,19 @@ rsc_action_default(pcmk__output_t *out, va_list args) } if ((migrate_op != NULL) && (current != NULL) - && pcmk_is_set(migrate_op->flags, pcmk__action_runnable)) { + && pcmk__is_set(migrate_op->flags, pcmk__action_runnable)) { rc = out->message(out, "rsc-action-item", "Migrate", rsc, current, next, start, NULL); - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_reload)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_reload)) { rc = out->message(out, "rsc-action-item", "Reload", rsc, current, next, start, NULL); } else if ((start == NULL) - || pcmk_is_set(start->flags, pcmk__action_optional)) { + || pcmk__is_set(start->flags, pcmk__action_optional)) { if ((demote != NULL) && (promote != NULL) - && !pcmk_is_set(demote->flags, pcmk__action_optional) - && !pcmk_is_set(promote->flags, pcmk__action_optional)) { + && !pcmk__is_set(demote->flags, pcmk__action_optional) + && !pcmk__is_set(promote->flags, pcmk__action_optional)) { rc = out->message(out, "rsc-action-item", "Re-promote", rsc, current, next, promote, demote); } else { @@ -1204,7 +1209,7 @@ rsc_action_default(pcmk__output_t *out, va_list args) pcmk__node_name(next)); } - } else if (!pcmk_is_set(start->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(start->flags, pcmk__action_runnable)) { if ((stop == NULL) || (stop->reason == NULL)) { reason_op = start; } else { @@ -1215,13 +1220,13 @@ rsc_action_default(pcmk__output_t *out, va_list args) STOP_SANITY_ASSERT(__LINE__); } else if (moving && current) { - const bool failed = pcmk_is_set(rsc->flags, pcmk__rsc_failed); + const bool failed = pcmk__is_set(rsc->flags, pcmk__rsc_failed); rc = out->message(out, "rsc-action-item", (failed? "Recover" : "Move"), rsc, current, next, stop, NULL); - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { rc = out->message(out, "rsc-action-item", "Recover", rsc, current, NULL, stop, NULL); STOP_SANITY_ASSERT(__LINE__); @@ -1244,7 +1249,7 @@ rsc_action_default(pcmk__output_t *out, va_list args) if ((stop != NULL) && ((rsc->priv->next_role == pcmk_role_stopped) || ((start != NULL) - && !pcmk_is_set(start->flags, pcmk__action_runnable)))) { + && !pcmk__is_set(start->flags, pcmk__action_runnable)))) { key = stop_key(rsc); for (GList *iter = rsc->priv->active_nodes; @@ -1261,7 +1266,7 @@ rsc_action_default(pcmk__output_t *out, va_list args) } if (stop_op != NULL) { - if (pcmk_is_set(stop_op->flags, pcmk__action_runnable)) { + if (pcmk__is_set(stop_op->flags, pcmk__action_runnable)) { STOP_SANITY_ASSERT(__LINE__); } if (stop_op->reason != NULL) { @@ -1278,9 +1283,9 @@ rsc_action_default(pcmk__output_t *out, va_list args) free(key); } else if ((stop != NULL) - && pcmk_all_flags_set(rsc->flags, - pcmk__rsc_failed - |pcmk__rsc_stop_if_failed)) { + && pcmk__all_flags_set(rsc->flags, + pcmk__rsc_failed + |pcmk__rsc_stop_if_failed)) { /* 'stop' may be NULL if the failure was ignored */ rc = out->message(out, "rsc-action-item", "Recover", rsc, current, next, stop, start); @@ -1291,12 +1296,12 @@ rsc_action_default(pcmk__output_t *out, va_list args) stop, NULL); STOP_SANITY_ASSERT(__LINE__); - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_reload)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_reload)) { rc = out->message(out, "rsc-action-item", "Reload", rsc, current, next, start, NULL); } else if ((stop != NULL) - && !pcmk_is_set(stop->flags, pcmk__action_optional)) { + && !pcmk__is_set(stop->flags, pcmk__action_optional)) { rc = out->message(out, "rsc-action-item", "Restart", rsc, current, next, start, NULL); STOP_SANITY_ASSERT(__LINE__); @@ -1333,7 +1338,7 @@ node_action(pcmk__output_t *out, va_list args) } else if (reason) { out->list_item(out, NULL, "%s %s '%s'", task, node_name, reason); } else { - crm_notice(" * %s %s", task, node_name); + pcmk__notice(" * %s %s", task, node_name); } return pcmk_rc_ok; @@ -1356,7 +1361,7 @@ node_action_xml(pcmk__output_t *out, va_list args) PCMK_XA_REASON, reason, NULL); } else { - crm_notice(" * %s %s", task, node_name); + pcmk__notice(" * %s %s", task, node_name); } return pcmk_rc_ok; @@ -1394,7 +1399,7 @@ node_info_xml(pcmk__output_t *out, va_list args) bool have_quorum = (bool) va_arg(args, int); bool is_remote = (bool) va_arg(args, int); - char *id_s = crm_strdup_printf("%" PRIu32, node_id); + char *id_s = pcmk__assert_asprintf("%" PRIu32, node_id); pcmk__output_create_xml_node(out, PCMK_XE_NODE_INFO, PCMK_XA_NODEID, id_s, @@ -1452,7 +1457,7 @@ inject_cluster_action_xml(pcmk__output_t *out, va_list args) NULL); if (rsc) { - crm_xml_add(xml_node, PCMK_XA_ID, pcmk__xe_id(rsc)); + pcmk__xe_set(xml_node, PCMK_XA_ID, pcmk__xe_id(rsc)); } return pcmk_rc_ok; @@ -1610,11 +1615,11 @@ inject_modify_config_xml(pcmk__output_t *out, va_list args) node = pcmk__output_xml_create_parent(out, PCMK_XE_MODIFICATIONS, NULL); if (quorum) { - crm_xml_add(node, PCMK_XA_QUORUM, quorum); + pcmk__xe_set(node, PCMK_XA_QUORUM, quorum); } if (watchdog) { - crm_xml_add(node, PCMK_XA_WATCHDOG, watchdog); + pcmk__xe_set(node, PCMK_XA_WATCHDOG, watchdog); } pcmk__output_xml_pop_parent(out); @@ -1735,7 +1740,7 @@ inject_pseudo_action_xml(pcmk__output_t *out, va_list args) PCMK_XA_TASK, task, NULL); if (node) { - crm_xml_add(xml_node, PCMK_XA_NODE, node); + pcmk__xe_set(xml_node, PCMK_XA_NODE, node); } return pcmk_rc_ok; @@ -1791,7 +1796,7 @@ inject_rsc_action_xml(pcmk__output_t *out, va_list args) if (interval_ms) { char *interval_s = pcmk__itoa(interval_ms); - crm_xml_add(xml_node, PCMK_XA_INTERVAL, interval_s); + pcmk__xe_set(xml_node, PCMK_XA_INTERVAL, interval_s); free(interval_s); } @@ -1828,19 +1833,19 @@ pcmk__cluster_status_text(pcmk__output_t *out, va_list args) CHECK_RC(rc, out->message(out, "cluster-summary", scheduler, pcmkd_state, section_opts, show_opts)); - if (pcmk_is_set(section_opts, pcmk_section_nodes) && unames) { + if (pcmk__is_set(section_opts, pcmk_section_nodes) && unames) { CHECK_RC(rc, out->message(out, "node-list", scheduler->nodes, unames, resources, show_opts, rc == pcmk_rc_ok)); } /* Print resources section, if needed */ - if (pcmk_is_set(section_opts, pcmk_section_resources)) { + if (pcmk__is_set(section_opts, pcmk_section_resources)) { CHECK_RC(rc, out->message(out, "resource-list", scheduler, show_opts, true, unames, resources, rc == pcmk_rc_ok)); } /* print Node Attributes section if requested */ - if (pcmk_is_set(section_opts, pcmk_section_attributes)) { + if (pcmk__is_set(section_opts, pcmk_section_attributes)) { CHECK_RC(rc, out->message(out, "node-attribute-list", scheduler, show_opts, (rc == pcmk_rc_ok), unames, resources)); @@ -1849,15 +1854,15 @@ pcmk__cluster_status_text(pcmk__output_t *out, va_list args) /* If requested, print resource operations (which includes failcounts) * or just failcounts */ - if (pcmk_any_flags_set(section_opts, - pcmk_section_operations|pcmk_section_failcounts)) { + if (pcmk__any_flags_set(section_opts, + pcmk_section_operations|pcmk_section_failcounts)) { CHECK_RC(rc, out->message(out, "node-summary", scheduler, unames, resources, section_opts, show_opts, (rc == pcmk_rc_ok))); } /* If there were any failed actions, print them */ - if (pcmk_is_set(section_opts, pcmk_section_failures) + if (pcmk__is_set(section_opts, pcmk_section_failures) && (scheduler->priv->failed != NULL) && (scheduler->priv->failed->children != NULL)) { @@ -1866,7 +1871,7 @@ pcmk__cluster_status_text(pcmk__output_t *out, va_list args) } /* Print failed stonith actions */ - if (pcmk_is_set(section_opts, pcmk_section_fence_failed) && + if (pcmk__is_set(section_opts, pcmk_section_fence_failed) && fence_history != pcmk__fence_history_none) { if (history_rc == 0) { stonith_history_t *hp = NULL; @@ -1891,21 +1896,22 @@ pcmk__cluster_status_text(pcmk__output_t *out, va_list args) } /* Print tickets if requested */ - if (pcmk_is_set(section_opts, pcmk_section_tickets)) { + if (pcmk__is_set(section_opts, pcmk_section_tickets)) { CHECK_RC(rc, out->message(out, "ticket-list", scheduler->priv->ticket_constraints, (rc == pcmk_rc_ok), false, false)); } /* Print negative location constraints if requested */ - if (pcmk_is_set(section_opts, pcmk_section_bans)) { + if (pcmk__is_set(section_opts, pcmk_section_bans)) { CHECK_RC(rc, out->message(out, "ban-list", scheduler, prefix, resources, show_opts, rc == pcmk_rc_ok)); } /* Print stonith history */ - if (pcmk_any_flags_set(section_opts, pcmk_section_fencing_all) && - fence_history != pcmk__fence_history_none) { + if (pcmk__any_flags_set(section_opts, pcmk_section_fencing_all) + && (fence_history != pcmk__fence_history_none)) { + if (history_rc != 0) { if (!already_printed_failure) { PCMK__OUTPUT_SPACER_IF(out, rc == pcmk_rc_ok); @@ -1914,7 +1920,7 @@ pcmk__cluster_status_text(pcmk__output_t *out, va_list args) crm_exit_str(history_rc)); out->end_list(out); } - } else if (pcmk_is_set(section_opts, pcmk_section_fence_worked)) { + } else if (pcmk__is_set(section_opts, pcmk_section_fence_worked)) { stonith_history_t *hp = NULL; hp = stonith__first_matching_event(stonith_history, @@ -1925,7 +1931,7 @@ pcmk__cluster_status_text(pcmk__output_t *out, va_list args) section_opts, show_opts, rc == pcmk_rc_ok)); } - } else if (pcmk_is_set(section_opts, pcmk_section_fence_pending)) { + } else if (pcmk__is_set(section_opts, pcmk_section_fence_pending)) { stonith_history_t *hp = NULL; hp = stonith__first_matching_event(stonith_history, @@ -1965,13 +1971,13 @@ cluster_status_xml(pcmk__output_t *out, va_list args) show_opts); /*** NODES ***/ - if (pcmk_is_set(section_opts, pcmk_section_nodes)) { + if (pcmk__is_set(section_opts, pcmk_section_nodes)) { out->message(out, "node-list", scheduler->nodes, unames, resources, show_opts, false); } /* Print resources section, if needed */ - if (pcmk_is_set(section_opts, pcmk_section_resources)) { + if (pcmk__is_set(section_opts, pcmk_section_resources)) { /* XML output always displays full details. */ uint32_t full_show_opts = show_opts & ~pcmk_show_brief; @@ -1980,7 +1986,7 @@ cluster_status_xml(pcmk__output_t *out, va_list args) } /* print Node Attributes section if requested */ - if (pcmk_is_set(section_opts, pcmk_section_attributes)) { + if (pcmk__is_set(section_opts, pcmk_section_attributes)) { out->message(out, "node-attribute-list", scheduler, show_opts, false, unames, resources); } @@ -1988,14 +1994,14 @@ cluster_status_xml(pcmk__output_t *out, va_list args) /* If requested, print resource operations (which includes failcounts) * or just failcounts */ - if (pcmk_any_flags_set(section_opts, - pcmk_section_operations|pcmk_section_failcounts)) { + if (pcmk__any_flags_set(section_opts, + pcmk_section_operations|pcmk_section_failcounts)) { out->message(out, "node-summary", scheduler, unames, resources, section_opts, show_opts, false); } /* If there were any failed actions, print them */ - if (pcmk_is_set(section_opts, pcmk_section_failures) + if (pcmk__is_set(section_opts, pcmk_section_failures) && (scheduler->priv->failed != NULL) && (scheduler->priv->failed->children != NULL)) { @@ -2004,20 +2010,20 @@ cluster_status_xml(pcmk__output_t *out, va_list args) } /* Print stonith history */ - if (pcmk_is_set(section_opts, pcmk_section_fencing_all) && - fence_history != pcmk__fence_history_none) { + if (pcmk__is_set(section_opts, pcmk_section_fencing_all) + && (fence_history != pcmk__fence_history_none)) { out->message(out, "full-fencing-list", history_rc, stonith_history, unames, section_opts, show_opts, false); } /* Print tickets if requested */ - if (pcmk_is_set(section_opts, pcmk_section_tickets)) { + if (pcmk__is_set(section_opts, pcmk_section_tickets)) { out->message(out, "ticket-list", scheduler->priv->ticket_constraints, false, false, false); } /* Print negative location constraints if requested */ - if (pcmk_is_set(section_opts, pcmk_section_bans)) { + if (pcmk__is_set(section_opts, pcmk_section_bans)) { out->message(out, "ban-list", scheduler, prefix, resources, show_opts, false); } @@ -2049,19 +2055,19 @@ cluster_status_html(pcmk__output_t *out, va_list args) show_opts); /*** NODE LIST ***/ - if (pcmk_is_set(section_opts, pcmk_section_nodes) && unames) { + if (pcmk__is_set(section_opts, pcmk_section_nodes) && (unames != NULL)) { out->message(out, "node-list", scheduler->nodes, unames, resources, show_opts, false); } /* Print resources section, if needed */ - if (pcmk_is_set(section_opts, pcmk_section_resources)) { + if (pcmk__is_set(section_opts, pcmk_section_resources)) { out->message(out, "resource-list", scheduler, show_opts, true, unames, resources, false); } /* print Node Attributes section if requested */ - if (pcmk_is_set(section_opts, pcmk_section_attributes)) { + if (pcmk__is_set(section_opts, pcmk_section_attributes)) { out->message(out, "node-attribute-list", scheduler, show_opts, false, unames, resources); } @@ -2069,14 +2075,14 @@ cluster_status_html(pcmk__output_t *out, va_list args) /* If requested, print resource operations (which includes failcounts) * or just failcounts */ - if (pcmk_any_flags_set(section_opts, - pcmk_section_operations|pcmk_section_failcounts)) { + if (pcmk__any_flags_set(section_opts, + pcmk_section_operations|pcmk_section_failcounts)) { out->message(out, "node-summary", scheduler, unames, resources, section_opts, show_opts, false); } /* If there were any failed actions, print them */ - if (pcmk_is_set(section_opts, pcmk_section_failures) + if (pcmk__is_set(section_opts, pcmk_section_failures) && (scheduler->priv->failed != NULL) && (scheduler->priv->failed->children != NULL)) { @@ -2085,8 +2091,9 @@ cluster_status_html(pcmk__output_t *out, va_list args) } /* Print failed stonith actions */ - if (pcmk_is_set(section_opts, pcmk_section_fence_failed) && - fence_history != pcmk__fence_history_none) { + if (pcmk__is_set(section_opts, pcmk_section_fence_failed) + && (fence_history != pcmk__fence_history_none)) { + if (history_rc == 0) { stonith_history_t *hp = NULL; @@ -2106,8 +2113,9 @@ cluster_status_html(pcmk__output_t *out, va_list args) } /* Print stonith history */ - if (pcmk_any_flags_set(section_opts, pcmk_section_fencing_all) && - fence_history != pcmk__fence_history_none) { + if (pcmk__any_flags_set(section_opts, pcmk_section_fencing_all) + && (fence_history != pcmk__fence_history_none)) { + if (history_rc != 0) { if (!already_printed_failure) { out->begin_list(out, NULL, NULL, "Failed Fencing Actions"); @@ -2115,7 +2123,7 @@ cluster_status_html(pcmk__output_t *out, va_list args) crm_exit_str(history_rc)); out->end_list(out); } - } else if (pcmk_is_set(section_opts, pcmk_section_fence_worked)) { + } else if (pcmk__is_set(section_opts, pcmk_section_fence_worked)) { stonith_history_t *hp = NULL; hp = stonith__first_matching_event(stonith_history, @@ -2125,7 +2133,7 @@ cluster_status_html(pcmk__output_t *out, va_list args) out->message(out, "fencing-list", hp, unames, section_opts, show_opts, false); } - } else if (pcmk_is_set(section_opts, pcmk_section_fence_pending)) { + } else if (pcmk__is_set(section_opts, pcmk_section_fence_pending)) { stonith_history_t *hp = NULL; hp = stonith__first_matching_event(stonith_history, @@ -2139,13 +2147,13 @@ cluster_status_html(pcmk__output_t *out, va_list args) } /* Print tickets if requested */ - if (pcmk_is_set(section_opts, pcmk_section_tickets)) { + if (pcmk__is_set(section_opts, pcmk_section_tickets)) { out->message(out, "ticket-list", scheduler->priv->ticket_constraints, false, false, false); } /* Print negative location constraints if requested */ - if (pcmk_is_set(section_opts, pcmk_section_bans)) { + if (pcmk__is_set(section_opts, pcmk_section_bans)) { out->message(out, "ban-list", scheduler, prefix, resources, show_opts, false); } @@ -2249,15 +2257,15 @@ attribute_xml(pcmk__output_t *out, va_list args) NULL); if (!pcmk__str_empty(scope)) { - crm_xml_add(node, PCMK_XA_SCOPE, scope); + pcmk__xe_set(node, PCMK_XA_SCOPE, scope); } if (!pcmk__str_empty(instance)) { - crm_xml_add(node, PCMK_XA_ID, instance); + pcmk__xe_set(node, PCMK_XA_ID, instance); } if (!pcmk__str_empty(host)) { - crm_xml_add(node, PCMK_XA_HOST, host); + pcmk__xe_set(node, PCMK_XA_HOST, host); } return pcmk_rc_ok; @@ -2496,7 +2504,7 @@ static int add_ticket_element_with_constraints(xmlNode *node, void *userdata) { pcmk__output_t *out = (pcmk__output_t *) userdata; - const char *ticket_id = crm_element_value(node, PCMK_XA_TICKET); + const char *ticket_id = pcmk__xe_get(node, PCMK_XA_TICKET); pcmk__output_xml_create_parent(out, PCMK_XE_TICKET, PCMK_XA_ID, ticket_id, NULL); @@ -2514,7 +2522,7 @@ static int add_resource_element(xmlNode *node, void *userdata) { pcmk__output_t *out = (pcmk__output_t *) userdata; - const char *rsc = crm_element_value(node, PCMK_XA_RSC); + const char *rsc = pcmk__xe_get(node, PCMK_XA_RSC); pcmk__output_create_xml_node(out, PCMK_XE_RESOURCE, PCMK_XA_ID, rsc, NULL); diff --git a/lib/pacemaker/pcmk_resource.c b/lib/pacemaker/pcmk_resource.c index f0dc928b78a..9071f4ba3c1 100644 --- a/lib/pacemaker/pcmk_resource.c +++ b/lib/pacemaker/pcmk_resource.c @@ -41,9 +41,9 @@ best_op(const pcmk_resource_t *rsc, const pcmk_node_t *node) const char *best_digest = NULL; // Find node's resource history - xpath = crm_strdup_printf(XPATH_OP_HISTORY, node->priv->name, rsc->id); + xpath = pcmk__assert_asprintf(XPATH_OP_HISTORY, node->priv->name, rsc->id); history = pcmk__xpath_find_one(rsc->priv->scheduler->input->doc, xpath, - LOG_NEVER); + PCMK__LOG_NEVER); free(xpath); // Examine each history entry @@ -53,16 +53,16 @@ best_op(const pcmk_resource_t *rsc, const pcmk_node_t *node) lrm_rsc_op != NULL; lrm_rsc_op = pcmk__xe_next(lrm_rsc_op, PCMK__XE_LRM_RSC_OP)) { - const char *digest = crm_element_value(lrm_rsc_op, - PCMK__XA_OP_RESTART_DIGEST); + const char *digest = pcmk__xe_get(lrm_rsc_op, + PCMK__XA_OP_RESTART_DIGEST); guint interval_ms = 0; - const char *task = crm_element_value(lrm_rsc_op, PCMK_XA_OPERATION); + const char *task = pcmk__xe_get(lrm_rsc_op, PCMK_XA_OPERATION); bool effective_op = false; bool failure = pcmk__ends_with(pcmk__xe_id(lrm_rsc_op), "_last_failure_0"); - crm_element_value_ms(lrm_rsc_op, PCMK_META_INTERVAL, &interval_ms); + pcmk__xe_get_guint(lrm_rsc_op, PCMK_META_INTERVAL, &interval_ms); effective_op = interval_ms == 0 && pcmk__strcase_any_of(task, PCMK_ACTION_MONITOR, PCMK_ACTION_START, @@ -137,7 +137,7 @@ pcmk__resource_delete(cib_t *cib, uint32_t cib_opts, const char *rsc_id, } msg_data = pcmk__xe_create(NULL, rsc_type); - crm_xml_add(msg_data, PCMK_XA_ID, rsc_id); + pcmk__xe_set(msg_data, PCMK_XA_ID, rsc_id); rc = cib->cmds->remove(cib, PCMK_XE_RESOURCES, msg_data, cib_opts); rc = pcmk_legacy2rc(rc); @@ -218,8 +218,8 @@ pcmk__resource_digests(pcmk__output_t *out, pcmk_resource_t *rsc, // Generate an operation key if (xml_op != NULL) { - task = crm_element_value(xml_op, PCMK_XA_OPERATION); - crm_element_value_ms(xml_op, PCMK_META_INTERVAL, &interval_ms); + task = pcmk__xe_get(xml_op, PCMK_XA_OPERATION); + pcmk__xe_get_guint(xml_op, PCMK_META_INTERVAL, &interval_ms); } if (task == NULL) { // Assume start if no history is available task = PCMK_ACTION_START; diff --git a/lib/pacemaker/pcmk_result_code.c b/lib/pacemaker/pcmk_result_code.c index b45eee18d51..23d38bf81c9 100644 --- a/lib/pacemaker/pcmk_result_code.c +++ b/lib/pacemaker/pcmk_result_code.c @@ -1,5 +1,5 @@ /* - * Copyright 2022 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -47,11 +47,11 @@ pcmk__show_result_code(pcmk__output_t *out, int code, } // out->quiet controls whether the code is shown (if quiet is supported) - out->quiet = !pcmk_is_set(flags, pcmk_rc_disp_code); + out->quiet = !pcmk__is_set(flags, pcmk_rc_disp_code); out->message(out, "result-code", code, - pcmk_is_set(flags, pcmk_rc_disp_name)? name : NULL, - pcmk_is_set(flags, pcmk_rc_disp_desc)? desc : NULL); + pcmk__is_set(flags, pcmk_rc_disp_name)? name : NULL, + pcmk__is_set(flags, pcmk_rc_disp_desc)? desc : NULL); out->quiet = quiet_orig; return rc; @@ -133,11 +133,11 @@ pcmk__list_result_codes(pcmk__output_t *out, enum pcmk_result_type type, } // out->quiet controls whether the code is shown (if quiet is supported) - out->quiet = !pcmk_is_set(flags, pcmk_rc_disp_code); + out->quiet = !pcmk__is_set(flags, pcmk_rc_disp_code); out->message(out, "result-code", code, - pcmk_is_set(flags, pcmk_rc_disp_name)? name : NULL, - pcmk_is_set(flags, pcmk_rc_disp_desc)? desc : NULL); + pcmk__is_set(flags, pcmk_rc_disp_name)? name : NULL, + pcmk__is_set(flags, pcmk_rc_disp_desc)? desc : NULL); out->quiet = quiet_orig; code++; diff --git a/lib/pacemaker/pcmk_rule.c b/lib/pacemaker/pcmk_rule.c index e5c14a1be30..39bd2d97063 100644 --- a/lib/pacemaker/pcmk_rule.c +++ b/lib/pacemaker/pcmk_rule.c @@ -57,7 +57,7 @@ eval_rule(pcmk_scheduler_t *scheduler, const char *rule_id, const char **error) * We do this in steps to provide better error messages. First, check that * there's any rule with the given ID. */ - xpath = crm_strdup_printf(XPATH_NODE_RULE, rule_id); + xpath = pcmk__assert_asprintf(XPATH_NODE_RULE, rule_id); xpath_obj = pcmk__xpath_search(cib_constraints->doc, xpath); num_results = pcmk__xpath_num_results(xpath_obj); @@ -76,7 +76,9 @@ eval_rule(pcmk_scheduler_t *scheduler, const char *rule_id, const char **error) } /* Next, make sure it has exactly one date_expression. */ - xpath = crm_strdup_printf(XPATH_NODE_RULE "//date_expression", rule_id); + xpath = pcmk__assert_asprintf(XPATH_NODE_RULE "//" + PCMK_XE_DATE_EXPRESSION, + rule_id); xpath_obj = pcmk__xpath_search(cib_constraints->doc, xpath); num_results = pcmk__xpath_num_results(xpath_obj); @@ -93,11 +95,11 @@ eval_rule(pcmk_scheduler_t *scheduler, const char *rule_id, const char **error) } /* Then, check that it's something we actually support. */ - xpath = crm_strdup_printf(XPATH_NODE_RULE - "//" PCMK_XE_DATE_EXPRESSION - "[@" PCMK_XA_OPERATION - "!='" PCMK_VALUE_DATE_SPEC "']", - rule_id); + xpath = pcmk__assert_asprintf(XPATH_NODE_RULE + "//" PCMK_XE_DATE_EXPRESSION + "[@" PCMK_XA_OPERATION + "!='" PCMK_VALUE_DATE_SPEC "']", + rule_id); xpath_obj = pcmk__xpath_search(cib_constraints->doc, xpath); num_results = pcmk__xpath_num_results(xpath_obj); @@ -106,13 +108,13 @@ eval_rule(pcmk_scheduler_t *scheduler, const char *rule_id, const char **error) if (num_results == 0) { xmlXPathFreeObject(xpath_obj); - xpath = crm_strdup_printf(XPATH_NODE_RULE - "//" PCMK_XE_DATE_EXPRESSION - "[@" PCMK_XA_OPERATION - "='" PCMK_VALUE_DATE_SPEC "' " - "and " PCMK_XE_DATE_SPEC - "/@" PCMK_XA_YEARS "]", - rule_id); + xpath = pcmk__assert_asprintf(XPATH_NODE_RULE + "//" PCMK_XE_DATE_EXPRESSION + "[@" PCMK_XA_OPERATION + "='" PCMK_VALUE_DATE_SPEC "' " + "and " PCMK_XE_DATE_SPEC + "/@" PCMK_XA_YEARS "]", + rule_id); xpath_obj = pcmk__xpath_search(cib_constraints->doc, xpath); num_results = pcmk__xpath_num_results(xpath_obj); diff --git a/lib/pacemaker/pcmk_sched_actions.c b/lib/pacemaker/pcmk_sched_actions.c index c7b7c62fbcf..39ef6d68eaa 100644 --- a/lib/pacemaker/pcmk_sched_actions.c +++ b/lib/pacemaker/pcmk_sched_actions.c @@ -17,6 +17,7 @@ #include // xmlNode #include +#include // crm_meta_value() #include #include #include "libpacemaker_private.h" @@ -54,7 +55,7 @@ action_flags_for_ordering(pcmk_action_t *action, const pcmk_node_t *node) /* Otherwise (i.e., for clone resource actions on a specific node), first * remember whether the non-node-specific action is runnable. */ - runnable = pcmk_is_set(flags, pcmk__action_runnable); + runnable = pcmk__is_set(flags, pcmk__action_runnable); // Then recheck the resource method with the node flags = action->rsc->priv->cmds->action_flags(action, node); @@ -67,7 +68,7 @@ action_flags_for_ordering(pcmk_action_t *action, const pcmk_node_t *node) * function shouldn't be used for other types of constraints without * changes. Not very satisfying, but it's logical and appears to work well. */ - if (runnable && !pcmk_is_set(flags, pcmk__action_runnable)) { + if (runnable && !pcmk__is_set(flags, pcmk__action_runnable)) { pcmk__set_raw_action_flags(flags, action->rsc->id, pcmk__action_runnable); } @@ -136,7 +137,7 @@ action_uuid_for_ordering(const char *first_uuid, case pcmk__action_fence: break; default: - crm_err("Unknown action '%s' in ordering", first_task_str); + pcmk__err("Unknown action '%s' in ordering", first_task_str); break; } @@ -144,7 +145,7 @@ action_uuid_for_ordering(const char *first_uuid, /* If a clone or bundle has notifications enabled, the ordering will be * relative to when notifications have been sent for the remapped task. */ - if (pcmk_is_set(first_rsc->flags, pcmk__rsc_notify) + if (pcmk__is_set(first_rsc->flags, pcmk__rsc_notify) && (pcmk__is_clone(first_rsc) || pcmk__is_bundled(first_rsc))) { uuid = pcmk__notify_key(rid, "confirmed-post", pcmk__action_text(remapped_task)); @@ -194,8 +195,9 @@ action_for_ordering(pcmk_action_t *action) result = find_first_action(rsc->priv->actions, uuid, NULL, NULL); if (result == NULL) { - crm_warn("Not remapping %s to %s because %s does not have " - "remapped action", action->uuid, uuid, rsc->id); + pcmk__warn("Not remapping %s to %s because %s does not have " + "remapped action", + action->uuid, uuid, rsc->id); result = action; } free(uuid); @@ -259,7 +261,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, */ pcmk_node_t *node = then->node; - if (pcmk_is_set(order->flags, pcmk__ar_first_implies_same_node_then)) { + if (pcmk__is_set(order->flags, pcmk__ar_first_implies_same_node_then)) { /* For unfencing, only instances of 'then' on the same node as 'first' * (the unfencing operation) should restart, so reset node to * first->node, at which point this case is handled like a normal @@ -276,14 +278,14 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, first->uuid, then->uuid, pcmk__node_name(node)); } - if (pcmk_is_set(order->flags, pcmk__ar_first_implies_then)) { + if (pcmk__is_set(order->flags, pcmk__ar_first_implies_then)) { if (then->rsc != NULL) { changed |= update(then->rsc, first, then, node, first_flags & pcmk__action_optional, pcmk__action_optional, pcmk__ar_first_implies_then, scheduler); - } else if (!pcmk_is_set(first_flags, pcmk__action_optional) - && pcmk_is_set(then->flags, pcmk__action_optional)) { + } else if (!pcmk__is_set(first_flags, pcmk__action_optional) + && pcmk__is_set(then->flags, pcmk__action_optional)) { pcmk__clear_action_flags(then, pcmk__action_optional); pcmk__set_updated_flags(changed, first, pcmk__updated_then); } @@ -293,7 +295,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_intermediate_stop) + if (pcmk__is_set(order->flags, pcmk__ar_intermediate_stop) && (then->rsc != NULL)) { enum pcmk__action_flags restart = pcmk__action_optional |pcmk__action_runnable; @@ -306,13 +308,13 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_then_implies_first)) { + if (pcmk__is_set(order->flags, pcmk__ar_then_implies_first)) { if (first->rsc != NULL) { changed |= update(first->rsc, first, then, node, first_flags, pcmk__action_optional, pcmk__ar_then_implies_first, scheduler); - } else if (!pcmk_is_set(first_flags, pcmk__action_optional) - && pcmk_is_set(first->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(first_flags, pcmk__action_optional) + && pcmk__is_set(first->flags, pcmk__action_runnable)) { pcmk__clear_action_flags(first, pcmk__action_runnable); pcmk__set_updated_flags(changed, first, pcmk__updated_first); } @@ -322,7 +324,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_promoted_then_implies_first)) { + if (pcmk__is_set(order->flags, pcmk__ar_promoted_then_implies_first)) { if (then->rsc != NULL) { changed |= update(then->rsc, first, then, node, first_flags & pcmk__action_optional, @@ -336,13 +338,13 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_min_runnable)) { + if (pcmk__is_set(order->flags, pcmk__ar_min_runnable)) { if (then->rsc != NULL) { changed |= update(then->rsc, first, then, node, first_flags, pcmk__action_runnable, pcmk__ar_min_runnable, scheduler); - } else if (pcmk_is_set(first_flags, pcmk__action_runnable)) { + } else if (pcmk__is_set(first_flags, pcmk__action_runnable)) { // We have another runnable instance of "first" then->runnable_before++; @@ -350,7 +352,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, * "before" instances to be runnable, and they now are. */ if ((then->runnable_before >= then->required_runnable_before) - && !pcmk_is_set(then->flags, pcmk__action_runnable)) { + && !pcmk__is_set(then->flags, pcmk__action_runnable)) { pcmk__set_action_flags(then, pcmk__action_runnable); pcmk__set_updated_flags(changed, first, pcmk__updated_then); @@ -361,10 +363,10 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_nested_remote_probe) + if (pcmk__is_set(order->flags, pcmk__ar_nested_remote_probe) && (then->rsc != NULL)) { - if (!pcmk_is_set(first_flags, pcmk__action_runnable) + if (!pcmk__is_set(first_flags, pcmk__action_runnable) && (first->rsc != NULL) && (first->rsc->priv->active_nodes != NULL)) { @@ -383,14 +385,14 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_unrunnable_first_blocks)) { + if (pcmk__is_set(order->flags, pcmk__ar_unrunnable_first_blocks)) { if (then->rsc != NULL) { changed |= update(then->rsc, first, then, node, first_flags, pcmk__action_runnable, pcmk__ar_unrunnable_first_blocks, scheduler); - } else if (!pcmk_is_set(first_flags, pcmk__action_runnable) - && pcmk_is_set(then->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(first_flags, pcmk__action_runnable) + && pcmk__is_set(then->flags, pcmk__action_runnable)) { pcmk__clear_action_flags(then, pcmk__action_runnable); pcmk__set_updated_flags(changed, first, pcmk__updated_then); @@ -401,7 +403,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_unmigratable_then_blocks)) { + if (pcmk__is_set(order->flags, pcmk__ar_unmigratable_then_blocks)) { if (then->rsc != NULL) { changed |= update(then->rsc, first, then, node, first_flags, pcmk__action_optional, @@ -414,7 +416,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_first_else_then)) { + if (pcmk__is_set(order->flags, pcmk__ar_first_else_then)) { if (then->rsc != NULL) { changed |= update(then->rsc, first, then, node, first_flags, pcmk__action_optional, pcmk__ar_first_else_then, @@ -426,7 +428,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_ordered)) { + if (pcmk__is_set(order->flags, pcmk__ar_ordered)) { if (then->rsc != NULL) { changed |= update(then->rsc, first, then, node, first_flags, pcmk__action_runnable, pcmk__ar_ordered, @@ -437,7 +439,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(order->flags, pcmk__ar_asymmetric)) { + if (pcmk__is_set(order->flags, pcmk__ar_asymmetric)) { if (then->rsc != NULL) { changed |= update(then->rsc, first, then, node, first_flags, pcmk__action_runnable, pcmk__ar_asymmetric, @@ -448,9 +450,9 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, (changed? "changed" : "unchanged")); } - if (pcmk_is_set(first->flags, pcmk__action_runnable) - && pcmk_is_set(order->flags, pcmk__ar_first_implies_then_graphed) - && !pcmk_is_set(first_flags, pcmk__action_optional)) { + if (pcmk__is_set(first->flags, pcmk__action_runnable) + && pcmk__is_set(order->flags, pcmk__ar_first_implies_then_graphed) + && !pcmk__is_set(first_flags, pcmk__action_optional)) { pcmk__rsc_trace(then->rsc, "%s will be in graph because %s is required", then->uuid, first->uuid); @@ -458,8 +460,8 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, // Don't bother marking 'then' as changed just for this } - if (pcmk_is_set(order->flags, pcmk__ar_then_implies_first_graphed) - && !pcmk_is_set(then_flags, pcmk__action_optional)) { + if (pcmk__is_set(order->flags, pcmk__ar_then_implies_first_graphed) + && !pcmk__is_set(then_flags, pcmk__action_optional)) { pcmk__rsc_trace(then->rsc, "%s will be in graph because %s is required", first->uuid, then->uuid); @@ -467,13 +469,14 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, // Don't bother marking 'first' as changed just for this } - if (pcmk_any_flags_set(order->flags, pcmk__ar_first_implies_then - |pcmk__ar_then_implies_first - |pcmk__ar_intermediate_stop) + if (pcmk__any_flags_set(order->flags, + pcmk__ar_first_implies_then + |pcmk__ar_then_implies_first + |pcmk__ar_intermediate_stop) && (first->rsc != NULL) - && !pcmk_is_set(first->rsc->flags, pcmk__rsc_managed) - && pcmk_is_set(first->rsc->flags, pcmk__rsc_blocked) - && !pcmk_is_set(first->flags, pcmk__action_runnable) + && !pcmk__is_set(first->rsc->flags, pcmk__rsc_managed) + && pcmk__is_set(first->rsc->flags, pcmk__rsc_blocked) + && !pcmk__is_set(first->flags, pcmk__action_runnable) && pcmk__str_eq(first->task, PCMK_ACTION_STOP, pcmk__str_none)) { /* @TODO This seems odd; why wouldn't an unrunnable "first" already @@ -482,7 +485,7 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, * "stop then stop" relations that would be good for checking any * changes. */ - if (pcmk_is_set(then->flags, pcmk__action_runnable)) { + if (pcmk__is_set(then->flags, pcmk__action_runnable)) { pcmk__clear_action_flags(then, pcmk__action_runnable); pcmk__set_updated_flags(changed, first, pcmk__updated_then); } @@ -499,13 +502,13 @@ update_action_for_ordering_flags(pcmk_action_t *first, pcmk_action_t *then, // Convenience macros for logging action properties #define action_type_str(flags) \ - (pcmk_is_set((flags), pcmk__action_pseudo)? "pseudo-action" : "action") + (pcmk__is_set((flags), pcmk__action_pseudo)? "pseudo-action" : "action") #define action_optional_str(flags) \ - (pcmk_is_set((flags), pcmk__action_optional)? "optional" : "required") + (pcmk__is_set((flags), pcmk__action_optional)? "optional" : "required") #define action_runnable_str(flags) \ - (pcmk_is_set((flags), pcmk__action_runnable)? "runnable" : "unrunnable") + (pcmk__is_set((flags), pcmk__action_runnable)? "runnable" : "unrunnable") #define action_node_str(a) \ (((a)->node == NULL)? "no node" : (a)->node->priv->name) @@ -577,7 +580,7 @@ pcmk__update_action_for_orderings(pcmk_action_t *then, } // Disable constraint if it only applies when on same node, but isn't - if (pcmk_is_set(other->flags, pcmk__ar_if_on_same_node) + if (pcmk__is_set(other->flags, pcmk__ar_if_on_same_node) && (first_node != NULL) && (then_node != NULL) && !pcmk__same_node(first_node, then_node)) { @@ -593,8 +596,8 @@ pcmk__update_action_for_orderings(pcmk_action_t *then, pcmk__clear_updated_flags(changed, then, pcmk__updated_first); if ((first->rsc != NULL) - && pcmk_is_set(other->flags, pcmk__ar_then_cancels_first) - && !pcmk_is_set(then->flags, pcmk__action_optional)) { + && pcmk__is_set(other->flags, pcmk__ar_then_cancels_first) + && !pcmk__is_set(then->flags, pcmk__action_optional)) { /* 'then' is required, so we must abandon 'first' * (e.g. a required stop cancels any agent reload). @@ -650,9 +653,10 @@ pcmk__update_action_for_orderings(pcmk_action_t *then, } - if (pcmk_is_set(changed, pcmk__updated_first)) { - crm_trace("Re-processing %s and its 'after' actions " - "because it changed", first->uuid); + if (pcmk__is_set(changed, pcmk__updated_first)) { + pcmk__trace("Re-processing %s and its 'after' actions " + "because it changed", + first->uuid); for (GList *lpc2 = first->actions_after; lpc2 != NULL; lpc2 = lpc2->next) { pcmk__related_action_t *other = lpc2->data; @@ -671,11 +675,12 @@ pcmk__update_action_for_orderings(pcmk_action_t *then, } } - if (pcmk_is_set(changed, pcmk__updated_then)) { - crm_trace("Re-processing %s and its 'after' actions because it changed", - then->uuid); - if (pcmk_is_set(last_flags, pcmk__action_runnable) - && !pcmk_is_set(then->flags, pcmk__action_runnable)) { + if (pcmk__is_set(changed, pcmk__updated_then)) { + pcmk__trace("Re-processing %s and its 'after' actions because it " + "changed", + then->uuid); + if (pcmk__is_set(last_flags, pcmk__action_runnable) + && !pcmk__is_set(then->flags, pcmk__action_runnable)) { pcmk__block_colocation_dependents(then); } pcmk__update_action_for_orderings(then, scheduler); @@ -702,7 +707,7 @@ is_primitive_action(const pcmk_action_t *action) * \param[in] reason Action that is the reason why flag is being cleared */ #define clear_action_flag_because(action, flag, reason) do { \ - if (pcmk_is_set((action)->flags, (flag))) { \ + if (pcmk__is_set((action)->flags, (flag))) { \ pcmk__clear_action_flags(action, flag); \ if ((action)->rsc != (reason)->rsc) { \ char *reason_text = pe__action2reason((reason), (flag)); \ @@ -729,12 +734,12 @@ handle_asymmetric_ordering(const pcmk_action_t *first, pcmk_action_t *then) * asymmetric ordering. */ if ((then->rsc == NULL) - || pcmk_is_set(first->flags, pcmk__action_runnable)) { + || pcmk__is_set(first->flags, pcmk__action_runnable)) { return; } // Certain optional 'then' actions are unaffected by unrunnable 'first' - if (pcmk_is_set(then->flags, pcmk__action_optional)) { + if (pcmk__is_set(then->flags, pcmk__action_optional)) { enum rsc_role_e then_rsc_role; then_rsc_role = then->rsc->priv->fns->state(then->rsc, true); @@ -782,17 +787,17 @@ handle_restart_ordering(pcmk_action_t *first, pcmk_action_t *then, // We need to update the action in two cases: // ... if 'then' is required - if (pcmk_is_set(filter, pcmk__action_optional) - && !pcmk_is_set(then->flags, pcmk__action_optional)) { + if (pcmk__is_set(filter, pcmk__action_optional) + && !pcmk__is_set(then->flags, pcmk__action_optional)) { reason = "restart"; } /* ... if 'then' is unrunnable action on same resource (if a resource * should restart but can't start, we still want to stop) */ - if (pcmk_is_set(filter, pcmk__action_runnable) - && !pcmk_is_set(then->flags, pcmk__action_runnable) - && pcmk_is_set(then->rsc->flags, pcmk__rsc_managed) + if (pcmk__is_set(filter, pcmk__action_runnable) + && !pcmk__is_set(then->flags, pcmk__action_runnable) + && pcmk__is_set(then->rsc->flags, pcmk__rsc_managed) && (first->rsc == then->rsc)) { reason = "stop"; } @@ -805,23 +810,23 @@ handle_restart_ordering(pcmk_action_t *first, pcmk_action_t *then, first->uuid, then->uuid, reason); // Make 'first' required if it is runnable - if (pcmk_is_set(first->flags, pcmk__action_runnable)) { + if (pcmk__is_set(first->flags, pcmk__action_runnable)) { clear_action_flag_because(first, pcmk__action_optional, then); } // Make 'first' required if 'then' is required - if (!pcmk_is_set(then->flags, pcmk__action_optional)) { + if (!pcmk__is_set(then->flags, pcmk__action_optional)) { clear_action_flag_because(first, pcmk__action_optional, then); } // Make 'first' unmigratable if 'then' is unmigratable - if (!pcmk_is_set(then->flags, pcmk__action_migratable)) { + if (!pcmk__is_set(then->flags, pcmk__action_migratable)) { clear_action_flag_because(first, pcmk__action_migratable, then); } // Make 'then' unrunnable if 'first' is required but unrunnable - if (!pcmk_is_set(first->flags, pcmk__action_optional) - && !pcmk_is_set(first->flags, pcmk__action_runnable)) { + if (!pcmk__is_set(first->flags, pcmk__action_optional) + && !pcmk__is_set(first->flags, pcmk__action_runnable)) { clear_action_flag_because(then, pcmk__action_runnable, first); } } @@ -862,80 +867,81 @@ pcmk__update_ordered_actions(pcmk_action_t *first, pcmk_action_t *then, then_flags = then->flags; first_flags = first->flags; - if (pcmk_is_set(type, pcmk__ar_asymmetric)) { + if (pcmk__is_set(type, pcmk__ar_asymmetric)) { handle_asymmetric_ordering(first, then); } - if (pcmk_is_set(type, pcmk__ar_then_implies_first) - && !pcmk_is_set(then_flags, pcmk__action_optional)) { + if (pcmk__is_set(type, pcmk__ar_then_implies_first) + && !pcmk__is_set(then_flags, pcmk__action_optional)) { // Then is required, and implies first should be, too - if (pcmk_is_set(filter, pcmk__action_optional) - && !pcmk_is_set(flags, pcmk__action_optional) - && pcmk_is_set(first_flags, pcmk__action_optional)) { + if (pcmk__is_set(filter, pcmk__action_optional) + && !pcmk__is_set(flags, pcmk__action_optional) + && pcmk__is_set(first_flags, pcmk__action_optional)) { clear_action_flag_because(first, pcmk__action_optional, then); } - if (pcmk_is_set(flags, pcmk__action_migratable) - && !pcmk_is_set(then->flags, pcmk__action_migratable)) { + if (pcmk__is_set(flags, pcmk__action_migratable) + && !pcmk__is_set(then->flags, pcmk__action_migratable)) { clear_action_flag_because(first, pcmk__action_migratable, then); } } - if (pcmk_is_set(type, pcmk__ar_promoted_then_implies_first) + if (pcmk__is_set(type, pcmk__ar_promoted_then_implies_first) && (then->rsc != NULL) && (then->rsc->priv->orig_role == pcmk_role_promoted) - && pcmk_is_set(filter, pcmk__action_optional) - && !pcmk_is_set(then->flags, pcmk__action_optional)) { + && pcmk__is_set(filter, pcmk__action_optional) + && !pcmk__is_set(then->flags, pcmk__action_optional)) { clear_action_flag_because(first, pcmk__action_optional, then); - if (pcmk_is_set(first->flags, pcmk__action_migratable) - && !pcmk_is_set(then->flags, pcmk__action_migratable)) { + if (pcmk__is_set(first->flags, pcmk__action_migratable) + && !pcmk__is_set(then->flags, pcmk__action_migratable)) { clear_action_flag_because(first, pcmk__action_migratable, then); } } - if (pcmk_is_set(type, pcmk__ar_unmigratable_then_blocks) - && pcmk_is_set(filter, pcmk__action_optional)) { + if (pcmk__is_set(type, pcmk__ar_unmigratable_then_blocks) + && pcmk__is_set(filter, pcmk__action_optional)) { - if (!pcmk_all_flags_set(then->flags, pcmk__action_migratable - |pcmk__action_runnable)) { + if (!pcmk__all_flags_set(then->flags, + pcmk__action_migratable + |pcmk__action_runnable)) { clear_action_flag_because(first, pcmk__action_runnable, then); } - if (!pcmk_is_set(then->flags, pcmk__action_optional)) { + if (!pcmk__is_set(then->flags, pcmk__action_optional)) { clear_action_flag_because(first, pcmk__action_optional, then); } } - if (pcmk_is_set(type, pcmk__ar_first_else_then) - && pcmk_is_set(filter, pcmk__action_optional) - && !pcmk_is_set(first->flags, pcmk__action_runnable)) { + if (pcmk__is_set(type, pcmk__ar_first_else_then) + && pcmk__is_set(filter, pcmk__action_optional) + && !pcmk__is_set(first->flags, pcmk__action_runnable)) { clear_action_flag_because(then, pcmk__action_migratable, first); pcmk__clear_action_flags(then, pcmk__action_pseudo); } - if (pcmk_is_set(type, pcmk__ar_unrunnable_first_blocks) - && pcmk_is_set(filter, pcmk__action_runnable) - && pcmk_is_set(then->flags, pcmk__action_runnable) - && !pcmk_is_set(flags, pcmk__action_runnable)) { + if (pcmk__is_set(type, pcmk__ar_unrunnable_first_blocks) + && pcmk__is_set(filter, pcmk__action_runnable) + && pcmk__is_set(then->flags, pcmk__action_runnable) + && !pcmk__is_set(flags, pcmk__action_runnable)) { clear_action_flag_because(then, pcmk__action_runnable, first); clear_action_flag_because(then, pcmk__action_migratable, first); } - if (pcmk_is_set(type, pcmk__ar_first_implies_then) - && pcmk_is_set(filter, pcmk__action_optional) - && pcmk_is_set(then->flags, pcmk__action_optional) - && !pcmk_is_set(flags, pcmk__action_optional) - && !pcmk_is_set(first->flags, pcmk__action_migratable)) { + if (pcmk__is_set(type, pcmk__ar_first_implies_then) + && pcmk__is_set(filter, pcmk__action_optional) + && pcmk__is_set(then->flags, pcmk__action_optional) + && !pcmk__is_set(flags, pcmk__action_optional) + && !pcmk__is_set(first->flags, pcmk__action_migratable)) { clear_action_flag_because(then, pcmk__action_optional, first); } - if (pcmk_is_set(type, pcmk__ar_intermediate_stop)) { + if (pcmk__is_set(type, pcmk__ar_intermediate_stop)) { handle_restart_ordering(first, then, filter); } @@ -983,7 +989,7 @@ pcmk__log_action(const char *pre_text, const pcmk_action_t *action, CRM_CHECK(action != NULL, return); - if (!pcmk_is_set(action->flags, pcmk__action_pseudo)) { + if (!pcmk__is_set(action->flags, pcmk__action_pseudo)) { if (action->node != NULL) { node_uname = action->node->priv->name; node_uuid = action->node->priv->id; @@ -995,41 +1001,43 @@ pcmk__log_action(const char *pre_text, const pcmk_action_t *action, switch (pcmk__parse_action(action->task)) { case pcmk__action_fence: case pcmk__action_shutdown: - if (pcmk_is_set(action->flags, pcmk__action_pseudo)) { + if (pcmk__is_set(action->flags, pcmk__action_pseudo)) { desc = "Pseudo "; - } else if (pcmk_is_set(action->flags, pcmk__action_optional)) { + } else if (pcmk__is_set(action->flags, pcmk__action_optional)) { desc = "Optional "; - } else if (!pcmk_is_set(action->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(action->flags, pcmk__action_runnable)) { desc = "!!Non-Startable!! "; } else { desc = "(Provisional) "; } - crm_trace("%s%s%sAction %d: %s%s%s%s%s%s", - ((pre_text == NULL)? "" : pre_text), - ((pre_text == NULL)? "" : ": "), - desc, action->id, action->uuid, - (node_uname? "\ton " : ""), (node_uname? node_uname : ""), - (node_uuid? "\t\t(" : ""), (node_uuid? node_uuid : ""), - (node_uuid? ")" : "")); + pcmk__trace("%s%s%sAction %d: %s%s%s%s%s%s", + pcmk__s(pre_text, ""), ((pre_text != NULL)? ": " : ""), + desc, action->id, action->uuid, + ((node_uname != NULL)? "\ton " : ""), + pcmk__s(node_uname, ""), + ((node_uuid != NULL)? "\t\t(" : ""), + pcmk__s(node_uuid, ""), + ((node_uuid != NULL)? ")" : "")); break; default: - if (pcmk_is_set(action->flags, pcmk__action_optional)) { + if (pcmk__is_set(action->flags, pcmk__action_optional)) { desc = "Optional "; - } else if (pcmk_is_set(action->flags, pcmk__action_pseudo)) { + } else if (pcmk__is_set(action->flags, pcmk__action_pseudo)) { desc = "Pseudo "; - } else if (!pcmk_is_set(action->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(action->flags, pcmk__action_runnable)) { desc = "!!Non-Startable!! "; } else { desc = "(Provisional) "; } - crm_trace("%s%s%sAction %d: %s %s%s%s%s%s%s", - ((pre_text == NULL)? "" : pre_text), - ((pre_text == NULL)? "" : ": "), - desc, action->id, action->uuid, - (action->rsc? action->rsc->id : ""), - (node_uname? "\ton " : ""), (node_uname? node_uname : ""), - (node_uuid? "\t\t(" : ""), (node_uuid? node_uuid : ""), - (node_uuid? ")" : "")); + pcmk__trace("%s%s%sAction %d: %s %s%s%s%s%s%s", + pcmk__s(pre_text, ""), ((pre_text != NULL)? ": " : ""), + desc, action->id, action->uuid, + ((action->rsc != NULL)? action->rsc->id : ""), + ((node_uname != NULL)? "\ton " : ""), + pcmk__s(node_uname, ""), + ((node_uuid != NULL)? "\t\t(" : ""), + pcmk__s(node_uuid, ""), + ((node_uuid != NULL)? ")" : "")); break; } @@ -1037,22 +1045,22 @@ pcmk__log_action(const char *pre_text, const pcmk_action_t *action, const GList *iter = NULL; const pcmk__related_action_t *other = NULL; - crm_trace("\t\t====== Preceding Actions"); + pcmk__trace("\t\t====== Preceding Actions"); for (iter = action->actions_before; iter != NULL; iter = iter->next) { other = (const pcmk__related_action_t *) iter->data; pcmk__log_action("\t\t", other->action, false); } - crm_trace("\t\t====== Subsequent Actions"); + pcmk__trace("\t\t====== Subsequent Actions"); for (iter = action->actions_after; iter != NULL; iter = iter->next) { other = (const pcmk__related_action_t *) iter->data; pcmk__log_action("\t\t", other->action, false); } - crm_trace("\t\t====== End"); + pcmk__trace("\t\t====== End"); } else { - crm_trace("\t\t(before=%d, after=%d)", - g_list_length(action->actions_before), - g_list_length(action->actions_after)); + pcmk__trace("\t\t(before=%u, after=%u)", + g_list_length(action->actions_before), + g_list_length(action->actions_after)); } } @@ -1072,8 +1080,8 @@ pcmk__new_shutdown_action(pcmk_node_t *node) pcmk__assert(node != NULL); - shutdown_id = crm_strdup_printf("%s-%s", PCMK_ACTION_DO_SHUTDOWN, - node->priv->name); + shutdown_id = pcmk__assert_asprintf("%s-%s", PCMK_ACTION_DO_SHUTDOWN, + node->priv->name); shutdown_op = custom_action(NULL, shutdown_id, PCMK_ACTION_DO_SHUTDOWN, node, FALSE, node->priv->scheduler); @@ -1107,7 +1115,7 @@ add_op_digest_to_xml(const lrmd_event_data_t *op, xmlNode *update) g_hash_table_foreach(op->params, hash2field, args_xml); pcmk__filter_op_for_digest(args_xml); digest = pcmk__digest_operation(args_xml); - crm_xml_add(update, PCMK__XA_OP_DIGEST, digest); + pcmk__xe_set(update, PCMK__XA_OP_DIGEST, digest); pcmk__xml_free(args_xml); free(digest); } @@ -1143,10 +1151,10 @@ pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *op, const char *task = NULL; CRM_CHECK(op != NULL, return NULL); - crm_trace("Creating history XML for %s-interval %s action for %s on %s " - "(DC version: %s, origin: %s)", - pcmk__readable_interval(op->interval_ms), op->op_type, op->rsc_id, - ((node == NULL)? "no node" : node), caller_version, origin); + pcmk__trace("Creating history XML for %s-interval %s action for %s on %s " + "(DC version: %s, origin: %s)", + pcmk__readable_interval(op->interval_ms), op->op_type, + op->rsc_id, pcmk__s(node, "no node"), caller_version, origin); task = op->op_type; @@ -1223,54 +1231,53 @@ pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *op, } if (op->user_data == NULL) { - crm_debug("Generating fake transition key for: " PCMK__OP_FMT - " %d from %s", op->rsc_id, op->op_type, op->interval_ms, - op->call_id, origin); + pcmk__debug("Generating fake transition key for: " PCMK__OP_FMT + " %d from %s", + op->rsc_id, op->op_type, op->interval_ms, op->call_id, + origin); local_user_data = pcmk__transition_key(-1, op->call_id, target_rc, FAKE_TE_ID); op->user_data = local_user_data; } if (magic == NULL) { - magic = crm_strdup_printf("%d:%d;%s", op->op_status, op->rc, - (const char *) op->user_data); + magic = pcmk__assert_asprintf("%d:%d;%s", op->op_status, op->rc, + (const char *) op->user_data); } - crm_xml_add(xml_op, PCMK_XA_ID, op_id); - crm_xml_add(xml_op, PCMK__XA_OPERATION_KEY, key); - crm_xml_add(xml_op, PCMK_XA_OPERATION, task); - crm_xml_add(xml_op, PCMK_XA_CRM_DEBUG_ORIGIN, origin); - crm_xml_add(xml_op, PCMK_XA_CRM_FEATURE_SET, caller_version); - crm_xml_add(xml_op, PCMK__XA_TRANSITION_KEY, op->user_data); - crm_xml_add(xml_op, PCMK__XA_TRANSITION_MAGIC, magic); - crm_xml_add(xml_op, PCMK_XA_EXIT_REASON, pcmk__s(exit_reason, "")); - crm_xml_add(xml_op, PCMK__META_ON_NODE, node); // For context during triage + pcmk__xe_set(xml_op, PCMK_XA_ID, op_id); + pcmk__xe_set(xml_op, PCMK__XA_OPERATION_KEY, key); + pcmk__xe_set(xml_op, PCMK_XA_OPERATION, task); + pcmk__xe_set(xml_op, PCMK_XA_CRM_DEBUG_ORIGIN, origin); + pcmk__xe_set(xml_op, PCMK_XA_CRM_FEATURE_SET, caller_version); + pcmk__xe_set(xml_op, PCMK__XA_TRANSITION_KEY, op->user_data); + pcmk__xe_set(xml_op, PCMK__XA_TRANSITION_MAGIC, magic); + pcmk__xe_set(xml_op, PCMK_XA_EXIT_REASON, pcmk__s(exit_reason, "")); + pcmk__xe_set(xml_op, PCMK__META_ON_NODE, node); // For context during triage - crm_xml_add_int(xml_op, PCMK__XA_CALL_ID, op->call_id); - crm_xml_add_int(xml_op, PCMK__XA_RC_CODE, op->rc); - crm_xml_add_int(xml_op, PCMK__XA_OP_STATUS, op->op_status); - crm_xml_add_ms(xml_op, PCMK_META_INTERVAL, op->interval_ms); + pcmk__xe_set_int(xml_op, PCMK__XA_CALL_ID, op->call_id); + pcmk__xe_set_int(xml_op, PCMK__XA_RC_CODE, op->rc); + pcmk__xe_set_int(xml_op, PCMK__XA_OP_STATUS, op->op_status); + pcmk__xe_set_guint(xml_op, PCMK_META_INTERVAL, op->interval_ms); if ((op->t_run > 0) || (op->t_rcchange > 0) || (op->exec_time > 0) || (op->queue_time > 0)) { - crm_trace("Timing data (" PCMK__OP_FMT "): " - "last=%lld change=%lld exec=%u queue=%u", - op->rsc_id, op->op_type, op->interval_ms, - (long long) op->t_run, (long long) op->t_rcchange, - op->exec_time, op->queue_time); + pcmk__trace("Timing data (" PCMK__OP_FMT "): " + "last=%lld change=%lld exec=%u queue=%u", + op->rsc_id, op->op_type, op->interval_ms, + (long long) op->t_run, (long long) op->t_rcchange, + op->exec_time, op->queue_time); if ((op->interval_ms > 0) && (op->t_rcchange > 0)) { // Recurring ops may have changed rc after initial run - crm_xml_add_ll(xml_op, PCMK_XA_LAST_RC_CHANGE, - (long long) op->t_rcchange); + pcmk__xe_set_time(xml_op, PCMK_XA_LAST_RC_CHANGE, op->t_rcchange); } else { - crm_xml_add_ll(xml_op, PCMK_XA_LAST_RC_CHANGE, - (long long) op->t_run); + pcmk__xe_set_time(xml_op, PCMK_XA_LAST_RC_CHANGE, op->t_run); } - crm_xml_add_int(xml_op, PCMK_XA_EXEC_TIME, op->exec_time); - crm_xml_add_int(xml_op, PCMK_XA_QUEUE_TIME, op->queue_time); + pcmk__xe_set_int(xml_op, PCMK_XA_EXEC_TIME, op->exec_time); + pcmk__xe_set_int(xml_op, PCMK_XA_QUEUE_TIME, op->queue_time); } if (pcmk__str_any_of(op->op_type, PCMK_ACTION_MIGRATE_TO, @@ -1280,10 +1287,10 @@ pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *op, */ const char *name = PCMK__META_MIGRATE_SOURCE; - crm_xml_add(xml_op, name, crm_meta_value(op->params, name)); + pcmk__xe_set(xml_op, name, crm_meta_value(op->params, name)); name = PCMK__META_MIGRATE_TARGET; - crm_xml_add(xml_op, name, crm_meta_value(op->params, name)); + pcmk__xe_set(xml_op, name, crm_meta_value(op->params, name)); } add_op_digest_to_xml(op, xml_op); @@ -1382,9 +1389,9 @@ pcmk__deduplicate_action_inputs(pcmk_action_t *action) next = item->next; if ((last_input != NULL) && (input->action->id == last_input->action->id)) { - crm_trace("Input %s (%d) duplicate skipped for action %s (%d)", - input->action->uuid, input->action->id, - action->uuid, action->id); + pcmk__trace("Input %s (%d) duplicate skipped for action %s (%d)", + input->action->uuid, input->action->id, + action->uuid, action->id); /* For the purposes of scheduling, the ordering flags no longer * matter, but crm_simulate looks at certain ones when creating a @@ -1427,7 +1434,7 @@ pcmk__output_actions(pcmk_scheduler_t *scheduler) if (action->rsc != NULL) { continue; // Resource actions will be output later - } else if (pcmk_is_set(action->flags, pcmk__action_optional)) { + } else if (pcmk__is_set(action->flags, pcmk__action_optional)) { continue; // This action was not scheduled } @@ -1440,7 +1447,7 @@ pcmk__output_actions(pcmk_scheduler_t *scheduler) const char *op = g_hash_table_lookup(action->meta, PCMK__META_STONITH_ACTION); - task = crm_strdup_printf("Fence (%s)", op); + task = pcmk__assert_asprintf("Fence (%s)", op); } else { continue; // Don't display other node action types @@ -1449,11 +1456,12 @@ pcmk__output_actions(pcmk_scheduler_t *scheduler) if (pcmk__is_guest_or_bundle_node(action->node)) { const pcmk_resource_t *remote = action->node->priv->remote; - node_name = crm_strdup_printf("%s (resource: %s)", - pcmk__node_name(action->node), - remote->priv->launcher->id); + node_name = pcmk__assert_asprintf("%s (resource: %s)", + pcmk__node_name(action->node), + remote->priv->launcher->id); } else if (action->node != NULL) { - node_name = crm_strdup_printf("%s", pcmk__node_name(action->node)); + node_name = pcmk__assert_asprintf("%s", + pcmk__node_name(action->node)); } out->message(out, "node-action", task, node_name, action->reason); @@ -1519,12 +1527,12 @@ only_sanitized_changed(const xmlNode *xml_op, { const char *digest_secure = NULL; - if (!pcmk_is_set(scheduler->flags, pcmk__sched_sanitized)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_sanitized)) { // The scheduler is not being run as a simulation return false; } - digest_secure = crm_element_value(xml_op, PCMK__XA_OP_SECURE_DIGEST); + digest_secure = pcmk__xe_get(xml_op, PCMK__XA_OP_SECURE_DIGEST); return (digest_data->rc != pcmk__digest_match) && (digest_secure != NULL) && (digest_data->digest_secure_calc != NULL) @@ -1576,12 +1584,14 @@ schedule_reload(gpointer data, gpointer user_data) // Skip the reload in certain situations if ((node == NULL) - || !pcmk_is_set(rsc->flags, pcmk__rsc_managed) - || pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { - pcmk__rsc_trace(rsc, "Skip reload of %s:%s%s %s", - rsc->id, - pcmk_is_set(rsc->flags, pcmk__rsc_managed)? "" : " unmanaged", - pcmk_is_set(rsc->flags, pcmk__rsc_failed)? " failed" : "", + || !pcmk__is_set(rsc->flags, pcmk__rsc_managed) + || pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { + + const bool managed = pcmk__is_set(rsc->flags, pcmk__rsc_managed); + const bool failed = pcmk__is_set(rsc->flags, pcmk__rsc_failed); + + pcmk__rsc_trace(rsc, "Skip reload of %s:%s%s %s", rsc->id, + (managed? "" : " unmanaged"), (failed? " failed" : ""), (node == NULL)? "inactive" : node->priv->name); return; } @@ -1589,7 +1599,7 @@ schedule_reload(gpointer data, gpointer user_data) /* If a resource's configuration changed while a start was pending, * force a full restart instead of a reload. */ - if (pcmk_is_set(rsc->flags, pcmk__rsc_start_pending)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_start_pending)) { pcmk__rsc_trace(rsc, "%s: preventing agent reload because start pending", rsc->id); @@ -1638,10 +1648,10 @@ pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, CRM_CHECK((rsc != NULL) && (node != NULL) && (xml_op != NULL), return false); - task = crm_element_value(xml_op, PCMK_XA_OPERATION); + task = pcmk__xe_get(xml_op, PCMK_XA_OPERATION); CRM_CHECK(task != NULL, return false); - crm_element_value_ms(xml_op, PCMK_META_INTERVAL, &interval_ms); + pcmk__xe_get_guint(xml_op, PCMK_META_INTERVAL, &interval_ms); // If this is a recurring action, check whether it has been orphaned if (interval_ms > 0) { @@ -1650,10 +1660,9 @@ pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, "%s-interval %s for %s on %s is in configuration", pcmk__readable_interval(interval_ms), task, rsc->id, pcmk__node_name(node)); - } else if (pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_cancel_removed_actions)) { - pcmk__schedule_cancel(rsc, - crm_element_value(xml_op, PCMK__XA_CALL_ID), + } else if (pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_cancel_removed_actions)) { + pcmk__schedule_cancel(rsc, pcmk__xe_get(xml_op, PCMK__XA_CALL_ID), task, interval_ms, node, "orphan"); return true; } else { @@ -1664,9 +1673,10 @@ pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, } } - crm_trace("Checking %s-interval %s for %s on %s for configuration changes", - pcmk__readable_interval(interval_ms), task, rsc->id, - pcmk__node_name(node)); + pcmk__trace("Checking %s-interval %s for %s on %s for configuration " + "changes", + pcmk__readable_interval(interval_ms), task, rsc->id, + pcmk__node_name(node)); task = task_for_digest(task, interval_ms); digest_data = rsc_action_digest_cmp(rsc, xml_op, node, rsc->priv->scheduler); @@ -1680,14 +1690,14 @@ pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, "on %s changed: %s", pcmk__readable_interval(interval_ms), task, rsc->id, pcmk__node_name(node), - crm_element_value(xml_op, PCMK__XA_TRANSITION_MAGIC)); + pcmk__xe_get(xml_op, PCMK__XA_TRANSITION_MAGIC)); } return false; } switch (digest_data->rc) { case pcmk__digest_restart: - crm_log_xml_debug(digest_data->params_restart, "params:restart"); + pcmk__log_xml_debug(digest_data->params_restart, "params:restart"); force_restart(rsc, task, interval_ms, node); return true; @@ -1700,16 +1710,17 @@ pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, * re-scheduled so the next run uses the new parameters. * The old instance will be cancelled automatically. */ - crm_log_xml_debug(digest_data->params_all, "params:reschedule"); + pcmk__log_xml_debug(digest_data->params_all, + "params:reschedule"); pcmk__reschedule_recurring(rsc, task, interval_ms, node); - } else if (crm_element_value(xml_op, - PCMK__XA_OP_RESTART_DIGEST) != NULL) { + } else if (pcmk__xe_get(xml_op, + PCMK__XA_OP_RESTART_DIGEST) != NULL) { // Agent supports reload, so use it trigger_unfencing(rsc, node, "Device parameters changed (reload)", NULL, rsc->priv->scheduler); - crm_log_xml_debug(digest_data->params_all, "params:reload"); + pcmk__log_xml_debug(digest_data->params_all, "params:reload"); schedule_reload((gpointer) rsc, (gpointer) node); } else { @@ -1717,8 +1728,8 @@ pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, "Restarting %s " "because agent doesn't support reload", rsc->id); - crm_log_xml_debug(digest_data->params_restart, - "params:restart"); + pcmk__log_xml_debug(digest_data->params_restart, + "params:restart"); force_restart(rsc, task, interval_ms, node); } return true; @@ -1776,7 +1787,7 @@ process_rsc_history(const xmlNode *rsc_entry, pcmk_resource_t *rsc, int start_index = 0; GList *sorted_op_list = NULL; - if (pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { if (pcmk__is_anonymous_clone(pe__const_top_resource(rsc, false))) { /* @TODO Should this be done for bundled primitives as well? Added * by 2ac43ae31 @@ -1828,15 +1839,14 @@ process_rsc_history(const xmlNode *rsc_entry, pcmk_resource_t *rsc, continue; } - task = crm_element_value(rsc_op, PCMK_XA_OPERATION); - crm_element_value_ms(rsc_op, PCMK_META_INTERVAL, &interval_ms); + task = pcmk__xe_get(rsc_op, PCMK_XA_OPERATION); + pcmk__xe_get_guint(rsc_op, PCMK_META_INTERVAL, &interval_ms); if ((interval_ms > 0) - && (pcmk_is_set(rsc->flags, pcmk__rsc_maintenance) + && (pcmk__is_set(rsc->flags, pcmk__rsc_maintenance) || node->details->maintenance)) { // Maintenance mode cancels recurring operations - pcmk__schedule_cancel(rsc, - crm_element_value(rsc_op, PCMK__XA_CALL_ID), + pcmk__schedule_cancel(rsc, pcmk__xe_get(rsc_op, PCMK__XA_CALL_ID), task, interval_ms, node, "maintenance mode"); } else if ((interval_ms > 0) @@ -1885,7 +1895,7 @@ process_rsc_history(const xmlNode *rsc_entry, pcmk_resource_t *rsc, static void process_node_history(pcmk_node_t *node, const xmlNode *lrm_rscs) { - crm_trace("Processing node history for %s", pcmk__node_name(node)); + pcmk__trace("Processing node history for %s", pcmk__node_name(node)); for (const xmlNode *rsc_entry = pcmk__xe_first_child(lrm_rscs, PCMK__XE_LRM_RESOURCE, NULL, NULL); @@ -1929,7 +1939,7 @@ process_node_history(pcmk_node_t *node, const xmlNode *lrm_rscs) void pcmk__handle_rsc_config_changes(pcmk_scheduler_t *scheduler) { - crm_trace("Check resource and action configuration for changes"); + pcmk__trace("Check resource and action configuration for changes"); /* Rather than iterate through the status section, iterate through the nodes * and search for the appropriate status subsection for each. This skips @@ -1948,9 +1958,9 @@ pcmk__handle_rsc_config_changes(pcmk_scheduler_t *scheduler) char *xpath = NULL; xmlNode *history = NULL; - xpath = crm_strdup_printf(XPATH_NODE_HISTORY, node->priv->name); + xpath = pcmk__assert_asprintf(XPATH_NODE_HISTORY, node->priv->name); history = pcmk__xpath_find_one(scheduler->input->doc, xpath, - LOG_NEVER); + PCMK__LOG_NEVER); free(xpath); process_node_history(node, history); diff --git a/lib/pacemaker/pcmk_sched_bundle.c b/lib/pacemaker/pcmk_sched_bundle.c index 2c9ebcfd45d..15909173f0f 100644 --- a/lib/pacemaker/pcmk_sched_bundle.c +++ b/lib/pacemaker/pcmk_sched_bundle.c @@ -13,6 +13,7 @@ #include // xmlNode +#include // PCMK_SCORE_INFINITY #include #include @@ -125,8 +126,8 @@ pcmk__bundle_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, pcmk__rsc_trace(rsc, "Assigning bundle %s", rsc->id); pcmk__set_rsc_flags(rsc, pcmk__rsc_assigning); - pe__show_node_scores(!pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_output_scores), + pe__show_node_scores(!pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_output_scores), rsc, __func__, rsc->priv->allowed_nodes, rsc->priv->scheduler); @@ -210,7 +211,7 @@ pcmk__bundle_create_actions(pcmk_resource_t *rsc) if (bundled_resource != NULL) { bundled_resource->priv->cmds->create_actions(bundled_resource); - if (pcmk_is_set(bundled_resource->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(bundled_resource->flags, pcmk__rsc_promotable)) { pe__new_rsc_pseudo_action(rsc, PCMK_ACTION_PROMOTE, true, true); action = pe__new_rsc_pseudo_action(rsc, PCMK_ACTION_PROMOTED, true, true); @@ -336,7 +337,7 @@ pcmk__bundle_internal_constraints(pcmk_resource_t *rsc) bundled_resource->priv->cmds->internal_constraints(bundled_resource); - if (!pcmk_is_set(bundled_resource->flags, pcmk__rsc_promotable)) { + if (!pcmk__is_set(bundled_resource->flags, pcmk__rsc_promotable)) { return; } pcmk__promotable_restart_ordering(rsc); @@ -548,7 +549,7 @@ pcmk__bundle_apply_coloc_score(pcmk_resource_t *dependent, pcmk__assert(pcmk__is_bundle(primary) && pcmk__is_primitive(dependent) && (colocation != NULL) && !for_dependent); - if (pcmk_is_set(primary->flags, pcmk__rsc_unassigned)) { + if (pcmk__is_set(primary->flags, pcmk__rsc_unassigned)) { pcmk__rsc_trace(primary, "Skipping applying colocation %s " "because %s is still provisional", @@ -577,9 +578,9 @@ pcmk__bundle_apply_coloc_score(pcmk_resource_t *dependent, if (colocation->score >= PCMK_SCORE_INFINITY) { // Failure, and it's fatal - crm_notice("%s cannot run because there is no compatible " - "instance of %s to colocate with", - dependent->id, primary->id); + pcmk__notice("%s cannot run because there is no compatible " + "instance of %s to colocate with", + dependent->id, primary->id); pcmk__assign_resource(dependent, NULL, true, true); } else { // Failure, but we can ignore it @@ -612,7 +613,7 @@ pcmk__with_bundle_colocations(const pcmk_resource_t *rsc, // The bundle itself and its containers always get its colocations if ((orig_rsc == rsc) - || pcmk_is_set(orig_rsc->flags, pcmk__rsc_replica_container)) { + || pcmk__is_set(orig_rsc->flags, pcmk__rsc_replica_container)) { pcmk__add_with_this_list(list, rsc->priv->with_this_colocations, orig_rsc); @@ -624,7 +625,7 @@ pcmk__with_bundle_colocations(const pcmk_resource_t *rsc, */ bundled_rsc = pe__bundled_resource(rsc); if ((bundled_rsc == NULL) - || !pcmk_is_set(bundled_rsc->flags, pcmk__rsc_promotable) + || !pcmk__is_set(bundled_rsc->flags, pcmk__rsc_promotable) || (pe__const_top_resource(orig_rsc, false) != bundled_rsc)) { return; } @@ -639,7 +640,7 @@ pcmk__with_bundle_colocations(const pcmk_resource_t *rsc, orig_rsc); } - } else if (!pcmk_is_set(orig_rsc->flags, pcmk__rsc_unassigned)) { + } else if (!pcmk__is_set(orig_rsc->flags, pcmk__rsc_unassigned)) { /* orig_rsc is an instance and is already assigned. If something * requests colocations for orig_rsc now, it's for setting roles. */ @@ -659,7 +660,7 @@ pcmk__bundle_with_colocations(const pcmk_resource_t *rsc, // The bundle itself and its containers always get its colocations if ((orig_rsc == rsc) - || pcmk_is_set(orig_rsc->flags, pcmk__rsc_replica_container)) { + || pcmk__is_set(orig_rsc->flags, pcmk__rsc_replica_container)) { pcmk__add_this_with_list(list, rsc->priv->this_with_colocations, orig_rsc); @@ -671,7 +672,7 @@ pcmk__bundle_with_colocations(const pcmk_resource_t *rsc, */ bundled_rsc = pe__bundled_resource(rsc); if ((bundled_rsc == NULL) - || !pcmk_is_set(bundled_rsc->flags, pcmk__rsc_promotable) + || !pcmk__is_set(bundled_rsc->flags, pcmk__rsc_promotable) || (pe__const_top_resource(orig_rsc, false) != bundled_rsc)) { return; } @@ -686,7 +687,7 @@ pcmk__bundle_with_colocations(const pcmk_resource_t *rsc, orig_rsc); } - } else if (!pcmk_is_set(orig_rsc->flags, pcmk__rsc_unassigned)) { + } else if (!pcmk__is_set(orig_rsc->flags, pcmk__rsc_unassigned)) { /* orig_rsc is an instance and is already assigned. If something * requests colocations for orig_rsc now, it's for setting roles. */ @@ -1056,7 +1057,7 @@ pcmk__bundle_add_utilization(const pcmk_resource_t *rsc, pcmk__assert(pcmk__is_bundle(rsc)); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { return; } diff --git a/lib/pacemaker/pcmk_sched_clone.c b/lib/pacemaker/pcmk_sched_clone.c index 4f86621cbd0..329780dadb0 100644 --- a/lib/pacemaker/pcmk_sched_clone.c +++ b/lib/pacemaker/pcmk_sched_clone.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,8 @@ #include +#include // crm_meta_name() +#include // PCMK_SCORE_INFINITY #include #include @@ -41,19 +43,19 @@ pcmk__clone_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, pcmk__assert(pcmk__is_clone(rsc)); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { return NULL; // Assignment has already been done } // Detect assignment loops - if (pcmk_is_set(rsc->flags, pcmk__rsc_assigning)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_assigning)) { pcmk__rsc_debug(rsc, "Breaking assignment loop involving %s", rsc->id); return NULL; } pcmk__set_rsc_flags(rsc, pcmk__rsc_assigning); // If this clone is promotable, consider nodes' promotion scores - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { pcmk__add_promotion_scores(rsc); } @@ -74,8 +76,8 @@ pcmk__clone_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, g_list_foreach(colocations, pcmk__add_dependent_scores, rsc); g_list_free(colocations); - pe__show_node_scores(!pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_output_scores), + pe__show_node_scores(!pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_output_scores), rsc, __func__, rsc->priv->allowed_nodes, rsc->priv->scheduler); @@ -83,7 +85,7 @@ pcmk__clone_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, pcmk__assign_instances(rsc, rsc->priv->children, pe__clone_max(rsc), pe__clone_node_max(rsc)); - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { pcmk__set_instance_roles(rsc); } @@ -105,7 +107,7 @@ pcmk__clone_create_actions(pcmk_resource_t *rsc) pcmk__rsc_trace(rsc, "Creating actions for clone %s", rsc->id); pcmk__create_instance_actions(rsc, rsc->priv->children); - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { pcmk__create_promotable_actions(rsc); } } @@ -137,7 +139,7 @@ pcmk__clone_internal_constraints(pcmk_resource_t *rsc) pcmk__ar_unrunnable_first_blocks); // Demoted -> stop and started -> promote - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { pcmk__order_resource_actions(rsc, PCMK_ACTION_DEMOTED, rsc, PCMK_ACTION_STOP, pcmk__ar_ordered); @@ -189,7 +191,7 @@ pcmk__clone_internal_constraints(pcmk_resource_t *rsc) } } } - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { pcmk__order_promotable_instances(rsc); } } @@ -214,8 +216,8 @@ can_interleave(const pcmk__colocation_t *colocation) } // Only the dependent needs to be marked for interleaving - if (!crm_is_true(g_hash_table_lookup(dependent->priv->meta, - PCMK_META_INTERLEAVE))) { + if (!pcmk__is_true(g_hash_table_lookup(dependent->priv->meta, + PCMK_META_INTERLEAVE))) { return false; } @@ -264,7 +266,7 @@ pcmk__clone_apply_coloc_score(pcmk_resource_t *dependent, pcmk__assert(!for_dependent && (colocation != NULL) && pcmk__is_clone(primary) && pcmk__is_primitive(dependent)); - if (pcmk_is_set(primary->flags, pcmk__rsc_unassigned)) { + if (pcmk__is_set(primary->flags, pcmk__rsc_unassigned)) { pcmk__rsc_trace(primary, "Delaying processing colocation %s " "because cloned primary %s is still provisional", @@ -277,10 +279,10 @@ pcmk__clone_apply_coloc_score(pcmk_resource_t *dependent, pcmk_readable_score(colocation->score)); // Apply role-specific colocations - if (pcmk_is_set(primary->flags, pcmk__rsc_promotable) + if (pcmk__is_set(primary->flags, pcmk__rsc_promotable) && (colocation->primary_role != pcmk_role_unknown)) { - if (pcmk_is_set(dependent->flags, pcmk__rsc_unassigned)) { + if (pcmk__is_set(dependent->flags, pcmk__rsc_unassigned)) { // We're assigning the dependent to a node pcmk__update_dependent_with_promotable(primary, dependent, colocation); @@ -312,8 +314,9 @@ pcmk__clone_apply_coloc_score(pcmk_resource_t *dependent, } if (colocation->score >= PCMK_SCORE_INFINITY) { - crm_notice("%s cannot run because it cannot interleave with " - "any instance of %s", dependent->id, primary->id); + pcmk__notice("%s cannot run because it cannot interleave with " + "any instance of %s", + dependent->id, primary->id); pcmk__assign_resource(dependent, NULL, true, true); } else { @@ -593,7 +596,7 @@ pcmk__clone_create_probe(pcmk_resource_t *rsc, pcmk_node_t *node) { pcmk__assert((node != NULL) && pcmk__is_clone(rsc)); - if (pcmk_is_set(rsc->flags, pcmk__rsc_exclusive_probes)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_exclusive_probes)) { /* The clone is configured to be probed only where a location constraint * exists with PCMK_XA_RESOURCE_DISCOVERY set to exclusive. * @@ -623,7 +626,7 @@ pcmk__clone_create_probe(pcmk_resource_t *rsc, pcmk_node_t *node) rsc->priv->children = g_list_sort(rsc->priv->children, pcmk__cmp_instance_number); - if (pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { return pcmk__probe_resource_list(rsc->priv->children, node); } else { return probe_anonymous_clone(rsc, node); @@ -647,42 +650,42 @@ pcmk__clone_add_graph_meta(const pcmk_resource_t *rsc, xmlNode *xml) pcmk__assert(pcmk__is_clone(rsc) && (xml != NULL)); name = crm_meta_name(PCMK_META_GLOBALLY_UNIQUE); - crm_xml_add(xml, name, pcmk__flag_text(rsc->flags, pcmk__rsc_unique)); + pcmk__xe_set(xml, name, pcmk__flag_text(rsc->flags, pcmk__rsc_unique)); free(name); name = crm_meta_name(PCMK_META_NOTIFY); - crm_xml_add(xml, name, pcmk__flag_text(rsc->flags, pcmk__rsc_notify)); + pcmk__xe_set(xml, name, pcmk__flag_text(rsc->flags, pcmk__rsc_notify)); free(name); name = crm_meta_name(PCMK_META_CLONE_MAX); - crm_xml_add_int(xml, name, pe__clone_max(rsc)); + pcmk__xe_set_int(xml, name, pe__clone_max(rsc)); free(name); name = crm_meta_name(PCMK_META_CLONE_NODE_MAX); - crm_xml_add_int(xml, name, pe__clone_node_max(rsc)); + pcmk__xe_set_int(xml, name, pe__clone_node_max(rsc)); free(name); - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { int promoted_max = pe__clone_promoted_max(rsc); int promoted_node_max = pe__clone_promoted_node_max(rsc); name = crm_meta_name(PCMK_META_PROMOTED_MAX); - crm_xml_add_int(xml, name, promoted_max); + pcmk__xe_set_int(xml, name, promoted_max); free(name); name = crm_meta_name(PCMK_META_PROMOTED_NODE_MAX); - crm_xml_add_int(xml, name, promoted_node_max); + pcmk__xe_set_int(xml, name, promoted_node_max); free(name); /* @COMPAT Maintain backward compatibility with resource agents that * expect the old names (deprecated since 2.0.0). */ name = crm_meta_name(PCMK__META_PROMOTED_MAX_LEGACY); - crm_xml_add_int(xml, name, promoted_max); + pcmk__xe_set_int(xml, name, promoted_max); free(name); name = crm_meta_name(PCMK__META_PROMOTED_NODE_MAX_LEGACY); - crm_xml_add_int(xml, name, promoted_node_max); + pcmk__xe_set_int(xml, name, promoted_node_max); free(name); } } @@ -699,7 +702,7 @@ pcmk__clone_add_utilization(const pcmk_resource_t *rsc, pcmk__assert(pcmk__is_clone(rsc) && (orig_rsc != NULL) && (utilization != NULL)); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { return; } diff --git a/lib/pacemaker/pcmk_sched_colocation.c b/lib/pacemaker/pcmk_sched_colocation.c index 3c4c4c6b23e..538ff9c9771 100644 --- a/lib/pacemaker/pcmk_sched_colocation.c +++ b/lib/pacemaker/pcmk_sched_colocation.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -15,6 +15,7 @@ #include #include #include +#include // PCMK_SCORE_INFINITY #include #include @@ -127,12 +128,12 @@ cmp_colocation_priority(const pcmk__colocation_t *colocation1, * tests) */ if (pcmk__is_clone(rsc1)) { - if (pcmk_is_set(rsc1->flags, pcmk__rsc_promotable) - && !pcmk_is_set(rsc2->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc1->flags, pcmk__rsc_promotable) + && !pcmk__is_set(rsc2->flags, pcmk__rsc_promotable)) { return -1; } - if (!pcmk_is_set(rsc1->flags, pcmk__rsc_promotable) - && pcmk_is_set(rsc2->flags, pcmk__rsc_promotable)) { + if (!pcmk__is_set(rsc1->flags, pcmk__rsc_promotable) + && pcmk__is_set(rsc2->flags, pcmk__rsc_promotable)) { return 1; } } @@ -457,17 +458,16 @@ unpack_influence(const char *coloc_id, const pcmk_resource_t *rsc, const char *influence_s) { if (influence_s != NULL) { - int influence_i = 0; + bool influence = false; - if (crm_str_to_boolean(influence_s, &influence_i) < 0) { - pcmk__config_err("Constraint '%s' has invalid value for " - PCMK_XA_INFLUENCE " (using default)", - coloc_id); - } else { - return (influence_i == 0)? pcmk__coloc_none : pcmk__coloc_influence; + if (pcmk__parse_bool(influence_s, &influence) == pcmk_rc_ok) { + return (influence? pcmk__coloc_influence : pcmk__coloc_none); } + pcmk__config_err("Constraint '%s' has invalid value for " + PCMK_XA_INFLUENCE " (using default)", + coloc_id); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_critical)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_critical)) { return pcmk__coloc_influence; } return pcmk__coloc_none; @@ -481,13 +481,13 @@ unpack_colocation_set(xmlNode *set, int score, const char *coloc_id, pcmk_resource_t *other = NULL; pcmk_resource_t *resource = NULL; const char *set_id = pcmk__xe_id(set); - const char *role = crm_element_value(set, PCMK_XA_ROLE); + const char *role = pcmk__xe_get(set, PCMK_XA_ROLE); bool with_previous = false; int local_score = score; bool sequential = false; uint32_t flags = pcmk__coloc_none; const char *xml_rsc_id = NULL; - const char *score_s = crm_element_value(set, PCMK_XA_SCORE); + const char *score_s = pcmk__xe_get(set, PCMK_XA_SCORE); if (score_s != NULL) { int rc = pcmk_parse_score(score_s, &local_score, 0); @@ -500,8 +500,8 @@ unpack_colocation_set(xmlNode *set, int score, const char *coloc_id, } } if (local_score == 0) { - crm_trace("Ignoring colocation '%s' for set '%s' because score is 0", - coloc_id, set_id); + pcmk__trace("Ignoring colocation '%s' for set '%s' because score is 0", + coloc_id, set_id); return; } @@ -509,8 +509,7 @@ unpack_colocation_set(xmlNode *set, int score, const char *coloc_id, * resources in a positive-score set are colocated with the previous or next * resource. */ - if (pcmk__str_eq(crm_element_value(set, PCMK__XA_ORDERING), - PCMK__VALUE_GROUP, + if (pcmk__str_eq(pcmk__xe_get(set, PCMK__XA_ORDERING), PCMK__VALUE_GROUP, pcmk__str_null_matches|pcmk__str_casei)) { with_previous = true; } else { @@ -630,17 +629,17 @@ colocate_rsc_sets(const char *id, const xmlNode *set1, const xmlNode *set2, pcmk_resource_t *rsc_2 = NULL; const char *xml_rsc_id = NULL; - const char *role_1 = crm_element_value(set1, PCMK_XA_ROLE); - const char *role_2 = crm_element_value(set2, PCMK_XA_ROLE); + const char *role_1 = pcmk__xe_get(set1, PCMK_XA_ROLE); + const char *role_2 = pcmk__xe_get(set2, PCMK_XA_ROLE); int rc = pcmk_rc_ok; bool sequential = false; uint32_t flags = pcmk__coloc_none; if (score == 0) { - crm_trace("Ignoring colocation '%s' between sets %s and %s " - "because score is 0", - id, pcmk__xe_id(set1), pcmk__xe_id(set2)); + pcmk__trace("Ignoring colocation '%s' between sets %s and %s because " + "score is 0", + id, pcmk__xe_id(set1), pcmk__xe_id(set2)); return; } @@ -797,12 +796,11 @@ unpack_simple_colocation(const xmlNode *xml_obj, const char *id, int score, { uint32_t flags = pcmk__coloc_none; - const char *dependent_id = crm_element_value(xml_obj, PCMK_XA_RSC); - const char *primary_id = crm_element_value(xml_obj, PCMK_XA_WITH_RSC); - const char *dependent_role = crm_element_value(xml_obj, PCMK_XA_RSC_ROLE); - const char *primary_role = crm_element_value(xml_obj, - PCMK_XA_WITH_RSC_ROLE); - const char *attr = crm_element_value(xml_obj, PCMK_XA_NODE_ATTRIBUTE); + const char *dependent_id = pcmk__xe_get(xml_obj, PCMK_XA_RSC); + const char *primary_id = pcmk__xe_get(xml_obj, PCMK_XA_WITH_RSC); + const char *dependent_role = pcmk__xe_get(xml_obj, PCMK_XA_RSC_ROLE); + const char *primary_role = pcmk__xe_get(xml_obj, PCMK_XA_WITH_RSC_ROLE); + const char *attr = pcmk__xe_get(xml_obj, PCMK_XA_NODE_ATTRIBUTE); pcmk_resource_t *primary = NULL; pcmk_resource_t *dependent = NULL; @@ -869,12 +867,12 @@ unpack_colocation_tags(xmlNode *xml_obj, xmlNode **expanded_xml, // Check whether there are any resource sets with template or tag references *expanded_xml = pcmk__expand_tags_in_sets(xml_obj, scheduler); if (*expanded_xml != NULL) { - crm_log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_COLOCATION); + pcmk__log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_COLOCATION); return pcmk_rc_ok; } - dependent_id = crm_element_value(xml_obj, PCMK_XA_RSC); - primary_id = crm_element_value(xml_obj, PCMK_XA_WITH_RSC); + dependent_id = pcmk__xe_get(xml_obj, PCMK_XA_RSC); + primary_id = pcmk__xe_get(xml_obj, PCMK_XA_WITH_RSC); if ((dependent_id == NULL) || (primary_id == NULL)) { return pcmk_rc_ok; } @@ -905,8 +903,8 @@ unpack_colocation_tags(xmlNode *xml_obj, xmlNode **expanded_xml, return pcmk_rc_unpack_error; } - dependent_role = crm_element_value(xml_obj, PCMK_XA_RSC_ROLE); - primary_role = crm_element_value(xml_obj, PCMK_XA_WITH_RSC_ROLE); + dependent_role = pcmk__xe_get(xml_obj, PCMK_XA_RSC_ROLE); + primary_role = pcmk__xe_get(xml_obj, PCMK_XA_WITH_RSC_ROLE); *expanded_xml = pcmk__xml_copy(NULL, xml_obj); @@ -925,7 +923,7 @@ unpack_colocation_tags(xmlNode *xml_obj, xmlNode **expanded_xml, /* Move PCMK_XA_RSC_ROLE into converted PCMK_XE_RESOURCE_SET as * PCMK_XA_ROLE */ - crm_xml_add(dependent_set, PCMK_XA_ROLE, dependent_role); + pcmk__xe_set(dependent_set, PCMK_XA_ROLE, dependent_role); pcmk__xe_remove_attr(*expanded_xml, PCMK_XA_RSC_ROLE); } any_sets = true; @@ -946,14 +944,14 @@ unpack_colocation_tags(xmlNode *xml_obj, xmlNode **expanded_xml, /* Move PCMK_XA_WITH_RSC_ROLE into converted PCMK_XE_RESOURCE_SET as * PCMK_XA_ROLE */ - crm_xml_add(primary_set, PCMK_XA_ROLE, primary_role); + pcmk__xe_set(primary_set, PCMK_XA_ROLE, primary_role); pcmk__xe_remove_attr(*expanded_xml, PCMK_XA_WITH_RSC_ROLE); } any_sets = true; } if (any_sets) { - crm_log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_COLOCATION); + pcmk__log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_COLOCATION); } else { pcmk__xml_free(*expanded_xml); *expanded_xml = NULL; @@ -979,7 +977,7 @@ pcmk__unpack_colocation(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) xmlNode *orig_xml = NULL; xmlNode *expanded_xml = NULL; - const char *id = crm_element_value(xml_obj, PCMK_XA_ID); + const char *id = pcmk__xe_get(xml_obj, PCMK_XA_ID); const char *score = NULL; const char *influence_s = NULL; @@ -998,7 +996,7 @@ pcmk__unpack_colocation(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) xml_obj = expanded_xml; } - score = crm_element_value(xml_obj, PCMK_XA_SCORE); + score = pcmk__xe_get(xml_obj, PCMK_XA_SCORE); if (score != NULL) { int rc = pcmk_parse_score(score, &score_i, 0); @@ -1008,7 +1006,7 @@ pcmk__unpack_colocation(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) return; } } - influence_s = crm_element_value(xml_obj, PCMK_XA_INFLUENCE); + influence_s = pcmk__xe_get(xml_obj, PCMK_XA_INFLUENCE); for (set = pcmk__xe_first_child(xml_obj, PCMK_XE_RESOURCE_SET, NULL, NULL); set != NULL; set = pcmk__xe_next(set, PCMK_XE_RESOURCE_SET)) { @@ -1076,9 +1074,9 @@ pcmk__colocation_has_influence(const pcmk__colocation_t *colocation, * This also avoids problematic scenarios where two containers want to * perpetually swap places. */ - if (pcmk_is_set(colocation->dependent->flags, - pcmk__rsc_remote_nesting_allowed) - && !pcmk_is_set(rsc->flags, pcmk__rsc_failed) + if (pcmk__is_set(colocation->dependent->flags, + pcmk__rsc_remote_nesting_allowed) + && !pcmk__is_set(rsc->flags, pcmk__rsc_failed) && pcmk__list_of_1(rsc->priv->active_nodes)) { return false; } @@ -1086,7 +1084,7 @@ pcmk__colocation_has_influence(const pcmk__colocation_t *colocation, /* The dependent in a colocation influences the primary's location * if the PCMK_XA_INFLUENCE option is true or the primary is not yet active. */ - return pcmk_is_set(colocation->flags, pcmk__coloc_influence) + return pcmk__is_set(colocation->flags, pcmk__coloc_influence) || (rsc->priv->active_nodes == NULL); } @@ -1103,12 +1101,12 @@ mark_action_blocked(pcmk_resource_t *rsc, const char *task, const pcmk_resource_t *reason) { GList *iter = NULL; - char *reason_text = crm_strdup_printf("colocation with %s", reason->id); + char *reason_text = pcmk__assert_asprintf("colocation with %s", reason->id); for (iter = rsc->priv->actions; iter != NULL; iter = iter->next) { pcmk_action_t *action = iter->data; - if (pcmk_is_set(action->flags, pcmk__action_runnable) + if (pcmk__is_set(action->flags, pcmk__action_runnable) && pcmk__str_eq(action->task, task, pcmk__str_none)) { pcmk__clear_action_flags(action, pcmk__action_runnable); @@ -1143,7 +1141,7 @@ pcmk__block_colocation_dependents(pcmk_action_t *action) pcmk_resource_t *rsc = NULL; bool is_start = false; - if (pcmk_is_set(action->flags, pcmk__action_runnable)) { + if (pcmk__is_set(action->flags, pcmk__action_runnable)) { return; // Only unrunnable actions block dependents } @@ -1172,16 +1170,16 @@ pcmk__block_colocation_dependents(pcmk_action_t *action) child_action = find_first_action(child->priv->actions, NULL, action->task, NULL); if ((child_action == NULL) - || pcmk_is_set(child_action->flags, pcmk__action_runnable)) { - crm_trace("Not blocking %s colocation dependents because " - "at least %s has runnable %s", - rsc->id, child->id, action->task); + || pcmk__is_set(child_action->flags, pcmk__action_runnable)) { + pcmk__trace("Not blocking %s colocation dependents because at " + "least %s has runnable %s", + rsc->id, child->id, action->task); return; // At least one child can reach desired role } } - crm_trace("Blocking %s colocation dependents due to unrunnable %s %s", - rsc->id, action->rsc->id, action->task); + pcmk__trace("Blocking %s colocation dependents due to unrunnable %s %s", + rsc->id, action->rsc->id, action->task); // Check each colocation where this resource is primary colocations = pcmk__with_this_colocations(rsc); @@ -1235,7 +1233,7 @@ pcmk__block_colocation_dependents(pcmk_action_t *action) static const pcmk_resource_t * get_resource_for_role(const pcmk_resource_t *rsc) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_replica_container)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_replica_container)) { const pcmk_resource_t *child = pe__get_rsc_in_container(rsc); if (child != NULL) { @@ -1274,7 +1272,7 @@ pcmk__colocation_affects(const pcmk_resource_t *dependent, pcmk__assert((dependent != NULL) && (primary != NULL) && (colocation != NULL)); - if (!preview && pcmk_is_set(primary->flags, pcmk__rsc_unassigned)) { + if (!preview && pcmk__is_set(primary->flags, pcmk__rsc_unassigned)) { // Primary resource has not been assigned yet, so we can't do anything return pcmk__coloc_affects_nothing; } @@ -1285,9 +1283,9 @@ pcmk__colocation_affects(const pcmk_resource_t *dependent, if ((colocation->dependent_role >= pcmk_role_unpromoted) && (dependent_role_rsc->priv->parent != NULL) - && pcmk_is_set(dependent_role_rsc->priv->parent->flags, - pcmk__rsc_promotable) - && !pcmk_is_set(dependent_role_rsc->flags, pcmk__rsc_unassigned)) { + && pcmk__is_set(dependent_role_rsc->priv->parent->flags, + pcmk__rsc_promotable) + && !pcmk__is_set(dependent_role_rsc->flags, pcmk__rsc_unassigned)) { /* This is a colocation by role, and the dependent is a promotable clone * that has already been assigned, so the colocation should now affect @@ -1296,7 +1294,7 @@ pcmk__colocation_affects(const pcmk_resource_t *dependent, return pcmk__coloc_affects_role; } - if (!preview && !pcmk_is_set(dependent->flags, pcmk__rsc_unassigned)) { + if (!preview && !pcmk__is_set(dependent->flags, pcmk__rsc_unassigned)) { /* The dependent resource has already been through assignment, so the * constraint no longer matters. */ @@ -1305,24 +1303,23 @@ pcmk__colocation_affects(const pcmk_resource_t *dependent, if ((colocation->dependent_role != pcmk_role_unknown) && (colocation->dependent_role != dependent_role_rsc->priv->next_role)) { - crm_trace("Skipping %scolocation '%s': dependent limited to %s role " - - "but %s next role is %s", - ((colocation->score < 0)? "anti-" : ""), - colocation->id, pcmk_role_text(colocation->dependent_role), - dependent_role_rsc->id, - pcmk_role_text(dependent_role_rsc->priv->next_role)); + pcmk__trace("Skipping %scolocation '%s': dependent limited to %s role " + "but %s next role is %s", + ((colocation->score < 0)? "anti-" : ""), + colocation->id, pcmk_role_text(colocation->dependent_role), + dependent_role_rsc->id, + pcmk_role_text(dependent_role_rsc->priv->next_role)); return pcmk__coloc_affects_nothing; } if ((colocation->primary_role != pcmk_role_unknown) && (colocation->primary_role != primary_role_rsc->priv->next_role)) { - crm_trace("Skipping %scolocation '%s': primary limited to %s role " - "but %s next role is %s", - ((colocation->score < 0)? "anti-" : ""), - colocation->id, pcmk_role_text(colocation->primary_role), - primary_role_rsc->id, - pcmk_role_text(primary_role_rsc->priv->next_role)); + pcmk__trace("Skipping %scolocation '%s': primary limited to %s role " + "but %s next role is %s", + ((colocation->score < 0)? "anti-" : ""), + colocation->id, pcmk_role_text(colocation->primary_role), + primary_role_rsc->id, + pcmk_role_text(primary_role_rsc->priv->next_role)); return pcmk__coloc_affects_nothing; } @@ -1546,7 +1543,7 @@ best_node_score_matching_attr(const pcmk__colocation_t *colocation, const char *best_node = NULL; if ((colocation != NULL) && (rsc == colocation->dependent) - && pcmk_is_set(colocation->flags, pcmk__coloc_explicit) + && pcmk__is_set(colocation->flags, pcmk__coloc_explicit) && pcmk__is_group(rsc->priv->parent) && (rsc != rsc->priv->parent->priv->children->data)) { /* The resource is a user-configured colocation's explicit dependent, @@ -1589,12 +1586,12 @@ best_node_score_matching_attr(const pcmk__colocation_t *colocation, if (!pcmk__str_eq(attr, CRM_ATTR_UNAME, pcmk__str_none)) { if (best_node == NULL) { - crm_info("No allowed node for %s matches node attribute %s=%s", - rsc->id, attr, value); + pcmk__info("No allowed node for %s matches node attribute %s=%s", + rsc->id, attr, value); } else { - crm_info("Allowed node %s for %s had best score (%d) " - "of those matching node attribute %s=%s", - best_node, rsc->id, best_score, attr, value); + pcmk__info("Allowed node %s for %s had best score (%d) of those " + "matching node attribute %s=%s", + best_node, rsc->id, best_score, attr, value); } } @@ -1709,18 +1706,18 @@ add_node_scores_matching_attr(GHashTable *nodes, if ((colocation->primary->priv->stickiness >= -score) || !pcmk__colocation_has_influence(colocation, NULL) || !allowed_on_one(colocation->dependent)) { - crm_trace("%s: Filtering %d + %f * %d " - "(double negative disallowed)", - pcmk__node_name(node), node->assign->score, factor, - score); + pcmk__trace("%s: Filtering %d + %f * %d " + "(double negative disallowed)", + pcmk__node_name(node), node->assign->score, factor, + score); continue; } } if (node->assign->score == INFINITY_HACK) { - crm_trace("%s: Filtering %d + %f * %d (node was marked unusable)", - pcmk__node_name(node), node->assign->score, factor, - score); + pcmk__trace("%s: Filtering %d + %f * %d (node was marked unusable)", + pcmk__node_name(node), node->assign->score, factor, + score); continue; } @@ -1744,23 +1741,23 @@ add_node_scores_matching_attr(GHashTable *nodes, new_score = pcmk__add_scores(delta, node->assign->score); if (only_positive && (new_score < 0) && (node->assign->score > 0)) { - crm_trace("%s: Filtering %d + %f * %d = %d " - "(negative disallowed, marking node unusable)", - pcmk__node_name(node), node->assign->score, factor, score, - new_score); + pcmk__trace("%s: Filtering %d + %f * %d = %d " + "(negative disallowed, marking node unusable)", + pcmk__node_name(node), node->assign->score, factor, + score, new_score); node->assign->score = INFINITY_HACK; continue; } if (only_positive && (new_score < 0) && (node->assign->score == 0)) { - crm_trace("%s: Filtering %d + %f * %d = %d (negative disallowed)", - pcmk__node_name(node), node->assign->score, factor, score, - new_score); + pcmk__trace("%s: Filtering %d + %f * %d = %d (negative disallowed)", + pcmk__node_name(node), node->assign->score, factor, + score, new_score); continue; } - crm_trace("%s: %d + %f * %d = %d", pcmk__node_name(node), - node->assign->score, factor, score, new_score); + pcmk__trace("%s: %d + %f * %d = %d", pcmk__node_name(node), + node->assign->score, factor, score, new_score); node->assign->score = new_score; } } @@ -1814,7 +1811,7 @@ pcmk__add_colocated_node_scores(pcmk_resource_t *source_rsc, } // Avoid infinite recursion - if (pcmk_is_set(source_rsc->flags, pcmk__rsc_updating_nodes)) { + if (pcmk__is_set(source_rsc->flags, pcmk__rsc_updating_nodes)) { pcmk__rsc_info(source_rsc, "%s: Breaking dependency loop at %s", log_id, source_rsc->id); return; @@ -1825,7 +1822,7 @@ pcmk__add_colocated_node_scores(pcmk_resource_t *source_rsc, work = pcmk__copy_node_table(source_rsc->priv->allowed_nodes); target_rsc = source_rsc; } else { - const bool pos = pcmk_is_set(flags, pcmk__coloc_select_nonnegative); + const bool pos = pcmk__is_set(flags, pcmk__coloc_select_nonnegative); pcmk__rsc_trace(source_rsc, "%s: Merging %s scores from %s (at %.6f)", log_id, (pos? "positive" : "all"), source_rsc->id, factor); @@ -1842,7 +1839,7 @@ pcmk__add_colocated_node_scores(pcmk_resource_t *source_rsc, if (pcmk__any_node_available(work)) { GList *colocations = NULL; - if (pcmk_is_set(flags, pcmk__coloc_select_this_with)) { + if (pcmk__is_set(flags, pcmk__coloc_select_this_with)) { colocations = pcmk__this_with_colocations(source_rsc); pcmk__rsc_trace(source_rsc, "Checking additional %d optional '%s with' " @@ -1864,7 +1861,7 @@ pcmk__add_colocated_node_scores(pcmk_resource_t *source_rsc, float other_factor = factor * constraint->score / (float) PCMK_SCORE_INFINITY; - if (pcmk_is_set(flags, pcmk__coloc_select_this_with)) { + if (pcmk__is_set(flags, pcmk__coloc_select_this_with)) { other = constraint->primary; } else if (!pcmk__colocation_has_influence(constraint, NULL)) { continue; @@ -1886,7 +1883,7 @@ pcmk__add_colocated_node_scores(pcmk_resource_t *source_rsc, } g_list_free(colocations); - } else if (pcmk_is_set(flags, pcmk__coloc_select_active)) { + } else if (pcmk__is_set(flags, pcmk__coloc_select_active)) { pcmk__rsc_info(source_rsc, "%s: Rolling back optional scores from %s", log_id, source_rsc->id); g_hash_table_destroy(work); @@ -1895,7 +1892,7 @@ pcmk__add_colocated_node_scores(pcmk_resource_t *source_rsc, } - if (pcmk_is_set(flags, pcmk__coloc_select_nonnegative)) { + if (pcmk__is_set(flags, pcmk__coloc_select_nonnegative)) { pcmk_node_t *node = NULL; GHashTableIter iter; diff --git a/lib/pacemaker/pcmk_sched_constraints.c b/lib/pacemaker/pcmk_sched_constraints.c index bbf1bd9ae40..213f251c6aa 100644 --- a/lib/pacemaker/pcmk_sched_constraints.c +++ b/lib/pacemaker/pcmk_sched_constraints.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -45,7 +45,7 @@ pcmk__unpack_constraints(pcmk_scheduler_t *scheduler) NULL); xml_obj != NULL; xml_obj = pcmk__xe_next(xml_obj, NULL)) { - const char *id = crm_element_value(xml_obj, PCMK_XA_ID); + const char *id = pcmk__xe_get(xml_obj, PCMK_XA_ID); const char *tag = (const char *) xml_obj->name; if (id == NULL) { @@ -54,7 +54,7 @@ pcmk__unpack_constraints(pcmk_scheduler_t *scheduler) continue; } - crm_trace("Unpacking %s constraint '%s'", tag, id); + pcmk__trace("Unpacking %s constraint '%s'", tag, id); if (pcmk__str_eq(PCMK_XE_RSC_ORDER, tag, pcmk__str_none)) { pcmk__unpack_ordering(xml_obj, scheduler); @@ -90,12 +90,12 @@ pcmk__find_constraint_resource(GList *rsc_list, const char *id) if (!pcmk__str_eq(match->id, id, pcmk__str_none)) { /* We found an instance of a clone instead */ match = uber_parent(match); - crm_debug("Found %s for %s", match->id, id); + pcmk__debug("Found %s for %s", match->id, id); } return match; } } - crm_trace("No match for %s", id); + pcmk__trace("No match for %s", id); return NULL; } @@ -120,7 +120,7 @@ find_constraint_tag(const pcmk_scheduler_t *scheduler, const char *id, if (g_hash_table_lookup_extended(scheduler->priv->templates, id, NULL, (gpointer *) tag)) { if (*tag == NULL) { - crm_notice("No resource is derived from template '%s'", id); + pcmk__notice("No resource is derived from template '%s'", id); return false; } return true; @@ -130,7 +130,7 @@ find_constraint_tag(const pcmk_scheduler_t *scheduler, const char *id, if (g_hash_table_lookup_extended(scheduler->priv->tags, id, NULL, (gpointer *) tag)) { if (*tag == NULL) { - crm_notice("No resource is tagged with '%s'", id); + pcmk__notice("No resource is tagged with '%s'", id); return false; } return true; @@ -296,7 +296,7 @@ pcmk__expand_tags_in_sets(xmlNode *xml_obj, const pcmk_scheduler_t *scheduler) xmlNode *new_ref = pcmk__xe_create(set, PCMK_XE_RESOURCE_REF); - crm_xml_add(new_ref, PCMK_XA_ID, ref_id); + pcmk__xe_set(new_ref, PCMK_XA_ID, ref_id); xmlAddNextSibling(last_ref, new_ref); last_ref = new_ref; @@ -368,7 +368,7 @@ pcmk__tag_to_set(xmlNode *xml_obj, xmlNode **rsc_set, const char *attr, return false; } - id = crm_element_value(xml_obj, attr); + id = pcmk__xe_get(xml_obj, attr); if (id == NULL) { return true; } @@ -384,14 +384,14 @@ pcmk__tag_to_set(xmlNode *xml_obj, xmlNode **rsc_set, const char *attr, * containing the resources derived from or tagged with it. */ *rsc_set = pcmk__xe_create(xml_obj, PCMK_XE_RESOURCE_SET); - crm_xml_add(*rsc_set, PCMK_XA_ID, id); + pcmk__xe_set(*rsc_set, PCMK_XA_ID, id); for (GList *iter = tag->refs; iter != NULL; iter = iter->next) { const char *obj_ref = iter->data; xmlNode *rsc_ref = NULL; rsc_ref = pcmk__xe_create(*rsc_set, PCMK_XE_RESOURCE_REF); - crm_xml_add(rsc_ref, PCMK_XA_ID, obj_ref); + pcmk__xe_set(rsc_ref, PCMK_XA_ID, obj_ref); } // Set PCMK_XA_SEQUENTIAL=PCMK_VALUE_FALSE for the PCMK_XE_RESOURCE_SET @@ -405,10 +405,10 @@ pcmk__tag_to_set(xmlNode *xml_obj, xmlNode **rsc_set, const char *attr, xmlNode *rsc_ref = NULL; *rsc_set = pcmk__xe_create(xml_obj, PCMK_XE_RESOURCE_SET); - crm_xml_add(*rsc_set, PCMK_XA_ID, id); + pcmk__xe_set(*rsc_set, PCMK_XA_ID, id); rsc_ref = pcmk__xe_create(*rsc_set, PCMK_XE_RESOURCE_REF); - crm_xml_add(rsc_ref, PCMK_XA_ID, id); + pcmk__xe_set(rsc_ref, PCMK_XA_ID, id); } else { return true; @@ -431,7 +431,7 @@ pcmk__tag_to_set(xmlNode *xml_obj, xmlNode **rsc_set, const char *attr, void pcmk__create_internal_constraints(pcmk_scheduler_t *scheduler) { - crm_trace("Create internal constraints"); + pcmk__trace("Create internal constraints"); for (GList *iter = scheduler->priv->resources; iter != NULL; iter = iter->next) { diff --git a/lib/pacemaker/pcmk_sched_fencing.c b/lib/pacemaker/pcmk_sched_fencing.c index 318d5926874..741a03c8964 100644 --- a/lib/pacemaker/pcmk_sched_fencing.c +++ b/lib/pacemaker/pcmk_sched_fencing.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -130,7 +130,7 @@ order_stop_vs_fencing(pcmk_resource_t *rsc, pcmk_action_t *stonith_op) * ordered after fencing, even if the resource does not require fencing, * because guest node "fencing" is actually just a resource stop. */ - if (pcmk_is_set(rsc->flags, pcmk__rsc_needs_fencing) + if (pcmk__is_set(rsc->flags, pcmk__rsc_needs_fencing) || pcmk__is_guest_or_bundle_node(target)) { order_implicit = true; @@ -167,17 +167,18 @@ order_stop_vs_fencing(pcmk_resource_t *rsc, pcmk_action_t *stonith_op) order_actions(stonith_op, parent_stop, pcmk__ar_guest_allowed); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { - crm_notice("Stop of failed resource %s is implicit %s %s is fenced", - rsc->id, (order_implicit? "after" : "because"), - pcmk__node_name(target)); + if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { + pcmk__notice("Stop of failed resource %s is implicit %s %s is " + "fenced", + rsc->id, (order_implicit? "after" : "because"), + pcmk__node_name(target)); } else { - crm_info("%s is implicit %s %s is fenced", - action->uuid, (order_implicit? "after" : "because"), - pcmk__node_name(target)); + pcmk__info("%s is implicit %s %s is fenced", action->uuid, + (order_implicit? "after" : "because"), + pcmk__node_name(target)); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_notify)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_notify)) { pe__order_notifs_after_fencing(action, rsc, stonith_op); } @@ -200,8 +201,8 @@ order_stop_vs_fencing(pcmk_resource_t *rsc, pcmk_action_t *stonith_op) * pcmk__update_action_for_orderings() and use this block for healthy * resources instead of the above. */ - crm_info("Moving healthy resource %s off %s before fencing", - rsc->id, pcmk__node_name(node)); + pcmk__info("Moving healthy resource %s off %s before fencing", + rsc->id, pcmk__node_name(node)); pcmk__new_ordering(rsc, stop_key(rsc), NULL, NULL, strdup(PCMK_ACTION_STONITH), stonith_op, pcmk__ar_ordered, rsc->private->scheduler); @@ -217,9 +218,9 @@ order_stop_vs_fencing(pcmk_resource_t *rsc, pcmk_action_t *stonith_op) pcmk_action_t *action = iter->data; if (!(action->node->details->online) || action->node->details->unclean - || pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + || pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { pcmk__rsc_info(rsc, "Demote of failed resource %s is implicit " "after %s is fenced", @@ -268,7 +269,7 @@ rsc_stonith_ordering(pcmk_resource_t *rsc, pcmk_action_t *stonith_op) rsc_stonith_ordering(child_rsc, stonith_op); } - } else if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + } else if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__rsc_trace(rsc, "Skipping fencing constraints for unmanaged resource: " "%s", rsc->id); @@ -320,10 +321,10 @@ pcmk__order_vs_unfence(const pcmk_resource_t *rsc, pcmk_node_t *node, * only quorum. However, fence agents that unfence often don't have enough * information to even probe or start unless the node is first unfenced. */ - if ((pcmk_is_set(rsc->flags, pcmk__rsc_fence_device) - && pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_enable_unfencing)) - || pcmk_is_set(rsc->flags, pcmk__rsc_needs_unfencing)) { + if ((pcmk__is_set(rsc->flags, pcmk__rsc_fence_device) + && pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_enable_unfencing)) + || pcmk__is_set(rsc->flags, pcmk__rsc_needs_unfencing)) { /* Start with an optional ordering. Requiring unfencing would result in * the node being unfenced, and all its resources being stopped, @@ -336,8 +337,8 @@ pcmk__order_vs_unfence(const pcmk_resource_t *rsc, pcmk_node_t *node, if (!pcmk__node_unfenced(node)) { // But unfencing is required if it has never been done - char *reason = crm_strdup_printf("required by %s %s", - rsc->id, action->task); + char *reason = pcmk__assert_asprintf("required by %s %s", + rsc->id, action->task); trigger_unfencing(NULL, node, reason, NULL, node->priv->scheduler); @@ -395,14 +396,14 @@ pcmk__fence_guest(pcmk_node_t *node) * it is restarted, so we always order pseudo-fencing after stop, not start * (even though start might be closer to what is done for a real reboot). */ - if ((stop != NULL) && pcmk_is_set(stop->flags, pcmk__action_pseudo)) { + if ((stop != NULL) && pcmk__is_set(stop->flags, pcmk__action_pseudo)) { pcmk_action_t *parent_stonith_op = pe_fence_op(stop->node, NULL, FALSE, NULL, FALSE, node->priv->scheduler); - crm_info("Implying guest %s is down (action %d) after %s fencing", - pcmk__node_name(node), stonith_op->id, - pcmk__node_name(stop->node)); + pcmk__info("Implying guest %s is down (action %d) after %s fencing", + pcmk__node_name(node), stonith_op->id, + pcmk__node_name(stop->node)); order_actions(parent_stonith_op, stonith_op, pcmk__ar_unrunnable_first_blocks |pcmk__ar_first_implies_then); @@ -411,10 +412,10 @@ pcmk__fence_guest(pcmk_node_t *node) order_actions(stop, stonith_op, pcmk__ar_unrunnable_first_blocks |pcmk__ar_first_implies_then); - crm_info("Implying guest %s is down (action %d) " - "after launcher %s is stopped (action %d)", - pcmk__node_name(node), stonith_op->id, - launcher->id, stop->id); + pcmk__info("Implying guest %s is down (action %d) after launcher %s is " + "stopped (action %d)", + pcmk__node_name(node), stonith_op->id, launcher->id, + stop->id); } else { /* If we're fencing the guest node but there's no stop for the guest * resource, we must think the guest is already stopped. However, we may @@ -428,15 +429,15 @@ pcmk__fence_guest(pcmk_node_t *node) if (stop) { order_actions(stop, stonith_op, pcmk__ar_ordered); - crm_info("Implying guest %s is down (action %d) " - "after connection is stopped (action %d)", - pcmk__node_name(node), stonith_op->id, stop->id); + pcmk__info("Implying guest %s is down (action %d) after connection " + "is stopped (action %d)", + pcmk__node_name(node), stonith_op->id, stop->id); } else { /* Not sure why we're fencing, but everything must already be * cleanly stopped. */ - crm_info("Implying guest %s is down (action %d) ", - pcmk__node_name(node), stonith_op->id); + pcmk__info("Implying guest %s is down (action %d)", + pcmk__node_name(node), stonith_op->id); } } @@ -478,8 +479,8 @@ pcmk__order_restart_vs_unfence(gpointer data, gpointer user_data) pcmk_action_t *unfence = pe_fence_op(node, PCMK_ACTION_ON, true, NULL, false, rsc->priv->scheduler); - crm_debug("Ordering any stops of %s before %s, and any starts after", - rsc->id, unfence->uuid); + pcmk__debug("Ordering any stops of %s before %s, and any starts after", + rsc->id, unfence->uuid); /* * It would be more efficient to order clone resources once, diff --git a/lib/pacemaker/pcmk_sched_group.c b/lib/pacemaker/pcmk_sched_group.c index f0353b479c9..2b0a120c379 100644 --- a/lib/pacemaker/pcmk_sched_group.c +++ b/lib/pacemaker/pcmk_sched_group.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,7 @@ #include // QB_ABS() +#include // PCMK_SCORE_INFINITY #include #include @@ -45,10 +46,10 @@ pcmk__group_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, pcmk__assert(pcmk__is_group(rsc)); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { return rsc->priv->assigned_node; // Assignment already done } - if (pcmk_is_set(rsc->flags, pcmk__rsc_assigning)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_assigning)) { pcmk__rsc_debug(rsc, "Assignment dependency loop detected involving %s", rsc->id); return NULL; @@ -64,8 +65,8 @@ pcmk__group_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, first_member = (pcmk_resource_t *) rsc->priv->children->data; rsc->priv->orig_role = first_member->priv->orig_role; - pe__show_node_scores(!pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_output_scores), + pe__show_node_scores(!pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_output_scores), rsc, __func__, rsc->priv->allowed_nodes, rsc->priv->scheduler); @@ -140,8 +141,8 @@ pcmk__group_create_actions(pcmk_resource_t *rsc) create_group_pseudo_op(rsc, PCMK_ACTION_RUNNING); create_group_pseudo_op(rsc, PCMK_ACTION_STOP); create_group_pseudo_op(rsc, PCMK_ACTION_STOPPED); - if (crm_is_true(g_hash_table_lookup(rsc->priv->meta, - PCMK_META_PROMOTABLE))) { + if (pcmk__is_true(g_hash_table_lookup(rsc->priv->meta, + PCMK_META_PROMOTABLE))) { create_group_pseudo_op(rsc, PCMK_ACTION_DEMOTE); create_group_pseudo_op(rsc, PCMK_ACTION_DEMOTED); create_group_pseudo_op(rsc, PCMK_ACTION_PROMOTE); @@ -192,7 +193,7 @@ member_internal_constraints(gpointer data, gpointer user_data) } else if (member_data->colocated) { uint32_t flags = pcmk__coloc_none; - if (pcmk_is_set(member->flags, pcmk__rsc_critical)) { + if (pcmk__is_set(member->flags, pcmk__rsc_critical)) { flags |= pcmk__coloc_influence; } @@ -344,7 +345,7 @@ pcmk__group_internal_constraints(pcmk_resource_t *rsc) member_data.ordered = pe__group_flag_is_set(rsc, pcmk__group_ordered); member_data.colocated = pe__group_flag_is_set(rsc, pcmk__group_colocated); - member_data.promotable = pcmk_is_set(top->flags, pcmk__rsc_promotable); + member_data.promotable = pcmk__is_set(top->flags, pcmk__rsc_promotable); g_list_foreach(rsc->priv->children, member_internal_constraints, &member_data); } @@ -452,7 +453,7 @@ colocate_with_group(pcmk_resource_t *dependent, const pcmk_resource_t *primary, "Processing colocation %s (%s with group %s) for primary", colocation->id, dependent->id, primary->id); - if (pcmk_is_set(primary->flags, pcmk__rsc_unassigned)) { + if (pcmk__is_set(primary->flags, pcmk__rsc_unassigned)) { return 0; } @@ -576,8 +577,8 @@ pcmk__group_action_flags(pcmk_action_t *action, const pcmk_node_t *node) node); // Group action is mandatory if any member action is - if (pcmk_is_set(flags, pcmk__action_optional) - && !pcmk_is_set(member_flags, pcmk__action_optional)) { + if (pcmk__is_set(flags, pcmk__action_optional) + && !pcmk__is_set(member_flags, pcmk__action_optional)) { pcmk__rsc_trace(action->rsc, "%s is mandatory because %s is", action->uuid, member_action->uuid); pcmk__clear_raw_action_flags(flags, "group action", @@ -587,8 +588,8 @@ pcmk__group_action_flags(pcmk_action_t *action, const pcmk_node_t *node) // Group action is unrunnable if any member action is if (!pcmk__str_eq(task_s, action->task, pcmk__str_none) - && pcmk_is_set(flags, pcmk__action_runnable) - && !pcmk_is_set(member_flags, pcmk__action_runnable)) { + && pcmk__is_set(flags, pcmk__action_runnable) + && !pcmk__is_set(member_flags, pcmk__action_runnable)) { pcmk__rsc_trace(action->rsc, "%s is unrunnable because %s is", action->uuid, member_action->uuid); @@ -887,10 +888,10 @@ pcmk__group_with_colocations(const pcmk_resource_t *rsc, break; // We've seen all earlier members, and none are unmanaged } - if (!pcmk_is_set(member->flags, pcmk__rsc_managed)) { - crm_trace("Adding mandatory '%s with' colocations to list for " - "member %s because earlier member %s is unmanaged", - rsc->id, orig_rsc->id, member->id); + if (!pcmk__is_set(member->flags, pcmk__rsc_managed)) { + pcmk__trace("Adding mandatory '%s with' colocations to list for " + "member %s because earlier member %s is unmanaged", + rsc->id, orig_rsc->id, member->id); for (const GList *cons_iter = rsc->priv->this_with_colocations; cons_iter != NULL; cons_iter = cons_iter->next) { const pcmk__colocation_t *colocation = NULL; @@ -954,7 +955,7 @@ pcmk__group_add_colocated_node_scores(pcmk_resource_t *source_rsc, } // Avoid infinite recursion - if (pcmk_is_set(source_rsc->flags, pcmk__rsc_updating_nodes)) { + if (pcmk__is_set(source_rsc->flags, pcmk__rsc_updating_nodes)) { pcmk__rsc_info(source_rsc, "%s: Breaking dependency loop at %s", log_id, source_rsc->id); return; @@ -1001,7 +1002,7 @@ pcmk__group_add_utilization(const pcmk_resource_t *rsc, pcmk__assert((orig_rsc != NULL) && (utilization != NULL) && pcmk__is_group(rsc)); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { return; } @@ -1016,7 +1017,7 @@ pcmk__group_add_utilization(const pcmk_resource_t *rsc, member = (pcmk_resource_t *) iter->data; - if (pcmk_is_set(member->flags, pcmk__rsc_unassigned) + if (pcmk__is_set(member->flags, pcmk__rsc_unassigned) && (g_list_find(all_rscs, member) == NULL)) { member->priv->cmds->add_utilization(member, orig_rsc, all_rscs, utilization); @@ -1027,7 +1028,7 @@ pcmk__group_add_utilization(const pcmk_resource_t *rsc, // Just add first member's utilization member = (pcmk_resource_t *) rsc->priv->children->data; if ((member != NULL) - && pcmk_is_set(member->flags, pcmk__rsc_unassigned) + && pcmk__is_set(member->flags, pcmk__rsc_unassigned) && (g_list_find(all_rscs, member) == NULL)) { member->priv->cmds->add_utilization(member, orig_rsc, all_rscs, diff --git a/lib/pacemaker/pcmk_sched_instances.c b/lib/pacemaker/pcmk_sched_instances.c index f2bc1a432cd..e759996b805 100644 --- a/lib/pacemaker/pcmk_sched_instances.c +++ b/lib/pacemaker/pcmk_sched_instances.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,6 +12,7 @@ */ #include +#include // PCMK_SCORE_INFINITY #include #include #include "libpacemaker_private.h" @@ -32,7 +33,7 @@ can_run_instance(const pcmk_resource_t *instance, const pcmk_node_t *node, { pcmk_node_t *allowed_node = NULL; - if (pcmk_is_set(instance->flags, pcmk__rsc_removed)) { + if (pcmk__is_set(instance->flags, pcmk__rsc_removed)) { pcmk__rsc_trace(instance, "%s cannot run on %s: orphaned", instance->id, pcmk__node_name(node)); return false; @@ -47,8 +48,8 @@ can_run_instance(const pcmk_resource_t *instance, const pcmk_node_t *node, allowed_node = pcmk__top_allowed_node(instance, node); if (allowed_node == NULL) { - crm_warn("%s cannot run on %s: node not allowed", - instance->id, pcmk__node_name(node)); + pcmk__warn("%s cannot run on %s: node not allowed", instance->id, + pcmk__node_name(node)); return false; } @@ -222,15 +223,17 @@ cmp_instance_by_colocation(const pcmk_resource_t *instance1, // Compare nodes by updated scores if (node1->assign->score < node2->assign->score) { - crm_trace("Assign %s (%d on %s) after %s (%d on %s)", - instance1->id, node1->assign->score, pcmk__node_name(node1), - instance2->id, node2->assign->score, pcmk__node_name(node2)); + pcmk__trace("Assign %s (%d on %s) after %s (%d on %s)", + instance1->id, node1->assign->score, pcmk__node_name(node1), + instance2->id, node2->assign->score, + pcmk__node_name(node2)); rc = 1; } else if (node1->assign->score > node2->assign->score) { - crm_trace("Assign %s (%d on %s) before %s (%d on %s)", - instance1->id, node1->assign->score, pcmk__node_name(node1), - instance2->id, node2->assign->score, pcmk__node_name(node2)); + pcmk__trace("Assign %s (%d on %s) before %s (%d on %s)", + instance1->id, node1->assign->score, pcmk__node_name(node1), + instance2->id, node2->assign->score, + pcmk__node_name(node2)); rc = -1; } @@ -250,7 +253,7 @@ cmp_instance_by_colocation(const pcmk_resource_t *instance1, static bool did_fail(const pcmk_resource_t *rsc) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { return true; } @@ -375,15 +378,15 @@ pcmk__cmp_instance(gconstpointer a, gconstpointer b) */ if ((nnodes1 > 0) && (nnodes2 > 0)) { if (nnodes1 < nnodes2) { - crm_trace("Assign %s (active on %d) before %s (active on %d): " - "less multiply active", - instance1->id, nnodes1, instance2->id, nnodes2); + pcmk__trace("Assign %s (active on %d) before %s (active on %d): " + "less multiply active", + instance1->id, nnodes1, instance2->id, nnodes2); return -1; } else if (nnodes1 > nnodes2) { - crm_trace("Assign %s (active on %d) after %s (active on %d): " - "more multiply active", - instance1->id, nnodes1, instance2->id, nnodes2); + pcmk__trace("Assign %s (active on %d) after %s (active on %d): " + "more multiply active", + instance1->id, nnodes1, instance2->id, nnodes2); return 1; } } @@ -394,42 +397,43 @@ pcmk__cmp_instance(gconstpointer a, gconstpointer b) can1 = node_is_allowed(instance1, &node1); can2 = node_is_allowed(instance2, &node2); if (can1 && !can2) { - crm_trace("Assign %s before %s: not active on a disallowed node", - instance1->id, instance2->id); + pcmk__trace("Assign %s before %s: not active on a disallowed node", + instance1->id, instance2->id); return -1; } else if (!can1 && can2) { - crm_trace("Assign %s after %s: active on a disallowed node", - instance1->id, instance2->id); + pcmk__trace("Assign %s after %s: active on a disallowed node", + instance1->id, instance2->id); return 1; } // Prefer instance with higher configured priority if (instance1->priv->priority > instance2->priv->priority) { - crm_trace("Assign %s before %s: priority (%d > %d)", - instance1->id, instance2->id, - instance1->priv->priority, instance2->priv->priority); + pcmk__trace("Assign %s before %s: priority (%d > %d)", + instance1->id, instance2->id, + instance1->priv->priority, instance2->priv->priority); return -1; } else if (instance1->priv->priority < instance2->priv->priority) { - crm_trace("Assign %s after %s: priority (%d < %d)", - instance1->id, instance2->id, - instance1->priv->priority, instance2->priv->priority); + pcmk__trace("Assign %s after %s: priority (%d < %d)", + instance1->id, instance2->id, + instance1->priv->priority, instance2->priv->priority); return 1; } // Prefer active instance if ((node1 == NULL) && (node2 == NULL)) { - crm_trace("No assignment preference for %s vs. %s: inactive", - instance1->id, instance2->id); + pcmk__trace("No assignment preference for %s vs. %s: inactive", + instance1->id, instance2->id); return 0; } else if (node1 == NULL) { - crm_trace("Assign %s after %s: active", instance1->id, instance2->id); + pcmk__trace("Assign %s after %s: active", instance1->id, instance2->id); return 1; } else if (node2 == NULL) { - crm_trace("Assign %s before %s: active", instance1->id, instance2->id); + pcmk__trace("Assign %s before %s: active", instance1->id, + instance2->id); return -1; } @@ -437,13 +441,13 @@ pcmk__cmp_instance(gconstpointer a, gconstpointer b) can1 = pcmk__node_available(node1, false, false); can2 = pcmk__node_available(node2, false, false); if (can1 && !can2) { - crm_trace("Assign %s before %s: current node can run resources", - instance1->id, instance2->id); + pcmk__trace("Assign %s before %s: current node can run resources", + instance1->id, instance2->id); return -1; } else if (!can1 && can2) { - crm_trace("Assign %s after %s: current node can't run resources", - instance1->id, instance2->id); + pcmk__trace("Assign %s after %s: current node can't run resources", + instance1->id, instance2->id); return 1; } @@ -451,31 +455,32 @@ pcmk__cmp_instance(gconstpointer a, gconstpointer b) node1 = pcmk__top_allowed_node(instance1, node1); node2 = pcmk__top_allowed_node(instance2, node2); if ((node1 == NULL) && (node2 == NULL)) { - crm_trace("No assignment preference for %s vs. %s: " - "parent not allowed on either instance's current node", - instance1->id, instance2->id); + pcmk__trace("No assignment preference for %s vs. %s: " + "parent not allowed on either instance's current node", + instance1->id, instance2->id); return 0; } else if (node1 == NULL) { - crm_trace("Assign %s after %s: parent not allowed on current node", - instance1->id, instance2->id); + pcmk__trace("Assign %s after %s: parent not allowed on current node", + instance1->id, instance2->id); return 1; } else if (node2 == NULL) { - crm_trace("Assign %s before %s: parent allowed on current node", - instance1->id, instance2->id); + pcmk__trace("Assign %s before %s: parent allowed on current node", + instance1->id, instance2->id); return -1; } // Prefer instance whose current node is running fewer other instances if (node1->assign->count < node2->assign->count) { - crm_trace("Assign %s before %s: fewer active instances on current node", - instance1->id, instance2->id); + pcmk__trace("Assign %s before %s: fewer active instances on current " + "node", + instance1->id, instance2->id); return -1; } else if (node1->assign->count > node2->assign->count) { - crm_trace("Assign %s after %s: more active instances on current node", - instance1->id, instance2->id); + pcmk__trace("Assign %s after %s: more active instances on current node", + instance1->id, instance2->id); return 1; } @@ -483,12 +488,12 @@ pcmk__cmp_instance(gconstpointer a, gconstpointer b) can1 = did_fail(instance1); can2 = did_fail(instance2); if (!can1 && can2) { - crm_trace("Assign %s before %s: not failed", - instance1->id, instance2->id); + pcmk__trace("Assign %s before %s: not failed", + instance1->id, instance2->id); return -1; } else if (can1 && !can2) { - crm_trace("Assign %s after %s: failed", - instance1->id, instance2->id); + pcmk__trace("Assign %s after %s: failed", + instance1->id, instance2->id); return 1; } @@ -501,14 +506,14 @@ pcmk__cmp_instance(gconstpointer a, gconstpointer b) // Prefer instance with lower instance number rc = pcmk__cmp_instance_number(instance1, instance2); if (rc < 0) { - crm_trace("Assign %s before %s: instance number", - instance1->id, instance2->id); + pcmk__trace("Assign %s before %s: instance number", + instance1->id, instance2->id); } else if (rc > 0) { - crm_trace("Assign %s after %s: instance number", - instance1->id, instance2->id); + pcmk__trace("Assign %s after %s: instance number", + instance1->id, instance2->id); } else { - crm_trace("No assignment preference for %s vs. %s", - instance1->id, instance2->id); + pcmk__trace("No assignment preference for %s vs. %s", + instance1->id, instance2->id); } return rc; } @@ -540,7 +545,7 @@ increment_parent_count(pcmk_resource_t *instance, * shouldn't be possible if the resource is managed, and we won't be * able to limit the number of instances assigned to the node. */ - CRM_LOG_ASSERT(!pcmk_is_set(instance->flags, pcmk__rsc_managed)); + CRM_LOG_ASSERT(!pcmk__is_set(instance->flags, pcmk__rsc_managed)); } else { allowed->assign->count++; @@ -568,7 +573,7 @@ assign_instance(pcmk_resource_t *instance, const pcmk_node_t *prefer, pcmk__rsc_trace(instance, "Assigning %s (preferring %s)", instance->id, ((prefer == NULL)? "no node" : prefer->priv->name)); - if (pcmk_is_set(instance->flags, pcmk__rsc_assigning)) { + if (pcmk__is_set(instance->flags, pcmk__rsc_assigning)) { pcmk__rsc_debug(instance, "Assignment loop detected involving %s colocations", instance->id); @@ -750,8 +755,8 @@ preferred_node(const pcmk_resource_t *instance, int optimal_per_node) // Check whether instance is active, healthy, and not yet assigned if ((instance->priv->active_nodes == NULL) - || !pcmk_is_set(instance->flags, pcmk__rsc_unassigned) - || pcmk_is_set(instance->flags, pcmk__rsc_failed)) { + || !pcmk__is_set(instance->flags, pcmk__rsc_unassigned) + || pcmk__is_set(instance->flags, pcmk__rsc_failed)) { return NULL; } @@ -819,7 +824,7 @@ pcmk__assign_instances(pcmk_resource_t *collective, GList *instances, int available = max_total - assigned; instance = iter->data; - if (!pcmk_is_set(instance->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(instance->flags, pcmk__rsc_unassigned)) { continue; // Already assigned } @@ -837,7 +842,7 @@ pcmk__assign_instances(pcmk_resource_t *collective, GList *instances, for (iter = instances; iter != NULL; iter = iter->next) { instance = (pcmk_resource_t *) iter->data; - if (!pcmk_is_set(instance->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(instance->flags, pcmk__rsc_unassigned)) { continue; // Already assigned } @@ -846,11 +851,11 @@ pcmk__assign_instances(pcmk_resource_t *collective, GList *instances, if (pcmk__top_allowed_node(instance, current) == NULL) { const char *unmanaged = ""; - if (!pcmk_is_set(instance->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(instance->flags, pcmk__rsc_managed)) { unmanaged = "Unmanaged resource "; } - crm_notice("%s%s is running on %s which is no longer allowed", - unmanaged, instance->id, pcmk__node_name(current)); + pcmk__notice("%s%s is running on %s which is no longer allowed", + unmanaged, instance->id, pcmk__node_name(current)); } } @@ -904,14 +909,14 @@ check_instance_state(const pcmk_resource_t *instance, uint32_t *state) uint32_t instance_state = 0; // State of just this instance // No need to check further if all conditions have already been detected - if (pcmk_all_flags_set(*state, instance_all)) { + if (pcmk__all_flags_set(*state, instance_all)) { return; } // If instance is a collective (a cloned group), check its children instead if (instance->priv->variant > pcmk__rsc_variant_primitive) { for (iter = instance->priv->children; - (iter != NULL) && !pcmk_all_flags_set(*state, instance_all); + (iter != NULL) && !pcmk__all_flags_set(*state, instance_all); iter = iter->next) { check_instance_state((const pcmk_resource_t *) iter->data, state); } @@ -926,17 +931,18 @@ check_instance_state(const pcmk_resource_t *instance, uint32_t *state) // Check each of the instance's actions for runnable start or stop for (iter = instance->priv->actions; - (iter != NULL) && !pcmk_all_flags_set(instance_state, - instance_starting - |instance_stopping); + (iter != NULL) + && !pcmk__all_flags_set(instance_state, + instance_starting|instance_stopping); iter = iter->next) { const pcmk_action_t *action = (const pcmk_action_t *) iter->data; - const bool optional = pcmk_is_set(action->flags, pcmk__action_optional); + const bool optional = pcmk__is_set(action->flags, + pcmk__action_optional); if (pcmk__str_eq(PCMK_ACTION_START, action->task, pcmk__str_none)) { if (!optional - && pcmk_is_set(action->flags, pcmk__action_runnable)) { + && pcmk__is_set(action->flags, pcmk__action_runnable)) { pcmk__rsc_trace(instance, "Instance is starting due to %s", action->uuid); @@ -954,8 +960,9 @@ check_instance_state(const pcmk_resource_t *instance, uint32_t *state) * is implied rather than actually executed. */ if (!optional - && pcmk_any_flags_set(action->flags, pcmk__action_pseudo - |pcmk__action_runnable)) { + && pcmk__any_flags_set(action->flags, + pcmk__action_pseudo + |pcmk__action_runnable)) { pcmk__rsc_trace(instance, "Instance is stopping due to %s", action->uuid); instance_state |= instance_stopping; @@ -967,8 +974,8 @@ check_instance_state(const pcmk_resource_t *instance, uint32_t *state) } } - if (pcmk_all_flags_set(instance_state, - instance_starting|instance_stopping)) { + if (pcmk__all_flags_set(instance_state, + instance_starting|instance_stopping)) { instance_state |= instance_restarting; } *state |= instance_state; @@ -1005,25 +1012,25 @@ pcmk__create_instance_actions(pcmk_resource_t *collective, GList *instances) // Create pseudo-actions for rsc start and started start = pe__new_rsc_pseudo_action(collective, PCMK_ACTION_START, - !pcmk_is_set(state, instance_starting), + !pcmk__is_set(state, instance_starting), true); started = pe__new_rsc_pseudo_action(collective, PCMK_ACTION_RUNNING, - !pcmk_is_set(state, instance_starting), + !pcmk__is_set(state, instance_starting), false); started->priority = PCMK_SCORE_INFINITY; - if (pcmk_any_flags_set(state, instance_active|instance_starting)) { + if (pcmk__any_flags_set(state, instance_active|instance_starting)) { pcmk__set_action_flags(started, pcmk__action_runnable); } // Create pseudo-actions for rsc stop and stopped stop = pe__new_rsc_pseudo_action(collective, PCMK_ACTION_STOP, - !pcmk_is_set(state, instance_stopping), + !pcmk__is_set(state, instance_stopping), true); stopped = pe__new_rsc_pseudo_action(collective, PCMK_ACTION_STOPPED, - !pcmk_is_set(state, instance_stopping), + !pcmk__is_set(state, instance_stopping), true); stopped->priority = PCMK_SCORE_INFINITY; - if (!pcmk_is_set(state, instance_restarting)) { + if (!pcmk__is_set(state, instance_restarting)) { pcmk__set_action_flags(stop, pcmk__action_migratable); } @@ -1254,8 +1261,9 @@ unassign_if_mandatory(const pcmk_action_t *first, const pcmk_action_t *then, /* If the "first" action must be runnable, but there is no "first" * instance, the "then" instance must not be allowed to come up. */ - } else if (pcmk_any_flags_set(type, pcmk__ar_unrunnable_first_blocks - |pcmk__ar_first_implies_then)) { + } else if (pcmk__any_flags_set(type, + pcmk__ar_unrunnable_first_blocks + |pcmk__ar_first_implies_then)) { pcmk__rsc_info(then->rsc, "Inhibiting %s from being active " "because there is no %s instance to interleave", @@ -1325,15 +1333,14 @@ find_instance_action(const pcmk_action_t *action, const pcmk_resource_t *instanc return matching_action; } - if (pcmk_is_set(instance->flags, pcmk__rsc_removed) - || pcmk__is_down_action(action_name)) { - crm_trace("No %s action found for %s%s", - action_name, - pcmk_is_set(instance->flags, pcmk__rsc_removed)? "orphan " : "", - instance->id); + if (pcmk__is_set(instance->flags, pcmk__rsc_removed)) { + pcmk__trace("No %s action found for orphan %s", action_name, + instance->id); + } else if (pcmk__is_down_action(action_name)) { + pcmk__trace("No %s action found for %s", action_name, instance->id); } else { - crm_err("No %s action found for %s to interleave (bug?)", - action_name, instance->id); + pcmk__err("No %s action found for %s to interleave (bug?)", + action_name, instance->id); } return NULL; } @@ -1475,21 +1482,21 @@ can_interleave_actions(const pcmk_action_t *first, const pcmk_action_t *then) pcmk_resource_t *rsc = NULL; if ((first->rsc == NULL) || (then->rsc == NULL)) { - crm_trace("Not interleaving %s with %s: not resource actions", - first->uuid, then->uuid); + pcmk__trace("Not interleaving %s with %s: not resource actions", + first->uuid, then->uuid); return false; } if (first->rsc == then->rsc) { - crm_trace("Not interleaving %s with %s: same resource", - first->uuid, then->uuid); + pcmk__trace("Not interleaving %s with %s: same resource", + first->uuid, then->uuid); return false; } if ((first->rsc->priv->variant < pcmk__rsc_variant_clone) || (then->rsc->priv->variant < pcmk__rsc_variant_clone)) { - crm_trace("Not interleaving %s with %s: not clones or bundles", - first->uuid, then->uuid); + pcmk__trace("Not interleaving %s with %s: not clones or bundles", + first->uuid, then->uuid); return false; } @@ -1500,8 +1507,8 @@ can_interleave_actions(const pcmk_action_t *first, const pcmk_action_t *then) rsc = then->rsc; } - interleave = crm_is_true(g_hash_table_lookup(rsc->priv->meta, - PCMK_META_INTERLEAVE)); + interleave = pcmk__is_true(g_hash_table_lookup(rsc->priv->meta, + PCMK_META_INTERLEAVE)); pcmk__rsc_trace(rsc, "'%s then %s' will %sbe interleaved (based on %s)", first->uuid, then->uuid, (interleave? "" : "not "), rsc->id); @@ -1549,7 +1556,7 @@ update_noninterleaved_actions(pcmk_resource_t *instance, pcmk_action_t *first, // Check whether action is runnable instance_flags = instance->priv->cmds->action_flags(instance_action, node); - if (!pcmk_is_set(instance_flags, pcmk__action_runnable)) { + if (!pcmk__is_set(instance_flags, pcmk__action_runnable)) { return changed; } @@ -1560,7 +1567,7 @@ update_noninterleaved_actions(pcmk_resource_t *instance, pcmk_action_t *first, type, scheduler); // Propagate any changes to later actions - if (pcmk_is_set(changed, pcmk__updated_then)) { + if (pcmk__is_set(changed, pcmk__updated_then)) { for (GList *after_iter = instance_action->actions_after; after_iter != NULL; after_iter = after_iter->next) { pcmk__related_action_t *after = after_iter->data; @@ -1629,10 +1636,10 @@ pcmk__instance_update_ordered_actions(pcmk_action_t *first, pcmk_action_t *then, } } -#define pe__clear_action_summary_flags(flags, action, flag) do { \ - flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ - "Action summary", action->rsc->id, \ - flags, flag, #flag); \ +#define pe__clear_action_summary_flags(flags, action, flag) do { \ + flags = pcmk__clear_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, \ + "Action summary", action->rsc->id, \ + flags, flag, #flag); \ } while (0) /*! @@ -1684,8 +1691,8 @@ pcmk__collective_action_flags(pcmk_action_t *action, const GList *instances, node); // If any instance action is mandatory, so is the collective action - if (pcmk_is_set(flags, pcmk__action_optional) - && !pcmk_is_set(instance_flags, pcmk__action_optional)) { + if (pcmk__is_set(flags, pcmk__action_optional) + && !pcmk__is_set(instance_flags, pcmk__action_optional)) { pcmk__rsc_trace(instance, "%s is mandatory because %s is", action->uuid, instance_action->uuid); pe__clear_action_summary_flags(flags, action, @@ -1694,7 +1701,7 @@ pcmk__collective_action_flags(pcmk_action_t *action, const GList *instances, } // If any instance action is runnable, so is the collective action - if (pcmk_is_set(instance_flags, pcmk__action_runnable)) { + if (pcmk__is_set(instance_flags, pcmk__action_runnable)) { any_runnable = true; } } diff --git a/lib/pacemaker/pcmk_sched_location.c b/lib/pacemaker/pcmk_sched_location.c index 44cd997f074..45c9281bf90 100644 --- a/lib/pacemaker/pcmk_sched_location.c +++ b/lib/pacemaker/pcmk_sched_location.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -14,6 +14,7 @@ #include #include +#include // pcmk_parse_score(), etc. #include #include @@ -75,7 +76,7 @@ score_attribute_name(const xmlNode *rule_xml, char **allocated, { const char *name = NULL; - name = crm_element_value(rule_xml, PCMK_XA_SCORE_ATTRIBUTE); + name = pcmk__xe_get(rule_xml, PCMK_XA_SCORE_ATTRIBUTE); if (name == NULL) { return NULL; } @@ -109,7 +110,7 @@ static int score_from_rule(const xmlNode *rule_xml, int *score) { int rc = pcmk_rc_ok; - const char *score_s = crm_element_value(rule_xml, PCMK_XA_SCORE); + const char *score_s = pcmk__xe_get(rule_xml, PCMK_XA_SCORE); if (score_s == NULL) { // Not possible with schema validation enabled pcmk__config_err("Ignoring location constraint rule %s because " @@ -156,18 +157,18 @@ score_from_attr(const char *constraint_id, const char *attr_name, PCMK_META_CONTAINER_ATTRIBUTE_TARGET); score_s = pcmk__node_attr(node, attr_name, target, pcmk__rsc_node_current); if (pcmk__str_empty(score_s)) { - crm_info("Ignoring location %s for %s on %s " - "because it has no node attribute %s", - constraint_id, rsc->id, pcmk__node_name(node), attr_name); + pcmk__info("Ignoring location %s for %s on %s because it has no node " + "attribute %s", + constraint_id, rsc->id, pcmk__node_name(node), attr_name); return ENXIO; } rc = pcmk_parse_score(score_s, score, 0); if (rc != pcmk_rc_ok) { - crm_warn("Ignoring location %s for node %s because node " - "attribute %s value '%s' is not a valid score: %s", - constraint_id, pcmk__node_name(node), attr_name, - score_s, pcmk_rc_str(rc)); + pcmk__warn("Ignoring location %s for node %s because node attribute " + "%s value '%s' is not a valid score: %s", + constraint_id, pcmk__node_name(node), attr_name, + score_s, pcmk_rc_str(rc)); return rc; } return pcmk_rc_ok; @@ -211,7 +212,7 @@ generate_location_rule(pcmk_resource_t *rsc, xmlNode *rule_xml, return false; // Error already logged } - rule_id = crm_element_value(rule_xml, PCMK_XA_ID); + rule_id = pcmk__xe_get(rule_xml, PCMK_XA_ID); if (rule_id == NULL) { pcmk__config_err("Ignoring location constraint '%s' because its rule " "has no " PCMK_XA_ID, @@ -219,11 +220,11 @@ generate_location_rule(pcmk_resource_t *rsc, xmlNode *rule_xml, return false; } - boolean = crm_element_value(rule_xml, PCMK_XA_BOOLEAN_OP); - role_spec = crm_element_value(rule_xml, PCMK_XA_ROLE); + boolean = pcmk__xe_get(rule_xml, PCMK_XA_BOOLEAN_OP); + role_spec = pcmk__xe_get(rule_xml, PCMK_XA_ROLE); if (parse_location_role(role_spec, &role)) { - crm_trace("Setting rule %s role filter to %s", rule_id, role_spec); + pcmk__trace("Setting rule %s role filter to %s", rule_id, role_spec); } else { pcmk__config_err("Ignoring location constraint '%s' because rule '%s' " "has invalid " PCMK_XA_ROLE " '%s'", @@ -292,10 +293,10 @@ generate_location_rule(pcmk_resource_t *rsc, xmlNode *rule_xml, free(local_score_attr); if (location_rule->nodes == NULL) { - crm_trace("No matching nodes for location constraint rule %s", rule_id); + pcmk__trace("No matching nodes for location constraint rule %s", rule_id); } else { - crm_trace("Location constraint rule %s matched %d nodes", - rule_id, g_list_length(location_rule->nodes)); + pcmk__trace("Location constraint rule %s matched %u nodes", rule_id, + g_list_length(location_rule->nodes)); } return true; } @@ -306,11 +307,10 @@ unpack_rsc_location(xmlNode *xml_obj, pcmk_resource_t *rsc, char *rsc_id_match, int rsc_id_nmatches, regmatch_t *rsc_id_submatches) { - const char *rsc_id = crm_element_value(xml_obj, PCMK_XA_RSC); - const char *id = crm_element_value(xml_obj, PCMK_XA_ID); - const char *node = crm_element_value(xml_obj, PCMK_XA_NODE); - const char *discovery = crm_element_value(xml_obj, - PCMK_XA_RESOURCE_DISCOVERY); + const char *rsc_id = pcmk__xe_get(xml_obj, PCMK_XA_RSC); + const char *id = pcmk__xe_get(xml_obj, PCMK_XA_ID); + const char *node = pcmk__xe_get(xml_obj, PCMK_XA_NODE); + const char *discovery = pcmk__xe_get(xml_obj, PCMK_XA_RESOURCE_DISCOVERY); if (rsc == NULL) { pcmk__config_warn("Ignoring constraint '%s' because resource '%s' " @@ -319,7 +319,7 @@ unpack_rsc_location(xmlNode *xml_obj, pcmk_resource_t *rsc, } if (score == NULL) { - score = crm_element_value(xml_obj, PCMK_XA_SCORE); + score = pcmk__xe_get(xml_obj, PCMK_XA_SCORE); } if ((node != NULL) && (score != NULL)) { @@ -330,9 +330,9 @@ unpack_rsc_location(xmlNode *xml_obj, pcmk_resource_t *rsc, pcmk__location_t *location = NULL; if (match == NULL) { - crm_info("Ignoring location constraint %s " - "because '%s' is not a known node", - pcmk__s(id, "without ID"), node); + pcmk__info("Ignoring location constraint %s because '%s' is not a " + "known node", + pcmk__s(id, "without ID"), node); return; } @@ -344,11 +344,11 @@ unpack_rsc_location(xmlNode *xml_obj, pcmk_resource_t *rsc, } if (role_spec == NULL) { - role_spec = crm_element_value(xml_obj, PCMK_XA_ROLE); + role_spec = pcmk__xe_get(xml_obj, PCMK_XA_ROLE); } if (parse_location_role(role_spec, &role)) { - crm_trace("Setting location constraint %s role filter: %s", - id, role_spec); + pcmk__trace("Setting location constraint %s role filter: %s", id, + role_spec); } else { // Not possible with schema validation enabled pcmk__config_err("Ignoring location constraint %s " "because '%s' is not a valid " PCMK_XA_ROLE, @@ -393,8 +393,8 @@ unpack_rsc_location(xmlNode *xml_obj, pcmk_resource_t *rsc, static void unpack_simple_location(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) { - const char *id = crm_element_value(xml_obj, PCMK_XA_ID); - const char *value = crm_element_value(xml_obj, PCMK_XA_RSC); + const char *id = pcmk__xe_get(xml_obj, PCMK_XA_ID); + const char *value = pcmk__xe_get(xml_obj, PCMK_XA_RSC); if (value) { pcmk_resource_t *rsc; @@ -403,7 +403,7 @@ unpack_simple_location(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) unpack_rsc_location(xml_obj, rsc, NULL, NULL, NULL, 0, NULL); } - value = crm_element_value(xml_obj, PCMK_XA_RSC_PATTERN); + value = pcmk__xe_get(xml_obj, PCMK_XA_RSC_PATTERN); if (value) { regex_t regex; bool invert = false; @@ -438,17 +438,18 @@ unpack_simple_location(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) status = regexec(®ex, r->id, nregs, pmatch, 0); if (!invert && (status == 0)) { - crm_debug("'%s' matched '%s' for %s", r->id, value, id); + pcmk__debug("'%s' matched '%s' for %s", r->id, value, id); unpack_rsc_location(xml_obj, r, NULL, NULL, r->id, nregs, pmatch); } else if (invert && (status != 0)) { - crm_debug("'%s' is an inverted match of '%s' for %s", - r->id, value, id); + pcmk__debug("'%s' is an inverted match of '%s' for %s", r->id, + value, id); unpack_rsc_location(xml_obj, r, NULL, NULL, NULL, 0, NULL); } else { - crm_trace("'%s' does not match '%s' for %s", r->id, value, id); + pcmk__trace("'%s' does not match '%s' for %s", r->id, value, + id); } free(pmatch); @@ -486,11 +487,11 @@ unpack_location_tags(xmlNode *xml_obj, xmlNode **expanded_xml, // Check whether there are any resource sets with template or tag references *expanded_xml = pcmk__expand_tags_in_sets(xml_obj, scheduler); if (*expanded_xml != NULL) { - crm_log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_LOCATION); + pcmk__log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_LOCATION); return pcmk_rc_ok; } - rsc_id = crm_element_value(xml_obj, PCMK_XA_RSC); + rsc_id = pcmk__xe_get(xml_obj, PCMK_XA_RSC); if (rsc_id == NULL) { return pcmk_rc_ok; } @@ -505,7 +506,7 @@ unpack_location_tags(xmlNode *xml_obj, xmlNode **expanded_xml, return pcmk_rc_ok; } - state = crm_element_value(xml_obj, PCMK_XA_ROLE); + state = pcmk__xe_get(xml_obj, PCMK_XA_ROLE); *expanded_xml = pcmk__xml_copy(NULL, xml_obj); @@ -524,10 +525,10 @@ unpack_location_tags(xmlNode *xml_obj, xmlNode **expanded_xml, /* Move PCMK_XA_RSC_ROLE into converted PCMK_XE_RESOURCE_SET as * PCMK_XA_ROLE attribute */ - crm_xml_add(rsc_set, PCMK_XA_ROLE, state); + pcmk__xe_set(rsc_set, PCMK_XA_ROLE, state); pcmk__xe_remove_attr(*expanded_xml, PCMK_XA_ROLE); } - crm_log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_LOCATION); + pcmk__log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_LOCATION); } else { // No sets @@ -559,8 +560,8 @@ unpack_location_set(xmlNode *location, xmlNode *set, return pcmk_rc_unpack_error; } - role = crm_element_value(set, PCMK_XA_ROLE); - local_score = crm_element_value(set, PCMK_XA_SCORE); + role = pcmk__xe_get(set, PCMK_XA_ROLE); + local_score = pcmk__xe_get(set, PCMK_XA_SCORE); for (xml_rsc = pcmk__xe_first_child(set, PCMK_XE_RESOURCE_REF, NULL, NULL); xml_rsc != NULL; diff --git a/lib/pacemaker/pcmk_sched_migration.c b/lib/pacemaker/pcmk_sched_migration.c index f0945cf1682..fdb0335fd0c 100644 --- a/lib/pacemaker/pcmk_sched_migration.c +++ b/lib/pacemaker/pcmk_sched_migration.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -125,7 +125,7 @@ pcmk__create_migration_actions(pcmk_resource_t *rsc, const pcmk_node_t *current) if (migrate_to != NULL) { add_migration_meta(migrate_to, current, rsc->priv->assigned_node); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { /* migrate_to takes place on the source node, but can affect the * target node depending on how the agent is written. Because of * this, pending migrate_to actions must be recorded in the CIB, @@ -181,25 +181,25 @@ pcmk__rsc_can_migrate(const pcmk_resource_t *rsc, const pcmk_node_t *current) { CRM_CHECK(rsc != NULL, return false); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_migratable)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_migratable)) { pcmk__rsc_trace(rsc, "%s cannot migrate because " "the configuration does not allow it", rsc->id); return false; } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__rsc_trace(rsc, "%s cannot migrate because it is not managed", rsc->id); return false; } - if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { pcmk__rsc_trace(rsc, "%s cannot migrate because it is failed", rsc->id); return false; } - if (pcmk_is_set(rsc->flags, pcmk__rsc_start_pending)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_start_pending)) { pcmk__rsc_trace(rsc, "%s cannot migrate because it has a start pending", rsc->id); return false; @@ -275,8 +275,8 @@ pcmk__order_migration_equivalents(pcmk__action_relation_t *order) } // Only orderings involving at least one migratable resource are relevant - first_migratable = pcmk_is_set(order->rsc1->flags, pcmk__rsc_migratable); - then_migratable = pcmk_is_set(order->rsc2->flags, pcmk__rsc_migratable); + first_migratable = pcmk__is_set(order->rsc1->flags, pcmk__rsc_migratable); + then_migratable = pcmk__is_set(order->rsc2->flags, pcmk__rsc_migratable); if (!first_migratable && !then_migratable) { return; } diff --git a/lib/pacemaker/pcmk_sched_nodes.c b/lib/pacemaker/pcmk_sched_nodes.c index 544a8ced6be..eb6c80dac08 100644 --- a/lib/pacemaker/pcmk_sched_nodes.c +++ b/lib/pacemaker/pcmk_sched_nodes.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -8,6 +8,7 @@ */ #include +#include // PCMK_SCORE_INFINITY #include #include #include @@ -32,7 +33,7 @@ pcmk__node_available(const pcmk_node_t *node, bool consider_score, { if ((node == NULL) || (node->details == NULL) || !node->details->online || node->details->shutdown || node->details->unclean - || pcmk_is_set(node->priv->flags, pcmk__node_standby) + || pcmk__is_set(node->priv->flags, pcmk__node_standby) || node->details->maintenance) { return false; } @@ -234,16 +235,16 @@ compare_nodes(gconstpointer a, gconstpointer b, gpointer data) } if (node1_score > node2_score) { - crm_trace("%s before %s (score %d > %d)", - pcmk__node_name(node1), pcmk__node_name(node2), - node1_score, node2_score); + pcmk__trace("%s before %s (score %d > %d)", + pcmk__node_name(node1), pcmk__node_name(node2), + node1_score, node2_score); return -1; } if (node1_score < node2_score) { - crm_trace("%s after %s (score %d < %d)", - pcmk__node_name(node1), pcmk__node_name(node2), - node1_score, node2_score); + pcmk__trace("%s after %s (score %d < %d)", + pcmk__node_name(node1), pcmk__node_name(node2), + node1_score, node2_score); return 1; } @@ -259,13 +260,13 @@ compare_nodes(gconstpointer a, gconstpointer b, gpointer data) result = pcmk__compare_node_capacities(node1, node2); if (result < 0) { - crm_trace("%s before %s (greater capacity by %d attributes)", - pcmk__node_name(node1), pcmk__node_name(node2), - result * -1); + pcmk__trace("%s before %s (greater capacity by %d attributes)", + pcmk__node_name(node1), pcmk__node_name(node2), + (result * -1)); return -1; } else if (result > 0) { - crm_trace("%s after %s (lower capacity by %d attributes)", - pcmk__node_name(node1), pcmk__node_name(node2), result); + pcmk__trace("%s after %s (lower capacity by %d attributes)", + pcmk__node_name(node1), pcmk__node_name(node2), result); return 1; } } @@ -273,15 +274,15 @@ compare_nodes(gconstpointer a, gconstpointer b, gpointer data) // Compare number of resources already assigned to node if (node1->priv->num_resources < node2->priv->num_resources) { - crm_trace("%s before %s (%d resources < %d)", - pcmk__node_name(node1), pcmk__node_name(node2), - node1->priv->num_resources, node2->priv->num_resources); + pcmk__trace("%s before %s (%d resources < %d)", + pcmk__node_name(node1), pcmk__node_name(node2), + node1->priv->num_resources, node2->priv->num_resources); return -1; } else if (node1->priv->num_resources > node2->priv->num_resources) { - crm_trace("%s after %s (%d resources > %d)", - pcmk__node_name(node1), pcmk__node_name(node2), - node1->priv->num_resources, node2->priv->num_resources); + pcmk__trace("%s after %s (%d resources > %d)", + pcmk__node_name(node1), pcmk__node_name(node2), + node1->priv->num_resources, node2->priv->num_resources); return 1; } @@ -289,12 +290,12 @@ compare_nodes(gconstpointer a, gconstpointer b, gpointer data) if (preferred != NULL) { if (pcmk__same_node(preferred, node1)) { - crm_trace("%s before %s (preferred node)", - pcmk__node_name(node1), pcmk__node_name(node2)); + pcmk__trace("%s before %s (preferred node)", + pcmk__node_name(node1), pcmk__node_name(node2)); return -1; } else if (pcmk__same_node(preferred, node2)) { - crm_trace("%s after %s (not preferred node)", - pcmk__node_name(node1), pcmk__node_name(node2)); + pcmk__trace("%s after %s (not preferred node)", + pcmk__node_name(node1), pcmk__node_name(node2)); return 1; } } @@ -303,16 +304,16 @@ compare_nodes(gconstpointer a, gconstpointer b, gpointer data) equal: result = strcmp(node1->priv->name, node2->priv->name); if (result < 0) { - crm_trace("%s before %s (name)", - pcmk__node_name(node1), pcmk__node_name(node2)); + pcmk__trace("%s before %s (name)", + pcmk__node_name(node1), pcmk__node_name(node2)); return -1; } else if (result > 0) { - crm_trace("%s after %s (name)", - pcmk__node_name(node1), pcmk__node_name(node2)); + pcmk__trace("%s after %s (name)", + pcmk__node_name(node1), pcmk__node_name(node2)); return 1; } - crm_trace("%s == %s", pcmk__node_name(node1), pcmk__node_name(node2)); + pcmk__trace("%s == %s", pcmk__node_name(node1), pcmk__node_name(node2)); return 0; } @@ -377,7 +378,7 @@ pcmk__apply_node_health(pcmk_scheduler_t *scheduler) if (strategy == pcmk__health_strategy_none) { return; } - crm_info("Applying node health strategy '%s'", strategy_str); + pcmk__info("Applying node health strategy '%s'", strategy_str); // The progressive strategy can use a base health score if (strategy == pcmk__health_strategy_progressive) { @@ -392,8 +393,8 @@ pcmk__apply_node_health(pcmk_scheduler_t *scheduler) if (health == 0) { continue; } - crm_info("Overall system health of %s is %d", - pcmk__node_name(node), health); + pcmk__info("Overall system health of %s is %d", pcmk__node_name(node), + health); // Use node health as a location score for each resource on the node for (GList *r = scheduler->priv->resources; r != NULL; r = r->next) { @@ -405,8 +406,11 @@ pcmk__apply_node_health(pcmk_scheduler_t *scheduler) /* Negative health scores do not apply to resources with * PCMK_META_ALLOW_UNHEALTHY_NODES=true. */ - constrain = !crm_is_true(g_hash_table_lookup(rsc->priv->meta, - PCMK_META_ALLOW_UNHEALTHY_NODES)); + const char *allow = + g_hash_table_lookup(rsc->priv->meta, + PCMK_META_ALLOW_UNHEALTHY_NODES); + + constrain = !pcmk__is_true(allow); } if (constrain) { pcmk__new_location(strategy_str, rsc, health, NULL, node); diff --git a/lib/pacemaker/pcmk_sched_ordering.c b/lib/pacemaker/pcmk_sched_ordering.c index 3370cc52e81..1e58d142b34 100644 --- a/lib/pacemaker/pcmk_sched_ordering.c +++ b/lib/pacemaker/pcmk_sched_ordering.c @@ -14,6 +14,7 @@ #include #include +#include // pcmk_parse_score() #include #include "libpacemaker_private.h" @@ -75,10 +76,10 @@ static enum pe_order_kind get_ordering_type(const xmlNode *xml_obj) { enum pe_order_kind kind_e = pe_order_kind_mandatory; - const char *kind = crm_element_value(xml_obj, PCMK_XA_KIND); + const char *kind = pcmk__xe_get(xml_obj, PCMK_XA_KIND); if (kind == NULL) { - const char *score = crm_element_value(xml_obj, PCMK_XA_SCORE); + const char *score = pcmk__xe_get(xml_obj, PCMK_XA_SCORE); kind_e = pe_order_kind_mandatory; @@ -135,8 +136,8 @@ get_ordering_symmetry(const xmlNode *xml_obj, enum pe_order_kind parent_kind, enum pe_order_kind kind = parent_kind; // Default to parent's kind // Check ordering XML for explicit kind - if ((crm_element_value(xml_obj, PCMK_XA_KIND) != NULL) - || (crm_element_value(xml_obj, PCMK_XA_SCORE) != NULL)) { + if ((pcmk__xe_get(xml_obj, PCMK_XA_KIND) != NULL) + || (pcmk__xe_get(xml_obj, PCMK_XA_SCORE) != NULL)) { kind = get_ordering_type(xml_obj); } @@ -144,7 +145,7 @@ get_ordering_symmetry(const xmlNode *xml_obj, enum pe_order_kind parent_kind, rc = pcmk__xe_get_bool_attr(xml_obj, PCMK_XA_SYMMETRICAL, &symmetric); if (rc != pcmk_rc_ok && parent_symmetrical_s != NULL) { - symmetric = crm_is_true(parent_symmetrical_s); + symmetric = pcmk__is_true(parent_symmetrical_s); rc = pcmk_rc_ok; } @@ -239,7 +240,7 @@ get_ordering_resource(const xmlNode *xml, const char *resource_attr, const pcmk_scheduler_t *scheduler) { pcmk_resource_t *rsc = NULL; - const char *rsc_id = crm_element_value(xml, resource_attr); + const char *rsc_id = pcmk__xe_get(xml, resource_attr); if (rsc_id == NULL) { pcmk__config_err("Ignoring constraint '%s' without %s", @@ -322,7 +323,7 @@ clone_min_ordering(const char *id, uint32_t flags, int clone_min) { // Create a pseudo-action for when the minimum instances are active - char *task = crm_strdup_printf(PCMK_ACTION_CLONE_ONE_OR_MORE ":%s", id); + char *task = pcmk__assert_asprintf(PCMK_ACTION_CLONE_ONE_OR_MORE ":%s", id); pcmk_action_t *clone_min_met = get_pseudo_op(task, rsc_first->priv->scheduler); @@ -402,7 +403,7 @@ unpack_simple_rsc_order(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) CRM_CHECK(xml_obj != NULL, return); - id = crm_element_value(xml_obj, PCMK_XA_ID); + id = pcmk__xe_get(xml_obj, PCMK_XA_ID); if (id == NULL) { pcmk__config_err("Ignoring <%s> constraint without " PCMK_XA_ID, xml_obj->name); @@ -419,12 +420,12 @@ unpack_simple_rsc_order(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) return; } - action_first = crm_element_value(xml_obj, PCMK_XA_FIRST_ACTION); + action_first = pcmk__xe_get(xml_obj, PCMK_XA_FIRST_ACTION); if (action_first == NULL) { action_first = PCMK_ACTION_START; } - action_then = crm_element_value(xml_obj, PCMK_XA_THEN_ACTION); + action_then = pcmk__xe_get(xml_obj, PCMK_XA_THEN_ACTION); if (action_then == NULL) { action_then = action_first; } @@ -568,9 +569,9 @@ unpack_order_set(const xmlNode *set, enum pe_order_kind parent_kind, char *key = NULL; const char *id = pcmk__xe_id(set); - const char *action = crm_element_value(set, PCMK_XA_ACTION); - const char *sequential_s = crm_element_value(set, PCMK_XA_SEQUENTIAL); - const char *kind_s = crm_element_value(set, PCMK_XA_KIND); + const char *action = pcmk__xe_get(set, PCMK_XA_ACTION); + const char *sequential_s = pcmk__xe_get(set, PCMK_XA_SEQUENTIAL); + const char *kind_s = pcmk__xe_get(set, PCMK_XA_KIND); if (action == NULL) { action = PCMK_ACTION_START; @@ -583,7 +584,7 @@ unpack_order_set(const xmlNode *set, enum pe_order_kind parent_kind, sequential_s = "1"; } - sequential = crm_is_true(sequential_s); + sequential = pcmk__is_true(sequential_s); symmetry = get_ordering_symmetry(set, parent_kind, parent_symmetrical_s); flags = ordering_flags_for_kind(local_kind, action, symmetry); @@ -599,7 +600,7 @@ unpack_order_set(const xmlNode *set, enum pe_order_kind parent_kind, } if (pcmk__list_of_1(resources)) { - crm_trace("Single set: %s", id); + pcmk__trace("Single set: %s", id); goto done; } @@ -684,8 +685,8 @@ order_rsc_sets(const char *id, const xmlNode *set1, const xmlNode *set2, pcmk_resource_t *rsc_1 = NULL; pcmk_resource_t *rsc_2 = NULL; - const char *action_1 = crm_element_value(set1, PCMK_XA_ACTION); - const char *action_2 = crm_element_value(set2, PCMK_XA_ACTION); + const char *action_1 = pcmk__xe_get(set1, PCMK_XA_ACTION); + const char *action_2 = pcmk__xe_get(set2, PCMK_XA_ACTION); uint32_t flags = pcmk__ar_none; @@ -722,8 +723,8 @@ order_rsc_sets(const char *id, const xmlNode *set1, const xmlNode *set2, * irrelevant in regards to set2. */ if (!require_all) { - char *task = crm_strdup_printf(PCMK_ACTION_ONE_OR_MORE ":%s", - pcmk__xe_id(set1)); + char *task = pcmk__assert_asprintf(PCMK_ACTION_ONE_OR_MORE ":%s", + pcmk__xe_id(set1)); pcmk_action_t *unordered_action = get_pseudo_op(task, scheduler); free(task); @@ -895,12 +896,12 @@ unpack_order_tags(xmlNode *xml_obj, xmlNode **expanded_xml, // Check whether there are any resource sets with template or tag references *expanded_xml = pcmk__expand_tags_in_sets(xml_obj, scheduler); if (*expanded_xml != NULL) { - crm_log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_ORDER); + pcmk__log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_ORDER); return pcmk_rc_ok; } - id_first = crm_element_value(xml_obj, PCMK_XA_FIRST); - id_then = crm_element_value(xml_obj, PCMK_XA_THEN); + id_first = pcmk__xe_get(xml_obj, PCMK_XA_FIRST); + id_then = pcmk__xe_get(xml_obj, PCMK_XA_THEN); if ((id_first == NULL) || (id_then == NULL)) { return pcmk_rc_ok; } @@ -926,8 +927,8 @@ unpack_order_tags(xmlNode *xml_obj, xmlNode **expanded_xml, return pcmk_rc_ok; } - action_first = crm_element_value(xml_obj, PCMK_XA_FIRST_ACTION); - action_then = crm_element_value(xml_obj, PCMK_XA_THEN_ACTION); + action_first = pcmk__xe_get(xml_obj, PCMK_XA_FIRST_ACTION); + action_then = pcmk__xe_get(xml_obj, PCMK_XA_THEN_ACTION); *expanded_xml = pcmk__xml_copy(NULL, xml_obj); @@ -946,7 +947,7 @@ unpack_order_tags(xmlNode *xml_obj, xmlNode **expanded_xml, /* Move PCMK_XA_FIRST_ACTION into converted PCMK_XE_RESOURCE_SET as * PCMK_XA_ACTION */ - crm_xml_add(rsc_set_first, PCMK_XA_ACTION, action_first); + pcmk__xe_set(rsc_set_first, PCMK_XA_ACTION, action_first); pcmk__xe_remove_attr(*expanded_xml, PCMK_XA_FIRST_ACTION); } any_sets = true; @@ -967,14 +968,14 @@ unpack_order_tags(xmlNode *xml_obj, xmlNode **expanded_xml, /* Move PCMK_XA_THEN_ACTION into converted PCMK_XE_RESOURCE_SET as * PCMK_XA_ACTION */ - crm_xml_add(rsc_set_then, PCMK_XA_ACTION, action_then); + pcmk__xe_set(rsc_set_then, PCMK_XA_ACTION, action_then); pcmk__xe_remove_attr(*expanded_xml, PCMK_XA_THEN_ACTION); } any_sets = true; } if (any_sets) { - crm_log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_ORDER); + pcmk__log_xml_trace(*expanded_xml, "Expanded " PCMK_XE_RSC_ORDER); } else { pcmk__xml_free(*expanded_xml); *expanded_xml = NULL; @@ -999,8 +1000,8 @@ pcmk__unpack_ordering(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) xmlNode *orig_xml = NULL; xmlNode *expanded_xml = NULL; - const char *id = crm_element_value(xml_obj, PCMK_XA_ID); - const char *invert = crm_element_value(xml_obj, PCMK_XA_SYMMETRICAL); + const char *id = pcmk__xe_get(xml_obj, PCMK_XA_ID); + const char *invert = pcmk__xe_get(xml_obj, PCMK_XA_SYMMETRICAL); enum pe_order_kind kind = get_ordering_type(xml_obj); enum ordering_symmetry symmetry = get_ordering_symmetry(xml_obj, kind, @@ -1069,7 +1070,7 @@ ordering_is_invalid(pcmk_action_t *action, pcmk__related_action_t *input) /* Prevent user-defined ordering constraints between resources * running in a guest node and the resource that defines that node. */ - if (!pcmk_is_set(input->flags, pcmk__ar_guest_allowed) + if (!pcmk__is_set(input->flags, pcmk__ar_guest_allowed) && (input->action->rsc != NULL) && pcmk__rsc_corresponds_to_guest(action->rsc, input->action->node)) { @@ -1138,7 +1139,7 @@ pcmk__order_stops_before_shutdown(pcmk_node_t *node, pcmk_action_t *shutdown_op) // Resources and nodes in maintenance mode won't be touched - if (pcmk_is_set(action->rsc->flags, pcmk__rsc_maintenance)) { + if (pcmk__is_set(action->rsc->flags, pcmk__rsc_maintenance)) { pcmk__rsc_trace(action->rsc, "Not ordering %s before shutdown of %s because " "resource in maintenance mode", @@ -1159,8 +1160,8 @@ pcmk__order_stops_before_shutdown(pcmk_node_t *node, pcmk_action_t *shutdown_op) * * @TODO This "if" looks wrong, create a regression test for these cases */ - if (!pcmk_any_flags_set(action->rsc->flags, - pcmk__rsc_managed|pcmk__rsc_blocked)) { + if (!pcmk__any_flags_set(action->rsc->flags, + pcmk__rsc_managed|pcmk__rsc_blocked)) { pcmk__rsc_trace(action->rsc, "Not ordering %s before shutdown of %s because " "resource is unmanaged or blocked", @@ -1246,7 +1247,7 @@ order_resource_actions_after(pcmk_action_t *first_action, } if ((first_action != NULL) && (first_action->rsc == rsc) - && pcmk_is_set(first_action->flags, pcmk__action_migration_abort)) { + && pcmk__is_set(first_action->flags, pcmk__action_migration_abort)) { pcmk__rsc_trace(rsc, "Detected dangling migration ordering (%s then %s %s)", @@ -1255,7 +1256,7 @@ order_resource_actions_after(pcmk_action_t *first_action, } if ((first_action == NULL) - && !pcmk_is_set(flags, pcmk__ar_first_implies_then)) { + && !pcmk__is_set(flags, pcmk__ar_first_implies_then)) { pcmk__rsc_debug(rsc, "Ignoring ordering %d for %s: No first action found", @@ -1271,9 +1272,10 @@ order_resource_actions_after(pcmk_action_t *first_action, order_actions(first_action, then_action_iter, flags); } else { pcmk__clear_action_flags(then_action_iter, pcmk__action_runnable); - crm_warn("%s of %s is unrunnable because there is no %s of %s " - "to order it after", then_action_iter->task, rsc->id, - order->task1, order->rsc1->id); + pcmk__warn("%s of %s is unrunnable because there is no %s of %s to " + "order it after", + then_action_iter->task, rsc->id, order->task1, + order->rsc1->id); } } @@ -1388,7 +1390,7 @@ update_action_for_orderings(gpointer data, gpointer user_data) void pcmk__apply_orderings(pcmk_scheduler_t *sched) { - crm_trace("Applying ordering constraints"); + pcmk__trace("Applying ordering constraints"); /* Ordering constraints need to be processed in the order they were created. * rsc_order_first() and order_resource_actions_after() require the relevant @@ -1421,18 +1423,19 @@ pcmk__apply_orderings(pcmk_scheduler_t *sched) order_resource_actions_after(order->action1, rsc, order); } else { - crm_trace("Applying ordering constraint %d (non-resource actions)", - order->id); + pcmk__trace("Applying ordering constraint %d (non-resource " + "actions)", + order->id); order_actions(order->action1, order->action2, order->flags); } } g_list_foreach(sched->priv->actions, block_colocation_dependents, NULL); - crm_trace("Ordering probes"); + pcmk__trace("Ordering probes"); pcmk__order_probes(sched); - crm_trace("Updating %d actions", g_list_length(sched->priv->actions)); + pcmk__trace("Updating %u actions", g_list_length(sched->priv->actions)); g_list_foreach(sched->priv->actions, update_action_for_orderings, sched); pcmk__disable_invalid_orderings(sched); @@ -1454,9 +1457,9 @@ pcmk__order_after_each(pcmk_action_t *after, GList *list) pcmk_action_t *before = (pcmk_action_t *) iter->data; const char *before_desc = before->task? before->task : before->uuid; - crm_debug("Ordering %s on %s before %s on %s", - before_desc, pcmk__node_name(before->node), - after_desc, pcmk__node_name(after->node)); + pcmk__debug("Ordering %s on %s before %s on %s", before_desc, + pcmk__node_name(before->node), after_desc, + pcmk__node_name(after->node)); order_actions(before, after, pcmk__ar_ordered); } } diff --git a/lib/pacemaker/pcmk_sched_primitive.c b/lib/pacemaker/pcmk_sched_primitive.c index 390072a214a..0cff31cd966 100644 --- a/lib/pacemaker/pcmk_sched_primitive.c +++ b/lib/pacemaker/pcmk_sched_primitive.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -12,6 +12,8 @@ #include #include // uint8_t, uint32_t +#include // crm_meta_name() +#include // PCMK_SCORE_INFINITY #include #include @@ -175,7 +177,7 @@ assign_best_node(pcmk_resource_t *rsc, const pcmk_node_t *prefer, prefer = most_free_node; } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { // We've already finished assignment of resources to nodes return rsc->priv->assigned_node != NULL; } @@ -310,7 +312,7 @@ apply_this_with(pcmk__colocation_t *colocation, pcmk_resource_t *rsc) archive = pcmk__copy_node_table(rsc->priv->allowed_nodes); } - if (pcmk_is_set(other->flags, pcmk__rsc_unassigned)) { + if (pcmk__is_set(other->flags, pcmk__rsc_unassigned)) { pcmk__rsc_trace(rsc, "%s: Assigning colocation %s primary %s first" "(score=%d role=%s)", @@ -354,20 +356,20 @@ remote_connection_assigned(const pcmk_resource_t *connection) if ((connection->priv->assigned_node != NULL) && (connection->priv->next_role != pcmk_role_stopped)) { - crm_trace("Pacemaker Remote node %s will be online", - remote_node->priv->id); + pcmk__trace("Pacemaker Remote node %s will be online", + remote_node->priv->id); remote_node->details->online = TRUE; - if (!pcmk_is_set(remote_node->priv->flags, pcmk__node_seen)) { + if (!pcmk__is_set(remote_node->priv->flags, pcmk__node_seen)) { // Avoid unnecessary fence, since we will attempt connection remote_node->details->unclean = FALSE; } } else { - crm_trace("Pacemaker Remote node %s will be shut down " - "(%sassigned connection's next role is %s)", - remote_node->priv->id, - ((connection->priv->assigned_node == NULL)? "un" : ""), - pcmk_role_text(connection->priv->next_role)); + pcmk__trace("Pacemaker Remote node %s will be shut down (%sassigned " + "connection's next role is %s)", + remote_node->priv->id, + ((connection->priv->assigned_node == NULL)? "un" : ""), + pcmk_role_text(connection->priv->next_role)); remote_node->details->shutdown = TRUE; } } @@ -406,13 +408,13 @@ pcmk__primitive_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, parent = rsc->priv->parent; // Never assign a child without parent being assigned first - if ((parent != NULL) && !pcmk_is_set(parent->flags, pcmk__rsc_assigning)) { + if ((parent != NULL) && !pcmk__is_set(parent->flags, pcmk__rsc_assigning)) { pcmk__rsc_debug(rsc, "%s: Assigning parent %s first", rsc->id, parent->id); parent->priv->cmds->assign(parent, prefer, stop_if_fail); } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { // Assignment has already been done const char *node_name = "no node"; @@ -424,7 +426,7 @@ pcmk__primitive_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, } // Ensure we detect assignment loops - if (pcmk_is_set(rsc->flags, pcmk__rsc_assigning)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_assigning)) { pcmk__rsc_debug(rsc, "Breaking assignment loop involving %s", rsc->id); return NULL; } @@ -486,27 +488,27 @@ pcmk__primitive_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, PCMK_META_TARGET_ROLE, scheduler); } else if ((rsc->priv->next_role > rsc->priv->orig_role) - && !pcmk_is_set(scheduler->flags, pcmk__sched_quorate) + && !pcmk__is_set(scheduler->flags, pcmk__sched_quorate) && (scheduler->no_quorum_policy == pcmk_no_quorum_freeze)) { - crm_notice("Resource %s cannot be elevated from %s to %s due to " - PCMK_OPT_NO_QUORUM_POLICY "=" PCMK_VALUE_FREEZE, - rsc->id, pcmk_role_text(rsc->priv->orig_role), - pcmk_role_text(rsc->priv->next_role)); + pcmk__notice("Resource %s cannot be elevated from %s to %s due to " + PCMK_OPT_NO_QUORUM_POLICY "=" PCMK_VALUE_FREEZE, + rsc->id, pcmk_role_text(rsc->priv->orig_role), + pcmk_role_text(rsc->priv->next_role)); pe__set_next_role(rsc, rsc->priv->orig_role, PCMK_OPT_NO_QUORUM_POLICY "=" PCMK_VALUE_FREEZE); } - pe__show_node_scores(!pcmk_is_set(scheduler->flags, - pcmk__sched_output_scores), + pe__show_node_scores(!pcmk__is_set(scheduler->flags, + pcmk__sched_output_scores), rsc, __func__, rsc->priv->allowed_nodes, scheduler); // Unmanage resource if fencing is enabled but no device is configured - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled) - && !pcmk_is_set(scheduler->flags, pcmk__sched_have_fencing)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled) + && !pcmk__is_set(scheduler->flags, pcmk__sched_have_fencing)) { pcmk__clear_rsc_flags(rsc, pcmk__rsc_managed); } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { // Unmanaged resources stay on their current node const char *reason = NULL; pcmk_node_t *assign_to = NULL; @@ -517,7 +519,7 @@ pcmk__primitive_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, reason = "inactive"; } else if (rsc->priv->orig_role == pcmk_role_promoted) { reason = "promoted"; - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { reason = "failed"; } else { reason = "active"; @@ -527,7 +529,7 @@ pcmk__primitive_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, reason); pcmk__assign_resource(rsc, assign_to, true, stop_if_fail); - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_stop_all)) { + } else if (pcmk__is_set(scheduler->flags, pcmk__sched_stop_all)) { // Must stop at some point, but be consistent with stop_if_fail if (stop_if_fail) { pcmk__rsc_debug(rsc, @@ -538,7 +540,7 @@ pcmk__primitive_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, } else if (!assign_best_node(rsc, prefer, stop_if_fail)) { // Assignment failed - if (!pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { pcmk__rsc_info(rsc, "Resource %s cannot run anywhere", rsc->id); } else if ((rsc->priv->active_nodes != NULL) && stop_if_fail) { pcmk__rsc_info(rsc, "Stopping removed resource %s", rsc->id); @@ -547,7 +549,7 @@ pcmk__primitive_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, pcmk__clear_rsc_flags(rsc, pcmk__rsc_assigning); - if (pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { remote_connection_assigned(rsc); } @@ -592,7 +594,7 @@ schedule_restart_actions(pcmk_resource_t *rsc, pcmk_node_t *current, // Bring resource up to its next role on its next node while ((rsc->priv->orig_role <= rsc->priv->next_role) && (role != rsc->priv->orig_role) - && !pcmk_is_set(rsc->flags, pcmk__rsc_blocked)) { + && !pcmk__is_set(rsc->flags, pcmk__rsc_blocked)) { bool required = need_stop; next_role = rsc_state_matrix[role][rsc->priv->orig_role]; @@ -757,25 +759,25 @@ pcmk__primitive_create_actions(pcmk_resource_t *rsc) if (num_all_active > 2) { // The resource is migrating *and* multiply active! - crm_notice("Forcing recovery of %s because it is migrating " - "from %s to %s and possibly active elsewhere", - rsc->id, - pcmk__node_name(rsc->priv->partial_migration_source), - pcmk__node_name(migration_target)); + pcmk__notice("Forcing recovery of %s because it is migrating " + "from %s to %s and possibly active elsewhere", + rsc->id, + pcmk__node_name(rsc->priv->partial_migration_source), + pcmk__node_name(migration_target)); } else { // The migration source or target isn't available - crm_notice("Forcing recovery of %s because it can no longer " - "migrate from %s to %s", - rsc->id, - pcmk__node_name(rsc->priv->partial_migration_source), - pcmk__node_name(migration_target)); + pcmk__notice("Forcing recovery of %s because it can no longer " + "migrate from %s to %s", + rsc->id, + pcmk__node_name(rsc->priv->partial_migration_source), + pcmk__node_name(migration_target)); } need_stop = true; rsc->priv->partial_migration_source = NULL; rsc->priv->partial_migration_target = NULL; allow_migrate = false; - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_needs_fencing)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_needs_fencing)) { multiply_active = (num_all_active > 1); } else { /* If a resource has PCMK_META_REQUIRES set to PCMK_VALUE_NOTHING or @@ -789,16 +791,16 @@ pcmk__primitive_create_actions(pcmk_resource_t *rsc) } if (multiply_active) { - const char *class = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); + const char *class = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); // Resource was (possibly) incorrectly multiply active pcmk__sched_err(rsc->priv->scheduler, "%s resource %s might be active on %u nodes (%s)", pcmk__s(class, "Untyped"), rsc->id, num_all_active, pcmk__multiply_active_text(rsc)); - crm_notice("For more information, see \"What are multiply active " - "resources?\" at " - "https://projects.clusterlabs.org/w/clusterlabs/faq/"); + pcmk__notice("For more information, see \"What are multiply active " + "resources?\" at " + "https://projects.clusterlabs.org/w/clusterlabs/faq/"); switch (rsc->priv->multiply_active_policy) { case pcmk__multiply_active_restart: @@ -816,15 +818,15 @@ pcmk__primitive_create_actions(pcmk_resource_t *rsc) pcmk__clear_rsc_flags(rsc, pcmk__rsc_stop_unexpected); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_start_pending)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_start_pending)) { create_pending_start(rsc); } if (is_moving) { // Remaining tests are only for resources staying where they are - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_stop_if_failed)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_stop_if_failed)) { need_stop = true; pcmk__rsc_trace(rsc, "Recovering %s", rsc->id); } else { @@ -834,7 +836,7 @@ pcmk__primitive_create_actions(pcmk_resource_t *rsc) } } - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_blocked)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_blocked)) { pcmk__rsc_trace(rsc, "Blocking further actions on %s", rsc->id); need_stop = true; @@ -846,7 +848,7 @@ pcmk__primitive_create_actions(pcmk_resource_t *rsc) pcmk__rsc_trace(rsc, "Creating start action for promoted resource %s", rsc->id); start = start_action(rsc, rsc->priv->assigned_node, TRUE); - if (!pcmk_is_set(start->flags, pcmk__action_optional)) { + if (!pcmk__is_set(start->flags, pcmk__action_optional)) { // Recovery of a promoted resource pcmk__rsc_trace(rsc, "%s restart is required for recovery", rsc->id); need_stop = true; @@ -932,7 +934,7 @@ pcmk__primitive_internal_constraints(pcmk_resource_t *rsc) pcmk__assert(pcmk__is_primitive(rsc)); scheduler = rsc->priv->scheduler; - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__rsc_trace(rsc, "Skipping implicit constraints for unmanaged resource " "%s", rsc->id); @@ -940,10 +942,10 @@ pcmk__primitive_internal_constraints(pcmk_resource_t *rsc) } // Whether resource requires unfencing - check_unfencing = !pcmk_is_set(rsc->flags, pcmk__rsc_fence_device) - && pcmk_is_set(scheduler->flags, - pcmk__sched_enable_unfencing) - && pcmk_is_set(rsc->flags, pcmk__rsc_needs_unfencing); + check_unfencing = !pcmk__is_set(rsc->flags, pcmk__rsc_fence_device) + && pcmk__is_set(scheduler->flags, + pcmk__sched_enable_unfencing) + && pcmk__is_set(rsc->flags, pcmk__rsc_needs_unfencing); // Whether a non-default placement strategy is used check_utilization = (g_hash_table_size(rsc->priv->utilization) > 0) @@ -958,8 +960,8 @@ pcmk__primitive_internal_constraints(pcmk_resource_t *rsc) |pcmk__ar_intermediate_stop, scheduler); // Promotable ordering: demote before stop, start before promote - if (pcmk_is_set(pe__const_top_resource(rsc, false)->flags, - pcmk__rsc_promotable) + if (pcmk__is_set(pe__const_top_resource(rsc, false)->flags, + pcmk__rsc_promotable) || (rsc->priv->orig_role > pcmk_role_unpromoted)) { pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, PCMK_ACTION_DEMOTE, 0), @@ -1001,13 +1003,13 @@ pcmk__primitive_internal_constraints(pcmk_resource_t *rsc) if (rsc->priv->launcher != NULL) { pcmk_resource_t *remote_rsc = NULL; - if (pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { // rsc is the implicit remote connection for a guest or bundle node /* Guest resources are not allowed to run on Pacemaker Remote nodes, * to avoid nesting remotes. However, bundles are allowed. */ - if (!pcmk_is_set(rsc->flags, pcmk__rsc_remote_nesting_allowed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_remote_nesting_allowed)) { rsc_avoids_remote_nodes(rsc->priv->launcher); } @@ -1029,8 +1031,8 @@ pcmk__primitive_internal_constraints(pcmk_resource_t *rsc) * we check whether a resource (that is not itself a remote connection) * has PCMK__META_CONTAINER set to a remote node or guest node resource. */ - } else if (pcmk_is_set(rsc->priv->launcher->flags, - pcmk__rsc_is_remote_connection)) { + } else if (pcmk__is_set(rsc->priv->launcher->flags, + pcmk__rsc_is_remote_connection)) { remote_rsc = rsc->priv->launcher; } else { remote_rsc = @@ -1057,8 +1059,8 @@ pcmk__primitive_internal_constraints(pcmk_resource_t *rsc) */ int score; - crm_trace("Order and colocate %s relative to its launcher %s", - rsc->id, rsc->priv->launcher->id); + pcmk__trace("Order and colocate %s relative to its launcher %s", + rsc->id, rsc->priv->launcher->id); pcmk__new_ordering(rsc->priv->launcher, pcmk__op_key(rsc->priv->launcher->id, @@ -1077,7 +1079,7 @@ pcmk__primitive_internal_constraints(pcmk_resource_t *rsc) PCMK_ACTION_STOP, 0), NULL, pcmk__ar_then_implies_first, scheduler); - if (pcmk_is_set(rsc->flags, pcmk__rsc_remote_nesting_allowed) + if (pcmk__is_set(rsc->flags, pcmk__rsc_remote_nesting_allowed) /* @TODO: && non-bundle Pacemaker Remote nodes exist */) { score = 10000; /* Highly preferred but not essential */ } else { @@ -1089,8 +1091,8 @@ pcmk__primitive_internal_constraints(pcmk_resource_t *rsc) } } - if (pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection) - || pcmk_is_set(rsc->flags, pcmk__rsc_fence_device)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection) + || pcmk__is_set(rsc->flags, pcmk__rsc_fence_device)) { /* Remote connections and fencing devices are not allowed to run on * Pacemaker Remote nodes */ @@ -1180,7 +1182,7 @@ pcmk__with_primitive_colocations(const pcmk_resource_t *rsc, iter != NULL; iter = iter->next) { pcmk__colocation_t *colocation = iter->data; - if (pcmk_is_set(colocation->flags, pcmk__coloc_explicit)) { + if (pcmk__is_set(colocation->flags, pcmk__coloc_explicit)) { pcmk__add_with_this(list, colocation, orig_rsc); } } @@ -1214,7 +1216,7 @@ pcmk__primitive_with_colocations(const pcmk_resource_t *rsc, iter != NULL; iter = iter->next) { pcmk__colocation_t *colocation = iter->data; - if (pcmk_is_set(colocation->flags, pcmk__coloc_explicit)) { + if (pcmk__is_set(colocation->flags, pcmk__coloc_explicit)) { pcmk__add_this_with(list, colocation, orig_rsc); } } @@ -1254,8 +1256,8 @@ pcmk__primitive_action_flags(pcmk_action_t *action, const pcmk_node_t *node) static bool is_expected_node(const pcmk_resource_t *rsc, const pcmk_node_t *node) { - return pcmk_all_flags_set(rsc->flags, - pcmk__rsc_stop_unexpected|pcmk__rsc_restarting) + return pcmk__all_flags_set(rsc->flags, + pcmk__rsc_stop_unexpected|pcmk__rsc_restarting) && (rsc->priv->next_role > pcmk_role_stopped) && pcmk__same_node(rsc->priv->assigned_node, node); } @@ -1313,8 +1315,9 @@ stop_resource(pcmk_resource_t *rsc, pcmk_node_t *node, bool optional) if (rsc->priv->assigned_node == NULL) { pe_action_set_reason(stop, "node availability", true); - } else if (pcmk_all_flags_set(rsc->flags, pcmk__rsc_restarting - |pcmk__rsc_stop_unexpected)) { + } else if (pcmk__all_flags_set(rsc->flags, + pcmk__rsc_restarting + |pcmk__rsc_stop_unexpected)) { /* We are stopping a multiply active resource on a node that is * not its expected node, and we are still scheduling restart * actions, so the stop is for being multiply active. @@ -1322,11 +1325,11 @@ stop_resource(pcmk_resource_t *rsc, pcmk_node_t *node, bool optional) pe_action_set_reason(stop, "being multiply active", true); } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__clear_action_flags(stop, pcmk__action_runnable); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_needs_unfencing)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_needs_unfencing)) { pcmk_action_t *unfence = pe_fence_op(current, PCMK_ACTION_ON, true, NULL, false, rsc->priv->scheduler); @@ -1363,7 +1366,7 @@ start_resource(pcmk_resource_t *rsc, pcmk_node_t *node, bool optional) pcmk__order_vs_unfence(rsc, node, start, pcmk__ar_first_implies_then); - if (pcmk_is_set(start->flags, pcmk__action_runnable) && !optional) { + if (pcmk__is_set(start->flags, pcmk__action_runnable) && !optional) { pcmk__clear_action_flags(start, pcmk__action_optional); } @@ -1401,7 +1404,7 @@ promote_resource(pcmk_resource_t *rsc, pcmk_node_t *node, bool optional) for (iter = action_list; iter != NULL; iter = iter->next) { pcmk_action_t *start = (pcmk_action_t *) iter->data; - if (!pcmk_is_set(start->flags, pcmk__action_runnable)) { + if (!pcmk__is_set(start->flags, pcmk__action_runnable)) { runnable = false; } } @@ -1500,7 +1503,7 @@ pcmk__schedule_cleanup(pcmk_resource_t *rsc, const pcmk_node_t *node, CRM_CHECK((rsc != NULL) && (node != NULL), return); - if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { pcmk__rsc_trace(rsc, "Skipping clean-up of %s on %s: resource failed", rsc->id, pcmk__node_name(node)); return; @@ -1512,8 +1515,8 @@ pcmk__schedule_cleanup(pcmk_resource_t *rsc, const pcmk_node_t *node, return; } - crm_notice("Scheduling clean-up of %s on %s", - rsc->id, pcmk__node_name(node)); + pcmk__notice("Scheduling clean-up of %s on %s", rsc->id, + pcmk__node_name(node)); delete_action(rsc, node, optional); // stop -> clean-up -> start @@ -1546,7 +1549,7 @@ pcmk__primitive_add_graph_meta(const pcmk_resource_t *rsc, xmlNode *xml) value = g_hash_table_lookup(rsc->priv->meta, PCMK__META_CLONE); if (value != NULL) { name = crm_meta_name(PCMK__META_CLONE); - crm_xml_add(xml, name, value); + pcmk__xe_set(xml, name, value); free(name); } @@ -1554,7 +1557,7 @@ pcmk__primitive_add_graph_meta(const pcmk_resource_t *rsc, xmlNode *xml) value = g_hash_table_lookup(rsc->priv->meta, PCMK_META_REMOTE_NODE); if (value != NULL) { name = crm_meta_name(PCMK_META_REMOTE_NODE); - crm_xml_add(xml, name, value); + pcmk__xe_set(xml, name, value); free(name); } @@ -1563,7 +1566,7 @@ pcmk__primitive_add_graph_meta(const pcmk_resource_t *rsc, xmlNode *xml) */ for (parent = rsc; parent != NULL; parent = parent->priv->parent) { if (parent->priv->launcher != NULL) { - crm_xml_add(xml, CRM_META "_" PCMK__META_CONTAINER, + pcmk__xe_set(xml, CRM_META "_" PCMK__META_CONTAINER, parent->priv->launcher->id); } } @@ -1574,7 +1577,7 @@ pcmk__primitive_add_graph_meta(const pcmk_resource_t *rsc, xmlNode *xml) */ value = g_hash_table_lookup(rsc->priv->meta, "external-ip"); if (value != NULL) { - crm_xml_add(xml, "pcmk_external_ip", value); + pcmk__xe_set(xml, "pcmk_external_ip", value); } } @@ -1587,7 +1590,7 @@ pcmk__primitive_add_utilization(const pcmk_resource_t *rsc, pcmk__assert(pcmk__is_primitive(rsc) && (orig_rsc != NULL) && (utilization != NULL)); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { return; } @@ -1619,9 +1622,9 @@ shutdown_time(pcmk_node_t *node) if (rc == pcmk_rc_ok) { result = (time_t) result_ll; } else { - crm_warn("Ignoring invalid value '%s' for %s " - PCMK__NODE_ATTR_SHUTDOWN " attribute: %s", - shutdown, pcmk__node_name(node), pcmk_rc_str(rc)); + pcmk__warn("Ignoring invalid value '%s' for %s " + PCMK__NODE_ATTR_SHUTDOWN " attribute: %s", + shutdown, pcmk__node_name(node), pcmk_rc_str(rc)); } } if (result == 0) { @@ -1659,8 +1662,9 @@ pcmk__primitive_shutdown_lock(pcmk_resource_t *rsc) scheduler = rsc->priv->scheduler; // Fence devices and remote connections can't be locked - if (pcmk_any_flags_set(rsc->flags, pcmk__rsc_fence_device - |pcmk__rsc_is_remote_connection)) { + if (pcmk__any_flags_set(rsc->flags, + pcmk__rsc_fence_device + |pcmk__rsc_is_remote_connection)) { return; } diff --git a/lib/pacemaker/pcmk_sched_probes.c b/lib/pacemaker/pcmk_sched_probes.c index bda90cee199..fe6aea3627d 100644 --- a/lib/pacemaker/pcmk_sched_probes.c +++ b/lib/pacemaker/pcmk_sched_probes.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -110,9 +110,9 @@ guest_resource_will_stop(const pcmk_node_t *node) /* Ideally, we'd check whether the guest has a required stop, but that * information doesn't exist yet, so approximate it ... */ - return pcmk_is_set(node->priv->flags, pcmk__node_remote_reset) + return pcmk__is_set(node->priv->flags, pcmk__node_remote_reset) || node->details->unclean - || pcmk_is_set(guest_rsc->flags, pcmk__rsc_failed) + || pcmk__is_set(guest_rsc->flags, pcmk__rsc_failed) || (guest_rsc->priv->next_role == pcmk_role_stopped) // Guest is moving @@ -137,9 +137,9 @@ probe_action(pcmk_resource_t *rsc, pcmk_node_t *node) pcmk_action_t *probe = NULL; char *key = pcmk__op_key(rsc->id, PCMK_ACTION_MONITOR, 0); - crm_debug("Scheduling probe of %s %s on %s", - pcmk_role_text(rsc->priv->orig_role), rsc->id, - pcmk__node_name(node)); + pcmk__debug("Scheduling probe of %s %s on %s", + pcmk_role_text(rsc->priv->orig_role), rsc->id, + pcmk__node_name(node)); probe = custom_action(rsc, key, PCMK_ACTION_MONITOR, node, FALSE, rsc->priv->scheduler); @@ -172,14 +172,14 @@ pcmk__probe_rsc_on_node(pcmk_resource_t *rsc, pcmk_node_t *node) pcmk__assert((rsc != NULL) && (node != NULL)); - if (!pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_probe_resources)) { + if (!pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_probe_resources)) { reason = "start-up probes are disabled"; goto no_probe; } if (pcmk__is_pacemaker_remote_node(node)) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_fence_device)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_fence_device)) { reason = "Pacemaker Remote nodes cannot run stonith agents"; goto no_probe; @@ -189,7 +189,7 @@ pcmk__probe_rsc_on_node(pcmk_resource_t *rsc, pcmk_node_t *node) reason = "guest nodes cannot run resources containing guest nodes"; goto no_probe; - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { reason = "Pacemaker Remote nodes cannot host remote connections"; goto no_probe; } @@ -201,11 +201,11 @@ pcmk__probe_rsc_on_node(pcmk_resource_t *rsc, pcmk_node_t *node) } if ((rsc->priv->launcher != NULL) - && !pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { + && !pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { reason = "resource is inside a container"; goto no_probe; - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { reason = "resource is orphaned"; goto no_probe; @@ -218,8 +218,8 @@ pcmk__probe_rsc_on_node(pcmk_resource_t *rsc, pcmk_node_t *node) allowed = g_hash_table_lookup(rsc->priv->allowed_nodes, node->priv->id); - if (pcmk_is_set(rsc->flags, pcmk__rsc_exclusive_probes) - || pcmk_is_set(top->flags, pcmk__rsc_exclusive_probes)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_exclusive_probes) + || pcmk__is_set(top->flags, pcmk__rsc_exclusive_probes)) { // Exclusive discovery is enabled ... if (allowed == NULL) { @@ -281,7 +281,7 @@ pcmk__probe_rsc_on_node(pcmk_resource_t *rsc, pcmk_node_t *node) /* Prevent a start if the resource can't be probed, but don't cause the * resource or entire clone to stop if already active. */ - if (!pcmk_is_set(probe->flags, pcmk__action_runnable) + if (!pcmk__is_set(probe->flags, pcmk__action_runnable) && (top->priv->active_nodes == NULL)) { pcmk__set_relation_flags(flags, pcmk__ar_unrunnable_first_blocks); } @@ -409,11 +409,11 @@ add_probe_orderings_for_stops(pcmk_scheduler_t *scheduler) } // Preserve certain order options for future filtering - if (pcmk_is_set(order->flags, pcmk__ar_if_first_unmigratable)) { + if (pcmk__is_set(order->flags, pcmk__ar_if_first_unmigratable)) { pcmk__set_relation_flags(order_flags, pcmk__ar_if_first_unmigratable); } - if (pcmk_is_set(order->flags, pcmk__ar_if_on_same_node)) { + if (pcmk__is_set(order->flags, pcmk__ar_if_on_same_node)) { pcmk__set_relation_flags(order_flags, pcmk__ar_if_on_same_node); } @@ -443,11 +443,11 @@ add_probe_orderings_for_stops(pcmk_scheduler_t *scheduler) } } - crm_trace("Implying 'probe then' orderings for '%s then %s' " - "(id=%d, type=%.6x)", - ((first == NULL)? order->task1 : first->uuid), - ((then == NULL)? order->task2 : then->uuid), - order->id, order->flags); + pcmk__trace("Implying 'probe then' orderings for '%s then %s' " + "(id=%d, type=%.6x)", + ((first != NULL)? first->uuid : order->task1), + ((then != NULL)? then->uuid : order->task2), + order->id, order->flags); for (GList *probe_iter = probes; probe_iter != NULL; probe_iter = probe_iter->next) { @@ -497,19 +497,19 @@ add_start_orderings_for_probe(pcmk_action_t *probe, * many instances before we know the state on all nodes. */ if ((after->action->rsc->priv->variant <= pcmk__rsc_variant_group) - || pcmk_is_set(probe->flags, pcmk__action_runnable) + || pcmk__is_set(probe->flags, pcmk__action_runnable) // The order type is already enforced for its parent. - || pcmk_is_set(after->flags, pcmk__ar_unrunnable_first_blocks) + || pcmk__is_set(after->flags, pcmk__ar_unrunnable_first_blocks) || (pe__const_top_resource(probe->rsc, false) != after->action->rsc) || !pcmk__str_eq(after->action->task, PCMK_ACTION_START, pcmk__str_none)) { return; } - crm_trace("Adding probe start orderings for 'unrunnable %s@%s " - "then instances of %s@%s'", - probe->uuid, pcmk__node_name(probe->node), - after->action->uuid, pcmk__node_name(after->action->node)); + pcmk__trace("Adding probe start orderings for 'unrunnable %s@%s " + "then instances of %s@%s'", + probe->uuid, pcmk__node_name(probe->node), + after->action->uuid, pcmk__node_name(after->action->node)); for (GList *then_iter = after->action->actions_after; then_iter != NULL; then_iter = then_iter->next) { @@ -524,11 +524,11 @@ add_start_orderings_for_probe(pcmk_action_t *probe, continue; } - crm_trace("Adding probe start ordering for 'unrunnable %s@%s " - "then %s@%s' (type=%#.6x)", - probe->uuid, pcmk__node_name(probe->node), - then->action->uuid, pcmk__node_name(then->action->node), - flags); + pcmk__trace("Adding probe start ordering for 'unrunnable %s@%s " + "then %s@%s' (type=%#.6x)", + probe->uuid, pcmk__node_name(probe->node), + then->action->uuid, pcmk__node_name(then->action->node), + flags); /* Prevent the instance from starting if the instance can't, but don't * cause any other intances to stop if already active. @@ -565,14 +565,14 @@ add_restart_orderings_for_probe(pcmk_action_t *probe, pcmk_action_t *after) } // Avoid running into any possible loop - if (pcmk_is_set(after->flags, pcmk__action_detect_loop)) { + if (pcmk__is_set(after->flags, pcmk__action_detect_loop)) { return; } pcmk__set_action_flags(after, pcmk__action_detect_loop); - crm_trace("Adding probe restart orderings for '%s@%s then %s@%s'", - probe->uuid, pcmk__node_name(probe->node), - after->uuid, pcmk__node_name(after->node)); + pcmk__trace("Adding probe restart orderings for '%s@%s then %s@%s'", + probe->uuid, pcmk__node_name(probe->node), + after->uuid, pcmk__node_name(after->node)); /* Add restart orderings if "then" is for a different primitive. * Orderings for collective resources will be added later. @@ -595,7 +595,7 @@ add_restart_orderings_for_probe(pcmk_action_t *probe, pcmk_action_t *after) pcmk_action_t *then = (pcmk_action_t *) iter->data; // Skip pseudo-actions (for example, those implied by fencing) - if (!pcmk_is_set(then->flags, pcmk__action_pseudo)) { + if (!pcmk__is_set(then->flags, pcmk__action_pseudo)) { order_actions(probe, then, pcmk__ar_ordered); } } @@ -608,8 +608,8 @@ add_restart_orderings_for_probe(pcmk_action_t *probe, pcmk_action_t *after) if ((after->rsc != NULL) && (after->rsc->priv->variant > pcmk__rsc_variant_group)) { - interleave = crm_is_true(g_hash_table_lookup(after->rsc->priv->meta, - PCMK_META_INTERLEAVE)); + interleave = pcmk__is_true(g_hash_table_lookup(after->rsc->priv->meta, + PCMK_META_INTERLEAVE)); if (interleave) { compatible_rsc = pcmk__find_compatible_instance(probe->rsc, after->rsc, @@ -634,7 +634,7 @@ add_restart_orderings_for_probe(pcmk_action_t *probe, pcmk_action_t *after) * only used for unfencing case, which tends to introduce transition * loops... */ - if (!pcmk_is_set(after_wrapper->flags, pcmk__ar_first_implies_then)) { + if (!pcmk__is_set(after_wrapper->flags, pcmk__ar_first_implies_then)) { /* The order type between a group/clone and its child such as * B.start-> B_child.start is: * pcmk__ar_then_implies_first_graphed @@ -667,12 +667,12 @@ add_restart_orderings_for_probe(pcmk_action_t *probe, pcmk_action_t *after) } } - crm_trace("Recursively adding probe restart orderings for " - "'%s@%s then %s@%s' (type=%#.6x)", - after->uuid, pcmk__node_name(after->node), - after_wrapper->action->uuid, - pcmk__node_name(after_wrapper->action->node), - after_wrapper->flags); + pcmk__trace("Recursively adding probe restart orderings for " + "'%s@%s then %s@%s' (type=%#.6x)", + after->uuid, pcmk__node_name(after->node), + after_wrapper->action->uuid, + pcmk__node_name(after_wrapper->action->node), + after_wrapper->flags); add_restart_orderings_for_probe(probe, after_wrapper->action); } @@ -793,7 +793,7 @@ order_then_probes(pcmk_scheduler_t *scheduler) } if (start == NULL) { - crm_debug("No start action for %s", rsc->id); + pcmk__debug("No start action for %s", rsc->id); continue; } @@ -814,8 +814,8 @@ order_then_probes(pcmk_scheduler_t *scheduler) before = clone_actions->data; - crm_trace("Testing '%s then %s' for %s", - first->uuid, before->action->uuid, start->uuid); + pcmk__trace("Testing '%s then %s' for %s", + first->uuid, before->action->uuid, start->uuid); pcmk__assert(before->action->rsc != NULL); first_rsc = before->action->rsc; @@ -824,7 +824,8 @@ order_then_probes(pcmk_scheduler_t *scheduler) } else if (!pcmk__str_eq(first->task, PCMK_ACTION_START, pcmk__str_none)) { - crm_trace("Not a start op %s for %s", first->uuid, start->uuid); + pcmk__trace("Not a start op %s for %s", first->uuid, + start->uuid); } if (first_rsc == NULL) { @@ -832,23 +833,25 @@ order_then_probes(pcmk_scheduler_t *scheduler) } else if (pe__const_top_resource(first_rsc, false) == pe__const_top_resource(start->rsc, false)) { - crm_trace("Same parent %s for %s", first_rsc->id, start->uuid); + pcmk__trace("Same parent %s for %s", first_rsc->id, + start->uuid); continue; } else if (!pcmk__is_clone(pe__const_top_resource(first_rsc, false))) { - crm_trace("Not a clone %s for %s", first_rsc->id, start->uuid); + pcmk__trace("Not a clone %s for %s", first_rsc->id, + start->uuid); continue; } - crm_debug("Applying %s before %s", first->uuid, start->uuid); + pcmk__debug("Applying %s before %s", first->uuid, start->uuid); for (GList *probe_iter = probes; probe_iter != NULL; probe_iter = probe_iter->next) { pcmk_action_t *probe = (pcmk_action_t *) probe_iter->data; - crm_debug("Ordering %s before %s", first->uuid, probe->uuid); + pcmk__debug("Ordering %s before %s", first->uuid, probe->uuid); order_actions(first, probe, pcmk__ar_ordered); } } @@ -894,7 +897,7 @@ pcmk__schedule_probes(pcmk_scheduler_t *scheduler) continue; } - if (!pcmk_is_set(node->priv->flags, pcmk__node_probes_allowed)) { + if (!pcmk__is_set(node->priv->flags, pcmk__node_probes_allowed)) { // The user requested that probes not be done on this node continue; } diff --git a/lib/pacemaker/pcmk_sched_promotable.c b/lib/pacemaker/pcmk_sched_promotable.c index cdf276f3f94..2042e1799a6 100644 --- a/lib/pacemaker/pcmk_sched_promotable.c +++ b/lib/pacemaker/pcmk_sched_promotable.c @@ -11,6 +11,7 @@ #include // bool, true, false +#include // PCMK_SCORE_INFINITY #include #include @@ -100,7 +101,7 @@ check_for_role_change(const pcmk_resource_t *rsc, bool *demoting, if (*promoting && *demoting) { return; - } else if (pcmk_is_set(action->flags, pcmk__action_optional)) { + } else if (pcmk__is_set(action->flags, pcmk__action_optional)) { continue; } else if (pcmk__str_eq(PCMK_ACTION_DEMOTE, action->task, @@ -191,10 +192,10 @@ node_to_be_promoted_on(const pcmk_resource_t *rsc) rsc->id); return NULL; - } else if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + } else if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { if (rsc->priv->fns->state(rsc, true) == pcmk_role_promoted) { - crm_notice("Unmanaged instance %s will be left promoted on %s", - rsc->id, pcmk__node_name(node)); + pcmk__notice("Unmanaged instance %s will be left promoted on %s", + rsc->id, pcmk__node_name(node)); } else { pcmk__rsc_trace(rsc, "%s can't be promoted because it is unmanaged", rsc->id); @@ -224,7 +225,7 @@ node_to_be_promoted_on(const pcmk_resource_t *rsc) * instance to a node where its parent is not allowed, but it's good to * have a fail-safe. */ - if (pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__sched_err(node->priv->scheduler, "%s can't be promoted because %s is not allowed " "on %s (scheduler bug?)", @@ -233,7 +234,7 @@ node_to_be_promoted_on(const pcmk_resource_t *rsc) return NULL; } else if ((local_node->assign->count >= pe__clone_promoted_node_max(parent)) - && pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + && pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__rsc_trace(rsc, "%s can't be promoted because %s has " "maximum promoted instances already", @@ -402,7 +403,7 @@ set_promotion_priority_to_node_score(gpointer data, gpointer user_data) pcmk_node_t *chosen = child->priv->fns->location(child, NULL, pcmk__rsc_node_assigned); - if (!pcmk_is_set(child->flags, pcmk__rsc_managed) + if (!pcmk__is_set(child->flags, pcmk__rsc_managed) && (child->priv->next_role == pcmk_role_promoted)) { child->priv->promotion_priority = PCMK_SCORE_INFINITY; pcmk__rsc_trace(clone, @@ -593,7 +594,7 @@ promotion_score_applies(const pcmk_resource_t *rsc, const pcmk_node_t *node) const char *reason = "allowed"; // Some checks apply only to anonymous clone instances - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { // If instance is active on the node, its score definitely applies active = find_active_anon_instance(parent, id, node); @@ -672,7 +673,7 @@ promotion_attr_value(const pcmk_resource_t *rsc, const pcmk_node_t *node, const char *target = NULL; enum pcmk__rsc_node node_type = pcmk__rsc_node_assigned; - if (pcmk_is_set(rsc->flags, pcmk__rsc_unassigned)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_unassigned)) { // Not assigned yet node_type = pcmk__rsc_node_current; } @@ -745,7 +746,7 @@ promotion_score(const pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk__rsc_trace(rsc, "Promotion score for %s on %s = %s", name, pcmk__node_name(node), pcmk__s(attr_value, "(unset)")); - } else if (!pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + } else if (!pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { /* If we don't have any resource history yet, we won't have history_id. * In that case, for anonymous clones, try the resource name without * any instance number. @@ -771,9 +772,9 @@ promotion_score(const pcmk_resource_t *rsc, const pcmk_node_t *node, rc = pcmk_parse_score(attr_value, &score, 0); if (rc != pcmk_rc_ok) { - crm_warn("Using 0 as promotion score for %s on %s " - "because '%s' is not a valid score", - rsc->id, pcmk__node_name(node), attr_value); + pcmk__warn("Using 0 as promotion score for %s on %s because '%s' is " + "not a valid score", + rsc->id, pcmk__node_name(node), attr_value); } return score; } @@ -911,8 +912,8 @@ show_promotion_score(pcmk_resource_t *instance) chosen = instance->priv->fns->location(instance, NULL, pcmk__rsc_node_assigned); score_s = pcmk_readable_score(instance->priv->promotion_priority); - if (pcmk_is_set(instance->priv->scheduler->flags, - pcmk__sched_output_scores) + if (pcmk__is_set(instance->priv->scheduler->flags, + pcmk__sched_output_scores) && !pcmk__is_daemon && (instance->priv->scheduler->priv->out != NULL)) { @@ -1002,8 +1003,9 @@ set_instance_priority(gpointer data, gpointer user_data) break; default: - CRM_CHECK(FALSE, crm_err("Unknown resource role %d for %s", - next_role, instance->id)); + CRM_CHECK(FALSE, + pcmk__err("Unknown resource role %d for %s", next_role, + instance->id)); } // Add relevant location constraint scores for promoted role @@ -1054,7 +1056,7 @@ set_instance_role(gpointer data, gpointer user_data) instance->id); } else if ((*count < pe__clone_promoted_max(instance)) - || !pcmk_is_set(clone->flags, pcmk__rsc_managed)) { + || !pcmk__is_set(clone->flags, pcmk__rsc_managed)) { chosen = node_to_be_promoted_on(instance); } @@ -1064,10 +1066,10 @@ set_instance_role(gpointer data, gpointer user_data) } if ((instance->priv->orig_role < pcmk_role_promoted) - && !pcmk_is_set(scheduler->flags, pcmk__sched_quorate) + && !pcmk__is_set(scheduler->flags, pcmk__sched_quorate) && (scheduler->no_quorum_policy == pcmk_no_quorum_freeze)) { - crm_notice("Clone instance %s cannot be promoted without quorum", - instance->id); + pcmk__notice("Clone instance %s cannot be promoted without quorum", + instance->id); set_next_role_unpromoted(instance, NULL); return; } diff --git a/lib/pacemaker/pcmk_sched_recurring.c b/lib/pacemaker/pcmk_sched_recurring.c index 88d8a7035b1..bf929d9cd73 100644 --- a/lib/pacemaker/pcmk_sched_recurring.c +++ b/lib/pacemaker/pcmk_sched_recurring.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -42,7 +42,7 @@ xe_interval(const xmlNode *xml) { guint interval_ms = 0U; - pcmk_parse_interval_spec(crm_element_value(xml, PCMK_META_INTERVAL), + pcmk_parse_interval_spec(pcmk__xe_get(xml, PCMK_META_INTERVAL), &interval_ms); return interval_ms; } @@ -68,8 +68,7 @@ is_op_dup(const pcmk_resource_t *rsc, const char *name, guint interval_ms) op != NULL; op = pcmk__xe_next(op, PCMK_XE_OP)) { // Check whether action name and interval match - if (!pcmk__str_eq(crm_element_value(op, PCMK_XA_NAME), name, - pcmk__str_none) + if (!pcmk__str_eq(pcmk__xe_get(op, PCMK_XA_NAME), name, pcmk__str_none) || (xe_interval(op) != interval_ms)) { continue; } @@ -143,7 +142,7 @@ is_recurring_history(const pcmk_resource_t *rsc, const xmlNode *xml, return false; // Shouldn't be possible (unless CIB was manually edited) } - op->name = crm_element_value(xml, PCMK_XA_NAME); + op->name = pcmk__xe_get(xml, PCMK_XA_NAME); if (op_cannot_recur(op->name)) { pcmk__config_err("Ignoring %s because %s action cannot be recurring", op->id, pcmk__s(op->name, "unnamed")); @@ -156,7 +155,7 @@ is_recurring_history(const pcmk_resource_t *rsc, const xmlNode *xml, } // Ensure role is valid if specified - role = crm_element_value(xml, PCMK_XA_ROLE); + role = pcmk__xe_get(xml, PCMK_XA_ROLE); if (role == NULL) { op->role = pcmk_role_unknown; } else { @@ -208,8 +207,8 @@ active_recurring_should_be_optional(const pcmk_resource_t *rsc, return false; } - if (!pcmk_is_set(rsc->priv->cmds->action_flags(start, NULL), - pcmk__action_optional)) { + if (!pcmk__is_set(rsc->priv->cmds->action_flags(start, NULL), + pcmk__action_optional)) { pcmk__rsc_trace(rsc, "%s will be mandatory because %s is", key, start->uuid); return false; @@ -228,7 +227,7 @@ active_recurring_should_be_optional(const pcmk_resource_t *rsc, const pcmk_action_t *op = (const pcmk_action_t *) iter->data; - if (pcmk_is_set(op->flags, pcmk__action_reschedule)) { + if (pcmk__is_set(op->flags, pcmk__action_reschedule)) { pcmk__rsc_trace(rsc, "%s will be mandatory because " "it needs to be rescheduled", key); @@ -307,7 +306,7 @@ recurring_op_for_active(pcmk_resource_t *rsc, pcmk_action_t *start, } } - do_crm_log((is_optional? LOG_INFO : LOG_TRACE), + do_crm_log((is_optional? LOG_INFO : PCMK__LOG_TRACE), "%s recurring action %s because %s configured for %s role " "(not %s)", (is_optional? "Cancelling" : "Ignoring"), op->key, op->id, @@ -325,7 +324,7 @@ recurring_op_for_active(pcmk_resource_t *rsc, pcmk_action_t *start, mon = custom_action(rsc, strdup(op->key), op->name, node, is_optional, rsc->priv->scheduler); - if (!pcmk_is_set(start->flags, pcmk__action_runnable)) { + if (!pcmk__is_set(start->flags, pcmk__action_runnable)) { pcmk__rsc_trace(rsc, "%s is unrunnable because start is", mon->uuid); pcmk__clear_action_flags(mon, pcmk__action_runnable); @@ -335,7 +334,7 @@ recurring_op_for_active(pcmk_resource_t *rsc, pcmk_action_t *start, mon->uuid); pcmk__clear_action_flags(mon, pcmk__action_runnable); - } else if (!pcmk_is_set(mon->flags, pcmk__action_optional)) { + } else if (!pcmk__is_set(mon->flags, pcmk__action_optional)) { pcmk__rsc_info(rsc, "Start %s-interval %s for %s on %s", pcmk__readable_interval(op->interval_ms), mon->task, rsc->id, pcmk__node_name(node)); @@ -346,7 +345,7 @@ recurring_op_for_active(pcmk_resource_t *rsc, pcmk_action_t *start, } // Order monitor relative to other actions - if ((node == NULL) || pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if ((node == NULL) || pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__new_ordering(rsc, start_key(rsc), NULL, NULL, strdup(mon->uuid), mon, pcmk__ar_first_implies_then @@ -463,21 +462,21 @@ order_after_stops(pcmk_resource_t *rsc, const pcmk_node_t *node, for (GList *iter = stop_ops; iter != NULL; iter = iter->next) { pcmk_action_t *stop = (pcmk_action_t *) iter->data; - if (!pcmk_is_set(stop->flags, pcmk__action_optional) - && !pcmk_is_set(action->flags, pcmk__action_optional) - && !pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(stop->flags, pcmk__action_optional) + && !pcmk__is_set(action->flags, pcmk__action_optional) + && !pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__rsc_trace(rsc, "%s optional on %s: unmanaged", action->uuid, pcmk__node_name(node)); pcmk__set_action_flags(action, pcmk__action_optional); } - if (!pcmk_is_set(stop->flags, pcmk__action_runnable)) { - crm_debug("%s unrunnable on %s: stop is unrunnable", - action->uuid, pcmk__node_name(node)); + if (!pcmk__is_set(stop->flags, pcmk__action_runnable)) { + pcmk__debug("%s unrunnable on %s: stop is unrunnable", action->uuid, + pcmk__node_name(node)); pcmk__clear_action_flags(action, pcmk__action_runnable); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__new_ordering(rsc, stop_key(rsc), stop, NULL, NULL, action, pcmk__ar_first_implies_then @@ -507,9 +506,10 @@ recurring_op_for_inactive(pcmk_resource_t *rsc, const pcmk_node_t *node, return; } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { - crm_notice("Ignoring %s (recurring monitors for " PCMK_ROLE_STOPPED - " role are not supported for anonymous clones)", op->id); + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { + pcmk__notice("Ignoring %s (recurring monitors for " PCMK_ROLE_STOPPED + " role are not supported for anonymous clones)", + op->id); return; // @TODO add support } @@ -550,7 +550,7 @@ recurring_op_for_inactive(pcmk_resource_t *rsc, const pcmk_node_t *node, pe__add_action_expected_result(stopped_mon, CRM_EX_NOT_RUNNING); - if (pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { order_after_probes(rsc, stop_node, stopped_mon); } @@ -565,12 +565,13 @@ recurring_op_for_inactive(pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk__clear_action_flags(stopped_mon, pcmk__action_runnable); } - if (pcmk_is_set(stopped_mon->flags, pcmk__action_runnable) - && !pcmk_is_set(stopped_mon->flags, pcmk__action_optional)) { - crm_notice("Start recurring %s-interval %s for " - PCMK_ROLE_STOPPED " %s on %s", - pcmk__readable_interval(op->interval_ms), - stopped_mon->task, rsc->id, pcmk__node_name(stop_node)); + if (pcmk__is_set(stopped_mon->flags, pcmk__action_runnable) + && !pcmk__is_set(stopped_mon->flags, pcmk__action_optional)) { + pcmk__notice("Start recurring %s-interval %s for " + PCMK_ROLE_STOPPED " %s on %s", + pcmk__readable_interval(op->interval_ms), + stopped_mon->task, rsc->id, + pcmk__node_name(stop_node)); } } } @@ -586,14 +587,14 @@ pcmk__create_recurring_actions(pcmk_resource_t *rsc) { pcmk_action_t *start = NULL; - if (pcmk_is_set(rsc->flags, pcmk__rsc_blocked)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_blocked)) { pcmk__rsc_trace(rsc, "Skipping recurring actions for blocked resource %s", rsc->id); return; } - if (pcmk_is_set(rsc->flags, pcmk__rsc_maintenance)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_maintenance)) { pcmk__rsc_trace(rsc, "Skipping recurring actions for %s " "in maintenance mode", rsc->id); @@ -610,7 +611,7 @@ pcmk__create_recurring_actions(pcmk_resource_t *rsc) rsc->id, pcmk__node_name(rsc->priv->assigned_node)); } else if ((rsc->priv->next_role != pcmk_role_stopped) - || !pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + || !pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { // Recurring actions for active roles needed start = start_action(rsc, rsc->priv->assigned_node, TRUE); } @@ -671,7 +672,7 @@ pcmk__new_cancel_action(pcmk_resource_t *rsc, const char *task, pcmk__str_update(&(cancel_op->task), PCMK_ACTION_CANCEL); pcmk__str_update(&(cancel_op->cancel_task), task); - interval_ms_s = crm_strdup_printf("%u", interval_ms); + interval_ms_s = pcmk__assert_asprintf("%u", interval_ms); pcmk__insert_meta(cancel_op, PCMK_XA_OPERATION, task); pcmk__insert_meta(cancel_op, PCMK_META_INTERVAL, interval_ms_s); free(interval_ms_s); @@ -701,9 +702,9 @@ pcmk__schedule_cancel(pcmk_resource_t *rsc, const char *call_id, && (node != NULL) && (reason != NULL), return); - crm_info("Recurring %s-interval %s for %s will be stopped on %s: %s", - pcmk__readable_interval(interval_ms), task, rsc->id, - pcmk__node_name(node), reason); + pcmk__info("Recurring %s-interval %s for %s will be stopped on %s: %s", + pcmk__readable_interval(interval_ms), task, rsc->id, + pcmk__node_name(node), reason); cancel = pcmk__new_cancel_action(rsc, task, interval_ms, node); pcmk__insert_meta(cancel, PCMK__XA_CALL_ID, call_id); diff --git a/lib/pacemaker/pcmk_sched_remote.c b/lib/pacemaker/pcmk_sched_remote.c index 90b43a3995b..cbac9a8198b 100644 --- a/lib/pacemaker/pcmk_sched_remote.c +++ b/lib/pacemaker/pcmk_sched_remote.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -13,6 +13,7 @@ #include #include +#include // hash2metafield() #include #include @@ -113,7 +114,7 @@ get_remote_node_state(const pcmk_node_t *node) return remote_state_failed; } - if (!pcmk_is_set(remote_rsc->flags, pcmk__rsc_failed)) { + if (!pcmk__is_set(remote_rsc->flags, pcmk__rsc_failed)) { /* Connection resource is cleanly stopped */ return remote_state_stopped; } @@ -122,7 +123,7 @@ get_remote_node_state(const pcmk_node_t *node) if ((remote_rsc->priv->next_role == pcmk_role_stopped) && (remote_rsc->priv->remote_reconnect_ms > 0U) - && pcmk_is_set(node->priv->flags, pcmk__node_remote_fenced) + && pcmk__is_set(node->priv->flags, pcmk__node_remote_fenced) && !pe__shutdown_requested(node)) { /* We won't know whether the connection is recoverable until the @@ -184,10 +185,11 @@ apply_remote_ordering(pcmk_action_t *action) remote_rsc = action->node->priv->remote; pcmk__assert(remote_rsc != NULL); - crm_trace("Order %s action %s relative to %s%s (state: %s)", - action->task, action->uuid, - pcmk_is_set(remote_rsc->flags, pcmk__rsc_failed)? "failed " : "", - remote_rsc->id, state2text(state)); + pcmk__trace("Order %s action %s relative to %s%s (state: %s)", action->task, + action->uuid, + (pcmk__is_set(remote_rsc->flags, + pcmk__rsc_failed)? "failed " : ""), + remote_rsc->id, state2text(state)); if (pcmk__strcase_any_of(action->task, PCMK_ACTION_MIGRATE_TO, PCMK_ACTION_MIGRATE_FROM, NULL)) { @@ -313,17 +315,19 @@ apply_launcher_ordering(pcmk_action_t *action) launcher = remote_rsc->priv->launcher; pcmk__assert(launcher != NULL); - if (pcmk_is_set(launcher->flags, pcmk__rsc_failed)) { + if (pcmk__is_set(launcher->flags, pcmk__rsc_failed)) { pe_fence_node(action->rsc->priv->scheduler, action->node, "container failed", FALSE); } - crm_trace("Order %s action %s relative to %s%s for %s%s", - action->task, action->uuid, - pcmk_is_set(remote_rsc->flags, pcmk__rsc_failed)? "failed " : "", - remote_rsc->id, - pcmk_is_set(launcher->flags, pcmk__rsc_failed)? "failed " : "", - launcher->id); + pcmk__trace("Order %s action %s relative to %s%s for %s%s", action->task, + action->uuid, + (pcmk__is_set(remote_rsc->flags, + pcmk__rsc_failed)? "failed " : ""), + remote_rsc->id, + (pcmk__is_set(launcher->flags, + pcmk__rsc_failed)? "failed " : ""), + launcher->id); if (pcmk__strcase_any_of(action->task, PCMK_ACTION_MIGRATE_TO, PCMK_ACTION_MIGRATE_FROM, NULL)) { @@ -346,7 +350,7 @@ apply_launcher_ordering(pcmk_action_t *action) case pcmk__action_stop: case pcmk__action_demote: - if (pcmk_is_set(launcher->flags, pcmk__rsc_failed)) { + if (pcmk__is_set(launcher->flags, pcmk__rsc_failed)) { /* When the launcher representing a guest node fails, any stop * or demote actions for resources running on the guest node * are implied by the launcher stopping. This is similar to @@ -393,11 +397,11 @@ apply_launcher_ordering(pcmk_action_t *action) void pcmk__order_remote_connection_actions(pcmk_scheduler_t *scheduler) { - if (!pcmk_is_set(scheduler->flags, pcmk__sched_have_remote_nodes)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_have_remote_nodes)) { return; } - crm_trace("Creating remote connection orderings"); + pcmk__trace("Creating remote connection orderings"); for (GList *iter = scheduler->priv->actions; iter != NULL; iter = iter->next) { @@ -413,7 +417,7 @@ pcmk__order_remote_connection_actions(pcmk_scheduler_t *scheduler) * remote connection resource, then make sure this happens before * any start of the resource in this transition. */ - if (pcmk_is_set(action->rsc->flags, pcmk__rsc_is_remote_connection) + if (pcmk__is_set(action->rsc->flags, pcmk__rsc_is_remote_connection) && pcmk__str_eq(action->task, PCMK_ACTION_CLEAR_FAILCOUNT, pcmk__str_none)) { @@ -440,7 +444,7 @@ pcmk__order_remote_connection_actions(pcmk_scheduler_t *scheduler) * real actions and vice versa later in update_actions() at the end of * pcmk__apply_orderings(). */ - if (pcmk_is_set(action->flags, pcmk__action_pseudo)) { + if (pcmk__is_set(action->flags, pcmk__action_pseudo)) { continue; } @@ -480,11 +484,11 @@ pcmk__order_remote_connection_actions(pcmk_scheduler_t *scheduler) * this logic rather than create_graph_action(). */ if (remote->priv->launcher != NULL) { - crm_trace("Container ordering for %s", action->uuid); + pcmk__trace("Container ordering for %s", action->uuid); apply_launcher_ordering(action); } else { - crm_trace("Remote ordering for %s", action->uuid); + pcmk__trace("Remote ordering for %s", action->uuid); apply_remote_ordering(action); } } @@ -563,29 +567,32 @@ pcmk__connection_host_for_action(const pcmk_action_t *action) } if (began_on == NULL) { - crm_trace("Routing %s for %s through remote connection's " - "next node %s (starting)%s", - action->task, (action->rsc? action->rsc->id : "no resource"), - (ended_on? ended_on->priv->name : "none"), - partial_migration? " (partial migration)" : ""); + pcmk__trace("Routing %s for %s through remote connection's next node " + "%s (starting)%s", + action->task, + ((action->rsc != NULL)? action->rsc->id : "no resource"), + ((ended_on != NULL)? ended_on->priv->name : "none"), + (partial_migration? " (partial migration)" : "")); return ended_on; } if (ended_on == NULL) { - crm_trace("Routing %s for %s through remote connection's " - "current node %s (stopping)%s", - action->task, (action->rsc? action->rsc->id : "no resource"), - (began_on? began_on->priv->name : "none"), - partial_migration? " (partial migration)" : ""); + pcmk__trace("Routing %s for %s through remote connection's current " + "node %s (stopping)%s", + action->task, + ((action->rsc != NULL)? action->rsc->id : "no resource"), + ((began_on != NULL)? began_on->priv->name : "none"), + (partial_migration? " (partial migration)" : "")); return began_on; } if (pcmk__same_node(began_on, ended_on)) { - crm_trace("Routing %s for %s through remote connection's " - "current node %s (not moving)%s", - action->task, (action->rsc? action->rsc->id : "no resource"), - (began_on? began_on->priv->name : "none"), - partial_migration? " (partial migration)" : ""); + pcmk__trace("Routing %s for %s through remote connection's current " + "node %s (not moving)%s", + action->task, + ((action->rsc != NULL)? action->rsc->id : "no resource"), + ((began_on != NULL)? began_on->priv->name : "none"), + (partial_migration? " (partial migration)" : "")); return began_on; } @@ -616,11 +623,12 @@ pcmk__connection_host_for_action(const pcmk_action_t *action) PCMK_ACTION_DEMOTE, PCMK_ACTION_MIGRATE_FROM, PCMK_ACTION_MIGRATE_TO, NULL) && !partial_migration) { - crm_trace("Routing %s for %s through remote connection's " - "current node %s (moving)%s", - action->task, (action->rsc? action->rsc->id : "no resource"), - (began_on? began_on->priv->name : "none"), - partial_migration? " (partial migration)" : ""); + pcmk__trace("Routing %s for %s through remote connection's current " + "node %s (moving)%s", + action->task, + ((action->rsc != NULL)? action->rsc->id : "no resource"), + ((began_on != NULL)? began_on->priv->name : "none"), + (partial_migration? " (partial migration)" : "")); return began_on; } @@ -628,11 +636,12 @@ pcmk__connection_host_for_action(const pcmk_action_t *action) * clear failcount, delete, ...) must occur after the connection starts on * the node it is moving to. */ - crm_trace("Routing %s for %s through remote connection's " - "next node %s (moving)%s", - action->task, (action->rsc? action->rsc->id : "no resource"), - (ended_on? ended_on->priv->name : "none"), - partial_migration? " (partial migration)" : ""); + pcmk__trace("Routing %s for %s through remote connection's next node %s " + "(moving)%s", + action->task, + ((action->rsc != NULL)? action->rsc->id : "no resource"), + ((ended_on != NULL)? ended_on->priv->name : "none"), + (partial_migration? " (partial migration)" : "")); return ended_on; } diff --git a/lib/pacemaker/pcmk_sched_resource.c b/lib/pacemaker/pcmk_sched_resource.c index 2bc843f05f8..f02ffca6de6 100644 --- a/lib/pacemaker/pcmk_sched_resource.c +++ b/lib/pacemaker/pcmk_sched_resource.c @@ -1,5 +1,5 @@ /* - * Copyright 2014-2024 the Pacemaker project contributors + * Copyright 2014-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,6 +11,7 @@ #include #include +#include // PCMK_SCORE_INFINITY #include #include @@ -119,18 +120,18 @@ pcmk__rsc_agent_changed(pcmk_resource_t *rsc, pcmk_node_t *node, }; for (int i = 0; i < PCMK__NELEM(attr_list); i++) { - const char *value = crm_element_value(rsc->priv->xml, attr_list[i]); - const char *old_value = crm_element_value(rsc_entry, attr_list[i]); + const char *value = pcmk__xe_get(rsc->priv->xml, attr_list[i]); + const char *old_value = pcmk__xe_get(rsc_entry, attr_list[i]); if (!pcmk__str_eq(value, old_value, pcmk__str_none)) { changed = true; trigger_unfencing(rsc, node, "Device definition changed", NULL, rsc->priv->scheduler); if (active_on_node) { - crm_notice("Forcing restart of %s on %s " - "because %s changed from '%s' to '%s'", - rsc->id, pcmk__node_name(node), attr_list[i], - pcmk__s(old_value, ""), pcmk__s(value, "")); + pcmk__notice("Forcing restart of %s on %s because %s changed " + "from '%s' to '%s'", + rsc->id, pcmk__node_name(node), attr_list[i], + pcmk__s(old_value, ""), pcmk__s(value, "")); } } } @@ -354,7 +355,7 @@ pcmk__output_resource_actions(pcmk_resource_t *rsc) } } - if ((current == NULL) && pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + if ((current == NULL) && pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { /* Don't log stopped orphans */ return; } @@ -520,7 +521,7 @@ pcmk__assign_resource(pcmk_resource_t *rsc, pcmk_node_t *node, bool force, node->assign->count++; pcmk__consume_node_capacity(node->priv->utilization, rsc); - if (pcmk_is_set(scheduler->flags, pcmk__sched_show_utilization)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_show_utilization)) { pcmk__output_t *out = scheduler->priv->out; out->message(out, "resource-util", rsc, node, __func__); @@ -545,9 +546,9 @@ pcmk__unassign_resource(pcmk_resource_t *rsc) pcmk_node_t *old = rsc->priv->assigned_node; if (old == NULL) { - crm_info("Unassigning %s", rsc->id); + pcmk__info("Unassigning %s", rsc->id); } else { - crm_info("Unassigning %s from %s", rsc->id, pcmk__node_name(old)); + pcmk__info("Unassigning %s from %s", rsc->id, pcmk__node_name(old)); } pcmk__set_rsc_flags(rsc, pcmk__rsc_unassigned); @@ -600,7 +601,7 @@ pcmk__threshold_reached(pcmk_resource_t *rsc, const pcmk_node_t *node, } // If we're ignoring failures, also ignore the migration threshold - if (pcmk_is_set(rsc->flags, pcmk__rsc_ignore_failure)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_ignore_failure)) { return false; } @@ -612,7 +613,7 @@ pcmk__threshold_reached(pcmk_resource_t *rsc, const pcmk_node_t *node, } // If failed resource is anonymous clone instance, we'll force clone away - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { rsc_to_ban = uber_parent(rsc); } @@ -633,10 +634,10 @@ pcmk__threshold_reached(pcmk_resource_t *rsc, const pcmk_node_t *node, return true; } - crm_info("%s can fail %d more time%s on " - "%s before reaching migration threshold (%d)", - rsc_to_ban->id, remaining_tries, pcmk__plural_s(remaining_tries), - pcmk__node_name(node), rsc->priv->ban_after_failures); + pcmk__info("%s can fail %d more time%s on s before reaching migration " + "threshold (%d)", + rsc_to_ban->id, remaining_tries, pcmk__plural_s(remaining_tries), + pcmk__node_name(node), rsc->priv->ban_after_failures); return false; } @@ -764,15 +765,15 @@ cmp_resources(gconstpointer a, gconstpointer b, gpointer data) } done: - crm_trace("%s (%d)%s%s %c %s (%d)%s%s: %s", - resource1->id, r1_score, - ((r1_node == NULL)? "" : " on "), - ((r1_node == NULL)? "" : r1_node->priv->id), - ((rc < 0)? '>' : ((rc > 0)? '<' : '=')), - resource2->id, r2_score, - ((r2_node == NULL)? "" : " on "), - ((r2_node == NULL)? "" : r2_node->priv->id), - reason); + pcmk__trace("%s (%d)%s%s %c %s (%d)%s%s: %s", + resource1->id, r1_score, + ((r1_node == NULL)? "" : " on "), + ((r1_node == NULL)? "" : r1_node->priv->id), + ((rc < 0)? '>' : ((rc > 0)? '<' : '=')), + resource2->id, r2_score, + ((r2_node == NULL)? "" : " on "), + ((r2_node == NULL)? "" : r2_node->priv->id), + reason); if (r1_nodes != NULL) { g_hash_table_destroy(r1_nodes); } diff --git a/lib/pacemaker/pcmk_sched_tickets.c b/lib/pacemaker/pcmk_sched_tickets.c index 3bc2db3087c..aaf1bba77ba 100644 --- a/lib/pacemaker/pcmk_sched_tickets.c +++ b/lib/pacemaker/pcmk_sched_tickets.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -15,6 +15,7 @@ #include #include #include +#include // PCMK_SCORE_INFINITY #include #include @@ -69,8 +70,8 @@ constraints_for_ticket(pcmk_resource_t *rsc, const rsc_ticket_t *rsc_ticket) CRM_CHECK((rsc != NULL) && (rsc_ticket != NULL), return); - if (pcmk_is_set(rsc_ticket->ticket->flags, pcmk__ticket_granted) - && !pcmk_is_set(rsc_ticket->ticket->flags, pcmk__ticket_standby)) { + if (pcmk__is_set(rsc_ticket->ticket->flags, pcmk__ticket_granted) + && !pcmk__is_set(rsc_ticket->ticket->flags, pcmk__ticket_standby)) { return; } @@ -86,7 +87,7 @@ constraints_for_ticket(pcmk_resource_t *rsc, const rsc_ticket_t *rsc_ticket) rsc->id, rsc_ticket->ticket->id, rsc_ticket->id, pcmk_role_text(rsc_ticket->role)); - if (!pcmk_is_set(rsc_ticket->ticket->flags, pcmk__ticket_granted) + if (!pcmk__is_set(rsc_ticket->ticket->flags, pcmk__ticket_granted) && (rsc->priv->active_nodes != NULL)) { switch (rsc_ticket->loss_policy) { @@ -134,7 +135,7 @@ constraints_for_ticket(pcmk_resource_t *rsc, const rsc_ticket_t *rsc_ticket) break; } - } else if (!pcmk_is_set(rsc_ticket->ticket->flags, pcmk__ticket_granted)) { + } else if (!pcmk__is_set(rsc_ticket->ticket->flags, pcmk__ticket_granted)) { if ((rsc_ticket->role != pcmk_role_promoted) || (rsc_ticket->loss_policy == loss_ticket_stop)) { @@ -142,7 +143,7 @@ constraints_for_ticket(pcmk_resource_t *rsc, const rsc_ticket_t *rsc_ticket) "__no_ticket__", rsc->priv->scheduler); } - } else if (pcmk_is_set(rsc_ticket->ticket->flags, pcmk__ticket_standby)) { + } else if (pcmk__is_set(rsc_ticket->ticket->flags, pcmk__ticket_standby)) { if ((rsc_ticket->role != pcmk_role_promoted) || (rsc_ticket->loss_policy == loss_ticket_stop)) { @@ -176,8 +177,8 @@ rsc_ticket_new(const char *id, pcmk_resource_t *rsc, pcmk__ticket_t *ticket, new_rsc_ticket->role = role; if (pcmk__str_eq(loss_policy, PCMK_VALUE_FENCE, pcmk__str_casei)) { - if (pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_fencing_enabled)) { new_rsc_ticket->loss_policy = loss_ticket_fence; } else { pcmk__config_err("Resetting '" PCMK_XA_LOSS_POLICY "' " @@ -188,39 +189,39 @@ rsc_ticket_new(const char *id, pcmk_resource_t *rsc, pcmk__ticket_t *ticket, } if (new_rsc_ticket->loss_policy == loss_ticket_fence) { - crm_debug("On loss of ticket '%s': Fence the nodes running %s (%s)", - new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, - pcmk_role_text(new_rsc_ticket->role)); + pcmk__debug("On loss of ticket '%s': Fence the nodes running %s (%s)", + new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, + pcmk_role_text(new_rsc_ticket->role)); } else if (pcmk__str_eq(loss_policy, PCMK_VALUE_FREEZE, pcmk__str_casei)) { - crm_debug("On loss of ticket '%s': Freeze %s (%s)", - new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, - pcmk_role_text(new_rsc_ticket->role)); + pcmk__debug("On loss of ticket '%s': Freeze %s (%s)", + new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, + pcmk_role_text(new_rsc_ticket->role)); new_rsc_ticket->loss_policy = loss_ticket_freeze; } else if (pcmk__str_eq(loss_policy, PCMK_VALUE_DEMOTE, pcmk__str_casei)) { - crm_debug("On loss of ticket '%s': Demote %s (%s)", - new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, - pcmk_role_text(new_rsc_ticket->role)); + pcmk__debug("On loss of ticket '%s': Demote %s (%s)", + new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, + pcmk_role_text(new_rsc_ticket->role)); new_rsc_ticket->loss_policy = loss_ticket_demote; } else if (pcmk__str_eq(loss_policy, PCMK_VALUE_STOP, pcmk__str_casei)) { - crm_debug("On loss of ticket '%s': Stop %s (%s)", - new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, - pcmk_role_text(new_rsc_ticket->role)); + pcmk__debug("On loss of ticket '%s': Stop %s (%s)", + new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, + pcmk_role_text(new_rsc_ticket->role)); new_rsc_ticket->loss_policy = loss_ticket_stop; } else { if (new_rsc_ticket->role == pcmk_role_promoted) { - crm_debug("On loss of ticket '%s': Default to demote %s (%s)", - new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, - pcmk_role_text(new_rsc_ticket->role)); + pcmk__debug("On loss of ticket '%s': Default to demote %s (%s)", + new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, + pcmk_role_text(new_rsc_ticket->role)); new_rsc_ticket->loss_policy = loss_ticket_demote; } else { - crm_debug("On loss of ticket '%s': Default to stop %s (%s)", - new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, - pcmk_role_text(new_rsc_ticket->role)); + pcmk__debug("On loss of ticket '%s': Default to stop %s (%s)", + new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id, + pcmk_role_text(new_rsc_ticket->role)); new_rsc_ticket->loss_policy = loss_ticket_stop; } } @@ -231,8 +232,8 @@ rsc_ticket_new(const char *id, pcmk_resource_t *rsc, pcmk__ticket_t *ticket, rsc->priv->ticket_constraints = g_list_append(rsc->priv->ticket_constraints, new_rsc_ticket); - if (!pcmk_is_set(new_rsc_ticket->ticket->flags, pcmk__ticket_granted) - || pcmk_is_set(new_rsc_ticket->ticket->flags, pcmk__ticket_standby)) { + if (!pcmk__is_set(new_rsc_ticket->ticket->flags, pcmk__ticket_granted) + || pcmk__is_set(new_rsc_ticket->ticket->flags, pcmk__ticket_standby)) { constraints_for_ticket(rsc, new_rsc_ticket); } } @@ -255,7 +256,7 @@ unpack_rsc_ticket_set(xmlNode *set, pcmk__ticket_t *ticket, return pcmk_rc_unpack_error; } - role = crm_element_value(set, PCMK_XA_ROLE); + role = pcmk__xe_get(set, PCMK_XA_ROLE); for (xmlNode *xml_rsc = pcmk__xe_first_child(set, PCMK_XE_RESOURCE_REF, NULL, NULL); @@ -283,13 +284,13 @@ static void unpack_simple_rsc_ticket(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) { const char *id = NULL; - const char *ticket_str = crm_element_value(xml_obj, PCMK_XA_TICKET); - const char *loss_policy = crm_element_value(xml_obj, PCMK_XA_LOSS_POLICY); + const char *ticket_str = pcmk__xe_get(xml_obj, PCMK_XA_TICKET); + const char *loss_policy = pcmk__xe_get(xml_obj, PCMK_XA_LOSS_POLICY); pcmk__ticket_t *ticket = NULL; - const char *rsc_id = crm_element_value(xml_obj, PCMK_XA_RSC); - const char *state = crm_element_value(xml_obj, PCMK_XA_RSC_ROLE); + const char *rsc_id = pcmk__xe_get(xml_obj, PCMK_XA_RSC); + const char *state = pcmk__xe_get(xml_obj, PCMK_XA_RSC_ROLE); pcmk_resource_t *rsc = NULL; @@ -362,11 +363,11 @@ unpack_rsc_ticket_tags(xmlNode *xml_obj, xmlNode **expanded_xml, // Check whether there are any resource sets with template or tag references *expanded_xml = pcmk__expand_tags_in_sets(xml_obj, scheduler); if (*expanded_xml != NULL) { - crm_log_xml_trace(*expanded_xml, "Expanded rsc_ticket"); + pcmk__log_xml_trace(*expanded_xml, "Expanded rsc_ticket"); return pcmk_rc_ok; } - rsc_id = crm_element_value(xml_obj, PCMK_XA_RSC); + rsc_id = pcmk__xe_get(xml_obj, PCMK_XA_RSC); if (rsc_id == NULL) { return pcmk_rc_ok; } @@ -381,7 +382,7 @@ unpack_rsc_ticket_tags(xmlNode *xml_obj, xmlNode **expanded_xml, return pcmk_rc_ok; } - state = crm_element_value(xml_obj, PCMK_XA_RSC_ROLE); + state = pcmk__xe_get(xml_obj, PCMK_XA_RSC_ROLE); *expanded_xml = pcmk__xml_copy(NULL, xml_obj); @@ -400,7 +401,7 @@ unpack_rsc_ticket_tags(xmlNode *xml_obj, xmlNode **expanded_xml, /* Move PCMK_XA_RSC_ROLE into converted PCMK_XE_RESOURCE_SET as a * PCMK_XA_ROLE attribute */ - crm_xml_add(rsc_set, PCMK_XA_ROLE, state); + pcmk__xe_set(rsc_set, PCMK_XA_ROLE, state); pcmk__xe_remove_attr(*expanded_xml, PCMK_XA_RSC_ROLE); } @@ -440,7 +441,7 @@ pcmk__unpack_rsc_ticket(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) pcmk__strkey_table(free, destroy_ticket); } - ticket_str = crm_element_value(xml_obj, PCMK_XA_TICKET); + ticket_str = pcmk__xe_get(xml_obj, PCMK_XA_TICKET); if (ticket_str == NULL) { pcmk__config_err("Ignoring constraint '%s' without ticket", id); return; @@ -472,7 +473,7 @@ pcmk__unpack_rsc_ticket(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) any_sets = true; set = pcmk__xe_resolve_idref(set, scheduler->input); - loss_policy = crm_element_value(xml_obj, PCMK_XA_LOSS_POLICY); + loss_policy = pcmk__xe_get(xml_obj, PCMK_XA_LOSS_POLICY); if ((set == NULL) // Configuration error, message already logged || (unpack_rsc_ticket_set(set, ticket, loss_policy, @@ -512,9 +513,9 @@ pcmk__require_promotion_tickets(pcmk_resource_t *rsc) rsc_ticket_t *rsc_ticket = (rsc_ticket_t *) item->data; if ((rsc_ticket->role == pcmk_role_promoted) - && (!pcmk_is_set(rsc_ticket->ticket->flags, pcmk__ticket_granted) - || pcmk_is_set(rsc_ticket->ticket->flags, - pcmk__ticket_standby))) { + && (!pcmk__is_set(rsc_ticket->ticket->flags, pcmk__ticket_granted) + || pcmk__is_set(rsc_ticket->ticket->flags, + pcmk__ticket_standby))) { resource_location(rsc, NULL, -PCMK_SCORE_INFINITY, "__stateful_without_ticket__", rsc->priv->scheduler); diff --git a/lib/pacemaker/pcmk_sched_utilization.c b/lib/pacemaker/pcmk_sched_utilization.c index 4e4132b4da8..d3717270501 100644 --- a/lib/pacemaker/pcmk_sched_utilization.c +++ b/lib/pacemaker/pcmk_sched_utilization.c @@ -1,5 +1,5 @@ /* - * Copyright 2014-2024 the Pacemaker project contributors + * Copyright 2014-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -11,6 +11,7 @@ #include // INT_MIN, INT_MAX +#include // PCMK_SCORE_INFINITY #include #include @@ -233,10 +234,10 @@ check_capacity(gpointer key, gpointer value, gpointer user_data) remaining = utilization_value(node_value_s); if (required > remaining) { - crm_debug("Remaining capacity for %s on %s (%d) is insufficient " - "for resource %s usage (%d)", - (const char *) key, pcmk__node_name(data->node), remaining, - data->rsc_id, required); + pcmk__debug("Remaining capacity for %s on %s (%d) is insufficient for " + "resource %s usage (%d)", + (const char *) key, pcmk__node_name(data->node), remaining, + data->rsc_id, required); data->is_enough = false; } } @@ -323,7 +324,7 @@ pcmk__ban_insufficient_capacity(pcmk_resource_t *rsc) return NULL; } - rscs_id = crm_strdup_printf("%s and its colocated resources", rsc->id); + rscs_id = pcmk__assert_asprintf("%s and its colocated resources", rsc->id); // If rsc isn't in the list, add it so we include its utilization if (g_list_find(colocated_rscs, rsc) == NULL) { @@ -403,8 +404,9 @@ pcmk__ban_insufficient_capacity(pcmk_resource_t *rsc) static pcmk_action_t * new_load_stopped_op(pcmk_node_t *node) { - char *load_stopped_task = crm_strdup_printf(PCMK_ACTION_LOAD_STOPPED "_%s", - node->priv->name); + char *load_stopped_task = pcmk__assert_asprintf(PCMK_ACTION_LOAD_STOPPED + "_%s", + node->priv->name); pcmk_action_t *load_stopped = get_pseudo_op(load_stopped_task, node->priv->scheduler); @@ -467,7 +469,7 @@ pcmk__create_utilization_constraints(pcmk_resource_t *rsc, void pcmk__show_node_capacities(const char *desc, pcmk_scheduler_t *scheduler) { - if (!pcmk_is_set(scheduler->flags, pcmk__sched_show_utilization)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_show_utilization)) { return; } for (const GList *iter = scheduler->nodes; diff --git a/lib/pacemaker/pcmk_scheduler.c b/lib/pacemaker/pcmk_scheduler.c index 1269e22fb9b..2f7166b29f7 100644 --- a/lib/pacemaker/pcmk_scheduler.c +++ b/lib/pacemaker/pcmk_scheduler.c @@ -12,6 +12,7 @@ #include #include #include +#include // PCMK_SCORE_INFINITY #include #include #include @@ -60,9 +61,9 @@ check_params(pcmk_resource_t *rsc, pcmk_node_t *node, const xmlNode *rsc_op, rsc->priv->scheduler); switch (digest_data->rc) { case pcmk__digest_unknown: - crm_trace("Resource %s history entry %s on %s has " - "no digest to compare", - rsc->id, pcmk__xe_id(rsc_op), node->priv->id); + pcmk__trace("Resource %s history entry %s on %s has " + "no digest to compare", + rsc->id, pcmk__xe_id(rsc_op), node->priv->id); break; case pcmk__digest_match: break; @@ -163,9 +164,9 @@ apply_exclusive_discovery(gpointer data, gpointer user_data) /* @TODO This checks rsc and the top rsc, but should probably check all * ancestors (a cloned group could have it set on the group) */ - if (pcmk_is_set(rsc->flags, pcmk__rsc_exclusive_probes) - || pcmk_is_set(pe__const_top_resource(rsc, false)->flags, - pcmk__rsc_exclusive_probes)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_exclusive_probes) + || pcmk__is_set(pe__const_top_resource(rsc, false)->flags, + pcmk__rsc_exclusive_probes)) { pcmk_node_t *match = NULL; // If this is a collective resource, apply recursively to children @@ -203,7 +204,7 @@ apply_stickiness(gpointer data, gpointer user_data) /* A resource is sticky if it is managed, has stickiness configured, and is * active on a single node. */ - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed) + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed) || (rsc->priv->stickiness < 1) || !pcmk__list_of_1(rsc->priv->active_nodes)) { return; @@ -216,8 +217,8 @@ apply_stickiness(gpointer data, gpointer user_data) * allowed on the node, so we don't keep the resource somewhere it is no * longer explicitly enabled. */ - if (!pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_symmetric_cluster) + if (!pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_symmetric_cluster) && (g_hash_table_lookup(rsc->priv->allowed_nodes, node->priv->id) == NULL)) { pcmk__rsc_debug(rsc, @@ -242,7 +243,7 @@ apply_stickiness(gpointer data, gpointer user_data) static void apply_shutdown_locks(pcmk_scheduler_t *scheduler) { - if (!pcmk_is_set(scheduler->flags, pcmk__sched_shutdown_lock)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_shutdown_lock)) { return; } for (GList *iter = scheduler->priv->resources; @@ -265,7 +266,7 @@ apply_shutdown_locks(pcmk_scheduler_t *scheduler) static void apply_node_criteria(pcmk_scheduler_t *scheduler) { - crm_trace("Applying node-specific scheduling criteria"); + pcmk__trace("Applying node-specific scheduling criteria"); apply_shutdown_locks(scheduler); pcmk__apply_locations(scheduler); g_list_foreach(scheduler->priv->resources, apply_stickiness, NULL); @@ -293,7 +294,7 @@ assign_resources(pcmk_scheduler_t *scheduler) { GList *iter = NULL; - crm_trace("Assigning resources to nodes"); + pcmk__trace("Assigning resources to nodes"); if (!pcmk__str_eq(scheduler->priv->placement_strategy, PCMK_VALUE_DEFAULT, pcmk__str_casei)) { @@ -301,7 +302,7 @@ assign_resources(pcmk_scheduler_t *scheduler) } pcmk__show_node_capacities("Original", scheduler); - if (pcmk_is_set(scheduler->flags, pcmk__sched_have_remote_nodes)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_have_remote_nodes)) { /* Assign remote connection resources first (which will also assign any * colocation dependencies). If the connection is migrating, always * prefer the partial migration target. @@ -312,7 +313,7 @@ assign_resources(pcmk_scheduler_t *scheduler) pcmk_resource_t *rsc = (pcmk_resource_t *) iter->data; const pcmk_node_t *target = rsc->priv->partial_migration_target; - if (pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { pcmk__rsc_trace(rsc, "Assigning remote connection resource '%s'", rsc->id); rsc->priv->cmds->assign(rsc, target, true); @@ -324,7 +325,7 @@ assign_resources(pcmk_scheduler_t *scheduler) for (iter = scheduler->priv->resources; iter != NULL; iter = iter->next) { pcmk_resource_t *rsc = (pcmk_resource_t *) iter->data; - if (!pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { pcmk__rsc_trace(rsc, "Assigning %s resource '%s'", rsc->priv->xml->name, rsc->id); rsc->priv->cmds->assign(rsc, NULL, true); @@ -346,10 +347,10 @@ clear_failcounts_if_orphaned(gpointer data, gpointer user_data) { pcmk_resource_t *rsc = data; - if (!pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { return; } - crm_trace("Clear fail counts for orphaned resource %s", rsc->id); + pcmk__trace("Clear fail counts for orphaned resource %s", rsc->id); /* There's no need to recurse into rsc->private->children because those * should just be unassigned clone instances. @@ -392,17 +393,17 @@ schedule_resource_actions(pcmk_scheduler_t *scheduler) pcmk__foreach_param_check(scheduler, check_params); pcmk__free_param_checks(scheduler); - if (pcmk_is_set(scheduler->flags, pcmk__sched_probe_resources)) { - crm_trace("Scheduling probes"); + if (pcmk__is_set(scheduler->flags, pcmk__sched_probe_resources)) { + pcmk__trace("Scheduling probes"); pcmk__schedule_probes(scheduler); } - if (pcmk_is_set(scheduler->flags, pcmk__sched_stop_removed_resources)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_stop_removed_resources)) { g_list_foreach(scheduler->priv->resources, clear_failcounts_if_orphaned, NULL); } - crm_trace("Scheduling resource actions"); + pcmk__trace("Scheduling resource actions"); for (GList *iter = scheduler->priv->resources; iter != NULL; iter = iter->next) { @@ -423,7 +424,7 @@ schedule_resource_actions(pcmk_scheduler_t *scheduler) static bool is_managed(const pcmk_resource_t *rsc) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { return true; } for (GList *iter = rsc->priv->children; @@ -506,7 +507,7 @@ static GList * add_nondc_fencing(GList *list, pcmk_action_t *action, const pcmk_scheduler_t *scheduler) { - if (!pcmk_is_set(scheduler->flags, pcmk__sched_concurrent_fencing) + if (!pcmk__is_set(scheduler->flags, pcmk__sched_concurrent_fencing) && (list != NULL)) { /* Concurrent fencing is disabled, so order each non-DC * fencing in a chain. If there is any DC fencing or @@ -551,10 +552,10 @@ schedule_fencing_and_shutdowns(pcmk_scheduler_t *scheduler) GList *fencing_ops = NULL; GList *shutdown_ops = NULL; - crm_trace("Scheduling fencing and shutdowns as needed"); + pcmk__trace("Scheduling fencing and shutdowns as needed"); if (!have_managed) { - crm_notice("No fencing will be done until there are resources " - "to manage"); + pcmk__notice("No fencing will be done until there are resources to " + "manage"); } // Check each node for whether it needs fencing or shutdown @@ -567,7 +568,7 @@ schedule_fencing_and_shutdowns(pcmk_scheduler_t *scheduler) * so handle them separately. */ if (pcmk__is_guest_or_bundle_node(node)) { - if (pcmk_is_set(node->priv->flags, pcmk__node_remote_reset) + if (pcmk__is_set(node->priv->flags, pcmk__node_remote_reset) && have_managed && pe_can_fence(scheduler, node)) { pcmk__fence_guest(node); } @@ -604,15 +605,15 @@ schedule_fencing_and_shutdowns(pcmk_scheduler_t *scheduler) } if (integrity_lost) { - if (!pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { pcmk__config_warn("Resource functionality and data integrity " "cannot be guaranteed (configure, enable, " "and test fencing to correct this)"); - } else if (!pcmk_is_set(scheduler->flags, pcmk__sched_quorate)) { - crm_notice("Unclean nodes will not be fenced until quorum is " - "attained or " PCMK_OPT_NO_QUORUM_POLICY " is set to " - PCMK_VALUE_IGNORE); + } else if (!pcmk__is_set(scheduler->flags, pcmk__sched_quorate)) { + pcmk__notice("Unclean nodes will not be fenced until quorum is " + "attained or " PCMK_OPT_NO_QUORUM_POLICY " is set to " + PCMK_VALUE_IGNORE); } } @@ -631,7 +632,7 @@ schedule_fencing_and_shutdowns(pcmk_scheduler_t *scheduler) // Order any non-DC fencing before any DC fencing or shutdown - if (pcmk_is_set(scheduler->flags, pcmk__sched_concurrent_fencing)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_concurrent_fencing)) { /* With concurrent fencing, order each non-DC fencing action * separately before any DC fencing or shutdown. */ @@ -668,7 +669,7 @@ log_resource_details(pcmk_scheduler_t *scheduler) pcmk_resource_t *rsc = (pcmk_resource_t *) item->data; // Log all resources except inactive orphans - if (!pcmk_is_set(rsc->flags, pcmk__rsc_removed) + if (!pcmk__is_set(rsc->flags, pcmk__rsc_removed) || (rsc->priv->orig_role != pcmk_role_stopped)) { out->message(out, (const char *) rsc->priv->xml->name, 0UL, rsc, all, all); @@ -718,13 +719,13 @@ log_unrunnable_actions(const pcmk_scheduler_t *scheduler) |pcmk__action_runnable |pcmk__action_pseudo; - crm_trace("Required but unrunnable actions:"); + pcmk__trace("Required but unrunnable actions:"); for (const GList *iter = scheduler->priv->actions; iter != NULL; iter = iter->next) { const pcmk_action_t *action = (const pcmk_action_t *) iter->data; - if (!pcmk_any_flags_set(action->flags, flags)) { + if (!pcmk__any_flags_set(action->flags, flags)) { pcmk__log_action("\t", action, true); } } @@ -743,18 +744,18 @@ pcmk__schedule_actions(pcmk_scheduler_t *scheduler) pcmk__set_assignment_methods(scheduler); pcmk__apply_node_health(scheduler); pcmk__unpack_constraints(scheduler); - if (pcmk_is_set(scheduler->flags, pcmk__sched_validate_only)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_validate_only)) { return; } - if (!pcmk_is_set(scheduler->flags, pcmk__sched_location_only) + if (!pcmk__is_set(scheduler->flags, pcmk__sched_location_only) && pcmk__is_daemon) { log_resource_details(scheduler); } apply_node_criteria(scheduler); - if (pcmk_is_set(scheduler->flags, pcmk__sched_location_only)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_location_only)) { return; } @@ -773,7 +774,7 @@ pcmk__schedule_actions(pcmk_scheduler_t *scheduler) log_all_actions(scheduler); pcmk__create_graph(scheduler); - if (get_crm_log_level() == LOG_TRACE) { + if (get_crm_log_level() == PCMK__LOG_TRACE) { log_unrunnable_actions(scheduler); } } diff --git a/lib/pacemaker/pcmk_simulate.c b/lib/pacemaker/pcmk_simulate.c index dbaf0d9da39..d17e2912f94 100644 --- a/lib/pacemaker/pcmk_simulate.c +++ b/lib/pacemaker/pcmk_simulate.c @@ -9,8 +9,10 @@ #include #include +#include // crm_meta_value() #include #include +#include // PCMK_SCORE_INFINITY #include #include #include @@ -52,7 +54,7 @@ create_action_name(const pcmk_action_t *action, bool verbose) if (action->node != NULL) { action_host = action->node->priv->name; - } else if (!pcmk_is_set(action->flags, pcmk__action_pseudo)) { + } else if (!pcmk__is_set(action->flags, pcmk__action_pseudo)) { action_host = ""; } @@ -88,10 +90,10 @@ create_action_name(const pcmk_action_t *action, bool verbose) } if (action_host != NULL) { - action_name = crm_strdup_printf("%s%s %s", - prefix, key, action_host); + action_name = pcmk__assert_asprintf("%s%s %s", + prefix, key, action_host); } else { - action_name = crm_strdup_printf("%s%s", prefix, key); + action_name = pcmk__assert_asprintf("%s%s", prefix, key); } free(key); @@ -100,23 +102,25 @@ create_action_name(const pcmk_action_t *action, bool verbose) const char *op = g_hash_table_lookup(action->meta, PCMK__META_STONITH_ACTION); - action_name = crm_strdup_printf("%s%s '%s' %s", - prefix, action->task, op, action_host); + action_name = pcmk__assert_asprintf("%s%s '%s' %s", + prefix, action->task, op, + action_host); } else if (action->rsc && action_host) { - action_name = crm_strdup_printf("%s%s %s", - prefix, action->uuid, action_host); + action_name = pcmk__assert_asprintf("%s%s %s", + prefix, action->uuid, action_host); } else if (action_host) { - action_name = crm_strdup_printf("%s%s %s", - prefix, action->task, action_host); + action_name = pcmk__assert_asprintf("%s%s %s", + prefix, action->task, action_host); } else { - action_name = crm_strdup_printf("%s", action->uuid); + action_name = pcmk__assert_asprintf("%s", action->uuid); } if (verbose) { - char *with_id = crm_strdup_printf("%s (%d)", action_name, action->id); + char *with_id = pcmk__assert_asprintf("%s (%d)", action_name, + action->id); free(action_name); action_name = with_id; @@ -197,13 +201,13 @@ reset(pcmk_scheduler_t *scheduler, xmlNodePtr input, pcmk__output_t *out, scheduler->input = input; scheduler->priv->out = out; set_effective_date(scheduler, true, use_date); - if (pcmk_is_set(flags, pcmk_sim_sanitized)) { + if (pcmk__is_set(flags, pcmk_sim_sanitized)) { pcmk__set_scheduler_flags(scheduler, pcmk__sched_sanitized); } - if (pcmk_is_set(flags, pcmk_sim_show_scores)) { + if (pcmk__is_set(flags, pcmk_sim_show_scores)) { pcmk__set_scheduler_flags(scheduler, pcmk__sched_output_scores); } - if (pcmk_is_set(flags, pcmk_sim_show_utilization)) { + if (pcmk__is_set(flags, pcmk_sim_show_utilization)) { pcmk__set_scheduler_flags(scheduler, pcmk__sched_show_utilization); } cluster_status(scheduler); @@ -241,23 +245,23 @@ write_sim_dotfile(pcmk_scheduler_t *scheduler, const char *dot_file, const char *color = "black"; char *action_name = create_action_name(action, verbose); - if (pcmk_is_set(action->flags, pcmk__action_pseudo)) { + if (pcmk__is_set(action->flags, pcmk__action_pseudo)) { font = "orange"; } - if (pcmk_is_set(action->flags, pcmk__action_added_to_graph)) { + if (pcmk__is_set(action->flags, pcmk__action_added_to_graph)) { style = PCMK__VALUE_BOLD; color = "green"; } else if ((action->rsc != NULL) - && !pcmk_is_set(action->rsc->flags, pcmk__rsc_managed)) { + && !pcmk__is_set(action->rsc->flags, pcmk__rsc_managed)) { color = "red"; font = "purple"; if (!all_actions) { goto do_not_write; } - } else if (pcmk_is_set(action->flags, pcmk__action_optional)) { + } else if (pcmk__is_set(action->flags, pcmk__action_optional)) { color = "blue"; if (!all_actions) { goto do_not_write; @@ -265,7 +269,7 @@ write_sim_dotfile(pcmk_scheduler_t *scheduler, const char *dot_file, } else { color = "red"; - CRM_LOG_ASSERT(!pcmk_is_set(action->flags, pcmk__action_runnable)); + CRM_LOG_ASSERT(!pcmk__is_set(action->flags, pcmk__action_runnable)); } pcmk__set_action_flags(action, pcmk__action_added_to_graph); @@ -293,9 +297,10 @@ write_sim_dotfile(pcmk_scheduler_t *scheduler, const char *dot_file, style = PCMK__VALUE_BOLD; } else if (before->flags == pcmk__ar_none) { continue; - } else if (pcmk_is_set(before->action->flags, - pcmk__action_added_to_graph) - && pcmk_is_set(action->flags, pcmk__action_added_to_graph) + } else if (pcmk__is_set(before->action->flags, + pcmk__action_added_to_graph) + && pcmk__is_set(action->flags, + pcmk__action_added_to_graph) && before->flags != pcmk__ar_if_on_same_node_or_target) { optional = false; } @@ -340,17 +345,18 @@ profile_filter(const struct dirent *entry) goto done; } if (filename[0] == '.') { - crm_trace("Not profiling hidden file '%s'", filename); + pcmk__trace("Not profiling hidden file '%s'", filename); goto done; } if (!pcmk__ends_with_ext(filename, ".xml")) { - crm_trace("Not profiling file '%s' without '.xml' extension", filename); + pcmk__trace("Not profiling file '%s' without '.xml' extension", + filename); goto done; } - buf = crm_strdup_printf("%s/%s", profiling_dir, filename); + buf = pcmk__assert_asprintf("%s/%s", profiling_dir, filename); if ((stat(buf, &sb) != 0) || !S_ISREG(sb.st_mode)) { - crm_trace("Not profiling file '%s': not a regular file", filename); + pcmk__trace("Not profiling file '%s': not a regular file", filename); goto done; } @@ -440,10 +446,10 @@ pcmk__profile_dir(pcmk__output_t *out, uint32_t flags, const char *dir, } scheduler->priv->out = out; - if (pcmk_is_set(flags, pcmk_sim_show_scores)) { + if (pcmk__is_set(flags, pcmk_sim_show_scores)) { scheduler_flags |= pcmk__sched_output_scores; } - if (pcmk_is_set(flags, pcmk_sim_show_utilization)) { + if (pcmk__is_set(flags, pcmk_sim_show_utilization)) { scheduler_flags |= pcmk__sched_show_utilization; } @@ -464,7 +470,7 @@ pcmk__profile_dir(pcmk__output_t *out, uint32_t flags, const char *dir, for (int i = 0; i < num_files; i++) { // glibc doesn't enforce PATH_MAX, so don't limit the buffer size - char *path = crm_strdup_printf("%s/%s", dir, namelist[i]->d_name); + char *path = pcmk__assert_asprintf("%s/%s", dir, namelist[i]->d_name); profile_file(path, repeat, scheduler, scheduler_flags, use_date); free(path); @@ -500,8 +506,8 @@ set_effective_date(pcmk_scheduler_t *scheduler, bool print_original, pcmk__assert(out != NULL); - crm_element_value_epoch(scheduler->input, PCMK_XA_EXECUTION_DATE, - &original_date); + pcmk__xe_get_time(scheduler->input, PCMK_XA_EXECUTION_DATE, + &original_date); if (use_date) { scheduler->priv->now = crm_time_new(use_date); @@ -535,8 +541,8 @@ set_effective_date(pcmk_scheduler_t *scheduler, bool print_original, static int simulate_pseudo_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) { - const char *node = crm_element_value(action->xml, PCMK__META_ON_NODE); - const char *task = crm_element_value(action->xml, PCMK__XA_OPERATION_KEY); + const char *node = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); + const char *task = pcmk__xe_get(action->xml, PCMK__XA_OPERATION_KEY); pcmk__set_graph_action_flags(action, pcmk__graph_action_confirmed); out->message(out, "inject-pseudo-action", node, task); @@ -566,7 +572,7 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) const char *resource = NULL; const char *rprovider = NULL; const char *resource_config_name = NULL; - const char *operation = crm_element_value(action->xml, PCMK_XA_OPERATION); + const char *operation = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); const char *target_rc_s = crm_meta_value(action->params, PCMK__META_OP_TARGET_RC); @@ -575,19 +581,18 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) xmlNode *action_rsc = pcmk__xe_first_child(action->xml, PCMK_XE_PRIMITIVE, NULL, NULL); - char *node = crm_element_value_copy(action->xml, PCMK__META_ON_NODE); + char *node = pcmk__xe_get_copy(action->xml, PCMK__META_ON_NODE); char *uuid = NULL; - const char *router_node = crm_element_value(action->xml, - PCMK__XA_ROUTER_NODE); + const char *router_node = pcmk__xe_get(action->xml, PCMK__XA_ROUTER_NODE); // Certain actions don't need to be displayed or history entries if (pcmk__str_eq(operation, CRM_OP_REPROBE, pcmk__str_none)) { - crm_debug("No history injection for %s op on %s", operation, node); + pcmk__debug("No history injection for %s op on %s", operation, node); goto done; // Confirm action and update graph } if (action_rsc == NULL) { // Shouldn't be possible - crm_log_xml_err(action->xml, "Bad"); + pcmk__log_xml_err(action->xml, "Bad"); free(node); return EPROTO; } @@ -597,15 +602,15 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) * (which is preferred when writing history), and if necessary, the instance * name. */ - resource_config_name = crm_element_value(action_rsc, PCMK_XA_ID); + resource_config_name = pcmk__xe_get(action_rsc, PCMK_XA_ID); if (resource_config_name == NULL) { // Shouldn't be possible - crm_log_xml_err(action->xml, "No ID"); + pcmk__log_xml_err(action->xml, "No ID"); free(node); return EPROTO; } resource = resource_config_name; if (pe_find_resource(fake_resource_list, resource) == NULL) { - const char *longname = crm_element_value(action_rsc, PCMK__XA_LONG_ID); + const char *longname = pcmk__xe_get(action_rsc, PCMK__XA_LONG_ID); if ((longname != NULL) && (pe_find_resource(fake_resource_list, longname) != NULL)) { @@ -621,9 +626,9 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) goto done; // Confirm action and update graph } - rclass = crm_element_value(action_rsc, PCMK_XA_CLASS); - rtype = crm_element_value(action_rsc, PCMK_XA_TYPE); - rprovider = crm_element_value(action_rsc, PCMK_XA_PROVIDER); + rclass = pcmk__xe_get(action_rsc, PCMK_XA_CLASS); + rtype = pcmk__xe_get(action_rsc, PCMK_XA_TYPE); + rprovider = pcmk__xe_get(action_rsc, PCMK_XA_PROVIDER); pcmk__scan_min_int(target_rc_s, &target_outcome, 0); @@ -631,7 +636,7 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) cib_sync_call) == pcmk_ok); // Ensure the action node is in the CIB - uuid = crm_element_value_copy(action->xml, PCMK__META_ON_NODE_UUID); + uuid = pcmk__xe_get_copy(action->xml, PCMK__META_ON_NODE_UUID); cib_node = pcmk__inject_node(fake_cib, node, ((router_node == NULL)? uuid: node)); free(uuid); @@ -642,8 +647,8 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) resource_config_name, rclass, rtype, rprovider); if (cib_resource == NULL) { - crm_err("Could not simulate action %d history for resource %s", - action->id, resource); + pcmk__err("Could not simulate action %d history for resource %s", + action->id, resource); free(node); pcmk__xml_free(cib_node); return EINVAL; @@ -664,8 +669,8 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) const char *offset = NULL; // Allow user to specify anonymous clone with or without instance number - key = crm_strdup_printf(PCMK__OP_FMT "@%s=", resource, op->op_type, - op->interval_ms, node); + key = pcmk__assert_asprintf(PCMK__OP_FMT "@%s=", resource, op->op_type, + op->interval_ms, node); if (strncasecmp(key, spec, strlen(key)) == 0) { match_name = resource; } @@ -675,8 +680,9 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) if ((match_name == NULL) && (strcmp(resource, resource_config_name) != 0)) { - key = crm_strdup_printf(PCMK__OP_FMT "@%s=", resource_config_name, - op->op_type, op->interval_ms, node); + key = pcmk__assert_asprintf(PCMK__OP_FMT "@%s=", + resource_config_name, op->op_type, + op->interval_ms, node); if (strncasecmp(key, spec, strlen(key)) == 0) { match_name = resource_config_name; } @@ -740,8 +746,8 @@ simulate_resource_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) static int simulate_cluster_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) { - const char *node = crm_element_value(action->xml, PCMK__META_ON_NODE); - const char *task = crm_element_value(action->xml, PCMK_XA_OPERATION); + const char *node = pcmk__xe_get(action->xml, PCMK__META_ON_NODE); + const char *task = pcmk__xe_get(action->xml, PCMK_XA_OPERATION); xmlNode *rsc = pcmk__xe_first_child(action->xml, PCMK_XE_PRIMITIVE, NULL, NULL); @@ -764,7 +770,7 @@ static int simulate_fencing_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) { const char *op = crm_meta_value(action->params, PCMK__META_STONITH_ACTION); - char *target = crm_element_value_copy(action->xml, PCMK__META_ON_NODE); + char *target = pcmk__xe_get_copy(action->xml, PCMK__META_ON_NODE); out->message(out, "inject-fencing-action", target, op); @@ -777,7 +783,7 @@ simulate_fencing_action(pcmk__graph_t *graph, pcmk__graph_action_t *action) false); pcmk__assert(cib_node != NULL); - crm_xml_add(cib_node, PCMK_XA_CRM_DEBUG_ORIGIN, __func__); + pcmk__xe_set(cib_node, PCMK_XA_CRM_DEBUG_ORIGIN, __func__); rc = fake_cib->cmds->replace(fake_cib, PCMK_XE_STATUS, cib_node, cib_sync_call); pcmk__assert(rc == pcmk_ok); @@ -883,9 +889,9 @@ pcmk__simulate(pcmk_scheduler_t *scheduler, pcmk__output_t *out, reset(scheduler, input, out, use_date, flags); if (!out->is_quiet(out)) { - const bool show_pending = pcmk_is_set(flags, pcmk_sim_show_pending); + const bool show_pending = pcmk__is_set(flags, pcmk_sim_show_pending); - if (pcmk_is_set(scheduler->flags, pcmk__sched_in_maintenance)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_in_maintenance)) { printed = out->message(out, "maint-mode", scheduler->flags); } @@ -941,23 +947,24 @@ pcmk__simulate(pcmk_scheduler_t *scheduler, pcmk__output_t *out, } } - if (pcmk_any_flags_set(flags, pcmk_sim_process | pcmk_sim_simulate)) { + if (pcmk__any_flags_set(flags, pcmk_sim_process|pcmk_sim_simulate)) { pcmk__output_t *logger_out = NULL; - if (pcmk_all_flags_set(scheduler->flags, - pcmk__sched_output_scores - |pcmk__sched_show_utilization)) { + if (pcmk__all_flags_set(scheduler->flags, + pcmk__sched_output_scores + |pcmk__sched_show_utilization)) { PCMK__OUTPUT_SPACER_IF(out, printed == pcmk_rc_ok); out->begin_list(out, NULL, NULL, "Assignment Scores and Utilization Information"); printed = pcmk_rc_ok; - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_output_scores)) { + } else if (pcmk__is_set(scheduler->flags, pcmk__sched_output_scores)) { PCMK__OUTPUT_SPACER_IF(out, printed == pcmk_rc_ok); out->begin_list(out, NULL, NULL, "Assignment Scores"); printed = pcmk_rc_ok; - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_show_utilization)) { + } else if (pcmk__is_set(scheduler->flags, + pcmk__sched_show_utilization)) { PCMK__OUTPUT_SPACER_IF(out, printed == pcmk_rc_ok); out->begin_list(out, NULL, NULL, "Utilization Information"); printed = pcmk_rc_ok; @@ -995,8 +1002,8 @@ pcmk__simulate(pcmk_scheduler_t *scheduler, pcmk__output_t *out, if (dot_file != NULL) { rc = write_sim_dotfile(scheduler, dot_file, - pcmk_is_set(flags, pcmk_sim_all_actions), - pcmk_is_set(flags, pcmk_sim_verbose)); + pcmk__is_set(flags, pcmk_sim_all_actions), + pcmk__is_set(flags, pcmk_sim_verbose)); if (rc != pcmk_rc_ok) { rc = pcmk_rc_dot_error; goto simulate_done; @@ -1010,7 +1017,7 @@ pcmk__simulate(pcmk_scheduler_t *scheduler, pcmk__output_t *out, rc = pcmk_rc_ok; - if (!pcmk_is_set(flags, pcmk_sim_simulate)) { + if (!pcmk__is_set(flags, pcmk_sim_simulate)) { goto simulate_done; } @@ -1026,10 +1033,10 @@ pcmk__simulate(pcmk_scheduler_t *scheduler, pcmk__output_t *out, set_effective_date(scheduler, true, use_date); - if (pcmk_is_set(flags, pcmk_sim_show_scores)) { + if (pcmk__is_set(flags, pcmk_sim_show_scores)) { pcmk__set_scheduler_flags(scheduler, pcmk__sched_output_scores); } - if (pcmk_is_set(flags, pcmk_sim_show_utilization)) { + if (pcmk__is_set(flags, pcmk_sim_show_utilization)) { pcmk__set_scheduler_flags(scheduler, pcmk__sched_show_utilization); } diff --git a/lib/pacemaker/pcmk_status.c b/lib/pacemaker/pcmk_status.c index 6fc1af7a112..117a1ae4e0c 100644 --- a/lib/pacemaker/pcmk_status.c +++ b/lib/pacemaker/pcmk_status.c @@ -108,8 +108,8 @@ pcmk__output_cluster_status(pcmk_scheduler_t *scheduler, stonith_t *stonith, /* Unpack constraints if any section will need them * (tickets may be referenced in constraints but not granted yet, * and bans need negative location constraints) */ - if (pcmk_is_set(show, pcmk_section_bans) - || pcmk_is_set(show, pcmk_section_tickets)) { + if (pcmk__is_set(show, pcmk_section_bans) + || pcmk__is_set(show, pcmk_section_tickets)) { pcmk__unpack_constraints(scheduler); } @@ -261,7 +261,8 @@ pcmk__status(pcmk__output_t *out, cib_t *cib, pcmk__mem_assert(scheduler); scheduler->priv->out = out; - if ((cib->variant == cib_native) && pcmk_is_set(show, pcmk_section_times)) { + if ((cib->variant == cib_native) + && pcmk__is_set(show, pcmk_section_times)) { // Currently used only in the times section pcmk__query_node_name(out, 0, &(scheduler->priv->local_node_name), 0); } diff --git a/lib/pacemaker/pcmk_ticket.c b/lib/pacemaker/pcmk_ticket.c index 6705cb5bbcd..df49ff24b97 100644 --- a/lib/pacemaker/pcmk_ticket.c +++ b/lib/pacemaker/pcmk_ticket.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -34,7 +34,7 @@ build_ticket_modify_xml(cib_t *cib, const char *ticket_id, xmlNode **ticket_stat *xml_top = pcmk__xe_create(NULL, PCMK_XE_STATUS); xml_obj = pcmk__xe_create(*xml_top, PCMK_XE_TICKETS); *ticket_state_xml = pcmk__xe_create(xml_obj, PCMK__XE_TICKET_STATE); - crm_xml_add(*ticket_state_xml, PCMK_XA_ID, ticket_id); + pcmk__xe_set(*ticket_state_xml, PCMK_XA_ID, ticket_id); rc = pcmk_rc_ok; @@ -59,16 +59,16 @@ add_attribute_xml(pcmk_scheduler_t *scheduler, const char *ticket_id, ticket_id); g_hash_table_iter_init(&hash_iter, attr_set); while (g_hash_table_iter_next(&hash_iter, (gpointer *) & key, (gpointer *) & value)) { - crm_xml_add(*ticket_state_xml, key, value); + pcmk__xe_set(*ticket_state_xml, key, value); if (pcmk__str_eq(key, PCMK__XA_GRANTED, pcmk__str_none) && ((ticket == NULL) - || !pcmk_is_set(ticket->flags, pcmk__ticket_granted)) - && crm_is_true(value)) { + || !pcmk__is_set(ticket->flags, pcmk__ticket_granted)) + && pcmk__is_true(value)) { char *now = pcmk__ttoa(time(NULL)); - crm_xml_add(*ticket_state_xml, PCMK_XA_LAST_GRANTED, now); + pcmk__xe_set(*ticket_state_xml, PCMK_XA_LAST_GRANTED, now); free(now); } } @@ -87,18 +87,21 @@ pcmk__get_ticket_state(cib_t *cib, const char *ticket_id, xmlNode **state) *state = NULL; if (ticket_id != NULL) { - xpath = crm_strdup_printf("/" PCMK_XE_CIB "/" PCMK_XE_STATUS "/" PCMK_XE_TICKETS - "/" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"%s\"]", - ticket_id); + xpath = pcmk__assert_asprintf("/" PCMK_XE_CIB "/" PCMK_XE_STATUS + "/" PCMK_XE_TICKETS + "/" PCMK__XE_TICKET_STATE + "[@" PCMK_XA_ID "=\"%s\"]", + ticket_id); } else { - xpath = crm_strdup_printf("/" PCMK_XE_CIB "/" PCMK_XE_STATUS "/" PCMK_XE_TICKETS); + xpath = pcmk__assert_asprintf("/" PCMK_XE_CIB "/" PCMK_XE_STATUS + "/" PCMK_XE_TICKETS); } rc = cib->cmds->query(cib, xpath, &xml_search, cib_sync_call|cib_xpath); rc = pcmk_legacy2rc(rc); if (rc == pcmk_rc_ok) { - crm_log_xml_debug(xml_search, "Match"); + pcmk__log_xml_debug(xml_search, "Match"); if (xml_search->children != NULL && ticket_id != NULL) { rc = pcmk_rc_duplicate_id; @@ -125,10 +128,11 @@ pcmk__ticket_constraints(pcmk__output_t *out, cib_t *cib, const char *ticket_id) pcmk__assert(xpath_base != NULL); if (ticket_id != NULL) { - xpath = crm_strdup_printf("%s/" PCMK_XE_RSC_TICKET "[@" PCMK_XA_TICKET "=\"%s\"]", - xpath_base, ticket_id); + xpath = pcmk__assert_asprintf("%s/" PCMK_XE_RSC_TICKET + "[@" PCMK_XA_TICKET "=\"%s\"]", + xpath_base, ticket_id); } else { - xpath = crm_strdup_printf("%s/" PCMK_XE_RSC_TICKET, xpath_base); + xpath = pcmk__assert_asprintf("%s/" PCMK_XE_RSC_TICKET, xpath_base); } rc = cib->cmds->query(cib, xpath, &result, cib_sync_call|cib_xpath); @@ -200,7 +204,7 @@ pcmk__ticket_delete(pcmk__output_t *out, cib_t *cib, pcmk_scheduler_t *scheduler return ENXIO; } - if (pcmk_is_set(ticket->flags, pcmk__ticket_granted)) { + if (pcmk__is_set(ticket->flags, pcmk__ticket_granted)) { return EACCES; } } @@ -218,7 +222,7 @@ pcmk__ticket_delete(pcmk__output_t *out, cib_t *cib, pcmk_scheduler_t *scheduler return rc; } - crm_log_xml_debug(state, "Delete"); + pcmk__log_xml_debug(state, "Delete"); if (rc == pcmk_rc_duplicate_id) { rc = pcmk__xe_foreach_child(state, NULL, delete_single_ticket, cib); @@ -412,7 +416,7 @@ pcmk__ticket_remove_attr(pcmk__output_t *out, cib_t *cib, pcmk_scheduler_t *sche pcmk__xe_remove_attr(ticket_state_xml, key); } - crm_log_xml_debug(xml_top, "Replace"); + pcmk__log_xml_debug(xml_top, "Replace"); rc = cib->cmds->replace(cib, PCMK_XE_STATUS, ticket_state_xml, cib_sync_call); rc = pcmk_legacy2rc(rc); @@ -480,7 +484,7 @@ pcmk__ticket_set_attr(pcmk__output_t *out, cib_t *cib, pcmk_scheduler_t *schedul add_attribute_xml(scheduler, ticket_id, attr_set, &ticket_state_xml); - crm_log_xml_debug(xml_top, "Update"); + pcmk__log_xml_debug(xml_top, "Update"); rc = cib->cmds->modify(cib, PCMK_XE_STATUS, xml_top, cib_sync_call); rc = pcmk_legacy2rc(rc); diff --git a/lib/pacemaker/tests/pcmk_ticket/pcmk__get_ticket_state_test.c b/lib/pacemaker/tests/pcmk_ticket/pcmk__get_ticket_state_test.c index 2eefed8d6ca..a47e0148467 100644 --- a/lib/pacemaker/tests/pcmk_ticket/pcmk__get_ticket_state_test.c +++ b/lib/pacemaker/tests/pcmk_ticket/pcmk__get_ticket_state_test.c @@ -127,19 +127,19 @@ multiple_tickets(void **state) ticket_node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketA"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketA"); ticket_node = pcmk__xpath_result(xpath_obj, 1); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketB"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketB"); ticket_node = pcmk__xpath_result(xpath_obj, 2); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketC"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketC"); ticket_node = pcmk__xpath_result(xpath_obj, 3); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketC"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketC"); xmlXPathFreeObject(xpath_obj); pcmk__xml_free(xml); diff --git a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_constraints_test.c b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_constraints_test.c index b3a536fa838..4141e9e3a20 100644 --- a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_constraints_test.c +++ b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_constraints_test.c @@ -111,11 +111,11 @@ multiple_tickets(void **state) ticket_node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketA"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketA"); ticket_node = pcmk__xpath_result(xpath_obj, 1); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketB"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketB"); xmlXPathFreeObject(xpath_obj); pcmk__xml_free(xml); diff --git a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_get_attr_test.c b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_get_attr_test.c index 882eadbb7c4..fce482fe064 100644 --- a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_get_attr_test.c +++ b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_get_attr_test.c @@ -92,7 +92,7 @@ verify_results(xmlNode *xml, const char *ticket_id, const char *attr_name, node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(node); - assert_string_equal(crm_element_value(node, PCMK_XA_ID), ticket_id); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_ID), ticket_id); xmlXPathFreeObject(xpath_obj); /* Verify that it has an child whose name and value are what @@ -106,8 +106,8 @@ verify_results(xmlNode *xml, const char *ticket_id, const char *attr_name, node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(node); - assert_string_equal(crm_element_value(node, PCMK_XA_NAME), attr_name); - assert_string_equal(crm_element_value(node, PCMK_XA_VALUE), attr_value); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_NAME), attr_name); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_VALUE), attr_value); xmlXPathFreeObject(xpath_obj); } diff --git a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_info_test.c b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_info_test.c index 486d2c439c2..3289dac99f3 100644 --- a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_info_test.c +++ b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_info_test.c @@ -82,10 +82,10 @@ all_tickets(void **state) node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(node); - assert_string_equal(crm_element_value(node, PCMK_XA_STATUS), PCMK_VALUE_REVOKED); - assert_string_equal(crm_element_value(node, PCMK__XA_GRANTED), "false"); - assert_string_equal(crm_element_value(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE); - assert_string_equal(crm_element_value(node, "owner"), "1"); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_STATUS), PCMK_VALUE_REVOKED); + assert_string_equal(pcmk__xe_get(node, PCMK__XA_GRANTED), "false"); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE); + assert_string_equal(pcmk__xe_get(node, "owner"), "1"); xmlXPathFreeObject(xpath_obj); xpath_obj = pcmk__xpath_search(xml->doc, @@ -95,10 +95,10 @@ all_tickets(void **state) node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(node); - assert_string_equal(crm_element_value(node, PCMK_XA_STATUS), PCMK_VALUE_GRANTED); - assert_string_equal(crm_element_value(node, PCMK__XA_GRANTED), "true"); - assert_string_equal(crm_element_value(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE); - assert_null(crm_element_value(node, "owner")); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_STATUS), PCMK_VALUE_GRANTED); + assert_string_equal(pcmk__xe_get(node, PCMK__XA_GRANTED), "true"); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE); + assert_null(pcmk__xe_get(node, "owner")); xmlXPathFreeObject(xpath_obj); xpath_obj = pcmk__xpath_search(xml->doc, @@ -108,10 +108,10 @@ all_tickets(void **state) node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(node); - assert_string_equal(crm_element_value(node, PCMK_XA_STATUS), PCMK_VALUE_GRANTED); - assert_string_equal(crm_element_value(node, PCMK__XA_GRANTED), "true"); - assert_string_equal(crm_element_value(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE); - assert_null(crm_element_value(node, "owner")); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_STATUS), PCMK_VALUE_GRANTED); + assert_string_equal(pcmk__xe_get(node, PCMK__XA_GRANTED), "true"); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE); + assert_null(pcmk__xe_get(node, "owner")); xmlXPathFreeObject(xpath_obj); pcmk__xml_free(xml); @@ -138,10 +138,10 @@ single_ticket(void **state) node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(node); - assert_string_equal(crm_element_value(node, PCMK_XA_STATUS), PCMK_VALUE_REVOKED); - assert_string_equal(crm_element_value(node, PCMK__XA_GRANTED), "false"); - assert_string_equal(crm_element_value(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE); - assert_string_equal(crm_element_value(node, "owner"), "1"); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_STATUS), PCMK_VALUE_REVOKED); + assert_string_equal(pcmk__xe_get(node, PCMK__XA_GRANTED), "false"); + assert_string_equal(pcmk__xe_get(node, PCMK_XA_STANDBY), PCMK_VALUE_FALSE); + assert_string_equal(pcmk__xe_get(node, "owner"), "1"); xmlXPathFreeObject(xpath_obj); pcmk__xml_free(xml); diff --git a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_remove_attr_test.c b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_remove_attr_test.c index 93f4597a8b8..219f7899979 100644 --- a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_remove_attr_test.c +++ b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_remove_attr_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -90,7 +90,7 @@ no_attrs(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketA\"]", &xml_search, cib_xpath); - assert_string_equal("1", crm_element_value(xml_search, "owner")); + assert_string_equal("1", pcmk__xe_get(xml_search, "owner")); pcmk__xml_free(xml_search); /* Another way of specifying no attributes */ @@ -126,8 +126,8 @@ remove_missing_attrs(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketA\"]", &xml_search, cib_xpath); - assert_string_equal("1", crm_element_value(xml_search, "owner")); - assert_null(crm_element_value(xml_search, "XYZ")); + assert_string_equal("1", pcmk__xe_get(xml_search, "owner")); + assert_null(pcmk__xe_get(xml_search, "XYZ")); pcmk__xml_free(xml_search); g_list_free_full(attrs, free); @@ -153,7 +153,7 @@ remove_existing_attr(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketA\"]", &xml_search, cib_xpath); - assert_null(crm_element_value(xml_search, "owner")); + assert_null(pcmk__xe_get(xml_search, "owner")); pcmk__xml_free(xml_search); g_list_free_full(attrs, free); @@ -179,7 +179,7 @@ remove_granted_without_force(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketB\"]", &xml_search, cib_xpath); - assert_string_equal("true", crm_element_value(xml_search, PCMK__XA_GRANTED)); + assert_string_equal("true", pcmk__xe_get(xml_search, PCMK__XA_GRANTED)); pcmk__xml_free(xml_search); g_list_free_full(attrs, free); @@ -205,7 +205,7 @@ remove_granted_with_force(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketB\"]", &xml_search, cib_xpath); - assert_null(crm_element_value(xml_search, PCMK__XA_GRANTED)); + assert_null(pcmk__xe_get(xml_search, PCMK__XA_GRANTED)); pcmk__xml_free(xml_search); g_list_free_full(attrs, free); diff --git a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_set_attr_test.c b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_set_attr_test.c index 5dd1831c55c..dcadfe71380 100644 --- a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_set_attr_test.c +++ b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_set_attr_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 the Pacemaker project contributors + * Copyright 2024-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -118,8 +118,8 @@ unknown_ticket_with_attrs(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"XYZ\"]", &xml_search, cib_xpath); - assert_string_equal("123", crm_element_value(xml_search, "attrA")); - assert_string_equal("456", crm_element_value(xml_search, "attrB")); + assert_string_equal("123", pcmk__xe_get(xml_search, "attrA")); + assert_string_equal("456", pcmk__xe_get(xml_search, "attrB")); pcmk__xml_free(xml_search); g_hash_table_destroy(attrs); @@ -145,7 +145,7 @@ overwrite_existing_attr(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketA\"]", &xml_search, cib_xpath); - assert_string_equal("2", crm_element_value(xml_search, "owner")); + assert_string_equal("2", pcmk__xe_get(xml_search, "owner")); pcmk__xml_free(xml_search); g_hash_table_destroy(attrs); @@ -171,8 +171,8 @@ not_granted_to_granted_without_force(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketA\"]", &xml_search, cib_xpath); - assert_string_equal("false", crm_element_value(xml_search, PCMK__XA_GRANTED)); - assert_null(crm_element_value(xml_search, PCMK_XA_LAST_GRANTED)); + assert_string_equal("false", pcmk__xe_get(xml_search, PCMK__XA_GRANTED)); + assert_null(pcmk__xe_get(xml_search, PCMK_XA_LAST_GRANTED)); pcmk__xml_free(xml_search); g_hash_table_destroy(attrs); @@ -198,8 +198,8 @@ not_granted_to_granted_with_force(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketA\"]", &xml_search, cib_xpath); - assert_string_equal("true", crm_element_value(xml_search, PCMK__XA_GRANTED)); - assert_non_null(crm_element_value(xml_search, PCMK_XA_LAST_GRANTED)); + assert_string_equal("true", pcmk__xe_get(xml_search, PCMK__XA_GRANTED)); + assert_non_null(pcmk__xe_get(xml_search, PCMK_XA_LAST_GRANTED)); pcmk__xml_free(xml_search); g_hash_table_destroy(attrs); @@ -225,8 +225,8 @@ granted_to_not_granted_without_force(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketB\"]", &xml_search, cib_xpath); - assert_string_equal("true", crm_element_value(xml_search, PCMK__XA_GRANTED)); - assert_null(crm_element_value(xml_search, PCMK_XA_LAST_GRANTED)); + assert_string_equal("true", pcmk__xe_get(xml_search, PCMK__XA_GRANTED)); + assert_null(pcmk__xe_get(xml_search, PCMK_XA_LAST_GRANTED)); pcmk__xml_free(xml_search); g_hash_table_destroy(attrs); @@ -252,8 +252,8 @@ granted_to_not_granted_with_force(void **state) cib->cmds->query(cib, "//" PCMK__XE_TICKET_STATE "[@" PCMK_XA_ID "=\"ticketB\"]", &xml_search, cib_xpath); - assert_string_equal("false", crm_element_value(xml_search, PCMK__XA_GRANTED)); - assert_null(crm_element_value(xml_search, PCMK_XA_LAST_GRANTED)); + assert_string_equal("false", pcmk__xe_get(xml_search, PCMK__XA_GRANTED)); + assert_null(pcmk__xe_get(xml_search, PCMK_XA_LAST_GRANTED)); pcmk__xml_free(xml_search); g_hash_table_destroy(attrs); diff --git a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_state_test.c b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_state_test.c index c23b71bd505..68fda98087b 100644 --- a/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_state_test.c +++ b/lib/pacemaker/tests/pcmk_ticket/pcmk_ticket_state_test.c @@ -111,19 +111,19 @@ multiple_tickets(void **state) ticket_node = pcmk__xpath_result(xpath_obj, 0); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketA"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketA"); ticket_node = pcmk__xpath_result(xpath_obj, 1); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketB"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketB"); ticket_node = pcmk__xpath_result(xpath_obj, 2); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketC"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketC"); ticket_node = pcmk__xpath_result(xpath_obj, 3); assert_non_null(ticket_node); - assert_string_equal(crm_element_value(ticket_node, PCMK_XA_ID), "ticketC"); + assert_string_equal(pcmk__xe_get(ticket_node, PCMK_XA_ID), "ticketC"); xmlXPathFreeObject(xpath_obj); pcmk__xml_free(xml); diff --git a/lib/pengine/bundle.c b/lib/pengine/bundle.c index f9bb6b70179..5c0afd30333 100644 --- a/lib/pengine/bundle.c +++ b/lib/pengine/bundle.c @@ -15,6 +15,8 @@ #include #include +#include // crm_create_nvpair_xml() +#include // PCMK_SCORE_INFINITY #include #include #include @@ -61,7 +63,7 @@ typedef struct pe__bundle_variant_data_s { char *control_port; char *container_network; char *ip_range_start; - gboolean add_host; + bool add_host; gchar *container_host_options; char *container_command; char *launcher_options; @@ -272,7 +274,7 @@ next_ip(const char *last_ip) ++oct4; } - return crm_strdup_printf("%u.%u.%u.%u", oct1, oct2, oct3, oct4); + return pcmk__assert_asprintf("%u.%u.%u.%u", oct1, oct2, oct3, oct4); } static void @@ -314,10 +316,10 @@ create_resource(const char *name, const char *provider, const char *kind) { xmlNode *rsc = pcmk__xe_create(NULL, PCMK_XE_PRIMITIVE); - crm_xml_add(rsc, PCMK_XA_ID, name); - crm_xml_add(rsc, PCMK_XA_CLASS, PCMK_RESOURCE_CLASS_OCF); - crm_xml_add(rsc, PCMK_XA_PROVIDER, provider); - crm_xml_add(rsc, PCMK_XA_TYPE, kind); + pcmk__xe_set(rsc, PCMK_XA_ID, name); + pcmk__xe_set(rsc, PCMK_XA_CLASS, PCMK_RESOURCE_CLASS_OCF); + pcmk__xe_set(rsc, PCMK_XA_PROVIDER, provider); + pcmk__xe_set(rsc, PCMK_XA_TYPE, kind); return rsc; } @@ -363,7 +365,7 @@ create_ip_resource(pcmk_resource_t *parent, pe__bundle_variant_data_t *data, xmlNode *xml_ip = NULL; xmlNode *xml_obj = NULL; - id = crm_strdup_printf("%s-ip-%s", data->prefix, replica->ipaddr); + id = pcmk__assert_asprintf("%s-ip-%s", data->prefix, replica->ipaddr); pcmk__xml_sanitize_id(id); xml_ip = create_resource(id, "heartbeat", "IPaddr2"); free(id); @@ -445,8 +447,8 @@ create_container_resource(pcmk_resource_t *parent, buffer = g_string_sized_new(4096); - id = crm_strdup_printf("%s-%s-%d", data->prefix, agent_str, - replica->offset); + id = pcmk__assert_asprintf("%s-%s-%d", data->prefix, agent_str, + replica->offset); pcmk__xml_sanitize_id(id); xml_container = create_resource(id, "heartbeat", agent_str); free(id); @@ -490,9 +492,9 @@ create_container_resource(pcmk_resource_t *parent, pe__bundle_mount_t *mount = (pe__bundle_mount_t *) iter->data; char *source = NULL; - if (pcmk_is_set(mount->flags, pe__bundle_mount_subdir)) { - source = crm_strdup_printf("%s/%s-%d", mount->source, data->prefix, - replica->offset); + if (pcmk__is_set(mount->flags, pe__bundle_mount_subdir)) { + source = pcmk__assert_asprintf("%s/%s-%d", mount->source, + data->prefix, replica->offset); pcmk__add_separated_word(&dbuffer, 1024, source, ","); } @@ -652,7 +654,8 @@ create_remote_resource(pcmk_resource_t *parent, pe__bundle_variant_data_t *data, GHashTableIter gIter; pcmk_node_t *node = NULL; xmlNode *xml_remote = NULL; - char *id = crm_strdup_printf("%s-%d", data->prefix, replica->offset); + char *id = pcmk__assert_asprintf("%s-%d", data->prefix, + replica->offset); char *port_s = NULL; const char *uname = NULL; const char *connect_name = NULL; @@ -661,8 +664,8 @@ create_remote_resource(pcmk_resource_t *parent, pe__bundle_variant_data_t *data, if (pe_find_resource(scheduler->priv->resources, id) != NULL) { free(id); // The biggest hammer we have - id = crm_strdup_printf("pcmk-internal-%s-remote-%d", - replica->child->id, replica->offset); + id = pcmk__assert_asprintf("pcmk-internal-%s-remote-%d", + replica->child->id, replica->offset); //@TODO return error instead of asserting? pcmk__assert(pe_find_resource(scheduler->priv->resources, id) == NULL); @@ -934,21 +937,22 @@ pe__add_bundle_remote_name(pcmk_resource_t *rsc, xmlNode *xml, } if(node == NULL) { - crm_trace("Cannot determine address for bundle connection %s", rsc->id); + pcmk__trace("Cannot determine address for bundle connection %s", + rsc->id); return NULL; } - crm_trace("Setting address for bundle connection %s to bundle host %s", - rsc->id, pcmk__node_name(node)); + pcmk__trace("Setting address for bundle connection %s to bundle host %s", + rsc->id, pcmk__node_name(node)); if(xml != NULL && field != NULL) { - crm_xml_add(xml, field, node->priv->name); + pcmk__xe_set(xml, field, node->priv->name); } return node->priv->name; } #define pe__set_bundle_mount_flags(mount_xml, flags, flags_to_set) do { \ - flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \ + flags = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, \ "Bundle mount", pcmk__xe_id(mount_xml), \ flags, (flags_to_set), #flags_to_set); \ } while (0) @@ -989,13 +993,13 @@ pe__unpack_bundle(pcmk_resource_t *rsc) } // Use 0 for default, minimum, and invalid PCMK_XA_PROMOTED_MAX - value = crm_element_value(xml_obj, PCMK_XA_PROMOTED_MAX); + value = pcmk__xe_get(xml_obj, PCMK_XA_PROMOTED_MAX); pcmk__scan_min_int(value, &bundle_data->promoted_max, 0); /* Default replicas to PCMK_XA_PROMOTED_MAX if it was specified and 1 * otherwise */ - value = crm_element_value(xml_obj, PCMK_XA_REPLICAS); + value = pcmk__xe_get(xml_obj, PCMK_XA_REPLICAS); if ((value == NULL) && (bundle_data->promoted_max > 0)) { bundle_data->nreplicas = bundle_data->promoted_max; } else { @@ -1007,34 +1011,38 @@ pe__unpack_bundle(pcmk_resource_t *rsc) * floating IPs only works if the container is started with: * --userland-proxy=false --ip-masq=false */ - value = crm_element_value(xml_obj, PCMK_XA_REPLICAS_PER_HOST); + value = pcmk__xe_get(xml_obj, PCMK_XA_REPLICAS_PER_HOST); pcmk__scan_min_int(value, &bundle_data->nreplicas_per_host, 1); if (bundle_data->nreplicas_per_host == 1) { pcmk__clear_rsc_flags(rsc, pcmk__rsc_unique); } - bundle_data->container_command = - crm_element_value_copy(xml_obj, PCMK_XA_RUN_COMMAND); - bundle_data->launcher_options = crm_element_value_copy(xml_obj, - PCMK_XA_OPTIONS); - bundle_data->image = crm_element_value_copy(xml_obj, PCMK_XA_IMAGE); - bundle_data->container_network = crm_element_value_copy(xml_obj, - PCMK_XA_NETWORK); + bundle_data->container_command = pcmk__xe_get_copy(xml_obj, + PCMK_XA_RUN_COMMAND); + bundle_data->launcher_options = pcmk__xe_get_copy(xml_obj, PCMK_XA_OPTIONS); + bundle_data->image = pcmk__xe_get_copy(xml_obj, PCMK_XA_IMAGE); + bundle_data->container_network = pcmk__xe_get_copy(xml_obj, + PCMK_XA_NETWORK); xml_obj = pcmk__xe_first_child(rsc->priv->xml, PCMK_XE_NETWORK, NULL, NULL); if(xml_obj) { - bundle_data->ip_range_start = - crm_element_value_copy(xml_obj, PCMK_XA_IP_RANGE_START); - bundle_data->host_netmask = - crm_element_value_copy(xml_obj, PCMK_XA_HOST_NETMASK); - bundle_data->host_network = - crm_element_value_copy(xml_obj, PCMK_XA_HOST_INTERFACE); - bundle_data->control_port = - crm_element_value_copy(xml_obj, PCMK_XA_CONTROL_PORT); - value = crm_element_value(xml_obj, PCMK_XA_ADD_HOST); - if (crm_str_to_boolean(value, &bundle_data->add_host) != 1) { - bundle_data->add_host = TRUE; + bundle_data->ip_range_start = pcmk__xe_get_copy(xml_obj, + PCMK_XA_IP_RANGE_START); + bundle_data->host_netmask = pcmk__xe_get_copy(xml_obj, + PCMK_XA_HOST_NETMASK); + bundle_data->host_network = pcmk__xe_get_copy(xml_obj, + PCMK_XA_HOST_INTERFACE); + bundle_data->control_port = pcmk__xe_get_copy(xml_obj, + PCMK_XA_CONTROL_PORT); + + value = pcmk__xe_get(xml_obj, PCMK_XA_ADD_HOST); + if ((value == NULL) + || (pcmk__parse_bool(value, + &bundle_data->add_host) != pcmk_rc_ok)) { + + // Default to true if unset or invaid + bundle_data->add_host = true; } for (xml_child = pcmk__xe_first_child(xml_obj, PCMK_XE_PORT_MAPPING, @@ -1045,13 +1053,13 @@ pe__unpack_bundle(pcmk_resource_t *rsc) pe__bundle_port_t *port = pcmk__assert_alloc(1, sizeof(pe__bundle_port_t)); - port->source = crm_element_value_copy(xml_child, PCMK_XA_PORT); + port->source = pcmk__xe_get_copy(xml_child, PCMK_XA_PORT); if(port->source == NULL) { - port->source = crm_element_value_copy(xml_child, PCMK_XA_RANGE); + port->source = pcmk__xe_get_copy(xml_child, PCMK_XA_RANGE); } else { - port->target = crm_element_value_copy(xml_child, - PCMK_XA_INTERNAL_PORT); + port->target = pcmk__xe_get_copy(xml_child, + PCMK_XA_INTERNAL_PORT); } if(port->source != NULL && strlen(port->source) > 0) { @@ -1075,13 +1083,13 @@ pe__unpack_bundle(pcmk_resource_t *rsc) xml_child != NULL; xml_child = pcmk__xe_next(xml_child, PCMK_XE_STORAGE_MAPPING)) { - const char *source = crm_element_value(xml_child, PCMK_XA_SOURCE_DIR); - const char *target = crm_element_value(xml_child, PCMK_XA_TARGET_DIR); - const char *options = crm_element_value(xml_child, PCMK_XA_OPTIONS); + const char *source = pcmk__xe_get(xml_child, PCMK_XA_SOURCE_DIR); + const char *target = pcmk__xe_get(xml_child, PCMK_XA_TARGET_DIR); + const char *options = pcmk__xe_get(xml_child, PCMK_XA_OPTIONS); int flags = pe__bundle_mount_none; if (source == NULL) { - source = crm_element_value(xml_child, PCMK_XA_SOURCE_DIR_ROOT); + source = pcmk__xe_get(xml_child, PCMK_XA_SOURCE_DIR_ROOT); pe__set_bundle_mount_flags(xml_child, flags, pe__bundle_mount_subdir); } @@ -1144,7 +1152,7 @@ pe__unpack_bundle(pcmk_resource_t *rsc) free(value); } - //crm_xml_add(xml_obj, PCMK_XA_ID, bundle_data->prefix); + //pcmk__xe_set(xml_obj, PCMK_XA_ID, bundle_data->prefix); pcmk__xml_copy(xml_resource, xml_obj); } else if(xml_obj) { @@ -1224,7 +1232,7 @@ pe__unpack_bundle(pcmk_resource_t *rsc) replica->offset = lpc++; // Ensure the child's notify gets set based on the underlying primitive's value - if (pcmk_is_set(replica->child->flags, pcmk__rsc_notify)) { + if (pcmk__is_set(replica->child->flags, pcmk__rsc_notify)) { pcmk__set_rsc_flags(bundle_data->child, pcmk__rsc_notify); } @@ -1550,10 +1558,10 @@ pe__bundle_replica_output_html(pcmk__output_t *out, static const char * get_unmanaged_str(const pcmk_resource_t *rsc) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_maintenance)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_maintenance)) { return " (maintenance)"; } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { return " (unmanaged)"; } return ""; @@ -1612,18 +1620,24 @@ pe__bundle_html(pcmk__output_t *out, va_list args) && !remote->priv->fns->is_filtered(remote, only_rsc, print_everything); - if (pcmk_is_set(show_opts, pcmk_show_implicit_rscs) || - (print_everything == FALSE && (print_ip || print_child || print_ctnr || print_remote))) { + if (pcmk__is_set(show_opts, pcmk_show_implicit_rscs) + || (!print_everything + && (print_ip || print_child || print_ctnr || print_remote))) { /* The text output messages used below require pe_print_implicit to * be set to do anything. */ - uint32_t new_show_opts = show_opts | pcmk_show_implicit_rscs; - - PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, "Container bundle%s: %s [%s]%s%s%s%s%s", - (bundle_data->nreplicas > 1)? " set" : "", - rsc->id, bundle_data->image, - pcmk_is_set(rsc->flags, pcmk__rsc_unique)? " (unique)" : "", - desc ? " (" : "", desc ? desc : "", desc ? ")" : "", + const bool multiple = (bundle_data->nreplicas > 1); + const bool unique = pcmk__is_set(rsc->flags, pcmk__rsc_unique); + const uint32_t new_show_opts = show_opts | pcmk_show_implicit_rscs; + + PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, + "Container bundle%s: %s [%s]%s%s%s%s%s", + (multiple? " set" : ""), rsc->id, + bundle_data->image, + (unique? " (unique)" : ""), + ((desc != NULL)? " (" : ""), + pcmk__s(desc, ""), + ((desc != NULL)? ")" : ""), get_unmanaged_str(rsc)); if (pcmk__list_of_multiple(bundle_data->replicas)) { @@ -1656,11 +1670,17 @@ pe__bundle_html(pcmk__output_t *out, va_list args) } else if (print_everything == FALSE && !(print_ip || print_child || print_ctnr || print_remote)) { continue; } else { - PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, "Container bundle%s: %s [%s]%s%s%s%s%s", - (bundle_data->nreplicas > 1)? " set" : "", - rsc->id, bundle_data->image, - pcmk_is_set(rsc->flags, pcmk__rsc_unique)? " (unique)" : "", - desc ? " (" : "", desc ? desc : "", desc ? ")" : "", + const bool multiple = (bundle_data->nreplicas > 1); + const bool unique = pcmk__is_set(rsc->flags, pcmk__rsc_unique); + + PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, + "Container bundle%s: %s [%s]%s%s%s%s%s", + (multiple? " set" : ""), rsc->id, + bundle_data->image, + (unique? " (unique)" : ""), + ((desc != NULL)? " (" : ""), + pcmk__s(desc, ""), + ((desc != NULL)? ")" : ""), get_unmanaged_str(rsc)); pe__bundle_replica_output_html(out, replica, @@ -1755,18 +1775,24 @@ pe__bundle_text(pcmk__output_t *out, va_list args) && !remote->priv->fns->is_filtered(remote, only_rsc, print_everything); - if (pcmk_is_set(show_opts, pcmk_show_implicit_rscs) || - (print_everything == FALSE && (print_ip || print_child || print_ctnr || print_remote))) { + if (pcmk__is_set(show_opts, pcmk_show_implicit_rscs) + || (!print_everything + && (print_ip || print_child || print_ctnr || print_remote))) { /* The text output messages used below require pe_print_implicit to * be set to do anything. */ - uint32_t new_show_opts = show_opts | pcmk_show_implicit_rscs; - - PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, "Container bundle%s: %s [%s]%s%s%s%s%s", - (bundle_data->nreplicas > 1)? " set" : "", - rsc->id, bundle_data->image, - pcmk_is_set(rsc->flags, pcmk__rsc_unique)? " (unique)" : "", - desc ? " (" : "", desc ? desc : "", desc ? ")" : "", + const bool multiple = (bundle_data->nreplicas > 1); + const bool unique = pcmk__is_set(rsc->flags, pcmk__rsc_unique); + const uint32_t new_show_opts = show_opts | pcmk_show_implicit_rscs; + + PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, + "Container bundle%s: %s [%s]%s%s%s%s%s", + (multiple? " set" : ""), rsc->id, + bundle_data->image, + (unique? " (unique)" : ""), + ((desc != NULL)? " (" : ""), + pcmk__s(desc, ""), + ((desc != NULL)? ")" : ""), get_unmanaged_str(rsc)); if (pcmk__list_of_multiple(bundle_data->replicas)) { @@ -1799,11 +1825,17 @@ pe__bundle_text(pcmk__output_t *out, va_list args) } else if (print_everything == FALSE && !(print_ip || print_child || print_ctnr || print_remote)) { continue; } else { - PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, "Container bundle%s: %s [%s]%s%s%s%s%s", - (bundle_data->nreplicas > 1)? " set" : "", - rsc->id, bundle_data->image, - pcmk_is_set(rsc->flags, pcmk__rsc_unique)? " (unique)" : "", - desc ? " (" : "", desc ? desc : "", desc ? ")" : "", + const bool multiple = (bundle_data->nreplicas > 1); + const bool unique = pcmk__is_set(rsc->flags, pcmk__rsc_unique); + + PCMK__OUTPUT_LIST_HEADER(out, FALSE, rc, + "Container bundle%s: %s [%s]%s%s%s%s%s", + (multiple? " set" : ""), rsc->id, + bundle_data->image, + (unique? " (unique)" : ""), + ((desc != NULL)? " (" : ""), + pcmk__s(desc, ""), + ((desc != NULL)? ")" : ""), get_unmanaged_str(rsc)); pe__bundle_replica_output_text(out, replica, diff --git a/lib/pengine/clone.c b/lib/pengine/clone.c index 30835f9a9a2..bd923005a44 100644 --- a/lib/pengine/clone.c +++ b/lib/pengine/clone.c @@ -15,6 +15,7 @@ #include #include #include +#include // PCMK_SCORE_INFINITY #include #include #include @@ -166,11 +167,11 @@ clone_header(pcmk__output_t *out, int *rc, const pcmk_resource_t *rsc, { GString *attrs = NULL; - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { pcmk__add_separated_word(&attrs, 64, "promotable", ", "); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { pcmk__add_separated_word(&attrs, 64, "unique", ", "); } @@ -178,10 +179,10 @@ clone_header(pcmk__output_t *out, int *rc, const pcmk_resource_t *rsc, pcmk__add_separated_word(&attrs, 64, "disabled", ", "); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_maintenance)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_maintenance)) { pcmk__add_separated_word(&attrs, 64, "maintenance", ", "); - } else if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + } else if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__add_separated_word(&attrs, 64, "unmanaged", ", "); } @@ -243,7 +244,7 @@ pe__create_clone_child(pcmk_resource_t *rsc, pcmk_scheduler_t *scheduler) child_copy = pcmk__xml_copy(NULL, clone_data->xml_obj_child); - crm_xml_add(child_copy, PCMK__META_CLONE, inc_num); + pcmk__xe_set(child_copy, PCMK__META_CLONE, inc_num); if (pe__unpack_resource(child_copy, &child_rsc, rsc, scheduler) != pcmk_rc_ok) { @@ -333,7 +334,7 @@ clone_unpack(pcmk_resource_t *rsc) clone_data = pcmk__assert_alloc(1, sizeof(clone_variant_data_t)); rsc->priv->variant_opaque = clone_data; - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { // Use 1 as default but 0 for minimum and invalid // @COMPAT PCMK__META_PROMOTED_MAX_LEGACY deprecated since 2.0.0 clone_data->promoted_max = @@ -359,16 +360,17 @@ clone_unpack(pcmk_resource_t *rsc) clone_data->clone_max = unpack_meta_int(rsc, PCMK_META_CLONE_MAX, NULL, QB_MAX(1, num_nodes)); - if (crm_is_true(g_hash_table_lookup(rsc->priv->meta, - PCMK_META_ORDERED))) { - clone_data->flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, + if (pcmk__is_true(g_hash_table_lookup(rsc->priv->meta, + PCMK_META_ORDERED))) { + clone_data->flags = pcmk__set_flags_as(__func__, __LINE__, + PCMK__LOG_TRACE, "Clone", rsc->id, clone_data->flags, pcmk__clone_ordered, "pcmk__clone_ordered"); } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unique) + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unique) && (clone_data->clone_node_max > 1)) { pcmk__config_err("Ignoring " PCMK_META_CLONE_NODE_MAX " of %d for %s " @@ -501,7 +503,7 @@ is_set_recursive(const pcmk_resource_t *rsc, long long flag, bool any) { bool all = !any; - if (pcmk_is_set(rsc->flags, flag)) { + if (pcmk__is_set(rsc->flags, flag)) { if(any) { return TRUE; } @@ -660,20 +662,20 @@ pe__clone_default(pcmk__output_t *out, va_list args) continue; } - if (pcmk_is_set(show_opts, pcmk_show_clone_detail)) { + if (pcmk__is_set(show_opts, pcmk_show_clone_detail)) { print_full = TRUE; } - if (pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { // Print individual instance when unique (except stopped orphans) if (partially_active - || !pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + || !pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { print_full = TRUE; } // Everything else in this block is for anonymous clones - } else if (pcmk_is_set(show_opts, pcmk_show_pending) + } else if (pcmk__is_set(show_opts, pcmk_show_pending) && (child_rsc->priv->pending_action != NULL) && (strcmp(child_rsc->priv->pending_action, "probe") != 0)) { @@ -682,9 +684,9 @@ pe__clone_default(pcmk__output_t *out, va_list args) } else if (partially_active == FALSE) { // List stopped instances when requested (except orphans) - if (!pcmk_is_set(child_rsc->flags, pcmk__rsc_removed) - && !pcmk_is_set(show_opts, pcmk_show_clone_detail) - && pcmk_is_set(show_opts, pcmk_show_inactive_rscs)) { + if (!pcmk__is_set(child_rsc->flags, pcmk__rsc_removed) + && !pcmk__is_set(show_opts, pcmk_show_clone_detail) + && pcmk__is_set(show_opts, pcmk_show_inactive_rscs)) { if (stopped == NULL) { stopped = pcmk__strkey_table(free, free); } @@ -745,7 +747,7 @@ pe__clone_default(pcmk__output_t *out, va_list args) } } - if (pcmk_is_set(show_opts, pcmk_show_clone_detail)) { + if (pcmk__is_set(show_opts, pcmk_show_clone_detail)) { PCMK__OUTPUT_LIST_FOOTER(out, rc); return pcmk_rc_ok; } @@ -791,7 +793,7 @@ pe__clone_default(pcmk__output_t *out, va_list args) if ((list_text != NULL) && (list_text->len > 0)) { clone_header(out, &rc, rsc, clone_data, desc); - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { enum rsc_role_e role = configured_role(rsc); if (role == pcmk_role_unpromoted) { @@ -814,8 +816,8 @@ pe__clone_default(pcmk__output_t *out, va_list args) g_string_free(list_text, TRUE); } - if (pcmk_is_set(show_opts, pcmk_show_inactive_rscs)) { - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unique) + if (pcmk__is_set(show_opts, pcmk_show_inactive_rscs)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unique) && (clone_data->clone_max > active_instances)) { GList *nIter; @@ -858,14 +860,17 @@ pe__clone_default(pcmk__output_t *out, va_list args) probe_op = pe__failed_probe_for_rsc(rsc, node->priv->name); if (probe_op != NULL) { - int rc; + int rc = pcmk_rc_ok; + char *key = pcmk__str_copy(node->priv->name); + char *value = NULL; - pcmk__scan_min_int(crm_element_value(probe_op, - PCMK__XA_RC_CODE), + pcmk__scan_min_int(pcmk__xe_get(probe_op, + PCMK__XA_RC_CODE), &rc, 0); - g_hash_table_insert(stopped, strdup(node->priv->name), - crm_strdup_printf("Stopped (%s)", - crm_exit_str(rc))); + value = pcmk__assert_asprintf("Stopped (%s)", + crm_exit_str(rc)); + g_hash_table_insert(stopped, key, value); + } else { pcmk__insert_dup(stopped, node->priv->name, state); } @@ -1045,7 +1050,7 @@ pe__clone_is_ordered(const pcmk_resource_t *clone) clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, clone); - return pcmk_is_set(clone_data->flags, pcmk__clone_ordered); + return pcmk__is_set(clone_data->flags, pcmk__clone_ordered); } /*! @@ -1064,10 +1069,10 @@ pe__set_clone_flag(pcmk_resource_t *clone, enum pcmk__clone_flags flag) clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, clone); - if (pcmk_is_set(clone_data->flags, flag)) { + if (pcmk__is_set(clone_data->flags, flag)) { return pcmk_rc_already; } - clone_data->flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, + clone_data->flags = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, "Clone", clone->id, clone_data->flags, flag, "flag"); return pcmk_rc_ok; @@ -1090,7 +1095,7 @@ pe__clone_flag_is_set(const pcmk_resource_t *clone, uint32_t flags) get_clone_variant_data(clone_data, clone); pcmk__assert(clone_data != NULL); - return pcmk_all_flags_set(clone_data->flags, flags); + return pcmk__all_flags_set(clone_data->flags, flags); } /*! diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c index bead3756b27..30e8fa75cee 100644 --- a/lib/pengine/complex.c +++ b/lib/pengine/complex.c @@ -12,6 +12,7 @@ #include // xmlNode #include +#include // pcmk_parse_score() #include #include #include @@ -174,9 +175,9 @@ get_meta_attributes(GHashTable * meta_hash, pcmk_resource_t * rsc, { const pcmk_rule_input_t rule_input = { .now = scheduler->priv->now, - .rsc_standard = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS), - .rsc_provider = crm_element_value(rsc->priv->xml, PCMK_XA_PROVIDER), - .rsc_agent = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE) + .rsc_standard = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS), + .rsc_provider = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER), + .rsc_agent = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE) }; for (xmlAttrPtr a = pcmk__xe_first_attr(rsc->priv->xml); @@ -249,8 +250,8 @@ get_rsc_attributes(GHashTable *instance_attrs, const pcmk_resource_t *rsc, static char * template_op_key(xmlNode * op) { - const char *name = crm_element_value(op, PCMK_XA_NAME); - const char *role = crm_element_value(op, PCMK_XA_ROLE); + const char *name = pcmk__xe_get(op, PCMK_XA_NAME); + const char *role = pcmk__xe_get(op, PCMK_XA_ROLE); char *key = NULL; if ((role == NULL) @@ -259,7 +260,7 @@ template_op_key(xmlNode * op) role = PCMK__ROLE_UNKNOWN; } - key = crm_strdup_printf("%s-%s", name, role); + key = pcmk__assert_asprintf("%s-%s", name, role); return key; } @@ -281,7 +282,7 @@ unpack_template(xmlNode *xml_obj, xmlNode **expanded_xml, return FALSE; } - template_ref = crm_element_value(xml_obj, PCMK_XA_TEMPLATE); + template_ref = pcmk__xe_get(xml_obj, PCMK_XA_TEMPLATE); if (template_ref == NULL) { return TRUE; } @@ -299,7 +300,8 @@ unpack_template(xmlNode *xml_obj, xmlNode **expanded_xml, } cib_resources = pcmk__xpath_find_one(scheduler->input->doc, - "//" PCMK_XE_RESOURCES, LOG_TRACE); + "//" PCMK_XE_RESOURCES, + PCMK__LOG_TRACE); if (cib_resources == NULL) { pcmk__config_err("No resources configured"); return FALSE; @@ -314,9 +316,9 @@ unpack_template(xmlNode *xml_obj, xmlNode **expanded_xml, new_xml = pcmk__xml_copy(NULL, template); xmlNodeSetName(new_xml, xml_obj->name); - crm_xml_add(new_xml, PCMK_XA_ID, id); - crm_xml_add(new_xml, PCMK__META_CLONE, - crm_element_value(xml_obj, PCMK__META_CLONE)); + pcmk__xe_set(new_xml, PCMK_XA_ID, id); + pcmk__xe_set(new_xml, PCMK__META_CLONE, + pcmk__xe_get(xml_obj, PCMK__META_CLONE)); template_ops = pcmk__xe_first_child(new_xml, PCMK_XE_OPERATIONS, NULL, NULL); @@ -388,7 +390,7 @@ add_template_rsc(xmlNode *xml_obj, pcmk_scheduler_t *scheduler) return FALSE; } - template_ref = crm_element_value(xml_obj, PCMK_XA_TEMPLATE); + template_ref = pcmk__xe_get(xml_obj, PCMK_XA_TEMPLATE); if (template_ref == NULL) { return TRUE; } @@ -437,7 +439,7 @@ detect_unique(const pcmk_resource_t *rsc) } return false; } - return crm_is_true(value); + return pcmk__is_true(value); } static void @@ -517,45 +519,47 @@ unpack_requires(pcmk_resource_t *rsc, const char *value, bool is_default) } else if (pcmk__str_eq(value, PCMK_VALUE_FENCING, pcmk__str_casei)) { pcmk__set_rsc_flags(rsc, pcmk__rsc_needs_fencing); - if (!pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { pcmk__config_warn("%s requires fencing but fencing is disabled", rsc->id); } } else if (pcmk__str_eq(value, PCMK_VALUE_UNFENCING, pcmk__str_casei)) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_fence_device)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_fence_device)) { pcmk__config_warn("Resetting \"" PCMK_META_REQUIRES "\" for %s " "to \"" PCMK_VALUE_QUORUM "\" because fencing " "devices cannot require unfencing", rsc->id); unpack_requires(rsc, PCMK_VALUE_QUORUM, true); return; + } - } else if (!pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { pcmk__config_warn("Resetting \"" PCMK_META_REQUIRES "\" for %s " "to \"" PCMK_VALUE_QUORUM "\" because fencing is " "disabled", rsc->id); unpack_requires(rsc, PCMK_VALUE_QUORUM, true); return; - - } else { - pcmk__set_rsc_flags(rsc, pcmk__rsc_needs_fencing - |pcmk__rsc_needs_unfencing); } + pcmk__set_rsc_flags(rsc, + pcmk__rsc_needs_fencing|pcmk__rsc_needs_unfencing); + } else { const char *orig_value = value; - if (pcmk_is_set(rsc->flags, pcmk__rsc_fence_device)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_fence_device)) { value = PCMK_VALUE_QUORUM; } else if (pcmk__is_primitive(rsc) && xml_contains_remote_node(rsc->priv->xml)) { value = PCMK_VALUE_QUORUM; - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_enable_unfencing)) { + } else if (pcmk__is_set(scheduler->flags, + pcmk__sched_enable_unfencing)) { value = PCMK_VALUE_UNFENCING; - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + } else if (pcmk__is_set(scheduler->flags, + pcmk__sched_fencing_enabled)) { value = PCMK_VALUE_FENCING; } else if (scheduler->no_quorum_policy == pcmk_no_quorum_ignore) { @@ -705,9 +709,9 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, rule_input.now = scheduler->priv->now; - crm_log_xml_trace(xml_obj, "[raw XML]"); + pcmk__log_xml_trace(xml_obj, "[raw XML]"); - id = crm_element_value(xml_obj, PCMK_XA_ID); + id = pcmk__xe_get(xml_obj, PCMK_XA_ID); if (id == NULL) { pcmk__config_err("Ignoring <%s> configuration without " PCMK_XA_ID, xml_obj->name); @@ -737,7 +741,7 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, rsc_private->scheduler = scheduler; if (expanded_xml) { - crm_log_xml_trace(expanded_xml, "[expanded XML]"); + pcmk__log_xml_trace(expanded_xml, "[expanded XML]"); rsc_private->xml = expanded_xml; rsc_private->orig_xml = xml_obj; @@ -769,9 +773,9 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, rsc_private->probed_nodes = pcmk__strkey_table(NULL, pcmk__free_node_copy); rsc_private->allowed_nodes = pcmk__strkey_table(NULL, pcmk__free_node_copy); - value = crm_element_value(rsc_private->xml, PCMK__META_CLONE); + value = pcmk__xe_get(rsc_private->xml, PCMK__META_CLONE); if (value) { - (*rsc)->id = crm_strdup_printf("%s:%s", id, value); + (*rsc)->id = pcmk__assert_asprintf("%s:%s", id, value); pcmk__insert_meta(rsc_private, PCMK__META_CLONE, value); } else { @@ -785,7 +789,7 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, (*rsc)->flags = 0; pcmk__set_rsc_flags(*rsc, pcmk__rsc_unassigned); - if (!pcmk_is_set(scheduler->flags, pcmk__sched_in_maintenance)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_in_maintenance)) { pcmk__set_rsc_flags(*rsc, pcmk__rsc_managed); } @@ -795,12 +799,12 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, unpack_priority(*rsc); value = g_hash_table_lookup(rsc_private->meta, PCMK_META_CRITICAL); - if ((value == NULL) || crm_is_true(value)) { + if ((value == NULL) || pcmk__is_true(value)) { pcmk__set_rsc_flags(*rsc, pcmk__rsc_critical); } value = g_hash_table_lookup(rsc_private->meta, PCMK_META_NOTIFY); - if (crm_is_true(value)) { + if (pcmk__is_true(value)) { pcmk__set_rsc_flags(*rsc, pcmk__rsc_notify); } @@ -814,7 +818,7 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, } value = g_hash_table_lookup(rsc_private->meta, PCMK_META_ALLOW_MIGRATE); - if (crm_is_true(value)) { + if (pcmk__is_true(value)) { pcmk__set_rsc_flags(*rsc, pcmk__rsc_migratable); } else if ((value == NULL) && remote_node) { /* By default, we want remote nodes to be able @@ -835,7 +839,7 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, " to the explicit value '" PCMK_VALUE_DEFAULT "' is deprecated and will be removed in a " "future release (just leave it unset)"); - } else if (crm_is_true(value)) { + } else if (pcmk__is_true(value)) { pcmk__set_rsc_flags(*rsc, pcmk__rsc_managed); } else { pcmk__clear_rsc_flags(*rsc, pcmk__rsc_managed); @@ -843,11 +847,11 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, } value = g_hash_table_lookup(rsc_private->meta, PCMK_META_MAINTENANCE); - if (crm_is_true(value)) { + if (pcmk__is_true(value)) { pcmk__clear_rsc_flags(*rsc, pcmk__rsc_managed); pcmk__set_rsc_flags(*rsc, pcmk__rsc_maintenance); } - if (pcmk_is_set(scheduler->flags, pcmk__sched_in_maintenance)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_in_maintenance)) { pcmk__clear_rsc_flags(*rsc, pcmk__rsc_managed); pcmk__set_rsc_flags(*rsc, pcmk__rsc_maintenance); } @@ -856,8 +860,8 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, if (detect_unique(*rsc)) { pcmk__set_rsc_flags(*rsc, pcmk__rsc_unique); } - if (crm_is_true(g_hash_table_lookup((*rsc)->priv->meta, - PCMK_META_PROMOTABLE))) { + if (pcmk__is_true(g_hash_table_lookup((*rsc)->priv->meta, + PCMK_META_PROMOTABLE))) { pcmk__set_rsc_flags(*rsc, pcmk__rsc_promotable); } } else { @@ -901,7 +905,7 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, unpack_stickiness(*rsc); unpack_migration_threshold(*rsc); - if (pcmk__str_eq(crm_element_value(rsc_private->xml, PCMK_XA_CLASS), + if (pcmk__str_eq(pcmk__xe_get(rsc_private->xml, PCMK_XA_CLASS), PCMK_RESOURCE_CLASS_STONITH, pcmk__str_casei)) { pcmk__set_scheduler_flags(scheduler, pcmk__sched_have_fencing); pcmk__set_rsc_flags(*rsc, pcmk__rsc_fence_device); @@ -950,7 +954,7 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, return pcmk_rc_unpack_error; } - if (pcmk_is_set(scheduler->flags, pcmk__sched_symmetric_cluster)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_symmetric_cluster)) { // This tag must stay exactly the same because it is tested elsewhere resource_location(*rsc, NULL, 0, "symmetric_default", scheduler); } else if (guest_node) { @@ -961,8 +965,12 @@ pe__unpack_resource(xmlNode *xml_obj, pcmk_resource_t **rsc, scheduler); } - pcmk__rsc_trace(*rsc, "%s action notification: %s", (*rsc)->id, - pcmk_is_set((*rsc)->flags, pcmk__rsc_notify)? "required" : "not required"); + if (pcmk__is_set((*rsc)->flags, pcmk__rsc_notify)) { + pcmk__rsc_trace(*rsc, "%s action notification: required", (*rsc)->id); + } else { + pcmk__rsc_trace(*rsc, "%s action notification: not required", + (*rsc)->id); + } pe__unpack_dataset_nvpairs(rsc_private->xml, PCMK_XE_UTILIZATION, &rule_input, rsc_private->utilization, NULL, @@ -1052,7 +1060,7 @@ common_free(pcmk_resource_t * rsc) } if ((rsc->priv->parent == NULL) - && pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + && pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { pcmk__xml_free(rsc->priv->xml); rsc->priv->xml = NULL; @@ -1141,7 +1149,7 @@ pe__count_active_node(const pcmk_resource_t *rsc, pcmk_node_t *node, } else { keep_looking = true; } - } else if (!pcmk_is_set(rsc->flags, pcmk__rsc_needs_fencing)) { + } else if (!pcmk__is_set(rsc->flags, pcmk__rsc_needs_fencing)) { if (is_happy && ((*active == NULL) || !(*active)->details->online || (*active)->details->unclean)) { *active = node; // This is the first clean node @@ -1205,7 +1213,7 @@ pe__find_active_requires(const pcmk_resource_t *rsc, unsigned int *count) return NULL; } - if (pcmk_is_set(rsc->flags, pcmk__rsc_needs_fencing)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_needs_fencing)) { return rsc->priv->fns->active_node(rsc, count, NULL); } else { return rsc->priv->fns->active_node(rsc, NULL, count); @@ -1223,13 +1231,13 @@ pe__count_common(pcmk_resource_t *rsc) child->priv->fns->count(item->data); } - } else if (!pcmk_is_set(rsc->flags, pcmk__rsc_removed) + } else if (!pcmk__is_set(rsc->flags, pcmk__rsc_removed) || (rsc->priv->orig_role > pcmk_role_stopped)) { rsc->priv->scheduler->priv->ninstances++; if (pe__resource_is_disabled(rsc)) { rsc->priv->scheduler->priv->disabled_resources++; } - if (pcmk_is_set(rsc->flags, pcmk__rsc_blocked)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_blocked)) { rsc->priv->scheduler->priv->blocked_resources++; } } diff --git a/lib/pengine/failcounts.c b/lib/pengine/failcounts.c index 4f3f3281912..4cc2421d996 100644 --- a/lib/pengine/failcounts.c +++ b/lib/pengine/failcounts.c @@ -14,6 +14,7 @@ #include // xmlXPathObject, etc. #include +#include // pcmk_parse_score() #include #include #include @@ -36,13 +37,13 @@ is_matched_failure(const char *rsc_id, const xmlNode *conf_op_xml, } // Get name and interval from configured op - conf_op_name = crm_element_value(conf_op_xml, PCMK_XA_NAME); - conf_op_interval_spec = crm_element_value(conf_op_xml, PCMK_META_INTERVAL); + conf_op_name = pcmk__xe_get(conf_op_xml, PCMK_XA_NAME); + conf_op_interval_spec = pcmk__xe_get(conf_op_xml, PCMK_META_INTERVAL); pcmk_parse_interval_spec(conf_op_interval_spec, &conf_op_interval_ms); // Get name and interval from op history entry - lrm_op_task = crm_element_value(lrm_op_xml, PCMK_XA_OPERATION); - crm_element_value_ms(lrm_op_xml, PCMK_META_INTERVAL, &lrm_op_interval_ms); + lrm_op_task = pcmk__xe_get(lrm_op_xml, PCMK_XA_OPERATION); + pcmk__xe_get_guint(lrm_op_xml, PCMK_META_INTERVAL, &lrm_op_interval_ms); if ((conf_op_interval_ms != lrm_op_interval_ms) || !pcmk__str_eq(conf_op_name, lrm_op_task, pcmk__str_casei)) { @@ -63,7 +64,7 @@ is_matched_failure(const char *rsc_id, const xmlNode *conf_op_xml, int rc = 0; int target_rc = pe__target_rc_from_xml(lrm_op_xml); - crm_element_value_int(lrm_op_xml, PCMK__XA_RC_CODE, &rc); + pcmk__xe_get_int(lrm_op_xml, PCMK__XA_RC_CODE, &rc); if (rc != target_rc) { matched = TRUE; } @@ -91,12 +92,12 @@ block_failure(const pcmk_node_t *node, pcmk_resource_t *rsc, * Ideally, we'd unpack the operation before this point, and pass in a * meta-attributes table that takes all that into consideration. */ - char *xpath = crm_strdup_printf("//" PCMK_XE_PRIMITIVE - "[@" PCMK_XA_ID "='%s']" - "//" PCMK_XE_OP - "[@" PCMK_META_ON_FAIL - "='" PCMK_VALUE_BLOCK "']", - xml_name); + char *xpath = pcmk__assert_asprintf("//" PCMK_XE_PRIMITIVE + "[@" PCMK_XA_ID "='%s']" + "//" PCMK_XE_OP + "[@" PCMK_META_ON_FAIL + "='" PCMK_VALUE_BLOCK "']", + xml_name); xmlXPathObject *xpathObj = pcmk__xpath_search(rsc->priv->xml->doc, xpath); gboolean should_block = FALSE; @@ -125,9 +126,8 @@ block_failure(const pcmk_node_t *node, pcmk_resource_t *rsc, xmlXPathObject *lrm_op_xpathObj = NULL; // Get name and interval from configured op - conf_op_name = crm_element_value(pref, PCMK_XA_NAME); - conf_op_interval_spec = crm_element_value(pref, - PCMK_META_INTERVAL); + conf_op_name = pcmk__xe_get(pref, PCMK_XA_NAME); + conf_op_interval_spec = pcmk__xe_get(pref, PCMK_META_INTERVAL); pcmk_parse_interval_spec(conf_op_interval_spec, &conf_op_interval_ms); @@ -136,10 +136,10 @@ block_failure(const pcmk_node_t *node, pcmk_resource_t *rsc, "/" PCMK__XE_LRM_RSC_OP "[@" PCMK_XA_OPERATION "='%s']" \ "[@" PCMK_META_INTERVAL "='%u']" - lrm_op_xpath = crm_strdup_printf(XPATH_FMT, - node->priv->name, xml_name, - conf_op_name, - conf_op_interval_ms); + lrm_op_xpath = pcmk__assert_asprintf(XPATH_FMT, + node->priv->name, xml_name, + conf_op_name, + conf_op_interval_ms); lrm_op_xpathObj = pcmk__xpath_search(scheduler->input->doc, lrm_op_xpath); @@ -189,7 +189,10 @@ rsc_fail_name(const pcmk_resource_t *rsc) { const char *name = pcmk__s(rsc->priv->history_id, rsc->id); - return pcmk_is_set(rsc->flags, pcmk__rsc_unique)? strdup(name) : clone_strip(name); + if (pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { + return strdup(name); + } + return clone_strip(name); } /*! @@ -218,8 +221,8 @@ generate_fail_regex(const char *prefix, const char *rsc_name, bool is_unique, */ const char *instance_pattern = (is_unique? "" : "(:[0-9]+)?"); - pattern = crm_strdup_printf("^%s-%s%s%s$", prefix, rsc_name, - instance_pattern, op_pattern); + pattern = pcmk__assert_asprintf("^%s-%s%s%s$", prefix, rsc_name, + instance_pattern, op_pattern); if (regcomp(re, pattern, REG_EXTENDED|REG_NOSUB) != 0) { free(pattern); return EINVAL; @@ -249,12 +252,12 @@ generate_fail_regexes(const pcmk_resource_t *rsc, regex_t *failcount_re, char *rsc_name = rsc_fail_name(rsc); if (generate_fail_regex(PCMK__FAIL_COUNT_PREFIX, rsc_name, - pcmk_is_set(rsc->flags, pcmk__rsc_unique), + pcmk__is_set(rsc->flags, pcmk__rsc_unique), failcount_re) != pcmk_rc_ok) { rc = EINVAL; } else if (generate_fail_regex(PCMK__LAST_FAILURE_PREFIX, rsc_name, - pcmk_is_set(rsc->flags, pcmk__rsc_unique), + pcmk__is_set(rsc->flags, pcmk__rsc_unique), lastfailure_re) != pcmk_rc_ok) { rc = EINVAL; regfree(failcount_re); @@ -295,10 +298,10 @@ update_failcount_for_attr(gpointer key, gpointer value, gpointer user_data) int rc = pcmk_parse_score(value, &score, 0); if (rc != pcmk_rc_ok) { - crm_warn("Ignoring %s for %s " - "because '%s' is not a valid fail count: %s", - (const char *) key, pcmk__node_name(fc_data->node), - value, pcmk_rc_str(rc)); + pcmk__warn("Ignoring %s for %s because '%s' is not a valid fail " + "count: %s", + (const char *) key, pcmk__node_name(fc_data->node), + value, pcmk_rc_str(rc)); return; } fc_data->failcount = pcmk__add_scores(fc_data->failcount, score); @@ -316,8 +319,9 @@ update_failcount_for_attr(gpointer key, gpointer value, gpointer user_data) int rc = pcmk__scan_ll(value, &last_ll, 0LL); if (rc != pcmk_rc_ok) { - crm_info("Ignoring invalid value '%s' for %s: %s", - (const char *) value, (const char *) key, pcmk_rc_str(rc)); + pcmk__info("Ignoring invalid value '%s' for %s: %s", + (const char *) value, (const char *) key, + pcmk_rc_str(rc)); return; } fc_data->last_failure = (time_t) QB_MAX(fc_data->last_failure, last_ll); @@ -397,7 +401,7 @@ pe_get_failcount(const pcmk_node_t *node, pcmk_resource_t *rsc, } // If all failures have expired, ignore fail count - if (pcmk_is_set(flags, pcmk__fc_effective) && (fc_data.failcount > 0) + if (pcmk__is_set(flags, pcmk__fc_effective) && (fc_data.failcount > 0) && (fc_data.last_failure > 0) && (rsc->priv->failure_expiration_ms > 0)) { @@ -422,7 +426,7 @@ pe_get_failcount(const pcmk_node_t *node, pcmk_resource_t *rsc, * container's fail count on that node could lead to attempting to stop the * container on the wrong node. */ - if (pcmk_is_set(flags, pcmk__fc_launched) + if (pcmk__is_set(flags, pcmk__fc_launched) && (rsc->priv->launched != NULL) && !pcmk__is_bundled(rsc)) { g_list_foreach(rsc->priv->launched, update_launched_failcount, @@ -476,7 +480,7 @@ pe__clear_failcount(pcmk_resource_t *rsc, const pcmk_node_t *node, clear = custom_action(rsc, key, PCMK_ACTION_CLEAR_FAILCOUNT, node, FALSE, scheduler); pcmk__insert_meta(clear, PCMK__META_OP_NO_WAIT, PCMK_VALUE_TRUE); - crm_notice("Clearing failure of %s on %s because %s " QB_XS " %s", - rsc->id, pcmk__node_name(node), reason, clear->uuid); + pcmk__notice("Clearing failure of %s on %s because %s " QB_XS " %s", + rsc->id, pcmk__node_name(node), reason, clear->uuid); return clear; } diff --git a/lib/pengine/group.c b/lib/pengine/group.c index 489c5de4d98..21ffe777038 100644 --- a/lib/pengine/group.c +++ b/lib/pengine/group.c @@ -62,7 +62,7 @@ pe__group_flag_is_set(const pcmk_resource_t *group, uint32_t flags) CRM_CHECK(pcmk__is_group(group), return false); group_data = group->priv->variant_opaque; - return pcmk_all_flags_set(group_data->flags, flags); + return pcmk__all_flags_set(group_data->flags, flags); } /*! @@ -78,14 +78,12 @@ static void set_group_flag(pcmk_resource_t *group, const char *option, uint32_t flag, uint32_t wo_bit) { - const char *value_s = NULL; - int value = 0; + const char *value_s = g_hash_table_lookup(group->priv->meta, option); + bool value = false; - value_s = g_hash_table_lookup(group->priv->meta, option); - - // We don't actually need the null check but it speeds up the common case - if ((value_s == NULL) || (crm_str_to_boolean(value_s, &value) < 0) - || (value != 0)) { + if ((value_s == NULL) || (pcmk__parse_bool(value_s, &value) != pcmk_rc_ok) + || value) { + // Set flag if value is unset, invalid, or true group_variant_data_t *group_data = group->priv->variant_opaque; group_data->flags |= flag; @@ -132,10 +130,10 @@ group_header(pcmk__output_t *out, int *rc, const pcmk_resource_t *rsc, pcmk__add_separated_word(&attrs, 64, "disabled", ", "); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_maintenance)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_maintenance)) { pcmk__add_separated_word(&attrs, 64, "maintenance", ", "); - } else if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + } else if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__add_separated_word(&attrs, 64, "unmanaged", ", "); } @@ -157,11 +155,13 @@ static bool skip_child_rsc(pcmk_resource_t *rsc, pcmk_resource_t *child, gboolean parent_passes, GList *only_rsc, uint32_t show_opts) { - bool star_list = pcmk__list_of_1(only_rsc) && - pcmk__str_eq("*", g_list_first(only_rsc)->data, pcmk__str_none); - bool child_filtered = child->priv->fns->is_filtered(child, only_rsc, false); - bool child_active = child->priv->fns->active(child, false); - bool show_inactive = pcmk_is_set(show_opts, pcmk_show_inactive_rscs); + const bool star_list = pcmk__list_of_1(only_rsc) + && pcmk__str_eq("*", g_list_first(only_rsc)->data, + pcmk__str_none); + const bool child_filtered = child->priv->fns->is_filtered(child, only_rsc, + false); + const bool child_active = child->priv->fns->active(child, false); + const bool show_inactive = pcmk__is_set(show_opts, pcmk_show_inactive_rscs); /* If the resource is in only_rsc by name (so, ignoring "*") then allow * it regardless of if it's active or not. @@ -200,7 +200,7 @@ group_unpack(pcmk_resource_t *rsc) set_group_flag(rsc, "collocated", pcmk__group_colocated, pcmk__wo_group_coloc); - clone_id = crm_element_value(rsc->priv->xml, PCMK__META_CLONE); + clone_id = pcmk__xe_get(rsc->priv->xml, PCMK__META_CLONE); for (xml_native_rsc = pcmk__xe_first_child(xml_obj, PCMK_XE_PRIMITIVE, NULL, NULL); @@ -209,7 +209,7 @@ group_unpack(pcmk_resource_t *rsc) pcmk_resource_t *new_rsc = NULL; - crm_xml_add(xml_native_rsc, PCMK__META_CLONE, clone_id); + pcmk__xe_set(xml_native_rsc, PCMK__META_CLONE, clone_id); if (pe__unpack_resource(xml_native_rsc, &new_rsc, rsc, rsc->priv->scheduler) != pcmk_rc_ok) { continue; @@ -336,8 +336,9 @@ pe__group_default(pcmk__output_t *out, va_list args) gboolean parent_passes = pcmk__str_in_list(rsc_printable_id(rsc), only_rsc, pcmk__str_star_matches) || (strstr(rsc->id, ":") != NULL && pcmk__str_in_list(rsc->id, only_rsc, pcmk__str_star_matches)); - bool active = rsc->priv->fns->active(rsc, true); - bool partially_active = rsc->priv->fns->active(rsc, false); + const bool active = rsc->priv->fns->active(rsc, true); + const bool partially_active = rsc->priv->fns->active(rsc, false); + const bool count_inactive = !active && partially_active; desc = pe__resource_description(rsc, show_opts); @@ -345,12 +346,14 @@ pe__group_default(pcmk__output_t *out, va_list args) return rc; } - if (pcmk_is_set(show_opts, pcmk_show_brief)) { + if (pcmk__is_set(show_opts, pcmk_show_brief)) { GList *rscs = pe__filter_rsc_list(rsc->priv->children, only_rsc); if (rscs != NULL) { - group_header(out, &rc, rsc, !active && partially_active ? inactive_resources(rsc) : 0, - pcmk_is_set(show_opts, pcmk_show_inactive_rscs), desc); + group_header(out, &rc, rsc, + (count_inactive? inactive_resources(rsc) : 0), + pcmk__is_set(show_opts, pcmk_show_inactive_rscs), + desc); pe__rscs_brief_output(out, rscs, show_opts | pcmk_show_inactive_rscs); rc = pcmk_rc_ok; @@ -366,8 +369,10 @@ pe__group_default(pcmk__output_t *out, va_list args) continue; } - group_header(out, &rc, rsc, !active && partially_active ? inactive_resources(rsc) : 0, - pcmk_is_set(show_opts, pcmk_show_inactive_rscs), desc); + group_header(out, &rc, rsc, + (count_inactive? inactive_resources(rsc) : 0), + pcmk__is_set(show_opts, pcmk_show_inactive_rscs), + desc); out->message(out, (const char *) child_rsc->priv->xml->name, show_opts, child_rsc, only_node, only_rsc); } diff --git a/lib/pengine/native.c b/lib/pengine/native.c index 5b0d79c2327..4597f53e7cb 100644 --- a/lib/pengine/native.c +++ b/lib/pengine/native.c @@ -13,6 +13,7 @@ #include // uint32_t #include +#include // PCMK_SCORE_INFINITY #include #include #include @@ -101,8 +102,12 @@ native_add_running(pcmk_resource_t *rsc, pcmk_node_t *node, } } - pcmk__rsc_trace(rsc, "Adding %s to %s %s", rsc->id, pcmk__node_name(node), - pcmk_is_set(rsc->flags, pcmk__rsc_managed)? "" : "(unmanaged)"); + if (pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { + pcmk__rsc_trace(rsc, "Adding %s to %s", rsc->id, pcmk__node_name(node)); + } else { + pcmk__rsc_trace(rsc, "Adding %s to %s (unmanaged)", rsc->id, + pcmk__node_name(node)); + } rsc->priv->active_nodes = g_list_append(rsc->priv->active_nodes, node); if (pcmk__is_primitive(rsc)) { @@ -114,7 +119,7 @@ native_add_running(pcmk_resource_t *rsc, pcmk_node_t *node, } } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk_resource_t *p = parent; pcmk__rsc_info(rsc, "resource %s isn't managed", rsc->id); @@ -177,9 +182,9 @@ native_add_running(pcmk_resource_t *rsc, pcmk_node_t *node, */ break; } - crm_debug("%s is active on multiple nodes including %s: %s", - rsc->id, pcmk__node_name(node), - pcmk__multiply_active_text(rsc)); + pcmk__debug("%s is active on multiple nodes including %s: %s", + rsc->id, pcmk__node_name(node), + pcmk__multiply_active_text(rsc)); } else { pcmk__rsc_trace(rsc, "Resource %s is active on %s", @@ -205,14 +210,14 @@ bool native_unpack(pcmk_resource_t *rsc) { pcmk_resource_t *parent = uber_parent(rsc); - const char *standard = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); + const char *standard = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); uint32_t ra_caps = pcmk_get_ra_caps(standard); pcmk__rsc_trace(rsc, "Processing resource %s...", rsc->id); // Only some agent standards support unique and promotable clones - if (!pcmk_is_set(ra_caps, pcmk_ra_cap_unique) - && pcmk_is_set(rsc->flags, pcmk__rsc_unique) + if (!pcmk__is_set(ra_caps, pcmk_ra_cap_unique) + && pcmk__is_set(rsc->flags, pcmk__rsc_unique) && pcmk__is_clone(parent)) { /* @COMPAT We should probably reject this situation as an error (as we @@ -230,8 +235,8 @@ native_unpack(pcmk_resource_t *rsc) recursive_clear_unique(parent, NULL); recursive_clear_unique(rsc, NULL); } - if (!pcmk_is_set(ra_caps, pcmk_ra_cap_promotable) - && pcmk_is_set(parent->flags, pcmk__rsc_promotable)) { + if (!pcmk__is_set(ra_caps, pcmk_ra_cap_promotable) + && pcmk__is_set(parent->flags, pcmk__rsc_promotable)) { pcmk__config_err("Resource %s is of type %s and therefore " "cannot be used as a promotable clone resource", @@ -247,7 +252,7 @@ rsc_is_on_node(pcmk_resource_t *rsc, const pcmk_node_t *node, int flags) pcmk__rsc_trace(rsc, "Checking whether %s is on %s", rsc->id, pcmk__node_name(node)); - if (pcmk_is_set(flags, pcmk_rsc_match_current_node) + if (pcmk__is_set(flags, pcmk_rsc_match_current_node) && (rsc->priv->active_nodes != NULL)) { for (GList *iter = rsc->priv->active_nodes; @@ -258,7 +263,7 @@ rsc_is_on_node(pcmk_resource_t *rsc, const pcmk_node_t *node, int flags) } } - } else if (!pcmk_is_set(flags, pcmk_rsc_match_current_node) + } else if (!pcmk__is_set(flags, pcmk_rsc_match_current_node) && (rsc->priv->assigned_node != NULL) && pcmk__same_node(rsc->priv->assigned_node, node)) { return true; @@ -275,7 +280,7 @@ native_find_rsc(pcmk_resource_t *rsc, const char *id, CRM_CHECK(id && rsc && rsc->id, return NULL); - if (pcmk_is_set(flags, pcmk_rsc_match_clone_only)) { + if (pcmk__is_set(flags, pcmk_rsc_match_clone_only)) { const char *rid = pcmk__xe_id(rsc->priv->xml); if (!pcmk__is_clone(pe__const_top_resource(rsc, false))) { @@ -288,13 +293,13 @@ native_find_rsc(pcmk_resource_t *rsc, const char *id, } else if (!strcmp(id, rsc->id)) { match = true; - } else if (pcmk_is_set(flags, pcmk_rsc_match_history) + } else if (pcmk__is_set(flags, pcmk_rsc_match_history) && pcmk__str_eq(rsc->priv->history_id, id, pcmk__str_none)) { match = true; - } else if (pcmk_is_set(flags, pcmk_rsc_match_basename) - || (pcmk_is_set(flags, pcmk_rsc_match_anon_basename) - && !pcmk_is_set(rsc->flags, pcmk__rsc_unique))) { + } else if (pcmk__is_set(flags, pcmk_rsc_match_basename) + || (pcmk__is_set(flags, pcmk_rsc_match_anon_basename) + && !pcmk__is_set(rsc->flags, pcmk__rsc_unique))) { match = pe_base_name_eq(rsc, id); } @@ -334,7 +339,7 @@ native_active(const pcmk_resource_t *rsc, bool all) rsc->id, pcmk__node_name(a_node)); return TRUE; } else if (!a_node->details->online - && pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + && pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { pcmk__rsc_trace(rsc, "Resource %s: %s is offline", rsc->id, pcmk__node_name(a_node)); } else { @@ -415,8 +420,8 @@ native_displayable_role(const pcmk_resource_t *rsc) enum rsc_role_e role = rsc->priv->orig_role; if ((role == pcmk_role_started) - && pcmk_is_set(pe__const_top_resource(rsc, false)->flags, - pcmk__rsc_promotable)) { + && pcmk__is_set(pe__const_top_resource(rsc, false)->flags, + pcmk__rsc_promotable)) { role = pcmk_role_unpromoted; } @@ -474,9 +479,9 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, const pcmk_node_t *node, uint32_t show_opts, const char *target_role, bool show_nodes) { - const char *class = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); + const char *class = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); const char *provider = NULL; - const char *kind = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); + const char *kind = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); GString *outstr = NULL; bool have_flags = false; @@ -488,14 +493,14 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, CRM_CHECK(kind != NULL, kind = "unknown"); CRM_CHECK(class != NULL, class = "unknown"); - if (pcmk_is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider)) { - provider = crm_element_value(rsc->priv->xml, PCMK_XA_PROVIDER); + if (pcmk__is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider)) { + provider = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER); } if ((node == NULL) && (rsc->priv->lock_node != NULL)) { node = rsc->priv->lock_node; } - if (pcmk_any_flags_set(show_opts, pcmk_show_rsc_only) + if (pcmk__any_flags_set(show_opts, pcmk_show_rsc_only) || pcmk__list_of_multiple(rsc->priv->active_nodes)) { node = NULL; } @@ -508,10 +513,10 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, pcmk__s(provider, ""), ":", kind, "):\t", NULL); // State on node - if (pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { g_string_append(outstr, " ORPHANED"); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { enum rsc_role_e role = native_displayable_role(rsc); g_string_append(outstr, " FAILED"); @@ -519,7 +524,7 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, pcmk__add_word(&outstr, 0, pcmk_role_text(role)); } } else { - bool show_pending = pcmk_is_set(show_opts, pcmk_show_pending); + const bool show_pending = pcmk__is_set(show_opts, pcmk_show_pending); pcmk__add_word(&outstr, 0, native_displayable_state(rsc, show_pending)); } @@ -534,8 +539,8 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, if (probe_op != NULL) { int rc; - pcmk__scan_min_int(crm_element_value(probe_op, PCMK__XA_RC_CODE), - &rc, 0); + pcmk__scan_min_int(pcmk__xe_get(probe_op, PCMK__XA_RC_CODE), &rc, + 0); pcmk__g_strcat(outstr, " (", crm_exit_str(rc), ") ", NULL); } } @@ -547,7 +552,7 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, if ((node != NULL) && pcmk__same_node(node, rsc->priv->lock_node)) { have_flags = add_output_flag(outstr, "LOCKED", have_flags); } - if (pcmk_is_set(show_opts, pcmk_show_pending)) { + if (pcmk__is_set(show_opts, pcmk_show_pending)) { const char *pending_action = native_pending_action(rsc); if (pending_action != NULL) { @@ -566,8 +571,8 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, break; case pcmk_role_unpromoted: - if (pcmk_is_set(pe__const_top_resource(rsc, false)->flags, - pcmk__rsc_promotable)) { + if (pcmk__is_set(pe__const_top_resource(rsc, false)->flags, + pcmk__rsc_promotable)) { have_flags = add_output_flag(outstr, PCMK_META_TARGET_ROLE ":", have_flags); @@ -585,19 +590,19 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, } // Blocked or maintenance implies unmanaged - if (pcmk_any_flags_set(rsc->flags, - pcmk__rsc_blocked|pcmk__rsc_maintenance)) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_blocked)) { + if (pcmk__any_flags_set(rsc->flags, + pcmk__rsc_blocked|pcmk__rsc_maintenance)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_blocked)) { have_flags = add_output_flag(outstr, "blocked", have_flags); - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_maintenance)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_maintenance)) { have_flags = add_output_flag(outstr, "maintenance", have_flags); } - } else if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + } else if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { have_flags = add_output_flag(outstr, "unmanaged", have_flags); } - if (pcmk_is_set(rsc->flags, pcmk__rsc_ignore_failure)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_ignore_failure)) { have_flags = add_output_flag(outstr, "failure ignored", have_flags); } @@ -607,10 +612,9 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, } // User-supplied description - if (pcmk_any_flags_set(show_opts, pcmk_show_rsc_only|pcmk_show_description) + if (pcmk__any_flags_set(show_opts, pcmk_show_rsc_only|pcmk_show_description) || pcmk__list_of_multiple(rsc->priv->active_nodes)) { - const char *desc = crm_element_value(rsc->priv->xml, - PCMK_XA_DESCRIPTION); + const char *desc = pcmk__xe_get(rsc->priv->xml, PCMK_XA_DESCRIPTION); if (desc) { g_string_append(outstr, " ("); @@ -620,7 +624,7 @@ pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, } } - if (show_nodes && !pcmk_is_set(show_opts, pcmk_show_rsc_only) + if (show_nodes && !pcmk__is_set(show_opts, pcmk_show_rsc_only) && pcmk__list_of_multiple(rsc->priv->active_nodes)) { bool have_nodes = false; @@ -644,7 +648,7 @@ pe__common_output_html(pcmk__output_t *out, const pcmk_resource_t *rsc, const char *name, const pcmk_node_t *node, uint32_t show_opts) { - const char *kind = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); + const char *kind = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); const char *target_role = NULL; const char *cl = NULL; @@ -653,20 +657,20 @@ pe__common_output_html(pcmk__output_t *out, const pcmk_resource_t *rsc, pcmk__assert((kind != NULL) && pcmk__is_primitive(rsc)); - if (crm_is_true(g_hash_table_lookup(rsc->priv->meta, - PCMK__META_INTERNAL_RSC)) - && !pcmk_is_set(show_opts, pcmk_show_implicit_rscs)) { + if (pcmk__is_true(g_hash_table_lookup(rsc->priv->meta, + PCMK__META_INTERNAL_RSC)) + && !pcmk__is_set(show_opts, pcmk_show_implicit_rscs)) { - crm_trace("skipping print of internal resource %s", rsc->id); + pcmk__trace("skipping print of internal resource %s", rsc->id); return pcmk_rc_no_output; } target_role = g_hash_table_lookup(rsc->priv->meta, PCMK_META_TARGET_ROLE); - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { cl = PCMK__VALUE_RSC_MANAGED; - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { cl = PCMK__VALUE_RSC_FAILED; } else if (pcmk__is_primitive(rsc) @@ -676,7 +680,7 @@ pe__common_output_html(pcmk__output_t *out, const pcmk_resource_t *rsc, } else if (pcmk__list_of_multiple(rsc->priv->active_nodes)) { cl = PCMK__VALUE_RSC_MULTIPLE; - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_ignore_failure)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_ignore_failure)) { cl = PCMK__VALUE_RSC_FAILURE_IGNORED; } else { @@ -702,11 +706,11 @@ pe__common_output_text(pcmk__output_t *out, const pcmk_resource_t *rsc, pcmk__assert(pcmk__is_primitive(rsc)); - if (crm_is_true(g_hash_table_lookup(rsc->priv->meta, - PCMK__META_INTERNAL_RSC)) - && !pcmk_is_set(show_opts, pcmk_show_implicit_rscs)) { + if (pcmk__is_true(g_hash_table_lookup(rsc->priv->meta, + PCMK__META_INTERNAL_RSC)) + && !pcmk__is_set(show_opts, pcmk_show_implicit_rscs)) { - crm_trace("skipping print of internal resource %s", rsc->id); + pcmk__trace("skipping print of internal resource %s", rsc->id); return pcmk_rc_no_output; } target_role = g_hash_table_lookup(rsc->priv->meta, @@ -734,9 +738,9 @@ pe__resource_xml(pcmk__output_t *out, va_list args) GList *only_rsc = va_arg(args, GList *); int rc = pcmk_rc_no_output; - bool print_pending = pcmk_is_set(show_opts, pcmk_show_pending); - const char *class = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); - const char *prov = crm_element_value(rsc->priv->xml, PCMK_XA_PROVIDER); + const bool print_pending = pcmk__is_set(show_opts, pcmk_show_pending); + const char *class = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); + const char *prov = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER); char ra_name[LINE_MAX]; const char *rsc_state = native_displayable_state(rsc, print_pending); @@ -763,7 +767,7 @@ pe__resource_xml(pcmk__output_t *out, va_list args) // Resource information snprintf(ra_name, LINE_MAX, "%s%s%s:%s", class, ((prov == NULL)? "" : ":"), ((prov == NULL)? "" : prov), - crm_element_value(rsc->priv->xml, PCMK_XA_TYPE)); + pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE)); target_role = g_hash_table_lookup(rsc->priv->meta, PCMK_META_TARGET_ROLE); @@ -910,15 +914,15 @@ native_location(const pcmk_resource_t *rsc, GList **list, uint32_t target) } } else { - if (pcmk_is_set(target, pcmk__rsc_node_current)) { + if (pcmk__is_set(target, pcmk__rsc_node_current)) { result = g_list_copy(rsc->priv->active_nodes); } - if (pcmk_is_set(target, pcmk__rsc_node_pending) + if (pcmk__is_set(target, pcmk__rsc_node_pending) && (rsc->priv->pending_node != NULL) && !pe_find_node_id(result, rsc->priv->pending_node->priv->id)) { result = g_list_append(result, (gpointer) rsc->priv->pending_node); } - if (pcmk_is_set(target, pcmk__rsc_node_assigned) + if (pcmk__is_set(target, pcmk__rsc_node_assigned) && (rsc->priv->assigned_node != NULL)) { result = g_list_append(result, rsc->priv->assigned_node); } @@ -953,8 +957,8 @@ get_rscs_brief(GList *rsc_list, GHashTable * rsc_table, GHashTable * active_tabl for (; gIter != NULL; gIter = gIter->next) { pcmk_resource_t *rsc = (pcmk_resource_t *) gIter->data; - const char *class = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); - const char *kind = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); + const char *class = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); + const char *kind = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); int offset = 0; char buffer[LINE_MAX]; @@ -967,9 +971,8 @@ get_rscs_brief(GList *rsc_list, GHashTable * rsc_table, GHashTable * active_tabl } offset += snprintf(buffer + offset, LINE_MAX - offset, "%s", class); - if (pcmk_is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider)) { - const char *prov = crm_element_value(rsc->priv->xml, - PCMK_XA_PROVIDER); + if (pcmk__is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_provider)) { + const char *prov = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER); if (prov != NULL) { offset += snprintf(buffer + offset, LINE_MAX - offset, @@ -996,8 +999,8 @@ get_rscs_brief(GList *rsc_list, GHashTable * rsc_table, GHashTable * active_tabl pcmk_node_t *node = (pcmk_node_t *) gIter2->data; GHashTable *node_table = NULL; - if (node->details->unclean == FALSE && node->details->online == FALSE && - pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!node->details->unclean && !node->details->online + && pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { continue; } @@ -1080,11 +1083,11 @@ pe__rscs_brief_output(pcmk__output_t *out, GList *rsc_list, uint32_t show_opts) active_counter_all += *active_counter; } - if (pcmk_is_set(show_opts, pcmk_show_rsc_only)) { + if (pcmk__is_set(show_opts, pcmk_show_rsc_only)) { node_name = NULL; } - if (pcmk_is_set(show_opts, pcmk_show_inactive_rscs)) { + if (pcmk__is_set(show_opts, pcmk_show_inactive_rscs)) { out->list_item(out, NULL, "%d/%d\t(%s):\tActive %s", *active_counter, rsc_counter ? *rsc_counter : 0, type, @@ -1098,7 +1101,9 @@ pe__rscs_brief_output(pcmk__output_t *out, GList *rsc_list, uint32_t show_opts) rc = pcmk_rc_ok; } - if (pcmk_is_set(show_opts, pcmk_show_inactive_rscs) && active_counter_all == 0) { + if (pcmk__is_set(show_opts, pcmk_show_inactive_rscs) + && (active_counter_all == 0)) { + out->list_item(out, NULL, "%d/%d\t(%s):\tActive", active_counter_all, rsc_counter ? *rsc_counter : 0, type); diff --git a/lib/pengine/pe_actions.c b/lib/pengine/pe_actions.c index ab0c7605f80..2db9a47016a 100644 --- a/lib/pengine/pe_actions.c +++ b/lib/pengine/pe_actions.c @@ -108,13 +108,13 @@ find_exact_action_config(const pcmk_resource_t *rsc, const char *action_name, continue; } - interval_spec = crm_element_value(operation, PCMK_META_INTERVAL); + interval_spec = pcmk__xe_get(operation, PCMK_META_INTERVAL); pcmk_parse_interval_spec(interval_spec, &tmp_ms); if (tmp_ms != interval_ms) { continue; } - config_name = crm_element_value(operation, PCMK_XA_NAME); + config_name = pcmk__xe_get(operation, PCMK_XA_NAME); if (pcmk__str_eq(action_name, config_name, pcmk__str_none)) { return operation; } @@ -272,8 +272,8 @@ update_action_optional(pcmk_action_t *action, gboolean optional) { // Force a non-recurring action to be optional if its resource is unmanaged if ((action->rsc != NULL) && (action->node != NULL) - && !pcmk_is_set(action->flags, pcmk__action_pseudo) - && !pcmk_is_set(action->rsc->flags, pcmk__rsc_managed) + && !pcmk__is_set(action->flags, pcmk__action_pseudo) + && !pcmk__is_set(action->rsc->flags, pcmk__rsc_managed) && (g_hash_table_lookup(action->meta, PCMK_META_INTERVAL) == NULL)) { pcmk__rsc_debug(action->rsc, "%s on %s is optional (%s is unmanaged)", @@ -293,7 +293,7 @@ effective_quorum_policy(pcmk_resource_t *rsc, pcmk_scheduler_t *scheduler) { enum pe_quorum_policy policy = scheduler->no_quorum_policy; - if (pcmk_is_set(scheduler->flags, pcmk__sched_quorate)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_quorate)) { policy = pcmk_no_quorum_ignore; } else if (scheduler->no_quorum_policy == pcmk_no_quorum_demote) { @@ -329,7 +329,7 @@ update_resource_action_runnable(pcmk_action_t *action, { pcmk_resource_t *rsc = action->rsc; - if (pcmk_is_set(action->flags, pcmk__action_pseudo)) { + if (pcmk__is_set(action->flags, pcmk__action_pseudo)) { return; } @@ -337,21 +337,21 @@ update_resource_action_runnable(pcmk_action_t *action, pcmk__rsc_trace(rsc, "%s is unrunnable (unallocated)", action->uuid); pcmk__clear_action_flags(action, pcmk__action_runnable); - } else if (!pcmk_is_set(action->flags, pcmk__action_on_dc) + } else if (!pcmk__is_set(action->flags, pcmk__action_on_dc) && !(action->node->details->online) && (!pcmk__is_guest_or_bundle_node(action->node) - || pcmk_is_set(action->node->priv->flags, - pcmk__node_remote_reset))) { + || pcmk__is_set(action->node->priv->flags, + pcmk__node_remote_reset))) { pcmk__clear_action_flags(action, pcmk__action_runnable); do_crm_log(LOG_WARNING, "%s on %s is unrunnable (node is offline)", action->uuid, pcmk__node_name(action->node)); - if (pcmk_is_set(rsc->flags, pcmk__rsc_managed) + if (pcmk__is_set(rsc->flags, pcmk__rsc_managed) && pcmk__str_eq(action->task, PCMK_ACTION_STOP, pcmk__str_casei) && !(action->node->details->unclean)) { pe_fence_node(scheduler, action->node, "stop is unrunnable", false); } - } else if (!pcmk_is_set(action->flags, pcmk__action_on_dc) + } else if (!pcmk__is_set(action->flags, pcmk__action_on_dc) && action->node->details->pending) { pcmk__clear_action_flags(action, pcmk__action_runnable); do_crm_log(LOG_WARNING, @@ -466,20 +466,20 @@ validate_on_fail(const pcmk_resource_t *rsc, const char *action_name, /* We only care about explicit on-fail (if promote uses default, so * can demote) */ - promote_on_fail = crm_element_value(operation, PCMK_META_ON_FAIL); + promote_on_fail = pcmk__xe_get(operation, PCMK_META_ON_FAIL); if (promote_on_fail == NULL) { continue; } // We only care about recurring monitors for the promoted role - name = crm_element_value(operation, PCMK_XA_NAME); - role = crm_element_value(operation, PCMK_XA_ROLE); + name = pcmk__xe_get(operation, PCMK_XA_NAME); + role = pcmk__xe_get(operation, PCMK_XA_ROLE); if (!pcmk__str_eq(name, PCMK_ACTION_MONITOR, pcmk__str_none) || !pcmk__strcase_any_of(role, PCMK_ROLE_PROMOTED, PCMK__ROLE_PROMOTED_LEGACY, NULL)) { continue; } - interval_spec = crm_element_value(operation, PCMK_META_INTERVAL); + interval_spec = pcmk__xe_get(operation, PCMK_META_INTERVAL); pcmk_parse_interval_spec(interval_spec, &interval_ms); if (interval_ms == 0U) { continue; @@ -514,9 +514,9 @@ validate_on_fail(const pcmk_resource_t *rsc, const char *action_name, // PCMK_META_ON_FAIL=PCMK_VALUE_DEMOTE is allowed only for certain actions if (pcmk__str_eq(value, PCMK_VALUE_DEMOTE, pcmk__str_casei)) { - name = crm_element_value(action_config, PCMK_XA_NAME); - role = crm_element_value(action_config, PCMK_XA_ROLE); - interval_spec = crm_element_value(action_config, PCMK_META_INTERVAL); + name = pcmk__xe_get(action_config, PCMK_XA_NAME); + role = pcmk__xe_get(action_config, PCMK_XA_ROLE); + interval_spec = pcmk__xe_get(action_config, PCMK_META_INTERVAL); pcmk_parse_interval_spec(interval_spec, &interval_ms); if (!pcmk__str_eq(name, PCMK_ACTION_PROMOTE, pcmk__str_none) @@ -537,9 +537,11 @@ validate_on_fail(const pcmk_resource_t *rsc, const char *action_name, static int unpack_timeout(const char *value) { - long long timeout_ms = crm_get_msec(value); + long long timeout_ms = 0; + + if ((value == NULL) || (pcmk__parse_ms(value, &timeout_ms) != pcmk_rc_ok) + || (timeout_ms <= 0)) { - if (timeout_ms <= 0) { timeout_ms = PCMK_DEFAULT_ACTION_TIMEOUT_MS; } return (int) QB_MIN(timeout_ms, INT_MAX); @@ -578,8 +580,8 @@ unpack_interval_origin(const char *value, const xmlNode *xml_obj, // Calculate seconds remaining until next interval result = ((result <= 0)? 0 : interval_sec) - result; - crm_info("Calculated a start delay of %llds for operation '%s'", - result, pcmk__s(pcmk__xe_id(xml_obj), "(unspecified)")); + pcmk__info("Calculated a start delay of %llds for operation '%s'", result, + pcmk__s(pcmk__xe_id(xml_obj), "(unspecified)")); if (start_delay != NULL) { *start_delay = result * 1000; // milliseconds @@ -596,15 +598,14 @@ unpack_start_delay(const char *value, GHashTable *meta) return 0; } - start_delay_ms = crm_get_msec(value); - start_delay_ms = QB_MIN(start_delay_ms, INT_MAX); - if (start_delay_ms < 0) { - start_delay_ms = 0; + if (pcmk__parse_ms(value, &start_delay_ms) == pcmk_rc_ok) { + start_delay_ms = QB_MAX(start_delay_ms, 0); + start_delay_ms = QB_MIN(start_delay_ms, INT_MAX); } if (meta != NULL) { g_hash_table_replace(meta, strdup(PCMK_META_START_DELAY), - pcmk__itoa(start_delay_ms)); + pcmk__itoa((int) start_delay_ms)); } return (int) start_delay_ms; @@ -631,11 +632,10 @@ most_frequent_monitor(const pcmk_resource_t *rsc) bool enabled = false; guint interval_ms = 0U; - const char *interval_spec = crm_element_value(operation, - PCMK_META_INTERVAL); + const char *interval_spec = pcmk__xe_get(operation, PCMK_META_INTERVAL); // We only care about enabled recurring monitors - if (!pcmk__str_eq(crm_element_value(operation, PCMK_XA_NAME), + if (!pcmk__str_eq(pcmk__xe_get(operation, PCMK_XA_NAME), PCMK_ACTION_MONITOR, pcmk__str_none)) { continue; } @@ -689,9 +689,9 @@ pcmk__unpack_action_meta(pcmk_resource_t *rsc, const pcmk_node_t *node, * for meta-attributes */ .now = rsc->priv->scheduler->priv->now, - .rsc_standard = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS), - .rsc_provider = crm_element_value(rsc->priv->xml, PCMK_XA_PROVIDER), - .rsc_agent = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE), + .rsc_standard = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS), + .rsc_provider = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER), + .rsc_agent = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE), .op_name = action_name, .op_interval_ms = interval_ms, }; @@ -726,8 +726,7 @@ pcmk__unpack_action_meta(pcmk_resource_t *rsc, const pcmk_node_t *node, * PCMK_XE_META_ATTRIBUTES blocks (which may also have rules that * need to be evaluated). */ - timeout_spec = crm_element_value(min_interval_mon, - PCMK_META_TIMEOUT); + timeout_spec = pcmk__xe_get(min_interval_mon, PCMK_META_TIMEOUT); if (timeout_spec != NULL) { pcmk__rsc_trace(rsc, "Setting default timeout for %s probe to " @@ -748,7 +747,7 @@ pcmk__unpack_action_meta(pcmk_resource_t *rsc, const pcmk_node_t *node, // Normalize interval to milliseconds if (interval_ms > 0) { g_hash_table_insert(meta, pcmk__str_copy(PCMK_META_INTERVAL), - crm_strdup_printf("%u", interval_ms)); + pcmk__assert_asprintf("%u", interval_ms)); } else { g_hash_table_remove(meta, PCMK_META_INTERVAL); } @@ -764,8 +763,8 @@ pcmk__unpack_action_meta(pcmk_resource_t *rsc, const pcmk_node_t *node, */ // Check for pcmk_monitor_timeout - if (pcmk_is_set(pcmk_get_ra_caps(rule_input.rsc_standard), - pcmk_ra_cap_fence_params) + if (pcmk__is_set(pcmk_get_ra_caps(rule_input.rsc_standard), + pcmk_ra_cap_fence_params) && (pcmk__str_eq(action_name, PCMK_ACTION_START, pcmk__str_none) || pcmk_is_probe(action_name, interval_ms))) { @@ -801,7 +800,7 @@ pcmk__unpack_action_meta(pcmk_resource_t *rsc, const pcmk_node_t *node, rsc->priv->scheduler->priv->now, &start_delay)) { g_hash_table_insert(meta, pcmk__str_copy(PCMK_META_START_DELAY), - crm_strdup_printf("%lld", start_delay)); + pcmk__assert_asprintf("%lld", start_delay)); } } return meta; @@ -828,11 +827,11 @@ pcmk__action_requires(const pcmk_resource_t *rsc, const char *action_name) PCMK_ACTION_PROMOTE, NULL)) { value = "nothing (not start or promote)"; - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_needs_fencing)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_needs_fencing)) { requires = pcmk__requires_fencing; value = "fencing"; - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_needs_quorum)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_needs_quorum)) { requires = pcmk__requires_quorum; value = "quorum"; @@ -875,7 +874,7 @@ pcmk__parse_on_fail(const pcmk_resource_t *rsc, const char *action_name, desc = "block"; } else if (pcmk__str_eq(value, PCMK_VALUE_FENCE, pcmk__str_casei)) { - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { on_fail = pcmk__on_fail_fence_node; desc = "node fencing"; } else { @@ -939,12 +938,12 @@ pcmk__parse_on_fail(const pcmk_resource_t *rsc, const char *action_name, * failures that don't are probes and starts. The user can explicitly set * PCMK_META_ON_FAIL=PCMK_VALUE_FENCE to fence after start failures. */ - if (pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection) + if (pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection) && pcmk__is_remote_node(pcmk_find_node(scheduler, rsc->id)) && !pcmk_is_probe(action_name, interval_ms) && !pcmk__str_eq(action_name, PCMK_ACTION_START, pcmk__str_none)) { needs_remote_reset = true; - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { desc = NULL; // Force default for unmanaged connections } } @@ -957,8 +956,8 @@ pcmk__parse_on_fail(const pcmk_resource_t *rsc, const char *action_name, desc = "restart container (and possibly migrate) (default)"; } else if (needs_remote_reset) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { desc = "fence remote node (default)"; } else { desc = "recover remote node connection (default)"; @@ -970,7 +969,7 @@ pcmk__parse_on_fail(const pcmk_resource_t *rsc, const char *action_name, } } else if (pcmk__str_eq(action_name, PCMK_ACTION_STOP, pcmk__str_none)) { - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { on_fail = pcmk__on_fail_fence_node; desc = "resource fence (default)"; } else { @@ -1106,7 +1105,7 @@ custom_action(pcmk_resource_t *rsc, char *key, const char *task, * new_action(). */ if ((action->node != NULL) && (action->op_entry != NULL) - && !pcmk_is_set(action->flags, pcmk__action_attrs_evaluated)) { + && !pcmk__is_set(action->flags, pcmk__action_attrs_evaluated)) { GHashTable *attrs = action->node->priv->attrs; @@ -1141,7 +1140,7 @@ get_pseudo_op(const char *name, pcmk_scheduler_t *scheduler) } static GList * -find_unfencing_devices(GList *candidates, GList *matches) +find_unfencing_devices(GList *candidates, GList *matches) { for (GList *gIter = candidates; gIter != NULL; gIter = gIter->next) { pcmk_resource_t *candidate = gIter->data; @@ -1150,10 +1149,10 @@ find_unfencing_devices(GList *candidates, GList *matches) matches = find_unfencing_devices(candidate->priv->children, matches); - } else if (!pcmk_is_set(candidate->flags, pcmk__rsc_fence_device)) { + } else if (!pcmk__is_set(candidate->flags, pcmk__rsc_fence_device)) { continue; - } else if (pcmk_is_set(candidate->flags, pcmk__rsc_needs_unfencing)) { + } else if (pcmk__is_set(candidate->flags, pcmk__rsc_needs_unfencing)) { matches = g_list_prepend(matches, candidate); } else if (pcmk__str_eq(g_hash_table_lookup(candidate->priv->meta, @@ -1245,8 +1244,8 @@ pe_fence_op(pcmk_node_t *node, const char *op, bool optional, op = scheduler->priv->fence_action; } - op_key = crm_strdup_printf("%s-%s-%s", - PCMK_ACTION_STONITH, node->priv->name, op); + op_key = pcmk__assert_asprintf("%s-%s-%s", + PCMK_ACTION_STONITH, node->priv->name, op); stonith_op = lookup_singleton(scheduler, op_key); if(stonith_op == NULL) { @@ -1258,7 +1257,7 @@ pe_fence_op(pcmk_node_t *node, const char *op, bool optional, node->priv->id); pcmk__insert_meta(stonith_op, PCMK__META_STONITH_ACTION, op); - if (pcmk_is_set(scheduler->flags, pcmk__sched_enable_unfencing)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_enable_unfencing)) { /* Extra work to detect device changes */ GString *digests_all = g_string_sized_new(1024); @@ -1277,8 +1276,9 @@ pe_fence_op(pcmk_node_t *node, const char *op, bool optional, scheduler); if (data->rc == pcmk__digest_mismatch) { optional = FALSE; - crm_notice("Unfencing node %s because the definition of " - "%s changed", pcmk__node_name(node), match->id); + pcmk__notice("Unfencing node %s because the definition of " + "%s changed", + pcmk__node_name(node), match->id); if (!pcmk__is_daemon && (scheduler->priv->out != NULL)) { pcmk__output_t *out = scheduler->priv->out; @@ -1360,8 +1360,9 @@ get_complex_task(const pcmk_resource_t *rsc, const char *name) case pcmk__action_started: case pcmk__action_demoted: case pcmk__action_promoted: - crm_trace("Folding %s back into its atomic counterpart for %s", - name, rsc->id); + pcmk__trace("Folding %s back into its atomic counterpart for " + "%s", + name, rsc->id); --task; break; default: @@ -1426,18 +1427,19 @@ find_actions(GList *input, const char *key, const pcmk_node_t *on_node) continue; } else if (on_node == NULL) { - crm_trace("Action %s matches (ignoring node)", key); + pcmk__trace("Action %s matches (ignoring node)", key); result = g_list_prepend(result, action); } else if (action->node == NULL) { - crm_trace("Action %s matches (unallocated, assigning to %s)", - key, pcmk__node_name(on_node)); + pcmk__trace("Action %s matches (unallocated, assigning to %s)", key, + pcmk__node_name(on_node)); action->node = pe__copy_node(on_node); result = g_list_prepend(result, action); } else if (pcmk__same_node(on_node, action->node)) { - crm_trace("Action %s on %s matches", key, pcmk__node_name(on_node)); + pcmk__trace("Action %s on %s matches", key, + pcmk__node_name(on_node)); result = g_list_prepend(result, action); } } @@ -1463,7 +1465,8 @@ find_actions_exact(GList *input, const char *key, const pcmk_node_t *on_node) && pcmk__str_eq(key, action->uuid, pcmk__str_casei) && pcmk__same_node(on_node, action->node)) { - crm_trace("Action %s on %s matches", key, pcmk__node_name(on_node)); + pcmk__trace("Action %s on %s matches", key, + pcmk__node_name(on_node)); result = g_list_prepend(result, action); } } @@ -1529,10 +1532,10 @@ pe__action2reason(const pcmk_action_t *action, enum pcmk__action_flags flag) CRM_CHECK(change != NULL, change = ""); break; } - return crm_strdup_printf("%s%s%s %s", change, - (action->rsc == NULL)? "" : " ", - (action->rsc == NULL)? "" : action->rsc->id, - action->task); + return pcmk__assert_asprintf("%s%s%s %s", change, + (action->rsc == NULL)? "" : " ", + (action->rsc == NULL)? "" : action->rsc->id, + action->task); } void pe_action_set_reason(pcmk_action_t *action, const char *reason, @@ -1569,13 +1572,14 @@ pe__clear_resource_history(pcmk_resource_t *rsc, const pcmk_node_t *node) PCMK_ACTION_LRM_DELETE, node, FALSE, rsc->priv->scheduler); } -#define sort_return(an_int, why) do { \ - free(a_uuid); \ - free(b_uuid); \ - crm_trace("%s (%d) %c %s (%d) : %s", \ - a_xml_id, a_call_id, an_int>0?'>':an_int<0?'<':'=', \ - b_xml_id, b_call_id, why); \ - return an_int; \ +#define sort_return(an_int, why) do { \ + free(a_uuid); \ + free(b_uuid); \ + pcmk__trace("%s (%d) %c %s (%d) : %s", \ + a_xml_id, a_call_id, \ + (((an_int) > 0)? '>' : (((an_int) < 0)? '<' : '=')), \ + b_xml_id, b_call_id, why); \ + return an_int; \ } while(0) int @@ -1587,11 +1591,11 @@ pe__is_newer_op(const xmlNode *xml_a, const xmlNode *xml_b) char *a_uuid = NULL; char *b_uuid = NULL; - const char *a_xml_id = crm_element_value(xml_a, PCMK_XA_ID); - const char *b_xml_id = crm_element_value(xml_b, PCMK_XA_ID); + const char *a_xml_id = pcmk__xe_get(xml_a, PCMK_XA_ID); + const char *b_xml_id = pcmk__xe_get(xml_b, PCMK_XA_ID); - const char *a_node = crm_element_value(xml_a, PCMK__META_ON_NODE); - const char *b_node = crm_element_value(xml_b, PCMK__META_ON_NODE); + const char *a_node = pcmk__xe_get(xml_a, PCMK__META_ON_NODE); + const char *b_node = pcmk__xe_get(xml_b, PCMK__META_ON_NODE); bool same_node = pcmk__str_eq(a_node, b_node, pcmk__str_casei); if (same_node && pcmk__str_eq(a_xml_id, b_xml_id, pcmk__str_none)) { @@ -1605,8 +1609,8 @@ pe__is_newer_op(const xmlNode *xml_a, const xmlNode *xml_b) sort_return(0, "duplicate"); } - crm_element_value_int(xml_a, PCMK__XA_CALL_ID, &a_call_id); - crm_element_value_int(xml_b, PCMK__XA_CALL_ID, &b_call_id); + pcmk__xe_get_int(xml_a, PCMK__XA_CALL_ID, &a_call_id); + pcmk__xe_get_int(xml_b, PCMK__XA_CALL_ID, &b_call_id); if (a_call_id == -1 && b_call_id == -1) { /* both are pending ops so it doesn't matter since @@ -1628,11 +1632,11 @@ pe__is_newer_op(const xmlNode *xml_a, const xmlNode *xml_b) time_t last_a = -1; time_t last_b = -1; - crm_element_value_epoch(xml_a, PCMK_XA_LAST_RC_CHANGE, &last_a); - crm_element_value_epoch(xml_b, PCMK_XA_LAST_RC_CHANGE, &last_b); + pcmk__xe_get_time(xml_a, PCMK_XA_LAST_RC_CHANGE, &last_a); + pcmk__xe_get_time(xml_b, PCMK_XA_LAST_RC_CHANGE, &last_b); - crm_trace("rc-change: %lld vs %lld", - (long long) last_a, (long long) last_b); + pcmk__trace("rc-change: %lld vs %lld", + (long long) last_a, (long long) last_b); if (last_a >= 0 && last_a < last_b) { sort_return(-1, "rc-change"); @@ -1650,10 +1654,8 @@ pe__is_newer_op(const xmlNode *xml_a, const xmlNode *xml_b) int a_id = -1; int b_id = -1; - const char *a_magic = crm_element_value(xml_a, - PCMK__XA_TRANSITION_MAGIC); - const char *b_magic = crm_element_value(xml_b, - PCMK__XA_TRANSITION_MAGIC); + const char *a_magic = pcmk__xe_get(xml_a, PCMK__XA_TRANSITION_MAGIC); + const char *b_magic = pcmk__xe_get(xml_b, PCMK__XA_TRANSITION_MAGIC); CRM_CHECK(a_magic != NULL && b_magic != NULL, sort_return(0, "No magic")); if (!decode_transition_magic(a_magic, &a_uuid, &a_id, NULL, NULL, NULL, diff --git a/lib/pengine/pe_digest.c b/lib/pengine/pe_digest.c index ff59a5aa74e..3ee18a0f01c 100644 --- a/lib/pengine/pe_digest.c +++ b/lib/pengine/pe_digest.c @@ -13,6 +13,7 @@ #include #include +#include // hash2field(), hash2metafield() #include #include #include @@ -52,11 +53,11 @@ static bool attr_not_in_string(xmlAttrPtr a, void *user_data) { bool filter = false; - char *name = crm_strdup_printf(" %s ", (const char *) a->name); + char *name = pcmk__assert_asprintf(" %s ", (const char *) a->name); if (strstr((const char *) user_data, name) == NULL) { - crm_trace("Filtering %s (not found in '%s')", - (const char *) a->name, (const char *) user_data); + pcmk__trace("Filtering %s (not found in '%s')", + (const char *) a->name, (const char *) user_data); filter = true; } free(name); @@ -68,11 +69,11 @@ static bool attr_in_string(xmlAttrPtr a, void *user_data) { bool filter = false; - char *name = crm_strdup_printf(" %s ", (const char *) a->name); + char *name = pcmk__assert_asprintf(" %s ", (const char *) a->name); if (strstr((const char *) user_data, name) != NULL) { - crm_trace("Filtering %s (found in '%s')", - (const char *) a->name, (const char *) user_data); + pcmk__trace("Filtering %s (found in '%s')", + (const char *) a->name, (const char *) user_data); filter = true; } free(name); @@ -187,14 +188,14 @@ calculate_secure_digest(pcmk__op_digest_t *data, const pcmk_resource_t *rsc, GHashTable *params, const xmlNode *xml_op, const char *op_version, GHashTable *overrides) { - const char *class = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); + const char *class = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); const char *secure_list = NULL; - bool old_version = (compare_version(op_version, "3.16.0") < 0); + bool old_version = (pcmk__compare_versions(op_version, "3.16.0") < 0); if (xml_op == NULL) { secure_list = " passwd password user "; } else { - secure_list = crm_element_value(xml_op, PCMK__XA_OP_SECURE_PARAMS); + secure_list = pcmk__xe_get(xml_op, PCMK__XA_OP_SECURE_PARAMS); } if (old_version) { @@ -215,8 +216,8 @@ calculate_secure_digest(pcmk__op_digest_t *data, const pcmk_resource_t *rsc, attr_in_string, (void *) secure_list); } if (old_version - && pcmk_is_set(pcmk_get_ra_caps(class), - pcmk_ra_cap_fence_params)) { + && pcmk__is_set(pcmk_get_ra_caps(class), + pcmk_ra_cap_fence_params)) { /* For stonith resources, Pacemaker adds special parameters, * but these are not listed in fence agent meta-data, so with older * versions of DC, the controller will not hash them. That means we have @@ -264,7 +265,7 @@ calculate_restart_digest(pcmk__op_digest_t *data, const xmlNode *xml_op, } // And the history must have a restart digest to compare against - if (crm_element_value(xml_op, PCMK__XA_OP_RESTART_DIGEST) == NULL) { + if (pcmk__xe_get(xml_op, PCMK__XA_OP_RESTART_DIGEST) == NULL) { return; } @@ -272,13 +273,13 @@ calculate_restart_digest(pcmk__op_digest_t *data, const xmlNode *xml_op, data->params_restart = pcmk__xml_copy(NULL, data->params_all); // Then filter out reloadable parameters, if any - value = crm_element_value(xml_op, PCMK__XA_OP_FORCE_RESTART); + value = pcmk__xe_get(xml_op, PCMK__XA_OP_FORCE_RESTART); if (value != NULL) { pcmk__xe_remove_matching_attrs(data->params_restart, false, attr_not_in_string, (void *) value); } - value = crm_element_value(xml_op, PCMK_XA_CRM_FEATURE_SET); + value = pcmk__xe_get(xml_op, PCMK_XA_CRM_FEATURE_SET); data->digest_restart_calc = pcmk__digest_operation(data->params_restart); } @@ -321,12 +322,11 @@ pe__calculate_digests(pcmk_resource_t *rsc, const char *task, data->rc = pcmk__digest_match; if (xml_op != NULL) { - op_version = crm_element_value(xml_op, PCMK_XA_CRM_FEATURE_SET); + op_version = pcmk__xe_get(xml_op, PCMK_XA_CRM_FEATURE_SET); } if ((op_version == NULL) && (scheduler->input != NULL)) { - op_version = crm_element_value(scheduler->input, - PCMK_XA_CRM_FEATURE_SET); + op_version = pcmk__xe_get(scheduler->input, PCMK_XA_CRM_FEATURE_SET); } if (op_version == NULL) { @@ -396,20 +396,20 @@ rsc_action_digest_cmp(pcmk_resource_t *rsc, const xmlNode *xml_op, guint interval_ms = 0; const char *op_version; - const char *task = crm_element_value(xml_op, PCMK_XA_OPERATION); + const char *task = pcmk__xe_get(xml_op, PCMK_XA_OPERATION); const char *digest_all; const char *digest_restart; pcmk__assert(node != NULL); - op_version = crm_element_value(xml_op, PCMK_XA_CRM_FEATURE_SET); - digest_all = crm_element_value(xml_op, PCMK__XA_OP_DIGEST); - digest_restart = crm_element_value(xml_op, PCMK__XA_OP_RESTART_DIGEST); + op_version = pcmk__xe_get(xml_op, PCMK_XA_CRM_FEATURE_SET); + digest_all = pcmk__xe_get(xml_op, PCMK__XA_OP_DIGEST); + digest_restart = pcmk__xe_get(xml_op, PCMK__XA_OP_RESTART_DIGEST); - crm_element_value_ms(xml_op, PCMK_META_INTERVAL, &interval_ms); + pcmk__xe_get_guint(xml_op, PCMK_META_INTERVAL, &interval_ms); data = rsc_action_digest(rsc, task, interval_ms, node, xml_op, - pcmk_is_set(scheduler->flags, - pcmk__sched_sanitized), + pcmk__is_set(scheduler->flags, + pcmk__sched_sanitized), scheduler); if (!pcmk__str_eq(data->digest_restart_calc, digest_restart, @@ -421,7 +421,7 @@ rsc_action_digest_cmp(pcmk_resource_t *rsc, const xmlNode *xml_op, pcmk__readable_interval(interval_ms), task, rsc->id, pcmk__node_name(node), data->digest_restart_calc, pcmk__s(digest_restart, "missing"), op_version, - crm_element_value(xml_op, PCMK__XA_TRANSITION_MAGIC)); + pcmk__xe_get(xml_op, PCMK__XA_TRANSITION_MAGIC)); data->rc = pcmk__digest_restart; } else if (digest_all == NULL) { @@ -446,8 +446,7 @@ rsc_action_digest_cmp(pcmk_resource_t *rsc, const xmlNode *xml_op, interval_ms, task, rsc->id, pcmk__node_name(node), pcmk__s(digest_all, "missing"), data->digest_all_calc, op_version, - crm_element_value(xml_op, - PCMK__XA_TRANSITION_MAGIC)); + pcmk__xe_get(xml_op, PCMK__XA_TRANSITION_MAGIC)); } else { pcmk__rsc_info(rsc, @@ -458,8 +457,7 @@ rsc_action_digest_cmp(pcmk_resource_t *rsc, const xmlNode *xml_op, data->digest_all_calc, (interval_ms > 0)? "reschedule" : "reload", op_version, - crm_element_value(xml_op, - PCMK__XA_TRANSITION_MAGIC)); + pcmk__xe_get(xml_op, PCMK__XA_TRANSITION_MAGIC)); data->rc = pcmk__digest_mismatch; } @@ -490,7 +488,7 @@ static inline char * create_unfencing_summary(const char *rsc_id, const char *agent_type, const char *param_digest) { - return crm_strdup_printf("%s:%s:%s", rsc_id, agent_type, param_digest); + return pcmk__assert_asprintf("%s:%s:%s", rsc_id, agent_type, param_digest); } /*! @@ -523,8 +521,8 @@ unfencing_digest_matches(const char *rsc_id, const char *agent, * so there is no risk of collision using strstr(). */ matches = (strstr(node_summary, search_secure) != NULL); - crm_trace("Calculated unfencing digest '%s' %sfound in '%s'", - search_secure, matches? "" : "not ", node_summary); + pcmk__trace("Calculated unfencing digest '%s' %sfound in '%s'", + search_secure, (matches? "" : "not "), node_summary); free(search_secure); } return matches; @@ -590,7 +588,7 @@ pe__compare_fencing_digest(pcmk_resource_t *rsc, const char *agent, // Parameters don't match data->rc = pcmk__digest_mismatch; - if (pcmk_is_set(scheduler->flags, pcmk__sched_sanitized) + if (pcmk__is_set(scheduler->flags, pcmk__sched_sanitized) && (data->digest_secure_calc != NULL)) { if (scheduler->priv->out != NULL) { diff --git a/lib/pengine/pe_health.c b/lib/pengine/pe_health.c index f90a21d26f9..cb4af0eebbd 100644 --- a/lib/pengine/pe_health.c +++ b/lib/pengine/pe_health.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,6 +9,7 @@ #include +#include // pcmk_parse_score(), etc. #include #include #include "pe_status_private.h" @@ -54,11 +55,11 @@ pe__unpack_node_health_scores(pcmk_scheduler_t *scheduler) if ((pcmk__score_red != 0) || (pcmk__score_yellow != 0) || (pcmk__score_green != 0)) { - crm_debug("Values of node health scores: " - PCMK_VALUE_RED "=%d " - PCMK_VALUE_YELLOW "=%d " - PCMK_VALUE_GREEN "=%d", - pcmk__score_red, pcmk__score_yellow, pcmk__score_green); + pcmk__debug("Values of node health scores: " + PCMK_VALUE_RED "=%d " + PCMK_VALUE_YELLOW "=%d " + PCMK_VALUE_GREEN "=%d", + pcmk__score_red, pcmk__score_yellow, pcmk__score_green); } } @@ -85,15 +86,16 @@ add_node_health_value(gpointer key, gpointer value, gpointer user_data) int rc = pcmk_parse_score((const char *) value, &score, 0); if (rc != pcmk_rc_ok) { - crm_warn("Ignoring %s for %s because '%s' is not a valid value: %s", - (const char *) key, pcmk__node_name(health_sum->node), - (const char *) value, pcmk_rc_str(rc)); + pcmk__warn("Ignoring %s for %s because '%s' is not a valid value: " + "%s", + (const char *) key, pcmk__node_name(health_sum->node), + (const char *) value, pcmk_rc_str(rc)); return; } health_sum->sum = pcmk__add_scores(score, health_sum->sum); - crm_trace("Combined '%s' into node health score (now %s)", - (const char *) value, pcmk_readable_score(health_sum->sum)); + pcmk__trace("Combined '%s' into node health score (now %s)", + (const char *) value, pcmk_readable_score(health_sum->sum)); } } @@ -163,10 +165,10 @@ pe__node_health(pcmk_node_t *node) parse_rc = pcmk_parse_score(value, &score, 0); if (parse_rc != pcmk_rc_ok) { - crm_warn("Ignoring %s for %s " - "because '%s' is not a valid value: %s", - name, pcmk__node_name(node), value, - pcmk_rc_str(parse_rc)); + pcmk__warn("Ignoring %s for %s because '%s' is not a valid " + "value: %s", + name, pcmk__node_name(node), value, + pcmk_rc_str(parse_rc)); continue; } diff --git a/lib/pengine/pe_notif.c b/lib/pengine/pe_notif.c index 89d678a7128..464bf0e8fc7 100644 --- a/lib/pengine/pe_notif.c +++ b/lib/pengine/pe_notif.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -8,6 +8,8 @@ */ #include +#include // pcmk_free_nvpairs(), etc. +#include // PCMK_SCORE_INFINITY #include #include @@ -294,7 +296,7 @@ new_notify_pseudo_action(pcmk_resource_t *rsc, const pcmk_action_t *action, notify = custom_action(rsc, pcmk__notify_key(rsc->id, notif_type, action->task), notif_action, NULL, - pcmk_is_set(action->flags, pcmk__action_optional), + pcmk__is_set(action->flags, pcmk__action_optional), rsc->priv->scheduler); pcmk__set_action_flags(notify, pcmk__action_pseudo); pcmk__insert_meta(notify, "notify_key_type", notif_type); @@ -334,7 +336,7 @@ new_notify_action(pcmk_resource_t *rsc, const pcmk_node_t *node, skip_reason = "no parent notification"; } else if (!node->details->online) { skip_reason = "node offline"; - } else if (!pcmk_is_set(op->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(op->flags, pcmk__action_runnable)) { skip_reason = "original action not runnable"; } if (skip_reason != NULL) { @@ -352,7 +354,8 @@ new_notify_action(pcmk_resource_t *rsc, const pcmk_node_t *node, // Create the notify action key = pcmk__notify_key(rsc->id, value, task); notify_action = custom_action(rsc, key, op->task, node, - pcmk_is_set(op->flags, pcmk__action_optional), + pcmk__is_set(op->flags, + pcmk__action_optional), rsc->priv->scheduler); // Add meta-data to notify action @@ -442,7 +445,7 @@ pe__action_notif_pseudo_ops(pcmk_resource_t *rsc, const char *task, { notify_data_t *n_data = NULL; - if (!pcmk_is_set(rsc->flags, pcmk__rsc_notify)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_notify)) { return NULL; } @@ -478,7 +481,7 @@ pe__action_notif_pseudo_ops(pcmk_resource_t *rsc, const char *task, n_data->post = new_notify_pseudo_action(rsc, complete, PCMK_ACTION_NOTIFY, "post"); n_data->post->priority = PCMK_SCORE_INFINITY; - if (pcmk_is_set(complete->flags, pcmk__action_runnable)) { + if (pcmk__is_set(complete->flags, pcmk__action_runnable)) { pcmk__set_action_flags(n_data->post, pcmk__action_runnable); } else { pcmk__clear_action_flags(n_data->post, pcmk__action_runnable); @@ -491,7 +494,7 @@ pe__action_notif_pseudo_ops(pcmk_resource_t *rsc, const char *task, PCMK_ACTION_NOTIFIED, "confirmed-post"); n_data->post_done->priority = PCMK_SCORE_INFINITY; - if (pcmk_is_set(complete->flags, pcmk__action_runnable)) { + if (pcmk__is_set(complete->flags, pcmk__action_runnable)) { pcmk__set_action_flags(n_data->post_done, pcmk__action_runnable); } else { pcmk__clear_action_flags(n_data->post_done, pcmk__action_runnable); @@ -621,13 +624,13 @@ collect_resource_data(pcmk_resource_t *rsc, bool activity, for (iter = rsc->priv->actions; iter != NULL; iter = iter->next) { const pcmk_action_t *op = (const pcmk_action_t *) iter->data; - if (!pcmk_is_set(op->flags, pcmk__action_optional) + if (!pcmk__is_set(op->flags, pcmk__action_optional) && (op->node != NULL)) { enum pcmk__action_type task = pcmk__parse_action(op->task); if ((task == pcmk__action_stop) && op->node->details->unclean) { // Create anyway (additional noise if node can't be fenced) - } else if (!pcmk_is_set(op->flags, pcmk__action_runnable)) { + } else if (!pcmk__is_set(op->flags, pcmk__action_runnable)) { continue; } @@ -834,7 +837,7 @@ create_notify_actions(pcmk_resource_t *rsc, notify_data_t *n_data) for (iter = rsc->priv->actions; iter != NULL; iter = iter->next) { pcmk_action_t *op = (pcmk_action_t *) iter->data; - if (!pcmk_is_set(op->flags, pcmk__action_optional) + if (!pcmk__is_set(op->flags, pcmk__action_optional) && (op->node != NULL)) { switch (pcmk__parse_action(op->task)) { case pcmk__action_start: @@ -899,10 +902,10 @@ create_notify_actions(pcmk_resource_t *rsc, notify_data_t *n_data) * notify the node getting fenced. */ if ((stop != NULL) - && pcmk_is_set(stop->flags, pcmk__action_pseudo) + && pcmk__is_set(stop->flags, pcmk__action_pseudo) && (current_node->details->unclean - || pcmk_is_set(current_node->priv->flags, - pcmk__node_remote_reset))) { + || pcmk__is_set(current_node->priv->flags, + pcmk__node_remote_reset))) { continue; } @@ -910,7 +913,7 @@ create_notify_actions(pcmk_resource_t *rsc, notify_data_t *n_data) n_data->pre_done, n_data); if ((task == pcmk__action_demote) || (stop == NULL) - || pcmk_is_set(stop->flags, pcmk__action_optional)) { + || pcmk__is_set(stop->flags, pcmk__action_optional)) { new_post_notify_action(rsc, current_node, n_data); } } @@ -926,7 +929,7 @@ create_notify_actions(pcmk_resource_t *rsc, notify_data_t *n_data) pcmk_action_t *remote_start = find_remote_start(start); if ((remote_start != NULL) - && !pcmk_is_set(remote_start->flags, pcmk__action_runnable)) { + && !pcmk__is_set(remote_start->flags, pcmk__action_runnable)) { /* Start and promote actions for a clone instance behind * a Pacemaker Remote connection happen after the * connection starts. If the connection start is blocked, do @@ -942,7 +945,7 @@ create_notify_actions(pcmk_resource_t *rsc, notify_data_t *n_data) return; } if ((task != pcmk__action_start) || (start == NULL) - || pcmk_is_set(start->flags, pcmk__action_optional)) { + || pcmk__is_set(start->flags, pcmk__action_optional)) { new_notify_action(rsc, rsc->priv->assigned_node, n_data->pre, n_data->pre_done, n_data); @@ -1013,7 +1016,8 @@ pe__order_notifs_after_fencing(const pcmk_action_t *stop, pcmk_resource_t *rsc, { notify_data_t *n_data; - crm_info("Ordering notifications for implied %s after fencing", stop->uuid); + pcmk__info("Ordering notifications for implied %s after fencing", + stop->uuid); n_data = pe__action_notif_pseudo_ops(rsc, PCMK_ACTION_STOP, NULL, stonith_op); diff --git a/lib/pengine/pe_output.c b/lib/pengine/pe_output.c index a8902f099c1..2ba4e7e6b06 100644 --- a/lib/pengine/pe_output.c +++ b/lib/pengine/pe_output.c @@ -26,8 +26,9 @@ pe__resource_description(const pcmk_resource_t *rsc, uint32_t show_opts) const char * desc = NULL; // User-supplied description - if (pcmk_any_flags_set(show_opts, pcmk_show_rsc_only|pcmk_show_description)) { - desc = crm_element_value(rsc->priv->xml, PCMK_XA_DESCRIPTION); + if (pcmk__any_flags_set(show_opts, + pcmk_show_rsc_only|pcmk_show_description)) { + desc = pcmk__xe_get(rsc->priv->xml, PCMK_XA_DESCRIPTION); } return desc; } @@ -151,19 +152,19 @@ get_operation_list(xmlNode *rsc_entry) { NULL); rsc_op != NULL; rsc_op = pcmk__xe_next(rsc_op, PCMK__XE_LRM_RSC_OP)) { - const char *task = crm_element_value(rsc_op, PCMK_XA_OPERATION); + const char *task = pcmk__xe_get(rsc_op, PCMK_XA_OPERATION); if (pcmk__str_eq(task, PCMK_ACTION_NOTIFY, pcmk__str_none)) { continue; // Ignore notify actions } else { int exit_status; - pcmk__scan_min_int(crm_element_value(rsc_op, PCMK__XA_RC_CODE), + pcmk__scan_min_int(pcmk__xe_get(rsc_op, PCMK__XA_RC_CODE), &exit_status, 0); if ((exit_status == CRM_EX_NOT_RUNNING) && pcmk__str_eq(task, PCMK_ACTION_MONITOR, pcmk__str_none) - && pcmk__str_eq(crm_element_value(rsc_op, PCMK_META_INTERVAL), - "0", pcmk__str_null_matches)) { + && pcmk__str_eq(pcmk__xe_get(rsc_op, PCMK_META_INTERVAL), "0", + pcmk__str_null_matches)) { continue; // Ignore probes that found the resource not running } } @@ -188,8 +189,9 @@ static void append_dump_text(gpointer key, gpointer value, gpointer user_data) { char **dump_text = user_data; - char *new_text = crm_strdup_printf("%s %s=%s", - *dump_text, (char *)key, (char *)value); + char *new_text = pcmk__assert_asprintf("%s %s=%s", + *dump_text, (const char *) key, + (const char *)value); free(*dump_text); *dump_text = new_text; @@ -206,7 +208,7 @@ get_cluster_stack(pcmk_scheduler_t *scheduler) LOG_DEBUG); if (stack != NULL) { - return crm_element_value(stack, PCMK_XA_VALUE); + return pcmk__xe_get(stack, PCMK_XA_VALUE); } return PCMK_VALUE_UNKNOWN; } @@ -215,14 +217,14 @@ static char * last_changed_string(const char *last_written, const char *user, const char *client, const char *origin) { if (last_written != NULL || user != NULL || client != NULL || origin != NULL) { - return crm_strdup_printf("%s%s%s%s%s%s%s", - last_written ? last_written : "", - user ? " by " : "", - user ? user : "", - client ? " via " : "", - client ? client : "", - origin ? " on " : "", - origin ? origin : ""); + return pcmk__assert_asprintf("%s%s%s%s%s%s%s", + pcmk__s(last_written, ""), + ((user != NULL)? " by " : ""), + pcmk__s(user, ""), + ((client != NULL) ? " via " : ""), + pcmk__s(client, ""), + ((origin != NULL)? " on " : ""), + pcmk__s(origin, "")); } else { return strdup(""); } @@ -231,13 +233,13 @@ last_changed_string(const char *last_written, const char *user, static char * op_history_string(xmlNode *xml_op, const char *task, const char *interval_ms_s, int rc, bool print_timing) { - const char *call = crm_element_value(xml_op, PCMK__XA_CALL_ID); + const char *call = pcmk__xe_get(xml_op, PCMK__XA_CALL_ID); char *interval_str = NULL; char *buf = NULL; if (interval_ms_s && !pcmk__str_eq(interval_ms_s, "0", pcmk__str_casei)) { char *pair = pcmk__format_nvpair(PCMK_XA_INTERVAL, interval_ms_s, "ms"); - interval_str = crm_strdup_printf(" %s", pair); + interval_str = pcmk__assert_asprintf(" %s", pair); free(pair); } @@ -250,37 +252,36 @@ op_history_string(xmlNode *xml_op, const char *task, const char *interval_ms_s, time_t epoch = 0; - if ((crm_element_value_epoch(xml_op, PCMK_XA_LAST_RC_CHANGE, - &epoch) == pcmk_ok) - && (epoch > 0)) { + pcmk__xe_get_time(xml_op, PCMK_XA_LAST_RC_CHANGE, &epoch); + if (epoch > 0) { char *epoch_str = pcmk__epoch2str(&epoch, 0); - last_change_str = crm_strdup_printf(" %s=\"%s\"", - PCMK_XA_LAST_RC_CHANGE, - pcmk__s(epoch_str, "")); + last_change_str = pcmk__assert_asprintf(" %s=\"%s\"", + PCMK_XA_LAST_RC_CHANGE, + pcmk__s(epoch_str, "")); free(epoch_str); } - value = crm_element_value(xml_op, PCMK_XA_EXEC_TIME); + value = pcmk__xe_get(xml_op, PCMK_XA_EXEC_TIME); if (value) { char *pair = pcmk__format_nvpair(PCMK_XA_EXEC_TIME, value, "ms"); - exec_str = crm_strdup_printf(" %s", pair); + exec_str = pcmk__assert_asprintf(" %s", pair); free(pair); } - value = crm_element_value(xml_op, PCMK_XA_QUEUE_TIME); + value = pcmk__xe_get(xml_op, PCMK_XA_QUEUE_TIME); if (value) { char *pair = pcmk__format_nvpair(PCMK_XA_QUEUE_TIME, value, "ms"); - queue_str = crm_strdup_printf(" %s", pair); + queue_str = pcmk__assert_asprintf(" %s", pair); free(pair); } - buf = crm_strdup_printf("(%s) %s:%s%s%s%s rc=%d (%s)", call, task, - interval_str ? interval_str : "", - last_change_str ? last_change_str : "", - exec_str ? exec_str : "", - queue_str ? queue_str : "", - rc, crm_exit_str(rc)); + buf = pcmk__assert_asprintf("(%s) %s:%s%s%s%s rc=%d (%s)", call, task, + pcmk__s(interval_str, ""), + pcmk__s(last_change_str, ""), + pcmk__s(exec_str, ""), + pcmk__s(queue_str, ""), + rc, crm_exit_str(rc)); if (last_change_str) { free(last_change_str); @@ -294,9 +295,9 @@ op_history_string(xmlNode *xml_op, const char *task, const char *interval_ms_s, free(queue_str); } } else { - buf = crm_strdup_printf("(%s) %s%s%s", call, task, - interval_str ? ":" : "", - interval_str ? interval_str : ""); + buf = pcmk__assert_asprintf("(%s) %s%s%s", call, task, + ((interval_str != NULL)? ":" : ""), + pcmk__s(interval_str, "")); } if (interval_str) { @@ -312,31 +313,32 @@ resource_history_string(pcmk_resource_t *rsc, const char *rsc_id, bool all, char *buf = NULL; if (rsc == NULL) { - buf = crm_strdup_printf("%s: orphan", rsc_id); + buf = pcmk__assert_asprintf("%s: orphan", rsc_id); } else if (all || failcount || last_failure > 0) { char *failcount_s = NULL; char *lastfail_s = NULL; if (failcount > 0) { - failcount_s = crm_strdup_printf(" %s=%d", - PCMK_XA_FAIL_COUNT, failcount); + failcount_s = pcmk__assert_asprintf(" " PCMK_XA_FAIL_COUNT "=%d", + failcount); } else { failcount_s = strdup(""); } if (last_failure > 0) { buf = pcmk__epoch2str(&last_failure, 0); - lastfail_s = crm_strdup_printf(" %s='%s'", - PCMK_XA_LAST_FAILURE, buf); + lastfail_s = pcmk__assert_asprintf(" " PCMK_XA_LAST_FAILURE "='%s'", + buf); free(buf); } - buf = crm_strdup_printf("%s: " PCMK_META_MIGRATION_THRESHOLD "=%d%s%s", - rsc_id, rsc->priv->ban_after_failures, - failcount_s, pcmk__s(lastfail_s, "")); + buf = pcmk__assert_asprintf("%s: " PCMK_META_MIGRATION_THRESHOLD + "=%d%s%s", + rsc_id, rsc->priv->ban_after_failures, + failcount_s, pcmk__s(lastfail_s, "")); free(failcount_s); free(lastfail_s); } else { - buf = crm_strdup_printf("%s:", rsc_id); + buf = pcmk__assert_asprintf("%s:", rsc_id); } return buf; @@ -356,7 +358,7 @@ static const char * get_node_feature_set(const pcmk_node_t *node) { if (node->details->online - && pcmk_is_set(node->priv->flags, pcmk__node_expected_up) + && pcmk__is_set(node->priv->flags, pcmk__node_expected_up) && !pcmk__is_pacemaker_remote_node(node)) { const char *feature_set = g_hash_table_lookup(node->priv->attrs, @@ -415,21 +417,27 @@ cluster_summary(pcmk__output_t *out, va_list args) { int rc = pcmk_rc_no_output; const char *stack_s = get_cluster_stack(scheduler); - if (pcmk_is_set(section_opts, pcmk_section_stack)) { + if (pcmk__is_set(section_opts, pcmk_section_stack)) { PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); out->message(out, "cluster-stack", stack_s, pcmkd_state); } - if (pcmk_is_set(section_opts, pcmk_section_dc)) { + if (pcmk__is_set(section_opts, pcmk_section_dc)) { xmlNode *dc_version = pcmk__xpath_find_one(scheduler->input->doc, XPATH_DC_VERSION, LOG_DEBUG); const char *dc_version_s = dc_version? - crm_element_value(dc_version, PCMK_XA_VALUE) + pcmk__xe_get(dc_version, PCMK_XA_VALUE) : NULL; - const char *quorum = crm_element_value(scheduler->input, - PCMK_XA_HAVE_QUORUM); - char *dc_name = scheduler->dc_node? pe__node_display_name(scheduler->dc_node, pcmk_is_set(show_opts, pcmk_show_node_id)) : NULL; - bool mixed_version = is_mixed_version(scheduler); + const char *quorum = pcmk__xe_get(scheduler->input, + PCMK_XA_HAVE_QUORUM); + char *dc_name = NULL; + const bool mixed_version = is_mixed_version(scheduler); + + if (scheduler->dc_node != NULL) { + dc_name = pe__node_display_name(scheduler->dc_node, + pcmk__is_set(show_opts, + pcmk_show_node_id)); + } PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); out->message(out, "cluster-dc", scheduler->dc_node, quorum, @@ -437,14 +445,13 @@ cluster_summary(pcmk__output_t *out, va_list args) { free(dc_name); } - if (pcmk_is_set(section_opts, pcmk_section_times)) { - const char *last_written = crm_element_value(scheduler->input, - PCMK_XA_CIB_LAST_WRITTEN); - const char *user = crm_element_value(scheduler->input, - PCMK_XA_UPDATE_USER); - const char *client = crm_element_value(scheduler->input, - PCMK_XA_UPDATE_CLIENT); - const char *origin = crm_element_value(scheduler->input, + if (pcmk__is_set(section_opts, pcmk_section_times)) { + const char *last_written = pcmk__xe_get(scheduler->input, + PCMK_XA_CIB_LAST_WRITTEN); + const char *user = pcmk__xe_get(scheduler->input, PCMK_XA_UPDATE_USER); + const char *client = pcmk__xe_get(scheduler->input, + PCMK_XA_UPDATE_CLIENT); + const char *origin = pcmk__xe_get(scheduler->input, PCMK_XA_UPDATE_ORIGIN); PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); @@ -452,7 +459,7 @@ cluster_summary(pcmk__output_t *out, va_list args) { last_written, user, client, origin); } - if (pcmk_is_set(section_opts, pcmk_section_counts)) { + if (pcmk__is_set(section_opts, pcmk_section_counts)) { PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); out->message(out, "cluster-counts", g_list_length(scheduler->nodes), scheduler->priv->ninstances, @@ -460,14 +467,14 @@ cluster_summary(pcmk__output_t *out, va_list args) { scheduler->priv->blocked_resources); } - if (pcmk_is_set(section_opts, pcmk_section_options)) { + if (pcmk__is_set(section_opts, pcmk_section_options)) { PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); out->message(out, "cluster-options", scheduler); } PCMK__OUTPUT_LIST_FOOTER(out, rc); - if (pcmk_is_set(section_opts, pcmk_section_maint_mode)) { + if (pcmk__is_set(section_opts, pcmk_section_maint_mode)) { if (out->message(out, "maint-mode", scheduler->flags) == pcmk_rc_ok) { rc = pcmk_rc_ok; } @@ -489,23 +496,29 @@ cluster_summary_html(pcmk__output_t *out, va_list args) { int rc = pcmk_rc_no_output; const char *stack_s = get_cluster_stack(scheduler); - if (pcmk_is_set(section_opts, pcmk_section_stack)) { + if (pcmk__is_set(section_opts, pcmk_section_stack)) { PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); out->message(out, "cluster-stack", stack_s, pcmkd_state); } /* Always print DC if none, even if not requested */ if ((scheduler->dc_node == NULL) - || pcmk_is_set(section_opts, pcmk_section_dc)) { + || pcmk__is_set(section_opts, pcmk_section_dc)) { xmlNode *dc_version = pcmk__xpath_find_one(scheduler->input->doc, XPATH_DC_VERSION, LOG_DEBUG); const char *dc_version_s = dc_version? - crm_element_value(dc_version, PCMK_XA_VALUE) + pcmk__xe_get(dc_version, PCMK_XA_VALUE) : NULL; - const char *quorum = crm_element_value(scheduler->input, - PCMK_XA_HAVE_QUORUM); - char *dc_name = scheduler->dc_node? pe__node_display_name(scheduler->dc_node, pcmk_is_set(show_opts, pcmk_show_node_id)) : NULL; - bool mixed_version = is_mixed_version(scheduler); + const char *quorum = pcmk__xe_get(scheduler->input, + PCMK_XA_HAVE_QUORUM); + char *dc_name = NULL; + const bool mixed_version = is_mixed_version(scheduler); + + if (scheduler->dc_node != NULL) { + dc_name = pe__node_display_name(scheduler->dc_node, + pcmk__is_set(show_opts, + pcmk_show_node_id)); + } PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); out->message(out, "cluster-dc", scheduler->dc_node, quorum, @@ -513,22 +526,21 @@ cluster_summary_html(pcmk__output_t *out, va_list args) { free(dc_name); } - if (pcmk_is_set(section_opts, pcmk_section_times)) { - const char *last_written = crm_element_value(scheduler->input, - PCMK_XA_CIB_LAST_WRITTEN); - const char *user = crm_element_value(scheduler->input, - PCMK_XA_UPDATE_USER); - const char *client = crm_element_value(scheduler->input, - PCMK_XA_UPDATE_CLIENT); - const char *origin = crm_element_value(scheduler->input, - PCMK_XA_UPDATE_ORIGIN); + if (pcmk__is_set(section_opts, pcmk_section_times)) { + const char *last_written = pcmk__xe_get(scheduler->input, + PCMK_XA_CIB_LAST_WRITTEN); + const char *user = pcmk__xe_get(scheduler->input, PCMK_XA_UPDATE_USER); + const char *client = pcmk__xe_get(scheduler->input, + PCMK_XA_UPDATE_CLIENT); + const char *origin = pcmk__xe_get(scheduler->input, + PCMK_XA_UPDATE_ORIGIN); PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); out->message(out, "cluster-times", scheduler->priv->local_node_name, last_written, user, client, origin); } - if (pcmk_is_set(section_opts, pcmk_section_counts)) { + if (pcmk__is_set(section_opts, pcmk_section_counts)) { PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); out->message(out, "cluster-counts", g_list_length(scheduler->nodes), scheduler->priv->ninstances, @@ -536,7 +548,7 @@ cluster_summary_html(pcmk__output_t *out, va_list args) { scheduler->priv->blocked_resources); } - if (pcmk_is_set(section_opts, pcmk_section_options)) { + if (pcmk__is_set(section_opts, pcmk_section_options)) { /* Kind of a hack - close the list we may have opened earlier in this * function so we can put all the options into their own list. We * only want to do this on HTML output, though. @@ -549,7 +561,7 @@ cluster_summary_html(pcmk__output_t *out, va_list args) { PCMK__OUTPUT_LIST_FOOTER(out, rc); - if (pcmk_is_set(section_opts, pcmk_section_maint_mode)) { + if (pcmk__is_set(section_opts, pcmk_section_maint_mode)) { if (out->message(out, "maint-mode", scheduler->flags) == pcmk_rc_ok) { rc = pcmk_rc_ok; } @@ -655,10 +667,12 @@ ban_html(pcmk__output_t *out, va_list args) { uint32_t show_opts = va_arg(args, uint32_t); char *node_name = pe__node_display_name(pe_node, - pcmk_is_set(show_opts, pcmk_show_node_id)); - char *buf = crm_strdup_printf("%s\tprevents %s from running %son %s", - location->id, location->rsc->id, - role_desc(location->role_filter), node_name); + pcmk__is_set(show_opts, + pcmk_show_node_id)); + char *buf = pcmk__assert_asprintf("%s\tprevents %s from running %son %s", + location->id, location->rsc->id, + role_desc(location->role_filter), + node_name); pcmk__output_create_html_node(out, "li", NULL, NULL, buf); @@ -675,7 +689,8 @@ ban_text(pcmk__output_t *out, va_list args) { uint32_t show_opts = va_arg(args, uint32_t); char *node_name = pe__node_display_name(pe_node, - pcmk_is_set(show_opts, pcmk_show_node_id)); + pcmk__is_set(show_opts, + pcmk_show_node_id)); out->list_item(out, NULL, "%s\tprevents %s from running %son %s", location->id, location->rsc->id, role_desc(location->role_filter), node_name); @@ -880,19 +895,19 @@ cluster_counts_xml(pcmk__output_t *out, va_list args) { NULL); s = pcmk__itoa(nnodes); - crm_xml_add(nodes_node, PCMK_XA_NUMBER, s); + pcmk__xe_set(nodes_node, PCMK_XA_NUMBER, s); free(s); s = pcmk__itoa(nresources); - crm_xml_add(resources_node, PCMK_XA_NUMBER, s); + pcmk__xe_set(resources_node, PCMK_XA_NUMBER, s); free(s); s = pcmk__itoa(ndisabled); - crm_xml_add(resources_node, PCMK_XA_DISABLED, s); + pcmk__xe_set(resources_node, PCMK_XA_DISABLED, s); free(s); s = pcmk__itoa(nblocked); - crm_xml_add(resources_node, PCMK_XA_BLOCKED, s); + pcmk__xe_set(resources_node, PCMK_XA_BLOCKED, s); free(s); return pcmk_rc_ok; @@ -928,7 +943,7 @@ cluster_dc_html(pcmk__output_t *out, va_list args) { child = pcmk__html_create(node, PCMK__XE_SPAN, NULL, NULL); pcmk__xe_set_content(child, " partition"); - if (crm_is_true(quorum)) { + if (pcmk__is_true(quorum)) { child = pcmk__html_create(node, PCMK__XE_SPAN, NULL, NULL); pcmk__xe_set_content(child, " with"); @@ -965,7 +980,7 @@ cluster_dc_text(pcmk__output_t *out, va_list args) { "%s (version %s) - %spartition %s quorum", dc_name, dc_version_s ? dc_version_s : "unknown", mixed_version ? "MIXED-VERSION " : "", - crm_is_true(quorum) ? "with" : "WITHOUT"); + pcmk__is_true(quorum) ? "with" : "WITHOUT"); } else { out->list_item(out, "Current DC", "NONE"); } @@ -984,7 +999,7 @@ cluster_dc_xml(pcmk__output_t *out, va_list args) { bool mixed_version = va_arg(args, int); if (dc) { - const char *with_quorum = pcmk__btoa(crm_is_true(quorum)); + const char *with_quorum = pcmk__btoa(pcmk__is_true(quorum)); const char *mixed_version_s = pcmk__btoa(mixed_version); pcmk__output_create_xml_node(out, PCMK_XE_CURRENT_DC, @@ -1009,11 +1024,11 @@ static int cluster_maint_mode_text(pcmk__output_t *out, va_list args) { uint64_t flags = va_arg(args, uint64_t); - if (pcmk_is_set(flags, pcmk__sched_in_maintenance)) { + if (pcmk__is_set(flags, pcmk__sched_in_maintenance)) { pcmk__formatted_printf(out, "\n *** Resource management is DISABLED ***\n"); pcmk__formatted_printf(out, " The cluster will not attempt to start, stop or recover services\n"); return pcmk_rc_ok; - } else if (pcmk_is_set(flags, pcmk__sched_stop_all)) { + } else if (pcmk__is_set(flags, pcmk__sched_stop_all)) { pcmk__formatted_printf(out, "\n *** Resource management is DISABLED ***\n"); pcmk__formatted_printf(out, " The cluster will keep all resources stopped\n"); return pcmk_rc_ok; @@ -1027,13 +1042,13 @@ static int cluster_options_html(pcmk__output_t *out, va_list args) { pcmk_scheduler_t *scheduler = va_arg(args, pcmk_scheduler_t *); - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { out->list_item(out, NULL, "STONITH of failed nodes enabled"); } else { out->list_item(out, NULL, "STONITH of failed nodes disabled"); } - if (pcmk_is_set(scheduler->flags, pcmk__sched_symmetric_cluster)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_symmetric_cluster)) { out->list_item(out, NULL, "Cluster is symmetric"); } else { out->list_item(out, NULL, "Cluster is asymmetric"); @@ -1068,7 +1083,7 @@ cluster_options_html(pcmk__output_t *out, va_list args) { break; } - if (pcmk_is_set(scheduler->flags, pcmk__sched_in_maintenance)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_in_maintenance)) { xmlNodePtr node = pcmk__output_create_xml_node(out, "li", NULL); xmlNode *child = NULL; @@ -1083,7 +1098,7 @@ cluster_options_html(pcmk__output_t *out, va_list args) { " (the cluster will not attempt to start, stop," " or recover services)"); - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_stop_all)) { + } else if (pcmk__is_set(scheduler->flags, pcmk__sched_stop_all)) { xmlNodePtr node = pcmk__output_create_xml_node(out, "li", NULL); xmlNode *child = NULL; @@ -1109,9 +1124,9 @@ static int cluster_options_log(pcmk__output_t *out, va_list args) { pcmk_scheduler_t *scheduler = va_arg(args, pcmk_scheduler_t *); - if (pcmk_is_set(scheduler->flags, pcmk__sched_in_maintenance)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_in_maintenance)) { return out->info(out, "Resource management is DISABLED. The cluster will not attempt to start, stop or recover services."); - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_stop_all)) { + } else if (pcmk__is_set(scheduler->flags, pcmk__sched_stop_all)) { return out->info(out, "Resource management is DISABLED. The cluster has stopped all resources."); } else { return pcmk_rc_no_output; @@ -1123,13 +1138,13 @@ static int cluster_options_text(pcmk__output_t *out, va_list args) { pcmk_scheduler_t *scheduler = va_arg(args, pcmk_scheduler_t *); - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { out->list_item(out, NULL, "STONITH of failed nodes enabled"); } else { out->list_item(out, NULL, "STONITH of failed nodes disabled"); } - if (pcmk_is_set(scheduler->flags, pcmk__sched_symmetric_cluster)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_symmetric_cluster)) { out->list_item(out, NULL, "Cluster is symmetric"); } else { out->list_item(out, NULL, "Cluster is asymmetric"); @@ -1210,10 +1225,10 @@ cluster_options_xml(pcmk__output_t *out, va_list args) { const char *stop_all_resources = pcmk__flag_text(scheduler->flags, pcmk__sched_stop_all); char *stonith_timeout_ms_s = - crm_strdup_printf("%u", scheduler->priv->fence_timeout_ms); + pcmk__assert_asprintf("%u", scheduler->priv->fence_timeout_ms); char *priority_fencing_delay_ms_s = - crm_strdup_printf("%u", scheduler->priv->priority_fencing_ms); + pcmk__assert_asprintf("%u", scheduler->priv->priority_fencing_ms); pcmk__output_create_xml_node(out, PCMK_XE_CLUSTER_OPTIONS, PCMK_XA_STONITH_ENABLED, stonith_enabled, @@ -1459,8 +1474,8 @@ failed_action_friendly(pcmk__output_t *out, const xmlNode *xml_op, } - if (crm_element_value_epoch(xml_op, PCMK_XA_LAST_RC_CHANGE, - &last_change_epoch) == pcmk_ok) { + if (pcmk__xe_get_time(xml_op, PCMK_XA_LAST_RC_CHANGE, + &last_change_epoch) == pcmk_rc_ok) { char *s = pcmk__epoch2str(&last_change_epoch, 0); pcmk__g_strcat(str, " at ", s, NULL); @@ -1502,8 +1517,8 @@ failed_action_technical(pcmk__output_t *out, const xmlNode *xml_op, int status, const char *exit_reason, const char *exec_time) { - const char *call_id = crm_element_value(xml_op, PCMK__XA_CALL_ID); - const char *queue_time = crm_element_value(xml_op, PCMK_XA_QUEUE_TIME); + const char *call_id = pcmk__xe_get(xml_op, PCMK__XA_CALL_ID); + const char *queue_time = pcmk__xe_get(xml_op, PCMK_XA_QUEUE_TIME); const char *exit_status = crm_exit_str(rc); const char *lrm_status = pcmk_exec_status_str(status); time_t last_change_epoch = 0; @@ -1529,8 +1544,8 @@ failed_action_technical(pcmk__output_t *out, const xmlNode *xml_op, pcmk__g_strcat(str, ", exitreason='", exit_reason, "'", NULL); } - if (crm_element_value_epoch(xml_op, PCMK_XA_LAST_RC_CHANGE, - &last_change_epoch) == pcmk_ok) { + if (pcmk__xe_get_time(xml_op, PCMK_XA_LAST_RC_CHANGE, + &last_change_epoch) == pcmk_rc_ok) { char *last_change_str = pcmk__epoch2str(&last_change_epoch, 0); pcmk__g_strcat(str, @@ -1557,23 +1572,21 @@ failed_action_default(pcmk__output_t *out, va_list args) uint32_t show_opts = va_arg(args, uint32_t); const char *op_key = pcmk__xe_history_key(xml_op); - const char *node_name = crm_element_value(xml_op, PCMK_XA_UNAME); - const char *exit_reason = crm_element_value(xml_op, PCMK_XA_EXIT_REASON); - const char *exec_time = crm_element_value(xml_op, PCMK_XA_EXEC_TIME); + const char *node_name = pcmk__xe_get(xml_op, PCMK_XA_UNAME); + const char *exit_reason = pcmk__xe_get(xml_op, PCMK_XA_EXIT_REASON); + const char *exec_time = pcmk__xe_get(xml_op, PCMK_XA_EXEC_TIME); int rc; int status; - pcmk__scan_min_int(crm_element_value(xml_op, PCMK__XA_RC_CODE), &rc, 0); - - pcmk__scan_min_int(crm_element_value(xml_op, PCMK__XA_OP_STATUS), &status, - 0); + pcmk__scan_min_int(pcmk__xe_get(xml_op, PCMK__XA_RC_CODE), &rc, 0); + pcmk__scan_min_int(pcmk__xe_get(xml_op, PCMK__XA_OP_STATUS), &status, 0); if (pcmk__str_empty(node_name)) { node_name = "unknown node"; } - if (pcmk_is_set(show_opts, pcmk_show_failed_detail)) { + if (pcmk__is_set(show_opts, pcmk_show_failed_detail)) { failed_action_technical(out, xml_op, op_key, node_name, rc, status, exit_reason, exec_time); } else { @@ -1593,11 +1606,10 @@ failed_action_xml(pcmk__output_t *out, va_list args) { const char *op_key_name = PCMK_XA_OP_KEY; int rc; int status; - const char *uname = crm_element_value(xml_op, PCMK_XA_UNAME); - const char *call_id = crm_element_value(xml_op, PCMK__XA_CALL_ID); + const char *uname = pcmk__xe_get(xml_op, PCMK_XA_UNAME); + const char *call_id = pcmk__xe_get(xml_op, PCMK__XA_CALL_ID); const char *exitstatus = NULL; - const char *exit_reason = pcmk__s(crm_element_value(xml_op, - PCMK_XA_EXIT_REASON), + const char *exit_reason = pcmk__s(pcmk__xe_get(xml_op, PCMK_XA_EXIT_REASON), "none"); const char *status_s = NULL; @@ -1610,11 +1622,10 @@ failed_action_xml(pcmk__output_t *out, va_list args) { exit_reason_esc = pcmk__xml_escape(exit_reason, pcmk__xml_escape_attr); exit_reason = exit_reason_esc; } - pcmk__scan_min_int(crm_element_value(xml_op, PCMK__XA_RC_CODE), &rc, 0); - pcmk__scan_min_int(crm_element_value(xml_op, PCMK__XA_OP_STATUS), &status, - 0); + pcmk__scan_min_int(pcmk__xe_get(xml_op, PCMK__XA_RC_CODE), &rc, 0); + pcmk__scan_min_int(pcmk__xe_get(xml_op, PCMK__XA_OP_STATUS), &status, 0); - if (crm_element_value(xml_op, PCMK__XA_OPERATION_KEY) == NULL) { + if (pcmk__xe_get(xml_op, PCMK__XA_OPERATION_KEY) == NULL) { op_key_name = PCMK_XA_ID; } exitstatus = crm_exit_str(rc); @@ -1631,12 +1642,11 @@ failed_action_xml(pcmk__output_t *out, va_list args) { NULL); free(rc_s); - if ((crm_element_value_epoch(xml_op, PCMK_XA_LAST_RC_CHANGE, - &epoch) == pcmk_ok) && (epoch > 0)) { - - const char *queue_time = crm_element_value(xml_op, PCMK_XA_QUEUE_TIME); - const char *exec = crm_element_value(xml_op, PCMK_XA_EXEC_TIME); - const char *task = crm_element_value(xml_op, PCMK_XA_OPERATION); + pcmk__xe_get_time(xml_op, PCMK_XA_LAST_RC_CHANGE, &epoch); + if (epoch > 0) { + const char *queue_time = pcmk__xe_get(xml_op, PCMK_XA_QUEUE_TIME); + const char *exec = pcmk__xe_get(xml_op, PCMK_XA_EXEC_TIME); + const char *task = pcmk__xe_get(xml_op, PCMK_XA_OPERATION); guint interval_ms = 0; char *interval_ms_s = NULL; char *rc_change = pcmk__epoch2str(&epoch, @@ -1644,8 +1654,8 @@ failed_action_xml(pcmk__output_t *out, va_list args) { |crm_time_log_timeofday |crm_time_log_with_timezone); - crm_element_value_ms(xml_op, PCMK_META_INTERVAL, &interval_ms); - interval_ms_s = crm_strdup_printf("%u", interval_ms); + pcmk__xe_get_guint(xml_op, PCMK_META_INTERVAL, &interval_ms); + interval_ms_s = pcmk__assert_asprintf("%u", interval_ms); pcmk__xe_set_props(node, PCMK_XA_LAST_RC_CHANGE, rc_change, @@ -1686,8 +1696,7 @@ failed_action_list(pcmk__output_t *out, va_list args) { char *rsc = NULL; - if (!pcmk__str_in_list(crm_element_value(xml_op, PCMK_XA_UNAME), - only_node, + if (!pcmk__str_in_list(pcmk__xe_get(xml_op, PCMK_XA_UNAME), only_node, pcmk__str_star_matches|pcmk__str_casei)) { continue; } @@ -1734,7 +1743,7 @@ status_node(pcmk_node_t *node, xmlNodePtr parent, uint32_t show_opts) } // Standby mode - if (pcmk_is_set(node->priv->flags, pcmk__node_fail_standby)) { + if (pcmk__is_set(node->priv->flags, pcmk__node_fail_standby)) { child = pcmk__html_create(parent, PCMK__XE_SPAN, NULL, PCMK_VALUE_STANDBY); if (node->details->running_rsc == NULL) { @@ -1746,7 +1755,7 @@ status_node(pcmk_node_t *node, xmlNodePtr parent, uint32_t show_opts) " with active resources)"); } - } else if (pcmk_is_set(node->priv->flags, pcmk__node_standby)) { + } else if (pcmk__is_set(node->priv->flags, pcmk__node_standby)) { child = pcmk__html_create(parent, PCMK__XE_SPAN, NULL, PCMK_VALUE_STANDBY); if (node->details->running_rsc == NULL) { @@ -1776,7 +1785,7 @@ status_node(pcmk_node_t *node, xmlNodePtr parent, uint32_t show_opts) } // Feature set - if (pcmk_is_set(show_opts, pcmk_show_feature_set)) { + if (pcmk__is_set(show_opts, pcmk_show_feature_set)) { const char *feature_set = get_node_feature_set(node); if (feature_set != NULL) { child = pcmk__html_create(parent, PCMK__XE_SPAN, NULL, NULL); @@ -1795,13 +1804,16 @@ node_html(pcmk__output_t *out, va_list args) { GList *only_node = va_arg(args, GList *); GList *only_rsc = va_arg(args, GList *); - char *node_name = pe__node_display_name(node, pcmk_is_set(show_opts, pcmk_show_node_id)); + char *node_name = pe__node_display_name(node, + pcmk__is_set(show_opts, + pcmk_show_node_id)); if (full) { xmlNode *item_node = NULL; xmlNode *child = NULL; - if (pcmk_all_flags_set(show_opts, pcmk_show_brief | pcmk_show_rscs_by_node)) { + if (pcmk__all_flags_set(show_opts, + pcmk_show_brief|pcmk_show_rscs_by_node)) { GList *rscs = pe__filter_rsc_list(node->details->running_rsc, only_rsc); out->begin_list(out, NULL, NULL, "%s:", node_name); @@ -1820,7 +1832,7 @@ node_html(pcmk__output_t *out, va_list args) { pcmk__output_xml_pop_parent(out); out->end_list(out); - } else if (pcmk_is_set(show_opts, pcmk_show_rscs_by_node)) { + } else if (pcmk__is_set(show_opts, pcmk_show_rscs_by_node)) { GList *lpc2 = NULL; int rc = pcmk_rc_no_output; @@ -1884,11 +1896,11 @@ node_text_status(const pcmk_node_t *node) } else if (node->details->pending) { return "pending"; - } else if (pcmk_is_set(node->priv->flags, pcmk__node_fail_standby) + } else if (pcmk__is_set(node->priv->flags, pcmk__node_fail_standby) && node->details->online) { return "standby (" PCMK_META_ON_FAIL ")"; - } else if (pcmk_is_set(node->priv->flags, pcmk__node_standby)) { + } else if (pcmk__is_set(node->priv->flags, pcmk__node_standby)) { if (!node->details->online) { return "OFFLINE (standby)"; } else if (node->details->running_rsc == NULL) { @@ -1922,7 +1934,9 @@ node_text(pcmk__output_t *out, va_list args) { GList *only_rsc = va_arg(args, GList *); if (full) { - char *node_name = pe__node_display_name(node, pcmk_is_set(show_opts, pcmk_show_node_id)); + char *node_name = + pe__node_display_name(node, + pcmk__is_set(show_opts, pcmk_show_node_id)); GString *str = g_string_sized_new(64); int health = pe__node_health(node); @@ -1941,7 +1955,7 @@ node_text(pcmk__output_t *out, va_list args) { } else if (health == 0) { g_string_append(str, " (health is YELLOW)"); } - if (pcmk_is_set(show_opts, pcmk_show_feature_set)) { + if (pcmk__is_set(show_opts, pcmk_show_feature_set)) { const char *feature_set = get_node_feature_set(node); if (feature_set != NULL) { pcmk__g_strcat(str, ", feature set ", feature_set, NULL); @@ -1949,8 +1963,8 @@ node_text(pcmk__output_t *out, va_list args) { } /* If we're grouping by node, print its resources */ - if (pcmk_is_set(show_opts, pcmk_show_rscs_by_node)) { - if (pcmk_is_set(show_opts, pcmk_show_brief)) { + if (pcmk__is_set(show_opts, pcmk_show_rscs_by_node)) { + if (pcmk__is_set(show_opts, pcmk_show_brief)) { GList *rscs = pe__filter_rsc_list(node->details->running_rsc, only_rsc); if (rscs != NULL) { @@ -1990,7 +2004,10 @@ node_text(pcmk__output_t *out, va_list args) { g_string_free(str, TRUE); free(node_name); } else { - char *node_name = pe__node_display_name(node, pcmk_is_set(show_opts, pcmk_show_node_id)); + char *node_name = + pe__node_display_name(node, + pcmk__is_set(show_opts, pcmk_show_node_id)); + out->begin_list(out, NULL, NULL, "Node: %s", node_name); free(node_name); } @@ -2098,11 +2115,11 @@ node_xml(pcmk__output_t *out, va_list args) { if (pcmk__is_guest_or_bundle_node(node)) { xmlNodePtr xml_node = pcmk__output_xml_peek_parent(out); - crm_xml_add(xml_node, PCMK_XA_ID_AS_RESOURCE, - node->priv->remote->priv->launcher->id); + pcmk__xe_set(xml_node, PCMK_XA_ID_AS_RESOURCE, + node->priv->remote->priv->launcher->id); } - if (pcmk_is_set(show_opts, pcmk_show_rscs_by_node)) { + if (pcmk__is_set(show_opts, pcmk_show_rscs_by_node)) { GList *lpc = NULL; for (lpc = node->details->running_rsc; lpc != NULL; lpc = lpc->next) { @@ -2203,11 +2220,11 @@ node_and_op(pcmk__output_t *out, va_list args) { gchar *node_str = NULL; char *last_change_str = NULL; - const char *op_rsc = crm_element_value(xml_op, PCMK_XA_RESOURCE); + const char *op_rsc = pcmk__xe_get(xml_op, PCMK_XA_RESOURCE); int status; time_t last_change = 0; - pcmk__scan_min_int(crm_element_value(xml_op, PCMK__XA_OP_STATUS), &status, + pcmk__scan_min_int(pcmk__xe_get(xml_op, PCMK__XA_OP_STATUS), &status, PCMK_EXEC_UNKNOWN); rsc = pe_find_resource(scheduler->priv->resources, op_rsc); @@ -2225,24 +2242,24 @@ node_and_op(pcmk__output_t *out, va_list args) { node_str = pcmk__native_output_string(rsc, rsc_printable_id(rsc), node, show_opts, target_role, false); } else { - node_str = crm_strdup_printf("Unknown resource %s", op_rsc); + node_str = pcmk__assert_asprintf("Unknown resource %s", op_rsc); } - if (crm_element_value_epoch(xml_op, PCMK_XA_LAST_RC_CHANGE, - &last_change) == pcmk_ok) { - const char *exec_time = crm_element_value(xml_op, PCMK_XA_EXEC_TIME); + if (pcmk__xe_get_time(xml_op, PCMK_XA_LAST_RC_CHANGE, + &last_change) == pcmk_rc_ok) { + const char *exec_time = pcmk__xe_get(xml_op, PCMK_XA_EXEC_TIME); - last_change_str = crm_strdup_printf(", %s='%s', exec=%sms", - PCMK_XA_LAST_RC_CHANGE, - pcmk__trim(ctime(&last_change)), - exec_time); + last_change_str = pcmk__assert_asprintf(", " PCMK_XA_LAST_RC_CHANGE + "='%s', exec=%sms", + pcmk__trim(ctime(&last_change)), + exec_time); } out->list_item(out, NULL, "%s: %s (node=%s, call=%s, rc=%s%s): %s", node_str, pcmk__xe_history_key(xml_op), - crm_element_value(xml_op, PCMK_XA_UNAME), - crm_element_value(xml_op, PCMK__XA_CALL_ID), - crm_element_value(xml_op, PCMK__XA_RC_CODE), + pcmk__xe_get(xml_op, PCMK_XA_UNAME), + pcmk__xe_get(xml_op, PCMK__XA_CALL_ID), + pcmk__xe_get(xml_op, PCMK__XA_RC_CODE), last_change_str ? last_change_str : "", pcmk_exec_status_str(status)); @@ -2258,17 +2275,17 @@ node_and_op_xml(pcmk__output_t *out, va_list args) { xmlNodePtr xml_op = va_arg(args, xmlNodePtr); pcmk_resource_t *rsc = NULL; - const char *uname = crm_element_value(xml_op, PCMK_XA_UNAME); - const char *call_id = crm_element_value(xml_op, PCMK__XA_CALL_ID); - const char *rc_s = crm_element_value(xml_op, PCMK__XA_RC_CODE); + const char *uname = pcmk__xe_get(xml_op, PCMK_XA_UNAME); + const char *call_id = pcmk__xe_get(xml_op, PCMK__XA_CALL_ID); + const char *rc_s = pcmk__xe_get(xml_op, PCMK__XA_RC_CODE); const char *status_s = NULL; - const char *op_rsc = crm_element_value(xml_op, PCMK_XA_RESOURCE); + const char *op_rsc = pcmk__xe_get(xml_op, PCMK_XA_RESOURCE); int status; time_t last_change = 0; xmlNode *node = NULL; - pcmk__scan_min_int(crm_element_value(xml_op, PCMK__XA_OP_STATUS), - &status, PCMK_EXEC_UNKNOWN); + pcmk__scan_min_int(pcmk__xe_get(xml_op, PCMK__XA_OP_STATUS), &status, + PCMK_EXEC_UNKNOWN); status_s = pcmk_exec_status_str(status); node = pcmk__output_create_xml_node(out, PCMK_XE_OPERATION, @@ -2282,17 +2299,16 @@ node_and_op_xml(pcmk__output_t *out, va_list args) { rsc = pe_find_resource(scheduler->priv->resources, op_rsc); if (rsc) { - const char *class = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); - const char *provider = crm_element_value(rsc->priv->xml, - PCMK_XA_PROVIDER); - const char *kind = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); - bool has_provider = pcmk_is_set(pcmk_get_ra_caps(class), - pcmk_ra_cap_provider); - - char *agent_tuple = crm_strdup_printf("%s:%s:%s", - class, - (has_provider? provider : ""), - kind); + const char *class = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); + const char *provider = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER); + const char *kind = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); + bool has_provider = pcmk__is_set(pcmk_get_ra_caps(class), + pcmk_ra_cap_provider); + + char *agent_tuple = pcmk__assert_asprintf("%s:%s:%s", + class, + (has_provider? provider : ""), + kind); pcmk__xe_set_props(node, PCMK_XA_RSC, rsc_printable_id(rsc), @@ -2301,10 +2317,10 @@ node_and_op_xml(pcmk__output_t *out, va_list args) { free(agent_tuple); } - if (crm_element_value_epoch(xml_op, PCMK_XA_LAST_RC_CHANGE, - &last_change) == pcmk_ok) { + if (pcmk__xe_get_time(xml_op, PCMK_XA_LAST_RC_CHANGE, + &last_change) == pcmk_rc_ok) { const char *last_rc_change = pcmk__trim(ctime(&last_change)); - const char *exec_time = crm_element_value(xml_op, PCMK_XA_EXEC_TIME); + const char *exec_time = pcmk__xe_get(xml_op, PCMK_XA_EXEC_TIME); pcmk__xe_set_props(node, PCMK_XA_LAST_RC_CHANGE, last_rc_change, @@ -2330,7 +2346,7 @@ node_attribute_xml(pcmk__output_t *out, va_list args) { if (add_extra) { char *buf = pcmk__itoa(expected_score); - crm_xml_add(node, PCMK_XA_EXPECTED, buf); + pcmk__xe_set(node, PCMK_XA_EXPECTED, buf); free(buf); } @@ -2412,8 +2428,8 @@ node_capacity(pcmk__output_t *out, va_list args) const pcmk_node_t *node = va_arg(args, pcmk_node_t *); const char *comment = va_arg(args, const char *); - char *dump_text = crm_strdup_printf("%s: %s capacity:", - comment, pcmk__node_name(node)); + char *dump_text = pcmk__assert_asprintf("%s: %s capacity:", + comment, pcmk__node_name(node)); g_hash_table_foreach(node->priv->utilization, append_dump_text, &dump_text); @@ -2465,7 +2481,7 @@ node_history_list(pcmk__output_t *out, va_list args) { rsc_entry != NULL; rsc_entry = pcmk__xe_next(rsc_entry, PCMK__XE_LRM_RESOURCE)) { - const char *rsc_id = crm_element_value(rsc_entry, PCMK_XA_ID); + const char *rsc_id = pcmk__xe_get(rsc_entry, PCMK_XA_ID); pcmk_resource_t *rsc = NULL; const pcmk_resource_t *parent = NULL; @@ -2498,7 +2514,7 @@ node_history_list(pcmk__output_t *out, va_list args) { continue; } - if (!pcmk_is_set(section_opts, pcmk_section_operations)) { + if (!pcmk__is_set(section_opts, pcmk_section_operations)) { time_t last_failure = 0; int failcount = pe_get_failcount(node, rsc, &last_failure, pcmk__fc_default, NULL); @@ -2524,7 +2540,7 @@ node_history_list(pcmk__output_t *out, va_list args) { } rsc = pe_find_resource(scheduler->priv->resources, - crm_element_value(rsc_entry, PCMK_XA_ID)); + pcmk__xe_get(rsc_entry, PCMK_XA_ID)); if (rc == pcmk_rc_no_output) { rc = pcmk_rc_ok; @@ -2589,7 +2605,9 @@ node_list_text(pcmk__output_t *out, va_list args) { for (GList *gIter = nodes; gIter != NULL; gIter = gIter->next) { pcmk_node_t *node = (pcmk_node_t *) gIter->data; - char *node_name = pe__node_display_name(node, pcmk_is_set(show_opts, pcmk_show_node_id)); + char *node_name = + pe__node_display_name(node, + pcmk__is_set(show_opts, pcmk_show_node_id)); if (!pcmk__str_in_list(node->priv->name, only_node, pcmk__str_star_matches|pcmk__str_casei)) { @@ -2601,12 +2619,12 @@ node_list_text(pcmk__output_t *out, va_list args) { // Determine whether to display node individually or in a list if (node->details->unclean || node->details->pending - || (pcmk_is_set(node->priv->flags, pcmk__node_fail_standby) + || (pcmk__is_set(node->priv->flags, pcmk__node_fail_standby) && node->details->online) - || pcmk_is_set(node->priv->flags, pcmk__node_standby) + || pcmk__is_set(node->priv->flags, pcmk__node_standby) || node->details->maintenance - || pcmk_is_set(show_opts, pcmk_show_rscs_by_node) - || pcmk_is_set(show_opts, pcmk_show_feature_set) + || pcmk__is_set(show_opts, pcmk_show_rscs_by_node) + || pcmk__is_set(show_opts, pcmk_show_feature_set) || (pe__node_health(node) <= 0)) { // Display node individually @@ -2731,6 +2749,8 @@ node_summary(pcmk__output_t *out, va_list args) { pcmk_node_t *node = pe_find_node_id(scheduler->nodes, pcmk__xe_id(node_state)); + const bool operations = pcmk__is_set(section_opts, + pcmk_section_operations); if (!node || !node->details || !node->details->online) { continue; @@ -2741,8 +2761,12 @@ node_summary(pcmk__output_t *out, va_list args) { continue; } - PCMK__OUTPUT_LIST_HEADER(out, print_spacer, rc, - pcmk_is_set(section_opts, pcmk_section_operations) ? "Operations" : "Migration Summary"); + if (operations) { + PCMK__OUTPUT_LIST_HEADER(out, print_spacer, rc, "Operations"); + } else { + PCMK__OUTPUT_LIST_HEADER(out, print_spacer, rc, + "Migration Summary"); + } out->message(out, "node-history-list", scheduler, node, node_state, only_node, only_rsc, section_opts, show_opts); @@ -2789,7 +2813,7 @@ node_weight_xml(pcmk__output_t *out, va_list args) NULL); if (rsc) { - crm_xml_add(node, PCMK_XA_ID, rsc->id); + pcmk__xe_set(node, PCMK_XA_ID, rsc->id); } return pcmk_rc_ok; @@ -2805,7 +2829,7 @@ op_history_text(pcmk__output_t *out, va_list args) { uint32_t show_opts = va_arg(args, uint32_t); char *buf = op_history_string(xml_op, task, interval_ms_s, rc, - pcmk_is_set(show_opts, pcmk_show_timing)); + pcmk__is_set(show_opts, pcmk_show_timing)); out->list_item(out, NULL, "%s", buf); @@ -2822,7 +2846,7 @@ op_history_xml(pcmk__output_t *out, va_list args) { int rc = va_arg(args, int); uint32_t show_opts = va_arg(args, uint32_t); - const char *call_id = crm_element_value(xml_op, PCMK__XA_CALL_ID); + const char *call_id = pcmk__xe_get(xml_op, PCMK__XA_CALL_ID); char *rc_s = pcmk__itoa(rc); const char *rc_text = crm_exit_str(rc); xmlNodePtr node = NULL; @@ -2836,32 +2860,32 @@ op_history_xml(pcmk__output_t *out, va_list args) { free(rc_s); if (interval_ms_s && !pcmk__str_eq(interval_ms_s, "0", pcmk__str_casei)) { - char *s = crm_strdup_printf("%sms", interval_ms_s); - crm_xml_add(node, PCMK_XA_INTERVAL, s); + char *s = pcmk__assert_asprintf("%sms", interval_ms_s); + pcmk__xe_set(node, PCMK_XA_INTERVAL, s); free(s); } - if (pcmk_is_set(show_opts, pcmk_show_timing)) { + if (pcmk__is_set(show_opts, pcmk_show_timing)) { const char *value = NULL; time_t epoch = 0; - if ((crm_element_value_epoch(xml_op, PCMK_XA_LAST_RC_CHANGE, - &epoch) == pcmk_ok) && (epoch > 0)) { + pcmk__xe_get_time(xml_op, PCMK_XA_LAST_RC_CHANGE, &epoch); + if (epoch > 0) { char *s = pcmk__epoch2str(&epoch, 0); - crm_xml_add(node, PCMK_XA_LAST_RC_CHANGE, s); + pcmk__xe_set(node, PCMK_XA_LAST_RC_CHANGE, s); free(s); } - value = crm_element_value(xml_op, PCMK_XA_EXEC_TIME); + value = pcmk__xe_get(xml_op, PCMK_XA_EXEC_TIME); if (value) { - char *s = crm_strdup_printf("%sms", value); - crm_xml_add(node, PCMK_XA_EXEC_TIME, s); + char *s = pcmk__assert_asprintf("%sms", value); + pcmk__xe_set(node, PCMK_XA_EXEC_TIME, s); free(s); } - value = crm_element_value(xml_op, PCMK_XA_QUEUE_TIME); + value = pcmk__xe_get(xml_op, PCMK_XA_QUEUE_TIME); if (value) { - char *s = crm_strdup_printf("%sms", value); - crm_xml_add(node, PCMK_XA_QUEUE_TIME, s); + char *s = pcmk__assert_asprintf("%sms", value); + pcmk__xe_set(node, PCMK_XA_QUEUE_TIME, s); free(s); } } @@ -2903,7 +2927,7 @@ promotion_score_xml(pcmk__output_t *out, va_list args) NULL); if (chosen) { - crm_xml_add(node, PCMK_XA_NODE, chosen->priv->name); + pcmk__xe_set(node, PCMK_XA_NODE, chosen->priv->name); } return pcmk_rc_ok; @@ -2984,14 +3008,14 @@ resource_history_xml(pcmk__output_t *out, va_list args) { if (failcount > 0) { char *s = pcmk__itoa(failcount); - crm_xml_add(node, PCMK_XA_FAIL_COUNT, s); + pcmk__xe_set(node, PCMK_XA_FAIL_COUNT, s); free(s); } if (last_failure > 0) { char *s = pcmk__epoch2str(&last_failure, 0); - crm_xml_add(node, PCMK_XA_LAST_FAILURE, s); + pcmk__xe_set(node, PCMK_XA_LAST_FAILURE, s); free(s); } } @@ -3006,10 +3030,10 @@ resource_history_xml(pcmk__output_t *out, va_list args) { static void print_resource_header(pcmk__output_t *out, uint32_t show_opts) { - if (pcmk_is_set(show_opts, pcmk_show_rscs_by_node)) { + if (pcmk__is_set(show_opts, pcmk_show_rscs_by_node)) { /* Active resources have already been printed by node */ out->begin_list(out, NULL, NULL, "Inactive Resources"); - } else if (pcmk_is_set(show_opts, pcmk_show_inactive_rscs)) { + } else if (pcmk__is_set(show_opts, pcmk_show_inactive_rscs)) { out->begin_list(out, NULL, NULL, "Full List of Resources"); } else { out->begin_list(out, NULL, NULL, "Active Resources"); @@ -3036,15 +3060,15 @@ resource_list(pcmk__output_t *out, va_list args) /* If we already showed active resources by node, and * we're not showing inactive resources, we have nothing to do */ - if (pcmk_is_set(show_opts, pcmk_show_rscs_by_node) && - !pcmk_is_set(show_opts, pcmk_show_inactive_rscs)) { + if (pcmk__is_set(show_opts, pcmk_show_rscs_by_node) + && !pcmk__is_set(show_opts, pcmk_show_inactive_rscs)) { return rc; } /* If we haven't already printed resources grouped by node, * and brief output was requested, print resource summary */ - if (pcmk_is_set(show_opts, pcmk_show_brief) - && !pcmk_is_set(show_opts, pcmk_show_rscs_by_node)) { + if (pcmk__is_set(show_opts, pcmk_show_brief) + && !pcmk__is_set(show_opts, pcmk_show_rscs_by_node)) { GList *rscs = pe__filter_rsc_list(scheduler->priv->resources, only_rsc); PCMK__OUTPUT_SPACER_IF(out, print_spacer); @@ -3067,24 +3091,26 @@ resource_list(pcmk__output_t *out, va_list args) bool partially_active = rsc->priv->fns->active(rsc, false); /* Skip inactive orphans (deleted but still in CIB) */ - if (pcmk_is_set(rsc->flags, pcmk__rsc_removed) && !is_active) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_removed) && !is_active) { continue; + } /* Skip active resources if we already displayed them by node */ - } else if (pcmk_is_set(show_opts, pcmk_show_rscs_by_node)) { + if (pcmk__is_set(show_opts, pcmk_show_rscs_by_node)) { if (is_active) { continue; } /* Skip primitives already counted in a brief summary */ - } else if (pcmk_is_set(show_opts, pcmk_show_brief) + } else if (pcmk__is_set(show_opts, pcmk_show_brief) && pcmk__is_primitive(rsc)) { continue; /* Skip resources that aren't at least partially active, * unless we're displaying inactive resources */ - } else if (!partially_active && !pcmk_is_set(show_opts, pcmk_show_inactive_rscs)) { + } else if (!partially_active + && !pcmk__is_set(show_opts, pcmk_show_inactive_rscs)) { continue; } else if (partially_active && !pe__rsc_running_on_any(rsc, only_node)) { @@ -3115,9 +3141,9 @@ resource_list(pcmk__output_t *out, va_list args) /* @FIXME It looks as if we can return pcmk_rc_no_output even after * writing output here. */ - if (pcmk_is_set(show_opts, pcmk_show_rscs_by_node)) { + if (pcmk__is_set(show_opts, pcmk_show_rscs_by_node)) { out->list_item(out, NULL, "No inactive resources"); - } else if (pcmk_is_set(show_opts, pcmk_show_inactive_rscs)) { + } else if (pcmk__is_set(show_opts, pcmk_show_inactive_rscs)) { out->list_item(out, NULL, "No resources"); } else { out->list_item(out, NULL, "No active resources"); @@ -3149,10 +3175,9 @@ resource_operation_list(pcmk__output_t *out, va_list args) /* Print each operation */ for (gIter = op_list; gIter != NULL; gIter = gIter->next) { xmlNode *xml_op = (xmlNode *) gIter->data; - const char *task = crm_element_value(xml_op, PCMK_XA_OPERATION); - const char *interval_ms_s = crm_element_value(xml_op, - PCMK_META_INTERVAL); - const char *op_rc = crm_element_value(xml_op, PCMK__XA_RC_CODE); + const char *task = pcmk__xe_get(xml_op, PCMK_XA_OPERATION); + const char *interval_ms_s = pcmk__xe_get(xml_op, PCMK_META_INTERVAL); + const char *op_rc = pcmk__xe_get(xml_op, PCMK__XA_RC_CODE); int op_rc_i; pcmk__scan_min_int(op_rc, &op_rc_i, 0); @@ -3195,8 +3220,8 @@ resource_util(pcmk__output_t *out, va_list args) pcmk_node_t *node = va_arg(args, pcmk_node_t *); const char *fn = va_arg(args, const char *); - char *dump_text = crm_strdup_printf("%s: %s utilization on %s:", - fn, rsc->id, pcmk__node_name(node)); + char *dump_text = pcmk__assert_asprintf("%s: %s utilization on %s:", + fn, rsc->id, pcmk__node_name(node)); g_hash_table_foreach(rsc->priv->utilization, append_dump_text, &dump_text); @@ -3231,7 +3256,7 @@ resource_util_xml(pcmk__output_t *out, va_list args) static inline const char * ticket_status(pcmk__ticket_t *ticket) { - if (pcmk_is_set(ticket->flags, pcmk__ticket_granted)) { + if (pcmk__is_set(ticket->flags, pcmk__ticket_granted)) { return PCMK_VALUE_GRANTED; } return PCMK_VALUE_REVOKED; @@ -3240,7 +3265,7 @@ ticket_status(pcmk__ticket_t *ticket) static inline const char * ticket_standby_text(pcmk__ticket_t *ticket) { - return pcmk_is_set(ticket->flags, pcmk__ticket_standby)? " [standby]" : ""; + return pcmk__is_set(ticket->flags, pcmk__ticket_standby)? " [standby]" : ""; } PCMK__OUTPUT_ARGS("ticket", "pcmk__ticket_t *", "bool", "bool") @@ -3352,7 +3377,7 @@ ticket_xml(pcmk__output_t *out, va_list args) { if (ticket->last_granted > -1) { char *buf = pcmk__epoch2str(&ticket->last_granted, 0); - crm_xml_add(node, PCMK_XA_LAST_GRANTED, buf); + pcmk__xe_set(node, PCMK_XA_LAST_GRANTED, buf); free(buf); } @@ -3366,7 +3391,7 @@ ticket_xml(pcmk__output_t *out, va_list args) { continue; } - crm_xml_add(node, name, value); + pcmk__xe_set(node, name, value); } return pcmk_rc_ok; diff --git a/lib/pengine/remote.c b/lib/pengine/remote.c index b3820a742d5..bfdf1bf9970 100644 --- a/lib/pengine/remote.c +++ b/lib/pengine/remote.c @@ -1,5 +1,5 @@ /* - * Copyright 2013-2024 the Pacemaker project contributors + * Copyright 2013-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -8,6 +8,7 @@ */ #include +#include // crm_create_nvpair_xml() #include #include #include @@ -30,14 +31,14 @@ pe__resource_contains_guest_node(const pcmk_scheduler_t *scheduler, const pcmk_resource_t *rsc) { if ((rsc != NULL) && (scheduler != NULL) - && pcmk_is_set(scheduler->flags, pcmk__sched_have_remote_nodes)) { + && pcmk__is_set(scheduler->flags, pcmk__sched_have_remote_nodes)) { for (GList *gIter = rsc->priv->launched; gIter != NULL; gIter = gIter->next) { pcmk_resource_t *launched = gIter->data; - if (pcmk_is_set(launched->flags, pcmk__rsc_is_remote_connection)) { + if (pcmk__is_set(launched->flags, pcmk__rsc_is_remote_connection)) { return launched; } } @@ -54,17 +55,17 @@ xml_contains_remote_node(xmlNode *xml) return false; } - value = crm_element_value(xml, PCMK_XA_TYPE); + value = pcmk__xe_get(xml, PCMK_XA_TYPE); if (!pcmk__str_eq(value, "remote", pcmk__str_casei)) { return false; } - value = crm_element_value(xml, PCMK_XA_CLASS); + value = pcmk__xe_get(xml, PCMK_XA_CLASS); if (!pcmk__str_eq(value, PCMK_RESOURCE_CLASS_OCF, pcmk__str_casei)) { return false; } - value = crm_element_value(xml, PCMK_XA_PROVIDER); + value = pcmk__xe_get(xml, PCMK_XA_PROVIDER); if (!pcmk__str_eq(value, "pacemaker", pcmk__str_casei)) { return false; } @@ -90,13 +91,13 @@ pe_foreach_guest_node(const pcmk_scheduler_t *scheduler, GList *iter; CRM_CHECK(scheduler && host && host->details && helper, return); - if (!pcmk_is_set(scheduler->flags, pcmk__sched_have_remote_nodes)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_have_remote_nodes)) { return; } for (iter = host->details->running_rsc; iter != NULL; iter = iter->next) { pcmk_resource_t *rsc = (pcmk_resource_t *) iter->data; - if (pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection) + if (pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection) && (rsc->priv->launcher != NULL)) { pcmk_node_t *guest_node = pcmk_find_node(scheduler, rsc->id); @@ -136,10 +137,10 @@ pe_create_remote_xml(xmlNode *parent, const char *uname, remote = pcmk__xe_create(parent, PCMK_XE_PRIMITIVE); // Add identity - crm_xml_add(remote, PCMK_XA_ID, uname); - crm_xml_add(remote, PCMK_XA_CLASS, PCMK_RESOURCE_CLASS_OCF); - crm_xml_add(remote, PCMK_XA_PROVIDER, "pacemaker"); - crm_xml_add(remote, PCMK_XA_TYPE, "remote"); + pcmk__xe_set(remote, PCMK_XA_ID, uname); + pcmk__xe_set(remote, PCMK_XA_CLASS, PCMK_RESOURCE_CLASS_OCF); + pcmk__xe_set(remote, PCMK_XA_PROVIDER, "pacemaker"); + pcmk__xe_set(remote, PCMK_XA_TYPE, "remote"); // Add meta-attributes xml_sub = pcmk__xe_create(remote, PCMK_XE_META_ATTRIBUTES); diff --git a/lib/pengine/status.c b/lib/pengine/status.c index f280de26567..b120609021d 100644 --- a/lib/pengine/status.c +++ b/lib/pengine/status.c @@ -38,7 +38,7 @@ check_for_deprecated_rules(pcmk_scheduler_t *scheduler) // @COMPAT Drop this function when support for the syntax is dropped xmlNode *deprecated = pcmk__xpath_find_one(scheduler->input->doc, XPATH_DEPRECATED_RULES, - LOG_NEVER); + PCMK__LOG_NEVER); if (deprecated != NULL) { pcmk__warn_once(pcmk__wo_op_attr_expr, @@ -70,7 +70,7 @@ cluster_status(pcmk_scheduler_t * scheduler) return FALSE; } - if (pcmk_is_set(scheduler->flags, pcmk__sched_have_status)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_have_status)) { /* cluster_status() has already been called since the last time the * scheduler was reset. Unpacking the input CIB again would cause * duplication within the scheduler object's data structures. @@ -81,7 +81,7 @@ cluster_status(pcmk_scheduler_t * scheduler) return TRUE; } - new_version = crm_element_value(scheduler->input, PCMK_XA_CRM_FEATURE_SET); + new_version = pcmk__xe_get(scheduler->input, PCMK_XA_CRM_FEATURE_SET); if (pcmk__check_feature_set(new_version) != pcmk_rc_ok) { pcmk__config_err("Can't process CIB with feature set '%s' greater than our own '%s'", @@ -89,7 +89,7 @@ cluster_status(pcmk_scheduler_t * scheduler) return FALSE; } - crm_trace("Beginning unpack"); + pcmk__trace("Beginning unpack"); pcmk__xml_free(scheduler->priv->failed); scheduler->priv->failed = pcmk__xe_create(NULL, "failed-ops"); @@ -106,19 +106,19 @@ cluster_status(pcmk_scheduler_t * scheduler) scheduler->priv->op_defaults = pcmk__xpath_find_one(scheduler->input->doc, "//" PCMK_XE_OP_DEFAULTS, - LOG_NEVER); + PCMK__LOG_NEVER); check_for_deprecated_rules(scheduler); scheduler->priv->rsc_defaults = pcmk__xpath_find_one(scheduler->input->doc, "//" PCMK_XE_RSC_DEFAULTS, - LOG_NEVER); + PCMK__LOG_NEVER); section = pcmk__xpath_find_one(scheduler->input->doc, - "//" PCMK_XE_CRM_CONFIG, LOG_TRACE); + "//" PCMK_XE_CRM_CONFIG, PCMK__LOG_TRACE); unpack_config(section, scheduler); - if (!pcmk_any_flags_set(scheduler->flags, - pcmk__sched_location_only|pcmk__sched_quorate) + if (!pcmk__any_flags_set(scheduler->flags, + pcmk__sched_location_only|pcmk__sched_quorate) && (scheduler->no_quorum_policy != pcmk_no_quorum_ignore)) { pcmk__sched_warn(scheduler, "Fencing and resource management disabled " @@ -126,31 +126,32 @@ cluster_status(pcmk_scheduler_t * scheduler) } section = pcmk__xpath_find_one(scheduler->input->doc, "//" PCMK_XE_NODES, - LOG_TRACE); + PCMK__LOG_TRACE); unpack_nodes(section, scheduler); section = pcmk__xpath_find_one(scheduler->input->doc, - "//" PCMK_XE_RESOURCES, LOG_TRACE); - if (!pcmk_is_set(scheduler->flags, pcmk__sched_location_only)) { + "//" PCMK_XE_RESOURCES, PCMK__LOG_TRACE); + if (!pcmk__is_set(scheduler->flags, pcmk__sched_location_only)) { unpack_remote_nodes(section, scheduler); } unpack_resources(section, scheduler); section = pcmk__xpath_find_one(scheduler->input->doc, - "//" PCMK_XE_FENCING_TOPOLOGY, LOG_TRACE); + "//" PCMK_XE_FENCING_TOPOLOGY, + PCMK__LOG_TRACE); pcmk__validate_fencing_topology(section); section = pcmk__xpath_find_one(scheduler->input->doc, "//" PCMK_XE_TAGS, - LOG_NEVER); + PCMK__LOG_NEVER); unpack_tags(section, scheduler); - if (!pcmk_is_set(scheduler->flags, pcmk__sched_location_only)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_location_only)) { section = pcmk__xpath_find_one(scheduler->input->doc, - "//" PCMK_XE_STATUS, LOG_TRACE); + "//" PCMK_XE_STATUS, PCMK__LOG_TRACE); unpack_status(section, scheduler); } - if (!pcmk_is_set(scheduler->flags, pcmk__sched_no_counts)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_no_counts)) { for (GList *item = scheduler->priv->resources; item != NULL; item = item->next) { @@ -158,17 +159,17 @@ cluster_status(pcmk_scheduler_t * scheduler) rsc->priv->fns->count(item->data); } - crm_trace("Cluster resource count: %d (%d disabled, %d blocked)", - scheduler->priv->ninstances, - scheduler->priv->disabled_resources, - scheduler->priv->blocked_resources); + pcmk__trace("Cluster resource count: %d (%d disabled, %d blocked)", + scheduler->priv->ninstances, + scheduler->priv->disabled_resources, + scheduler->priv->blocked_resources); } if ((scheduler->priv->local_node_name != NULL) && (pcmk_find_node(scheduler, scheduler->priv->local_node_name) == NULL)) { - crm_info("Creating a fake local node for %s", - scheduler->priv->local_node_name); + pcmk__info("Creating a fake local node for %s", + scheduler->priv->local_node_name); pe_create_node(scheduler->priv->local_node_name, scheduler->priv->local_node_name, NULL, 0, scheduler); } @@ -197,7 +198,7 @@ pe_find_resource_with_flags(GList *rsc_list, const char *id, enum pe_find flags) return match; } } - crm_trace("No match for %s", id); + pcmk__trace("No match for %s", id); return NULL; } @@ -299,13 +300,13 @@ cleanup_calculations(pcmk_scheduler_t *scheduler) g_hash_table_destroy(scheduler->priv->tags); } - crm_trace("deleting resources"); + pcmk__trace("deleting resources"); g_list_free_full(scheduler->priv->resources, pcmk__free_resource); - crm_trace("deleting actions"); + pcmk__trace("deleting actions"); g_list_free_full(scheduler->priv->actions, pcmk__free_action); - crm_trace("deleting nodes"); + pcmk__trace("deleting nodes"); g_list_free_full(scheduler->nodes, pcmk__free_node); scheduler->nodes = NULL; diff --git a/lib/pengine/tests/native/native_find_rsc_test.c b/lib/pengine/tests/native/native_find_rsc_test.c index 070b355064c..d0f4f0c1e8f 100644 --- a/lib/pengine/tests/native/native_find_rsc_test.c +++ b/lib/pengine/tests/native/native_find_rsc_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -29,7 +29,7 @@ setup(void **state) { pcmk__xml_init(); - path = crm_strdup_printf("%s/crm_mon.xml", getenv("PCMK_CTS_CLI_DIR")); + path = pcmk__assert_asprintf("%s/crm_mon.xml", getenv("PCMK_CTS_CLI_DIR")); input = pcmk__xml_read(path); free(path); @@ -96,11 +96,11 @@ bad_args(void **state) { assert_null(native_find_rsc(rsc, NULL, NULL, 0)); /* No resources exist with these names. */ - name = crm_strdup_printf("%sX", rsc->id); + name = pcmk__assert_asprintf("%sX", rsc->id); assert_null(native_find_rsc(rsc, name, NULL, 0)); free(name); - name = crm_strdup_printf("x%s", rsc->id); + name = pcmk__assert_asprintf("x%s", rsc->id); assert_null(native_find_rsc(rsc, name, NULL, 0)); free(name); diff --git a/lib/pengine/tests/native/pe_base_name_eq_test.c b/lib/pengine/tests/native/pe_base_name_eq_test.c index 51e4af3787b..c7525442dc9 100644 --- a/lib/pengine/tests/native/pe_base_name_eq_test.c +++ b/lib/pengine/tests/native/pe_base_name_eq_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 the Pacemaker project contributors + * Copyright 2022-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -28,7 +28,7 @@ setup(void **state) { pcmk__xml_init(); - path = crm_strdup_printf("%s/crm_mon.xml", getenv("PCMK_CTS_CLI_DIR")); + path = pcmk__assert_asprintf("%s/crm_mon.xml", getenv("PCMK_CTS_CLI_DIR")); input = pcmk__xml_read(path); free(path); diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c index 83ecb2d838e..df88025555f 100644 --- a/lib/pengine/unpack.c +++ b/lib/pengine/unpack.c @@ -19,6 +19,7 @@ #include #include +#include // PCMK_SCORE_INFINITY #include #include @@ -55,16 +56,20 @@ struct action_history { const char *scf_value = pcmk__cluster_option(config_hash, (option)); \ \ if (scf_value != NULL) { \ - if (crm_is_true(scf_value)) { \ + if (pcmk__is_true(scf_value)) { \ (scheduler)->flags = pcmk__set_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Scheduler", \ - crm_system_name, (scheduler)->flags, \ - (flag), #flag); \ + PCMK__LOG_TRACE, \ + "Scheduler", \ + crm_system_name, \ + (scheduler)->flags, \ + (flag), #flag); \ } else { \ (scheduler)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ - LOG_TRACE, "Scheduler", \ - crm_system_name, (scheduler)->flags, \ - (flag), #flag); \ + PCMK__LOG_TRACE, \ + "Scheduler", \ + crm_system_name, \ + (scheduler)->flags, \ + (flag), #flag); \ } \ } \ } while(0) @@ -99,8 +104,8 @@ is_dangling_guest_node(pcmk_node_t *node) return pcmk__is_pacemaker_remote_node(node) && (node->priv->remote != NULL) && (node->priv->remote->priv->launcher == NULL) - && pcmk_is_set(node->priv->remote->flags, - pcmk__rsc_removed_launched); + && pcmk__is_set(node->priv->remote->flags, + pcmk__rsc_removed_launched); } /*! @@ -122,12 +127,11 @@ pe_fence_node(pcmk_scheduler_t *scheduler, pcmk_node_t *node, // Fence a guest or bundle node by marking its launcher as failed pcmk_resource_t *rsc = node->priv->remote->priv->launcher; - if (!pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { - crm_notice("Not fencing guest node %s " - "(otherwise would because %s): " - "its guest resource %s is unmanaged", - pcmk__node_name(node), reason, rsc->id); + if (!pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { + pcmk__notice("Not fencing guest node %s (otherwise would " + "because %s): its guest resource %s is unmanaged", + pcmk__node_name(node), reason, rsc->id); } else { pcmk__sched_warn(scheduler, "Guest node %s will be fenced " @@ -145,21 +149,21 @@ pe_fence_node(pcmk_scheduler_t *scheduler, pcmk_node_t *node, } } else if (is_dangling_guest_node(node)) { - crm_info("Cleaning up dangling connection for guest node %s: " - "fencing was already done because %s, " - "and guest resource no longer exists", - pcmk__node_name(node), reason); + pcmk__info("Cleaning up dangling connection for guest node %s: fencing " + "was already done because %s, and guest resource no longer " + "exists", + pcmk__node_name(node), reason); pcmk__set_rsc_flags(node->priv->remote, pcmk__rsc_failed|pcmk__rsc_stop_if_failed); } else if (pcmk__is_remote_node(node)) { pcmk_resource_t *rsc = node->priv->remote; - if ((rsc != NULL) && !pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { - crm_notice("Not fencing remote node %s " - "(otherwise would because %s): connection is unmanaged", - pcmk__node_name(node), reason); - } else if (!pcmk_is_set(node->priv->flags, pcmk__node_remote_reset)) { + if ((rsc != NULL) && !pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { + pcmk__notice("Not fencing remote node %s (otherwise would because " + "%s): connection is unmanaged", + pcmk__node_name(node), reason); + } else if (!pcmk__is_set(node->priv->flags, pcmk__node_remote_reset)) { pcmk__set_node_flags(node, pcmk__node_remote_reset); pcmk__sched_warn(scheduler, "Remote node %s %s: %s", pcmk__node_name(node), @@ -171,10 +175,13 @@ pe_fence_node(pcmk_scheduler_t *scheduler, pcmk_node_t *node, pe_fence_op(node, NULL, TRUE, reason, FALSE, scheduler); } else if (node->details->unclean) { - crm_trace("Cluster node %s %s because %s", - pcmk__node_name(node), - pe_can_fence(scheduler, node)? "would also be fenced" : "also is unclean", - reason); + const char *fenced_s = "also is unclean"; + + if (pe_can_fence(scheduler, node)) { + fenced_s = "would also be fenced"; + } + pcmk__trace("Cluster node %s %s because %s", + pcmk__node_name(node), fenced_s, reason); } else { pcmk__sched_warn(scheduler, "Cluster node %s %s: %s", @@ -206,7 +213,7 @@ set_if_xpath(uint64_t flag, const char *xpath, pcmk_scheduler_t *scheduler) { xmlXPathObject *result = NULL; - if (!pcmk_is_set(scheduler->flags, flag)) { + if (!pcmk__is_set(scheduler->flags, flag)) { result = pcmk__xpath_search(scheduler->input->doc, xpath); if (pcmk__xpath_num_results(result) > 0) { pcmk__set_scheduler_flags(scheduler, flag); @@ -235,15 +242,15 @@ unpack_config(xmlNode *config, pcmk_scheduler_t *scheduler) set_config_flag(scheduler, PCMK_OPT_ENABLE_STARTUP_PROBES, pcmk__sched_probe_resources); - if (!pcmk_is_set(scheduler->flags, pcmk__sched_probe_resources)) { - crm_info("Startup probes: disabled (dangerous)"); + if (!pcmk__is_set(scheduler->flags, pcmk__sched_probe_resources)) { + pcmk__info("Startup probes: disabled (dangerous)"); } value = pcmk__cluster_option(config_hash, PCMK_OPT_HAVE_WATCHDOG); - if (value && crm_is_true(value)) { - crm_info("Watchdog-based self-fencing will be performed via SBD if " - "fencing is required and " PCMK_OPT_STONITH_WATCHDOG_TIMEOUT - " is nonzero"); + if (pcmk__is_true(value)) { + pcmk__info("Watchdog-based self-fencing will be performed via SBD if " + "fencing is required and " + PCMK_OPT_STONITH_WATCHDOG_TIMEOUT " is nonzero"); pcmk__set_scheduler_flags(scheduler, pcmk__sched_have_fencing); } @@ -256,46 +263,48 @@ unpack_config(xmlNode *config, pcmk_scheduler_t *scheduler) value = pcmk__cluster_option(config_hash, PCMK_OPT_STONITH_TIMEOUT); pcmk_parse_interval_spec(value, &(scheduler->priv->fence_timeout_ms)); - crm_debug("Default fencing action timeout: %s", - pcmk__readable_interval(scheduler->priv->fence_timeout_ms)); + pcmk__debug("Default fencing action timeout: %s", + pcmk__readable_interval(scheduler->priv->fence_timeout_ms)); set_config_flag(scheduler, PCMK_OPT_STONITH_ENABLED, pcmk__sched_fencing_enabled); - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { - crm_debug("STONITH of failed nodes is enabled"); + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + pcmk__debug("STONITH of failed nodes is enabled"); } else { - crm_debug("STONITH of failed nodes is disabled"); + pcmk__debug("STONITH of failed nodes is disabled"); } scheduler->priv->fence_action = pcmk__cluster_option(config_hash, PCMK_OPT_STONITH_ACTION); - crm_trace("STONITH will %s nodes", scheduler->priv->fence_action); + pcmk__trace("STONITH will %s nodes", scheduler->priv->fence_action); set_config_flag(scheduler, PCMK_OPT_CONCURRENT_FENCING, pcmk__sched_concurrent_fencing); - if (pcmk_is_set(scheduler->flags, pcmk__sched_concurrent_fencing)) { - crm_debug("Concurrent fencing is enabled"); + if (pcmk__is_set(scheduler->flags, pcmk__sched_concurrent_fencing)) { + pcmk__debug("Concurrent fencing is enabled"); } else { - crm_debug("Concurrent fencing is disabled"); + pcmk__debug("Concurrent fencing is disabled"); } value = pcmk__cluster_option(config_hash, PCMK_OPT_PRIORITY_FENCING_DELAY); if (value) { - pcmk_parse_interval_spec(value, - &(scheduler->priv->priority_fencing_ms)); - crm_trace("Priority fencing delay is %s", - pcmk__readable_interval(scheduler->priv->priority_fencing_ms)); + guint *delay_ms = &(scheduler->priv->priority_fencing_ms); + + pcmk_parse_interval_spec(value, delay_ms); + pcmk__trace("Priority fencing delay is %s", + pcmk__readable_interval(*delay_ms)); } set_config_flag(scheduler, PCMK_OPT_STOP_ALL_RESOURCES, pcmk__sched_stop_all); - crm_debug("Stop all active resources: %s", - pcmk__flag_text(scheduler->flags, pcmk__sched_stop_all)); + pcmk__debug("Stop all active resources: %s", + pcmk__flag_text(scheduler->flags, pcmk__sched_stop_all)); set_config_flag(scheduler, PCMK_OPT_SYMMETRIC_CLUSTER, pcmk__sched_symmetric_cluster); - if (pcmk_is_set(scheduler->flags, pcmk__sched_symmetric_cluster)) { - crm_debug("Cluster is symmetric" " - resources can run anywhere by default"); + if (pcmk__is_set(scheduler->flags, pcmk__sched_symmetric_cluster)) { + pcmk__debug("Cluster is symmetric" " - resources can run anywhere by " + "default"); } value = pcmk__cluster_option(config_hash, PCMK_OPT_NO_QUORUM_POLICY); @@ -311,17 +320,18 @@ unpack_config(xmlNode *config, pcmk_scheduler_t *scheduler) } else if (pcmk__strcase_any_of(value, PCMK_VALUE_FENCE, PCMK_VALUE_FENCE_LEGACY, NULL)) { - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { int do_panic = 0; - crm_element_value_int(scheduler->input, PCMK_XA_NO_QUORUM_PANIC, - &do_panic); + pcmk__xe_get_int(scheduler->input, PCMK_XA_NO_QUORUM_PANIC, + &do_panic); if (do_panic - || pcmk_is_set(scheduler->flags, pcmk__sched_quorate)) { + || pcmk__is_set(scheduler->flags, pcmk__sched_quorate)) { scheduler->no_quorum_policy = pcmk_no_quorum_fence; } else { - crm_notice("Resetting " PCMK_OPT_NO_QUORUM_POLICY - " to 'stop': cluster has never had quorum"); + pcmk__notice("Resetting " PCMK_OPT_NO_QUORUM_POLICY " to " + "'" PCMK_VALUE_STOP "': cluster has never had " + "quorum"); scheduler->no_quorum_policy = pcmk_no_quorum_stop; } } else { @@ -336,60 +346,60 @@ unpack_config(xmlNode *config, pcmk_scheduler_t *scheduler) switch (scheduler->no_quorum_policy) { case pcmk_no_quorum_freeze: - crm_debug("On loss of quorum: " - "Freeze resources that require quorum"); + pcmk__debug("On loss of quorum: Freeze resources that require " + "quorum"); break; case pcmk_no_quorum_stop: - crm_debug("On loss of quorum: " - "Stop resources that require quorum"); + pcmk__debug("On loss of quorum: Stop resources that require " + "quorum"); break; case pcmk_no_quorum_demote: - crm_debug("On loss of quorum: " - "Demote promotable resources and stop other resources"); + pcmk__debug("On loss of quorum: Demote promotable resources and " + "stop other resources"); break; case pcmk_no_quorum_fence: - crm_notice("On loss of quorum: Fence all remaining nodes"); + pcmk__notice("On loss of quorum: Fence all remaining nodes"); break; case pcmk_no_quorum_ignore: - crm_notice("On loss of quorum: Ignore"); + pcmk__notice("On loss of quorum: Ignore"); break; } set_config_flag(scheduler, PCMK_OPT_STOP_ORPHAN_RESOURCES, pcmk__sched_stop_removed_resources); - if (pcmk_is_set(scheduler->flags, pcmk__sched_stop_removed_resources)) { - crm_trace("Orphan resources are stopped"); + if (pcmk__is_set(scheduler->flags, pcmk__sched_stop_removed_resources)) { + pcmk__trace("Orphan resources are stopped"); } else { - crm_trace("Orphan resources are ignored"); + pcmk__trace("Orphan resources are ignored"); } set_config_flag(scheduler, PCMK_OPT_STOP_ORPHAN_ACTIONS, pcmk__sched_cancel_removed_actions); - if (pcmk_is_set(scheduler->flags, pcmk__sched_cancel_removed_actions)) { - crm_trace("Orphan resource actions are stopped"); + if (pcmk__is_set(scheduler->flags, pcmk__sched_cancel_removed_actions)) { + pcmk__trace("Orphan resource actions are stopped"); } else { - crm_trace("Orphan resource actions are ignored"); + pcmk__trace("Orphan resource actions are ignored"); } set_config_flag(scheduler, PCMK_OPT_MAINTENANCE_MODE, pcmk__sched_in_maintenance); - crm_trace("Maintenance mode: %s", - pcmk__flag_text(scheduler->flags, pcmk__sched_in_maintenance)); + pcmk__trace("Maintenance mode: %s", + pcmk__flag_text(scheduler->flags, pcmk__sched_in_maintenance)); set_config_flag(scheduler, PCMK_OPT_START_FAILURE_IS_FATAL, pcmk__sched_start_failure_fatal); - if (pcmk_is_set(scheduler->flags, pcmk__sched_start_failure_fatal)) { - crm_trace("Start failures are always fatal"); + if (pcmk__is_set(scheduler->flags, pcmk__sched_start_failure_fatal)) { + pcmk__trace("Start failures are always fatal"); } else { - crm_trace("Start failures are handled by failcount"); + pcmk__trace("Start failures are handled by failcount"); } - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { set_config_flag(scheduler, PCMK_OPT_STARTUP_FENCING, pcmk__sched_startup_fencing); } - if (pcmk_is_set(scheduler->flags, pcmk__sched_startup_fencing)) { - crm_trace("Unseen nodes will be fenced"); + if (pcmk__is_set(scheduler->flags, pcmk__sched_startup_fencing)) { + pcmk__trace("Unseen nodes will be fenced"); } else { pcmk__warn_once(pcmk__wo_blind, "Blind faith: not fencing unseen nodes"); @@ -399,28 +409,28 @@ unpack_config(xmlNode *config, pcmk_scheduler_t *scheduler) scheduler->priv->placement_strategy = pcmk__cluster_option(config_hash, PCMK_OPT_PLACEMENT_STRATEGY); - crm_trace("Placement strategy: %s", scheduler->priv->placement_strategy); + pcmk__trace("Placement strategy: %s", scheduler->priv->placement_strategy); set_config_flag(scheduler, PCMK_OPT_SHUTDOWN_LOCK, pcmk__sched_shutdown_lock); - if (pcmk_is_set(scheduler->flags, pcmk__sched_shutdown_lock)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_shutdown_lock)) { value = pcmk__cluster_option(config_hash, PCMK_OPT_SHUTDOWN_LOCK_LIMIT); pcmk_parse_interval_spec(value, &(scheduler->priv->shutdown_lock_ms)); - crm_trace("Resources will be locked to nodes that were cleanly " - "shut down (locks expire after %s)", - pcmk__readable_interval(scheduler->priv->shutdown_lock_ms)); + pcmk__trace("Resources will be locked to nodes that were cleanly " + "shut down (locks expire after %s)", + pcmk__readable_interval(scheduler->priv->shutdown_lock_ms)); } else { - crm_trace("Resources will not be locked to nodes that were cleanly " - "shut down"); + pcmk__trace("Resources will not be locked to nodes that were cleanly " + "shut down"); } value = pcmk__cluster_option(config_hash, PCMK_OPT_NODE_PENDING_TIMEOUT); pcmk_parse_interval_spec(value, &(scheduler->priv->node_pending_ms)); if (scheduler->priv->node_pending_ms == 0U) { - crm_trace("Do not fence pending nodes"); + pcmk__trace("Do not fence pending nodes"); } else { - crm_trace("Fence pending nodes after %s", - pcmk__readable_interval(scheduler->priv->node_pending_ms)); + pcmk__trace("Fence pending nodes after %s", + pcmk__readable_interval(scheduler->priv->node_pending_ms)); } return TRUE; @@ -485,7 +495,7 @@ pe_create_node(const char *id, const char *uname, const char *type, return NULL; } - crm_trace("Creating node for entry %s/%s", uname, id); + pcmk__trace("Creating node for entry %s/%s", uname, id); new_node->assign->score = score; new_node->priv->id = id; new_node->priv->name = uname; @@ -534,8 +544,8 @@ expand_remote_rsc_meta(xmlNode *xml_obj, xmlNode *parent, pcmk_scheduler_t *data for (attr = pcmk__xe_first_child(attr_set, NULL, NULL, NULL); attr != NULL; attr = pcmk__xe_next(attr, NULL)) { - const char *value = crm_element_value(attr, PCMK_XA_VALUE); - const char *name = crm_element_value(attr, PCMK_XA_NAME); + const char *value = pcmk__xe_get(attr, PCMK_XA_VALUE); + const char *name = pcmk__xe_get(attr, PCMK_XA_NAME); if (name == NULL) { // Sanity continue; @@ -588,7 +598,7 @@ handle_startup_fencing(pcmk_scheduler_t *scheduler, pcmk_node_t *new_node) return; } - if (pcmk_is_set(scheduler->flags, pcmk__sched_startup_fencing)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_startup_fencing)) { // All nodes are unclean until we've seen their status entry new_node->details->unclean = TRUE; @@ -615,10 +625,10 @@ unpack_nodes(xmlNode *xml_nodes, pcmk_scheduler_t *scheduler) new_node = NULL; - id = crm_element_value(xml_obj, PCMK_XA_ID); - uname = crm_element_value(xml_obj, PCMK_XA_UNAME); - type = crm_element_value(xml_obj, PCMK_XA_TYPE); - crm_trace("Processing node %s/%s", uname, id); + id = pcmk__xe_get(xml_obj, PCMK_XA_ID); + uname = pcmk__xe_get(xml_obj, PCMK_XA_UNAME); + type = pcmk__xe_get(xml_obj, PCMK_XA_TYPE); + pcmk__trace("Processing node %s/%s", uname, id); if (id == NULL) { pcmk__config_err("Ignoring <" PCMK_XE_NODE @@ -630,7 +640,7 @@ unpack_nodes(xmlNode *xml_nodes, pcmk_scheduler_t *scheduler) pcmk__config_warn("Using 0 as score for node %s " "because '%s' is not a valid score: %s", pcmk__s(uname, "without name"), - crm_element_value(xml_obj, PCMK_XA_SCORE), + pcmk__xe_get(xml_obj, PCMK_XA_SCORE), pcmk_rc_str(rc)); } new_node = pe_create_node(id, uname, type, score, scheduler); @@ -643,8 +653,7 @@ unpack_nodes(xmlNode *xml_nodes, pcmk_scheduler_t *scheduler) add_node_attrs(xml_obj, new_node, FALSE, scheduler); - crm_trace("Done with node %s", - crm_element_value(xml_obj, PCMK_XA_UNAME)); + pcmk__trace("Done with node %s", pcmk__xe_get(xml_obj, PCMK_XA_UNAME)); } return TRUE; @@ -703,8 +712,8 @@ unpack_remote_nodes(xmlNode *xml_resources, pcmk_scheduler_t *scheduler) */ if (new_node_id && (pcmk_find_node(scheduler, new_node_id) == NULL)) { - crm_trace("Found remote node %s defined by resource %s", - new_node_id, pcmk__xe_id(xml_obj)); + pcmk__trace("Found remote node %s defined by resource %s", + new_node_id, pcmk__xe_id(xml_obj)); pe_create_node(new_node_id, new_node_id, PCMK_VALUE_REMOTE, 0, scheduler); } @@ -723,8 +732,8 @@ unpack_remote_nodes(xmlNode *xml_resources, pcmk_scheduler_t *scheduler) scheduler); if (new_node_id && (pcmk_find_node(scheduler, new_node_id) == NULL)) { - crm_trace("Found guest node %s in resource %s", - new_node_id, pcmk__xe_id(xml_obj)); + pcmk__trace("Found guest node %s in resource %s", + new_node_id, pcmk__xe_id(xml_obj)); pe_create_node(new_node_id, new_node_id, PCMK_VALUE_REMOTE, 0, scheduler); } @@ -744,9 +753,10 @@ unpack_remote_nodes(xmlNode *xml_resources, pcmk_scheduler_t *scheduler) if (new_node_id && (pcmk_find_node(scheduler, new_node_id) == NULL)) { - crm_trace("Found guest node %s in resource %s inside group %s", - new_node_id, pcmk__xe_id(xml_obj2), - pcmk__xe_id(xml_obj)); + pcmk__trace("Found guest node %s in resource %s inside " + "group %s", + new_node_id, pcmk__xe_id(xml_obj2), + pcmk__xe_id(xml_obj)); pe_create_node(new_node_id, new_node_id, PCMK_VALUE_REMOTE, 0, scheduler); } @@ -769,11 +779,11 @@ link_rsc2remotenode(pcmk_scheduler_t *scheduler, pcmk_resource_t *new_rsc) { pcmk_node_t *remote_node = NULL; - if (!pcmk_is_set(new_rsc->flags, pcmk__rsc_is_remote_connection)) { + if (!pcmk__is_set(new_rsc->flags, pcmk__rsc_is_remote_connection)) { return; } - if (pcmk_is_set(scheduler->flags, pcmk__sched_location_only)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_location_only)) { /* remote_nodes and remote_resources are not linked in quick location calculations */ return; } @@ -841,7 +851,7 @@ unpack_resources(const xmlNode *xml_resources, pcmk_scheduler_t *scheduler) continue; } - crm_trace("Unpacking <%s " PCMK_XA_ID "='%s'>", xml_obj->name, id); + pcmk__trace("Unpacking <%s " PCMK_XA_ID "='%s'>", xml_obj->name, id); if (pe__unpack_resource(xml_obj, &new_rsc, NULL, scheduler) == pcmk_rc_ok) { scheduler->priv->resources = @@ -866,11 +876,11 @@ unpack_resources(const xmlNode *xml_resources, pcmk_scheduler_t *scheduler) scheduler->priv->resources = g_list_sort(scheduler->priv->resources, pe__cmp_rsc_priority); - if (pcmk_is_set(scheduler->flags, pcmk__sched_location_only)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_location_only)) { /* Ignore */ - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled) - && !pcmk_is_set(scheduler->flags, pcmk__sched_have_fencing)) { + } else if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled) + && !pcmk__is_set(scheduler->flags, pcmk__sched_have_fencing)) { pcmk__config_err("Resource start-up disabled since no STONITH resources have been defined"); pcmk__config_err("Either configure some or disable STONITH with the " @@ -908,7 +918,7 @@ pcmk__validate_fencing_topology(const xmlNode *xml) continue; } - if (crm_element_value_int(level, PCMK_XA_INDEX, &index) != 0) { + if (pcmk__xe_get_int(level, PCMK_XA_INDEX, &index) != pcmk_rc_ok) { pcmk__config_err("Ignoring fencing level %s with invalid index", id); continue; @@ -988,7 +998,7 @@ unpack_ticket_state(xmlNode *xml_ticket, void *userdata) return pcmk_rc_ok; } - crm_trace("Processing ticket state for %s", ticket_id); + pcmk__trace("Processing ticket state for %s", ticket_id); ticket = g_hash_table_lookup(scheduler->priv->ticket_constraints, ticket_id); @@ -1010,12 +1020,12 @@ unpack_ticket_state(xmlNode *xml_ticket, void *userdata) } granted = g_hash_table_lookup(ticket->state, PCMK__XA_GRANTED); - if (granted && crm_is_true(granted)) { + if (pcmk__is_true(granted)) { pcmk__set_ticket_flags(ticket, pcmk__ticket_granted); - crm_info("We have ticket '%s'", ticket->id); + pcmk__info("We have ticket '%s'", ticket->id); } else { pcmk__clear_ticket_flags(ticket, pcmk__ticket_granted); - crm_info("We do not have ticket '%s'", ticket->id); + pcmk__info("We do not have ticket '%s'", ticket->id); } last_granted = g_hash_table_lookup(ticket->state, PCMK_XA_LAST_GRANTED); @@ -1024,25 +1034,25 @@ unpack_ticket_state(xmlNode *xml_ticket, void *userdata) int rc = pcmk__scan_ll(last_granted, &last_granted_ll, 0LL); if (rc != pcmk_rc_ok) { - crm_warn("Using %lld instead of invalid " PCMK_XA_LAST_GRANTED - " value '%s' in state for ticket %s: %s", - last_granted_ll, last_granted, ticket->id, - pcmk_rc_str(rc)); + pcmk__warn("Using %lld instead of invalid " PCMK_XA_LAST_GRANTED + " value '%s' in state for ticket %s: %s", + last_granted_ll, last_granted, ticket->id, + pcmk_rc_str(rc)); } ticket->last_granted = (time_t) last_granted_ll; } standby = g_hash_table_lookup(ticket->state, PCMK_XA_STANDBY); - if (standby && crm_is_true(standby)) { + if (pcmk__is_true(standby)) { pcmk__set_ticket_flags(ticket, pcmk__ticket_standby); - if (pcmk_is_set(ticket->flags, pcmk__ticket_granted)) { - crm_info("Granted ticket '%s' is in standby-mode", ticket->id); + if (pcmk__is_set(ticket->flags, pcmk__ticket_granted)) { + pcmk__info("Granted ticket '%s' is in standby-mode", ticket->id); } } else { pcmk__clear_ticket_flags(ticket, pcmk__ticket_standby); } - crm_trace("Done with ticket state for %s", ticket_id); + pcmk__trace("Done with ticket state for %s", ticket_id); return pcmk_rc_ok; } @@ -1063,10 +1073,10 @@ unpack_handle_remote_attrs(pcmk_node_t *this_node, const xmlNode *state, if ((this_node == NULL) || !pcmk__is_pacemaker_remote_node(this_node)) { return; } - crm_trace("Processing Pacemaker Remote node %s", - pcmk__node_name(this_node)); + pcmk__trace("Processing Pacemaker Remote node %s", + pcmk__node_name(this_node)); - pcmk__scan_min_int(crm_element_value(state, PCMK__XA_NODE_IN_MAINTENANCE), + pcmk__scan_min_int(pcmk__xe_get(state, PCMK__XA_NODE_IN_MAINTENANCE), &maint, 0); if (maint) { pcmk__set_node_flags(this_node, pcmk__node_remote_maint); @@ -1075,7 +1085,7 @@ unpack_handle_remote_attrs(pcmk_node_t *this_node, const xmlNode *state, } rsc = this_node->priv->remote; - if (!pcmk_is_set(this_node->priv->flags, pcmk__node_remote_reset)) { + if (!pcmk__is_set(this_node->priv->flags, pcmk__node_remote_reset)) { this_node->details->unclean = FALSE; pcmk__set_node_flags(this_node, pcmk__node_seen); } @@ -1084,27 +1094,27 @@ unpack_handle_remote_attrs(pcmk_node_t *this_node, const xmlNode *state, add_node_attrs(attrs, this_node, TRUE, scheduler); if (pe__shutdown_requested(this_node)) { - crm_info("%s is shutting down", pcmk__node_name(this_node)); + pcmk__info("%s is shutting down", pcmk__node_name(this_node)); this_node->details->shutdown = TRUE; } - if (crm_is_true(pcmk__node_attr(this_node, PCMK_NODE_ATTR_STANDBY, NULL, - pcmk__rsc_node_current))) { - crm_info("%s is in standby mode", pcmk__node_name(this_node)); + if (pcmk__is_true(pcmk__node_attr(this_node, PCMK_NODE_ATTR_STANDBY, NULL, + pcmk__rsc_node_current))) { + pcmk__info("%s is in standby mode", pcmk__node_name(this_node)); pcmk__set_node_flags(this_node, pcmk__node_standby); } - if (crm_is_true(pcmk__node_attr(this_node, PCMK_NODE_ATTR_MAINTENANCE, NULL, - pcmk__rsc_node_current)) - || ((rsc != NULL) && !pcmk_is_set(rsc->flags, pcmk__rsc_managed))) { - crm_info("%s is in maintenance mode", pcmk__node_name(this_node)); + if (pcmk__is_true(pcmk__node_attr(this_node, PCMK_NODE_ATTR_MAINTENANCE, + NULL, pcmk__rsc_node_current)) + || ((rsc != NULL) && !pcmk__is_set(rsc->flags, pcmk__rsc_managed))) { + pcmk__info("%s is in maintenance mode", pcmk__node_name(this_node)); this_node->details->maintenance = TRUE; } discovery = pcmk__node_attr(this_node, PCMK__NODE_ATTR_RESOURCE_DISCOVERY_ENABLED, NULL, pcmk__rsc_node_current); - if ((discovery != NULL) && !crm_is_true(discovery)) { + if ((discovery != NULL) && !pcmk__is_true(discovery)) { pcmk__warn_once(pcmk__wo_rdisc_enabled, "Support for the " PCMK__NODE_ATTR_RESOURCE_DISCOVERY_ENABLED @@ -1112,7 +1122,7 @@ unpack_handle_remote_attrs(pcmk_node_t *this_node, const xmlNode *state, " (and behave as 'true') in a future release."); if (pcmk__is_remote_node(this_node) - && !pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + && !pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { pcmk__config_warn("Ignoring " PCMK__NODE_ATTR_RESOURCE_DISCOVERY_ENABLED " attribute on Pacemaker Remote node %s" @@ -1124,8 +1134,8 @@ unpack_handle_remote_attrs(pcmk_node_t *this_node, const xmlNode *state, * nodes, because they are "fenced" by recovering their containing * resource. */ - crm_info("%s has resource discovery disabled", - pcmk__node_name(this_node)); + pcmk__info("%s has resource discovery disabled", + pcmk__node_name(this_node)); pcmk__clear_node_flags(this_node, pcmk__node_probes_allowed); } } @@ -1150,22 +1160,22 @@ unpack_transient_attributes(const xmlNode *state, pcmk_node_t *node, add_node_attrs(attrs, node, TRUE, scheduler); - if (crm_is_true(pcmk__node_attr(node, PCMK_NODE_ATTR_STANDBY, NULL, - pcmk__rsc_node_current))) { - crm_info("%s is in standby mode", pcmk__node_name(node)); + if (pcmk__is_true(pcmk__node_attr(node, PCMK_NODE_ATTR_STANDBY, NULL, + pcmk__rsc_node_current))) { + pcmk__info("%s is in standby mode", pcmk__node_name(node)); pcmk__set_node_flags(node, pcmk__node_standby); } - if (crm_is_true(pcmk__node_attr(node, PCMK_NODE_ATTR_MAINTENANCE, NULL, - pcmk__rsc_node_current))) { - crm_info("%s is in maintenance mode", pcmk__node_name(node)); + if (pcmk__is_true(pcmk__node_attr(node, PCMK_NODE_ATTR_MAINTENANCE, NULL, + pcmk__rsc_node_current))) { + pcmk__info("%s is in maintenance mode", pcmk__node_name(node)); node->details->maintenance = TRUE; } discovery = pcmk__node_attr(node, PCMK__NODE_ATTR_RESOURCE_DISCOVERY_ENABLED, NULL, pcmk__rsc_node_current); - if ((discovery != NULL) && !crm_is_true(discovery)) { + if ((discovery != NULL) && !pcmk__is_true(discovery)) { pcmk__config_warn("Ignoring " PCMK__NODE_ATTR_RESOURCE_DISCOVERY_ENABLED " attribute for %s because disabling resource" @@ -1193,15 +1203,15 @@ unpack_node_state(const xmlNode *state, pcmk_scheduler_t *scheduler) const char *uname = NULL; pcmk_node_t *this_node = NULL; - id = crm_element_value(state, PCMK_XA_ID); + id = pcmk__xe_get(state, PCMK_XA_ID); if (id == NULL) { pcmk__config_err("Ignoring invalid " PCMK__XE_NODE_STATE " entry without " PCMK_XA_ID); - crm_log_xml_info(state, "missing-id"); + pcmk__log_xml_info(state, "missing-id"); return; } - uname = crm_element_value(state, PCMK_XA_UNAME); + uname = pcmk__xe_get(state, PCMK_XA_UNAME); if (uname == NULL) { /* If a joining peer makes the cluster acquire the quorum from Corosync * but has not joined the controller CPG membership yet, it's possible @@ -1209,15 +1219,16 @@ unpack_node_state(const xmlNode *state, pcmk_scheduler_t *scheduler) * PCMK_XA_UNAME yet. Recognize the node as pending and wait for it to * join CPG. */ - crm_trace("Handling " PCMK__XE_NODE_STATE " entry with id=\"%s\" " - "without " PCMK_XA_UNAME, - id); + pcmk__trace("Handling " PCMK__XE_NODE_STATE " entry with id=\"%s\" " + "without " PCMK_XA_UNAME, + id); } this_node = pe_find_node_any(scheduler->nodes, id, uname); if (this_node == NULL) { - crm_notice("Ignoring recorded state for removed node with name %s and " - PCMK_XA_ID " %s", pcmk__s(uname, "unknown"), id); + pcmk__notice("Ignoring recorded state for removed node with name %s " + "and " PCMK_XA_ID " %s", + pcmk__s(uname, "unknown"), id); return; } @@ -1229,7 +1240,7 @@ unpack_node_state(const xmlNode *state, pcmk_scheduler_t *scheduler) * do need to mark whether the node has been fenced, as this plays a * role during unpacking cluster node resource state. */ - pcmk__scan_min_int(crm_element_value(state, PCMK__XA_NODE_FENCED), + pcmk__scan_min_int(pcmk__xe_get(state, PCMK__XA_NODE_FENCED), &remote_fenced, 0); if (remote_fenced) { pcmk__set_node_flags(this_node, pcmk__node_remote_fenced); @@ -1247,11 +1258,11 @@ unpack_node_state(const xmlNode *state, pcmk_scheduler_t *scheduler) this_node->details->unclean = FALSE; pcmk__set_node_flags(this_node, pcmk__node_seen); - crm_trace("Determining online status of cluster node %s (id %s)", - pcmk__node_name(this_node), id); + pcmk__trace("Determining online status of cluster node %s (id %s)", + pcmk__node_name(this_node), id); determine_online_status(state, this_node, scheduler); - if (!pcmk_is_set(scheduler->flags, pcmk__sched_quorate) + if (!pcmk__is_set(scheduler->flags, pcmk__sched_quorate) && this_node->details->online && (scheduler->no_quorum_policy == pcmk_no_quorum_fence)) { /* Everything else should flow from this automatically @@ -1293,27 +1304,29 @@ unpack_node_history(const xmlNode *status, bool fence, state != NULL; state = pcmk__xe_next(state, PCMK__XE_NODE_STATE)) { const char *id = pcmk__xe_id(state); - const char *uname = crm_element_value(state, PCMK_XA_UNAME); + const char *uname = pcmk__xe_get(state, PCMK_XA_UNAME); pcmk_node_t *this_node = NULL; if ((id == NULL) || (uname == NULL)) { // Warning already logged in first pass through status section - crm_trace("Not unpacking resource history from malformed " - PCMK__XE_NODE_STATE " without id and/or uname"); + pcmk__trace("Not unpacking resource history from malformed " + PCMK__XE_NODE_STATE " without id and/or uname"); continue; } this_node = pe_find_node_any(scheduler->nodes, id, uname); if (this_node == NULL) { // Warning already logged in first pass through status section - crm_trace("Not unpacking resource history for node %s because " - "no longer in configuration", id); + pcmk__trace("Not unpacking resource history for node %s because " + "no longer in configuration", + id); continue; } - if (pcmk_is_set(this_node->priv->flags, pcmk__node_unpacked)) { - crm_trace("Not unpacking resource history for node %s because " - "already unpacked", id); + if (pcmk__is_set(this_node->priv->flags, pcmk__node_unpacked)) { + pcmk__trace("Not unpacking resource history for node %s because " + "already unpacked", + id); continue; } @@ -1330,9 +1343,10 @@ unpack_node_history(const xmlNode *status, bool fence, if ((remote->priv->orig_role != pcmk_role_started) || (launcher->priv->orig_role != pcmk_role_started)) { - crm_trace("Not unpacking resource history for guest node %s " - "because launcher and connection are not known to " - "be up", id); + pcmk__trace("Not unpacking resource history for guest node %s " + "because launcher and connection are not known to " + "be up", + id); continue; } @@ -1345,10 +1359,11 @@ unpack_node_history(const xmlNode *status, bool fence, pcmk_resource_t *rsc = this_node->priv->remote; if ((rsc == NULL) - || (!pcmk_is_set(scheduler->flags, pcmk__sched_shutdown_lock) + || (!pcmk__is_set(scheduler->flags, pcmk__sched_shutdown_lock) && (rsc->priv->orig_role != pcmk_role_started))) { - crm_trace("Not unpacking resource history for remote node %s " - "because connection is not known to be up", id); + pcmk__trace("Not unpacking resource history for remote node %s " + "because connection is not known to be up", + id); continue; } @@ -1357,12 +1372,13 @@ unpack_node_history(const xmlNode *status, bool fence, * nodes have been unpacked. This allows us to number active clone * instances first. */ - } else if (!pcmk_any_flags_set(scheduler->flags, - pcmk__sched_fencing_enabled - |pcmk__sched_shutdown_lock) + } else if (!pcmk__any_flags_set(scheduler->flags, + pcmk__sched_fencing_enabled + |pcmk__sched_shutdown_lock) && !this_node->details->online) { - crm_trace("Not unpacking resource history for offline " - "cluster node %s", id); + pcmk__trace("Not unpacking resource history for offline " + "cluster node %s", + id); continue; } @@ -1371,8 +1387,8 @@ unpack_node_history(const xmlNode *status, bool fence, unpack_handle_remote_attrs(this_node, state, scheduler); } - crm_trace("Unpacking resource history for %snode %s", - (fence? "unseen " : ""), id); + pcmk__trace("Unpacking resource history for %snode %s", + (fence? "unseen " : ""), id); pcmk__set_node_flags(this_node, pcmk__node_unpacked); unpack_node_lrm(this_node, state, scheduler); @@ -1390,7 +1406,7 @@ unpack_status(xmlNode *status, pcmk_scheduler_t *scheduler) { xmlNode *state = NULL; - crm_trace("Beginning unpack"); + pcmk__trace("Beginning unpack"); if (scheduler->priv->ticket_constraints == NULL) { scheduler->priv->ticket_constraints = @@ -1410,13 +1426,13 @@ unpack_status(xmlNode *status, pcmk_scheduler_t *scheduler) } while (unpack_node_history(status, FALSE, scheduler) == EAGAIN) { - crm_trace("Another pass through node resource histories is needed"); + pcmk__trace("Another pass through node resource histories is needed"); } // Now catch any nodes we didn't see unpack_node_history(status, - pcmk_is_set(scheduler->flags, - pcmk__sched_fencing_enabled), + pcmk__is_set(scheduler->flags, + pcmk__sched_fencing_enabled), scheduler); /* Now that we know where resources are, we can schedule stops of containers @@ -1452,7 +1468,7 @@ unpack_status(xmlNode *status, pcmk_scheduler_t *scheduler) pe__set_next_role(this_node->priv->remote, pcmk_role_stopped, "remote shutdown"); } - if (!pcmk_is_set(this_node->priv->flags, pcmk__node_unpacked)) { + if (!pcmk__is_set(this_node->priv->flags, pcmk__node_unpacked)) { determine_remote_online_status(scheduler, this_node); } } @@ -1474,35 +1490,36 @@ unpack_status(xmlNode *status, pcmk_scheduler_t *scheduler) static long long unpack_node_member(const xmlNode *node_state, pcmk_scheduler_t *scheduler) { - const char *member_time = crm_element_value(node_state, PCMK__XA_IN_CCM); - int member = 0; + const char *member_time = pcmk__xe_get(node_state, PCMK__XA_IN_CCM); + bool is_member = false; if (member_time == NULL) { return -1LL; + } - } else if (crm_str_to_boolean(member_time, &member) == 1) { - /* If in_ccm=0, we'll return 0 here. If in_ccm=1, either the entry was - * recorded as a boolean for a DC < 2.1.7, or the node is pending - * shutdown and has left the CPG, in which case it was set to 1 to avoid - * fencing for PCMK_OPT_NODE_PENDING_TIMEOUT. - * - * We return the effective time for in_ccm=1 because what's important to - * avoid fencing is that effective time minus this value is less than - * the pending node timeout. - */ - return member? (long long) pcmk__scheduler_epoch_time(scheduler) : 0LL; - - } else { + if (pcmk__parse_bool(member_time, &is_member) != pcmk_rc_ok) { long long when_member = 0LL; if ((pcmk__scan_ll(member_time, &when_member, 0LL) != pcmk_rc_ok) || (when_member < 0LL)) { - crm_warn("Unrecognized value '%s' for " PCMK__XA_IN_CCM - " in " PCMK__XE_NODE_STATE " entry", member_time); + pcmk__warn("Unrecognized value '%s' for " PCMK__XA_IN_CCM " in " + PCMK__XE_NODE_STATE " entry", + member_time); return -1LL; } return when_member; } + + /* If in_ccm=0, we'll return 0 here. If in_ccm=1, either the entry was + * recorded as a boolean for a DC < 2.1.7, or the node is pending shutdown + * and has left the CPG, in which case it was set to 1 to avoid fencing for + * PCMK_OPT_NODE_PENDING_TIMEOUT. + * + * We return the effective time for in_ccm=1 because what's important to + * avoid fencing is that effective time minus this value is less than the + * pending node timeout. + */ + return is_member? (long long) pcmk__scheduler_epoch_time(scheduler) : 0LL; } /*! @@ -1517,7 +1534,7 @@ unpack_node_member(const xmlNode *node_state, pcmk_scheduler_t *scheduler) static long long unpack_node_online(const xmlNode *node_state) { - const char *peer_time = crm_element_value(node_state, PCMK_XA_CRMD); + const char *peer_time = pcmk__xe_get(node_state, PCMK_XA_CRMD); // @COMPAT Entries recorded for DCs < 2.1.7 have "online" or "offline" if (pcmk__str_eq(peer_time, PCMK_VALUE_OFFLINE, @@ -1532,8 +1549,9 @@ unpack_node_online(const xmlNode *node_state) if ((pcmk__scan_ll(peer_time, &when_online, 0LL) != pcmk_rc_ok) || (when_online < 0)) { - crm_warn("Unrecognized value '%s' for " PCMK_XA_CRMD " in " - PCMK__XE_NODE_STATE " entry, assuming offline", peer_time); + pcmk__warn("Unrecognized value '%s' for " PCMK_XA_CRMD " in " + PCMK__XE_NODE_STATE " entry, assuming offline", + peer_time); return 0LL; } return when_online; @@ -1552,23 +1570,25 @@ unpack_node_online(const xmlNode *node_state) static bool unpack_node_terminate(const pcmk_node_t *node, const xmlNode *node_state) { - long long value = 0LL; - int value_i = 0; + bool value_b = false; + long long value_ll = 0LL; int rc = pcmk_rc_ok; const char *value_s = pcmk__node_attr(node, PCMK_NODE_ATTR_TERMINATE, NULL, pcmk__rsc_node_current); // Value may be boolean or an epoch time - if (crm_str_to_boolean(value_s, &value_i) == 1) { - return (value_i != 0); + if ((value_s != NULL) + && (pcmk__parse_bool(value_s, &value_b) == pcmk_rc_ok)) { + return value_b; } - rc = pcmk__scan_ll(value_s, &value, 0LL); + + rc = pcmk__scan_ll(value_s, &value_ll, 0LL); if (rc == pcmk_rc_ok) { - return (value > 0); + return (value_ll > 0); } - crm_warn("Ignoring unrecognized value '%s' for " PCMK_NODE_ATTR_TERMINATE - "node attribute for %s: %s", - value_s, pcmk__node_name(node), pcmk_rc_str(rc)); + pcmk__warn("Ignoring unrecognized value '%s' for " PCMK_NODE_ATTR_TERMINATE + "node attribute for %s: %s", + value_s, pcmk__node_name(node), pcmk_rc_str(rc)); return false; } @@ -1578,36 +1598,36 @@ determine_online_status_no_fencing(pcmk_scheduler_t *scheduler, pcmk_node_t *this_node) { gboolean online = FALSE; - const char *join = crm_element_value(node_state, PCMK__XA_JOIN); - const char *exp_state = crm_element_value(node_state, PCMK_XA_EXPECTED); + const char *join = pcmk__xe_get(node_state, PCMK__XA_JOIN); + const char *exp_state = pcmk__xe_get(node_state, PCMK_XA_EXPECTED); long long when_member = unpack_node_member(node_state, scheduler); long long when_online = unpack_node_online(node_state); if (when_member <= 0) { - crm_trace("Node %s is %sdown", pcmk__node_name(this_node), - ((when_member < 0)? "presumed " : "")); + pcmk__trace("Node %s is %sdown", pcmk__node_name(this_node), + ((when_member < 0)? "presumed " : "")); } else if (when_online > 0) { if (pcmk__str_eq(join, CRMD_JOINSTATE_MEMBER, pcmk__str_casei)) { online = TRUE; } else { - crm_debug("Node %s is not ready to run resources: %s", - pcmk__node_name(this_node), join); + pcmk__debug("Node %s is not ready to run resources: %s", + pcmk__node_name(this_node), join); } - } else if (!pcmk_is_set(this_node->priv->flags, - pcmk__node_expected_up)) { - crm_trace("Node %s controller is down: " - "member@%lld online@%lld join=%s expected=%s", - pcmk__node_name(this_node), when_member, when_online, - pcmk__s(join, ""), pcmk__s(exp_state, "")); + } else if (!pcmk__is_set(this_node->priv->flags, + pcmk__node_expected_up)) { + pcmk__trace("Node %s controller is down: " + "member@%lld online@%lld join=%s expected=%s", + pcmk__node_name(this_node), when_member, when_online, + pcmk__s(join, ""), pcmk__s(exp_state, "")); } else { /* mark it unclean */ pe_fence_node(scheduler, this_node, "peer is unexpectedly down", FALSE); - crm_info("Node %s member@%lld online@%lld join=%s expected=%s", - pcmk__node_name(this_node), when_member, when_online, - pcmk__s(join, ""), pcmk__s(exp_state, "")); + pcmk__info("Node %s member@%lld online@%lld join=%s expected=%s", + pcmk__node_name(this_node), when_member, when_online, + pcmk__s(join, ""), pcmk__s(exp_state, "")); } return online; } @@ -1652,8 +1672,8 @@ determine_online_status_fencing(pcmk_scheduler_t *scheduler, pcmk_node_t *this_node) { bool termination_requested = unpack_node_terminate(this_node, node_state); - const char *join = crm_element_value(node_state, PCMK__XA_JOIN); - const char *exp_state = crm_element_value(node_state, PCMK_XA_EXPECTED); + const char *join = pcmk__xe_get(node_state, PCMK__XA_JOIN); + const char *exp_state = pcmk__xe_get(node_state, PCMK_XA_EXPECTED); long long when_member = unpack_node_member(node_state, scheduler); long long when_online = unpack_node_online(node_state); @@ -1675,13 +1695,13 @@ determine_online_status_fencing(pcmk_scheduler_t *scheduler, in CPG. */ - crm_trace("Node %s member@%lld online@%lld join=%s expected=%s%s", - pcmk__node_name(this_node), when_member, when_online, - pcmk__s(join, ""), pcmk__s(exp_state, ""), - (termination_requested? " (termination requested)" : "")); + pcmk__trace("Node %s member@%lld online@%lld join=%s expected=%s%s", + pcmk__node_name(this_node), when_member, when_online, + pcmk__s(join, ""), pcmk__s(exp_state, ""), + (termination_requested? " (termination requested)" : "")); if (this_node->details->shutdown) { - crm_debug("%s is shutting down", pcmk__node_name(this_node)); + pcmk__debug("%s is shutting down", pcmk__node_name(this_node)); /* Slightly different criteria since we can't shut down a dead peer */ return (when_online > 0); @@ -1700,7 +1720,8 @@ determine_online_status_fencing(pcmk_scheduler_t *scheduler, } else if (termination_requested) { if ((when_member <= 0) && (when_online <= 0) && pcmk__str_eq(join, CRMD_JOINSTATE_DOWN, pcmk__str_none)) { - crm_info("%s was fenced as requested", pcmk__node_name(this_node)); + pcmk__info("%s was fenced as requested", + pcmk__node_name(this_node)); return false; } pe_fence_node(scheduler, this_node, "fencing was requested", false); @@ -1714,14 +1735,14 @@ determine_online_status_fencing(pcmk_scheduler_t *scheduler, FALSE); } else if ((when_member > 0) || (when_online > 0)) { - crm_info("- %s is not ready to run resources", - pcmk__node_name(this_node)); + pcmk__info("- %s is not ready to run resources", + pcmk__node_name(this_node)); pcmk__set_node_flags(this_node, pcmk__node_standby); this_node->details->pending = TRUE; } else { - crm_trace("%s is down or still coming up", - pcmk__node_name(this_node)); + pcmk__trace("%s is down or still coming up", + pcmk__node_name(this_node)); } } else if (when_member <= 0) { @@ -1736,12 +1757,12 @@ determine_online_status_fencing(pcmk_scheduler_t *scheduler, /* Everything is running at this point, now check join state */ } else if (pcmk__str_eq(join, CRMD_JOINSTATE_MEMBER, pcmk__str_none)) { - crm_info("%s is active", pcmk__node_name(this_node)); + pcmk__info("%s is active", pcmk__node_name(this_node)); } else if (pcmk__str_any_of(join, CRMD_JOINSTATE_PENDING, CRMD_JOINSTATE_DOWN, NULL)) { - crm_info("%s is not ready to run resources", - pcmk__node_name(this_node)); + pcmk__info("%s is not ready to run resources", + pcmk__node_name(this_node)); pcmk__set_node_flags(this_node, pcmk__node_standby); this_node->details->pending = TRUE; @@ -1766,9 +1787,9 @@ determine_remote_online_status(pcmk_scheduler_t *scheduler, /* This is a leftover node state entry for a former Pacemaker Remote * node whose connection resource was removed. Consider it offline. */ - crm_trace("Pacemaker Remote node %s is considered OFFLINE because " - "its connection resource has been removed from the CIB", - this_node->priv->id); + pcmk__trace("Pacemaker Remote node %s is considered OFFLINE because " + "its connection resource has been removed from the CIB", + this_node->priv->id); this_node->details->online = FALSE; return; } @@ -1790,43 +1811,44 @@ determine_remote_online_status(pcmk_scheduler_t *scheduler, if ((rsc->priv->orig_role == pcmk_role_started) && (rsc->priv->next_role == pcmk_role_stopped)) { - crm_trace("%s node %s shutting down because connection resource is stopping", - node_type, this_node->priv->id); + pcmk__trace("%s node %s shutting down because connection resource is " + "stopping", + node_type, this_node->priv->id); this_node->details->shutdown = TRUE; } /* Now check all the failure conditions. */ - if ((launcher != NULL) && pcmk_is_set(launcher->flags, pcmk__rsc_failed)) { - crm_trace("Guest node %s UNCLEAN because guest resource failed", - this_node->priv->id); + if ((launcher != NULL) && pcmk__is_set(launcher->flags, pcmk__rsc_failed)) { + pcmk__trace("Guest node %s UNCLEAN because guest resource failed", + this_node->priv->id); this_node->details->online = FALSE; pcmk__set_node_flags(this_node, pcmk__node_remote_reset); - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_failed)) { - crm_trace("%s node %s OFFLINE because connection resource failed", - node_type, this_node->priv->id); + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_failed)) { + pcmk__trace("%s node %s OFFLINE because connection resource failed", + node_type, this_node->priv->id); this_node->details->online = FALSE; } else if ((rsc->priv->orig_role == pcmk_role_stopped) || ((launcher != NULL) && (launcher->priv->orig_role == pcmk_role_stopped))) { - crm_trace("%s node %s OFFLINE because its resource is stopped", - node_type, this_node->priv->id); + pcmk__trace("%s node %s OFFLINE because its resource is stopped", + node_type, this_node->priv->id); this_node->details->online = FALSE; pcmk__clear_node_flags(this_node, pcmk__node_remote_reset); } else if (host && (host->details->online == FALSE) && host->details->unclean) { - crm_trace("Guest node %s UNCLEAN because host is unclean", - this_node->priv->id); + pcmk__trace("Guest node %s UNCLEAN because host is unclean", + this_node->priv->id); this_node->details->online = FALSE; pcmk__set_node_flags(this_node, pcmk__node_remote_reset); } else { - crm_trace("%s node %s is %s", - node_type, this_node->priv->id, - this_node->details->online? "ONLINE" : "OFFLINE"); + pcmk__trace("%s node %s is %s", + node_type, this_node->priv->id, + (this_node->details->online? "ONLINE" : "OFFLINE")); } } @@ -1835,7 +1857,7 @@ determine_online_status(const xmlNode *node_state, pcmk_node_t *this_node, pcmk_scheduler_t *scheduler) { gboolean online = FALSE; - const char *exp_state = crm_element_value(node_state, PCMK_XA_EXPECTED); + const char *exp_state = pcmk__xe_get(node_state, PCMK_XA_EXPECTED); CRM_CHECK(this_node != NULL, return); @@ -1848,7 +1870,7 @@ determine_online_status(const xmlNode *node_state, pcmk_node_t *this_node, pcmk__set_node_flags(this_node, pcmk__node_expected_up); } - if (!pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { online = determine_online_status_no_fencing(scheduler, node_state, this_node); @@ -1875,22 +1897,22 @@ determine_online_status(const xmlNode *node_state, pcmk_node_t *this_node, pcmk__node_name(this_node)); } else if (!this_node->details->online) { - crm_trace("%s is offline", pcmk__node_name(this_node)); + pcmk__trace("%s is offline", pcmk__node_name(this_node)); } else if (this_node->details->shutdown) { - crm_info("%s is shutting down", pcmk__node_name(this_node)); + pcmk__info("%s is shutting down", pcmk__node_name(this_node)); } else if (this_node->details->pending) { - crm_info("%s is pending", pcmk__node_name(this_node)); + pcmk__info("%s is pending", pcmk__node_name(this_node)); - } else if (pcmk_is_set(this_node->priv->flags, pcmk__node_standby)) { - crm_info("%s is in standby", pcmk__node_name(this_node)); + } else if (pcmk__is_set(this_node->priv->flags, pcmk__node_standby)) { + pcmk__info("%s is in standby", pcmk__node_name(this_node)); } else if (this_node->details->maintenance) { - crm_info("%s is in maintenance", pcmk__node_name(this_node)); + pcmk__info("%s is in maintenance", pcmk__node_name(this_node)); } else { - crm_info("%s is online", pcmk__node_name(this_node)); + pcmk__info("%s is online", pcmk__node_name(this_node)); } } @@ -1987,8 +2009,8 @@ create_fake_resource(const char *rsc_id, const xmlNode *rsc_entry, xmlNode *xml_rsc = pcmk__xe_create(NULL, PCMK_XE_PRIMITIVE); pcmk__xe_copy_attrs(xml_rsc, rsc_entry, pcmk__xaf_none); - crm_xml_add(xml_rsc, PCMK_XA_ID, rsc_id); - crm_log_xml_debug(xml_rsc, "Orphan resource"); + pcmk__xe_set(xml_rsc, PCMK_XA_ID, rsc_id); + pcmk__log_xml_debug(xml_rsc, "Orphan resource"); if (pe__unpack_resource(xml_rsc, &rsc, NULL, scheduler) != pcmk_rc_ok) { return NULL; @@ -1997,7 +2019,7 @@ create_fake_resource(const char *rsc_id, const xmlNode *rsc_entry, if (xml_contains_remote_node(xml_rsc)) { pcmk_node_t *node; - crm_debug("Detected orphaned remote node %s", rsc_id); + pcmk__debug("Detected orphaned remote node %s", rsc_id); node = pcmk_find_node(scheduler, rsc_id); if (node == NULL) { node = pe_create_node(rsc_id, rsc_id, PCMK_VALUE_REMOTE, 0, @@ -2006,15 +2028,17 @@ create_fake_resource(const char *rsc_id, const xmlNode *rsc_entry, link_rsc2remotenode(scheduler, rsc); if (node) { - crm_trace("Setting node %s as shutting down due to orphaned connection resource", rsc_id); + pcmk__trace("Setting node %s as shutting down due to orphaned " + "connection resource", + rsc_id); node->details->shutdown = TRUE; } } - if (crm_element_value(rsc_entry, PCMK__META_CONTAINER)) { + if (pcmk__xe_get(rsc_entry, PCMK__META_CONTAINER)) { // This removed resource needs to be mapped to a launcher - crm_trace("Launched resource %s was removed from the configuration", - rsc_id); + pcmk__trace("Launched resource %s was removed from the configuration", + rsc_id); pcmk__set_rsc_flags(rsc, pcmk__rsc_removed_launched); } pcmk__set_rsc_flags(rsc, pcmk__rsc_removed); @@ -2128,9 +2152,10 @@ find_anonymous_clone(pcmk_scheduler_t *scheduler, const pcmk_node_t *node, * numbers available. */ if (rsc->priv->active_nodes != NULL) { - crm_notice("Active (now-)anonymous clone %s has " - "multiple (orphan) instance histories on %s", - parent->id, pcmk__node_name(node)); + pcmk__notice("Active (now-)anonymous clone %s has " + "multiple (orphan) instance histories on " + "%s", + parent->id, pcmk__node_name(node)); skip_inactive = TRUE; rsc = NULL; } else { @@ -2143,7 +2168,7 @@ find_anonymous_clone(pcmk_scheduler_t *scheduler, const pcmk_node_t *node, } else { pcmk__rsc_trace(parent, "Resource %s, skip inactive", child->id); if (!skip_inactive && !inactive_instance - && !pcmk_is_set(child->flags, pcmk__rsc_blocked)) { + && !pcmk__is_set(child->flags, pcmk__rsc_blocked)) { // Remember one inactive instance in case we don't find active inactive_instance = parent->priv->fns->find_rsc(child, rsc_id, NULL, @@ -2184,7 +2209,7 @@ find_anonymous_clone(pcmk_scheduler_t *scheduler, const pcmk_node_t *node, * @TODO Ideally, we'd use an inactive instance number if it is not needed * for any clean instances. However, we don't know that at this point. */ - if ((rsc != NULL) && !pcmk_is_set(rsc->flags, pcmk__rsc_needs_fencing) + if ((rsc != NULL) && !pcmk__is_set(rsc->flags, pcmk__rsc_needs_fencing) && (!node->details->online || node->details->unclean) && !pcmk__is_guest_or_bundle_node(node) && !pe__is_universal_clone(parent, scheduler)) { @@ -2206,7 +2231,7 @@ unpack_find_resource(pcmk_scheduler_t *scheduler, const pcmk_node_t *node, pcmk_resource_t *rsc = NULL; pcmk_resource_t *parent = NULL; - crm_trace("looking for %s", rsc_id); + pcmk__trace("looking for %s", rsc_id); rsc = pe_find_resource(scheduler->priv->resources, rsc_id); if (rsc == NULL) { @@ -2218,19 +2243,22 @@ unpack_find_resource(pcmk_scheduler_t *scheduler, const pcmk_node_t *node, pcmk_resource_t *clone0 = pe_find_resource(scheduler->priv->resources, clone0_id); - if (clone0 && !pcmk_is_set(clone0->flags, pcmk__rsc_unique)) { + if ((clone0 != NULL) + && !pcmk__is_set(clone0->flags, pcmk__rsc_unique)) { + rsc = clone0; parent = uber_parent(clone0); - crm_trace("%s found as %s (%s)", rsc_id, clone0_id, parent->id); + pcmk__trace("%s found as %s (%s)", rsc_id, clone0_id, parent->id); } else { - crm_trace("%s is not known as %s either (orphan)", - rsc_id, clone0_id); + pcmk__trace("%s is not known as %s either (orphan)", + rsc_id, clone0_id); } free(clone0_id); } else if (rsc->priv->variant > pcmk__rsc_variant_primitive) { - crm_trace("Resource history for %s is orphaned " - "because it is no longer primitive", rsc_id); + pcmk__trace("Resource history for %s is orphaned " + "because it is no longer primitive", + rsc_id); return NULL; } else { @@ -2253,10 +2281,12 @@ unpack_find_resource(pcmk_scheduler_t *scheduler, const pcmk_node_t *node, if (rsc && !pcmk__str_eq(rsc_id, rsc->id, pcmk__str_none) && !pcmk__str_eq(rsc_id, rsc->priv->history_id, pcmk__str_none)) { + const bool removed = pcmk__is_set(rsc->flags, pcmk__rsc_removed); + pcmk__str_update(&(rsc->priv->history_id), rsc_id); pcmk__rsc_debug(rsc, "Internally renamed %s on %s to %s%s", rsc_id, pcmk__node_name(node), rsc->id, - pcmk_is_set(rsc->flags, pcmk__rsc_removed)? " (ORPHAN)" : ""); + (removed? " (ORPHAN)" : "")); } return rsc; } @@ -2266,16 +2296,16 @@ process_orphan_resource(const xmlNode *rsc_entry, const pcmk_node_t *node, pcmk_scheduler_t *scheduler) { pcmk_resource_t *rsc = NULL; - const char *rsc_id = crm_element_value(rsc_entry, PCMK_XA_ID); + const char *rsc_id = pcmk__xe_get(rsc_entry, PCMK_XA_ID); - crm_debug("Detected orphan resource %s on %s", - rsc_id, pcmk__node_name(node)); + pcmk__debug("Detected orphan resource %s on %s", rsc_id, + pcmk__node_name(node)); rsc = create_fake_resource(rsc_id, rsc_entry, scheduler); if (rsc == NULL) { return NULL; } - if (!pcmk_is_set(scheduler->flags, pcmk__sched_stop_removed_resources)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_stop_removed_resources)) { pcmk__clear_rsc_flags(rsc, pcmk__rsc_managed); } else { @@ -2320,7 +2350,7 @@ process_rsc_state(pcmk_resource_t *rsc, pcmk_node_t *node, g_hash_table_insert(iter->priv->probed_nodes, (gpointer) n->priv->id, n); } - if (pcmk_is_set(iter->flags, pcmk__rsc_unique)) { + if (pcmk__is_set(iter->flags, pcmk__rsc_unique)) { break; } iter = iter->priv->parent; @@ -2329,7 +2359,7 @@ process_rsc_state(pcmk_resource_t *rsc, pcmk_node_t *node, /* If a managed resource is believed to be running, but node is down ... */ if (known_active && !node->details->online && !node->details->maintenance - && pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + && pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { gboolean should_fence = FALSE; @@ -2344,11 +2374,12 @@ process_rsc_state(pcmk_resource_t *rsc, pcmk_node_t *node, pcmk__set_rsc_flags(rsc, pcmk__rsc_failed|pcmk__rsc_stop_if_failed); should_fence = TRUE; - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + } else if (pcmk__is_set(scheduler->flags, + pcmk__sched_fencing_enabled)) { if (pcmk__is_remote_node(node) && (node->priv->remote != NULL) - && !pcmk_is_set(node->priv->remote->flags, - pcmk__rsc_failed)) { + && !pcmk__is_set(node->priv->remote->flags, + pcmk__rsc_failed)) { /* Setting unseen means that fencing of the remote node will * occur only if the connection resource is not going to start @@ -2357,17 +2388,20 @@ process_rsc_state(pcmk_resource_t *rsc, pcmk_node_t *node, * remote nodes to be fenced as well. */ pcmk__clear_node_flags(node, pcmk__node_seen); - reason = crm_strdup_printf("%s is active there (fencing will be" - " revoked if remote connection can " - "be re-established elsewhere)", - rsc->id); + reason = pcmk__assert_asprintf("%s is active there (fencing " + "will be revoked if remote " + "connection can be " + "re-established elsewhere)", + rsc->id); } should_fence = TRUE; } if (should_fence) { if (reason == NULL) { - reason = crm_strdup_printf("%s is thought to be active there", rsc->id); + reason = pcmk__assert_asprintf("%s is thought to be active " + "there", + rsc->id); } pe_fence_node(scheduler, node, reason, FALSE); } @@ -2398,7 +2432,7 @@ process_rsc_state(pcmk_resource_t *rsc, pcmk_node_t *node, /* treat it as if it is still running * but also mark the node as unclean */ - reason = crm_strdup_printf("%s failed there", rsc->id); + reason = pcmk__assert_asprintf("%s failed there", rsc->id); pe_fence_node(scheduler, node, reason, FALSE); free(reason); break; @@ -2457,14 +2491,14 @@ process_rsc_state(pcmk_resource_t *rsc, pcmk_node_t *node, case pcmk__on_fail_reset_remote: pcmk__set_rsc_flags(rsc, pcmk__rsc_failed|pcmk__rsc_stop_if_failed); - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { tmpnode = NULL; - if (pcmk_is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_is_remote_connection)) { tmpnode = pcmk_find_node(scheduler, rsc->id); } if (pcmk__is_remote_node(tmpnode) - && !pcmk_is_set(tmpnode->priv->flags, - pcmk__node_remote_fenced)) { + && !pcmk__is_set(tmpnode->priv->flags, + pcmk__node_remote_fenced)) { /* The remote connection resource failed in a way that * should result in fencing the remote node. */ @@ -2491,8 +2525,8 @@ process_rsc_state(pcmk_resource_t *rsc, pcmk_node_t *node, * in a fencing operation regardless if we're going to attempt to reconnect * in this transition. */ - if (pcmk_all_flags_set(rsc->flags, - pcmk__rsc_failed|pcmk__rsc_is_remote_connection)) { + if (pcmk__all_flags_set(rsc->flags, + pcmk__rsc_failed|pcmk__rsc_is_remote_connection)) { tmpnode = pcmk_find_node(scheduler, rsc->id); if (tmpnode && tmpnode->details->unclean) { pcmk__set_node_flags(tmpnode, pcmk__node_seen); @@ -2500,15 +2534,16 @@ process_rsc_state(pcmk_resource_t *rsc, pcmk_node_t *node, } if (known_active) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { - crm_notice("Removed resource %s is active on %s and will be " - "stopped when possible", - rsc->id, pcmk__node_name(node)); + if (pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { + pcmk__notice("Removed resource %s is active on %s and will be " + "stopped when possible", + rsc->id, pcmk__node_name(node)); } else { - crm_notice("Removed resource %s must be stopped manually on %s " - "because " PCMK_OPT_STOP_ORPHAN_RESOURCES - " is set to false", rsc->id, pcmk__node_name(node)); + pcmk__notice("Removed resource %s must be stopped manually on " + "%s because " PCMK_OPT_STOP_ORPHAN_RESOURCES " is " + "set to false", + rsc->id, pcmk__node_name(node)); } } @@ -2608,20 +2643,20 @@ process_recurring(pcmk_node_t *node, pcmk_resource_t *rsc, continue; } - crm_element_value_ms(rsc_op, PCMK_META_INTERVAL, &interval_ms); + pcmk__xe_get_guint(rsc_op, PCMK_META_INTERVAL, &interval_ms); if (interval_ms == 0) { pcmk__rsc_trace(rsc, "Skipping %s on %s: non-recurring", id, pcmk__node_name(node)); continue; } - status = crm_element_value(rsc_op, PCMK__XA_OP_STATUS); + status = pcmk__xe_get(rsc_op, PCMK__XA_OP_STATUS); if (pcmk__str_eq(status, "-1", pcmk__str_casei)) { pcmk__rsc_trace(rsc, "Skipping %s on %s: status", id, pcmk__node_name(node)); continue; } - task = crm_element_value(rsc_op, PCMK_XA_OPERATION); + task = pcmk__xe_get(rsc_op, PCMK_XA_OPERATION); /* create the action */ key = pcmk__op_key(rsc->id, task, interval_ms); pcmk__rsc_trace(rsc, "Creating %s on %s", key, pcmk__node_name(node)); @@ -2647,8 +2682,8 @@ calculate_active_ops(const GList *sorted_op_list, int *start_index, counter++; - task = crm_element_value(rsc_op, PCMK_XA_OPERATION); - status = crm_element_value(rsc_op, PCMK__XA_OP_STATUS); + task = pcmk__xe_get(rsc_op, PCMK_XA_OPERATION); + status = pcmk__xe_get(rsc_op, PCMK__XA_OP_STATUS); if (pcmk__str_eq(task, PCMK_ACTION_STOP, pcmk__str_casei) && pcmk__str_eq(status, "0", pcmk__str_casei)) { @@ -2661,7 +2696,7 @@ calculate_active_ops(const GList *sorted_op_list, int *start_index, } else if ((implied_monitor_start <= *stop_index) && pcmk__str_eq(task, PCMK_ACTION_MONITOR, pcmk__str_casei)) { - const char *rc = crm_element_value(rsc_op, PCMK__XA_RC_CODE); + const char *rc = pcmk__xe_get(rsc_op, PCMK__XA_RC_CODE); if (pcmk__strcase_any_of(rc, "0", "8", NULL)) { implied_monitor_start = counter; @@ -2687,20 +2722,25 @@ unpack_shutdown_lock(const xmlNode *rsc_entry, pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk_scheduler_t *scheduler) { time_t lock_time = 0; // When lock started (i.e. node shutdown time) + time_t sched_time = 0; + guint shutdown_lock_ms = scheduler->priv->shutdown_lock_ms; - if ((crm_element_value_epoch(rsc_entry, PCMK_OPT_SHUTDOWN_LOCK, - &lock_time) == pcmk_ok) && (lock_time != 0)) { + pcmk__xe_get_time(rsc_entry, PCMK_OPT_SHUTDOWN_LOCK, &lock_time); + if (lock_time == 0) { + return; + } - if ((scheduler->priv->shutdown_lock_ms > 0U) - && (pcmk__scheduler_epoch_time(scheduler) - > (lock_time + pcmk__timeout_ms2s(scheduler->priv->shutdown_lock_ms)))) { - pcmk__rsc_info(rsc, "Shutdown lock for %s on %s expired", - rsc->id, pcmk__node_name(node)); - pe__clear_resource_history(rsc, node); - } else { - rsc->priv->lock_node = node; - rsc->priv->lock_time = lock_time; - } + sched_time = pcmk__scheduler_epoch_time(scheduler); + if ((shutdown_lock_ms > 0U) + && (sched_time > (lock_time + pcmk__timeout_ms2s(shutdown_lock_ms)))) { + + pcmk__rsc_info(rsc, "Shutdown lock for %s on %s expired", + rsc->id, pcmk__node_name(node)); + pe__clear_resource_history(rsc, node); + + } else { + rsc->priv->lock_node = node; + rsc->priv->lock_time = lock_time; } } @@ -2738,11 +2778,11 @@ unpack_lrm_resource(pcmk_node_t *node, const xmlNode *lrm_resource, if (rsc_id == NULL) { pcmk__config_err("Ignoring invalid " PCMK__XE_LRM_RESOURCE " entry: No " PCMK_XA_ID); - crm_log_xml_info(lrm_resource, "missing-id"); + pcmk__log_xml_info(lrm_resource, "missing-id"); return NULL; } - crm_trace("Unpacking " PCMK__XE_LRM_RESOURCE " for %s on %s", - rsc_id, pcmk__node_name(node)); + pcmk__trace("Unpacking " PCMK__XE_LRM_RESOURCE " for %s on %s", rsc_id, + pcmk__node_name(node)); /* Build a list of individual PCMK__XE_LRM_RSC_OP entries, so we can sort * them @@ -2754,7 +2794,7 @@ unpack_lrm_resource(pcmk_node_t *node, const xmlNode *lrm_resource, op_list = g_list_prepend(op_list, rsc_op); } - if (!pcmk_is_set(scheduler->flags, pcmk__sched_shutdown_lock)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_shutdown_lock)) { if (op_list == NULL) { // If there are no operations, there is nothing to do return NULL; @@ -2774,7 +2814,7 @@ unpack_lrm_resource(pcmk_node_t *node, const xmlNode *lrm_resource, pcmk__assert(rsc != NULL); // Check whether the resource is "shutdown-locked" to this node - if (pcmk_is_set(scheduler->flags, pcmk__sched_shutdown_lock)) { + if (pcmk__is_set(scheduler->flags, pcmk__sched_shutdown_lock)) { unpack_shutdown_lock(lrm_resource, rsc, node, scheduler); } @@ -2836,8 +2876,8 @@ handle_removed_launched_resources(const xmlNode *lrm_rsc_list, const char *rsc_id; const char *launcher_id = NULL; - launcher_id = crm_element_value(rsc_entry, PCMK__META_CONTAINER); - rsc_id = crm_element_value(rsc_entry, PCMK_XA_ID); + launcher_id = pcmk__xe_get(rsc_entry, PCMK__META_CONTAINER); + rsc_id = pcmk__xe_get(rsc_entry, PCMK_XA_ID); if ((launcher_id == NULL) || (rsc_id == NULL)) { continue; } @@ -2849,7 +2889,7 @@ handle_removed_launched_resources(const xmlNode *lrm_rsc_list, rsc = pe_find_resource(scheduler->priv->resources, rsc_id); if ((rsc == NULL) || (rsc->priv->launcher != NULL) - || !pcmk_is_set(rsc->flags, pcmk__rsc_removed_launched)) { + || !pcmk__is_set(rsc->flags, pcmk__rsc_removed_launched)) { continue; } @@ -2895,7 +2935,7 @@ unpack_node_lrm(pcmk_node_t *node, const xmlNode *xml, pcmk_resource_t *rsc = unpack_lrm_resource(node, rsc_entry, scheduler); if ((rsc != NULL) - && pcmk_is_set(rsc->flags, pcmk__rsc_removed_launched)) { + && pcmk__is_set(rsc->flags, pcmk__rsc_removed_launched)) { found_removed_launched_resource = true; } } @@ -2913,7 +2953,7 @@ set_active(pcmk_resource_t *rsc) { const pcmk_resource_t *top = pe__const_top_resource(rsc, false); - if (top && pcmk_is_set(top->flags, pcmk__rsc_promotable)) { + if ((top != NULL) && pcmk__is_set(top->flags, pcmk__rsc_promotable)) { rsc->priv->orig_role = pcmk_role_unpromoted; } else { rsc->priv->orig_role = pcmk_role_started; @@ -2975,8 +3015,8 @@ find_lrm_op(const char *resource, const char *op, const char *node, const char * int rc = PCMK_OCF_UNKNOWN_ERROR; int status = PCMK_EXEC_ERROR; - crm_element_value_int(xml, PCMK__XA_RC_CODE, &rc); - crm_element_value_int(xml, PCMK__XA_OP_STATUS, &status); + pcmk__xe_get_int(xml, PCMK__XA_RC_CODE, &rc); + pcmk__xe_get_int(xml, PCMK__XA_OP_STATUS, &status); if ((rc != target_rc) || (status != PCMK_EXEC_DONE)) { return NULL; } @@ -3021,11 +3061,12 @@ unknown_on_node(pcmk_resource_t *rsc, const char *node_name) xmlXPathObject *search; char *xpath = NULL; - xpath = crm_strdup_printf(XPATH_NODE_STATE "[@" PCMK_XA_UNAME "='%s']" - SUB_XPATH_LRM_RESOURCE "[@" PCMK_XA_ID "='%s']" - SUB_XPATH_LRM_RSC_OP - "[@" PCMK__XA_RC_CODE "!='%d']", - node_name, rsc->id, PCMK_OCF_UNKNOWN); + xpath = pcmk__assert_asprintf(XPATH_NODE_STATE "[@" PCMK_XA_UNAME "='%s']" + SUB_XPATH_LRM_RESOURCE + "[@" PCMK_XA_ID "='%s']" + SUB_XPATH_LRM_RSC_OP + "[@" PCMK__XA_RC_CODE "!='%d']", + node_name, rsc->id, PCMK_OCF_UNKNOWN); search = pcmk__xpath_search(rsc->priv->scheduler->input->doc, xpath); result = (pcmk__xpath_num_results(search) == 0); @@ -3092,7 +3133,7 @@ non_monitor_after(const char *rsc_id, const char *node_name, continue; } - task = crm_element_value(op, PCMK_XA_OPERATION); + task = pcmk__xe_get(op, PCMK_XA_OPERATION); if (pcmk__str_any_of(task, PCMK_ACTION_START, PCMK_ACTION_STOP, PCMK_ACTION_MIGRATE_TO, PCMK_ACTION_MIGRATE_FROM, @@ -3125,7 +3166,7 @@ newer_state_after_migrate(const char *rsc_id, const char *node_name, pcmk_scheduler_t *scheduler) { const xmlNode *xml_op = (migrate_from != NULL)? migrate_from : migrate_to; - const char *source = crm_element_value(xml_op, PCMK__META_MIGRATE_SOURCE); + const char *source = pcmk__xe_get(xml_op, PCMK__META_MIGRATE_SOURCE); /* It's preferred to compare to the migrate event on the same node if * existing, since call ids are more reliable. @@ -3161,8 +3202,8 @@ get_migration_node_names(const xmlNode *entry, const pcmk_node_t *source_node, const pcmk_node_t *target_node, const char **source_name, const char **target_name) { - *source_name = crm_element_value(entry, PCMK__META_MIGRATE_SOURCE); - *target_name = crm_element_value(entry, PCMK__META_MIGRATE_TARGET); + *source_name = pcmk__xe_get(entry, PCMK__META_MIGRATE_SOURCE); + *target_name = pcmk__xe_get(entry, PCMK__META_MIGRATE_TARGET); if ((*source_name == NULL) || (*target_name == NULL)) { pcmk__config_err("Ignoring resource history entry %s without " PCMK__META_MIGRATE_SOURCE " and " @@ -3288,8 +3329,8 @@ unpack_migrate_to_success(struct action_history *history) */ return; } - crm_element_value_int(migrate_from, PCMK__XA_RC_CODE, &from_rc); - crm_element_value_int(migrate_from, PCMK__XA_OP_STATUS, &from_status); + pcmk__xe_get_int(migrate_from, PCMK__XA_RC_CODE, &from_rc); + pcmk__xe_get_int(migrate_from, PCMK__XA_OP_STATUS, &from_status); } /* If the resource has newer state on both the source and target after the @@ -3502,21 +3543,21 @@ record_failed_op(struct action_history *history) xIter != NULL; xIter = xIter->next) { const char *key = pcmk__xe_history_key(xIter); - const char *uname = crm_element_value(xIter, PCMK_XA_UNAME); + const char *uname = pcmk__xe_get(xIter, PCMK_XA_UNAME); if (pcmk__str_eq(history->key, key, pcmk__str_none) && pcmk__str_eq(uname, history->node->priv->name, pcmk__str_casei)) { - crm_trace("Skipping duplicate entry %s on %s", - history->key, pcmk__node_name(history->node)); + pcmk__trace("Skipping duplicate entry %s on %s", history->key, + pcmk__node_name(history->node)); return; } } - crm_trace("Adding entry for %s on %s to failed action list", - history->key, pcmk__node_name(history->node)); - crm_xml_add(history->xml, PCMK_XA_UNAME, history->node->priv->name); - crm_xml_add(history->xml, PCMK__XA_RSC_ID, history->rsc->id); + pcmk__trace("Adding entry for %s on %s to failed action list", + history->key, pcmk__node_name(history->node)); + pcmk__xe_set(history->xml, PCMK_XA_UNAME, history->node->priv->name); + pcmk__xe_set(history->xml, PCMK__XA_RSC_ID, history->rsc->id); pcmk__xml_copy(scheduler->priv->failed, history->xml); } @@ -3526,8 +3567,8 @@ last_change_str(const xmlNode *xml_op) time_t when; char *result = NULL; - if (crm_element_value_epoch(xml_op, PCMK_XA_LAST_RC_CHANGE, - &when) == pcmk_ok) { + if (pcmk__xe_get_time(xml_op, PCMK_XA_LAST_RC_CHANGE, + &when) == pcmk_rc_ok) { char *when_s = pcmk__epoch2str(&when, 0); const char *p = strchr(when_s, ' '); @@ -3570,7 +3611,7 @@ ban_from_all_nodes(pcmk_resource_t *rsc) } // Ban the resource from all nodes - crm_notice("%s will not be started under current conditions", rsc->id); + pcmk__notice("%s will not be started under current conditions", rsc->id); if (rsc->priv->allowed_nodes != NULL) { g_hash_table_destroy(rsc->priv->allowed_nodes); } @@ -3632,16 +3673,16 @@ unpack_rsc_op_failure(struct action_history *history, is_probe = pcmk_xe_is_probe(history->xml); last_change_s = last_change_str(history->xml); - if (!pcmk_is_set(scheduler->flags, pcmk__sched_symmetric_cluster) + if (!pcmk__is_set(scheduler->flags, pcmk__sched_symmetric_cluster) && (history->exit_status == PCMK_OCF_NOT_INSTALLED)) { - crm_trace("Unexpected result (%s%s%s) was recorded for " - "%s of %s on %s at %s " QB_XS " exit-status=%d id=%s", - crm_exit_str(history->exit_status), - (pcmk__str_empty(history->exit_reason)? "" : ": "), - pcmk__s(history->exit_reason, ""), - (is_probe? "probe" : history->task), history->rsc->id, - pcmk__node_name(history->node), last_change_s, - history->exit_status, history->id); + pcmk__trace("Unexpected result (%s%s%s) was recorded for " + "%s of %s on %s at %s " QB_XS " exit-status=%d id=%s", + crm_exit_str(history->exit_status), + (pcmk__str_empty(history->exit_reason)? "" : ": "), + pcmk__s(history->exit_reason, ""), + (is_probe? "probe" : history->task), history->rsc->id, + pcmk__node_name(history->node), last_change_s, + history->exit_status, history->id); } else { pcmk__sched_warn(scheduler, "Unexpected result (%s%s%s) was recorded for %s of " @@ -3660,10 +3701,10 @@ unpack_rsc_op_failure(struct action_history *history, /* A failed (not just unexpected) probe result could mean the user * didn't know resources will be probed even where they can't run. */ - crm_notice("If it is not possible for %s to run on %s, see " - "the " PCMK_XA_RESOURCE_DISCOVERY " option for location " - "constraints", - history->rsc->id, pcmk__node_name(history->node)); + pcmk__notice("If it is not possible for %s to run on %s, see the " + PCMK_XA_RESOURCE_DISCOVERY " option for location " + "constraints", + history->rsc->id, pcmk__node_name(history->node)); } record_failed_op(history); @@ -3927,7 +3968,7 @@ remap_operation(struct action_history *history, case PCMK_OCF_NOT_RUNNING: if (is_probe || (history->expected_exit_status == history->exit_status) - || !pcmk_is_set(history->rsc->flags, pcmk__rsc_managed)) { + || !pcmk__is_set(history->rsc->flags, pcmk__rsc_managed)) { /* For probes, recurring monitors for the Stopped role, and * unmanaged resources, "not running" is not considered a @@ -3973,8 +4014,8 @@ remap_operation(struct action_history *history, case PCMK_OCF_UNIMPLEMENT_FEATURE: { guint interval_ms = 0; - crm_element_value_ms(history->xml, PCMK_META_INTERVAL, - &interval_ms); + pcmk__xe_get_guint(history->xml, PCMK_META_INTERVAL, + &interval_ms); if (interval_ms == 0) { if (!expired) { @@ -4002,10 +4043,10 @@ remap_operation(struct action_history *history, if (history->execution_status == PCMK_EXEC_DONE) { char *last_change_s = last_change_str(history->xml); - crm_info("Treating unknown exit status %d from %s of %s " - "on %s at %s as failure", - history->exit_status, task, history->rsc->id, - pcmk__node_name(history->node), last_change_s); + pcmk__info("Treating unknown exit status %d from %s of %s on " + "%s at %s as failure", + history->exit_status, task, history->rsc->id, + pcmk__node_name(history->node), last_change_s); remap_because(history, &why, PCMK_EXEC_ERROR, "unknown exit status"); free(last_change_s); @@ -4045,10 +4086,10 @@ should_clear_for_param_change(const xmlNode *xml_op, const char *task, rsc->priv->scheduler); switch (digest_data->rc) { case pcmk__digest_unknown: - crm_trace("Resource %s history entry %s on %s" - " has no digest to compare", - rsc->id, pcmk__xe_history_key(xml_op), - node->priv->id); + pcmk__trace("Resource %s history entry %s on %s" + " has no digest to compare", + rsc->id, pcmk__xe_history_key(xml_op), + node->priv->id); break; case pcmk__digest_match: break; @@ -4100,19 +4141,20 @@ should_ignore_failure_timeout(const pcmk_resource_t *rsc, const char *task, * if the remote node hasn't been fenced. */ if ((rsc->priv->remote_reconnect_ms > 0U) - && pcmk_is_set(rsc->priv->scheduler->flags, - pcmk__sched_fencing_enabled) + && pcmk__is_set(rsc->priv->scheduler->flags, + pcmk__sched_fencing_enabled) && (interval_ms != 0) && pcmk__str_eq(task, PCMK_ACTION_MONITOR, pcmk__str_casei)) { pcmk_node_t *remote_node = pcmk_find_node(rsc->priv->scheduler, rsc->id); - if (remote_node && !pcmk_is_set(remote_node->priv->flags, - pcmk__node_remote_fenced)) { + if (remote_node && !pcmk__is_set(remote_node->priv->flags, + pcmk__node_remote_fenced)) { if (is_last_failure) { - crm_info("Waiting to clear monitor failure for remote node %s" - " until fencing has occurred", rsc->id); + pcmk__info("Waiting to clear monitor failure for remote node %s" + " until fencing has occurred", + rsc->id); } return TRUE; } @@ -4159,8 +4201,8 @@ check_operation_expiry(struct action_history *history) } if ((expiration_sec > 0) - && (crm_element_value_epoch(history->xml, PCMK_XA_LAST_RC_CHANGE, - &last_run) == 0)) { + && (pcmk__xe_get_time(history->xml, PCMK_XA_LAST_RC_CHANGE, + &last_run) == pcmk_rc_ok)) { /* Resource has a PCMK_META_FAILURE_TIMEOUT and history entry has a * timestamp @@ -4184,12 +4226,12 @@ check_operation_expiry(struct action_history *history) history->xml); // Update scheduler recheck time according to *last* failure - crm_trace("%s@%lld is %sexpired @%lld with unexpired_failures=%d " - "expiration=%s last-failure@%lld", - history->id, (long long) last_run, (expired? "" : "not "), - (long long) now, unexpired_fail_count, - pcmk__readable_interval(expiration_sec * 1000), - (long long) last_failure); + pcmk__trace("%s@%lld is %sexpired @%lld with unexpired_failures=%d " + "expiration=%s last-failure@%lld", + history->id, (long long) last_run, (expired? "" : "not "), + (long long) now, unexpired_fail_count, + pcmk__readable_interval(expiration_sec * 1000), + (long long) last_failure); last_failure += expiration_sec + 1; if (unexpired_fail_count && (now < last_failure)) { pcmk__update_recheck_time(last_failure, scheduler, @@ -4242,7 +4284,7 @@ check_operation_expiry(struct action_history *history) clear_op = pe__clear_failcount(history->rsc, history->node, clear_reason, scheduler); - if (pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled) + if (pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled) && (history->rsc->priv->remote_reconnect_ms > 0)) { /* If we're clearing a remote connection due to a reconnect * interval, we want to wait until any scheduled fencing @@ -4252,9 +4294,9 @@ check_operation_expiry(struct action_history *history) * this point, that's always true (it won't be reliable until * after unpack_node_history() is done). */ - crm_info("Clearing %s failure will wait until any scheduled " - "fencing of %s completes", - history->task, history->rsc->id); + pcmk__info("Clearing %s failure will wait until any scheduled " + "fencing of %s completes", + history->task, history->rsc->id); order_after_remote_fencing(clear_op, history->rsc, scheduler); } } @@ -4284,7 +4326,7 @@ int pe__target_rc_from_xml(const xmlNode *xml_op) { int target_rc = 0; - const char *key = crm_element_value(xml_op, PCMK__XA_TRANSITION_KEY); + const char *key = pcmk__xe_get(xml_op, PCMK__XA_TRANSITION_KEY); if (key == NULL) { return -1; @@ -4436,8 +4478,8 @@ can_affect_state(struct action_history *history) static int unpack_action_result(struct action_history *history) { - if ((crm_element_value_int(history->xml, PCMK__XA_OP_STATUS, - &(history->execution_status)) < 0) + if ((pcmk__xe_get_int(history->xml, PCMK__XA_OP_STATUS, + &(history->execution_status)) != pcmk_rc_ok) || (history->execution_status < PCMK_EXEC_PENDING) || (history->execution_status > PCMK_EXEC_MAX) || (history->execution_status == PCMK_EXEC_CANCELLED)) { @@ -4445,24 +4487,22 @@ unpack_action_result(struct action_history *history) "with invalid " PCMK__XA_OP_STATUS " '%s'", history->id, history->rsc->id, pcmk__node_name(history->node), - pcmk__s(crm_element_value(history->xml, - PCMK__XA_OP_STATUS), + pcmk__s(pcmk__xe_get(history->xml, PCMK__XA_OP_STATUS), "")); return pcmk_rc_unpack_error; } - if ((crm_element_value_int(history->xml, PCMK__XA_RC_CODE, - &(history->exit_status)) < 0) + if ((pcmk__xe_get_int(history->xml, PCMK__XA_RC_CODE, + &(history->exit_status)) != pcmk_rc_ok) || (history->exit_status < 0) || (history->exit_status > CRM_EX_MAX)) { pcmk__config_err("Ignoring resource history entry %s for %s on %s " "with invalid " PCMK__XA_RC_CODE " '%s'", history->id, history->rsc->id, pcmk__node_name(history->node), - pcmk__s(crm_element_value(history->xml, - PCMK__XA_RC_CODE), + pcmk__s(pcmk__xe_get(history->xml, PCMK__XA_RC_CODE), "")); return pcmk_rc_unpack_error; } - history->exit_reason = crm_element_value(history->xml, PCMK_XA_EXIT_REASON); + history->exit_reason = pcmk__xe_get(history->xml, PCMK_XA_EXIT_REASON); return pcmk_rc_ok; } @@ -4486,10 +4526,10 @@ process_expired_result(struct action_history *history, int orig_exit_status) if (history->rsc->priv->orig_role <= pcmk_role_stopped) { history->rsc->priv->orig_role = pcmk_role_unknown; } - crm_trace("Ignoring resource history entry %s for probe of %s on %s: " - "Masked failure expired", - history->id, history->rsc->id, - pcmk__node_name(history->node)); + pcmk__trace("Ignoring resource history entry %s for probe of %s on %s: " + "Masked failure expired", + history->id, history->rsc->id, + pcmk__node_name(history->node)); return pcmk_rc_ok; } @@ -4498,10 +4538,10 @@ process_expired_result(struct action_history *history, int orig_exit_status) } if (history->interval_ms == 0) { - crm_notice("Ignoring resource history entry %s for %s of %s on %s: " - "Expired failure", - history->id, history->task, history->rsc->id, - pcmk__node_name(history->node)); + pcmk__notice("Ignoring resource history entry %s for %s of %s on %s: " + "Expired failure", + history->id, history->task, history->rsc->id, + pcmk__node_name(history->node)); return pcmk_rc_ok; } @@ -4516,12 +4556,13 @@ process_expired_result(struct action_history *history, int orig_exit_status) * scheduler regression test doesn't, but that may not be a * realistic scenario in production). */ - crm_notice("Rescheduling %s-interval %s of %s on %s " - "after failure expired", - pcmk__readable_interval(history->interval_ms), history->task, - history->rsc->id, pcmk__node_name(history->node)); - crm_xml_add(history->xml, PCMK__XA_OP_RESTART_DIGEST, - "calculated-failure-timeout"); + pcmk__notice("Rescheduling %s-interval %s of %s on %s after failure " + "expired", + pcmk__readable_interval(history->interval_ms), + history->task, history->rsc->id, + pcmk__node_name(history->node)); + pcmk__xe_set(history->xml, PCMK__XA_OP_RESTART_DIGEST, + "calculated-failure-timeout"); return pcmk_rc_ok; } @@ -4544,16 +4585,16 @@ mask_probe_failure(struct action_history *history, int orig_exit_status, { pcmk_resource_t *ban_rsc = history->rsc; - if (!pcmk_is_set(history->rsc->flags, pcmk__rsc_unique)) { + if (!pcmk__is_set(history->rsc->flags, pcmk__rsc_unique)) { ban_rsc = uber_parent(history->rsc); } - crm_notice("Treating probe result '%s' for %s on %s as 'not running'", - crm_exit_str(orig_exit_status), history->rsc->id, - pcmk__node_name(history->node)); + pcmk__notice("Treating probe result '%s' for %s on %s as 'not running'", + crm_exit_str(orig_exit_status), history->rsc->id, + pcmk__node_name(history->node)); update_resource_state(history, history->expected_exit_status, last_failure, on_fail); - crm_xml_add(history->xml, PCMK_XA_UNAME, history->node->priv->name); + pcmk__xe_set(history->xml, PCMK_XA_UNAME, history->node->priv->name); record_failed_op(history); resource_location(ban_rsc, history->node, -PCMK_SCORE_INFINITY, @@ -4585,21 +4626,20 @@ failure_is_newer(const struct action_history *history, } if (!pcmk__str_eq(history->task, - crm_element_value(last_failure, PCMK_XA_OPERATION), + pcmk__xe_get(last_failure, PCMK_XA_OPERATION), pcmk__str_none)) { return false; // last_failure is for different action } - if ((crm_element_value_ms(last_failure, PCMK_META_INTERVAL, - &failure_interval_ms) != pcmk_ok) + if ((pcmk__xe_get_guint(last_failure, PCMK_META_INTERVAL, + &failure_interval_ms) != pcmk_rc_ok) || (history->interval_ms != failure_interval_ms)) { return false; // last_failure is for action with different interval } - if ((pcmk__scan_ll(crm_element_value(history->xml, PCMK_XA_LAST_RC_CHANGE), + if ((pcmk__scan_ll(pcmk__xe_get(history->xml, PCMK_XA_LAST_RC_CHANGE), &this_change, 0LL) != pcmk_rc_ok) - || (pcmk__scan_ll(crm_element_value(last_failure, - PCMK_XA_LAST_RC_CHANGE), + || (pcmk__scan_ll(pcmk__xe_get(last_failure, PCMK_XA_LAST_RC_CHANGE), &failure_change, 0LL) != pcmk_rc_ok) || (failure_change < this_change)) { return false; // Failure is not known to be newer @@ -4647,8 +4687,7 @@ process_pending_action(struct action_history *history, const char *migrate_target = NULL; pcmk_node_t *target = NULL; - migrate_target = crm_element_value(history->xml, - PCMK__META_MIGRATE_TARGET); + migrate_target = pcmk__xe_get(history->xml, PCMK__META_MIGRATE_TARGET); target = pcmk_find_node(history->rsc->priv->scheduler, migrate_target); if (target != NULL) { @@ -4706,14 +4745,14 @@ unpack_rsc_op(pcmk_resource_t *rsc, pcmk_node_t *node, xmlNode *xml_op, } // Task and interval - history.task = crm_element_value(xml_op, PCMK_XA_OPERATION); + history.task = pcmk__xe_get(xml_op, PCMK_XA_OPERATION); if (history.task == NULL) { pcmk__config_err("Ignoring resource history entry %s for %s on %s " "without " PCMK_XA_OPERATION, history.id, rsc->id, pcmk__node_name(node)); return; } - crm_element_value_ms(xml_op, PCMK_META_INTERVAL, &(history.interval_ms)); + pcmk__xe_get_guint(xml_op, PCMK_META_INTERVAL, &(history.interval_ms)); if (!can_affect_state(&history)) { pcmk__rsc_trace(rsc, "Ignoring resource history entry %s for %s on %s " @@ -4729,7 +4768,7 @@ unpack_rsc_op(pcmk_resource_t *rsc, pcmk_node_t *node, xmlNode *xml_op, history.expected_exit_status = pe__target_rc_from_xml(xml_op); history.key = pcmk__xe_history_key(xml_op); - crm_element_value_int(xml_op, PCMK__XA_CALL_ID, &(history.call_id)); + pcmk__xe_get_int(xml_op, PCMK__XA_CALL_ID, &(history.call_id)); pcmk__rsc_trace(rsc, "Unpacking %s (%s call %d on %s): %s (%s)", history.id, history.task, history.call_id, @@ -4758,7 +4797,7 @@ unpack_rsc_op(pcmk_resource_t *rsc, pcmk_node_t *node, xmlNode *xml_op, goto done; } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { parent = uber_parent(rsc); } @@ -4775,12 +4814,12 @@ unpack_rsc_op(pcmk_resource_t *rsc, pcmk_node_t *node, xmlNode *xml_op, case PCMK_EXEC_NOT_INSTALLED: unpack_failure_handling(&history, &failure_strategy, &fail_role); if (failure_strategy == pcmk__on_fail_ignore) { - crm_warn("Cannot ignore failed %s of %s on %s: " - "Resource agent doesn't exist " - QB_XS " status=%d rc=%d id=%s", - history.task, rsc->id, pcmk__node_name(node), - history.execution_status, history.exit_status, - history.id); + pcmk__warn("Cannot ignore failed %s of %s on %s: Resource " + "agent doesn't exist " + QB_XS " status=%d rc=%d id=%s", + history.task, rsc->id, pcmk__node_name(node), + history.execution_status, history.exit_status, + history.id); /* Also for printing it as "FAILED" by marking it as * pcmk__rsc_failed later */ @@ -4794,8 +4833,8 @@ unpack_rsc_op(pcmk_resource_t *rsc, pcmk_node_t *node, xmlNode *xml_op, case PCMK_EXEC_NOT_CONNECTED: if (pcmk__is_pacemaker_remote_node(node) - && pcmk_is_set(node->priv->remote->flags, - pcmk__rsc_managed)) { + && pcmk__is_set(node->priv->remote->flags, + pcmk__rsc_managed)) { /* We should never get into a situation where a managed remote * connection resource is considered OK but a resource action * behind the connection gets a "not connected" status. But as a @@ -4826,17 +4865,17 @@ unpack_rsc_op(pcmk_resource_t *rsc, pcmk_node_t *node, xmlNode *xml_op, char *last_change_s = last_change_str(xml_op); - crm_warn("Pretending failed %s (%s%s%s) of %s on %s at %s succeeded " - QB_XS " %s", - history.task, crm_exit_str(history.exit_status), - (pcmk__str_empty(history.exit_reason)? "" : ": "), - pcmk__s(history.exit_reason, ""), rsc->id, - pcmk__node_name(node), last_change_s, history.id); + pcmk__warn("Pretending failed %s (%s%s%s) of %s on %s at %s succeeded " + QB_XS " %s", + history.task, crm_exit_str(history.exit_status), + (pcmk__str_empty(history.exit_reason)? "" : ": "), + pcmk__s(history.exit_reason, ""), rsc->id, + pcmk__node_name(node), last_change_s, history.id); free(last_change_s); update_resource_state(&history, history.expected_exit_status, *last_failure, on_fail); - crm_xml_add(xml_op, PCMK_XA_UNAME, node->priv->name); + pcmk__xe_set(xml_op, PCMK_XA_UNAME, node->priv->name); pcmk__set_rsc_flags(rsc, pcmk__rsc_ignore_failure); record_failed_op(&history); @@ -4908,7 +4947,7 @@ add_node_attrs(const xmlNode *xml_obj, pcmk_node_t *node, bool overwrite, pcmk_scheduler_t *scheduler) { const char *cluster_name = NULL; - const char *dc_id = crm_element_value(scheduler->input, PCMK_XA_DC_UUID); + const char *dc_id = pcmk__xe_get(scheduler->input, PCMK_XA_DC_UUID); const pcmk_rule_input_t rule_input = { .now = scheduler->priv->now, }; @@ -4995,8 +5034,8 @@ extract_operations(const char *node, const char *rsc, xmlNode * rsc_entry, gbool NULL); rsc_op != NULL; rsc_op = pcmk__xe_next(rsc_op, PCMK__XE_LRM_RSC_OP)) { - crm_xml_add(rsc_op, PCMK_XA_RESOURCE, rsc); - crm_xml_add(rsc_op, PCMK_XA_UNAME, node); + pcmk__xe_set(rsc_op, PCMK_XA_RESOURCE, rsc); + pcmk__xe_set(rsc_op, PCMK_XA_UNAME, node); op_list = g_list_prepend(op_list, rsc_op); } @@ -5022,11 +5061,11 @@ extract_operations(const char *node, const char *rsc, xmlNode * rsc_entry, gbool counter++; if (start_index < stop_index) { - crm_trace("Skipping %s: not active", pcmk__xe_id(rsc_entry)); + pcmk__trace("Skipping %s: not active", pcmk__xe_id(rsc_entry)); break; } else if (counter < start_index) { - crm_trace("Skipping %s: old", pcmk__xe_id(rsc_op)); + pcmk__trace("Skipping %s: old", pcmk__xe_id(rsc_op)); continue; } op_list = g_list_append(op_list, rsc_op); @@ -5058,7 +5097,7 @@ find_operations(const char *rsc, const char *node, gboolean active_filter, node_state != NULL; node_state = pcmk__xe_next(node_state, PCMK__XE_NODE_STATE)) { - const char *uname = crm_element_value(node_state, PCMK_XA_UNAME); + const char *uname = pcmk__xe_get(node_state, PCMK_XA_UNAME); if (node != NULL && !pcmk__str_eq(uname, node, pcmk__str_casei)) { continue; @@ -5077,7 +5116,7 @@ find_operations(const char *rsc, const char *node, gboolean active_filter, } if (this_node->details->online - || pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + || pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { /* offline nodes run no resources... * unless stonith is enabled in which case we need to * make sure rsc start events happen after the stonith @@ -5094,7 +5133,7 @@ find_operations(const char *rsc, const char *node, gboolean active_filter, lrm_rsc != NULL; lrm_rsc = pcmk__xe_next(lrm_rsc, PCMK__XE_LRM_RESOURCE)) { - const char *rsc_id = crm_element_value(lrm_rsc, PCMK_XA_ID); + const char *rsc_id = pcmk__xe_get(lrm_rsc, PCMK_XA_ID); if ((rsc != NULL) && !pcmk__str_eq(rsc_id, rsc, pcmk__str_none)) { diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c index 8a2e946c928..4d38b94e663 100644 --- a/lib/pengine/utils.c +++ b/lib/pengine/utils.c @@ -13,6 +13,8 @@ #include #include +#include // pcmk_unpack_nvpair_blocks() +#include // PCMK_SCORE_INFINITY #include #include @@ -50,13 +52,13 @@ pe_can_fence(const pcmk_scheduler_t *scheduler, const pcmk_node_t *node) } return true; - } else if (!pcmk_is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { + } else if (!pcmk__is_set(scheduler->flags, pcmk__sched_fencing_enabled)) { return false; /* Turned off */ - } else if (!pcmk_is_set(scheduler->flags, pcmk__sched_have_fencing)) { + } else if (!pcmk__is_set(scheduler->flags, pcmk__sched_have_fencing)) { return false; /* No devices */ - } else if (pcmk_is_set(scheduler->flags, pcmk__sched_quorate)) { + } else if (pcmk__is_set(scheduler->flags, pcmk__sched_quorate)) { return true; } else if (scheduler->no_quorum_policy == pcmk_no_quorum_ignore) { @@ -66,12 +68,13 @@ pe_can_fence(const pcmk_scheduler_t *scheduler, const pcmk_node_t *node) return false; } else if(node->details->online) { - crm_notice("We can fence %s without quorum because they're in our membership", - pcmk__node_name(node)); + pcmk__notice("We can fence %s without quorum because they're in our " + "membership", + pcmk__node_name(node)); return true; } - crm_trace("Cannot fence %s", pcmk__node_name(node)); + pcmk__trace("Cannot fence %s", pcmk__node_name(node)); return false; } @@ -220,13 +223,12 @@ pe__log_node_weights(const char *file, const char *function, int line, if (rsc) { qb_log_from_external_source(function, file, "%s: %s allocation score on %s: %s", - LOG_TRACE, line, 0, - comment, rsc->id, - pcmk__node_name(node), + PCMK__LOG_TRACE, line, 0, + comment, rsc->id, pcmk__node_name(node), pcmk_readable_score(node->assign->score)); } else { qb_log_from_external_source(function, file, "%s: %s = %s", - LOG_TRACE, line, 0, + PCMK__LOG_TRACE, line, 0, comment, pcmk__node_name(node), pcmk_readable_score(node->assign->score)); } @@ -253,7 +255,7 @@ pe__show_node_scores_as(const char *file, const char *function, int line, const char *comment, GHashTable *nodes, pcmk_scheduler_t *scheduler) { - if ((rsc != NULL) && pcmk_is_set(rsc->flags, pcmk__rsc_removed)) { + if ((rsc != NULL) && pcmk__is_set(rsc->flags, pcmk__rsc_removed)) { // Don't show allocation scores for orphans return; } @@ -327,7 +329,7 @@ resource_node_score(pcmk_resource_t *rsc, const pcmk_node_t *node, int score, { pcmk_node_t *match = NULL; - if ((pcmk_is_set(rsc->flags, pcmk__rsc_exclusive_probes) + if ((pcmk__is_set(rsc->flags, pcmk__rsc_exclusive_probes) || (node->assign->probe_mode == pcmk__probe_never)) && pcmk__str_eq(tag, "symmetric_default", pcmk__str_casei)) { /* This string comparision may be fragile, but exclusive resources and @@ -390,8 +392,8 @@ resource_location(pcmk_resource_t *rsc, const pcmk_node_t *node, int score, && (rsc->priv->assigned_node != NULL)) { // @TODO Should this be more like pcmk__unassign_resource()? - crm_info("Unassigning %s from %s", - rsc->id, pcmk__node_name(rsc->priv->assigned_node)); + pcmk__info("Unassigning %s from %s", rsc->id, + pcmk__node_name(rsc->priv->assigned_node)); pcmk__free_node_copy(rsc->priv->assigned_node); rsc->priv->assigned_node = NULL; } @@ -426,8 +428,8 @@ get_target_role(const pcmk_resource_t *rsc, enum rsc_role_e *role) return FALSE; } else if (local_role > pcmk_role_started) { - if (pcmk_is_set(pe__const_top_resource(rsc, false)->flags, - pcmk__rsc_promotable)) { + if (pcmk__is_set(pe__const_top_resource(rsc, false)->flags, + pcmk__rsc_promotable)) { if (local_role > pcmk_role_unpromoted) { /* This is what we'd do anyway, just leave the default to avoid messing up the placement algorithm */ return FALSE; @@ -460,8 +462,8 @@ order_actions(pcmk_action_t *first, pcmk_action_t *then, uint32_t flags) return FALSE; } - crm_trace("Creating action wrappers for ordering: %s then %s", - first->uuid, then->uuid); + pcmk__trace("Creating action wrappers for ordering: %s then %s", + first->uuid, then->uuid); /* Ensure we never create a dependency on ourselves... it's happened */ pcmk__assert(first != then); @@ -472,7 +474,7 @@ order_actions(pcmk_action_t *first, pcmk_action_t *then, uint32_t flags) pcmk__related_action_t *after = gIter->data; if ((after->action == then) - && pcmk_any_flags_set(after->flags, flags)) { + && pcmk__any_flags_set(after->flags, flags)) { return FALSE; } } @@ -530,7 +532,7 @@ ticket_new(const char *ticket_id, pcmk_scheduler_t *scheduler) return NULL; } - crm_trace("Creating ticket entry for %s", ticket_id); + pcmk__trace("Creating ticket entry for %s", ticket_id); ticket->id = strdup(ticket_id); ticket->last_granted = -1; @@ -546,7 +548,7 @@ ticket_new(const char *ticket_id, pcmk_scheduler_t *scheduler) const char * rsc_printable_id(const pcmk_resource_t *rsc) { - if (pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { return rsc->id; } return pcmk__xe_id(rsc->priv->xml); @@ -594,12 +596,12 @@ void trigger_unfencing(pcmk_resource_t *rsc, pcmk_node_t *node, const char *reason, pcmk_action_t *dependency, pcmk_scheduler_t *scheduler) { - if (!pcmk_is_set(scheduler->flags, pcmk__sched_enable_unfencing)) { + if (!pcmk__is_set(scheduler->flags, pcmk__sched_enable_unfencing)) { /* No resources require it */ return; } else if ((rsc != NULL) - && !pcmk_is_set(rsc->flags, pcmk__rsc_fence_device)) { + && !pcmk__is_set(rsc->flags, pcmk__rsc_fence_device)) { /* Wasn't a stonith device */ return; @@ -704,8 +706,8 @@ pe__resource_is_disabled(const pcmk_resource_t *rsc) if ((target_role_e == pcmk_role_stopped) || ((target_role_e == pcmk_role_unpromoted) - && pcmk_is_set(pe__const_top_resource(rsc, false)->flags, - pcmk__rsc_promotable))) { + && pcmk__is_set(pe__const_top_resource(rsc, false)->flags, + pcmk__rsc_promotable))) { return true; } } @@ -867,7 +869,7 @@ pe__failed_probe_for_rsc(const pcmk_resource_t *rsc, const char *name) /* This resource operation was not run on the given node. Note that if name is * NULL, this will always succeed. */ - value = crm_element_value(xml_op, PCMK__META_ON_NODE); + value = pcmk__xe_get(xml_op, PCMK__META_ON_NODE); if (value == NULL || !pcmk__str_eq(value, name, pcmk__str_casei|pcmk__str_null_matches)) { continue; } diff --git a/lib/services/dbus.c b/lib/services/dbus.c index 9033d3cea64..90a29a0010b 100644 --- a/lib/services/dbus.c +++ b/lib/services/dbus.c @@ -1,5 +1,5 @@ /* - * Copyright 2014-2024 the Pacemaker project contributors + * Copyright 2014-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -38,11 +38,12 @@ update_dispatch_status(DBusConnection *connection, DBusDispatchStatus new_status, void *data) { if (new_status == DBUS_DISPATCH_DATA_REMAINS) { - crm_trace("DBus connection has messages available for dispatch"); + pcmk__trace("DBus connection has messages available for dispatch"); conn_dispatches = g_list_prepend(conn_dispatches, connection); } else { - crm_trace("DBus connection has no messages available for dispatch " - "(status %d)", new_status); + pcmk__trace("DBus connection has no messages available for dispatch " + "(status %d)", + new_status); } } @@ -58,7 +59,7 @@ dispatch_messages(void) while (dbus_connection_get_dispatch_status(connection) == DBUS_DISPATCH_DATA_REMAINS) { - crm_trace("Dispatching available messages on DBus connection"); + pcmk__trace("Dispatching available messages on DBus connection"); dbus_connection_dispatch(connection); } } @@ -111,10 +112,10 @@ dispatch_fd_data(gpointer userdata) int flags = dbus_watch_get_flags(watch); bool enabled = dbus_watch_get_enabled (watch); - crm_trace("Dispatching DBus watch for file descriptor %d " - "with flags %#x (%s)", - dbus_watch_get_unix_fd(watch), flags, - dbus_watch_flags_to_string(flags)); + pcmk__trace("Dispatching DBus watch for file descriptor %d " + "with flags %#x (%s)", + dbus_watch_get_unix_fd(watch), flags, + dbus_watch_flags_to_string(flags)); if (enabled && (flags & (DBUS_WATCH_READABLE|DBUS_WATCH_WRITABLE))) { oom = !dbus_watch_handle(watch, flags); @@ -125,12 +126,13 @@ dispatch_fd_data(gpointer userdata) if (flags != dbus_watch_get_flags(watch)) { flags = dbus_watch_get_flags(watch); - crm_trace("Dispatched DBus file descriptor watch: now %#x (%s)", - flags, dbus_watch_flags_to_string(flags)); + pcmk__trace("Dispatched DBus file descriptor watch: now %#x (%s)", + flags, dbus_watch_flags_to_string(flags)); } if (oom) { - crm_crit("Could not dispatch DBus file descriptor data: Out of memory"); + pcmk__crit("Could not dispatch DBus file descriptor data: Out of " + "memory"); } else { dispatch_messages(); } @@ -140,8 +142,8 @@ dispatch_fd_data(gpointer userdata) static void watch_fd_closed(gpointer userdata) { - crm_trace("DBus watch for file descriptor %d is now closed", - dbus_watch_get_unix_fd((DBusWatch *) userdata)); + pcmk__trace("DBus watch for file descriptor %d is now closed", + dbus_watch_get_unix_fd((DBusWatch *) userdata)); } static struct mainloop_fd_callbacks pcmk_dbus_cb = { @@ -157,7 +159,7 @@ add_dbus_watch(DBusWatch *watch, void *data) mainloop_io_t *client = mainloop_add_fd("dbus", G_PRIORITY_DEFAULT, fd, watch, &pcmk_dbus_cb); - crm_trace("Added DBus watch for file descriptor %d", fd); + pcmk__trace("Added DBus watch for file descriptor %d", fd); dbus_watch_set_data(watch, client, NULL); return TRUE; } @@ -166,16 +168,16 @@ static void toggle_dbus_watch(DBusWatch *watch, void *data) { // @TODO Should this do something more? - crm_debug("DBus watch for file descriptor %d is now %s", - dbus_watch_get_unix_fd(watch), - (dbus_watch_get_enabled(watch)? "enabled" : "disabled")); + pcmk__debug("DBus watch for file descriptor %d is now %s", + dbus_watch_get_unix_fd(watch), + (dbus_watch_get_enabled(watch)? "enabled" : "disabled")); } static void remove_dbus_watch(DBusWatch *watch, void *data) { - crm_trace("Removed DBus watch for file descriptor %d", - dbus_watch_get_unix_fd(watch)); + pcmk__trace("Removed DBus watch for file descriptor %d", + dbus_watch_get_unix_fd(watch)); mainloop_del_fd((mainloop_io_t *) dbus_watch_get_data(watch)); } @@ -197,8 +199,8 @@ register_watch_functions(DBusConnection *connection) static gboolean timer_popped(gpointer data) { - crm_debug("%dms DBus timer expired", - dbus_timeout_get_interval((DBusTimeout *) data)); + pcmk__debug("%dms DBus timer expired", + dbus_timeout_get_interval((DBusTimeout *) data)); dbus_timeout_handle(data); return FALSE; } @@ -212,7 +214,7 @@ add_dbus_timer(DBusTimeout *timeout, void *data) if (id) { dbus_timeout_set_data(timeout, GUINT_TO_POINTER(id), NULL); } - crm_trace("Added %dms DBus timer", interval_ms); + pcmk__trace("Added %dms DBus timer", interval_ms); return TRUE; } @@ -222,7 +224,7 @@ remove_dbus_timer(DBusTimeout *timeout, void *data) void *vid = dbus_timeout_get_data(timeout); guint id = GPOINTER_TO_UINT(vid); - crm_trace("Removing %dms DBus timer", dbus_timeout_get_interval(timeout)); + pcmk__trace("Removing %dms DBus timer", dbus_timeout_get_interval(timeout)); if (id) { g_source_remove(id); dbus_timeout_set_data(timeout, 0, NULL); @@ -234,8 +236,8 @@ toggle_dbus_timer(DBusTimeout *timeout, void *data) { bool enabled = dbus_timeout_get_enabled(timeout); - crm_trace("Toggling %dms DBus timer %s", - dbus_timeout_get_interval(timeout), (enabled? "off": "on")); + pcmk__trace("Toggling %dms DBus timer %s", + dbus_timeout_get_interval(timeout), (enabled? "off": "on")); if (enabled) { add_dbus_timer(timeout, data); } else { @@ -264,7 +266,7 @@ pcmk_dbus_connect(void) dbus_error_init(&err); connection = dbus_bus_get(DBUS_BUS_SYSTEM, &err); if (dbus_error_is_set(&err)) { - crm_err("Could not connect to DBus: %s", err.message); + pcmk__err("Could not connect to DBus: %s", err.message); dbus_error_free(&err); return NULL; } @@ -346,16 +348,18 @@ pcmk_dbus_find_error(const DBusPendingCall *pending, DBusMessage *reply, switch (dtype) { case DBUS_MESSAGE_TYPE_METHOD_RETURN: - { - char *sig = NULL; - - dbus_message_iter_init(reply, &args); - crm_trace("Received DBus reply with argument type '%s'", - (sig = dbus_message_iter_get_signature(&args))); - if (sig != NULL) { + dbus_message_iter_init(reply, &args); + pcmk__if_tracing( + { + char *sig = dbus_message_iter_get_signature(&args); + + pcmk__trace("Received DBus reply with argument type " + "'%s'", + pcmk__s(sig, "(bad signature)")); dbus_free(sig); - } - } + }, + {} + ); break; case DBUS_MESSAGE_TYPE_INVALID: dbus_set_error_const(&error, ERR_INVALID_REPLY, @@ -379,8 +383,8 @@ pcmk_dbus_find_error(const DBusPendingCall *pending, DBusMessage *reply, } if (dbus_error_is_set(&error)) { - crm_trace("DBus reply indicated error '%s' (%s)", - error.name, error.message); + pcmk__trace("DBus reply indicated error '%s' (%s)", + error.name, error.message); if (ret) { dbus_error_init(ret); dbus_move_error(&error, ret); @@ -491,17 +495,17 @@ pcmk_dbus_send(DBusMessage *msg, DBusConnection *connection, // send message and get a handle for a reply if (!dbus_connection_send_with_reply(connection, msg, &pending, timeout)) { - crm_err("Could not send DBus %s message: failed", method); + pcmk__err("Could not send DBus %s message: failed", method); return NULL; } else if (pending == NULL) { - crm_err("Could not send DBus %s message: connection may be closed", - method); + pcmk__err("Could not send DBus %s message: connection may be closed", + method); return NULL; } if (dbus_pending_call_get_completed(pending)) { - crm_info("DBus %s message completed too soon", method); + pcmk__info("DBus %s message completed too soon", method); /* Calling done() directly in this case instead of setting notify below * breaks things */ @@ -598,8 +602,8 @@ handle_query_result(DBusMessage *reply, struct property_query *data) // First, check if the reply contains an error if (pcmk_dbus_find_error((void*)&error, reply, &error)) { - crm_err("DBus query for %s property '%s' failed: %s", - data->object, data->name, error.message); + pcmk__err("DBus query for %s property '%s' failed: %s", data->object, + data->name, error.message); dbus_error_free(&error); goto cleanup; } @@ -608,8 +612,9 @@ handle_query_result(DBusMessage *reply, struct property_query *data) dbus_message_iter_init(reply, &args); if (!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_VARIANT, __func__, __LINE__)) { - crm_err("DBus query for %s property '%s' failed: Unexpected reply type", - data->object, data->name); + pcmk__err("DBus query for %s property '%s' failed: Unexpected reply " + "type", + data->object, data->name); goto cleanup; } @@ -617,8 +622,9 @@ handle_query_result(DBusMessage *reply, struct property_query *data) dbus_message_iter_recurse(&args, &variant_iter); if (!pcmk_dbus_type_check(reply, &variant_iter, DBUS_TYPE_STRING, __func__, __LINE__)) { - crm_err("DBus query for %s property '%s' failed: " - "Unexpected variant type", data->object, data->name); + pcmk__err("DBus query for %s property '%s' failed: Unexpected variant " + "type", + data->object, data->name); goto cleanup; } dbus_message_iter_get_basic(&variant_iter, &value); @@ -626,20 +632,21 @@ handle_query_result(DBusMessage *reply, struct property_query *data) // There should be no more arguments (in variant or reply) dbus_message_iter_next(&variant_iter); if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_INVALID) { - crm_err("DBus query for %s property '%s' failed: " - "Too many arguments in reply", - data->object, data->name); + pcmk__err("DBus query for %s property '%s' failed: Too many arguments " + "in reply", + data->object, data->name); goto cleanup; } dbus_message_iter_next(&args); if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_INVALID) { - crm_err("DBus query for %s property '%s' failed: " - "Too many arguments in reply", data->object, data->name); + pcmk__err("DBus query for %s property '%s' failed: TOo many arguments " + "in reply", + data->object, data->name); goto cleanup; } - crm_trace("DBus query result for %s: %s='%s'", - data->object, data->name, (value.str? value.str : "")); + pcmk__trace("DBus query result for %s: %s='%s'", + data->object, data->name, pcmk__s(value.str, "")); if (data->callback) { // Query was asynchronous data->callback(data->name, (value.str? value.str : ""), data->userdata); @@ -704,14 +711,14 @@ pcmk_dbus_get_property(DBusConnection *connection, const char *target, CRM_CHECK((connection != NULL) && (target != NULL) && (obj != NULL) && (iface != NULL) && (name != NULL), return NULL); - crm_trace("Querying DBus %s for %s property '%s'", - target, obj, name); + pcmk__trace("Querying DBus %s for %s property '%s'", target, obj, name); // Create a new message to use to invoke method msg = dbus_message_new_method_call(target, obj, BUS_PROPERTY_IFACE, "Get"); if (msg == NULL) { - crm_err("DBus query for %s property '%s' failed: " - "Unable to create message", obj, name); + pcmk__err("DBus query for %s property '%s' failed: Unable to create " + "message", + obj, name); return NULL; } @@ -720,16 +727,17 @@ pcmk_dbus_get_property(DBusConnection *connection, const char *target, DBUS_TYPE_STRING, &iface, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) { - crm_err("DBus query for %s property '%s' failed: " - "Could not append arguments", obj, name); + pcmk__err("DBus query for %s property '%s' failed: Could not append " + "arguments", + obj, name); dbus_message_unref(msg); return NULL; } query_data = malloc(sizeof(struct property_query)); if (query_data == NULL) { - crm_crit("DBus query for %s property '%s' failed: Out of memory", - obj, name); + pcmk__crit("DBus query for %s property '%s' failed: Out of memory", obj, + name); dbus_message_unref(msg); return NULL; } diff --git a/lib/services/services.c b/lib/services/services.c index 1141c14b64e..90be29d6c4b 100644 --- a/lib/services/services.c +++ b/lib/services/services.c @@ -123,7 +123,7 @@ expand_resource_class(const char *rsc, const char *standard, const char *agent) const char *found_class = resources_find_service_class(agent); if (found_class != NULL) { - crm_debug("Found %s agent %s for %s", found_class, agent, rsc); + pcmk__debug("Found %s agent %s for %s", found_class, agent, rsc); expanded_class = pcmk__str_copy(found_class); } else { const char *default_standard = NULL; @@ -135,8 +135,8 @@ expand_resource_class(const char *rsc, const char *standard, const char *agent) #else #error No standards supported for service alias (configure script bug) #endif - crm_info("Assuming resource class %s for agent %s for %s", - default_standard, agent, rsc); + pcmk__info("Assuming resource class %s for agent %s for %s", + default_standard, agent, rsc); expanded_class = pcmk__str_copy(default_standard); } } @@ -180,32 +180,34 @@ required_argument_missing(uint32_t ra_caps, const char *name, const char *agent, const char *action) { if (pcmk__str_empty(name)) { - crm_info("Cannot create operation without resource name (bug?)"); + pcmk__info("Cannot create operation without resource name (bug?)"); return true; } if (pcmk__str_empty(standard)) { - crm_info("Cannot create operation for %s without resource class (bug?)", - name); + pcmk__info("Cannot create operation for %s without resource class " + "(bug?)", + name); return true; } - if (pcmk_is_set(ra_caps, pcmk_ra_cap_provider) + if (pcmk__is_set(ra_caps, pcmk_ra_cap_provider) && pcmk__str_empty(provider)) { - crm_info("Cannot create operation for %s resource %s " - "without provider (bug?)", standard, name); + pcmk__info("Cannot create operation for %s resource %s without " + "provider (bug?)", + standard, name); return true; } if (pcmk__str_empty(agent)) { - crm_info("Cannot create operation for %s without agent name (bug?)", - name); + pcmk__info("Cannot create operation for %s without agent name (bug?)", + name); return true; } if (pcmk__str_empty(action)) { - crm_info("Cannot create operation for %s without action name (bug?)", - name); + pcmk__info("Cannot create operation for %s without action name (bug?)", + name); return true; } return false; @@ -232,7 +234,7 @@ copy_action_arguments(svc_action_t *op, uint32_t ra_caps, const char *name, return ENOMEM; } - if (pcmk_is_set(ra_caps, pcmk_ra_cap_status) + if (pcmk__is_set(ra_caps, pcmk_ra_cap_status) && pcmk__str_eq(action, PCMK_ACTION_MONITOR, pcmk__str_casei)) { action = PCMK_ACTION_STATUS; } @@ -241,7 +243,7 @@ copy_action_arguments(svc_action_t *op, uint32_t ra_caps, const char *name, return ENOMEM; } - if (pcmk_is_set(ra_caps, pcmk_ra_cap_provider)) { + if (pcmk__is_set(ra_caps, pcmk_ra_cap_provider)) { op->provider = strdup(provider); if (op->provider == NULL) { return ENOMEM; @@ -263,7 +265,7 @@ services__create_resource_action(const char *name, const char *standard, op = new_action(); if (op == NULL) { - crm_crit("Cannot prepare action: %s", strerror(ENOMEM)); + pcmk__crit("Cannot prepare action: %s", strerror(ENOMEM)); if (params != NULL) { g_hash_table_destroy(params); } @@ -276,7 +278,7 @@ services__create_resource_action(const char *name, const char *standard, op->sequence = ++operations; // Take ownership of params - if (pcmk_is_set(ra_caps, pcmk_ra_cap_params)) { + if (pcmk__is_set(ra_caps, pcmk_ra_cap_params)) { op->params = params; } else if (params != NULL) { g_hash_table_destroy(params); @@ -295,8 +297,8 @@ services__create_resource_action(const char *name, const char *standard, if (copy_action_arguments(op, ra_caps, name, standard, provider, agent, action) != pcmk_rc_ok) { - crm_crit("Cannot prepare %s action for %s: %s", - action, name, strerror(ENOMEM)); + pcmk__crit("Cannot prepare %s action for %s: %s", action, name, + strerror(ENOMEM)); services__handle_exec_error(op, ENOMEM); return op; } @@ -313,13 +315,13 @@ services__create_resource_action(const char *name, const char *standard, rc = services__systemd_prepare(op); #endif } else { - crm_info("Unknown resource standard: %s", op->standard); + pcmk__info("Unknown resource standard: %s", op->standard); rc = ENOENT; } if (rc != pcmk_rc_ok) { - crm_info("Cannot prepare %s operation for %s: %s", - action, name, strerror(rc)); + pcmk__info("Cannot prepare %s operation for %s: %s", action, name, + strerror(rc)); services__handle_exec_error(op, rc); } return op; @@ -356,7 +358,8 @@ services_action_create_generic(const char *exec, const char *args[]) op->opaque->exec = strdup(exec); op->opaque->args[0] = strdup(exec); if ((op->opaque->exec == NULL) || (op->opaque->args[0] == NULL)) { - crm_crit("Cannot prepare action for '%s': %s", exec, strerror(ENOMEM)); + pcmk__crit("Cannot prepare action for '%s': %s", exec, + strerror(ENOMEM)); services__set_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_ERROR, strerror(ENOMEM)); return op; @@ -369,8 +372,8 @@ services_action_create_generic(const char *exec, const char *args[]) for (int cur_arg = 1; args[cur_arg - 1] != NULL; cur_arg++) { if (cur_arg == PCMK__NELEM(op->opaque->args)) { - crm_info("Cannot prepare action for '%s': Too many arguments", - exec); + pcmk__info("Cannot prepare action for '%s': Too many arguments", + exec); services__set_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_ERROR_HARD, "Too many arguments"); break; @@ -378,8 +381,8 @@ services_action_create_generic(const char *exec, const char *args[]) op->opaque->args[cur_arg] = strdup(args[cur_arg - 1]); if (op->opaque->args[cur_arg] == NULL) { - crm_crit("Cannot prepare action for '%s': %s", - exec, strerror(ENOMEM)); + pcmk__crit("Cannot prepare action for '%s': %s", exec, + strerror(ENOMEM)); services__set_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_ERROR, strerror(ENOMEM)); break; @@ -435,8 +438,12 @@ services_alert_create(const char *id, const char *exec, int timeout, int services_action_user(svc_action_t *op, const char *user) { + int rc = pcmk_ok; + CRM_CHECK((op != NULL) && (user != NULL), return -EINVAL); - return crm_user_lookup(user, &(op->opaque->uid), &(op->opaque->gid)); + + rc = pcmk__lookup_user(user, &(op->opaque->uid), &(op->opaque->gid)); + return pcmk_rc2legacy(rc); } /*! @@ -473,17 +480,19 @@ services_set_op_pending(svc_action_t *op, DBusPendingCall *pending) { if (op->opaque->pending && (op->opaque->pending != pending)) { if (pending) { - crm_info("Lost pending %s DBus call (%p)", op->id, op->opaque->pending); + pcmk__info("Lost pending %s DBus call (%p)", op->id, + op->opaque->pending); } else { - crm_trace("Done with pending %s DBus call (%p)", op->id, op->opaque->pending); + pcmk__trace("Done with pending %s DBus call (%p)", op->id, + op->opaque->pending); } dbus_pending_call_unref(op->opaque->pending); } op->opaque->pending = pending; if (pending) { - crm_trace("Updated pending %s DBus call (%p)", op->id, pending); + pcmk__trace("Updated pending %s DBus call (%p)", op->id, pending); } else { - crm_trace("Cleared pending %s DBus call", op->id); + pcmk__trace("Cleared pending %s DBus call", op->id); } } #endif @@ -497,7 +506,7 @@ services_action_cleanup(svc_action_t * op) #if HAVE_DBUS if(op->opaque->timerid != 0) { - crm_trace("Removing timer for call %s to %s", op->action, op->rsc); + pcmk__trace("Removing timer for call %s to %s", op->action, op->rsc); g_source_remove(op->opaque->timerid); op->opaque->timerid = 0; } @@ -505,11 +514,11 @@ services_action_cleanup(svc_action_t * op) if(op->opaque->pending) { if (dbus_pending_call_get_completed(op->opaque->pending)) { // This should never be the case - crm_warn("Result of %s op %s was unhandled", - op->standard, op->id); + pcmk__warn("Result of %s op %s was unhandled", op->standard, + op->id); } else { - crm_debug("Will ignore any result of canceled %s op %s", - op->standard, op->id); + pcmk__debug("Will ignore any result of canceled %s op %s", + op->standard, op->id); } dbus_pending_call_cancel(op->opaque->pending); services_set_op_pending(op, NULL); @@ -556,8 +565,8 @@ services_result2ocf(const char *standard, const char *action, int exit_status) #endif } else { - crm_warn("Treating result from unknown standard '%s' as OCF", - ((standard == NULL)? "unspecified" : standard)); + pcmk__warn("Treating result from unknown standard '%s' as OCF", + pcmk__s(standard, "unspecified")); return services__ocf2ocf(exit_status); } } @@ -623,7 +632,7 @@ services_action_free(svc_action_t * op) gboolean cancel_recurring_action(svc_action_t * op) { - crm_info("Cancelling %s operation %s", op->standard, op->id); + pcmk__info("Cancelling %s operation %s", op->standard, op->id); if (recurring_actions) { g_hash_table_remove(recurring_actions, op->id); @@ -673,11 +682,12 @@ services_action_cancel(const char *name, const char *action, guint interval_ms) * process goes away. */ if (op->pid != 0) { - crm_info("Terminating in-flight op %s[%d] early because it was cancelled", - id, op->pid); + pcmk__info("Terminating in-flight op %s[%d] early because it was " + "cancelled", + id, op->pid); cancelled = mainloop_child_kill(op->pid); if (cancelled == FALSE) { - crm_err("Termination of %s[%d] failed", id, op->pid); + pcmk__err("Termination of %s[%d] failed", id, op->pid); } goto done; } @@ -867,8 +877,8 @@ services_action_async_fork_notify(svc_action_t * op, g_hash_table_replace(recurring_actions, op->id, op); } - if (!pcmk_is_set(op->flags, SVC_ACTION_NON_BLOCKED) - && op->rsc && is_op_blocked(op->rsc)) { + if (!pcmk__is_set(op->flags, SVC_ACTION_NON_BLOCKED) + && (op->rsc != NULL) && is_op_blocked(op->rsc)) { blocked_ops = g_list_append(blocked_ops, op); return TRUE; } @@ -953,15 +963,15 @@ execute_metadata_action(svc_action_t *op) const char *class = op->standard; if (op->agent == NULL) { - crm_info("Meta-data requested without specifying agent"); + pcmk__info("Meta-data requested without specifying agent"); services__set_result(op, services__generic_error(op), PCMK_EXEC_ERROR_FATAL, "Agent not specified"); return EINVAL; } if (class == NULL) { - crm_info("Meta-data requested for agent %s without specifying class", - op->agent); + pcmk__info("Meta-data requested for agent %s without specifying class", + op->agent); services__set_result(op, services__generic_error(op), PCMK_EXEC_ERROR_FATAL, "Agent standard not specified"); @@ -973,8 +983,8 @@ execute_metadata_action(svc_action_t *op) class = resources_find_service_class(op->agent); } if (class == NULL) { - crm_info("Meta-data requested for %s, but could not determine class", - op->agent); + pcmk__info("Meta-data requested for %s, but could not determine class", + op->agent); services__set_result(op, services__generic_error(op), PCMK_EXEC_ERROR_HARD, "Agent standard could not be determined"); @@ -998,7 +1008,7 @@ services_action_sync(svc_action_t * op) gboolean rc = TRUE; if (op == NULL) { - crm_trace("No operation to execute"); + pcmk__trace("No operation to execute"); return FALSE; } @@ -1016,13 +1026,13 @@ services_action_sync(svc_action_t * op) } else { rc = (execute_action(op) == pcmk_rc_ok); } - crm_trace(" > " PCMK__OP_FMT ": %s = %d", - op->rsc, op->action, op->interval_ms, op->opaque->exec, op->rc); + pcmk__trace(" > " PCMK__OP_FMT ": %s = %d", op->rsc, op->action, + op->interval_ms, op->opaque->exec, op->rc); if (op->stdout_data) { - crm_trace(" > stdout: %s", op->stdout_data); + pcmk__trace(" > stdout: %s", op->stdout_data); } if (op->stderr_data) { - crm_trace(" > stderr: %s", op->stderr_data); + pcmk__trace(" > stderr: %s", op->stderr_data); } return rc; } @@ -1066,7 +1076,7 @@ resources_list_standards(void) GList * resources_list_providers(const char *standard) { - if (pcmk_is_set(pcmk_get_ra_caps(standard), pcmk_ra_cap_provider)) { + if (pcmk__is_set(pcmk_get_ra_caps(standard), pcmk_ra_cap_provider)) { return resources_os_list_ocf_providers(); } @@ -1146,7 +1156,8 @@ resources_agent_exists(const char *standard, const char *provider, const char *a rc = FALSE; - has_providers = pcmk_is_set(pcmk_get_ra_caps(standard), pcmk_ra_cap_provider); + has_providers = pcmk__is_set(pcmk_get_ra_caps(standard), + pcmk_ra_cap_provider); if (has_providers == TRUE && provider != NULL) { providers = resources_list_providers(standard); for (iter = providers; iter != NULL; iter = iter->next) { diff --git a/lib/services/services_linux.c b/lib/services/services_linux.c index d7b9b97b3cf..de0862a7804 100644 --- a/lib/services/services_linux.c +++ b/lib/services/services_linux.c @@ -61,8 +61,9 @@ sigchld_setup(struct sigchld_data_s *data) // Block SIGCHLD (saving previous set of blocked signals to restore later) if (sigprocmask(SIG_BLOCK, &(data->mask), &(data->old_mask)) < 0) { - crm_info("Wait for child process completion failed: %s " - QB_XS " source=sigprocmask", pcmk_rc_str(errno)); + pcmk__info("Wait for child process completion failed: %s " + QB_XS " source=sigprocmask", + pcmk_rc_str(errno)); return false; } @@ -81,8 +82,9 @@ sigchld_open(struct sigchld_data_s *data) fd = signalfd(-1, &(data->mask), SFD_NONBLOCK); if (fd < 0) { - crm_info("Wait for child process completion failed: %s " - QB_XS " source=signalfd", pcmk_rc_str(errno)); + pcmk__info("Wait for child process completion failed: %s " + QB_XS " source=signalfd", + pcmk_rc_str(errno)); } return fd; } @@ -108,8 +110,9 @@ sigchld_received(int fd, int pid, struct sigchld_data_s *data) } s = read(fd, &fdsi, sizeof(struct signalfd_siginfo)); if (s != sizeof(struct signalfd_siginfo)) { - crm_info("Wait for child process completion failed: %s " - QB_XS " source=read", pcmk_rc_str(errno)); + pcmk__info("Wait for child process completion failed: %s " + QB_XS " source=read", + pcmk_rc_str(errno)); } else if (fdsi.ssi_signo == SIGCHLD) { if (fdsi.ssi_pid == pid) { @@ -135,14 +138,14 @@ sigchld_cleanup(struct sigchld_data_s *data) // Restore the original set of blocked signals if ((sigismember(&(data->old_mask), SIGCHLD) == 0) && (sigprocmask(SIG_UNBLOCK, &(data->mask), NULL) < 0)) { - crm_warn("Could not clean up after child process completion: %s", - pcmk_rc_str(errno)); + pcmk__warn("Could not clean up after child process completion: %s", + pcmk_rc_str(errno)); } // Resend any ignored SIGCHLD for other children so that they'll be handled. if (data->ignored && kill(getpid(), SIGCHLD) != 0) { - crm_warn("Could not resend ignored SIGCHLD to ourselves: %s", - pcmk_rc_str(errno)); + pcmk__warn("Could not resend ignored SIGCHLD to ourselves: %s", + pcmk_rc_str(errno)); } } @@ -167,8 +170,9 @@ sigchld_handler(void) if ((last_sigchld_data != NULL) && (last_sigchld_data->pipe_fd[1] >= 0) && (write(last_sigchld_data->pipe_fd[1], "", 1) == -1)) { - crm_info("Wait for child process completion failed: %s " - QB_XS " source=write", pcmk_rc_str(errno)); + pcmk__info("Wait for child process completion failed: %s " + QB_XS " source=write", + pcmk_rc_str(errno)); } } @@ -180,20 +184,21 @@ sigchld_setup(struct sigchld_data_s *data) data->pipe_fd[0] = data->pipe_fd[1] = -1; if (pipe(data->pipe_fd) == -1) { - crm_info("Wait for child process completion failed: %s " - QB_XS " source=pipe", pcmk_rc_str(errno)); + pcmk__info("Wait for child process completion failed: %s " + QB_XS " source=pipe", + pcmk_rc_str(errno)); return false; } rc = pcmk__set_nonblocking(data->pipe_fd[0]); if (rc != pcmk_rc_ok) { - crm_info("Could not set pipe input non-blocking: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__info("Could not set pipe input non-blocking: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); } rc = pcmk__set_nonblocking(data->pipe_fd[1]); if (rc != pcmk_rc_ok) { - crm_info("Could not set pipe output non-blocking: %s " QB_XS " rc=%d", - pcmk_rc_str(rc), rc); + pcmk__info("Could not set pipe output non-blocking: %s " QB_XS " rc=%d", + pcmk_rc_str(rc), rc); } // Set SIGCHLD handler @@ -201,8 +206,9 @@ sigchld_setup(struct sigchld_data_s *data) data->sa.sa_flags = 0; sigemptyset(&(data->sa.sa_mask)); if (sigaction(SIGCHLD, &(data->sa), &(data->old_sa)) < 0) { - crm_info("Wait for child process completion failed: %s " - QB_XS " source=sigaction", pcmk_rc_str(errno)); + pcmk__info("Wait for child process completion failed: %s " + QB_XS " source=sigaction", + pcmk_rc_str(errno)); } data->ignored = false; @@ -245,16 +251,16 @@ sigchld_cleanup(struct sigchld_data_s *data) { // Restore the previous SIGCHLD handler if (sigaction(SIGCHLD, &(data->old_sa), NULL) < 0) { - crm_warn("Could not clean up after child process completion: %s", - pcmk_rc_str(errno)); + pcmk__warn("Could not clean up after child process completion: %s", + pcmk_rc_str(errno)); } close_pipe(data->pipe_fd); // Resend any ignored SIGCHLD for other children so that they'll be handled. if (data->ignored && kill(getpid(), SIGCHLD) != 0) { - crm_warn("Could not resend ignored SIGCHLD to ourselves: %s", - pcmk_rc_str(errno)); + pcmk__warn("Could not resend ignored SIGCHLD to ourselves: %s", + pcmk_rc_str(errno)); } } @@ -295,22 +301,22 @@ svc_read_output(int fd, svc_action_t * op, bool is_stderr) static const size_t buf_read_len = sizeof(buf) - 1; if (fd < 0) { - crm_trace("No fd for %s", op->id); + pcmk__trace("No fd for %s", op->id); return FALSE; } if (is_stderr && op->stderr_data) { len = strlen(op->stderr_data); data = op->stderr_data; - crm_trace("Reading %s stderr into offset %zu", op->id, len); + pcmk__trace("Reading %s stderr into offset %zu", op->id, len); } else if (is_stderr == FALSE && op->stdout_data) { len = strlen(op->stdout_data); data = op->stdout_data; - crm_trace("Reading %s stdout into offset %zu", op->id, len); + pcmk__trace("Reading %s stdout into offset %zu", op->id, len); } else { - crm_trace("Reading %s %s", op->id, out_type(is_stderr)); + pcmk__trace("Reading %s %s", op->id, out_type(is_stderr)); } do { @@ -319,8 +325,8 @@ svc_read_output(int fd, svc_action_t * op, bool is_stderr) if (rc > 0) { if (len < MAX_OUTPUT) { buf[rc] = 0; - crm_trace("Received %zd bytes of %s %s: %.80s", - rc, op->id, out_type(is_stderr), buf); + pcmk__trace("Received %zd bytes of %s %s: %.80s", rc, op->id, + out_type(is_stderr), buf); data = pcmk__realloc(data, len + rc + 1); strcpy(data + len, buf); len += rc; @@ -335,8 +341,8 @@ svc_read_output(int fd, svc_action_t * op, bool is_stderr) } while ((rc == buf_read_len) || (rc < 0)); if (discarded > 0) { - crm_warn("Truncated %s %s to %zu bytes (discarded %zu)", - op->id, out_type(is_stderr), len, discarded); + pcmk__warn("Truncated %s %s to %zu bytes (discarded %zu)", op->id, + out_type(is_stderr), len, discarded); } if (is_stderr) { @@ -369,7 +375,7 @@ pipe_out_done(gpointer user_data) { svc_action_t *op = (svc_action_t *) user_data; - crm_trace("%p", op); + pcmk__trace("%p", op); op->opaque->stdout_gsource = NULL; if (op->opaque->stdout_fd > STDOUT_FILENO) { @@ -432,7 +438,8 @@ set_alert_env(gpointer key, gpointer value, gpointer user_data) crm_perror(LOG_ERR, "setenv %s=%s", (char*)key, (value? (char*)value : "")); } else { - crm_trace("setenv %s=%s", (char*)key, (value? (char*)value : "")); + pcmk__trace("setenv %s=%s", + (const char *) key, pcmk__s((const char *) value, "")); } } @@ -484,7 +491,8 @@ static void pipe_in_single_parameter(gpointer key, gpointer value, gpointer user_data) { svc_action_t *op = user_data; - char *buffer = crm_strdup_printf("%s=%s\n", (char *)key, (char *) value); + char *buffer = pcmk__assert_asprintf("%s=%s\n", (const char *) key, + (const char *) value); size_t len = strlen(buffer); size_t total = 0; ssize_t ret = 0; @@ -518,7 +526,7 @@ recurring_action_timer(gpointer data) { svc_action_t *op = data; - crm_debug("Scheduling another invocation of %s", op->id); + pcmk__debug("Scheduling another invocation of %s", op->id); /* Clean out the old result */ free(op->stdout_data); @@ -607,8 +615,8 @@ finish_op_output(svc_action_t *op, bool is_stderr) } if (op->synchronous || *source) { - crm_trace("Finish reading %s[%d] %s", - op->id, op->pid, (is_stderr? "stderr" : "stdout")); + pcmk__trace("Finish reading %s[%d] %s", op->id, op->pid, + (is_stderr? "stderr" : "stdout")); svc_read_output(fd, op, is_stderr); if (op->synchronous) { close(fd); @@ -623,7 +631,8 @@ finish_op_output(svc_action_t *op, bool is_stderr) static void log_op_output(svc_action_t *op) { - char *prefix = crm_strdup_printf("%s[%d] error output", op->id, op->pid); + char *prefix = pcmk__assert_asprintf("%s[%d] error output", op->id, + op->pid); /* The library caller has better context to know how important the output * is, so log it at info and debug severity here. They can log it again at @@ -711,7 +720,7 @@ async_action_complete(mainloop_child_t *p, pid_t pid, int core, int signo, close_op_input(op); if (signo == 0) { - crm_debug("%s[%d] exited with status %d", op->id, op->pid, exitcode); + pcmk__debug("%s[%d] exited with status %d", op->id, op->pid, exitcode); services__set_result(op, exitcode, PCMK_EXEC_DONE, NULL); log_op_output(op); parse_exit_reason_from_stderr(op); @@ -719,8 +728,8 @@ async_action_complete(mainloop_child_t *p, pid_t pid, int core, int signo, } else if (mainloop_child_timeout(p)) { const char *kind = services__action_kind(op); - crm_info("%s %s[%d] timed out after %s", - kind, op->id, op->pid, pcmk__readable_interval(op->timeout)); + pcmk__info("%s %s[%d] timed out after %s", kind, op->id, op->pid, + pcmk__readable_interval(op->timeout)); services__format_result(op, services__generic_error(op), PCMK_EXEC_TIMEOUT, "%s did not complete within %s", @@ -730,13 +739,13 @@ async_action_complete(mainloop_child_t *p, pid_t pid, int core, int signo, /* If an in-flight recurring operation was killed because it was * cancelled, don't treat that as a failure. */ - crm_info("%s[%d] terminated with signal %d (%s)", - op->id, op->pid, signo, strsignal(signo)); + pcmk__info("%s[%d] terminated with signal %d (%s)", op->id, op->pid, + signo, strsignal(signo)); services__set_result(op, PCMK_OCF_OK, PCMK_EXEC_CANCELLED, NULL); } else { - crm_info("%s[%d] terminated with signal %d (%s)", - op->id, op->pid, signo, strsignal(signo)); + pcmk__info("%s[%d] terminated with signal %d (%s)", op->id, op->pid, + signo, strsignal(signo)); services__format_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_ERROR, "%s interrupted by %s signal", services__action_kind(op), strsignal(signo)); @@ -953,12 +962,12 @@ action_launch_child(svc_action_t *op) sp.sched_priority = 0; if (sched_setscheduler(0, SCHED_OTHER, &sp) == -1) { - crm_info("Could not reset scheduling policy for %s", op->id); + pcmk__info("Could not reset scheduling policy for %s", op->id); } } if (setpriority(PRIO_PROCESS, 0, 0) == -1) { - crm_info("Could not reset process priority for %s", op->id); + pcmk__info("Could not reset process priority for %s", op->id); } /* Man: The call setpgrp() is equivalent to setpgid(0,0) @@ -984,13 +993,13 @@ action_launch_child(svc_action_t *op) rc = pcmk__substitute_secrets(op->rsc, op->params); if (rc != pcmk_rc_ok) { if (pcmk__str_eq(op->action, PCMK_ACTION_STOP, pcmk__str_casei)) { - crm_info("Proceeding with stop operation for %s " - "despite being unable to load CIB secrets (%s)", - op->rsc, pcmk_rc_str(rc)); + pcmk__info("Proceeding with stop operation for %s despite being " + "unable to load CIB secrets (%s)", + op->rsc, pcmk_rc_str(rc)); } else { - crm_err("Considering %s unconfigured " - "because unable to load CIB secrets: %s", - op->rsc, pcmk_rc_str(rc)); + pcmk__err("Considering %s unconfigured because unable to load CIB " + "secrets: %s", + op->rsc, pcmk_rc_str(rc)); exit_child(op, services__configuration_error(op, false), "Unable to load CIB secrets"); } @@ -1004,9 +1013,9 @@ action_launch_child(svc_action_t *op) // If requested, set effective group if (op->opaque->gid && (setgid(op->opaque->gid) < 0)) { - crm_err("Considering %s unauthorized because could not set " - "child group to %d: %s", - op->id, op->opaque->gid, strerror(errno)); + pcmk__err("Considering %s unauthorized because could not set child " + "group to %d: %s", + op->id, op->opaque->gid, strerror(errno)); exit_child(op, services__authorization_error(op), "Could not set group for child process"); } @@ -1014,16 +1023,18 @@ action_launch_child(svc_action_t *op) // Erase supplementary group list // (We could do initgroups() if we kept a copy of the username) if (setgroups(0, NULL) < 0) { - crm_err("Considering %s unauthorized because could not " - "clear supplementary groups: %s", op->id, strerror(errno)); + pcmk__err("Considering %s unauthorized because could not clear " + "supplementary groups: %s", + op->id, strerror(errno)); exit_child(op, services__authorization_error(op), "Could not clear supplementary groups for child process"); } // Set effective user if (setuid(op->opaque->uid) < 0) { - crm_err("Considering %s unauthorized because could not set user " - "to %d: %s", op->id, op->opaque->uid, strerror(errno)); + pcmk__err("Considering %s unauthorized because could not set user " + "to %d: %s", + op->id, op->opaque->uid, strerror(errno)); exit_child(op, services__authorization_error(op), "Could not set user for child process"); } @@ -1035,7 +1046,7 @@ action_launch_child(svc_action_t *op) // An earlier stat() should have avoided most possible errors rc = errno; services__handle_exec_error(op, rc); - crm_err("Unable to execute %s: %s", op->id, strerror(rc)); + pcmk__err("Unable to execute %s: %s", op->id, strerror(rc)); exit_child(op, op->rc, "Child process was unable to execute file"); } @@ -1068,7 +1079,7 @@ wait_for_sync_result(svc_action_t *op, struct sigchld_data_s *data) fds[2].events = POLLIN; fds[2].revents = 0; - crm_trace("Waiting for %s[%d]", op->id, op->pid); + pcmk__trace("Waiting for %s[%d]", op->id, op->pid); do { int poll_rc = poll(fds, 3, timeout); @@ -1093,9 +1104,9 @@ wait_for_sync_result(svc_action_t *op, struct sigchld_data_s *data) } else if (wait_rc < 0) { wait_reason = pcmk_rc_str(errno); - crm_info("Wait for completion of %s[%d] failed: %s " - QB_XS " source=waitpid", - op->id, op->pid, wait_reason); + pcmk__info("Wait for completion of %s[%d] failed: %s " + QB_XS " source=waitpid", + op->id, op->pid, wait_reason); wait_rc = 0; // Act as if process is still running #ifndef HAVE_SYS_SIGNALFD_H @@ -1118,8 +1129,9 @@ wait_for_sync_result(svc_action_t *op, struct sigchld_data_s *data) } else if ((poll_rc < 0) && (errno != EINTR)) { wait_reason = pcmk_rc_str(errno); - crm_info("Wait for completion of %s[%d] failed: %s " - QB_XS " source=poll", op->id, op->pid, wait_reason); + pcmk__info("Wait for completion of %s[%d] failed: %s " + QB_XS " source=poll", + op->id, op->pid, wait_reason); break; } @@ -1127,7 +1139,7 @@ wait_for_sync_result(svc_action_t *op, struct sigchld_data_s *data) } while ((op->timeout < 0 || timeout > 0)); - crm_trace("Stopped waiting for %s[%d]", op->id, op->pid); + pcmk__trace("Stopped waiting for %s[%d]", op->id, op->pid); finish_op_output(op, true); finish_op_output(op, false); close_op_input(op); @@ -1140,8 +1152,8 @@ wait_for_sync_result(svc_action_t *op, struct sigchld_data_s *data) PCMK_EXEC_TIMEOUT, "%s did not exit within specified timeout", services__action_kind(op)); - crm_info("%s[%d] timed out after %dms", - op->id, op->pid, op->timeout); + pcmk__info("%s[%d] timed out after %dms", op->id, op->pid, + op->timeout); } else { services__set_result(op, services__generic_error(op), @@ -1152,8 +1164,8 @@ wait_for_sync_result(svc_action_t *op, struct sigchld_data_s *data) This is to limit killing wrong target a bit more. */ if ((wait_rc == 0) && (waitpid(op->pid, &status, WNOHANG) == 0)) { if (kill(op->pid, SIGKILL)) { - crm_warn("Could not kill rogue child %s[%d]: %s", - op->id, op->pid, pcmk_rc_str(errno)); + pcmk__warn("Could not kill rogue child %s[%d]: %s", op->id, + op->pid, pcmk_rc_str(errno)); } /* Safe to skip WNOHANG here as we sent non-ignorable signal. */ while ((waitpid(op->pid, &status, 0) == (pid_t) -1) @@ -1165,7 +1177,7 @@ wait_for_sync_result(svc_action_t *op, struct sigchld_data_s *data) } else if (WIFEXITED(status)) { services__set_result(op, WEXITSTATUS(status), PCMK_EXEC_DONE, NULL); parse_exit_reason_from_stderr(op); - crm_info("%s[%d] exited with status %d", op->id, op->pid, op->rc); + pcmk__info("%s[%d] exited with status %d", op->id, op->pid, op->rc); } else if (WIFSIGNALED(status)) { int signo = WTERMSIG(status); @@ -1173,12 +1185,12 @@ wait_for_sync_result(svc_action_t *op, struct sigchld_data_s *data) services__format_result(op, services__generic_error(op), PCMK_EXEC_ERROR, "%s interrupted by %s signal", services__action_kind(op), strsignal(signo)); - crm_info("%s[%d] terminated with signal %d (%s)", - op->id, op->pid, signo, strsignal(signo)); + pcmk__info("%s[%d] terminated with signal %d (%s)", op->id, op->pid, + signo, strsignal(signo)); #ifdef WCOREDUMP if (WCOREDUMP(status)) { - crm_warn("%s[%d] dumped core", op->id, op->pid); + pcmk__warn("%s[%d] dumped core", op->id, op->pid); } #endif @@ -1218,16 +1230,16 @@ services__execute_file(svc_action_t *op) // Catch common failure conditions early if (stat(op->opaque->exec, &st) != 0) { rc = errno; - crm_info("Cannot execute '%s': %s " QB_XS " stat rc=%d", - op->opaque->exec, pcmk_rc_str(rc), rc); + pcmk__info("Cannot execute '%s': %s " QB_XS " stat rc=%d", + op->opaque->exec, pcmk_rc_str(rc), rc); services__handle_exec_error(op, rc); goto done; } if (pipe(stdout_fd) < 0) { rc = errno; - crm_info("Cannot execute '%s': %s " QB_XS " pipe(stdout) rc=%d", - op->opaque->exec, pcmk_rc_str(rc), rc); + pcmk__info("Cannot execute '%s': %s " QB_XS " pipe(stdout) rc=%d", + op->opaque->exec, pcmk_rc_str(rc), rc); services__handle_exec_error(op, rc); goto done; } @@ -1237,21 +1249,21 @@ services__execute_file(svc_action_t *op) close_pipe(stdout_fd); - crm_info("Cannot execute '%s': %s " QB_XS " pipe(stderr) rc=%d", - op->opaque->exec, pcmk_rc_str(rc), rc); + pcmk__info("Cannot execute '%s': %s " QB_XS " pipe(stderr) rc=%d", + op->opaque->exec, pcmk_rc_str(rc), rc); services__handle_exec_error(op, rc); goto done; } - if (pcmk_is_set(pcmk_get_ra_caps(op->standard), pcmk_ra_cap_stdin)) { + if (pcmk__is_set(pcmk_get_ra_caps(op->standard), pcmk_ra_cap_stdin)) { if (pipe(stdin_fd) < 0) { rc = errno; close_pipe(stdout_fd); close_pipe(stderr_fd); - crm_info("Cannot execute '%s': %s " QB_XS " pipe(stdin) rc=%d", - op->opaque->exec, pcmk_rc_str(rc), rc); + pcmk__info("Cannot execute '%s': %s " QB_XS " pipe(stdin) rc=%d", + op->opaque->exec, pcmk_rc_str(rc), rc); services__handle_exec_error(op, rc); goto done; } @@ -1275,8 +1287,8 @@ services__execute_file(svc_action_t *op) close_pipe(stdout_fd); close_pipe(stderr_fd); - crm_info("Cannot execute '%s': %s " QB_XS " fork rc=%d", - op->opaque->exec, pcmk_rc_str(rc), rc); + pcmk__info("Cannot execute '%s': %s " QB_XS " fork rc=%d", + op->opaque->exec, pcmk_rc_str(rc), rc); services__handle_exec_error(op, rc); if (op->synchronous) { sigchld_cleanup(&data); @@ -1292,26 +1304,26 @@ services__execute_file(svc_action_t *op) } if (STDOUT_FILENO != stdout_fd[1]) { if (dup2(stdout_fd[1], STDOUT_FILENO) != STDOUT_FILENO) { - crm_warn("Can't redirect output from '%s': %s " - QB_XS " errno=%d", - op->opaque->exec, pcmk_rc_str(errno), errno); + pcmk__warn("Can't redirect output from '%s': %s " + QB_XS " errno=%d", + op->opaque->exec, pcmk_rc_str(errno), errno); } close(stdout_fd[1]); } if (STDERR_FILENO != stderr_fd[1]) { if (dup2(stderr_fd[1], STDERR_FILENO) != STDERR_FILENO) { - crm_warn("Can't redirect error output from '%s': %s " - QB_XS " errno=%d", - op->opaque->exec, pcmk_rc_str(errno), errno); + pcmk__warn("Can't redirect error output from '%s': %s " + QB_XS " errno=%d", + op->opaque->exec, pcmk_rc_str(errno), errno); } close(stderr_fd[1]); } if ((stdin_fd[0] >= 0) && (STDIN_FILENO != stdin_fd[0])) { if (dup2(stdin_fd[0], STDIN_FILENO) != STDIN_FILENO) { - crm_warn("Can't redirect input to '%s': %s " - QB_XS " errno=%d", - op->opaque->exec, pcmk_rc_str(errno), errno); + pcmk__warn("Can't redirect input to '%s': %s " + QB_XS " errno=%d", + op->opaque->exec, pcmk_rc_str(errno), errno); } close(stdin_fd[0]); } @@ -1334,17 +1346,17 @@ services__execute_file(svc_action_t *op) op->opaque->stdout_fd = stdout_fd[0]; rc = pcmk__set_nonblocking(op->opaque->stdout_fd); if (rc != pcmk_rc_ok) { - crm_info("Could not set '%s' output non-blocking: %s " - QB_XS " rc=%d", - op->opaque->exec, pcmk_rc_str(rc), rc); + pcmk__info("Could not set '%s' output non-blocking: %s " + QB_XS " rc=%d", + op->opaque->exec, pcmk_rc_str(rc), rc); } op->opaque->stderr_fd = stderr_fd[0]; rc = pcmk__set_nonblocking(op->opaque->stderr_fd); if (rc != pcmk_rc_ok) { - crm_info("Could not set '%s' error output non-blocking: %s " - QB_XS " rc=%d", - op->opaque->exec, pcmk_rc_str(rc), rc); + pcmk__info("Could not set '%s' error output non-blocking: %s " + QB_XS " rc=%d", + op->opaque->exec, pcmk_rc_str(rc), rc); } op->opaque->stdin_fd = stdin_fd[1]; @@ -1353,9 +1365,9 @@ services__execute_file(svc_action_t *op) // as long as no other standard uses stdin_fd assume stonith rc = pcmk__set_nonblocking(op->opaque->stdin_fd); if (rc != pcmk_rc_ok) { - crm_info("Could not set '%s' input non-blocking: %s " - QB_XS " fd=%d,rc=%d", op->opaque->exec, - pcmk_rc_str(rc), op->opaque->stdin_fd, rc); + pcmk__info("Could not set '%s' input non-blocking: %s " + QB_XS " fd=%d,rc=%d", op->opaque->exec, + pcmk_rc_str(rc), op->opaque->stdin_fd, rc); } pipe_in_action_stdin_parameters(op); // as long as we are handling parameters directly in here just close @@ -1374,10 +1386,15 @@ services__execute_file(svc_action_t *op) goto done; } - crm_trace("Waiting async for '%s'[%d]", op->opaque->exec, op->pid); - mainloop_child_add_with_flags(op->pid, op->timeout, op->id, op, - pcmk_is_set(op->flags, SVC_ACTION_LEAVE_GROUP)? mainloop_leave_pid_group : 0, - async_action_complete); + pcmk__trace("Waiting async for '%s'[%d]", op->opaque->exec, op->pid); + if (pcmk__is_set(op->flags, SVC_ACTION_LEAVE_GROUP)) { + mainloop_child_add_with_flags(op->pid, op->timeout, op->id, op, + mainloop_leave_pid_group, + async_action_complete); + } else { + mainloop_child_add_with_flags(op->pid, op->timeout, op->id, op, 0, + async_action_complete); + } op->opaque->stdout_gsource = mainloop_add_fd(op->id, G_PRIORITY_LOW, diff --git a/lib/services/services_lsb.c b/lib/services/services_lsb.c index 2dbf9c40800..c2687b459cf 100644 --- a/lib/services/services_lsb.c +++ b/lib/services/services_lsb.c @@ -1,5 +1,5 @@ /* - * Copyright 2010-2024 the Pacemaker project contributors + * Copyright 2010-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -123,7 +123,7 @@ services__get_lsb_metadata(const char *type, char **output) PCMK__LSB_INIT_DIR, type); } - crm_trace("Looking into %s", ra_pathname); + pcmk__trace("Looking into %s", ra_pathname); fp = fopen(ra_pathname, "r"); if (fp == NULL) { return -errno; @@ -215,16 +215,16 @@ services__get_lsb_metadata(const char *type, char **output) } fclose(fp); - *output = crm_strdup_printf(lsb_metadata_template, type, - pcmk__s(long_desc, type), - pcmk__s(short_desc, type), - pcmk__s(provides, ""), - pcmk__s(required_start, ""), - pcmk__s(required_stop, ""), - pcmk__s(should_start, ""), - pcmk__s(should_stop, ""), - pcmk__s(default_start, ""), - pcmk__s(default_stop, "")); + *output = pcmk__assert_asprintf(lsb_metadata_template, type, + pcmk__s(long_desc, type), + pcmk__s(short_desc, type), + pcmk__s(provides, ""), + pcmk__s(required_start, ""), + pcmk__s(required_stop, ""), + pcmk__s(should_start, ""), + pcmk__s(should_stop, ""), + pcmk__s(default_start, ""), + pcmk__s(default_stop, "")); g_free(long_desc); g_free(short_desc); diff --git a/lib/services/services_ocf.c b/lib/services/services_ocf.c index d3f5f14230e..2ace59e95dc 100644 --- a/lib/services/services_ocf.c +++ b/lib/services/services_ocf.c @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the Pacemaker project contributors + * Copyright 2012-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -96,7 +96,7 @@ services__ocf_agent_exists(const char *provider, const char *agent) } for (dir = strtok(dirs, ":"); dir != NULL; dir = strtok(NULL, ":")) { - buf = crm_strdup_printf("%s/%s/%s", dir, provider, agent); + buf = pcmk__assert_asprintf("%s/%s/%s", dir, provider, agent); if (stat(buf, &st) == 0) { free(buf); rc = TRUE; @@ -131,7 +131,8 @@ services__ocf_prepare(svc_action_t *op) // Look for agent on path for (char *dir = strtok(dirs, ":"); dir != NULL; dir = strtok(NULL, ":")) { - char *buf = crm_strdup_printf("%s/%s/%s", dir, op->provider, op->agent); + char *buf = pcmk__assert_asprintf("%s/%s/%s", dir, op->provider, + op->agent); if (stat(buf, &st) == 0) { op->opaque->exec = buf; diff --git a/lib/services/systemd.c b/lib/services/systemd.c index 64cfae0971b..a2570e16a70 100644 --- a/lib/services/systemd.c +++ b/lib/services/systemd.c @@ -71,7 +71,7 @@ services__systemd2ocf(int exit_status) static inline DBusMessage * systemd_new_method(const char *method) { - crm_trace("Calling: %s on " BUS_NAME_MANAGER, method); + pcmk__trace("Calling: %s on " BUS_NAME_MANAGER, method); return dbus_message_new_method_call(BUS_NAME, BUS_PATH, BUS_NAME_MANAGER, method); } @@ -120,7 +120,7 @@ systemd_call_simple_method(const char *method) msg = systemd_new_method(method); if (msg == NULL) { - crm_err("Could not create message to send %s to systemd", method); + pcmk__err("Could not create message to send %s to systemd", method); return NULL; } @@ -129,13 +129,13 @@ systemd_call_simple_method(const char *method) dbus_message_unref(msg); if (dbus_error_is_set(&error)) { - crm_err("Could not send %s to systemd: %s (%s)", - method, error.message, error.name); + pcmk__err("Could not send %s to systemd: %s (%s)", method, + error.message, error.name); dbus_error_free(&error); return NULL; } else if (reply == NULL) { - crm_err("Could not send %s to systemd: no reply received", method); + pcmk__err("Could not send %s to systemd: no reply received", method); return NULL; } @@ -169,8 +169,9 @@ subscribe_to_signals(void) dbus_bus_add_match(systemd_proxy, match_rule, &error); if (dbus_error_is_set(&error)) { - crm_err("Could not listen for systemd DBus signals: %s " QB_XS " (%s)", - error.message, error.name); + pcmk__err("Could not listen for systemd DBus signals: %s " + QB_XS " (%s)", + error.message, error.name); dbus_error_free(&error); return ECOMM; } @@ -194,7 +195,7 @@ systemd_init(void) if (systemd_proxy && dbus_connection_get_is_connected(systemd_proxy) == FALSE) { - crm_warn("Connection to System DBus is closed. Reconnecting..."); + pcmk__warn("Connection to System DBus is closed. Reconnecting..."); pcmk_dbus_disconnect(systemd_proxy); systemd_proxy = NULL; need_init = 1; @@ -284,17 +285,17 @@ systemd_unit_name(const char *name, bool add_instance_name) if (dot) { if (dot != name && *(dot-1) == '@') { - return crm_strdup_printf("%.*spacemaker%s", - (int) (dot - name), name, dot); + return pcmk__assert_asprintf("%.*spacemaker%s", + (int) (dot - name), name, dot); } else { return pcmk__str_copy(name); } } else if (add_instance_name && *(name+strlen(name)-1) == '@') { - return crm_strdup_printf("%spacemaker.service", name); + return pcmk__assert_asprintf("%spacemaker.service", name); } else { - return crm_strdup_printf("%s.service", name); + return pcmk__assert_asprintf("%s.service", name); } } @@ -311,12 +312,12 @@ systemd_daemon_reload_complete(DBusPendingCall *pending, void *user_data) } if (pcmk_dbus_find_error(pending, reply, &error)) { - crm_warn("Could not issue systemd reload %d: %s", - reload_count, error.message); + pcmk__warn("Could not issue systemd reload %d: %s", reload_count, + error.message); dbus_error_free(&error); } else { - crm_trace("Reload %d complete", reload_count); + pcmk__trace("Reload %d complete", reload_count); } if(pending) { @@ -360,9 +361,9 @@ set_result_from_method_error(svc_action_t *op, const DBusError *error) || strstr(error->name, "org.freedesktop.systemd1.NoSuchUnit")) { if (pcmk__str_eq(op->action, PCMK_ACTION_STOP, pcmk__str_casei)) { - crm_trace("Masking systemd stop failure (%s) for %s " - "because unknown service can be considered stopped", - error->name, pcmk__s(op->rsc, "unknown resource")); + pcmk__trace("Masking systemd stop failure (%s) for %s " + "because unknown service can be considered stopped", + error->name, pcmk__s(op->rsc, "unknown resource")); services__set_result(op, PCMK_OCF_OK, PCMK_EXEC_DONE, NULL); return; } @@ -372,10 +373,10 @@ set_result_from_method_error(svc_action_t *op, const DBusError *error) "systemd unit %s not found", op->agent); } - crm_info("DBus request for %s of systemd unit %s%s%s failed: %s", - op->action, op->agent, - ((op->rsc == NULL)? "" : " for resource "), pcmk__s(op->rsc, ""), - error->message); + pcmk__info("DBus request for %s of systemd unit %s%s%s failed: %s", + op->action, op->agent, + ((op->rsc != NULL)? " for resource " : ""), pcmk__s(op->rsc, ""), + error->message); } /*! @@ -408,11 +409,12 @@ execute_after_loadunit(DBusMessage *reply, svc_action_t *op) if (op != NULL) { services__set_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_ERROR, "systemd DBus method had unexpected reply"); - crm_info("Could not load systemd unit %s for %s: " - "DBus reply has unexpected type", op->agent, op->id); + pcmk__info("Could not load systemd unit %s for %s: DBus reply has " + "unexpected type", + op->agent, op->id); } else { - crm_info("Could not load systemd unit: " - "DBus reply has unexpected type"); + pcmk__info("Could not load systemd unit: DBus reply has unexpected " + "type"); } } else { @@ -449,7 +451,7 @@ loadunit_completed(DBusPendingCall *pending, void *user_data) DBusMessage *reply = NULL; svc_action_t *op = user_data; - crm_trace("LoadUnit result for %s arrived", op->id); + pcmk__trace("LoadUnit result for %s arrived", op->id); // Grab the reply if (pending != NULL) { @@ -616,13 +618,15 @@ systemd_unit_listall(void) return NULL; } if (!dbus_message_iter_init(reply, &args)) { - crm_err("Could not list systemd unit files: systemd reply has no arguments"); + pcmk__err("Could not list systemd unit files: systemd reply has no " + "arguments"); dbus_message_unref(reply); return NULL; } if (!pcmk_dbus_type_check(reply, &args, DBUS_TYPE_ARRAY, __func__, __LINE__)) { - crm_err("Could not list systemd unit files: systemd reply has invalid arguments"); + pcmk__err("Could not list systemd unit files: systemd reply has " + "invalid arguments"); dbus_message_unref(reply); return NULL; } @@ -637,28 +641,28 @@ systemd_unit_listall(void) char *basename = NULL; if(!pcmk_dbus_type_check(reply, &unit, DBUS_TYPE_STRUCT, __func__, __LINE__)) { - crm_warn("Skipping systemd reply argument with unexpected type"); + pcmk__warn("Skipping systemd reply argument with unexpected type"); continue; } dbus_message_iter_recurse(&unit, &elem); if(!pcmk_dbus_type_check(reply, &elem, DBUS_TYPE_STRING, __func__, __LINE__)) { - crm_warn("Skipping systemd reply argument with no string"); + pcmk__warn("Skipping systemd reply argument with no string"); continue; } dbus_message_iter_get_basic(&elem, &value); if (value.str == NULL) { - crm_debug("ListUnitFiles reply did not provide a string"); + pcmk__debug("ListUnitFiles reply did not provide a string"); continue; } - crm_trace("DBus ListUnitFiles listed: %s", value.str); + pcmk__trace("DBus ListUnitFiles listed: %s", value.str); match = systemd_unit_extension(value.str); if (match == NULL) { // This is not a unit file type we know how to manage - crm_debug("ListUnitFiles entry '%s' is not supported as resource", - value.str); + pcmk__debug("ListUnitFiles entry '%s' is not supported as resource", + value.str); continue; } @@ -683,7 +687,7 @@ systemd_unit_listall(void) dbus_message_unref(reply); - crm_trace("Found %d manageable systemd unit files", nfiles); + pcmk__trace("Found %d manageable systemd unit files", nfiles); units = g_list_sort(units, sort_str); return units; } @@ -759,17 +763,17 @@ systemd_unit_metadata(const char *name, int timeout) desc = systemd_get_property(path, "Description", NULL, NULL, NULL, timeout); } else { - desc = crm_strdup_printf("Systemd unit file for %s", name); + desc = pcmk__assert_asprintf("Systemd unit file for %s", name); } if (pcmk__xml_needs_escape(desc, pcmk__xml_escape_text)) { gchar *escaped = pcmk__xml_escape(desc, pcmk__xml_escape_text); - meta = crm_strdup_printf(METADATA_FORMAT, name, escaped, name); + meta = pcmk__assert_asprintf(METADATA_FORMAT, name, escaped, name); g_free(escaped); } else { - meta = crm_strdup_printf(METADATA_FORMAT, name, desc, name); + meta = pcmk__assert_asprintf(METADATA_FORMAT, name, desc, name); } free(desc); @@ -804,9 +808,9 @@ process_unit_method_reply(DBusMessage *reply, svc_action_t *op) __func__, __LINE__)) { const char *reason = "systemd D-Bus method had unexpected reply"; - crm_info("DBus request for %s of %s succeeded but " - "return type was unexpected", - op->action, pcmk__s(op->rsc, "unknown resource")); + pcmk__info("DBus request for %s of %s succeeded but return type was " + "unexpected", + op->action, pcmk__s(op->rsc, "unknown resource")); if (!op->synchronous && start_stop) { /* The start or stop job is enqueued but is not complete. We need a @@ -829,8 +833,8 @@ process_unit_method_reply(DBusMessage *reply, svc_action_t *op) DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); - crm_debug("DBus request for %s of %s using %s succeeded", - op->action, pcmk__s(op->rsc, "unknown resource"), path); + pcmk__debug("DBus request for %s of %s using %s succeeded", + op->action, pcmk__s(op->rsc, "unknown resource"), path); if (!op->synchronous && start_stop) { // Should be set to unknown/pending already @@ -890,8 +894,8 @@ job_removed_filter(DBusConnection *connection, DBusMessage *message, DBUS_TYPE_STRING, &unit_name, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID)) { - crm_err("Could not interpret systemd DBus signal: %s " QB_XS " (%s)", - error.message, error.name); + pcmk__err("Could not interpret systemd DBus signal: %s " QB_XS " (%s)", + error.message, error.name); dbus_error_free(&error); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -903,8 +907,9 @@ job_removed_filter(DBusConnection *connection, DBusMessage *message, action_name = pcmk__s(action->action, "(unknown)"); - crm_trace("Setting %s result for %s (JobRemoved id=%" PRIu32 ", result=%s", - action_name, unit_name, job_id, result); + pcmk__trace("Setting %s result for %s (JobRemoved id=%" PRIu32 + ", result=%s", + action_name, unit_name, job_id, result); if (pcmk__str_eq(result, "done", pcmk__str_none)) { services__set_result(action, PCMK_OCF_OK, PCMK_EXEC_DONE, NULL); @@ -954,7 +959,7 @@ unit_method_complete(DBusPendingCall *pending, void *user_data) DBusMessage *reply = NULL; svc_action_t *op = user_data; - crm_trace("Result for %s arrived", op->id); + pcmk__trace("Result for %s arrived", op->id); // Grab the reply if (pending != NULL) { @@ -987,7 +992,7 @@ unit_method_complete(DBusPendingCall *pending, void *user_data) finalize_async_action_dbus)) { return; } - crm_err("Could not add D-Bus filter for systemd JobRemoved signals"); + pcmk__err("Could not add D-Bus filter for systemd JobRemoved signals"); services__set_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_ERROR, "Failed to add D-Bus filter for systemd " "JobRemoved signal"); @@ -1074,8 +1079,8 @@ systemd_create_override(const char *agent, int timeout) filename = get_override_dir(unit_name); rc = pcmk__build_path(filename->str, 0755); if (rc != pcmk_rc_ok) { - crm_err("Could not create systemd override directory %s: %s", - filename->str, pcmk_rc_str(rc)); + pcmk__err("Could not create systemd override directory %s: %s", + filename->str, pcmk_rc_str(rc)); goto done; } @@ -1083,8 +1088,8 @@ systemd_create_override(const char *agent, int timeout) fp = fopen(filename->str, "w"); if (fp == NULL) { rc = errno; - crm_err("Cannot open systemd override file %s for writing: %s", - filename->str, pcmk_rc_str(rc)); + pcmk__err("Cannot open systemd override file %s for writing: %s", + filename->str, pcmk_rc_str(rc)); goto done; } @@ -1092,8 +1097,8 @@ systemd_create_override(const char *agent, int timeout) fd = fileno(fp); if ((fd < 0) || (fchmod(fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0)) { rc = errno; - crm_err("Failed to set permissions on systemd override file %s: %s", - filename->str, pcmk_rc_str(rc)); + pcmk__err("Failed to set permissions on systemd override file %s: %s", + filename->str, pcmk_rc_str(rc)); goto done; } @@ -1105,7 +1110,7 @@ systemd_create_override(const char *agent, int timeout) if (fputs(override->str, fp) == EOF) { rc = EIO; - crm_err("Cannot write to systemd override file %s", filename->str); + pcmk__err("Cannot write to systemd override file %s", filename->str); } done: @@ -1150,8 +1155,8 @@ systemd_remove_override(const char *agent, int timeout) if (rc != ENOENT) { // Stop may be called when already stopped, which is fine - crm_warn("Cannot remove systemd override file %s: %s", - filename->str, pcmk_rc_str(rc)); + pcmk__warn("Cannot remove systemd override file %s: %s", + filename->str, pcmk_rc_str(rc)); } } else { @@ -1183,9 +1188,8 @@ parse_status_result(const char *name, const char *state, void *userdata) { svc_action_t *op = userdata; - crm_trace("Resource %s has %s='%s'", - pcmk__s(op->rsc, "(unspecified)"), name, - pcmk__s(state, "")); + pcmk__trace("Resource %s has %s='%s'", pcmk__s(op->rsc, "(unspecified)"), + name, pcmk__s(state, "")); if (pcmk__str_eq(state, "active", pcmk__str_none)) { services__set_result(op, PCMK_OCF_OK, PCMK_EXEC_DONE, NULL); @@ -1282,9 +1286,9 @@ invoke_unit_by_path(svc_action_t *op, const char *unit) return; } - crm_trace("Calling %s for unit path %s%s%s", - method, unit, - ((op->rsc == NULL)? "" : " for resource "), pcmk__s(op->rsc, "")); + pcmk__trace("Calling %s for unit path %s%s%s", method, unit, + ((op->rsc != NULL)? " for resource " : ""), + pcmk__s(op->rsc, "")); msg = systemd_new_method(method); pcmk__assert(msg != NULL); @@ -1333,8 +1337,8 @@ systemd_timeout_callback(gpointer p) svc_action_t * op = p; op->opaque->timerid = 0; - crm_info("%s action for systemd unit %s named '%s' timed out", - op->action, op->agent, op->rsc); + pcmk__info("%s action for systemd unit %s named '%s' timed out", op->action, + op->agent, op->rsc); services__format_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_TIMEOUT, "%s action for systemd unit %s " "did not complete in time", op->action, op->agent); @@ -1382,9 +1386,10 @@ services__execute_systemd(svc_action_t *op) goto done; } - crm_debug("Performing %ssynchronous %s op on systemd unit %s%s%s", - (op->synchronous? "" : "a"), op->action, op->agent, - ((op->rsc == NULL)? "" : " for resource "), pcmk__s(op->rsc, "")); + pcmk__debug("Performing %ssynchronous %s op on systemd unit %s%s%s", + (op->synchronous? "" : "a"), op->action, op->agent, + ((op->rsc != NULL)? " for resource " : ""), + pcmk__s(op->rsc, "")); if (pcmk__str_eq(op->action, PCMK_ACTION_META_DATA, pcmk__str_casei)) { op->stdout_data = systemd_unit_metadata(op->agent, op->timeout); diff --git a/mk/tap.mk b/mk/tap.mk index e06f9a86247..bac6d0e7e09 100644 --- a/mk/tap.mk +++ b/mk/tap.mk @@ -1,5 +1,5 @@ # -# Copyright 2021-2024 the Pacemaker project contributors +# Copyright 2021-2025 the Pacemaker project contributors # # The version control history for this file may have further details. # @@ -24,7 +24,7 @@ WRAPPED = abort \ getenv \ getpid \ getgrent \ - getpwnam_r \ + getpwnam \ readlink \ realloc \ setenv \ diff --git a/tools/cibadmin.c b/tools/cibadmin.c index a5b5505a99c..ee5562f344a 100644 --- a/tools/cibadmin.c +++ b/tools/cibadmin.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -10,6 +10,7 @@ #include #include #include +#include // pcmk_acl_required() #include #include #include @@ -76,8 +77,8 @@ print_xml_output(xmlNode * xml) return; } - if (pcmk_is_set(options.cmd_options, cib_xpath_address)) { - const char *id = crm_element_value(xml, PCMK_XA_ID); + if (pcmk__is_set(options.cmd_options, cib_xpath_address)) { + const char *id = pcmk__xe_get(xml, PCMK_XA_ID); if (pcmk__xe_is(xml, PCMK__XE_XPATH_QUERY)) { xmlNode *child = NULL; @@ -106,7 +107,7 @@ report_schema_unchanged(void) { const char *err = pcmk_rc_str(pcmk_rc_schema_unchanged); - crm_info("Upgrade unnecessary: %s\n", err); + pcmk__info("Upgrade unnecessary: %s\n", err); printf("Upgrade unnecessary: %s\n", err); exit_code = CRM_EX_OK; } @@ -592,7 +593,7 @@ main(int argc, char **argv) GString *buf = g_string_sized_new(1024); output = createEmptyCib(1); - crm_xml_add(output, PCMK_XA_VALIDATE_WITH, options.validate_with); + pcmk__xe_set(output, PCMK_XA_VALIDATE_WITH, options.validate_with); pcmk__xml_string(output, pcmk__xml_fmt_pretty, buf, 0); fprintf(stdout, "%s", buf->str); @@ -712,7 +713,7 @@ main(int argc, char **argv) } if (input != NULL) { - crm_log_xml_debug(input, "[admin input]"); + pcmk__log_xml_debug(input, "[admin input]"); } else if (source != NULL) { exit_code = CRM_EX_CONFIG; @@ -766,8 +767,8 @@ main(int argc, char **argv) rc = pcmk_legacy2rc(rc); exit_code = pcmk_rc2exitc(rc); - crm_err("Init failed, could not perform requested operations: %s", - pcmk_rc_str(rc)); + pcmk__err("Init failed, could not perform requested operations: %s", + pcmk_rc_str(rc)); g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "Init failed, could not perform requested operations: %s", pcmk_rc_str(rc)); @@ -783,7 +784,7 @@ main(int argc, char **argv) report_schema_unchanged(); } else if (rc != pcmk_rc_ok) { - crm_err("Call failed: %s", pcmk_rc_str(rc)); + pcmk__err("Call failed: %s", pcmk_rc_str(rc)); fprintf(stderr, "Call failed: %s\n", pcmk_rc_str(rc)); exit_code = pcmk_rc2exitc(rc); @@ -836,7 +837,7 @@ main(int argc, char **argv) print_xml_output(output); } - crm_trace("%s exiting normally", crm_system_name); + pcmk__trace("%s exiting normally", crm_system_name); done: g_strfreev(processed_args); @@ -876,7 +877,7 @@ do_work(xmlNode *input, xmlNode **output) } } - crm_trace("Passing \"%s\" to variant_op...", options.cib_action); + pcmk__trace("Passing \"%s\" to variant_op...", options.cib_action); return cib_internal_op(the_cib, options.cib_action, options.dest_node, options.cib_section, input, output, options.cmd_options, options.cib_user); @@ -890,7 +891,7 @@ do_init(void) the_cib = cib_new(); rc = cib__signon_attempts(the_cib, cib_command, 5); if (rc != pcmk_ok) { - crm_err("Could not connect to the CIB: %s", pcmk_strerror(rc)); + pcmk__err("Could not connect to the CIB: %s", pcmk_strerror(rc)); fprintf(stderr, "Could not connect to the CIB: %s\n", pcmk_strerror(rc)); } diff --git a/tools/crm_attribute.c b/tools/crm_attribute.c index 9db4ded4e4e..86d799a90cb 100644 --- a/tools/crm_attribute.c +++ b/tools/crm_attribute.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -409,7 +409,7 @@ delete_attr_on_node(xmlNode *child, void *userdata) { struct delete_data_s *dd = (struct delete_data_s *) userdata; - const char *attr_name = crm_element_value(child, PCMK_XA_NAME); + const char *attr_name = pcmk__xe_get(child, PCMK_XA_NAME); int rc = pcmk_rc_ok; if (!pcmk__str_eq(attr_name, options.attr_pattern, pcmk__str_regex)) { @@ -497,7 +497,7 @@ update_attr_on_node(xmlNode *child, void *userdata) { struct update_data_s *ud = (struct update_data_s *) userdata; - const char *attr_name = crm_element_value(child, PCMK_XA_NAME); + const char *attr_name = pcmk__xe_get(child, PCMK_XA_NAME); if (!pcmk__str_eq(attr_name, options.attr_pattern, pcmk__str_regex)) { return pcmk_rc_ok; @@ -561,8 +561,8 @@ output_one_attribute(xmlNode *node, void *userdata) { struct output_data_s *od = (struct output_data_s *) userdata; - const char *name = crm_element_value(node, PCMK_XA_NAME); - const char *value = crm_element_value(node, PCMK_XA_VALUE); + const char *name = pcmk__xe_get(node, PCMK_XA_NAME); + const char *value = pcmk__xe_get(node, PCMK_XA_VALUE); const char *type = options.type; const char *attr_id = options.attr_id; @@ -574,9 +574,9 @@ output_one_attribute(xmlNode *node, void *userdata) od->out->message(od->out, "attribute", type, attr_id, name, value, NULL, od->out->quiet, true); od->did_output = true; - crm_info("Read %s='%s' %s%s", - pcmk__s(name, ""), pcmk__s(value, ""), - options.set_name ? "in " : "", options.set_name ? options.set_name : ""); + pcmk__info("Read %s='%s' %s%s", pcmk__s(name, ""), pcmk__s(value, ""), + ((options.set_name != NULL)? "in " : ""), + pcmk__s(options.set_name, "")); return pcmk_rc_ok; } @@ -816,7 +816,7 @@ main(int argc, char **argv) } if (options.inhibit) { - crm_warn("Inhibiting notifications for this update"); + pcmk__warn("Inhibiting notifications for this update"); cib__set_call_options(cib_opts, crm_system_name, cib_inhibit_notify); } @@ -940,8 +940,8 @@ main(int argc, char **argv) if (options.command == attr_cmd_delete) { update = ""; } - crm_info("Update %s=%s sent to the attribute manager", - options.attr_name, update); + pcmk__info("Update %s=%s sent to the attribute manager", + options.attr_name, update); } else if (options.command == attr_cmd_delete) { rc = command_delete(out, the_cib); diff --git a/tools/crm_diff.c b/tools/crm_diff.c index 6fb5a1fb9f5..6f084651e82 100644 --- a/tools/crm_diff.c +++ b/tools/crm_diff.c @@ -1,5 +1,5 @@ /* - * Copyright 2005-2024 the Pacemaker project contributors + * Copyright 2005-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -9,210 +9,182 @@ #include -#include -#include -#include -#include -#include -#include -#include +#include // bool +#include // NULL, printf(), etc. +#include // free() -#include -#include -#include -#include -#include -#include +#include // GOption, etc. +#include // xmlNode -#define SUMMARY "Compare two Pacemaker configurations (in XML format) to produce a custom diff-like output, " \ - "or apply such an output as a patch" +#include // xml_{create,apply}_patchset() + +#define SUMMARY "Compare two Pacemaker configurations (in XML format) to " \ + "produce a custom diff-like output, or apply such an output " \ + "as a patch" +#define INDENT " " struct { - gboolean apply; + gchar *source_file; + gchar *target_file; + gchar *source_string; + gchar *target_string; + bool patch; gboolean as_cib; gboolean no_version; - gboolean raw_original; - gboolean raw_new; - gboolean use_stdin; - char *xml_file_original; - char *xml_file_new; + gboolean use_stdin; //!< \deprecated } options; -gboolean new_string_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **error); -gboolean original_string_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **error); -gboolean patch_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **error); +static gboolean +patch_cb(const gchar *option_name, const gchar *optarg, gpointer data, + GError **error) +{ + options.patch = true; + g_free(options.target_file); + options.target_file = g_strdup(optarg); + return TRUE; +} +/* @COMPAT Use last-one-wins for original/new/patch input sources + * + * @COMPAT Precedence is --original-string > --stdin > --original. --stdin is + * now deprecated and hidden, so we don't mention it in the help text. + */ static GOptionEntry original_xml_entries[] = { - { "original", 'o', 0, G_OPTION_ARG_STRING, &options.xml_file_original, - "XML is contained in the named file", + { "original", 'o', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, + &options.source_file, + "XML is contained in the named file. Currently --original-string\n" + INDENT "overrides this. In a future release, the last one specified\n" + INDENT "will be used.", "FILE" }, - { "original-string", 'O', 0, G_OPTION_ARG_CALLBACK, original_string_cb, - "XML is contained in the supplied string", + { "original-string", 'O', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, + &options.source_string, + "XML is contained in the supplied string. Currently this takes\n" + INDENT "precedence over --original. In a future release, the last one\n" + INDENT "release, the last one specified will be used.", "STRING" }, { NULL } }; +/* @COMPAT Precedence is --original-string > --stdin > --original. --stdin is + * now deprecated and hidden, so we don't mention it in the help text. + */ static GOptionEntry operation_entries[] = { - { "new", 'n', 0, G_OPTION_ARG_STRING, &options.xml_file_new, - "Compare the original XML to the contents of the named file", + { "new", 'n', G_OPTION_FLAG_NONE, G_OPTION_ARG_STRING, &options.target_file, + "Compare the original XML to the contents of the named file. Currently\n" + INDENT "--new-string overrides this. In a future release, the last one\n" + INDENT "specified will be used.", "FILE" }, - { "new-string", 'N', 0, G_OPTION_ARG_CALLBACK, new_string_cb, - "Compare the original XML with the contents of the supplied string", + { "new-string", 'N', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, + &options.target_string, + "Compare the original XML with the contents of the supplied string.\n" + INDENT "Currently this takes precedence over --patch and --new. In a \n" + INDENT "future release, the last one specified will be used.", "STRING" }, - { "patch", 'p', 0, G_OPTION_ARG_CALLBACK, patch_cb, - "Patch the original XML with the contents of the named file", + { "patch", 'p', G_OPTION_FLAG_NONE, G_OPTION_ARG_CALLBACK, patch_cb, + "Patch the original XML with the contents of the named file. Currently\n" + INDENT "--new-string and (if specified later) --new override the input\n" + INDENT "source specified here. In a future release, the last one\n" + INDENT "specified will be used. Note: even if this input source is\n" + INDENT "overridden, the input source will be applied as a patch to the\n" + INDENT "original XML.", "FILE" }, { NULL } }; static GOptionEntry addl_entries[] = { - { "cib", 'c', 0, G_OPTION_ARG_NONE, &options.as_cib, - "Compare/patch the inputs as a CIB (includes versions details)", + { "cib", 'c', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, &options.as_cib, + "Compare/patch the inputs as a CIB (includes version details)", NULL }, - { "stdin", 's', 0, G_OPTION_ARG_NONE, &options.use_stdin, - "", + { "no-version", 'u', G_OPTION_FLAG_NONE, G_OPTION_ARG_NONE, + &options.no_version, + "Generate the difference without version details", NULL }, - { "no-version", 'u', 0, G_OPTION_ARG_NONE, &options.no_version, - "Generate the difference without versions details", + + // @COMPAT Deprecated + { "stdin", 's', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &options.use_stdin, + "Get the original XML and new (or patch) XML from stdin. Currently\n" + INDENT "--original-string and --new-string override this for original\n" + INDENT "and new/patch XML, respectively. In a future release, the last\n" + INDENT "one specified will be used.", NULL }, { NULL } }; -gboolean -new_string_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **error) { - options.raw_new = TRUE; - pcmk__str_update(&options.xml_file_new, optarg); - return TRUE; -} - -gboolean -original_string_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **error) { - options.raw_original = TRUE; - pcmk__str_update(&options.xml_file_original, optarg); - return TRUE; -} - -gboolean -patch_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **error) { - options.apply = TRUE; - pcmk__str_update(&options.xml_file_new, optarg); - return TRUE; -} - -static void -print_patch(xmlNode *patch) -{ - GString *buffer = g_string_sized_new(1024); - - pcmk__xml_string(patch, pcmk__xml_fmt_pretty, buffer, 0); - - printf("%s", buffer->str); - g_string_free(buffer, TRUE); - fflush(stdout); -} - -// \return Standard Pacemaker return code -static int -apply_patch(xmlNode *input, xmlNode *patch, gboolean as_cib) -{ - xmlNode *output = pcmk__xml_copy(NULL, input); - int rc = xml_apply_patchset(output, patch, as_cib); - - rc = pcmk_legacy2rc(rc); - if (rc != pcmk_rc_ok) { - fprintf(stderr, "Could not apply patch: %s\n", pcmk_rc_str(rc)); - pcmk__xml_free(output); - return rc; - } - - if (output != NULL) { - char *buffer; - - print_patch(output); - - buffer = pcmk__digest_xml(output, true); - crm_trace("Digest: %s", pcmk__s(buffer, "\n")); - free(buffer); - pcmk__xml_free(output); - } - return pcmk_rc_ok; -} - -static void -log_patch_cib_versions(xmlNode *patch) -{ - int add[] = { 0, 0, 0 }; - int del[] = { 0, 0, 0 }; - - const char *fmt = NULL; - const char *digest = NULL; - - xml_patch_versions(patch, add, del); - fmt = crm_element_value(patch, PCMK_XA_FORMAT); - digest = crm_element_value(patch, PCMK__XA_DIGEST); - - if (add[2] != del[2] || add[1] != del[1] || add[0] != del[0]) { - crm_info("Patch: --- %d.%d.%d %s", del[0], del[1], del[2], fmt); - crm_info("Patch: +++ %d.%d.%d %s", add[0], add[1], add[2], digest); - } -} - -// \return Standard Pacemaker return code +/*! + * \internal + * \brief Create an XML patchset from the given source and target XML trees + * + * \param[in,out] out Output object + * \param[in,out] source Source XML + * \param[in,out] target Target XML + * \param[in] as_cib If \c true, treat the XML trees as CIBs. In + * particular, ignore attribute position changes, + * include the target digest in the patchset, and log + * the source and target CIB versions. + * \param[in] no_version If \c true, ignore changes to the CIB version + * (must be \c false if \p as_cib is \c true) + * + * \return Standard Pacemaker return code + */ static int -generate_patch(xmlNode *object_original, xmlNode *object_new, const char *xml_file_new, - gboolean as_cib, gboolean no_version) +generate_patch(pcmk__output_t *out, xmlNode *source, xmlNode *target, + bool as_cib, bool no_version) { - const char *vfields[] = { + static const char *const vfields[] = { PCMK_XA_ADMIN_EPOCH, PCMK_XA_EPOCH, PCMK_XA_NUM_UPDATES, }; - xmlNode *output = NULL; + xmlNode *patchset = NULL; + GString *buffer = NULL; - /* If we're ignoring the version, make the version information - * identical, so it isn't detected as a change. */ - if (no_version) { - int lpc; + // Currently impossibly; just a reminder for when we move to libpacemaker + pcmk__assert(!as_cib || !no_version); - for (lpc = 0; lpc < PCMK__NELEM(vfields); lpc++) { - crm_copy_xml_element(object_original, object_new, vfields[lpc]); + /* If we're ignoring the version, make the version information identical, so + * it isn't detected as a change. + */ + if (no_version) { + for (int i = 0; i < PCMK__NELEM(vfields); i++) { + pcmk__xe_set(target, vfields[i], pcmk__xe_get(source, vfields[i])); } } - xml_track_changes(object_new, NULL, object_new, FALSE); - if(as_cib) { - xml_calculate_significant_changes(object_original, object_new); - } else { - xml_calculate_changes(object_original, object_new); + if (as_cib) { + pcmk__xml_doc_set_flags(target->doc, pcmk__xf_ignore_attr_pos); } - crm_log_xml_debug(object_new, (xml_file_new? xml_file_new: "target")); + pcmk__xml_mark_changes(source, target); + pcmk__log_xml_debug(target, "target"); - output = xml_create_patchset(0, object_original, object_new, NULL, FALSE); + patchset = xml_create_patchset(0, source, target, NULL, false); - pcmk__log_xml_changes(LOG_INFO, object_new); - xml_accept_changes(object_new); + pcmk__log_xml_changes(LOG_INFO, target); + pcmk__xml_commit_changes(target->doc); - if (output == NULL) { + if (patchset == NULL) { return pcmk_rc_ok; // No changes } - patchset_process_digest(output, object_original, object_new, as_cib); - if (as_cib) { - log_patch_cib_versions(output); + pcmk__xml_patchset_add_digest(patchset, target); } else if (no_version) { - pcmk__xml_free(pcmk__xe_first_child(output, PCMK_XE_VERSION, NULL, + pcmk__xml_free(pcmk__xe_first_child(patchset, PCMK_XE_VERSION, NULL, NULL)); } - pcmk__log_xml_patchset(LOG_NOTICE, output); - print_patch(output); - pcmk__xml_free(output); + pcmk__log_xml_patchset(LOG_NOTICE, patchset); + + buffer = g_string_sized_new(1024); + pcmk__xml_string(patchset, pcmk__xml_fmt_pretty, buffer, 0); + out->output_xml(out, PCMK_XE_DIFF, buffer->str); + + pcmk__xml_free(patchset); + g_string_free(buffer, TRUE); /* pcmk_rc_error means there's a non-empty diff. * @COMPAT Choose a more descriptive return code, like one that maps to @@ -221,8 +193,17 @@ generate_patch(xmlNode *object_original, xmlNode *object_new, const char *xml_fi return pcmk_rc_error; } +static const pcmk__supported_format_t formats[] = { + PCMK__SUPPORTED_FORMAT_NONE, + PCMK__SUPPORTED_FORMAT_TEXT, + PCMK__SUPPORTED_FORMAT_XML, + + { NULL, NULL, NULL } +}; + static GOptionContext * -build_arg_context(pcmk__common_args_t *args) { +build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) +{ GOptionContext *context = NULL; const char *description = "Examples:\n\n" @@ -236,7 +217,7 @@ build_arg_context(pcmk__common_args_t *args) { "Apply the patch to the running cluster:\n\n" "\t# cibadmin --patch -x patch.xml\n"; - context = pcmk__build_arg_context(args, NULL, NULL, NULL); + context = pcmk__build_arg_context(args, "text (default), xml", group, NULL); g_option_context_set_description(context, description); pcmk__add_arg_group(context, "xml", "Original XML:", @@ -251,17 +232,22 @@ build_arg_context(pcmk__common_args_t *args) { int main(int argc, char **argv) { - xmlNode *object_original = NULL; - xmlNode *object_new = NULL; - crm_exit_t exit_code = CRM_EX_OK; + int rc = pcmk_rc_ok; + + xmlNode *source = NULL; + xmlNode *target = NULL; + + pcmk__output_t *out = NULL; + GError *error = NULL; + GOptionGroup *output_group = NULL; pcmk__common_args_t *args = pcmk__new_common_args(SUMMARY); gchar **processed_args = pcmk__cmdline_preproc(argv, "nopNO"); - GOptionContext *context = build_arg_context(args); + GOptionContext *context = build_arg_context(args, &output_group); - int rc = pcmk_rc_ok; + pcmk__register_formats(output_group, formats); if (!g_option_context_parse_strv(context, &processed_args, &error)) { exit_code = CRM_EX_USAGE; @@ -270,69 +256,113 @@ main(int argc, char **argv) pcmk__cli_init_logging("crm_diff", args->verbosity); - if (args->version) { - g_strfreev(processed_args); - pcmk__free_arg_context(context); - /* FIXME: When crm_diff is converted to use formatted output, this can go. */ - pcmk__cli_help('v'); + rc = pcmk__output_new(&out, args->output_ty, args->output_dest, argv); + if (rc != pcmk_rc_ok) { + exit_code = CRM_EX_ERROR; + g_set_error(&error, PCMK__EXITC_ERROR, exit_code, + "Error creating output format %s: %s", args->output_ty, + pcmk_rc_str(rc)); + goto done; } - if (options.apply && options.no_version) { - fprintf(stderr, "warning: -u/--no-version ignored with -p/--patch\n"); - } else if (options.as_cib && options.no_version) { - fprintf(stderr, "error: -u/--no-version incompatible with -c/--cib\n"); - exit_code = CRM_EX_USAGE; + if (args->version) { + out->version(out, false); goto done; } - if (options.raw_original) { - object_original = pcmk__xml_parse(options.xml_file_original); + if (options.no_version) { + if (options.as_cib) { + exit_code = CRM_EX_USAGE; + g_set_error(&error, PCMK__EXITC_ERROR, exit_code, + "-u/--no-version incompatible with -c/--cib"); + goto done; + } + if (options.patch) { + out->err(out, "Warning: -u/--no-version ignored with -p/--patch"); + } + } + + if (options.source_string != NULL) { + source = pcmk__xml_parse(options.source_string); } else if (options.use_stdin) { - fprintf(stderr, "Input first XML fragment:"); - object_original = pcmk__xml_read(NULL); + source = pcmk__xml_read(NULL); + + } else if (options.source_file != NULL) { + source = pcmk__xml_read(options.source_file); - } else if (options.xml_file_original != NULL) { - object_original = pcmk__xml_read(options.xml_file_original); + } else { + exit_code = CRM_EX_USAGE; + g_set_error(&error, PCMK__EXITC_ERROR, exit_code, + "Either --original or --original-string must be specified"); + goto done; } - if (options.raw_new) { - object_new = pcmk__xml_parse(options.xml_file_new); + if (options.target_string != NULL) { + target = pcmk__xml_parse(options.target_string); } else if (options.use_stdin) { - fprintf(stderr, "Input second XML fragment:"); - object_new = pcmk__xml_read(NULL); + target = pcmk__xml_read(NULL); + + } else if (options.target_file != NULL) { + target = pcmk__xml_read(options.target_file); - } else if (options.xml_file_new != NULL) { - object_new = pcmk__xml_read(options.xml_file_new); + } else { + exit_code = CRM_EX_USAGE; + g_set_error(&error, PCMK__EXITC_ERROR, exit_code, + "Either --new, --new-string, or --patch must be specified"); + goto done; } - if (object_original == NULL) { - fprintf(stderr, "Could not parse the first XML fragment\n"); + if (source == NULL) { exit_code = CRM_EX_DATAERR; + g_set_error(&error, PCMK__EXITC_ERROR, exit_code, + "Failed to parse original XML"); goto done; } - if (object_new == NULL) { - fprintf(stderr, "Could not parse the second XML fragment\n"); + if (target == NULL) { exit_code = CRM_EX_DATAERR; + g_set_error(&error, PCMK__EXITC_ERROR, exit_code, + "Failed to parse %s XML", (options.patch? "patch" : "new")); goto done; } - if (options.apply) { - rc = apply_patch(object_original, object_new, options.as_cib); + if (options.patch) { + rc = xml_apply_patchset(source, target, options.as_cib); + rc = pcmk_legacy2rc(rc); + if (rc != pcmk_rc_ok) { + g_set_error(&error, PCMK__RC_ERROR, rc, + "Could not apply patch: %s", pcmk_rc_str(rc)); + } else { + GString *buffer = g_string_sized_new(1024); + + pcmk__xml_string(source, pcmk__xml_fmt_pretty, buffer, 0); + out->output_xml(out, PCMK_XE_DIFF, buffer->str); + g_string_free(buffer, TRUE); + } + } else { - rc = generate_patch(object_original, object_new, options.xml_file_new, options.as_cib, options.no_version); + rc = generate_patch(out, source, target, options.as_cib, + options.no_version); } exit_code = pcmk_rc2exitc(rc); done: g_strfreev(processed_args); pcmk__free_arg_context(context); - free(options.xml_file_original); - free(options.xml_file_new); - pcmk__xml_free(object_original); - pcmk__xml_free(object_new); - pcmk__output_and_clear_error(&error, NULL); + g_free(options.source_file); + g_free(options.target_file); + g_free(options.source_string); + g_free(options.target_string); + pcmk__xml_free(source); + pcmk__xml_free(target); + + pcmk__output_and_clear_error(&error, out); + + if (out != NULL) { + out->finish(out, exit_code, true, NULL); + pcmk__output_free(out); + } crm_exit(exit_code); } diff --git a/tools/crm_error.c b/tools/crm_error.c index 51a0051ec26..39fc45a45d4 100644 --- a/tools/crm_error.c +++ b/tools/crm_error.c @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the Pacemaker project contributors + * Copyright 2012-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -123,7 +123,7 @@ main(int argc, char **argv) uint32_t flags = pcmk_rc_disp_code|pcmk_rc_disp_desc; if (options.with_name) { - flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, + flags = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, "pcmk_rc_disp_flags", "pcmk__list_result_codes", flags, pcmk_rc_disp_name, "pcmk_rc_disp_name"); @@ -135,14 +135,14 @@ main(int argc, char **argv) // For text output, print only "[name -] description" by default if (args->verbosity > 0) { - flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, + flags = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, "pcmk_rc_disp_flags", "pcmk__show_result_code", flags, pcmk_rc_disp_code, "pcmk_rc_disp_code"); } if (options.with_name) { - flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, + flags = pcmk__set_flags_as(__func__, __LINE__, PCMK__LOG_TRACE, "pcmk_rc_disp_flags", "pcmk__show_result_code", flags, pcmk_rc_disp_name, "pcmk_rc_disp_name"); diff --git a/tools/crm_mon.c b/tools/crm_mon.c index c0ad6c47b91..2ce1f1c4ef3 100644 --- a/tools/crm_mon.c +++ b/tools/crm_mon.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -404,7 +404,7 @@ apply_include_exclude(GSList *lst, GError **error) { static gboolean user_include_exclude_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) { - char *s = crm_strdup_printf("%s=%s", option_name, optarg); + char *s = pcmk__assert_asprintf("%s=%s", option_name, optarg); options.user_includes_excludes = g_slist_append(options.user_includes_excludes, s); return TRUE; @@ -412,7 +412,7 @@ user_include_exclude_cb(const gchar *option_name, const gchar *optarg, gpointer static gboolean include_exclude_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) { - char *s = crm_strdup_printf("%s=%s", option_name, optarg); + char *s = pcmk__assert_asprintf("%s=%s", option_name, optarg); options.includes_excludes = g_slist_append(options.includes_excludes, s); return TRUE; @@ -506,20 +506,21 @@ print_timing_cb(const gchar *option_name, const gchar *optarg, gpointer data, GE static gboolean reconnect_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) { - int rc = crm_get_msec(optarg); + long long reconnect_ms = 0; - if (rc == -1) { - g_set_error(err, PCMK__EXITC_ERROR, CRM_EX_INVALID_PARAM, "Invalid value for -i: %s", optarg); + if ((pcmk__parse_ms(optarg, &reconnect_ms) != pcmk_rc_ok) + || (reconnect_ms < 0)) { + g_set_error(err, PCMK__EXITC_ERROR, CRM_EX_INVALID_PARAM, + "Invalid value for -i: %s", optarg); return FALSE; - } else { - pcmk_parse_interval_spec(optarg, &options.reconnect_ms); - - if (options.exec_mode != mon_exec_daemonized) { - // Reconnect interval applies to daemonized too, so don't override - options.exec_mode = mon_exec_update; - } } + pcmk_parse_interval_spec(optarg, &options.reconnect_ms); + + if (options.exec_mode != mon_exec_daemonized) { + // Reconnect interval applies to daemonized too, so don't override + options.exec_mode = mon_exec_update; + } return TRUE; } @@ -565,7 +566,7 @@ show_attributes_cb(const gchar *option_name, const gchar *optarg, gpointer data, static gboolean show_bans_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) { if (optarg != NULL) { - char *s = crm_strdup_printf("bans:%s", optarg); + char *s = pcmk__assert_asprintf("bans:%s", optarg); gboolean rc = user_include_exclude_cb("--include", s, data, err); free(s); return rc; @@ -865,7 +866,7 @@ setup_fencer_connection(void) rc = st->cmds->connect(st, crm_system_name, NULL); if (rc == pcmk_ok) { - crm_trace("Setting up stonith callbacks"); + pcmk__trace("Setting up stonith callbacks"); if (options.watch_fencing) { st->cmds->register_notification(st, PCMK__VALUE_ST_NOTIFY_DISCONNECT, @@ -1090,7 +1091,7 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat break; case 'o': show ^= pcmk_section_operations; - if (!pcmk_is_set(show, pcmk_section_operations)) { + if (!pcmk__is_set(show, pcmk_section_operations)) { show_opts &= ~pcmk_show_timing; } break; @@ -1102,7 +1103,7 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat break; case 't': show_opts ^= pcmk_show_timing; - if (pcmk_is_set(show_opts, pcmk_show_timing)) { + if (pcmk__is_set(show_opts, pcmk_show_timing)) { show |= pcmk_section_operations; } break; @@ -1114,7 +1115,7 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat break; case 'D': /* If any header is shown, clear them all, otherwise set them all */ - if (pcmk_any_flags_set(show, pcmk_section_summary)) { + if (pcmk__any_flags_set(show, pcmk_section_summary)) { show &= ~pcmk_section_summary; } else { show |= pcmk_section_summary; @@ -1143,18 +1144,24 @@ detect_user_input(GIOChannel *channel, GIOCondition condition, gpointer user_dat refresh(); curses_formatted_printf(out, "%s", "Display option change mode\n"); - print_option_help(out, 'c', pcmk_is_set(show, pcmk_section_tickets)); - print_option_help(out, 'f', pcmk_is_set(show, pcmk_section_failcounts)); - print_option_help(out, 'n', pcmk_is_set(show_opts, pcmk_show_rscs_by_node)); - print_option_help(out, 'o', pcmk_is_set(show, pcmk_section_operations)); - print_option_help(out, 'r', pcmk_is_set(show_opts, pcmk_show_inactive_rscs)); - print_option_help(out, 't', pcmk_is_set(show_opts, pcmk_show_timing)); - print_option_help(out, 'A', pcmk_is_set(show, pcmk_section_attributes)); - print_option_help(out, 'L', pcmk_is_set(show, pcmk_section_bans)); - print_option_help(out, 'D', !pcmk_is_set(show, pcmk_section_summary)); - print_option_help(out, 'R', pcmk_any_flags_set(show_opts, pcmk_show_details)); - print_option_help(out, 'b', pcmk_is_set(show_opts, pcmk_show_brief)); - print_option_help(out, 'j', pcmk_is_set(show_opts, pcmk_show_pending)); + print_option_help(out, 'c', pcmk__is_set(show, pcmk_section_tickets)); + print_option_help(out, 'f', + pcmk__is_set(show, pcmk_section_failcounts)); + print_option_help(out, 'n', + pcmk__is_set(show_opts, pcmk_show_rscs_by_node)); + print_option_help(out, 'o', + pcmk__is_set(show, pcmk_section_operations)); + print_option_help(out, 'r', + pcmk__is_set(show_opts, pcmk_show_inactive_rscs)); + print_option_help(out, 't', pcmk__is_set(show_opts, pcmk_show_timing)); + print_option_help(out, 'A', + pcmk__is_set(show, pcmk_section_attributes)); + print_option_help(out, 'L', pcmk__is_set(show, pcmk_section_bans)); + print_option_help(out, 'D', !pcmk__is_set(show, pcmk_section_summary)); + print_option_help(out, 'R', + pcmk__any_flags_set(show_opts, pcmk_show_details)); + print_option_help(out, 'b', pcmk__is_set(show_opts, pcmk_show_brief)); + print_option_help(out, 'j', pcmk__is_set(show_opts, pcmk_show_pending)); curses_formatted_printf(out, "%d m: \t%s\n", interactive_fence_level, get_option_desc('m')); curses_formatted_printf(out, "%s", "\nToggle fields via field letter, type any other key to return\n"); } @@ -1174,13 +1181,13 @@ avoid_zombies(void) memset(&sa, 0, sizeof(struct sigaction)); if (sigemptyset(&sa.sa_mask) < 0) { - crm_warn("Cannot avoid zombies: %s", pcmk_rc_str(errno)); + pcmk__warn("Cannot avoid zombies: %s", pcmk_rc_str(errno)); return; } sa.sa_handler = SIG_IGN; sa.sa_flags = SA_RESTART|SA_NOCLDWAIT; if (sigaction(SIGCHLD, &sa, NULL) < 0) { - crm_warn("Cannot avoid zombies: %s", pcmk_rc_str(errno)); + pcmk__warn("Cannot avoid zombies: %s", pcmk_rc_str(errno)); } } @@ -1556,11 +1563,13 @@ main(int argc, char **argv) /* Sync up the initial value of interactive_fence_level with whatever was set with * --include/--exclude= options. */ - if (pcmk_all_flags_set(show, pcmk_section_fencing_all)) { + if (pcmk__all_flags_set(show, pcmk_section_fencing_all)) { interactive_fence_level = 3; - } else if (pcmk_is_set(show, pcmk_section_fence_worked)) { + } else if (pcmk__is_set(show, pcmk_section_fence_worked)) { interactive_fence_level = 2; - } else if (pcmk_any_flags_set(show, pcmk_section_fence_failed | pcmk_section_fence_pending)) { + } else if (pcmk__any_flags_set(show, + pcmk_section_fence_failed + |pcmk_section_fence_pending)) { interactive_fence_level = 1; } else { interactive_fence_level = 0; @@ -1593,7 +1602,7 @@ main(int argc, char **argv) free(content); } - crm_info("Starting %s", crm_system_name); + pcmk__info("Starting %s", crm_system_name); cib__set_output(cib, out); @@ -1604,7 +1613,9 @@ main(int argc, char **argv) scheduler = pcmk_new_scheduler(); pcmk__mem_assert(scheduler); scheduler->priv->out = out; - if ((cib->variant == cib_native) && pcmk_is_set(show, pcmk_section_times)) { + if ((cib->variant == cib_native) + && pcmk__is_set(show, pcmk_section_times)) { + // Currently used only in the times section pcmk__query_node_name(out, 0, &(scheduler->priv->local_node_name), 0); } @@ -1664,7 +1675,7 @@ main(int argc, char **argv) g_main_loop_run(mainloop); g_main_loop_unref(mainloop); - crm_info("Exiting %s", crm_system_name); + pcmk__info("Exiting %s", crm_system_name); return clean_up(CRM_EX_OK); } @@ -1680,7 +1691,8 @@ send_custom_trap(const char *node, const char *rsc, const char *task, int target char *status_s = pcmk__itoa(status); char *target_rc_s = pcmk__itoa(target_rc); - crm_debug("Sending external notification to '%s' via '%s'", options.external_recipient, options.external_agent); + pcmk__debug("Sending external notification to '%s' via '%s'", + options.external_recipient, options.external_agent); if(rsc) { setenv("CRM_notify_rsc", rsc, 1); @@ -1700,12 +1712,15 @@ send_custom_trap(const char *node, const char *rsc, const char *task, int target out->err(out, "notification fork() failed: %s", strerror(errno)); } if (pid == 0) { - /* crm_debug("notification: I am the child. Executing the nofitication program."); */ + /* pcmk__debug("notification: I am the child. Executing the " + * "notification program."); + */ execl(options.external_agent, options.external_agent, NULL); crm_exit(CRM_EX_ERROR); } - crm_trace("Finished running custom notification program '%s'.", options.external_agent); + pcmk__trace("Finished running custom notification program '%s'", + options.external_agent); free(target_rc_s); free(status_s); free(rc_s); @@ -1738,7 +1753,7 @@ handle_rsc_op(xmlNode *xml, void *userdata) id = pcmk__xe_history_key(rsc_op); - magic = crm_element_value(rsc_op, PCMK__XA_TRANSITION_MAGIC); + magic = pcmk__xe_get(rsc_op, PCMK__XA_TRANSITION_MAGIC); if (magic == NULL) { /* non-change */ return pcmk_rc_ok; @@ -1746,23 +1761,23 @@ handle_rsc_op(xmlNode *xml, void *userdata) if (!decode_transition_magic(magic, NULL, NULL, NULL, &status, &rc, &target_rc)) { - crm_err("Invalid event %s detected for %s", magic, id); + pcmk__err("Invalid event %s detected for %s", magic, id); return pcmk_rc_ok; } if (parse_op_key(id, &rsc, &task, NULL) == FALSE) { - crm_err("Invalid event detected for %s", id); + pcmk__err("Invalid event detected for %s", id); goto bail; } - node = crm_element_value(rsc_op, PCMK__META_ON_NODE); + node = pcmk__xe_get(rsc_op, PCMK__META_ON_NODE); while ((n != NULL) && !pcmk__xe_is(n, PCMK__XE_NODE_STATE)) { n = n->parent; } if(node == NULL && n) { - node = crm_element_value(n, PCMK_XA_UNAME); + node = pcmk__xe_get(n, PCMK_XA_UNAME); } if (node == NULL && n) { @@ -1774,25 +1789,25 @@ handle_rsc_op(xmlNode *xml, void *userdata) } if (node == NULL) { - crm_err("No node detected for event %s (%s)", magic, id); + pcmk__err("No node detected for event %s (%s)", magic, id); goto bail; } /* look up where we expected it to be? */ desc = pcmk_rc_str(pcmk_rc_ok); if ((status == PCMK_EXEC_DONE) && (target_rc == rc)) { - crm_notice("%s of %s on %s completed: %s", task, rsc, node, desc); + pcmk__notice("%s of %s on %s completed: %s", task, rsc, node, desc); if (rc == PCMK_OCF_NOT_RUNNING) { notify = FALSE; } } else if (status == PCMK_EXEC_DONE) { desc = crm_exit_str(rc); - crm_warn("%s of %s on %s failed: %s", task, rsc, node, desc); + pcmk__warn("%s of %s on %s failed: %s", task, rsc, node, desc); } else { desc = pcmk_exec_status_str(status); - crm_warn("%s of %s on %s failed: %s", task, rsc, node, desc); + pcmk__warn("%s of %s on %s failed: %s", task, rsc, node, desc); } if (notify && options.external_agent) { @@ -1819,7 +1834,7 @@ mon_trigger_refresh(gpointer user_data) static int handle_op_for_node(xmlNode *xml, void *userdata) { - const char *node = crm_element_value(xml, PCMK_XA_UNAME); + const char *node = pcmk__xe_get(xml, PCMK_XA_UNAME); if (node == NULL) { node = pcmk__xe_id(xml); @@ -1833,8 +1848,8 @@ static int crm_diff_update_element(xmlNode *change, void *userdata) { const char *name = NULL; - const char *op = crm_element_value(change, PCMK_XA_OPERATION); - const char *xpath = crm_element_value(change, PCMK_XA_PATH); + const char *op = pcmk__xe_get(change, PCMK_XA_OPERATION); + const char *xpath = pcmk__xe_get(change, PCMK_XA_PATH); xmlNode *match = NULL; const char *node = NULL; @@ -1859,12 +1874,12 @@ crm_diff_update_element(xmlNode *change, void *userdata) name = (const char *)match->name; } - crm_trace("Handling %s operation for %s %p, %s", op, xpath, match, name); + pcmk__trace("Handling %s operation for %s %p, %s", op, xpath, match, name); if(xpath == NULL) { /* Version field, ignore */ } else if(name == NULL) { - crm_debug("No result for %s operation to %s", op, xpath); + pcmk__debug("No result for %s operation to %s", op, xpath); pcmk__assert(pcmk__str_any_of(op, PCMK_VALUE_MOVE, PCMK_VALUE_DELETE, NULL)); @@ -1877,7 +1892,7 @@ crm_diff_update_element(xmlNode *change, void *userdata) pcmk__xe_foreach_child(match, NULL, handle_op_for_node, NULL); } else if (strcmp(name, PCMK__XE_NODE_STATE) == 0) { - node = crm_element_value(match, PCMK_XA_UNAME); + node = pcmk__xe_get(match, PCMK_XA_UNAME); if (node == NULL) { node = pcmk__xe_id(match); } @@ -1906,7 +1921,8 @@ crm_diff_update_element(xmlNode *change, void *userdata) free(local_node); } else { - crm_trace("Ignoring %s operation for %s %p, %s", op, xpath, match, name); + pcmk__trace("Ignoring %s operation for %s %p, %s", op, xpath, match, + name); } return pcmk_rc_ok; @@ -1930,26 +1946,29 @@ crm_diff_update(const char *event, xmlNode * msg) switch (rc) { case -pcmk_err_diff_resync: case -pcmk_err_diff_failed: - crm_notice("[%s] Patch aborted: %s (%d)", event, pcmk_strerror(rc), rc); + pcmk__notice("[%s] Patch aborted: %s (%d)", event, + pcmk_strerror(rc), rc); pcmk__xml_free(current_cib); current_cib = NULL; break; case pcmk_ok: cib_updated = TRUE; break; default: - crm_notice("[%s] ABORTED: %s (%d)", event, pcmk_strerror(rc), rc); + pcmk__notice("[%s] ABORTED: %s (%d)", event, pcmk_strerror(rc), + rc); pcmk__xml_free(current_cib); current_cib = NULL; } } if (current_cib == NULL) { - crm_trace("Re-requesting the full cib"); + pcmk__trace("Re-requesting the full cib"); cib->cmds->query(cib, NULL, ¤t_cib, cib_sync_call); } if (options.external_agent) { int format = 0; - crm_element_value_int(diff, PCMK_XA_FORMAT, &format); + + pcmk__xe_get_int(diff, PCMK_XA_FORMAT, &format); if (format == 2) { xmlNode *wrapper = pcmk__xe_first_child(msg, @@ -1960,7 +1979,7 @@ crm_diff_update(const char *event, xmlNode * msg) pcmk__xe_foreach_child(diff, NULL, crm_diff_update_element, NULL); } else { - crm_err("Unknown patch format: %d", format); + pcmk__err("Unknown patch format: %d", format); } } @@ -1987,9 +2006,10 @@ mon_refresh_display(gpointer user_data) return G_SOURCE_REMOVE; } - if (fence_history == pcmk__fence_history_full && - !pcmk_all_flags_set(show, pcmk_section_fencing_all) && - output_format != mon_output_xml) { + if ((fence_history == pcmk__fence_history_full) + && !pcmk__all_flags_set(show, pcmk_section_fencing_all) + && (output_format != mon_output_xml)) { + fence_history = pcmk__fence_history_reduced; } diff --git a/tools/crm_mon_curses.c b/tools/crm_mon_curses.c index 0654322cbe4..c3d46b5684c 100644 --- a/tools/crm_mon_curses.c +++ b/tools/crm_mon_curses.c @@ -430,11 +430,11 @@ static int cluster_maint_mode_console(pcmk__output_t *out, va_list args) { uint64_t flags = va_arg(args, uint64_t); - if (pcmk_is_set(flags, pcmk__sched_in_maintenance)) { + if (pcmk__is_set(flags, pcmk__sched_in_maintenance)) { curses_formatted_printf(out, "\n *** Resource management is DISABLED ***\n"); curses_formatted_printf(out, " The cluster will not attempt to start, stop or recover services\n"); return pcmk_rc_ok; - } else if (pcmk_is_set(flags, pcmk__sched_stop_all)) { + } else if (pcmk__is_set(flags, pcmk__sched_stop_all)) { curses_formatted_printf(out, "\n *** Resource management is DISABLED ***\n"); curses_formatted_printf(out, " The cluster will keep all resources stopped\n"); return pcmk_rc_ok; diff --git a/tools/crm_node.c b/tools/crm_node.c index 81fc56b808c..752dd2751d7 100644 --- a/tools/crm_node.c +++ b/tools/crm_node.c @@ -1,5 +1,5 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -157,7 +157,7 @@ static int node_id_xml(pcmk__output_t *out, va_list args) { uint32_t node_id = va_arg(args, uint32_t); - char *id_s = crm_strdup_printf("%" PRIu32, node_id); + char *id_s = pcmk__assert_asprintf("%" PRIu32, node_id); pcmk__output_create_xml_node(out, PCMK_XE_NODE_INFO, PCMK_XA_NODEID, id_s, @@ -192,7 +192,7 @@ simple_node_list_xml(pcmk__output_t *out, va_list args) for (GList *node_iter = nodes; node_iter != NULL; node_iter = node_iter->next) { pcmk_controld_api_node_t *node = node_iter->data; - char *id_s = crm_strdup_printf("%" PRIu32, node->id); + char *id_s = pcmk__assert_asprintf("%" PRIu32, node->id); pcmk__output_create_xml_node(out, PCMK_XE_NODE, PCMK_XA_ID, id_s, @@ -224,7 +224,7 @@ node_name_xml(pcmk__output_t *out, va_list args) { uint32_t node_id = va_arg(args, uint32_t); const char *node_name = va_arg(args, const char *); - char *id_s = crm_strdup_printf("%" PRIu32, node_id); + char *id_s = pcmk__assert_asprintf("%" PRIu32, node_id); pcmk__output_create_xml_node(out, PCMK_XE_NODE_INFO, PCMK_XA_NODEID, id_s, @@ -271,7 +271,7 @@ partition_list_xml(pcmk__output_t *out, va_list args) pcmk_controld_api_node_t *node = node_iter->data; if (pcmk__str_eq(node->state, "member", pcmk__str_none)) { - char *id_s = crm_strdup_printf("%" PRIu32, node->id); + char *id_s = pcmk__assert_asprintf("%" PRIu32, node->id); pcmk__output_create_xml_node(out, PCMK_XE_NODE, PCMK_XA_ID, id_s, @@ -547,9 +547,9 @@ remove_from_section(cib_t *cib, const char *element, const char *section, int rc = pcmk_rc_ok; xmlNode *xml = pcmk__xe_create(NULL, element); - crm_xml_add(xml, PCMK_XA_UNAME, node_name); + pcmk__xe_set(xml, PCMK_XA_UNAME, node_name); if (node_id > 0) { - crm_xml_add_ll(xml, PCMK_XA_ID, node_id); + pcmk__xe_set_ll(xml, PCMK_XA_ID, (long long) node_id); } rc = cib->cmds->remove(cib, section, xml, cib_transaction); @@ -603,8 +603,8 @@ purge_node_from_cib(const char *node_name, long node_id) cib__clean_up_connection(&cib); if ((rc == pcmk_rc_ok) && (commit_rc == pcmk_ok)) { - crm_debug("Purged node %s (%ld) from CIB", - pcmk__s(node_name, "by ID"), node_id); + pcmk__debug("Purged node %s (%ld) from CIB", + pcmk__s(node_name, "by ID"), node_id); } return rc; } @@ -689,15 +689,15 @@ purge_node_from_fencer(const char *node_name, long node_id) cmd = pcmk__new_request(pcmk_ipc_fenced, crm_system_name, NULL, PCMK__VALUE_STONITH_NG, CRM_OP_RM_NODE_CACHE, NULL); if (node_id > 0) { - crm_xml_add_ll(cmd, PCMK_XA_ID, node_id); + pcmk__xe_set_ll(cmd, PCMK_XA_ID, (long long) node_id); } - crm_xml_add(cmd, PCMK_XA_UNAME, node_name); + pcmk__xe_set(cmd, PCMK_XA_UNAME, node_name); rc = crm_ipc_send(conn, cmd, 0, 0, NULL); if (rc >= 0) { rc = pcmk_rc_ok; - crm_debug("Purged node %s (%ld) from fencer", - pcmk__s(node_name, "by ID"), node_id); + pcmk__debug("Purged node %s (%ld) from fencer", + pcmk__s(node_name, "by ID"), node_id); } else { rc = pcmk_legacy2rc(rc); fprintf(stderr, "Could not purge node %s from fencer: %s\n", diff --git a/tools/crm_resource.c b/tools/crm_resource.c index e4ee98c3978..283355a42a0 100644 --- a/tools/crm_resource.c +++ b/tools/crm_resource.c @@ -227,7 +227,7 @@ controller_event_callback(pcmk_ipc_api_t *api, enum pcmk_ipc_event event_type, switch (event_type) { case pcmk_ipc_event_disconnect: if (exit_code == CRM_EX_DISCONNECT) { // Unexpected - crm_info("Connection to controller was terminated"); + pcmk__info("Connection to controller was terminated"); } *ec = exit_code; @@ -249,7 +249,7 @@ controller_event_callback(pcmk_ipc_api_t *api, enum pcmk_ipc_event event_type, && g_main_loop_is_running(mainloop)) { out->info(out, "... got reply (done)"); - crm_debug("Got all the replies we expected"); + pcmk__debug("Got all the replies we expected"); pcmk_disconnect_ipc(api); *ec = CRM_EX_OK; @@ -521,9 +521,10 @@ static gboolean timeout_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **error) { - long long timeout_ms = crm_get_msec(optarg); + long long timeout_ms = 0; - if (timeout_ms < 0) { + if ((pcmk__parse_ms(optarg, &timeout_ms) != pcmk_rc_ok) + || (timeout_ms < 0)) { return FALSE; } options.timeout_ms = (guint) QB_MIN(timeout_ms, UINT_MAX); @@ -866,7 +867,7 @@ ban_or_move(pcmk__output_t *out, pcmk_resource_t *rsc, cib_t *cib_conn, move_lifetime, cib_conn, options.promoted_role_only, PCMK_ROLE_PROMOTED); - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { int count = 0; GList *iter = NULL; @@ -920,9 +921,9 @@ cleanup(pcmk__output_t *out, pcmk_resource_t *rsc, pcmk_node_t *node, rsc = uber_parent(rsc); } - crm_debug("Erasing failures of %s (%s requested) on %s", - rsc->id, options.rsc_id, - ((node != NULL)? pcmk__node_name(node) : "all nodes")); + pcmk__debug("Erasing failures of %s (%s requested) on %s", rsc->id, + options.rsc_id, + ((node != NULL)? pcmk__node_name(node) : "all nodes")); rc = cli_resource_delete(controld_api, rsc, node, options.operation, options.interval_spec, true, options.force); @@ -1025,7 +1026,7 @@ refresh(pcmk__output_t *out, const pcmk_node_t *node, return CRM_EX_OK; } - crm_debug("Re-checking the state of all resources on %s", log_node_name); + pcmk__debug("Re-checking the state of all resources on %s", log_node_name); // @FIXME We shouldn't discard rc here rc = pcmk__attrd_api_clear_failures(NULL, node_name, NULL, NULL, NULL, NULL, @@ -1053,9 +1054,9 @@ refresh_resource(pcmk__output_t *out, pcmk_resource_t *rsc, pcmk_node_t *node, rsc = uber_parent(rsc); } - crm_debug("Re-checking the state of %s (%s requested) on %s", - rsc->id, options.rsc_id, - ((node != NULL)? pcmk__node_name(node) : "all nodes")); + pcmk__debug("Re-checking the state of %s (%s requested) on %s", rsc->id, + options.rsc_id, + ((node != NULL)? pcmk__node_name(node) : "all nodes")); rc = cli_resource_delete(controld_api, rsc, node, NULL, 0, false, options.force); @@ -1426,7 +1427,7 @@ handle_get_param(pcmk_resource_t *rsc, pcmk_node_t *node, cib_t *cib_conn, current = NULL; } - crm_debug("Looking up %s in %s", options.prop_name, rsc->id); + pcmk__debug("Looking up %s in %s", options.prop_name, rsc->id); if (pcmk__str_eq(options.attr_set_type, PCMK_XE_INSTANCE_ATTRIBUTES, pcmk__str_none)) { @@ -1444,7 +1445,7 @@ handle_get_param(pcmk_resource_t *rsc, pcmk_node_t *node, cib_t *cib_conn, } else if (pcmk__str_eq(options.attr_set_type, ATTR_SET_ELEMENT, pcmk__str_none)) { - value = crm_element_value(rsc->priv->xml, options.prop_name); + value = pcmk__xe_get(rsc->priv->xml, options.prop_name); free_params = false; } else { @@ -2203,7 +2204,7 @@ main(int argc, char **argv) } // Ensure --resource is set if it's required - if (pcmk_is_set(command_info->flags, crm_rsc_requires_resource) + if (pcmk__is_set(command_info->flags, crm_rsc_requires_resource) && !has_cmdline_config() && !options.clear_expired && (options.rsc_id == NULL)) { @@ -2215,7 +2216,7 @@ main(int argc, char **argv) } // Ensure --node is set if it's required - if (pcmk_is_set(command_info->flags, crm_rsc_requires_node) + if (pcmk__is_set(command_info->flags, crm_rsc_requires_node) && (options.host_uname == NULL)) { exit_code = CRM_EX_USAGE; @@ -2225,7 +2226,7 @@ main(int argc, char **argv) } // Establish a connection to the CIB if needed - if (pcmk_is_set(command_info->flags, crm_rsc_requires_cib) + if (pcmk__is_set(command_info->flags, crm_rsc_requires_cib) && !has_cmdline_config()) { cib_conn = cib_new(); @@ -2246,7 +2247,7 @@ main(int argc, char **argv) } // Populate scheduler data from CIB query if needed - if (pcmk_is_set(command_info->flags, crm_rsc_requires_scheduler) + if (pcmk__is_set(command_info->flags, crm_rsc_requires_scheduler) && !has_cmdline_config()) { rc = initialize_scheduler_data(&scheduler, cib_conn, out, @@ -2258,7 +2259,7 @@ main(int argc, char **argv) } // Establish a connection to the controller if needed - if (pcmk_is_set(command_info->flags, crm_rsc_requires_controller) + if (pcmk__is_set(command_info->flags, crm_rsc_requires_controller) && (getenv("CIB_file") == NULL)) { rc = pcmk_new_ipc_api(&controld_api, pcmk_ipc_controld); @@ -2310,13 +2311,13 @@ main(int argc, char **argv) * @TODO Consider stricter validation. See comment above for --node. * @TODO Setter macro for tracing? */ - if (pcmk_is_set(command_info->flags, crm_rsc_find_match_anon_basename)) { + if (pcmk__is_set(command_info->flags, crm_rsc_find_match_anon_basename)) { find_flags |= pcmk_rsc_match_anon_basename; } - if (pcmk_is_set(command_info->flags, crm_rsc_find_match_basename)) { + if (pcmk__is_set(command_info->flags, crm_rsc_find_match_basename)) { find_flags |= pcmk_rsc_match_basename; } - if (pcmk_is_set(command_info->flags, crm_rsc_find_match_history)) { + if (pcmk__is_set(command_info->flags, crm_rsc_find_match_history)) { find_flags |= pcmk_rsc_match_history; } if ((find_flags != 0) && (options.rsc_id != NULL)) { @@ -2331,7 +2332,7 @@ main(int argc, char **argv) goto done; } - if (pcmk_is_set(command_info->flags, crm_rsc_rejects_clone_instance) + if (pcmk__is_set(command_info->flags, crm_rsc_rejects_clone_instance) && pcmk__is_clone(rsc->priv->parent) && (strchr(options.rsc_id, ':') != NULL)) { @@ -2350,8 +2351,10 @@ main(int argc, char **argv) // For CRM_EX_USAGE, error is already set satisfactorily if ((exit_code != CRM_EX_OK) && (exit_code != CRM_EX_USAGE)) { if (error != NULL) { - char *msg = crm_strdup_printf("%s\nError performing operation: %s", - error->message, crm_exit_str(exit_code)); + char *msg = pcmk__assert_asprintf("%s\nError performing operation: " + "%s", + error->message, + crm_exit_str(exit_code)); g_clear_error(&error); g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "%s", msg); free(msg); diff --git a/tools/crm_resource_ban.c b/tools/crm_resource_ban.c index 8a75b0dfcf5..e57c7a22b60 100644 --- a/tools/crm_resource_ban.c +++ b/tools/crm_resource_ban.c @@ -91,39 +91,39 @@ cli_resource_ban(pcmk__output_t *out, const char *rsc_id, const char *host, pcmk__xe_id(location), rsc_id, host, rsc_id, (promoted_role_only? "being promoted" : "running"), host, host); - crm_xml_add(location, PCMK_XA_RSC, rsc_id); + pcmk__xe_set(location, PCMK_XA_RSC, rsc_id); if(promoted_role_only) { - crm_xml_add(location, PCMK_XA_ROLE, promoted_role); + pcmk__xe_set(location, PCMK_XA_ROLE, promoted_role); } else { - crm_xml_add(location, PCMK_XA_ROLE, PCMK_ROLE_STARTED); + pcmk__xe_set(location, PCMK_XA_ROLE, PCMK_ROLE_STARTED); } if (later_s == NULL) { /* Short form */ - crm_xml_add(location, PCMK_XE_NODE, host); - crm_xml_add(location, PCMK_XA_SCORE, PCMK_VALUE_MINUS_INFINITY); + pcmk__xe_set(location, PCMK_XE_NODE, host); + pcmk__xe_set(location, PCMK_XA_SCORE, PCMK_VALUE_MINUS_INFINITY); } else { xmlNode *rule = pcmk__xe_create(location, PCMK_XE_RULE); xmlNode *expr = pcmk__xe_create(rule, PCMK_XE_EXPRESSION); pcmk__xe_set_id(rule, "cli-ban-%s-on-%s-rule", rsc_id, host); - crm_xml_add(rule, PCMK_XA_SCORE, PCMK_VALUE_MINUS_INFINITY); - crm_xml_add(rule, PCMK_XA_BOOLEAN_OP, PCMK_VALUE_AND); + pcmk__xe_set(rule, PCMK_XA_SCORE, PCMK_VALUE_MINUS_INFINITY); + pcmk__xe_set(rule, PCMK_XA_BOOLEAN_OP, PCMK_VALUE_AND); pcmk__xe_set_id(expr, "cli-ban-%s-on-%s-expr", rsc_id, host); - crm_xml_add(expr, PCMK_XA_ATTRIBUTE, CRM_ATTR_UNAME); - crm_xml_add(expr, PCMK_XA_OPERATION, PCMK_VALUE_EQ); - crm_xml_add(expr, PCMK_XA_VALUE, host); - crm_xml_add(expr, PCMK_XA_TYPE, PCMK_VALUE_STRING); + pcmk__xe_set(expr, PCMK_XA_ATTRIBUTE, CRM_ATTR_UNAME); + pcmk__xe_set(expr, PCMK_XA_OPERATION, PCMK_VALUE_EQ); + pcmk__xe_set(expr, PCMK_XA_VALUE, host); + pcmk__xe_set(expr, PCMK_XA_TYPE, PCMK_VALUE_STRING); expr = pcmk__xe_create(rule, PCMK_XE_DATE_EXPRESSION); pcmk__xe_set_id(expr, "cli-ban-%s-on-%s-lifetime", rsc_id, host); - crm_xml_add(expr, PCMK_XA_OPERATION, PCMK_VALUE_LT); - crm_xml_add(expr, PCMK_XA_END, later_s); + pcmk__xe_set(expr, PCMK_XA_OPERATION, PCMK_VALUE_LT); + pcmk__xe_set(expr, PCMK_XA_END, later_s); } - crm_log_xml_notice(fragment, "Modify"); + pcmk__log_xml_notice(fragment, "Modify"); rc = cib_conn->cmds->modify(cib_conn, PCMK_XE_CONSTRAINTS, fragment, cib_sync_call); rc = pcmk_legacy2rc(rc); @@ -171,39 +171,39 @@ cli_resource_prefer(pcmk__output_t *out,const char *rsc_id, const char *host, location = pcmk__xe_create(fragment, PCMK_XE_RSC_LOCATION); pcmk__xe_set_id(location, "cli-prefer-%s", rsc_id); - crm_xml_add(location, PCMK_XA_RSC, rsc_id); + pcmk__xe_set(location, PCMK_XA_RSC, rsc_id); if(promoted_role_only) { - crm_xml_add(location, PCMK_XA_ROLE, promoted_role); + pcmk__xe_set(location, PCMK_XA_ROLE, promoted_role); } else { - crm_xml_add(location, PCMK_XA_ROLE, PCMK_ROLE_STARTED); + pcmk__xe_set(location, PCMK_XA_ROLE, PCMK_ROLE_STARTED); } if (later_s == NULL) { /* Short form */ - crm_xml_add(location, PCMK_XE_NODE, host); - crm_xml_add(location, PCMK_XA_SCORE, PCMK_VALUE_INFINITY); + pcmk__xe_set(location, PCMK_XE_NODE, host); + pcmk__xe_set(location, PCMK_XA_SCORE, PCMK_VALUE_INFINITY); } else { xmlNode *rule = pcmk__xe_create(location, PCMK_XE_RULE); xmlNode *expr = pcmk__xe_create(rule, PCMK_XE_EXPRESSION); pcmk__xe_set_id(rule, "cli-prefer-rule-%s", rsc_id); - crm_xml_add(rule, PCMK_XA_SCORE, PCMK_VALUE_INFINITY); - crm_xml_add(rule, PCMK_XA_BOOLEAN_OP, PCMK_VALUE_AND); + pcmk__xe_set(rule, PCMK_XA_SCORE, PCMK_VALUE_INFINITY); + pcmk__xe_set(rule, PCMK_XA_BOOLEAN_OP, PCMK_VALUE_AND); pcmk__xe_set_id(expr, "cli-prefer-expr-%s", rsc_id); - crm_xml_add(expr, PCMK_XA_ATTRIBUTE, CRM_ATTR_UNAME); - crm_xml_add(expr, PCMK_XA_OPERATION, PCMK_VALUE_EQ); - crm_xml_add(expr, PCMK_XA_VALUE, host); - crm_xml_add(expr, PCMK_XA_TYPE, PCMK_VALUE_STRING); + pcmk__xe_set(expr, PCMK_XA_ATTRIBUTE, CRM_ATTR_UNAME); + pcmk__xe_set(expr, PCMK_XA_OPERATION, PCMK_VALUE_EQ); + pcmk__xe_set(expr, PCMK_XA_VALUE, host); + pcmk__xe_set(expr, PCMK_XA_TYPE, PCMK_VALUE_STRING); expr = pcmk__xe_create(rule, PCMK_XE_DATE_EXPRESSION); pcmk__xe_set_id(expr, "cli-prefer-lifetime-end-%s", rsc_id); - crm_xml_add(expr, PCMK_XA_OPERATION, PCMK_VALUE_LT); - crm_xml_add(expr, PCMK_XA_END, later_s); + pcmk__xe_set(expr, PCMK_XA_OPERATION, PCMK_VALUE_LT); + pcmk__xe_set(expr, PCMK_XA_END, later_s); } - crm_log_xml_info(fragment, "Modify"); + pcmk__log_xml_info(fragment, "Modify"); rc = cib_conn->cmds->modify(cib_conn, PCMK_XE_CONSTRAINTS, fragment, cib_sync_call); rc = pcmk_legacy2rc(rc); @@ -263,7 +263,7 @@ resource_clear_node_in_expr(const char *rsc_id, const char *host, "and @" PCMK_XA_VALUE "='%s']" \ "]" - xpath_string = crm_strdup_printf(XPATH_FMT, rsc_id, rsc_id, host); + xpath_string = pcmk__assert_asprintf(XPATH_FMT, rsc_id, rsc_id, host); rc = cib_conn->cmds->remove(cib_conn, xpath_string, NULL, cib_xpath|cib_sync_call); @@ -296,10 +296,10 @@ resource_clear_node_in_location(const char *rsc_id, const char *host, cib_t * ci location = pcmk__xe_create(fragment, PCMK_XE_RSC_LOCATION); pcmk__xe_set_id(location, "cli-prefer-%s", rsc_id); if (force == FALSE) { - crm_xml_add(location, PCMK_XE_NODE, host); + pcmk__xe_set(location, PCMK_XE_NODE, host); } - crm_log_xml_info(fragment, "Delete"); + pcmk__log_xml_info(fragment, "Delete"); rc = cib_conn->cmds->remove(cib_conn, PCMK_XE_CONSTRAINTS, fragment, cib_sync_call); if (rc == -ENXIO) { @@ -361,7 +361,7 @@ build_clear_xpath_string(GString *buf, const xmlNode *constraint_node, bool promoted_role_only) { const char *cons_id = pcmk__xe_id(constraint_node); - const char *cons_rsc = crm_element_value(constraint_node, PCMK_XA_RSC); + const char *cons_rsc = pcmk__xe_get(constraint_node, PCMK_XA_RSC); GString *rsc_role_substr = NULL; const char *promoted_role_rule = "@" PCMK_XA_ROLE "='" PCMK_ROLE_PROMOTED "' or @" PCMK_XA_ROLE "='" @@ -484,9 +484,9 @@ cli_resource_clear_all_expired(xmlNode *root, cib_t *cib_conn, const char *rsc, */ rc = pcmk__xe_get_datetime(date_expr_node, PCMK_XA_END, &end); if (rc != pcmk_rc_ok) { - crm_trace("Date expression %s has invalid " PCMK_XA_END ": %s", - pcmk__s(pcmk__xe_id(date_expr_node), "without ID"), - pcmk_rc_str(rc)); + pcmk__trace("Date expression %s has invalid " PCMK_XA_END ": %s", + pcmk__s(pcmk__xe_id(date_expr_node), "without ID"), + pcmk_rc_str(rc)); continue; // Treat as unexpired } @@ -497,7 +497,7 @@ cli_resource_clear_all_expired(xmlNode *root, cib_t *cib_conn, const char *rsc, fragment = pcmk__xe_create(NULL, PCMK_XE_CONSTRAINTS); location = pcmk__xe_create(fragment, PCMK_XE_RSC_LOCATION); pcmk__xe_set_id(location, "%s", pcmk__xe_id(constraint_node)); - crm_log_xml_info(fragment, "Delete"); + pcmk__log_xml_info(fragment, "Delete"); rc = cib_conn->cmds->remove(cib_conn, PCMK_XE_CONSTRAINTS, fragment, cib_sync_call); diff --git a/tools/crm_resource_print.c b/tools/crm_resource_print.c index 2519ac293aa..aab305fa664 100644 --- a/tools/crm_resource_print.c +++ b/tools/crm_resource_print.c @@ -22,7 +22,7 @@ print_constraint(xmlNode *xml_obj, void *userdata) { pcmk_scheduler_t *scheduler = (pcmk_scheduler_t *) userdata; pcmk__output_t *out = scheduler->priv->out; - const char *id = crm_element_value(xml_obj, PCMK_XA_ID); + const char *id = pcmk__xe_get(xml_obj, PCMK_XA_ID); if (id == NULL) { return pcmk_rc_ok; @@ -34,12 +34,12 @@ print_constraint(xmlNode *xml_obj, void *userdata) out->info(out, "Constraint %s %s %s %s %s %s %s", xml_obj->name, - cons_string(crm_element_value(xml_obj, PCMK_XA_ID)), - cons_string(crm_element_value(xml_obj, PCMK_XA_RSC)), - cons_string(crm_element_value(xml_obj, PCMK_XA_WITH_RSC)), - cons_string(crm_element_value(xml_obj, PCMK_XA_SCORE)), - cons_string(crm_element_value(xml_obj, PCMK_XA_RSC_ROLE)), - cons_string(crm_element_value(xml_obj, PCMK_XA_WITH_RSC_ROLE))); + cons_string(pcmk__xe_get(xml_obj, PCMK_XA_ID)), + cons_string(pcmk__xe_get(xml_obj, PCMK_XA_RSC)), + cons_string(pcmk__xe_get(xml_obj, PCMK_XA_WITH_RSC)), + cons_string(pcmk__xe_get(xml_obj, PCMK_XA_SCORE)), + cons_string(pcmk__xe_get(xml_obj, PCMK_XA_RSC_ROLE)), + cons_string(pcmk__xe_get(xml_obj, PCMK_XA_WITH_RSC_ROLE))); return pcmk_rc_ok; } @@ -57,12 +57,12 @@ cli_resource_print_cts(pcmk_resource_t *rsc, pcmk__output_t *out) { const char *host = NULL; bool needs_quorum = TRUE; - const char *rtype = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); - const char *rprov = crm_element_value(rsc->priv->xml, PCMK_XA_PROVIDER); - const char *rclass = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); + const char *rtype = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); + const char *rprov = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER); + const char *rclass = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); pcmk_node_t *node = pcmk__current_node(rsc); - if (pcmk_is_set(rsc->flags, pcmk__rsc_fence_device)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_fence_device)) { needs_quorum = FALSE; } else { // @TODO check requires in resource meta-data and rsc_defaults @@ -357,7 +357,7 @@ override_xml(pcmk__output_t *out, va_list args) { NULL); if (rsc_name != NULL) { - crm_xml_add(node, PCMK_XA_RSC, rsc_name); + pcmk__xe_set(node, PCMK_XA_RSC, rsc_name); } return pcmk_rc_ok; @@ -453,10 +453,10 @@ resource_agent_action_xml(pcmk__output_t *out, va_list args) { NULL); if (rsc_name) { - crm_xml_add(node, PCMK_XA_RSC, rsc_name); + pcmk__xe_set(node, PCMK_XA_RSC, rsc_name); } - crm_xml_add(node, PCMK_XA_PROVIDER, provider); + pcmk__xe_set(node, PCMK_XA_PROVIDER, provider); if (overrides) { GHashTableIter iter; @@ -508,27 +508,27 @@ resource_check_list_default(pcmk__output_t *out, va_list args) { out->begin_list(out, NULL, NULL, "Resource Checks"); - if (pcmk_is_set(checks->flags, rsc_remain_stopped)) { + if (pcmk__is_set(checks->flags, rsc_remain_stopped)) { out->list_item(out, "check", "Configuration specifies '%s' should remain stopped", parent->id); } - if (pcmk_is_set(checks->flags, rsc_unpromotable)) { + if (pcmk__is_set(checks->flags, rsc_unpromotable)) { out->list_item(out, "check", "Configuration specifies '%s' should not be promoted", parent->id); } - if (pcmk_is_set(checks->flags, rsc_unmanaged)) { + if (pcmk__is_set(checks->flags, rsc_unmanaged)) { out->list_item(out, "check", "Configuration prevents cluster from stopping or starting unmanaged '%s'", parent->id); } - if (pcmk_is_set(checks->flags, rsc_locked)) { + if (pcmk__is_set(checks->flags, rsc_locked)) { out->list_item(out, "check", "'%s' is locked to node %s due to shutdown", parent->id, checks->lock_node); } - if (pcmk_is_set(checks->flags, rsc_node_health)) { + if (pcmk__is_set(checks->flags, rsc_node_health)) { out->list_item(out, "check", "'%s' cannot run on unhealthy nodes due to " PCMK_OPT_NODE_HEALTH_STRATEGY "='%s'", @@ -552,23 +552,23 @@ resource_check_list_xml(pcmk__output_t *out, va_list args) { PCMK_XA_ID, parent->id, NULL); - if (pcmk_is_set(checks->flags, rsc_remain_stopped)) { + if (pcmk__is_set(checks->flags, rsc_remain_stopped)) { pcmk__xe_set_bool_attr(node, PCMK_XA_REMAIN_STOPPED, true); } - if (pcmk_is_set(checks->flags, rsc_unpromotable)) { + if (pcmk__is_set(checks->flags, rsc_unpromotable)) { pcmk__xe_set_bool_attr(node, PCMK_XA_PROMOTABLE, false); } - if (pcmk_is_set(checks->flags, rsc_unmanaged)) { + if (pcmk__is_set(checks->flags, rsc_unmanaged)) { pcmk__xe_set_bool_attr(node, PCMK_XA_UNMANAGED, true); } - if (pcmk_is_set(checks->flags, rsc_locked)) { - crm_xml_add(node, PCMK_XA_LOCKED_TO_HYPHEN, checks->lock_node); + if (pcmk__is_set(checks->flags, rsc_locked)) { + pcmk__xe_set(node, PCMK_XA_LOCKED_TO_HYPHEN, checks->lock_node); } - if (pcmk_is_set(checks->flags, rsc_node_health)) { + if (pcmk__is_set(checks->flags, rsc_node_health)) { pcmk__xe_set_bool_attr(node, PCMK_XA_UNHEALTHY, true); } @@ -637,7 +637,7 @@ resource_search_list_xml(pcmk__output_t *out, va_list args) ni->node_name); if (ni->promoted) { - crm_xml_add(sub_node, PCMK_XA_STATE, "promoted"); + pcmk__xe_set(sub_node, PCMK_XA_STATE, "promoted"); } } @@ -770,7 +770,7 @@ resource_reasons_list_xml(pcmk__output_t *out, va_list args) } else if ((rsc != NULL) && (host_uname != NULL)) { if (resource_is_running_on(rsc, host_uname)) { - crm_xml_add(xml_node, PCMK_XA_RUNNING_ON, host_uname); + pcmk__xe_set(xml_node, PCMK_XA_RUNNING_ON, host_uname); } cli_resource_check(out, rsc, node); @@ -819,7 +819,7 @@ resource_reasons_list_xml(pcmk__output_t *out, va_list args) GList *hosts = NULL; rsc->priv->fns->location(rsc, &hosts, pcmk__rsc_node_current); - crm_xml_add(xml_node, PCMK_XA_RUNNING, pcmk__btoa(hosts != NULL)); + pcmk__xe_set(xml_node, PCMK_XA_RUNNING, pcmk__btoa(hosts != NULL)); cli_resource_check(out, rsc, NULL); g_list_free(hosts); } diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c index c1108f7ee11..7b02bf68914 100644 --- a/tools/crm_resource_runtime.c +++ b/tools/crm_resource_runtime.c @@ -20,6 +20,7 @@ #include #include #include +#include // crm_meta_name(), etc. #include #include @@ -56,7 +57,7 @@ prepend_node_info(gpointer data, gpointer user_data) ni = pcmk__assert_alloc(1, sizeof(node_info_t)); ni->node_name = node->priv->name; - ni->promoted = pcmk_is_set(rni->rsc->flags, pcmk__rsc_promotable) + ni->promoted = pcmk__is_set(rni->rsc->flags, pcmk__rsc_promotable) && (rni->rsc->priv->fns->state(rni->rsc, true) == pcmk_role_promoted); @@ -81,7 +82,7 @@ cli_resource_search(const pcmk_resource_t *rsc, const char *requested_name) const pcmk_resource_t *parent = pe__const_top_resource(rsc, false); if (pcmk__is_clone(parent) - && !pcmk_is_set(rsc->flags, pcmk__rsc_unique) + && !pcmk__is_set(rsc->flags, pcmk__rsc_unique) && (rsc->priv->history_id != NULL) && pcmk__str_eq(requested_name, rsc->priv->history_id, pcmk__str_none) @@ -129,7 +130,7 @@ find_resource_attr(pcmk__output_t *out, cib_t * the_cib, const char *attr, xpath_base = pcmk_cib_xpath_for(PCMK_XE_RESOURCES); if (xpath_base == NULL) { - crm_err(PCMK_XE_RESOURCES " CIB element not known (bug?)"); + pcmk__err(PCMK_XE_RESOURCES " CIB element not known (bug?)"); return ENOMSG; } @@ -164,7 +165,7 @@ find_resource_attr(pcmk__output_t *out, cib_t * the_cib, const char *attr, rc = pcmk_legacy2rc(rc); if (rc == pcmk_rc_ok) { - crm_log_xml_debug(xml_search, "Match"); + pcmk__log_xml_debug(xml_search, "Match"); if (xml_search->children != NULL) { rc = ENOTUNIQ; pcmk__warn_multiple_name_matches(out, xml_search, attr_name); @@ -287,9 +288,9 @@ find_matching_attr_resources(pcmk__output_t *out, pcmk_resource_t *rsc, static xmlNode * get_cib_rsc(xmlNode *cib_xml, const pcmk_resource_t *rsc) { - char *xpath = crm_strdup_printf("%s//*[@" PCMK_XA_ID "='%s']", - pcmk_cib_xpath_for(PCMK_XE_RESOURCES), - pcmk__xe_id(rsc->priv->xml)); + char *xpath = pcmk__assert_asprintf("%s//*[@" PCMK_XA_ID "='%s']", + pcmk_cib_xpath_for(PCMK_XE_RESOURCES), + pcmk__xe_id(rsc->priv->xml)); xmlNode *rsc_xml = pcmk__xpath_find_one(cib_xml->doc, xpath, LOG_ERR); free(xpath); @@ -309,7 +310,7 @@ update_element_attribute(pcmk__output_t *out, pcmk_resource_t *rsc, return ENXIO; } - crm_xml_add(rsc_xml, attr_name, attr_value); + pcmk__xe_set(rsc_xml, attr_name, attr_value); rc = cib->cmds->replace(cib, PCMK_XE_RESOURCES, rsc_xml, cib_sync_call); rc = pcmk_legacy2rc(rc); @@ -341,7 +342,7 @@ resources_with_attr(pcmk__output_t *out, cib_t *cib, pcmk_resource_t *rsc, if (rc == pcmk_rc_ok || rc == ENOTUNIQ) { char *found_attr_id = NULL; - found_attr_id = crm_element_value_copy(xml_search, PCMK_XA_ID); + found_attr_id = pcmk__xe_get_copy(xml_search, PCMK_XA_ID); if (!out->is_quiet(out)) { out->err(out, @@ -448,21 +449,23 @@ update_attribute(pcmk_resource_t *rsc, const char *requested_name, switch (rc) { case pcmk_rc_ok: - found_attr_id = crm_element_value_copy(xml_search, PCMK_XA_ID); - crm_debug("Found a match for " PCMK_XA_NAME "='%s': " - PCMK_XA_ID "='%s'", attr_name, found_attr_id); + found_attr_id = pcmk__xe_get_copy(xml_search, PCMK_XA_ID); + pcmk__debug("Found a match for " PCMK_XA_NAME "='%s': " + PCMK_XA_ID "='%s'", + attr_name, found_attr_id); rsc_attr_id = found_attr_id; break; case ENXIO: if (rsc_attr_set == NULL) { - local_attr_set = crm_strdup_printf("%s-%s", lookup_id, - attr_set_type); + local_attr_set = pcmk__assert_asprintf("%s-%s", lookup_id, + attr_set_type); rsc_attr_set = local_attr_set; } if (rsc_attr_id == NULL) { - found_attr_id = crm_strdup_printf("%s-%s", - rsc_attr_set, attr_name); + found_attr_id = pcmk__assert_asprintf("%s-%s", + rsc_attr_set, + attr_name); rsc_attr_id = found_attr_id; } @@ -481,10 +484,10 @@ update_attribute(pcmk_resource_t *rsc, const char *requested_name, } xml_top = pcmk__xe_create(NULL, (const char *) rsc_xml->name); - crm_xml_add(xml_top, PCMK_XA_ID, lookup_id); + pcmk__xe_set(xml_top, PCMK_XA_ID, lookup_id); xml_obj = pcmk__xe_create(xml_top, attr_set_type); - crm_xml_add(xml_obj, PCMK_XA_ID, rsc_attr_set); + pcmk__xe_set(xml_obj, PCMK_XA_ID, rsc_attr_set); break; default: @@ -501,7 +504,7 @@ update_attribute(pcmk_resource_t *rsc, const char *requested_name, xml_top = xml_obj; } - crm_log_xml_debug(xml_top, "Update"); + pcmk__log_xml_debug(xml_top, "Update"); rc = cib->cmds->modify(cib, PCMK_XE_RESOURCES, xml_top, cib_sync_call); rc = pcmk_legacy2rc(rc); @@ -513,7 +516,7 @@ update_attribute(pcmk_resource_t *rsc, const char *requested_name, } if (rsc_attr_set == NULL) { - rsc_attr_set = crm_element_value(xml_search->parent, PCMK_XA_ID); + rsc_attr_set = pcmk__xe_get(xml_search->parent, PCMK_XA_ID); } ud->attr_set_type = pcmk__str_copy(attr_set_type); @@ -547,15 +550,15 @@ update_attribute(pcmk_resource_t *rsc, const char *requested_name, lpc != NULL; lpc = lpc->next) { pcmk__colocation_t *cons = (pcmk__colocation_t *) lpc->data; - crm_debug("Checking %s %d", cons->id, cons->score); + pcmk__debug("Checking %s %d", cons->id, cons->score); - if (pcmk_is_set(cons->dependent->flags, pcmk__rsc_detect_loop) + if (pcmk__is_set(cons->dependent->flags, pcmk__rsc_detect_loop) || (cons->score <= 0)) { continue; } - crm_debug("Setting %s=%s for dependent resource %s", - attr_name, attr_value, cons->dependent->id); + pcmk__debug("Setting %s=%s for dependent resource %s", + attr_name, attr_value, cons->dependent->id); update_attribute(cons->dependent, cons->dependent->id, NULL, attr_set_type, NULL, attr_name, attr_value, recursive, cib, cib_xml_orig, force, results); @@ -678,7 +681,7 @@ cli_resource_delete_attribute(pcmk_resource_t *rsc, const char *requested_name, attr_set, attr_id, attr_name, &xml_search); switch (rc) { case pcmk_rc_ok: - found_attr_id = crm_element_value_copy(xml_search, PCMK_XA_ID); + found_attr_id = pcmk__xe_get_copy(xml_search, PCMK_XA_ID); pcmk__xml_free(xml_search); break; @@ -699,7 +702,7 @@ cli_resource_delete_attribute(pcmk_resource_t *rsc, const char *requested_name, } xml_obj = crm_create_nvpair_xml(NULL, rsc_attr_id, attr_name, NULL); - crm_log_xml_debug(xml_obj, "Delete"); + pcmk__log_xml_debug(xml_obj, "Delete"); rc = cib->cmds->remove(cib, PCMK_XE_RESOURCES, xml_obj, cib_sync_call); rc = pcmk_legacy2rc(rc); @@ -747,9 +750,9 @@ send_lrm_rsc_op(pcmk_ipc_api_t *controld_api, bool do_fail_resource, return EINVAL; } - rsc_class = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); - rsc_provider = crm_element_value(rsc->priv->xml, PCMK_XA_PROVIDER); - rsc_type = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); + rsc_class = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); + rsc_provider = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER); + rsc_type = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); if ((rsc_class == NULL) || (rsc_type == NULL)) { out->err(out, "Resource %s does not have a class and type", rsc_id); return EINVAL; @@ -809,7 +812,7 @@ rsc_fail_name(const pcmk_resource_t *rsc) { const char *name = pcmk__s(rsc->priv->history_id, rsc->id); - if (pcmk_is_set(rsc->flags, pcmk__rsc_unique)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_unique)) { return strdup(name); } return clone_strip(name); @@ -834,11 +837,11 @@ clear_rsc_history(pcmk_ipc_api_t *controld_api, pcmk_resource_t *rsc, return rc; } - crm_trace("Processing %d mainloop inputs", - pcmk_controld_api_replies_expected(controld_api)); + pcmk__trace("Processing %d mainloop inputs", + pcmk_controld_api_replies_expected(controld_api)); while (g_main_context_iteration(NULL, FALSE)) { - crm_trace("Processed mainloop input, %d still remaining", - pcmk_controld_api_replies_expected(controld_api)); + pcmk__trace("Processed mainloop input, %d still remaining", + pcmk_controld_api_replies_expected(controld_api)); } return rc; } @@ -872,14 +875,14 @@ clear_rsc_failures(pcmk__output_t *out, pcmk_ipc_api_t *controld_api, guint interval_ms = 0U; pcmk_parse_interval_spec(interval_spec, &interval_ms); - interval_ms_s = crm_strdup_printf("%u", interval_ms); + interval_ms_s = pcmk__assert_asprintf("%u", interval_ms); } for (xmlNode *xml_op = pcmk__xe_first_child(scheduler->priv->failed, NULL, NULL, NULL); xml_op != NULL; xml_op = pcmk__xe_next(xml_op, NULL)) { - failed_id = crm_element_value(xml_op, PCMK__XA_RSC_ID); + failed_id = pcmk__xe_get(xml_op, PCMK__XA_RSC_ID); if (failed_id == NULL) { // Malformed history entry, should never happen continue; @@ -900,20 +903,20 @@ clear_rsc_failures(pcmk__output_t *out, pcmk_ipc_api_t *controld_api, } // Host name should always have been provided by this point - failed_value = crm_element_value(xml_op, PCMK_XA_UNAME); + failed_value = pcmk__xe_get(xml_op, PCMK_XA_UNAME); if (!pcmk__str_eq(node->priv->name, failed_value, pcmk__str_casei)) { continue; } // No operation specified means all operations match if (operation) { - failed_value = crm_element_value(xml_op, PCMK_XA_OPERATION); + failed_value = pcmk__xe_get(xml_op, PCMK_XA_OPERATION); if (!pcmk__str_eq(operation, failed_value, pcmk__str_casei)) { continue; } // Interval (if operation was specified) defaults to 0 (not all) - failed_value = crm_element_value(xml_op, PCMK_META_INTERVAL); + failed_value = pcmk__xe_get(xml_op, PCMK_META_INTERVAL); if (!pcmk__str_eq(interval_ms_s, failed_value, pcmk__str_casei)) { continue; } @@ -928,8 +931,8 @@ clear_rsc_failures(pcmk__output_t *out, pcmk_ipc_api_t *controld_api, while (g_hash_table_iter_next(&iter, (gpointer *) &failed_id, NULL)) { pcmk_resource_t *rsc = NULL; - crm_debug("Erasing failures of %s on %s", - failed_id, pcmk__node_name(node)); + pcmk__debug("Erasing failures of %s on %s", failed_id, + pcmk__node_name(node)); rsc = pe_find_resource(scheduler->priv->resources, failed_id); if (rsc == NULL) { @@ -1003,7 +1006,7 @@ cli_resource_delete(pcmk_ipc_api_t *controld_api, pcmk_resource_t *rsc, if (force) { nodes = g_list_copy(scheduler->nodes); - } else if (pcmk_is_set(rsc->flags, pcmk__rsc_exclusive_probes)) { + } else if (pcmk__is_set(rsc->flags, pcmk__rsc_exclusive_probes)) { GHashTableIter iter; g_hash_table_iter_init(&iter, rsc->priv->allowed_nodes); @@ -1037,7 +1040,7 @@ cli_resource_delete(pcmk_ipc_api_t *controld_api, pcmk_resource_t *rsc, return rc; } - if (!pcmk_is_set(node->priv->flags, pcmk__node_probes_allowed)) { + if (!pcmk__is_set(node->priv->flags, pcmk__node_probes_allowed)) { out->err(out, "Unable to clean up %s because resource discovery disabled on " "%s", @@ -1157,8 +1160,8 @@ check_role(resource_checks_t *checks) break; case pcmk_role_unpromoted: - if (pcmk_is_set(pe__const_top_resource(checks->rsc, false)->flags, - pcmk__rsc_promotable)) { + if (pcmk__is_set(pe__const_top_resource(checks->rsc, false)->flags, + pcmk__rsc_promotable)) { checks->flags |= rsc_unpromotable; } break; @@ -1174,7 +1177,7 @@ check_managed(resource_checks_t *checks) const char *managed_s = g_hash_table_lookup(checks->rsc->priv->meta, PCMK_META_IS_MANAGED); - if ((managed_s != NULL) && !crm_is_true(managed_s)) { + if ((managed_s != NULL) && !pcmk__is_true(managed_s)) { checks->flags |= rsc_unmanaged; } } @@ -1275,7 +1278,7 @@ cli_resource_fail(pcmk_ipc_api_t *controld_api, pcmk_resource_t *rsc, rsc_id, pcmk__node_name(node)); return pcmk_rc_ok; } - crm_notice("Failing %s on %s", rsc_id, pcmk__node_name(node)); + pcmk__notice("Failing %s on %s", rsc_id, pcmk__node_name(node)); return send_lrm_rsc_op(controld_api, true, rsc, rsc_id, node); } @@ -1330,17 +1333,17 @@ bool resource_is_running_on(pcmk_resource_t *rsc, const char *host) if (pcmk__strcase_any_of(host, node->priv->name, node->priv->id, NULL)) { - crm_trace("Resource %s is running on %s\n", rsc->id, host); + pcmk__trace("Resource %s is running on %s\n", rsc->id, host); goto done; } } if (host != NULL) { - crm_trace("Resource %s is not running on: %s\n", rsc->id, host); + pcmk__trace("Resource %s is not running on: %s\n", rsc->id, host); found = false; } else if(host == NULL && hosts == NULL) { - crm_trace("Resource %s is not running\n", rsc->id); + pcmk__trace("Resource %s is not running\n", rsc->id); found = false; } @@ -1389,7 +1392,7 @@ static void dump_list(GList *items, const char *tag) GList *item = NULL; for (item = items; item != NULL; item = item->next) { - crm_trace("%s[%d]: %s", tag, lpc, (char*)item->data); + pcmk__trace("%s[%d]: %s", tag, lpc, (char*)item->data); lpc++; } } @@ -1675,7 +1678,7 @@ cli_resource_restart(pcmk__output_t *out, pcmk_resource_t *rsc, { int rc = pcmk_rc_ok; int lpc = 0; - int before = 0; + guint before = 0; guint step_timeout_s = 0; /* @TODO Due to this sleep interval, a timeout <2s will cause problems and @@ -1734,7 +1737,7 @@ cli_resource_restart(pcmk__output_t *out, pcmk_resource_t *rsc, return ENXIO; } - if (!pcmk_is_set(rsc->flags, pcmk__rsc_managed)) { + if (!pcmk__is_set(rsc->flags, pcmk__rsc_managed)) { out->err(out, "Unmanaged resources cannot be restarted."); return EAGAIN; } @@ -1813,7 +1816,7 @@ cli_resource_restart(pcmk__output_t *out, pcmk_resource_t *rsc, PCMK_META_TARGET_ROLE, &xml_search); if (rc == pcmk_rc_ok) { - orig_target_role = crm_element_value_copy(xml_search, PCMK_XA_VALUE); + orig_target_role = pcmk__xe_get_copy(xml_search, PCMK_XA_VALUE); } pcmk__xml_free(xml_search); @@ -1864,7 +1867,7 @@ cli_resource_restart(pcmk__output_t *out, pcmk_resource_t *rsc, sleep(sleep_interval); if(timeout) { timeout -= sleep_interval; - crm_trace("%us remaining", timeout); + pcmk__trace("%us remaining", timeout); } rc = update_dataset(cib, scheduler, &cib_xml_orig, false); if(rc != pcmk_rc_ok) { @@ -1885,7 +1888,8 @@ cli_resource_restart(pcmk__output_t *out, pcmk_resource_t *rsc, dump_list(list_delta, "Delta"); } - crm_trace("%d (was %d) resources remaining", g_list_length(list_delta), before); + pcmk__trace("%u (was %u) resources remaining", + g_list_length(list_delta), before); if(before == g_list_length(list_delta)) { /* aborted during stop phase, print the contents of list_delta */ out->err(out, "Could not complete shutdown of %s, %d resources remaining", rsc_id, g_list_length(list_delta)); @@ -1944,7 +1948,7 @@ cli_resource_restart(pcmk__output_t *out, pcmk_resource_t *rsc, sleep(sleep_interval); if(timeout) { timeout -= sleep_interval; - crm_trace("%ds remaining", timeout); + pcmk__trace("%ds remaining", timeout); } rc = update_dataset(cib, scheduler, &cib_xml_orig, false); @@ -2019,9 +2023,9 @@ cli_resource_restart(pcmk__output_t *out, pcmk_resource_t *rsc, static inline bool action_is_pending(const pcmk_action_t *action) { - if (pcmk_any_flags_set(action->flags, - pcmk__action_optional|pcmk__action_pseudo) - || !pcmk_is_set(action->flags, pcmk__action_runnable) + if (pcmk__any_flags_set(action->flags, + pcmk__action_optional|pcmk__action_pseudo) + || !pcmk__is_set(action->flags, pcmk__action_runnable) || pcmk__str_eq(PCMK_ACTION_NOTIFY, action->task, pcmk__str_casei)) { return false; } @@ -2043,7 +2047,7 @@ actions_are_pending(const GList *actions) const pcmk_action_t *a = (const pcmk_action_t *) action->data; if (action_is_pending(a)) { - crm_notice("Waiting for %s (flags=%#.8x)", a->uuid, a->flags); + pcmk__notice("Waiting for %s (flags=%#.8x)", a->uuid, a->flags); return true; } } @@ -2118,13 +2122,13 @@ wait_till_stable(pcmk__output_t *out, guint timeout_ms, cib_t * cib) return ENOMEM; } - xpath = crm_strdup_printf("/" PCMK_XE_CIB "/" PCMK_XE_STATUS - "/" PCMK__XE_NODE_STATE "/" PCMK__XE_LRM - "/" PCMK__XE_LRM_RESOURCES - "/" PCMK__XE_LRM_RESOURCE - "/" PCMK__XE_LRM_RSC_OP - "[@" PCMK__XA_RC_CODE "='%d']", - PCMK_OCF_UNKNOWN); + xpath = pcmk__assert_asprintf("/" PCMK_XE_CIB "/" PCMK_XE_STATUS + "/" PCMK__XE_NODE_STATE "/" PCMK__XE_LRM + "/" PCMK__XE_LRM_RESOURCES + "/" PCMK__XE_LRM_RESOURCE + "/" PCMK__XE_LRM_RSC_OP + "[@" PCMK__XA_RC_CODE "='%d']", + PCMK_OCF_UNKNOWN); do { /* Abort if timeout is reached */ time_diff = expire_time - time(NULL); @@ -2134,8 +2138,8 @@ wait_till_stable(pcmk__output_t *out, guint timeout_ms, cib_t * cib) break; } - crm_info("Waiting up to %lld seconds for cluster actions to complete", - (long long) time_diff); + pcmk__info("Waiting up to %lld seconds for cluster actions to complete", + (long long) time_diff); if (rc == pcmk_rc_ok) { /* this avoids sleep on first loop iteration */ sleep(WAIT_SLEEP_S); @@ -2219,12 +2223,12 @@ set_agent_environment(GHashTable *params, guint timeout_ms, int check_level, int verbosity) { g_hash_table_insert(params, crm_meta_name(PCMK_META_TIMEOUT), - crm_strdup_printf("%u", timeout_ms)); + pcmk__assert_asprintf("%u", timeout_ms)); pcmk__insert_dup(params, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET); if (check_level >= 0) { - char *level = crm_strdup_printf("%d", check_level); + char *level = pcmk__assert_asprintf("%d", check_level); setenv("OCF_CHECK_LEVEL", level, 1); free(level); @@ -2308,7 +2312,7 @@ cli_resource_execute_from_params(pcmk__output_t *out, const char *rsc_name, } #endif - if (!pcmk_is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_cli_exec)) { + if (!pcmk__is_set(pcmk_get_ra_caps(class), pcmk_ra_cap_cli_exec)) { services__format_result(op, CRM_EX_UNIMPLEMENT_FEATURE, PCMK_EXEC_ERROR, "Manual execution of the %s standard is " "unsupported", pcmk__s(class, "unspecified")); @@ -2414,9 +2418,9 @@ cli_resource_execute(pcmk_resource_t *rsc, const char *requested_name, return CRM_EX_UNIMPLEMENT_FEATURE; } - rclass = crm_element_value(rsc->priv->xml, PCMK_XA_CLASS); - rprov = crm_element_value(rsc->priv->xml, PCMK_XA_PROVIDER); - rtype = crm_element_value(rsc->priv->xml, PCMK_XA_TYPE); + rclass = pcmk__xe_get(rsc->priv->xml, PCMK_XA_CLASS); + rprov = pcmk__xe_get(rsc->priv->xml, PCMK_XA_PROVIDER); + rtype = pcmk__xe_get(rsc->priv->xml, PCMK_XA_TYPE); params = generate_resource_params(rsc); // @TODO use local node @@ -2454,11 +2458,11 @@ cli_resource_move(pcmk_resource_t *rsc, const char *rsc_id, out = scheduler->priv->out; if (promoted_role_only - && !pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + && !pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { pcmk_resource_t *p = uber_parent(rsc); - if (pcmk_is_set(p->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(p->flags, pcmk__rsc_promotable)) { /* @TODO This is dead code. If rsc is part of a promotable clone, * then it has the pcmk__rsc_promotable flag set. * @@ -2490,7 +2494,7 @@ cli_resource_move(pcmk_resource_t *rsc, const char *rsc_id, current = pe__find_active_requires(rsc, &count); - if (pcmk_is_set(rsc->flags, pcmk__rsc_promotable)) { + if (pcmk__is_set(rsc->flags, pcmk__rsc_promotable)) { unsigned int promoted_count = 0; pcmk_node_t *promoted_node = NULL; @@ -2525,9 +2529,9 @@ cli_resource_move(pcmk_resource_t *rsc, const char *rsc_id, } cur_is_dest = true; - crm_info("%s is already %s on %s, reinforcing placement with location " - "constraint", - rsc_id, active_s, pcmk__node_name(dest)); + pcmk__info("%s is already %s on %s, reinforcing placement with " + "location constraint", + rsc_id, active_s, pcmk__node_name(dest)); } /* @TODO The constraint changes in the following commands should done @@ -2546,9 +2550,9 @@ cli_resource_move(pcmk_resource_t *rsc, const char *rsc_id, rc = cli_resource_prefer(out, rsc_id, dest->priv->name, move_lifetime, cib, promoted_role_only, PCMK_ROLE_PROMOTED); - crm_trace("%s%s now prefers %s%s", - rsc->id, (promoted_role_only? " (promoted)" : ""), - pcmk__node_name(dest), (force? " (forced)" : "")); + pcmk__trace("%s%s now prefers %s%s", + rsc->id, (promoted_role_only? " (promoted)" : ""), + pcmk__node_name(dest), (force? " (forced)" : "")); /* Ban the current location if force is set and the current location is not * the destination. It is possible to use move to enforce a location without @@ -2571,8 +2575,8 @@ cli_resource_move(pcmk_resource_t *rsc, const char *rsc_id, rsc_id, active_s); } else { - crm_trace("Not banning %s from its current location: not active", - rsc_id); + pcmk__trace("Not banning %s from its current location: not active", + rsc_id); } } diff --git a/tools/crm_shadow.c b/tools/crm_shadow.c index d28b2e7c831..cb88b2053b3 100644 --- a/tools/crm_shadow.c +++ b/tools/crm_shadow.c @@ -158,13 +158,13 @@ shadow_default(pcmk__output_t *out, va_list args) int rc = pcmk_rc_no_output; - if (pcmk_is_set(flags, shadow_disp_instance)) { + if (pcmk__is_set(flags, shadow_disp_instance)) { rc = out->info(out, "Instance: %s", pcmk__s(instance, "")); } - if (pcmk_is_set(flags, shadow_disp_file)) { + if (pcmk__is_set(flags, shadow_disp_file)) { rc = out->info(out, "File name: %s", pcmk__s(filename, "")); } - if (pcmk_is_set(flags, shadow_disp_content)) { + if (pcmk__is_set(flags, shadow_disp_content)) { rc = out->info(out, "Content:"); if (content != NULL) { @@ -185,7 +185,7 @@ shadow_default(pcmk__output_t *out, va_list args) out->info(out, ""); } } - if (pcmk_is_set(flags, shadow_disp_diff)) { + if (pcmk__is_set(flags, shadow_disp_diff)) { rc = out->info(out, "Diff:"); if (diff != NULL) { @@ -237,13 +237,13 @@ shadow_text(pcmk__output_t *out, va_list args) */ out->quiet = false; - if (pcmk_is_set(flags, shadow_disp_instance) && (instance != NULL)) { + if (pcmk__is_set(flags, shadow_disp_instance) && (instance != NULL)) { rc = out->info(out, "%s", instance); } - if (pcmk_is_set(flags, shadow_disp_file) && (filename != NULL)) { + if (pcmk__is_set(flags, shadow_disp_file) && (filename != NULL)) { rc = out->info(out, "%s", filename); } - if (pcmk_is_set(flags, shadow_disp_content) && (content != NULL)) { + if (pcmk__is_set(flags, shadow_disp_content) && (content != NULL)) { GString *buf = g_string_sized_new(1024); gchar *str = NULL; @@ -255,7 +255,7 @@ shadow_text(pcmk__output_t *out, va_list args) rc = out->info(out, "%s", str); g_free(str); } - if (pcmk_is_set(flags, shadow_disp_diff) && (diff != NULL)) { + if (pcmk__is_set(flags, shadow_disp_diff) && (diff != NULL)) { rc = out->message(out, "xml-patchset", diff); } @@ -356,10 +356,10 @@ set_danger_error(const char *reason, bool for_shadow, bool show_mismatch, if (show_mismatch && !pcmk__str_eq(active, options.instance, pcmk__str_null_matches)) { - full = crm_strdup_printf("%s.\nAdditionally, the supplied shadow " - "instance (%s) is not the same as the active " - "one (%s)", - reason, options.instance, active); + full = pcmk__assert_asprintf("%s.\nAdditionally, the supplied shadow " + "instance (%s) is not the same as the " + "active one (%s)", + reason, options.instance, active); reason = full; } @@ -410,8 +410,9 @@ check_file_exists(const char *filename, bool should_exist, GError **error) struct stat buf; if (!should_exist && (stat(filename, &buf) == 0)) { - char *reason = crm_strdup_printf("A shadow instance '%s' already " - "exists", options.instance); + char *reason = pcmk__assert_asprintf("A shadow instance '%s' already " + "exists", + options.instance); exit_code = CRM_EX_CANTCREAT; set_danger_error(reason, true, false, error); @@ -558,7 +559,7 @@ write_shadow_file(const xmlNode *xml, const char *filename, bool reset, static inline char * get_shadow_prompt(void) { - return crm_strdup_printf("shadow[%.40s] # ", options.instance); + return pcmk__assert_asprintf("shadow[%.40s] # ", options.instance); } /*! @@ -612,9 +613,9 @@ shadow_setup(pcmk__output_t *out, bool do_switch, GError **error) prefix = "To switch to the named shadow instance"; } - msg = crm_strdup_printf("%s, enter the following into your shell:\n" - "\texport CIB_shadow=%s", - prefix, options.instance); + msg = pcmk__assert_asprintf("%s, enter the following into your shell:\n" + "\texport CIB_shadow=%s", + prefix, options.instance); out->message(out, "instruction", msg); free(msg); } @@ -738,9 +739,9 @@ create_shadow_empty(pcmk__output_t *out, GError **error) } output = createEmptyCib(0); - crm_xml_add(output, PCMK_XA_VALIDATE_WITH, options.validate_with); + pcmk__xe_set(output, PCMK_XA_VALIDATE_WITH, options.validate_with); out->info(out, "Created new %s configuration", - crm_element_value(output, PCMK_XA_VALIDATE_WITH)); + pcmk__xe_get(output, PCMK_XA_VALIDATE_WITH)); if (write_shadow_file(output, filename, false, error) != pcmk_rc_ok) { goto done; @@ -944,12 +945,11 @@ show_shadow_diff(pcmk__output_t *out, GError **error) if (read_xml(filename, &new_config, error) != pcmk_rc_ok) { goto done; } - xml_track_changes(new_config, NULL, new_config, false); - xml_calculate_changes(old_config, new_config); + pcmk__xml_mark_changes(old_config, new_config); diff = xml_create_patchset(0, old_config, new_config, NULL, false); pcmk__log_xml_changes(LOG_INFO, new_config); - xml_accept_changes(new_config); + pcmk__xml_commit_changes(new_config->doc); out->quiet = true; out->message(out, "shadow", diff --git a/tools/crm_simulate.c b/tools/crm_simulate.c index dcbc8c33be3..de47ed6adf5 100644 --- a/tools/crm_simulate.c +++ b/tools/crm_simulate.c @@ -491,8 +491,9 @@ main(int argc, char **argv) goto done; } - if (pcmk__str_eq(args->output_ty, "text", pcmk__str_null_matches) && - !(pcmk_is_set(options.flags, pcmk_sim_show_scores) && args->quiet)) { + if (pcmk__str_eq(args->output_ty, "text", pcmk__str_null_matches) + && !(pcmk__is_set(options.flags, pcmk_sim_show_scores) + && args->quiet)) { pcmk__output_text_set_fancy(out, true); } diff --git a/tools/crm_ticket.c b/tools/crm_ticket.c index 251ed8449fc..9c7f2c0ce1d 100644 --- a/tools/crm_ticket.c +++ b/tools/crm_ticket.c @@ -1,5 +1,5 @@ /* - * Copyright 2012-2024 the Pacemaker project contributors + * Copyright 2012-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -575,7 +575,7 @@ main(int argc, char **argv) const char *value = NULL; value = g_hash_table_lookup(attr_set, PCMK__XA_GRANTED); - if (crm_is_true(value)) { + if (pcmk__is_true(value)) { ticket_grant_warning(options.ticket_id); } else { ticket_revoke_warning(options.ticket_id); diff --git a/tools/crmadmin.c b/tools/crmadmin.c index 275d51bad2c..6cf9b13ebe8 100644 --- a/tools/crmadmin.c +++ b/tools/crmadmin.c @@ -103,7 +103,7 @@ command_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError { if (!strcmp(option_name, "--status") || !strcmp(option_name, "-S")) { command = cmd_health; - crm_trace("Option %c => %s", 'S', optarg); + pcmk__trace("Option %c => %s", 'S', optarg); } if (!strcmp(option_name, "--pacemakerd") || !strcmp(option_name, "-P")) { diff --git a/tools/stonith_admin.c b/tools/stonith_admin.c index b52e7deeb9e..d84f2cef913 100644 --- a/tools/stonith_admin.c +++ b/tools/stonith_admin.c @@ -54,7 +54,7 @@ struct { GHashTable *params; int fence_level; int timeout ; - long long tolerance_ms; + unsigned int tolerance_ms; int delay; char *agent; char *confirm_host; @@ -242,7 +242,7 @@ static char *name = NULL; gboolean add_env_params(const gchar *option_name, const gchar *optarg, gpointer data, GError **error) { - char *key = crm_strdup_printf("OCF_RESKEY_%s", optarg); + char *key = pcmk__assert_asprintf("OCF_RESKEY_%s", optarg); const char *env = getenv(key); gboolean retval = TRUE; @@ -250,7 +250,7 @@ add_env_params(const gchar *option_name, const gchar *optarg, gpointer data, GEr g_set_error(error, PCMK__EXITC_ERROR, CRM_EX_INVALID_PARAM, "Invalid option: -e %s", optarg); retval = FALSE; } else { - crm_info("Got: '%s'='%s'", optarg, env); + pcmk__info("Got: '%s'='%s'", optarg, env); if (options.params != NULL) { options.params = pcmk__strkey_table(free, free); @@ -272,13 +272,15 @@ add_stonith_device(const gchar *option_name, const gchar *optarg, gpointer data, gboolean add_tolerance(const gchar *option_name, const gchar *optarg, gpointer data, GError **error) { // pcmk__request_fencing() expects an unsigned int - options.tolerance_ms = crm_get_msec(optarg); + long long tolerance_ms = 0; - if (options.tolerance_ms < 0) { - crm_warn("Ignoring invalid tolerance '%s'", optarg); - options.tolerance_ms = 0; + if ((pcmk__parse_ms(optarg, &tolerance_ms) != pcmk_rc_ok) + || (tolerance_ms < 0)) { + + // @COMPAT Treat as an error and return FALSE? + pcmk__warn("Ignoring invalid tolerance '%s'", optarg); } else { - options.tolerance_ms = QB_MIN(options.tolerance_ms, UINT_MAX); + options.tolerance_ms = (unsigned int) QB_MIN(tolerance_ms, UINT_MAX); } return TRUE; } @@ -290,7 +292,7 @@ add_stonith_params(const gchar *option_name, const gchar *optarg, gpointer data, int rc = 0; gboolean retval = TRUE; - crm_info("Scanning: -o %s", optarg); + pcmk__info("Scanning: -o %s", optarg); rc = pcmk__scan_nvpair(optarg, &name, &value); @@ -298,7 +300,7 @@ add_stonith_params(const gchar *option_name, const gchar *optarg, gpointer data, g_set_error(error, PCMK__RC_ERROR, rc, "Invalid option: -o %s: %s", optarg, pcmk_rc_str(rc)); retval = FALSE; } else { - crm_info("Got: '%s'='%s'", name, value); + pcmk__info("Got: '%s'='%s'", name, value); if (options.params == NULL) { options.params = pcmk__strkey_table(free, free); @@ -315,7 +317,7 @@ add_stonith_params(const gchar *option_name, const gchar *optarg, gpointer data, gboolean set_tag(const gchar *option_name, const gchar *optarg, gpointer data, GError **error) { free(name); - name = crm_strdup_printf("%s.%s", crm_system_name, optarg); + name = pcmk__assert_asprintf("%s.%s", crm_system_name, optarg); return TRUE; } @@ -696,7 +698,7 @@ main(int argc, char **argv) break; } - crm_info("Command returned: %s (%d)", pcmk_rc_str(rc), rc); + pcmk__info("Command returned: %s (%d)", pcmk_rc_str(rc), rc); exit_code = pcmk_rc2exitc(rc); done: