The assigner waits for a provision whose provider is not known yet: an unknown provider has provided nothing, so a consumer never moves ahead of a provider the indexer has not taken in (ADR 0603 §5); the integration test's write order is unordered again

This commit is contained in:
2026-11-03 19:36:18 +01:00
parent 34ef185ba5
commit 1c66d58bce
2 changed files with 20 additions and 7 deletions
@@ -448,12 +448,9 @@ func TestWantsAreWrittenAndNoDifferenceIs(t *testing.T) {
toolDigest := b.manifest(t, "tool", `{"module":"tool","version":"1"}`)
fpOf := func(c byte) string { return delivery.SourcePrefix2 + strings.Repeat(string(c), 64) }
toolOld := fpOf('1')
// In this order: the provider's module is in the indexer's state before the consumer's, so the consumer's requirement
// has a provider to be judged against whenever the assigner looks at it (a map's order made it flaky, 5 of 40 runs).
for _, row := range []struct {
module, fp, digest string
}{{"db", fpOf('2'), dbDigest}, {"app", fpOf('3'), appDigest}, {"tool", fpOf('4'), toolDigest}} {
module := row.module
for module, row := range map[string]struct {
fp, digest string
}{"db": {fpOf('2'), dbDigest}, "app": {fpOf('3'), appDigest}, "tool": {fpOf('4'), toolDigest}} {
mod, _ := delivery.EncodeModule(delivery.Module{FP2: row.fp, Manifest: row.digest, Repository: "novox/" + module, Commit: strings.Repeat("2", 40), Path: delivery.RootPath})
b.putJSON(t, delivery.ModulesBucket, module, mod)
fps := []string{row.fp}
@@ -154,10 +154,26 @@ func (m Module) provisionWaiting(node string) (string, bool) {
}
keyed := m.Provisions(node)
// Only a provision the newest manifest still requires is waited on (ADR 0603 §9): a key of an older revision's edge,
// asked or retiring for the operator's answer (ADR 0570 §5), holds nothing.
// asked or retiring for the operator's answer (ADR 0570 §5), holds nothing. A requirement catalogue.Awaited drops for a
// reason the decision keeps (optional, not keyed: a toolchain on the module's own machine, a login the controller makes) is
// not waited on; one it drops only because no answering provider is known yet is (ADR 0603 §5: an unknown provider has
// provided nothing), so a consumer never moves ahead of a provider whose module the indexer has not yet taken in.
needed := m.Manifest.Requires
if m.Answering != nil {
needed = catalogue.Awaited(m.Manifest, m.Answering)
have := map[string]bool{}
for _, p := range keyed {
have[p.Provision] = true
}
for _, r := range slices.Sorted(slices.Values(m.Manifest.Requires)) {
if m.Manifest.OptionalRequires[r] || len(m.Answering(r)) > 0 || slices.Contains(needed, r) {
continue
}
needed = append(needed, r)
if !have[r] {
return fmt.Sprintf("no provider of %s is known yet for %s on %s: an unknown provider has provided nothing", r, m.Name, node), true
}
}
}
for _, key := range slices.Sorted(maps.Keys(keyed)) {
if p := keyed[key]; p.State != provisions.Provided && slices.Contains(needed, p.Provision) {