Skip to content

feat(cluster): preserve isolated replication over gRPC - #495

Open
yordis wants to merge 1 commit into
yordis/chore-retire-core-tcp-testsfrom
yordis/feat-grpc-cluster-endpoints
Open

yordis wants to merge 1 commit into
yordis/chore-retire-core-tcp-testsfrom
yordis/feat-grpc-cluster-endpoints

Conversation

@yordis

@yordis yordis commented Sep 12, 2026

Copy link
Copy Markdown
Member
  • Preserves isolated replication topology and failure detection on the supported gRPC transport.

@yordis
yordis requested a review from a team as a code owner September 12, 2026 23:22
@cursor

cursor Bot commented Sep 12, 2026

Copy link
Copy Markdown

PR Summary

High Risk
Changes cluster topology, replication listening, and gossip serialization; misconfiguration or mixed-version behavior could break replication or client routing.

Overview
This PR drops legacy TCP cluster/client endpoints from gossip, MemberInfo, and the admin cluster UI, replacing them with HTTP/gRPC for clients and a dedicated ReplicationEndPoint carried over gRPC gossip (defaulting to HTTP when absent for mixed-version clusters).

Runtime wiring: Kestrel now listens on node and replication addresses separately; the replication listener is HTTP/2-only. ReplicationEndpointPolicy returns 404 unless replication gRPC hits the replication port (and blocks that path on the node port). NodeConnectionTracker wraps connections to record bytes, TLS, and HTTP vs gRPC metadata for observability. Replica catch-up in the UI maps subscription endpoints via HTTP instead of internal TCP.

Tests & config: Integration and cluster test harnesses use node + replication ports and gRPC streams instead of EventStore.ClientAPI TCP plugins; large TCP transport and ClientAPI test helper removals. New options/validation cover ReplicationPortAdvertiseAs (with deprecated alias) and non-overlapping node/replication listeners.

Reviewed by Cursor Bugbot for commit d04c94d. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitai Bot commented Sep 12, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 59 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 69854e44-553d-4513-b48e-01db363f21d2

📥 Commits

Reviewing files that changed from the base of the PR and between 9989238 and d04c94d.

