RavenDb control transport: TransportCompliance + leadership compliance, make ravendb:// first-class#3294
Merged
Conversation
…venDb control transport Adds two compliance suites exercising the native RavenDB control queue added in #3285, and promotes it to a first-class "ravendb://" transport so it can pass the standard TransportCompliance battery. Framework changes (Wolverine.RavenDb): - Rename the control-transport scheme "ravencontrol" -> "ravendb". - Register the RavenDbControlTransport eagerly in UseRavenDbPersistence so the "ravendb://" scheme resolves for publishing rules configured at bootstrap (previously it registered lazily in RavenDbMessageStore.Initialize, so a config-time PublishAllMessages().To("ravendb://...") threw "Unknown Transport scheme"). The IDocumentStore is resolved lazily in the transport's InitializeAsync. The control endpoint only becomes a live listener when the message store promotes it to the NodeControlEndpoint under Balanced durability, so Solo hosts never poll — no behavior change for Solo. Compliance harness (Wolverine.ComplianceTests): - TransportComplianceFixture gains an overridable Mode (default Solo) so a control-plane transport that only wires its NodeControlEndpoint under Balanced can run the standard suite. Purely additive; every existing fixture stays Solo. Tests: - control_transport_compliance: full TransportCompliance<T> over a Balanced two-node fixture sharing one embedded store — 22/22, no skips. Cluster cadence tightened in-fixture (CheckAssignmentPeriod/ScheduledJobPollingTime) so the leader-assigned scheduled-job agent is assigned promptly (the 30s default made schedule_send flap). - control_queue_leadership_election_compliance: full LeadershipElectionCompliance over ravendb:// instead of UseTcpForControlEndpoint() — 13/13, covering fan-out, send-to-node, and leader failover on the native control queue. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jul 9, 2026
Merged
This was referenced Jul 13, 2026
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.
Builds on the native RavenDB control queue merged in #3285 by (a) adding full compliance coverage and (b) promoting it to a first-class
ravendb://transport.Compliance suites
control_transport_compliance— the standardTransportCompliance<T>battery over a Balanced two-node fixture sharing one embedded RavenDB store. 22/22, no skips (send-by-destination, publishing-rule, request/reply, dead-letter, requeue, scheduled retry, scheduled send, content-type serializer swap, endpoint health, …).control_queue_leadership_election_compliance— the fullLeadershipElectionCompliancebattery overravendb://instead ofUseTcpForControlEndpoint(). 13/13, covering fan-out, send-to-node, and leader failover on the native control queue.Framework changes
Scheme rename
ravencontrol→ravendb.First-class transport registration. The control transport used to register lazily in
RavenDbMessageStore.Initialize, so a config-timePublishAllMessages().To("ravendb://…")threw "Unknown Transport scheme". It's now registered eagerly inUseRavenDbPersistence(scheme resolves at bootstrap); theIDocumentStoreis resolved lazily in the transport'sInitializeAsync. The control endpoint only becomes a live listener when the message store promotes it to theNodeControlEndpointunder Balanced durability — so Solo hosts never poll and behavior is unchanged there.Compliance harness.
TransportComplianceFixturegains an overridableMode(defaultSolo) so a control-plane transport that only wires itsNodeControlEndpointunder Balanced can run the standard suite. Purely additive — every existing fixture staysSolo.Note on
schedule_sendInitially flapped because the leader-assigned scheduled-job agent wasn't assigned within the test window (default
CheckAssignmentPeriodis 30s). Root cause was cadence, not the transport — the fixture tightensCheckAssignmentPeriod/ScheduledJobPollingTime, and it passes reliably.Verification (local, embedded RavenDB, net9.0)
control_transport_compliance: 22/22control_queue_leadership_election_compliance: 13/13control_queue_tests3/3, TCP-based + control-queue leadership subset 6/6, core RavenDb durability/store suites 110/110.🤖 Generated with Claude Code