Skip to content

UNATTRIBUTED: ReadPathStreamMintingTest.AnUncachedConfiguredReduce_MintsOneSyncHubPerCall counted +6 sync hubs for 5 calls on a diff that cannot reach MeshWeaver.Data (#4292 run 34823051999) #4300

Closed

Description

@rbuergi

ReadPathStreamMintingTest.AnUncachedConfiguredReduce_MintsOneSyncHubPerCall — UNATTRIBUTED failure: +6 sync hubs for 5 calls, on a diff that cannot reach MeshWeaver.Data

This is filed as an unattributed failure, not a flake (working agreement, 2026-09-14: a test failing on a diff that cannot reach it proves only that the diff did not cause it — not that the defect is nondeterministic).

Occurrence

Run MeshWeaver Build and Test 34823051999, shard 1, head 75ae08358bcbc377107b042c5408a1ef1df8ec11 (#4292)
Result 1 454 tests, 1 453 ✅, 1 ❌ — this test; the earlier head of the same PR (115e0a9d) ran the identical suite green (1 454 ✅) 30 min earlier
Message DIAG uncached: calls=5 ownerSyncHubs=+6 → Expected value to be 5 … but found 6
The diff #4292 touches MeshWeaver.PluginCatalog, string literals in MeshWeaver.GitSync, two doc pages and a test in Memex.Portal.Shared.Test. MeshWeaver.Data.Test's closure is MeshWeaver.Data, MeshWeaver.Fixture (Mesh.Contract, Messaging.Hub), Data.TestDomain — none of it references PluginCatalog or GitSync. The diff cannot reach the code under test.

No earlier occurrence is findable by search (in:comments,title,body for the test name returns only #3952, the PR that introduced the test). This is the first recorded one.

What the number says

The test takes LiveSyncHubs(host) (the count of sync/ hubs in the host's HostedHubsCollection), makes 5 uncached GetStream(reference, x => x.WithClientId(…)) calls, and reads the count again. HostedHubsCollection.GetHub(…, Always) constructs synchronously, so each of the 5 calls contributes exactly one hub at return. A +6 therefore means one sync/ hub was created on the host by something other than those five calls, inside the window between the two counts — a window of a few milliseconds in the failing run (baseline at 08:36:46.919, count at 08:36:46.932).

The test's own guard against a foreign hub is LongHeartbeat = 5 min ("so every hub counted is one this test caused"), which covers heartbeat resubscribes and nothing else.

The shape to look for — a deterministic one, not a re-run loop

Candidates for the foreign creation, each a real ordering rather than noise:

  1. The precondition's stream registering after its first frame. await workspace.GetObservable<BusinessUnit>() … Match(x => x.Count > 0) completes when a frame arrives; if any part of that read's sync-hub creation lands on the host after the frame (a second hub the reduce mints on subscription, a partition/data-source stream created lazily on first reduce), the baseline is taken one low.
  2. The client hub connecting. HubTestBase builds a client as well; a client-side subscription that mints a sync/ hub on the HOST (its initial data mirror) is not caused by this test and lands whenever the client's startup gets there — on a loaded CI runner, plausibly inside this window.
  3. The class's previous test's stream still settling (tests in a class run sequentially, but a stream from ReadingTheSameReferenceRepeatedly_… or UnifiedUpdate_… may complete a late subscription on the shared fixture).

Each of these reproduces at 100% by inserting the ordering deliberately (e.g. delaying the client's first subscription until after the baseline, or taking the baseline before the precondition's frame). That is the falsification to run before this is touched; a re-run that goes green says nothing about which of the three it was.

Handling on #4292

Re-run of the failed jobs requested once, to unblock, with this issue as the record. Not added to known-flakes.json. A recurrence on any PR is a signal — append it here, do not re-run past it.

Activity

  1. rbuergi commented on Sep 14, 2026

    @rbuergi
    ContributorAuthor

    Classification agreed — unattributed, not a flake, and correctly kept out of known-flakes.json.

    One addition so this does not get actioned on a single data point: +6 hubs for 5 calls is an exact number, not a timing symptom. The test asserts one sync hub per call and got one extra. That is far more likely a specific interleaving — a hub minted by something the test did not count (a warm-up read, a change-feed subscriber, a rebind) than a race in the minting itself. When it recurs, the useful measurement is which hub was the sixth: its address, and what subscribed it. #3952/#3976 (the #3432 read-sharing work, both closed) are the code this test pins, so the first question is whether either of today's merges touched their neighbourhood — #4295 (child index) and #4293 (adopted-source judgement) are the candidates by proximity to the read path, and both merged in the window this ran in.

    Until it recurs: #4292 re-runs whole-workflow (its diff is GitSync/PluginCatalog/docs — it cannot reach MeshWeaver.Data.Test), and this stays open with one occurrence.


    🤖 Generated with Claude Code

  2. added a commit that references this issue on Sep 14, 2026
  3. added a commit that references this issue on Sep 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions