Print this page
7711 SMF: Finish implementing support for degraded state
*** 20,29 ****
--- 20,30 ----
*/
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
+ * Copyright 2017 RackTop Systems.
*/
/*
* restarter.c - service manipulation
*
*** 1745,1759 ****
scf_snapshot_destroy(snap);
scf_instance_destroy(inst);
}
const char *event_names[] = { "INVALID", "ADD_INSTANCE", "REMOVE_INSTANCE",
! "ENABLE", "DISABLE", "ADMIN_DEGRADED", "ADMIN_REFRESH",
! "ADMIN_RESTART", "ADMIN_MAINT_OFF", "ADMIN_MAINT_ON",
! "ADMIN_MAINT_ON_IMMEDIATE", "STOP", "START", "DEPENDENCY_CYCLE",
! "INVALID_DEPENDENCY", "ADMIN_DISABLE", "STOP_RESET"
};
/*
* void *restarter_process_events()
*
--- 1746,1812 ----
scf_snapshot_destroy(snap);
scf_instance_destroy(inst);
}
+ static void
+ degrade_instance(scf_handle_t *h, restarter_inst_t *rip, restarter_str_t reason)
+ {
+ scf_instance_t *scf_inst = NULL;
+
+ assert(MUTEX_HELD(&rip->ri_lock));
+
+ log_instance(rip, B_TRUE, "Marking degraded due to %s.",
+ restarter_get_str_short(reason));
+ log_framework(LOG_DEBUG, "%s: marking degraded due to %s.\n",
+ rip->ri_i.i_fmri, restarter_get_str_short(reason));
+
+ /* Services that aren't online are ignored */
+ if (rip->ri_i.i_state != RESTARTER_STATE_ONLINE) {
+ log_framework(LOG_DEBUG,
+ "%s: degrade_instance -> is not online\n",
+ rip->ri_i.i_fmri);
+ return;
+ }
+
+ /*
+ * If reason state is restarter_str_service_request and
+ * restarter_actions/auxiliary_fmri property is set with a valid fmri,
+ * copy the fmri to restarter/auxiliary_fmri so svcs -x can use.
+ */
+ if (reason == restarter_str_service_request &&
+ libscf_fmri_get_instance(h, rip->ri_i.i_fmri, &scf_inst) == 0) {
+ if (restarter_inst_validate_ractions_aux_fmri(scf_inst) == 0) {
+ if (restarter_inst_set_aux_fmri(scf_inst))
+ log_framework(LOG_DEBUG, "%s: "
+ "restarter_inst_set_aux_fmri failed: ",
+ rip->ri_i.i_fmri);
+ } else {
+ log_framework(LOG_DEBUG, "%s: "
+ "restarter_inst_validate_ractions_aux_fmri "
+ "failed: ", rip->ri_i.i_fmri);
+
+ if (restarter_inst_reset_aux_fmri(scf_inst))
+ log_framework(LOG_DEBUG, "%s: "
+ "restarter_inst_reset_aux_fmri failed: ",
+ rip->ri_i.i_fmri);
+ }
+ scf_instance_destroy(scf_inst);
+ }
+
+ (void) restarter_instance_update_states(h, rip,
+ RESTARTER_STATE_DEGRADED, RESTARTER_STATE_NONE, RERR_NONE, reason);
+
+ log_transition(rip, DEGRADE_REQUESTED);
+ }
+
const char *event_names[] = { "INVALID", "ADD_INSTANCE", "REMOVE_INSTANCE",
! "ENABLE", "DISABLE", "ADMIN_RESTORE", "ADMIN_DEGRADED",
! "ADMIN_DEGRADE_IMMEDIATE", "ADMIN_REFRESH", "ADMIN_RESTART",
! "ADMIN_MAINT_OFF", "ADMIN_MAINT_ON", "ADMIN_MAINT_ON_IMMEDIATE",
! "STOP", "START", "DEPENDENCY_CYCLE", "INVALID_DEPENDENCY",
! "ADMIN_DISABLE", "STOP_RESET"
};
/*
* void *restarter_process_events()
*
*** 1864,1878 ****
case RESTARTER_EVENT_TYPE_ADMIN_REFRESH:
refresh_instance(h, inst);
break;
case RESTARTER_EVENT_TYPE_ADMIN_DEGRADED:
! log_framework(LOG_WARNING, "Restarter: "
! "%s command (for %s) unimplemented.\n",
! event_names[event->riq_type], inst->ri_i.i_fmri);
break;
case RESTARTER_EVENT_TYPE_ADMIN_RESTART:
if (!instance_started(inst)) {
log_framework(LOG_DEBUG, "Restarter: "
"Not restarting %s; not running.\n",
inst->ri_i.i_fmri);
--- 1917,1936 ----
case RESTARTER_EVENT_TYPE_ADMIN_REFRESH:
refresh_instance(h, inst);
break;
case RESTARTER_EVENT_TYPE_ADMIN_DEGRADED:
! case RESTARTER_EVENT_TYPE_ADMIN_DEGRADE_IMMEDIATE:
! if (event_from_tty(h, inst) == 0)
! degrade_instance(h, inst,
! restarter_str_service_request);
! else
! degrade_instance(h, inst,
! restarter_str_administrative_request);
break;
+ case RESTARTER_EVENT_TYPE_ADMIN_RESTORE:
case RESTARTER_EVENT_TYPE_ADMIN_RESTART:
if (!instance_started(inst)) {
log_framework(LOG_DEBUG, "Restarter: "
"Not restarting %s; not running.\n",
inst->ri_i.i_fmri);
*** 1945,1954 ****
--- 2003,2014 ----
case RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON:
case RESTARTER_EVENT_TYPE_ADMIN_MAINT_ON_IMMEDIATE:
case RESTARTER_EVENT_TYPE_ADMIN_MAINT_OFF:
case RESTARTER_EVENT_TYPE_ADMIN_REFRESH:
case RESTARTER_EVENT_TYPE_ADMIN_DEGRADED:
+ case RESTARTER_EVENT_TYPE_ADMIN_DEGRADE_IMMEDIATE:
+ case RESTARTER_EVENT_TYPE_ADMIN_RESTORE:
case RESTARTER_EVENT_TYPE_ADMIN_RESTART:
return (1);
default:
return (0);
}