internal async Task should_handle_node_preference_from_gossip( ClusterMessages.VNodeState nodeState, NodePreference nodePreference) { var response = new ClusterMessages.ClusterInfoDto { Members = new[] { new ClusterMessages.MemberInfoDto { State = nodeState, IsAlive = true, ExternalTcpIp = "127.0.0.1", ExternalTcpPort = 1113 }, new ClusterMessages.MemberInfoDto { State = ClusterMessages.VNodeState.Unknown, IsAlive = true, ExternalTcpIp = "127.0.0.1", ExternalTcpPort = 2113 } } }; var sut = new ClusterDnsEndPointDiscoverer(new ConsoleLogger(), "dns", 1, 1111, new[] { new GossipSeed(new IPEndPoint(IPAddress.Any, 2113)) }, TimeSpan.FromSeconds(1), nodePreference, new NoCompatibilityMode(), new TestHttpClient(response.ToJson())); var result = await sut.DiscoverAsync(new IPEndPoint(IPAddress.Any, 1113)); Assert.Equal(1113, EndPointExtensions.GetPort(result.TcpEndPoint)); }
internal async Task should_not_be_able_to_pick_invalid_node(bool useHttps, ClusterMessages.VNodeState invalidState) { var gossip = new ClusterMessages.ClusterInfo { Members = new[] { new ClusterMessages.MemberInfo { State = invalidState, InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 4444), IsAlive = true, }, } }; var sut = new GossipBasedEndpointDiscoverer( new EventStoreClientConnectivitySettings { MaxDiscoverAttempts = 1, GossipTimeout = System.Threading.Timeout.InfiniteTimeSpan, Insecure = !useHttps, DiscoveryInterval = TimeSpan.Zero, NodePreference = NodePreference.Leader, DnsGossipSeeds = new[] { _gossipSeed } }, new CallbackTestGossipClient(gossip)); var ex = await Assert.ThrowsAsync <DiscoveryException>(async() => await sut.DiscoverAsync()); Assert.Equal(1, ex.MaxDiscoverAttempts); }
public async Task should_pick_node_based_on_preference(NodePreference preference, ClusterMessages.VNodeState expectedState) { var gossip = new ClusterMessages.ClusterInfo { Members = new[] { new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Leader, InstanceId = Guid.NewGuid(), HttpEndPointAddress = IPAddress.Any.ToString(), HttpEndPointPort = 1111, IsAlive = true, }, new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Follower, InstanceId = Guid.NewGuid(), HttpEndPointAddress = IPAddress.Any.ToString(), HttpEndPointPort = 2222, IsAlive = true, }, new ClusterMessages.MemberInfo { State = expectedState == ClusterMessages.VNodeState.ReadOnlyLeaderless ? expectedState : ClusterMessages.VNodeState.ReadOnlyReplica, InstanceId = Guid.NewGuid(), HttpEndPointAddress = IPAddress.Any.ToString(), HttpEndPointPort = 3333, IsAlive = true, }, new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Manager, InstanceId = Guid.NewGuid(), HttpEndPointAddress = IPAddress.Any.ToString(), HttpEndPointPort = 4444, IsAlive = true, }, } }; var handler = new CustomMessageHandler(req => { _fixture.CurrentClusterInfo.Members = gossip.Members; }); var sut = new ClusterEndpointDiscoverer(1, new[] { new DnsEndPoint(_fixture.Host, _fixture.Port) }, Timeout.InfiniteTimeSpan, TimeSpan.Zero, preference, handler); var result = await sut.DiscoverAsync(); Assert.Equal(result.GetPort(), gossip.Members.Last(x => x.State == expectedState).HttpEndPointPort); }
public async Task should_pick_node_based_on_preference(NodePreference preference, ClusterMessages.VNodeState expectedState) { var gossip = new ClusterMessages.ClusterInfo { Members = new[] { new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Leader, InstanceId = Guid.NewGuid(), ExternalHttpIp = IPAddress.Any.ToString(), ExternalHttpPort = 1111, IsAlive = true, }, new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Follower, InstanceId = Guid.NewGuid(), ExternalHttpIp = IPAddress.Any.ToString(), ExternalHttpPort = 2222, IsAlive = true, }, new ClusterMessages.MemberInfo { State = expectedState == ClusterMessages.VNodeState.ReadOnlyLeaderless ? expectedState : ClusterMessages.VNodeState.ReadOnlyReplica, InstanceId = Guid.NewGuid(), ExternalHttpIp = IPAddress.Any.ToString(), ExternalHttpPort = 3333, IsAlive = true, }, new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Manager, InstanceId = Guid.NewGuid(), ExternalHttpIp = IPAddress.Any.ToString(), ExternalHttpPort = 4444, IsAlive = true, }, } }; var handler = new FakeMessageHandler(req => ResponseFromGossip(gossip)); var sut = new ClusterEndpointDiscoverer(1, new[] { new DnsEndPoint("localhost", 1113) }, Timeout.InfiniteTimeSpan, TimeSpan.Zero, preference, handler); var result = await sut.DiscoverAsync(); Assert.Equal(result.Port, gossip.Members.Last(x => x.State == expectedState).ExternalHttpPort); }
internal async Task should_pick_node_based_on_preference(bool useHttps, NodePreference preference, ClusterMessages.VNodeState expectedState) { var gossip = new ClusterMessages.ClusterInfo { Members = new[] { new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Leader, InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 1111), IsAlive = true, }, new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Follower, InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 2222), IsAlive = true, }, new ClusterMessages.MemberInfo { State = expectedState == ClusterMessages.VNodeState.ReadOnlyLeaderless ? expectedState : ClusterMessages.VNodeState.ReadOnlyReplica, InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 3333), IsAlive = true, }, new ClusterMessages.MemberInfo { State = ClusterMessages.VNodeState.Manager, InstanceId = Guid.NewGuid(), EndPoint = new DnsEndPoint(IPAddress.Any.ToString(), 4444), IsAlive = true, }, } }; var sut = new GossipBasedEndpointDiscoverer( new EventStoreClientConnectivitySettings { MaxDiscoverAttempts = 1, GossipTimeout = System.Threading.Timeout.InfiniteTimeSpan, Insecure = !useHttps, DiscoveryInterval = TimeSpan.Zero, NodePreference = preference, DnsGossipSeeds = new[] { _gossipSeed } }, new CallbackTestGossipClient(gossip)); var result = await sut.DiscoverAsync(); Assert.Equal(result.GetPort(), gossip.Members.Last(x => x.State == expectedState).EndPoint.Port); }
public async Task should_not_be_able_to_pick_invalid_node(ClusterMessages.VNodeState invalidState) { var gossip = new ClusterMessages.ClusterInfo { Members = new[] { new ClusterMessages.MemberInfo { State = invalidState, InstanceId = Guid.NewGuid(), ExternalHttpIp = IPAddress.Any.ToString(), ExternalHttpPort = 4444, IsAlive = true, }, } }; var handler = new FakeMessageHandler(req => ResponseFromGossip(gossip)); var sut = new ClusterEndpointDiscoverer(1, new[] { new DnsEndPoint("localhost", 1113), }, Timeout.InfiniteTimeSpan, TimeSpan.Zero, NodePreference.Leader, handler); await Assert.ThrowsAsync <DiscoveryException>(() => sut.DiscoverAsync()); }
public async Task should_not_be_able_to_pick_invalid_node(ClusterMessages.VNodeState invalidState) { var gossip = new ClusterMessages.ClusterInfo { Members = new[] { new ClusterMessages.MemberInfo { State = invalidState, InstanceId = Guid.NewGuid(), HttpEndPointAddress = IPAddress.Any.ToString(), HttpEndPointPort = 4444, IsAlive = true, }, } }; var handler = new CustomMessageHandler(req => { _fixture.CurrentClusterInfo.Members = gossip.Members; }); var sut = new ClusterEndpointDiscoverer(1, new[] { new DnsEndPoint(_fixture.Host, _fixture.Port), }, Timeout.InfiniteTimeSpan, TimeSpan.Zero, NodePreference.Leader, handler); await Assert.ThrowsAsync <DiscoveryException>(() => sut.DiscoverAsync()); }
private bool IsReadOnlyReplicaState(ClusterMessages.VNodeState state) { return(state == ClusterMessages.VNodeState.ReadOnlyLeaderless || state == ClusterMessages.VNodeState.PreReadOnlyReplica || state == ClusterMessages.VNodeState.ReadOnlyReplica); }
private bool IsReadOnlyReplicaState(ClusterMessages.VNodeState state) => state is ClusterMessages.VNodeState.ReadOnlyLeaderless or ClusterMessages.VNodeState.ReadOnlyReplica;