Print this page
7369 SMF is fast and loose with exclude dependencies

*** 1427,1445 **** continue; switch (v->gv_state) { case RESTARTER_STATE_ONLINE: case RESTARTER_STATE_DEGRADED: - LOG_EXCLUDE(groupv, v); - return (v->gv_flags & GV_ENABLED ? -1 : 0); - case RESTARTER_STATE_OFFLINE: - case RESTARTER_STATE_UNINIT: LOG_EXCLUDE(groupv, v); ! return (0); case RESTARTER_STATE_DISABLED: case RESTARTER_STATE_MAINT: continue; default: #ifndef NDEBUG --- 1427,1447 ---- continue; switch (v->gv_state) { case RESTARTER_STATE_ONLINE: case RESTARTER_STATE_DEGRADED: case RESTARTER_STATE_OFFLINE: LOG_EXCLUDE(groupv, v); ! return (v->gv_flags & GV_TODISABLE ? 0 : -1); case RESTARTER_STATE_DISABLED: + case RESTARTER_STATE_UNINIT: + if (v->gv_flags & GV_ENABLED) { + LOG_EXCLUDE(groupv, v); + return (-1); + } + /* FALLTHROUGH */ case RESTARTER_STATE_MAINT: continue; default: #ifndef NDEBUG
*** 1449,1459 **** abort(); } /* NOTREACHED */ case GVT_SVC: ! break; case GVT_FILE: if (!file_ready(v)) continue; LOG_EXCLUDE(groupv, v); --- 1451,1461 ---- abort(); } /* NOTREACHED */ case GVT_SVC: ! return (exclude_all_satisfied(v, satbility)); case GVT_FILE: if (!file_ready(v)) continue; LOG_EXCLUDE(groupv, v);
*** 1465,1511 **** uu_warn("%s:%d: Unexpected vertex type %d.\n", __FILE__, __LINE__, v->gv_type); #endif abort(); } - - /* v represents a service */ - if (uu_list_numnodes(v->gv_dependencies) == 0) - continue; - - for (e2 = uu_list_first(v->gv_dependencies); - e2 != NULL; - e2 = uu_list_next(v->gv_dependencies, e2)) { - v2 = e2->ge_vertex; - assert(v2->gv_type == GVT_INST); - - if ((v2->gv_flags & GV_CONFIGURED) == 0) - continue; - - switch (v2->gv_state) { - case RESTARTER_STATE_ONLINE: - case RESTARTER_STATE_DEGRADED: - LOG_EXCLUDE(groupv, v2); - return (v2->gv_flags & GV_ENABLED ? -1 : 0); - - case RESTARTER_STATE_OFFLINE: - case RESTARTER_STATE_UNINIT: - LOG_EXCLUDE(groupv, v2); - return (0); - - case RESTARTER_STATE_DISABLED: - case RESTARTER_STATE_MAINT: - continue; - - default: - #ifndef NDEBUG - uu_warn("%s:%d: Unexpected vertex type %d.\n", - __FILE__, __LINE__, v2->gv_type); - #endif - abort(); - } - } } return (1); } --- 1467,1476 ----
*** 1516,1528 **** --- 1481,1530 ---- * without administrator intervention. */ static int instance_satisfied(graph_vertex_t *v, boolean_t satbility) { + graph_edge_t *e; + boolean_t any_unsatisfied; + boolean_t any_unsatisfiable; + assert(v->gv_type == GVT_INST); assert(!inst_running(v)); + any_unsatisfied = B_FALSE; + any_unsatisfiable = B_FALSE; + + /* + * Walk the dependents of the given vertex looking for any exclude_all + * dependency groups with running instances. If they are all going to + * be disabled consider the dependency unsatisfied, not unsatisfaible. + */ + for (e = uu_list_first(v->gv_dependents); e != NULL; + e = uu_list_next(v->gv_dependents, e)) { + graph_edge_t *e2; + + if (e->ge_vertex->gv_type != GVT_GROUP || + e->ge_vertex->gv_depgroup != DEPGRP_EXCLUDE_ALL) + continue; + + for (e2 = uu_list_first(e->ge_vertex->gv_dependents); + e2 != NULL; + e2 = uu_list_next(e->ge_vertex->gv_dependents, e2)) { + + if (!inst_running(e2->ge_vertex)) + continue; + + if (e2->ge_vertex->gv_flags & GV_TODISABLE) + any_unsatisfied = B_TRUE; + else + any_unsatisfiable = B_TRUE; + } + } + + if (any_unsatisfied || any_unsatisfiable) + return (any_unsatisfiable ? -1 : 0); + return (require_all_satisfied(v, satbility)); } /* * Decide whether v can satisfy a dependency. v can either be a child of
*** 4537,4547 **** */ if ((v->gv_flags & GV_TOOFFLINE) == 0) return; /* If v isn't a leaf because it's already down, recurse. */ ! if (!up_state(v->gv_state)) { graph_walk_dependencies(v, offline_subtree_leaves, arg); return; } /* if v is a leaf, offline it or disable it if it's the last one */ --- 4539,4549 ---- */ if ((v->gv_flags & GV_TOOFFLINE) == 0) return; /* If v isn't a leaf because it's already down, recurse. */ ! if (!inst_running(v) && (v->gv_flags & GV_TODISABLE) == 0) { graph_walk_dependencies(v, offline_subtree_leaves, arg); return; } /* if v is a leaf, offline it or disable it if it's the last one */