17#include <libxml/tree.h>
37 bool runnable =
false;
50 if ((node == NULL) || !pcmk__is_clone(
action->rsc)) {
96action_uuid_for_ordering(
const char *first_uuid,
99 guint interval_ms = 0;
102 char *first_task_str = NULL;
114 if (interval_ms > 0) {
119 switch (first_task) {
125 remapped_task = first_task + 1;
132 remapped_task = first_task;
139 crm_err(
"Unknown action '%s' in ordering", first_task_str);
148 && (pcmk__is_clone(first_rsc) || pcmk__is_bundled(first_rsc))) {
155 "Remapped action UUID %s to %s for ordering purposes",
160 free(first_task_str);
192 && (
action->uuid != NULL)) {
193 char *uuid = action_uuid_for_ordering(
action->uuid, rsc);
197 crm_warn(
"Not remapping %s to %s because %s does not have "
198 "remapped action",
action->uuid, uuid, rsc->
id);
225static inline uint32_t
249 uint32_t first_flags, uint32_t then_flags,
273 "%s then %s: mapped "
274 "pcmk__ar_first_implies_same_node_then to "
275 "pcmk__ar_first_implies_then on %s",
276 first->
uuid, then->
uuid, pcmk__node_name(node));
280 if (then->
rsc != NULL) {
281 changed |= update(then->
rsc, first, then, node,
291 "%s then %s: %s after pcmk__ar_first_implies_then",
293 (changed?
"changed" :
"unchanged"));
297 && (then->
rsc != NULL)) {
301 changed |= update(then->
rsc, first, then, node, first_flags, restart,
304 "%s then %s: %s after pcmk__ar_intermediate_stop",
306 (changed?
"changed" :
"unchanged"));
310 if (first->
rsc != NULL) {
311 changed |= update(first->
rsc, first, then, node, first_flags,
320 "%s then %s: %s after pcmk__ar_then_implies_first",
322 (changed?
"changed" :
"unchanged"));
326 if (then->
rsc != NULL) {
327 changed |= update(then->
rsc, first, then, node,
333 "%s then %s: %s after "
334 "pcmk__ar_promoted_then_implies_first",
336 (changed?
"changed" :
"unchanged"));
340 if (then->
rsc != NULL) {
341 changed |= update(then->
rsc, first, then, node, first_flags,
361 (changed?
"changed" :
"unchanged"));
365 && (then->
rsc != NULL)) {
368 && (first->
rsc != NULL)
372 "%s then %s: ignoring because first is stopping",
376 changed |= update(then->
rsc, first, then, node, first_flags,
381 "%s then %s: %s after pcmk__ar_nested_remote_probe",
383 (changed?
"changed" :
"unchanged"));
387 if (then->
rsc != NULL) {
388 changed |= update(then->
rsc, first, then, node, first_flags,
399 "%s then %s: %s after pcmk__ar_unrunnable_first_blocks",
401 (changed?
"changed" :
"unchanged"));
405 if (then->
rsc != NULL) {
406 changed |= update(then->
rsc, first, then, node, first_flags,
411 "%s then %s: %s after "
412 "pcmk__ar_unmigratable_then_blocks",
414 (changed?
"changed" :
"unchanged"));
418 if (then->
rsc != NULL) {
419 changed |= update(then->
rsc, first, then, node, first_flags,
424 "%s then %s: %s after pcmk__ar_first_else_then",
426 (changed?
"changed" :
"unchanged"));
430 if (then->
rsc != NULL) {
431 changed |= update(then->
rsc, first, then, node, first_flags,
437 (changed?
"changed" :
"unchanged"));
441 if (then->
rsc != NULL) {
442 changed |= update(then->
rsc, first, then, node, first_flags,
448 (changed?
"changed" :
"unchanged"));
473 && (first->
rsc != NULL)
490 "%s then %s: %s after checking whether first "
491 "is blocked, unmanaged, unrunnable stop",
493 (changed?
"changed" :
"unchanged"));
501#define action_type_str(flags) \
502 (pcmk_is_set((flags), pcmk__action_pseudo)? "pseudo-action" : "action")
504#define action_optional_str(flags) \
505 (pcmk_is_set((flags), pcmk__action_optional)? "optional" : "required")
507#define action_runnable_str(flags) \
508 (pcmk_is_set((flags), pcmk__action_runnable)? "runnable" : "unrunnable")
510#define action_node_str(a) \
511 (((a)->node == NULL)? "no node" : (a)->node->priv->name)
526 int last_flags = then->
flags;
557 if ((first->
rsc != NULL)
558 && pcmk__is_group(first->
rsc)
563 if (first_node != NULL) {
565 pcmk__node_name(first_node), first->
uuid);
569 if (pcmk__is_group(then->
rsc)
573 if (then_node != NULL) {
575 pcmk__node_name(then_node), then->
uuid);
581 && (first_node != NULL) && (then_node != NULL)
582 && !pcmk__same_node(first_node, then_node)) {
585 "Disabled ordering %s on %s then %s on %s: "
587 other->
action->
uuid, pcmk__node_name(first_node),
588 then->
uuid, pcmk__node_name(then_node));
595 if ((first->
rsc != NULL)
608 if ((first->
rsc != NULL) && (then->
rsc != NULL)
610 first = action_for_ordering(first);
612 if (first != other->
action) {
618 "%s (%#.6x) then %s (%#.6x): type=%#.6x node=%s",
622 if (first == other->
action) {
627 uint32_t first_flags, then_flags;
629 first_flags = action_flags_for_ordering(first, then_node);
630 then_flags = action_flags_for_ordering(then, first_node);
632 changed |= update_action_for_ordering_flags(first, then,
633 first_flags, then_flags,
645 "Disabled ordering %s then %s in favor of %s "
654 crm_trace(
"Re-processing %s and its 'after' actions "
655 "because it changed", first->
uuid);
667 if (last_flags == then->
flags) {
675 crm_trace(
"Re-processing %s and its 'after' actions because it changed",
682 for (lpc = then->
actions_after; lpc != NULL; lpc = lpc->next) {
693 return (
action != NULL) && pcmk__is_primitive(
action->rsc);
704#define clear_action_flag_because(action, flag, reason) do { \
705 if (pcmk_is_set((action)->flags, (flag))) { \
706 pcmk__clear_action_flags(action, flag); \
707 if ((action)->rsc != (reason)->rsc) { \
708 char *reason_text = pe__action2reason((reason), (flag)); \
709 pe_action_set_reason((action), reason_text, false); \
731 if ((then->
rsc == NULL)
778 const char *reason = NULL;
780 pcmk__assert(is_primitive_action(first) && is_primitive_action(then));
796 && (first->
rsc == then->
rsc)) {
800 if (reason == NULL) {
854 uint32_t filter, uint32_t
type,
858 uint32_t then_flags = 0U;
859 uint32_t first_flags = 0U;
863 then_flags = then->
flags;
864 first_flags = first->
flags;
866 handle_asymmetric_ordering(first, then);
886 && (then->
rsc != NULL)
939 handle_restart_ordering(first, then, filter);
942 if (then_flags != then->
flags) {
945 "%s on %s: flags are now %#.6x (was %#.6x) "
946 "because of 'first' %s (%#.6x)",
947 then->
uuid, pcmk__node_name(then->
node),
956 if (first_flags != first->
flags) {
959 "%s on %s: flags are now %#.6x (was %#.6x) "
960 "because of 'then' %s (%#.6x)",
961 first->
uuid, pcmk__node_name(first->
node),
980 const char *node_uname = NULL;
981 const char *node_uuid = NULL;
982 const char *desc = NULL;
987 if (
action->node != NULL) {
988 node_uname =
action->node->priv->name;
989 node_uuid =
action->node->priv->id;
991 node_uname =
"<none>";
1003 desc =
"!!Non-Startable!! ";
1005 desc =
"(Provisional) ";
1007 crm_trace(
"%s%s%sAction %d: %s%s%s%s%s%s",
1008 ((pre_text == NULL)?
"" : pre_text),
1009 ((pre_text == NULL)?
"" :
": "),
1011 (node_uname?
"\ton " :
""), (node_uname? node_uname :
""),
1012 (node_uuid?
"\t\t(" :
""), (node_uuid? node_uuid :
""),
1013 (node_uuid?
")" :
""));
1021 desc =
"!!Non-Startable!! ";
1023 desc =
"(Provisional) ";
1025 crm_trace(
"%s%s%sAction %d: %s %s%s%s%s%s%s",
1026 ((pre_text == NULL)?
"" : pre_text),
1027 ((pre_text == NULL)?
"" :
": "),
1030 (node_uname?
"\ton " :
""), (node_uname? node_uname :
""),
1031 (node_uuid?
"\t\t(" :
""), (node_uuid? node_uuid :
""),
1032 (node_uuid?
")" :
""));
1037 const GList *iter = NULL;
1040 crm_trace(
"\t\t====== Preceding Actions");
1041 for (iter =
action->actions_before; iter != NULL; iter = iter->next) {
1045 crm_trace(
"\t\t====== Subsequent Actions");
1046 for (iter =
action->actions_after; iter != NULL; iter = iter->next) {
1054 g_list_length(
action->actions_before),
1055 g_list_length(
action->actions_after));
1070 char *shutdown_id = NULL;
1100 char *digest = NULL;
1101 xmlNode *args_xml = NULL;
1103 if (op->
params == NULL) {
1115#define FAKE_TE_ID "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
1132 const char *caller_version,
int target_rc,
1133 const char *node,
const char *origin)
1138 char *op_id_additional = NULL;
1139 char *local_user_data = NULL;
1140 const char *exit_reason = NULL;
1142 xmlNode *xml_op = NULL;
1143 const char *task = NULL;
1146 crm_trace(
"Creating history XML for %s-interval %s action for %s on %s "
1147 "(DC version: %s, origin: %s)",
1149 ((node == NULL)?
"no node" : node), caller_version, origin);
1199 op_id = strdup(key);
1212 op_id = strdup(key);
1221 if (xml_op == NULL) {
1234 if (magic == NULL) {
1258 "last=%lld change=%lld exec=%u queue=%u",
1269 (
long long) op->
t_run);
1289 add_op_digest_to_xml(op, xml_op);
1291 if (op_id_additional) {
1293 op_id = op_id_additional;
1294 op_id_additional = NULL;
1298 if (local_user_data) {
1299 free(local_user_data);
1327 || !pcmk__same_node(
action->node,
action->rsc->priv->lock_node)) {
1334 if (
action->node->details->shutdown && (
action->task != NULL)
1344sort_action_id(gconstpointer a, gconstpointer b)
1377 action->actions_before = g_list_sort(
action->actions_before,
1379 for (item =
action->actions_before; item != NULL; item = next) {
1383 if ((last_input != NULL)
1385 crm_trace(
"Input %s (%d) duplicate skipped for action %s (%d)",
1394 if (
input->graphed) {
1399 action->actions_before = g_list_delete_link(
action->actions_before,
1421 iter != NULL; iter = iter->next) {
1423 char *node_name = NULL;
1427 if (
action->rsc != NULL) {
1436 task = strdup(
"Shutdown");
1440 const char *op = g_hash_table_lookup(
action->meta,
1449 if (pcmk__is_guest_or_bundle_node(
action->node)) {
1453 pcmk__node_name(
action->node),
1455 }
else if (
action->node != NULL) {
1459 out->
message(out,
"node-action", task, node_name,
action->reason);
1467 iter != NULL; iter = iter->next) {
1485task_for_digest(
const char *task, guint interval_ms)
1490 if ((interval_ms == 0)
1516only_sanitized_changed(
const xmlNode *xml_op,
1520 const char *digest_secure = NULL;
1544force_restart(
pcmk_resource_t *rsc,
const char *task, guint interval_ms,
1564schedule_reload(gpointer
data, gpointer user_data)
1573 g_list_foreach(rsc->
priv->
children, schedule_reload, user_data);
1585 (node == NULL)?
"inactive" : node->
priv->
name);
1594 "%s: preventing agent reload because start pending",
1632 const xmlNode *xml_op)
1634 guint interval_ms = 0;
1635 const char *task = NULL;
1638 CRM_CHECK((rsc != NULL) && (node != NULL) && (xml_op != NULL),
1647 if (interval_ms > 0) {
1650 "%s-interval %s for %s on %s is in configuration",
1652 pcmk__node_name(node));
1657 task, interval_ms, node,
"orphan");
1662 pcmk__node_name(node));
1667 crm_trace(
"Checking %s-interval %s for %s on %s for configuration changes",
1669 pcmk__node_name(node));
1670 task = task_for_digest(task, interval_ms);
1674 if (only_sanitized_changed(xml_op, digest_data, rsc->
priv->
scheduler)) {
1679 "Only 'private' parameters to %s-interval %s for %s "
1680 "on %s changed: %s",
1682 pcmk__node_name(node),
1688 switch (digest_data->
rc) {
1691 force_restart(rsc, task, interval_ms, node);
1698 if (interval_ms > 0) {
1710 "Device parameters changed (reload)", NULL,
1713 schedule_reload((gpointer) rsc, (gpointer) node);
1718 "because agent doesn't support reload",
1722 force_restart(rsc, task, interval_ms, node);
1741rsc_history_as_list(
const xmlNode *rsc_entry,
int *start_index,
int *stop_index)
1749 ops = g_list_prepend(ops, rsc_op);
1776 int start_index = 0;
1777 GList *sorted_op_list = NULL;
1785 "Skipping configuration check "
1786 "for orphaned clone instance %s",
1790 "Skipping configuration check and scheduling "
1791 "clean-up for orphaned resource %s", rsc->
id);
1798 node->
priv->
id) == NULL) {
1803 "Skipping configuration check for %s "
1804 "because no longer active on %s",
1805 rsc->
id, pcmk__node_name(node));
1809 pcmk__rsc_trace(rsc,
"Checking for configuration changes for %s on %s",
1810 rsc->
id, pcmk__node_name(node));
1816 sorted_op_list = rsc_history_as_list(rsc_entry, &start_index, &stop_index);
1817 if (start_index < stop_index) {
1821 for (GList *iter = sorted_op_list; iter != NULL; iter = iter->next) {
1822 xmlNode *rsc_op = (xmlNode *) iter->data;
1823 const char *task = NULL;
1824 guint interval_ms = 0;
1826 if (++offset < start_index) {
1834 if ((interval_ms > 0)
1840 task, interval_ms, node,
"maintenance mode");
1842 }
else if ((interval_ms > 0)
1869 g_list_free(sorted_op_list);
1886process_node_history(
pcmk_node_t *node,
const xmlNode *lrm_rscs)
1888 crm_trace(
"Processing node history for %s", pcmk__node_name(node));
1895 if (rsc_entry->children != NULL) {
1899 for (GList *iter =
result; iter != NULL; iter = iter->next) {
1902 if (pcmk__is_primitive(rsc)) {
1903 process_rsc_history(rsc_entry, rsc, node);
1912#define XPATH_NODE_HISTORY "/" PCMK_XE_CIB "/" PCMK_XE_STATUS \
1913 "/" PCMK__XE_NODE_STATE \
1914 "[@" PCMK_XA_UNAME "='%s']" \
1915 "/" PCMK__XE_LRM "/" PCMK__XE_LRM_RESOURCES
1932 crm_trace(
"Check resource and action configuration for changes");
1938 for (GList *iter =
scheduler->
nodes; iter != NULL; iter = iter->next) {
1949 xmlNode *history = NULL;
1956 process_node_history(node, history);
@ pcmk__ar_if_on_same_node
Relation applies only if actions are on same node.
@ pcmk__ar_first_else_then
If 'first' is unrunnable, 'then' becomes a real, unmigratable action.
@ pcmk__ar_first_implies_then
@ pcmk__ar_asymmetric
User-configured asymmetric ordering.
@ pcmk__ar_first_implies_same_node_then
If 'first' is required, 'then' action for instance on same node is.
@ pcmk__ar_then_implies_first
@ pcmk__ar_intermediate_stop
@ pcmk__ar_promoted_then_implies_first
@ pcmk__ar_then_implies_first_graphed
If 'then' is required, 'first' must be added to the transition graph.
@ pcmk__ar_min_runnable
'then' action is runnable if certain number of 'first' instances are
@ pcmk__ar_none
No relation (compare with equality rather than bit set)
@ pcmk__ar_first_implies_then_graphed
If 'first' is required and runnable, 'then' must be in graph.
@ pcmk__ar_nested_remote_probe
@ pcmk__ar_unrunnable_first_blocks
'then' is runnable (and migratable) only if 'first' is runnable
@ pcmk__ar_unmigratable_then_blocks
@ pcmk__ar_ordered
Actions are ordered (optionally, if no other flags are set)
@ pcmk__ar_then_cancels_first
If 'then' action becomes required, 'first' becomes optional.
#define pcmk__clear_relation_flags(ar_flags, flags_to_clear)
#define pcmk__set_relation_flags(ar_flags, flags_to_set)
gboolean parse_op_key(const char *key, char **rsc_id, char **op_type, guint *interval_ms)
gboolean did_rsc_op_fail(lrmd_event_data_t *event, int target_rc)
#define PCMK_ACTION_PROMOTE
#define PCMK_ACTION_START
#define PCMK_ACTION_MIGRATE_FROM
#define PCMK_ACTION_RELOAD
#define PCMK_ACTION_MIGRATE_TO
#define PCMK_ACTION_MONITOR
#define PCMK_ACTION_STONITH
#define PCMK_ACTION_RELOAD_AGENT
#define PCMK_ACTION_DO_SHUTDOWN
#define PCMK_ACTION_NOTIFY
void pcmk__filter_op_for_digest(xmlNode *param_set)
@ pcmk__action_always_in_graph
@ pcmk__action_migratable
char * pcmk__notify_key(const char *rsc_id, const char *notify_type, const char *op_type)
#define pcmk__set_action_flags(action, flags_to_set)
char * pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms)
Generate an operation key (RESOURCE_ACTION_INTERVAL)
const char * pcmk__action_text(enum pcmk__action_type action)
#define pcmk__clear_action_flags(action, flags_to_clear)
enum pcmk__action_type pcmk__parse_action(const char *action_name)
char * pcmk__transition_key(int transition_id, int action_id, int target_rc, const char *node)
#define pcmk__set_raw_action_flags(action_flags, action_name, to_set)
@ pcmk__action_unspecified
#define PCMK__OP_FMT
printf-style format to create operation key from resource, action, interval
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
gboolean is_parent(pcmk_resource_t *child, pcmk_resource_t *rsc)
enum pcmk_ipc_server type
char * pcmk__digest_operation(xmlNode *input)
const char * pcmk__readable_interval(guint interval_ms)
G_GNUC_INTERNAL void pcmk__block_colocation_dependents(pcmk_action_t *action)
G_GNUC_INTERNAL void pcmk__schedule_cancel(pcmk_resource_t *rsc, const char *call_id, const char *task, guint interval_ms, const pcmk_node_t *node, const char *reason)
G_GNUC_INTERNAL void pcmk__new_ordering(pcmk_resource_t *first_rsc, char *first_task, pcmk_action_t *first_action, pcmk_resource_t *then_rsc, char *then_task, pcmk_action_t *then_action, uint32_t flags, pcmk_scheduler_t *sched)
#define pcmk__set_updated_flags(au_flags, action, flags_to_set)
G_GNUC_INTERNAL GList * pcmk__rscs_matching_id(const char *id, const pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__order_stops_before_shutdown(pcmk_node_t *node, pcmk_action_t *shutdown_op)
G_GNUC_INTERNAL void pcmk__schedule_cleanup(pcmk_resource_t *rsc, const pcmk_node_t *node, bool optional)
#define pcmk__clear_updated_flags(au_flags, action, flags_to_clear)
G_GNUC_INTERNAL void pcmk__reschedule_recurring(pcmk_resource_t *rsc, const char *task, guint interval_ms, pcmk_node_t *node)
G_GNUC_INTERNAL bool pcmk__rsc_agent_changed(pcmk_resource_t *rsc, pcmk_node_t *node, const xmlNode *rsc_entry, bool active_on_node)
G_GNUC_INTERNAL bool pcmk__node_available(const pcmk_node_t *node, bool consider_score, bool consider_guest)
#define crm_warn(fmt, args...)
#define crm_log_xml_debug(xml, text)
#define CRM_LOG_ASSERT(expr)
#define CRM_CHECK(expr, failure_action)
#define crm_debug(fmt, args...)
#define crm_err(fmt, args...)
#define crm_trace(fmt, args...)
void lrmd__set_result(lrmd_event_data_t *event, enum ocf_exitcode rc, int op_status, const char *exit_reason)
pcmk_scheduler_t * scheduler
const char * crm_meta_value(GHashTable *hash, const char *field)
Get the value of a meta-attribute.
void hash2field(gpointer key, gpointer value, gpointer user_data)
Set XML attribute based on hash table entry.
#define pcmk__insert_meta(obj, name, value)
#define PCMK_META_INTERVAL
#define PCMK__META_MIGRATE_SOURCE
#define PCMK__META_ON_NODE
#define PCMK__META_MIGRATE_TARGET
#define PCMK__META_OP_NO_WAIT
#define PCMK__META_STONITH_ACTION
pcmk__action_result_t result
void pcmk__log_action(const char *pre_text, const pcmk_action_t *action, bool details)
#define XPATH_NODE_HISTORY
pcmk_action_t * pcmk__new_shutdown_action(pcmk_node_t *node)
xmlNode * pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *op, const char *caller_version, int target_rc, const char *node, const char *origin)
#define action_type_str(flags)
void pcmk__update_action_for_orderings(pcmk_action_t *then, pcmk_scheduler_t *scheduler)
void pcmk__handle_rsc_config_changes(pcmk_scheduler_t *scheduler)
#define action_node_str(a)
#define action_runnable_str(flags)
void pcmk__output_actions(pcmk_scheduler_t *scheduler)
#define clear_action_flag_because(action, flag, reason)
bool pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, const xmlNode *xml_op)
uint32_t pcmk__update_ordered_actions(pcmk_action_t *first, pcmk_action_t *then, const pcmk_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pcmk_scheduler_t *scheduler)
bool pcmk__action_locks_rsc_to_node(const pcmk_action_t *action)
#define action_optional_str(flags)
void pcmk__deduplicate_action_inputs(pcmk_action_t *action)
pcmk_action_t * pe__clear_failcount(pcmk_resource_t *rsc, const pcmk_node_t *node, const char *reason, pcmk_scheduler_t *scheduler)
Schedule a controller operation to clear a fail count.
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
pcmk__op_digest_t * rsc_action_digest_cmp(pcmk_resource_t *rsc, const xmlNode *xml_op, pcmk_node_t *node, pcmk_scheduler_t *scheduler)
gboolean order_actions(pcmk_action_t *first, pcmk_action_t *then, uint32_t flags)
bool pe__rsc_running_on_only(const pcmk_resource_t *rsc, const pcmk_node_t *node)
int pe_get_failcount(const pcmk_node_t *node, pcmk_resource_t *rsc, time_t *last_failure, uint32_t flags, const xmlNode *xml_op)
pcmk_action_t * find_first_action(const GList *input, const char *uuid, const char *task, const pcmk_node_t *on_node)
void pe_action_set_reason(pcmk_action_t *action, const char *reason, bool overwrite)
bool pe__bundle_needs_remote_name(pcmk_resource_t *rsc)
gint sort_op_by_callid(gconstpointer a, gconstpointer b)
pcmk_action_t * custom_action(pcmk_resource_t *rsc, char *key, const char *task, const pcmk_node_t *on_node, gboolean optional, pcmk_scheduler_t *scheduler)
Create or update an action object.
void trigger_unfencing(pcmk_resource_t *rsc, pcmk_node_t *node, const char *reason, pcmk_action_t *dependency, pcmk_scheduler_t *scheduler)
xmlNode * pcmk__find_action_config(const pcmk_resource_t *rsc, const char *action_name, guint interval_ms, bool include_disabled)
@ pcmk__rsc_start_pending
#define pcmk__set_rsc_flags(resource, flags_to_set)
@ pcmk__rsc_variant_group
Group resource.
@ pcmk__rsc_variant_primitive
Primitive resource.
@ pcmk__rsc_node_assigned
#define pcmk__clear_rsc_flags(resource, flags_to_clear)
@ PCMK_EXEC_DONE
Action completed, result is known.
@ PCMK_EXEC_PENDING
Action is in progress.
#define pcmk__assert(expr)
@ pcmk_role_started
Started.
@ pcmk_role_promoted
Promoted.
@ pcmk_role_stopped
Stopped.
#define pcmk__rsc_trace(rsc, fmt, args...)
#define pcmk__rsc_debug(rsc, fmt, args...)
@ pcmk__sched_cancel_removed_actions
void pcmk__add_param_check(const xmlNode *rsc_op, pcmk_resource_t *rsc, pcmk_node_t *node, enum pcmk__check_parameters)
void calculate_active_ops(const GList *sorted_op_list, int *start_index, int *stop_index)
pcmk_node_t * pe_find_node_id(const GList *node_list, const char *id)
Find a node by ID in a list of nodes.
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
bool pcmk__strcase_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
bool pcmk__str_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
#define pcmk__str_copy(str)
int required_runnable_before
uint32_t(* update_ordered_actions)(pcmk_action_t *first, pcmk_action_t *then, const pcmk_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pcmk_scheduler_t *scheduler)
void(* output_actions)(pcmk_resource_t *rsc)
pcmk_scheduler_t * scheduler
char * digest_secure_calc
enum pcmk__digest_result rc
This structure contains everything that makes up a single output formatter.
int(* message)(pcmk__output_t *out, const char *message_id,...)
int(* info)(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
pcmk_scheduler_t * scheduler
enum pcmk__rsc_variant variant
enum rsc_role_e orig_role
pcmk_resource_t * launcher
const pcmk__assignment_methods_t * cmds
const pcmk__rsc_methods_t * fns
pcmk__resource_private_t * priv
enum rsc_role_e(* state)(const pcmk_resource_t *rsc, bool current)
pcmk_node_t *(* location)(const pcmk_resource_t *rsc, GList **list, uint32_t target)
pcmk__scheduler_private_t * priv
pcmk__node_private_t * priv
struct pcmk__node_details * details
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
const char * crm_xml_add_int(xmlNode *node, const char *name, int value)
Create an XML attribute with specified name and integer value.
int crm_element_value_ms(const xmlNode *data, const char *name, guint *dest)
Retrieve the millisecond value of an XML attribute.
const char * crm_xml_add_ll(xmlNode *node, const char *name, long long value)
Create an XML attribute with specified name and long long int value.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
const char * crm_xml_add_ms(xmlNode *node, const char *name, guint ms)
Create an XML attribute with specified name and unsigned value.
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xml_free(xmlNode *xml)
#define PCMK_XA_QUEUE_TIME
#define PCMK_XA_OPERATION
#define PCMK_XA_LAST_RC_CHANGE
#define PCMK_XA_EXEC_TIME
#define PCMK_XA_CRM_FEATURE_SET
#define PCMK_XE_PARAMETERS
#define PCMK_XA_EXIT_REASON
#define PCMK_XA_CRM_DEBUG_ORIGIN
#define PCMK__XE_LRM_RSC_OP
#define PCMK__XE_LRM_RESOURCE
#define PCMK__XA_OP_DIGEST
#define PCMK__XA_TRANSITION_MAGIC
#define PCMK__XA_OP_RESTART_DIGEST
#define PCMK__XA_OPERATION_KEY
#define PCMK__XA_OP_STATUS
#define PCMK__XA_OP_SECURE_DIGEST
#define PCMK__XA_TRANSITION_KEY
xmlNode * pcmk__xpath_find_one(xmlDoc *doc, const char *path, uint8_t level)