📒 Files selected for processing (83)
  • src/EventStore.ClusterNode/Components/Pages/Cluster.razor
  • src/EventStore.ClusterNode/Components/Services/ClusterStatusService.cs
  • src/EventStore.ClusterNode/Components/Services/NodeConnectionTracker.cs
  • src/EventStore.ClusterNode/Components/Services/ReplicationEndpointPolicy.cs
  • src/EventStore.ClusterNode/Program.cs
  • src/EventStore.Core.Tests/ClientAPI/Helpers/EventDataComparer.cs
  • src/EventStore.Core.Tests/ClientAPI/Helpers/EventsStream.cs
  • src/EventStore.Core.Tests/ClientAPI/Helpers/TcpType.cs
  • src/EventStore.Core.Tests/ClientAPI/Helpers/TestConnection.cs
  • src/EventStore.Core.Tests/ClientAPI/Helpers/TestConnectionLifecycle.cs
  • src/EventStore.Core.Tests/ClientAPI/Helpers/TestEvent.cs
  • src/EventStore.Core.Tests/ClientAPI/Helpers/Writer.cs
  • src/EventStore.Core.Tests/ClientAPI/SpecificationWithMiniNode.cs
  • src/EventStore.Core.Tests/Cluster/MemberInfoTests.cs
  • src/EventStore.Core.Tests/DefaultData.cs
  • src/EventStore.Core.Tests/Helpers/ClientApiLoggerBridge.cs
  • src/EventStore.Core.Tests/Helpers/MiniClusterNode.cs
  • src/EventStore.Core.Tests/Helpers/MiniNode.cs
  • src/EventStore.Core.Tests/Integration/Archive/when_archiving_and_restoring_a_cluster.cs
  • src/EventStore.Core.Tests/Integration/specification_with_cluster.cs
  • src/EventStore.Core.Tests/Integration/when_cluster_nodes_are_restarted.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/ClusterSettingsFactory.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/ClusterVNodeSettings.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/ElectionServiceUnit.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/ElectionsServiceTests.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/LeaderNode/ElectionsServiceUnitTests.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/Randomized/RandomizedElectionsTestCase.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/Randomized/UpdateGossipProcessor.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/Randomized/elections_service_5_nodes_with_1_known_when_started_and_set_full_imediately.cs
  • src/EventStore.Core.Tests/Services/ElectionsService/Randomized/elections_service_5_nodes_with_1_known_when_started_and_set_to_full_later.cs
  • src/EventStore.Core.Tests/Services/GossipService/NodeGossipServiceTests.cs
  • src/EventStore.Core.Tests/Services/Replication/LogReplication/LogReplicationFixture.cs
  • src/EventStore.Core.Tests/Services/Replication/ReadOnlyReplica/connecting_to_read_only_replica.cs
  • src/EventStore.Core.Tests/Services/RequestForwarding/GrpcRequestForwardingServiceTests.cs
  • src/EventStore.Core.Tests/Services/RequestForwarding/GrpcRequestForwardingTransportSecurityTests.cs
  • src/EventStore.Core.Tests/Services/RequestForwarding/RequestForwardingServiceTests.cs
  • src/EventStore.Core.Tests/Services/RequestManagement/Service/when_writing_and_deposed_as_leader.cs
  • src/EventStore.Core.Tests/Services/RequestManagement/Service/when_writing_and_deposed_as_leader_and_replica_moves_forward.cs
  • src/EventStore.Core.Tests/Services/Transport/Grpc/Forwarding/ForwardingGrpcCodecTests.cs
  • src/EventStore.Core.Tests/Services/Transport/Grpc/Replication/GrpcReplicaServiceFactoryTests.cs
  • src/EventStore.Core.Tests/Services/Transport/Grpc/Replication/GrpcReplicaServiceSupervisorTests.cs
  • src/EventStore.Core.Tests/Services/Transport/Tcp/core_tcp_package.cs
  • src/EventStore.Core.Tests/Services/Transport/Tcp/ssl_connection.cs
  • src/EventStore.Core.Tests/Services/Transport/Tcp/ssl_connections_mutual_auth.cs
  • src/EventStore.Core.Tests/Services/VNode/InaugurationManager/InaugurationManagerTests.cs
  • src/EventStore.Core.Tests/Services/VNode/ShutdownServiceTests.cs
  • src/EventStore.Core.Tests/Services/VNode/leader_info_provider.cs
  • src/EventStore.Core.Tests/TcpApiTestPlugin/PublicTcpApiTestService.cs
  • src/EventStore.Core.Tests/TcpApiTestPlugin/TcpApiTestOptions.cs
  • src/EventStore.Core.Tests/TcpApiTestPlugin/TcpApiTestPlugin.cs
  • src/EventStore.Core.XUnit.Tests/Configuration/ClusterNodeOptionsTests/when_building/with_default_settings.cs
  • src/EventStore.Core.XUnit.Tests/Configuration/ClusterVNodeOptionsTests.cs
  • src/EventStore.Core.XUnit.Tests/Configuration/ClusterVNodeOptionsValidatorTests.cs
  • src/EventStore.Core.XUnit.Tests/Metrics/ElectionsCounterTrackerTests.cs
  • src/EventStore.Core.XUnit.Tests/Services/Storage/InMemory/GossipListenerServiceTests.cs
  • src/EventStore.Core.XUnit.Tests/Telemetry/TelemetryServiceTests.cs
  • src/EventStore.Core/Cluster/ClientClusterInfo.cs
  • src/EventStore.Core/Cluster/ClusterInfo.cs
  • src/EventStore.Core/Cluster/MemberInfo.cs
  • src/EventStore.Core/ClusterVNode.cs
  • src/EventStore.Core/Configuration/ClusterVNodeOptions.cs
  • src/EventStore.Core/Configuration/ClusterVNodeOptionsExtensions.cs
  • src/EventStore.Core/Configuration/ClusterVNodeOptionsValidator.cs
  • src/EventStore.Core/Data/GossipAdvertiseInfo.cs
  • src/EventStore.Core/Data/VNodeInfo.cs
  • src/EventStore.Core/Messages/ClientMessage.cs
  • src/EventStore.Core/Messages/ClusterInfoDto.cs
  • src/EventStore.Core/Messages/MemberInfoDto.cs
  • src/EventStore.Core/Services/ElectionsService.cs
  • src/EventStore.Core/Services/Gossip/GossipServiceBase.cs
  • src/EventStore.Core/Services/Gossip/NodeGossipService.cs
  • src/EventStore.Core/Services/Monitoring/MonitoringService.cs
  • src/EventStore.Core/Services/Replication/GrpcReplicaServiceSupervisor.cs
  • src/EventStore.Core/Services/Replication/ReplicationGrpcClient.cs
  • src/EventStore.Core/Services/RequestForwarding/GrpcRequestForwardingSupervisor.cs
  • src/EventStore.Core/Services/RequestForwardingService.cs
  • src/EventStore.Core/Services/Transport/Grpc/Forwarding/ForwardingGrpcCodec.cs
  • src/EventStore.Core/Services/Transport/Grpc/Forwarding/ForwardingService.cs
  • src/EventStore.Core/Services/VNode/ClusterVNodeController.cs
  • src/EventStore.Core/Services/VNode/LeaderInfoProvider.cs
  • src/EventStore.Projections.Core.Tests/Services/projections_system/when_starting_up.cs
  • src/Protos/Grpc/cluster.proto
  • src/Protos/Grpc/forwarding.proto

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@yordis
yordis added this pull request to stack #500 September 12, 2026 23:22

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit dbf4cb3. Configure here.

@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch from dbf4cb3 to ba04fb5 Compare September 13, 2026 00:15
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch from ba04fb5 to 6c0e186 Compare September 13, 2026 00:33
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch 2 times, most recently from 1330f22 to e681f13 Compare September 13, 2026 01:16
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch 2 times, most recently from 504ff97 to f9a5f73 Compare September 13, 2026 01:46
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch 2 times, most recently from 07068b1 to f0fb411 Compare September 13, 2026 02:29
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch from f0fb411 to e243e25 Compare September 13, 2026 02:59
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch from e243e25 to 32b689d Compare September 13, 2026 03:14
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch from 32b689d to 430b47b Compare September 13, 2026 03:46
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch 2 times, most recently from 2272c22 to 36955e8 Compare September 13, 2026 06:04
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch from 36955e8 to 5233227 Compare September 13, 2026 18:21
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@yordis
yordis force-pushed the yordis/feat-grpc-cluster-endpoints branch from 5233227 to d04c94d Compare September 13, 2026 21:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant