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