コード例 #1
0
        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));
        }
コード例 #2
0
        private ClusterMessages.ClusterInfoDto TryGetGossipFrom(GossipSeed endPoint)
        {
            //_log.Debug("ClusterDnsEndPointDiscoverer: Trying to get gossip from [{0}].", endPoint);

            ClusterMessages.ClusterInfoDto result = null;
            var completed = new ManualResetEventSlim(false);

            var url = endPoint.EndPoint.ToHttpUrl(
                endPoint.SeedOverTls ? EndpointExtensions.HTTPS_SCHEMA : EndpointExtensions.HTTP_SCHEMA,
                "/gossip?format=json", true);

            _client.Get(
                url,
                null,
                response => {
                try {
                    if (response.HttpStatusCode != HttpStatusCode.OK)
                    {
                        _log.Info("[{0}] responded with {1} ({2})", endPoint, response.HttpStatusCode,
                                  response.StatusDescription);
                        return;
                    }

                    try {
                        result = response.Body.ParseJson <ClusterMessages.ClusterInfoDto>();
                        //_log.Debug("ClusterDnsEndPointDiscoverer: Got gossip from [{0}]:\n{1}.", endPoint, string.Join("\n", result.Members.Select(x => x.ToString())));
                    } catch (Exception e) {
                        if (e is AggregateException ae)
                        {
                            e = ae.Flatten();
                        }
                        _log.Error("Failed to get cluster info from [{0}]: deserialization error: {1}.", endPoint, e);
                    }
                } finally {
                    completed.Set();
                }
            },
                e => {
                try {
                    if (e is AggregateException ae)
                    {
                        e = ae.Flatten();
                    }
                    _log.Error("Failed to get cluster info from [{0}]: request failed, error: {1}.", endPoint, e);
                } finally {
                    completed.Set();
                }
            },
                // https://github.com/EventStore/EventStore/pull/2744#pullrequestreview-562358658
                endPoint.V5HostHeader ? "" : endPoint.EndPoint.GetHost());

            completed.Wait();
            return(result);
        }
コード例 #3
0
        private ClusterMessages.ClusterInfoDto TryGetGossipFrom(GossipSeed endPoint)
        {
            //_log.Debug("ClusterDnsEndPointDiscoverer: Trying to get gossip from [{0}].", endPoint);

            ClusterMessages.ClusterInfoDto result = null;
            var completed = new ManualResetEventSlim(false);

            var url = endPoint.EndPoint.ToHttpUrl("/gossip?format=json");

            _client.Get(
                url,
                null,
                _gossipTimeout,
                response =>
            {
                if (response.HttpStatusCode != HttpStatusCode.OK)
                {
                    //_log.Info("[{0}] responded with {1} ({2})", endPoint, response.HttpStatusCode, response.StatusDescription);
                    completed.Set();
                    return;
                }
                try
                {
                    result = response.Body.ParseJson <ClusterMessages.ClusterInfoDto>();
                    //_log.Debug("ClusterDnsEndPointDiscoverer: Got gossip from [{0}]:\n{1}.", endPoint, string.Join("\n", result.Members.Select(x => x.ToString())));
                }
                catch (Exception)
                {
                    //_log.Info("Failed to get cluster info from [{0}]: deserialization error: {1}.", endPoint, e.Message);
                }
                completed.Set();
            },
                e =>
            {
                //_log.Info("Failed to get cluster info from [{0}]: request failed, error: {1}.", endPoint, e.Message);
                completed.Set();
            }, endPoint.HostHeader);

            completed.Wait();
            return(result);
        }
コード例 #4
0
        private ClusterMessages.ClusterInfoDto ClusterInfoOrDefault(IPAddress manager)
        {
            ClusterMessages.ClusterInfoDto info = null;
            var completed = new ManualResetEvent(false);

            Action <HttpResponse> success = response =>
            {
                _log.Info("Got response from manager on [{0}]", manager);
                if (response.HttpStatusCode != HttpStatusCode.OK)
                {
                    _log.Info("Manager responded with {0} ({1})", response.HttpStatusCode, response.StatusDescription);
                    completed.Set();
                    return;
                }
                try
                {
                    using (var reader = new StringReader(response.Body))
                        info = (ClusterMessages.ClusterInfoDto) new XmlSerializer(typeof(ClusterMessages.ClusterInfoDto)).Deserialize(reader);
                }
                catch (Exception e)
                {
                    _log.Info(e, "Failed to get cluster info from manager on [{0}]. Deserialization error", manager);
                }
                completed.Set();
            };

            Action <Exception> error = e =>
            {
                _log.Info(e, "Failed to get cluster info from manager on [{0}]. Request failed");
                completed.Set();
            };

            var url = new IPEndPoint(manager, _port).ToHttpUrl("/gossip?format=xml");

            _log.Info("Sending gossip request to {0}...", url);
            _client.Get(url, success, error);

            completed.WaitOne();
            return(info);
        }