Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When subscribers contend for the read lock, blocking Dequeue currently yields and progresses to semaphore waits of up to 10 ms. Use bounded SpinWait retries before a 5 ms semaphore wait, resetting the spin budget after waiting. TryDequeue still makes one read-lock attempt, and the existing publisher/subscriber crash recovery remains intact. Also observe cancellation while waiting for a publisher to finish writing a reserved message.
Add eight regression cases covering contended reads, expired read locks, cancellation, and exactly-once delivery with concurrent publishers and subscribers. Add a reproducible concurrent-subscriber benchmark, support benchmark selection from the command line, and update existing benchmark jobs to .NET 10. This branch includes current main and the queue lifetime fix.
Validation:
BenchmarkDotNet comparison against main, with one publisher sending batches of 65,536 eight-byte messages. Values are mean time per message; lower is better.
Linux used three warmup and eight measured iterations; macOS used three of each. These are local measurements, not general latency guarantees; the macOS contended baseline was noisy. Linux shows about 2.7x throughput with four subscribers and essentially unchanged single-subscriber throughput.
Reproduce from the repository root:
dotnet run --project src/Interprocess.Benchmark -c Release -- --filter '*SubscriberBenchmark*' --iterationCount 8