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)); }
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); }
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); }
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); }