diff --git a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world.go b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world.go index ccbf75e..7519cb7 100644 --- a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world.go +++ b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world.go @@ -56,7 +56,7 @@ type parsed struct { } func newWorld() *world { - return &world{values: map[string]map[string][]byte{}, manifests: map[string]parsed{}, healthy: map[string][]string{}} + return &world{values: map[string]map[string][]byte{}, manifests: map[string]parsed{}, healthy: map[string][]string{}, changes: map[string]uint64{}} } // put takes a change of a watched bucket in: a value, or nil for a key deleted or purged. diff --git a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world_test.go b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world_test.go index 5211c7a..ecea239 100644 --- a/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world_test.go +++ b/modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world_test.go @@ -111,3 +111,17 @@ func TestAManifestFallingBackToAPredefinedKeyIsReadable(t *testing.T) { t.Errorf("xterm: waits %q, unreadable %q, want read", waits, ch.Unreadable["xterm"]) } } + +// Review round 1 (items 3 and 4): the world counts the values a key takes, so a have written again after an answer is seen. +func TestTheWorldCountsTheValuesAKeyTakes(t *testing.T) { + w := newWorld() + w.put(delivery.HaveBucket, "ace.web", []byte(`{"v":1}`)) + w.put(delivery.HaveBucket, "ace.web", []byte(`{"v":1}`)) + w.put(delivery.HaveBucket, "ace.mail", []byte(`{"v":1}`)) + if got := w.changed(delivery.HaveBucket, "ace.web"); got != 2 { + t.Errorf("changed = %d, want 2", got) + } + if got := w.changed(delivery.HaveBucket, "gone"); got != 0 { + t.Errorf("changed = %d for a key never seen", got) + } +}