Check a provider's waits before saying who waits on it (issue 450)
A provider whose wait fails the check raises unhealthy, but the holding read its stored statement with the wait unchecked: sayWaiters built the needs-operator key, found it not open and listed no held consumer. The holding now reads each statement as judged (ADR 0283 decision 3), in sayWaiters and in the provider's state its consumers are held by.
This commit is contained in:
@@ -37,6 +37,32 @@ type holding struct {
|
||||
shelf map[string]catalogue.Manifest
|
||||
// providers memoises providerFor by machine, consumer and provision.
|
||||
providers map[string]providerLookup
|
||||
// waits is what the waits of a statement are checked against, read as they are asked for (novox/hq issue 450).
|
||||
waits operatorWaitFacts
|
||||
}
|
||||
|
||||
// checked is a machine's newest statement as the controller judges it: each wait checked (ADR 0283 decision 3), so
|
||||
// a wait that does not check out reads as unhealthy, as it did when the statement was judged (novox/hq issue 450).
|
||||
// What is stored is what the machine said, the waits unchecked; read as stored, a provider whose wait failed its
|
||||
// check seems to wait for the operator while its unhealthy condition is open.
|
||||
func (h *holding) checked(machine string) []inventory.ResourceHealth {
|
||||
rs := h.healths[machine].Resources
|
||||
mods := waitingModules(rs)
|
||||
if len(mods) == 0 {
|
||||
return rs
|
||||
}
|
||||
if h.waits.manifests == nil {
|
||||
h.waits.manifests = map[string]catalogue.Manifest{}
|
||||
}
|
||||
for _, module := range mods {
|
||||
if _, has := h.waits.manifests[module]; !has {
|
||||
if m, ok := h.manifestOf(module); ok {
|
||||
h.waits.manifests[module] = m
|
||||
}
|
||||
}
|
||||
}
|
||||
readWaitFacts(h.ctx, h.inv, machine, mods, nil, &h.waits)
|
||||
return checkWaiting(machine, rs, h.waits)
|
||||
}
|
||||
|
||||
type providerLookup struct {
|
||||
@@ -125,7 +151,7 @@ func (h *holding) providerState(p catalogue.Chosen) (unhealthy, waiting bool, wa
|
||||
return true, false, nil
|
||||
}
|
||||
}
|
||||
for _, r := range h.healths[p.Node].Resources {
|
||||
for _, r := range h.checked(p.Node) {
|
||||
if r.Module != p.Module {
|
||||
continue
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user