Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nrwahl2 clbz5501 alt #2905

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions include/pcmki/pcmki_status.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,11 @@ int pcmk__output_cluster_status(pcmk__output_t *out, stonith_t *st, cib_t *cib,
char *only_rsc, const char *neg_location_prefix,
bool simple_output);

int pcmk__status(pcmk__output_t *out, cib_t *cib, enum pcmk__fence_history fence_history,
uint32_t show, uint32_t show_opts, char *only_node, char *only_rsc,
const char *neg_location_prefix, bool simple_output);
int pcmk__status(pcmk__output_t *out, cib_t *cib,
enum pcmk__fence_history fence_history, uint32_t show,
uint32_t show_opts, char *only_node, char *only_rsc,
const char *neg_location_prefix, bool simple_output,
enum pcmk_pacemakerd_state *pcmkd_state);

#ifdef __cplusplus
}
Expand Down
60 changes: 36 additions & 24 deletions lib/pacemaker/pcmk_status.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,14 @@ pacemakerd_event_cb(pcmk_ipc_api_t *pacemakerd_api,
enum pcmk_pacemakerd_state *state =
(enum pcmk_pacemakerd_state *) user_data;

/* we are just interested in the latest reply */
*state = pcmk_pacemakerd_state_invalid;

if (event_type != pcmk_ipc_event_reply || status != CRM_EX_OK) {
if ((state == NULL) || (event_type != pcmk_ipc_event_reply)
|| (status != CRM_EX_OK)) {
return;
}

// We're only interested in the latest reply
*state = pcmk_pacemakerd_state_invalid;

if (reply->reply_type == pcmk_pacemakerd_reply_ping &&
reply->data.ping.last_good != (time_t) 0 &&
reply->data.ping.status == pcmk_rc_ok) {
Expand All @@ -94,11 +95,10 @@ pacemakerd_event_cb(pcmk_ipc_api_t *pacemakerd_api,
}

static int
pacemakerd_status(pcmk__output_t *out)
pacemakerd_status(pcmk__output_t *out, enum pcmk_pacemakerd_state *state)
{
int rc = pcmk_rc_ok;
pcmk_ipc_api_t *pacemakerd_api = NULL;
enum pcmk_pacemakerd_state state = pcmk_pacemakerd_state_invalid;

rc = pcmk_new_ipc_api(&pacemakerd_api, pcmk_ipc_pacemakerd);
if (pacemakerd_api == NULL) {
Expand All @@ -107,7 +107,8 @@ pacemakerd_status(pcmk__output_t *out)
return rc;
}

pcmk_register_ipc_callback(pacemakerd_api, pacemakerd_event_cb, (void *) &state);
pcmk_register_ipc_callback(pacemakerd_api, pacemakerd_event_cb,
(void *) state);

rc = pcmk_connect_ipc(pacemakerd_api, pcmk_ipc_dispatch_sync);
if (rc == EREMOTEIO) {
Expand All @@ -121,16 +122,6 @@ pacemakerd_status(pcmk__output_t *out)

rc = pcmk_pacemakerd_api_ping(pacemakerd_api, crm_system_name);

if (rc != pcmk_rc_ok) {
/* Got some error from pcmk_pacemakerd_api_ping, so return it. */
} else if (state == pcmk_pacemakerd_state_running) {
rc = pcmk_rc_ok;
} else if (state == pcmk_pacemakerd_state_shutting_down) {
rc = ENOTCONN;
} else {
rc = EAGAIN;
}

pcmk_free_ipc_api(pacemakerd_api);
return rc;
}
Expand Down Expand Up @@ -229,7 +220,8 @@ pcmk_status(xmlNodePtr *xml)
stonith__register_messages(out);

rc = pcmk__status(out, cib, pcmk__fence_history_full, pcmk_section_all,
show_opts, NULL, NULL, NULL, false);
show_opts, NULL, NULL, NULL, false, NULL);

pcmk__xml_output_finish(out, xml);

cib_delete(cib);
Expand All @@ -239,11 +231,17 @@ pcmk_status(xmlNodePtr *xml)
int
pcmk__status(pcmk__output_t *out, cib_t *cib, enum pcmk__fence_history fence_history,
uint32_t show, uint32_t show_opts, char *only_node, char *only_rsc,
const char *neg_location_prefix, bool simple_output)
const char *neg_location_prefix, bool simple_output,
enum pcmk_pacemakerd_state *pcmkd_state)
{
xmlNode *current_cib = NULL;
int rc = pcmk_rc_ok;
stonith_t *st = NULL;
enum pcmk_pacemakerd_state state = pcmk_pacemakerd_state_invalid;

if (pcmkd_state != NULL) {
*pcmkd_state = state;
}

if (cib == NULL) {
return ENOTCONN;
Expand All @@ -252,8 +250,26 @@ pcmk__status(pcmk__output_t *out, cib_t *cib, enum pcmk__fence_history fence_his
if (cib->variant == cib_native) {
if (cib->state == cib_connected_query || cib->state == cib_connected_command) {
rc = pcmk_rc_ok;

} else {
rc = pacemakerd_status(out);
rc = pacemakerd_status(out, &state);
if (pcmkd_state != NULL) {
*pcmkd_state = state;
}
switch (state) {
case pcmk_pacemakerd_state_init:
case pcmk_pacemakerd_state_starting_daemons:
case pcmk_pacemakerd_state_wait_for_ping:
rc = EAGAIN;
goto done;
case pcmk_pacemakerd_state_running:
case pcmk_pacemakerd_state_shutting_down:
// CIB may still be accessible while shutting down
break;
default:
rc = ENOTCONN;
goto done;
}
}
}

Expand All @@ -263,10 +279,6 @@ pcmk__status(pcmk__output_t *out, cib_t *cib, enum pcmk__fence_history fence_his

if (fence_history != pcmk__fence_history_none && cib->variant == cib_native) {
st = fencing_connect();

if (st == NULL) {
return ENOTCONN;
}
}

rc = cib_connect(out, cib, &current_cib);
Expand Down
42 changes: 41 additions & 1 deletion tools/crm_mon.c
Original file line number Diff line number Diff line change
Expand Up @@ -1330,10 +1330,50 @@ clean_up_on_connection_failure(int rc)
static void
one_shot(void)
{
enum pcmk_pacemakerd_state state = pcmk_pacemakerd_state_invalid;
int rc = pcmk__status(out, cib, fence_history, show, show_opts,
options.only_node, options.only_rsc,
options.neg_location_prefix,
output_format == mon_output_monitor);
(output_format == mon_output_monitor), &state);

if (rc != pcmk_rc_ok) {
const char *msg = NULL;

/* Unless pacemakerd is shut down, return success. Some resource agents
* may depend on a successful crm_mon --one-shot exit code.
*/
switch (state) {
case pcmk_pacemakerd_state_init:
msg = "pacemakerd initializing";
rc = pcmk_rc_ok;
break;
case pcmk_pacemakerd_state_starting_daemons:
msg = "Pacemaker daemons starting";
rc = pcmk_rc_ok;
break;
case pcmk_pacemakerd_state_wait_for_ping:
msg = "Waiting for startup-trigger from SBD";
rc = pcmk_rc_ok;
break;
case pcmk_pacemakerd_state_running:
msg = "Error connecting to CIB or displaying status";
rc = pcmk_rc_ok;
break;
case pcmk_pacemakerd_state_shutting_down:
msg = "Pacemaker daemons shutting down";
rc = pcmk_rc_ok;
break;
case pcmk_pacemakerd_state_shutdown_complete:
msg = "Pacemaker daemons shut down - reporting to SBD";
break;
default: // pcmk_pacemakerd_state_invalid
break;
}

if (msg != NULL) {
out->err(out, "Cluster status is not available: %s", msg);
}
}

if (rc == pcmk_rc_ok) {
clean_up(pcmk_rc2exitc(rc));
Expand Down