From 35e330c7f05fcb8b4e22a0d664d72521f76a1ed4 Mon Sep 17 00:00:00 2001 From: jochen Date: Sat, 24 Oct 2026 18:53:32 +0200 Subject: [PATCH] Say what a node's bucket holds when a served composition test waits in vain (issue 1945) --- .../composed_served_integration_test.go | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/cmd/mesh-controller/composed_served_integration_test.go b/cmd/mesh-controller/composed_served_integration_test.go index d36d1cea..0b2a510e 100644 --- a/cmd/mesh-controller/composed_served_integration_test.go +++ b/cmd/mesh-controller/composed_served_integration_test.go @@ -6,6 +6,7 @@ import ( "context" "encoding/json" "errors" + "fmt" "net/url" "os" "path/filepath" @@ -225,10 +226,41 @@ func (m *servedMesh) waitFor(t *testing.T, done chan error, node, key string, af } time.Sleep(200 * time.Millisecond) } - t.Fatalf("%s in %s was not written within a minute", key, bucket) + t.Fatalf("%s in %s was not written within a minute; %s", key, bucket, m.whatIsThere(t, node)) return 0 } +// whatIsThere says, for a failure, what the node's bucket holds, the ids its own composition carries and the +// fingerprints the controller has registered. +func (m *servedMesh) whatIsThere(t *testing.T, node string) string { + t.Helper() + bucket, _ := sdkdelivery.ComposedBucketFor(node) + out := "keys:" + kv, err := m.controller.KeyValue(context.Background(), bucket) + if err != nil { + return out + " " + err.Error() + } + lister, err := kv.ListKeys(context.Background()) + if err == nil { + for k := range lister.Keys() { + out += " " + k + } + } + own, _ := sdkdelivery.ComposedNodeKey(node) + if e, err := kv.Get(context.Background(), own); err == nil { + if c, err := sdkdelivery.DecodeComposed(e.Value()); err == nil { + out += "; its own carries:" + for _, r := range c.Resources { + var head struct{ ID string } + _ = json.Unmarshal(r, &head) + out += " " + head.ID + } + } + } + fps, err := currentFingerprints(context.Background(), m.open.inventory) + return out + fmt.Sprintf("; fingerprints registered: %v (%v)", fps, err) +} + // revisions are a node's composition keys and their revisions. func (m *servedMesh) revisions(t *testing.T, node string) map[string]uint64 { t.Helper()