Skip to content

Release v16.0.3

Choose a tag to compare

@github-actions github-actions released this 13 Jul 10:38
91219e6

Summary

Two related concurrency bugs in the client/kernel that surface together as intermittent failures under load — a stalled Chronicle client and stuck replay observers.

Fixed

  • Fixed lock contention in the client's scoped IEventStore resolution: a single process-wide lock serialized every resolution across all namespaces and requests, and held that lock across a blocking call, which could stall unrelated requests and surface as Cannot access a disposed object: GrpcChannel under concurrent load.
  • Fixed an activation access violation in the projection replay job step (HandleEventsForObserver): it read the ambient Grain.GrainFactory property from code that runs off the grain's activation thread, throwing "Activation access violation" and leaving the observer stuck without processing new events even though they were present in the log.

Test plan

  • dotnet build (Debug + Release) for the affected client and kernel projects — zero warnings, zero errors
  • dotnet test Source/Kernel/Core.Specs — 1612 passed, 1 pre-existing skip, 0 failures
  • Verified against a downstream consumer app under Aspire-orchestrated concurrent startup — repeated onboarding flow runs now produce identical, deterministic pass/fail results instead of the prior non-deterministic 6-10/30 range with silent disposed-channel failures