test(broker): wait for the in-flight projection before asserting it
The reorder test read the snapshot as soon as it received both probe calls and asserted the hosts were Checking. Dispatch starts each probe while it holds the registry lock and publishes the in-flight projection at the end of that same critical section, so a received call is not yet a visible Checking state and the test asserted on the pre-dispatch publication. Under load it failed about two runs in three; the failure printed LastAttempt zero and availability unknown, which is exactly that earlier publication. Wait for the published Checking state per endpoint, and keep the diagnostic message so a future failure shows the projection it saw. Verified with 150 loaded repetitions (six concurrent benches of 25 runs) green, against four of six failing before.
- commit
- 2dfda5e0f4686cfa576078b2647581986b67928d
- author
- brice · · 2026-09-19 10:59 UTC
- parent
- 7655e2e
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +8 -1
M internal/usecase/broker/registry_test.go +8 -1
| @@ -864,9 +864,16 @@ func TestRegistryUnchangedSetHostsIsNoOpAndReorderRepublishes(t *testing.T) { | |||
| 864 | 864 | calls[call.registration.Endpoint] = call | |
| 865 | 865 | } | |
| 866 | 866 | require.Len(t, calls, 2) | |
| 867 | + | // Dispatch starts each probe while it holds the registry lock and publishes | |
| 868 | + | // the in-flight projection at the end of the same critical section, so a | |
| 869 | + | // received call is not yet a visible Checking state. Wait for the | |
| 870 | + | // publication instead of assuming it has landed. | |
| 871 | + | for endpoint := range calls { | |
| 872 | + | waitHost(t, registry, endpoint, func(host ports.BrokerDaemonObservation) bool { return host.Checking }) | |
| 873 | + | } | |
| 867 | 874 | before := registry.Snapshot() | |
| 868 | 875 | for _, host := range before.Daemons { | |
| 869 | - | require.True(t, host.Checking) | |
| 876 | + | require.Truef(t, host.Checking, "host %q is not checking: %+v", host.Endpoint, before.Daemons) | |
| 870 | 877 | } | |
| 871 | 878 | ||
| 872 | 879 | // Identical membership in the same order never republishes and never | |
| @@ -864,9 +864,16 @@ func TestRegistryUnchangedSetHostsIsNoOpAndReorderRepublishes(t *testing.T) { | |||||
| 864 | calls[call.registration.Endpoint] = call | 864 | calls[call.registration.Endpoint] = call | ||
| 865 | } | 865 | } | ||
| 866 | require.Len(t, calls, 2) | 866 | require.Len(t, calls, 2) | ||
| 867 | + | // Dispatch starts each probe while it holds the registry lock and publishes | |||
| 868 | + | // the in-flight projection at the end of the same critical section, so a | |||
| 869 | + | // received call is not yet a visible Checking state. Wait for the | |||
| 870 | + | // publication instead of assuming it has landed. | |||
| 871 | + | for endpoint := range calls { | |||
| 872 | + | waitHost(t, registry, endpoint, func(host ports.BrokerDaemonObservation) bool { return host.Checking }) | |||
| 873 | + | } | |||
| 867 | before := registry.Snapshot() | 874 | before := registry.Snapshot() | ||
| 868 | for _, host := range before.Daemons { | 875 | for _, host := range before.Daemons { | ||
| 869 | - | require.True(t, host.Checking) | 876 | + | require.Truef(t, host.Checking, "host %q is not checking: %+v", host.Endpoint, before.Daemons) |
| 870 | } | 877 | } | ||
| 871 | 878 | ||||
| 872 | // Identical membership in the same order never republishes and never | 879 | // Identical membership in the same order never republishes and never | ||