Release v16.0.3
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
IEventStoreresolution: 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 asCannot access a disposed object: GrpcChannelunder concurrent load. - Fixed an activation access violation in the projection replay job step (
HandleEventsForObserver): it read the ambientGrain.GrainFactoryproperty 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