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); }