Exemplo n.º 1
0
        public async Task <IEndPointHandle> GetOrWaitForNextHost(CancellationToken cancellationToken)
        {
            var hostOverride = TracingContext.GetHostOverride(DeploymentIdentifier.ServiceName);

            if (hostOverride != null)
            {
                return(new OverriddenRemoteHost(DeploymentIdentifier.ServiceName, hostOverride.Hostname, hostOverride.Port ?? GetConfig().DefaultPort));
            }

            if (ReachableHosts.Count > 0)
            {
                return(GetNextHost());
            }

            lock (_lock)
            {
                if (FirstAvailableHostCompletionSource == null)
                {
                    FirstAvailableHostCompletionSource = new TaskCompletionSource <RemoteHost>();
                }

                cancellationToken.Register(() => FirstAvailableHostCompletionSource?.SetCanceled());
            }

            return(await FirstAvailableHostCompletionSource.Task.ConfigureAwait(false));
        }
Exemplo n.º 2
0
        public async Task <RemoteHost> GetOrWaitForNextHost(CancellationToken cancellationToken)
        {
            var hostOverride = TracingContext.GetHostOverride(ServiceDeployment.ServiceName);

            if (hostOverride != null)
            {
                return(new OverriddenRemoteHost(ServiceDeployment.ServiceName, hostOverride, this));
            }

            if (ReachableHosts.Count > 0)
            {
                return(GetNextHost());
            }

            lock (_lock)
            {
                if (FirstAvailableHostCompletionSource == null)
                {
                    FirstAvailableHostCompletionSource = new TaskCompletionSource <RemoteHost>();
                }

                cancellationToken.Register(() => FirstAvailableHostCompletionSource?.SetCanceled());
            }

            return(await FirstAvailableHostCompletionSource.Task.ConfigureAwait(false));
        }
Exemplo n.º 3
0
        internal bool MarkReachable(RemoteHost remoteHost)
        {
            lock (_lock)
            {
                if (UnreachableHosts.Remove(remoteHost))
                {
                    ReachableHosts.Add(remoteHost);
                    if (ReachableHosts.Count == 1)
                    {
                        ReachabilityBroadcaster.Post(new ServiceReachabilityStatus {
                            IsReachable = true
                        });
                    }

                    FirstAvailableHostCompletionSource?.SetResult(remoteHost);
                    FirstAvailableHostCompletionSource = null;

                    return(true);
                }

                return(false);
            }
        }