diff --git a/src/Runner.Common/JobServer.cs b/src/Runner.Common/JobServer.cs index 8543dce39..7d069bf97 100644 --- a/src/Runner.Common/JobServer.cs +++ b/src/Runner.Common/JobServer.cs @@ -2,19 +2,16 @@ using System; using System.Collections.Generic; using System.IO; -using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using GitHub.Runner.Sdk; using GitHub.Services.WebApi; -using GitHub.Services.Common; namespace GitHub.Runner.Common { [ServiceLocator(Default = typeof(JobServer))] public interface IJobServer : IRunnerService { - Task ConnectAsync(Uri jobServerUrl, VssCredentials jobServerCredential, DelegatingHandler[] delegatingHandler = null); + Task ConnectAsync(VssConnection jobConnection); // logging and console Task AppendLogContentAsync(Guid scopeIdentifier, string hubName, Guid planId, int logId, Stream uploadStream, CancellationToken cancellationToken); @@ -35,21 +32,20 @@ namespace GitHub.Runner.Common private VssConnection _connection; private TaskHttpClient _taskClient; - public async Task ConnectAsync(Uri jobServerUrl, VssCredentials jobServerCredential, DelegatingHandler[] delegatingHandler = null) + public async Task ConnectAsync(VssConnection jobConnection) { - Trace.Info($"Establishing connection for JobServer"); + _connection = jobConnection; int attemptCount = 5; - - while (attemptCount-- > 0) + while (!_connection.HasAuthenticated && attemptCount-- > 0) { try { - await RefreshConnectionAsync(jobServerUrl, jobServerCredential, delegatingHandler); + await _connection.ConnectAsync(); break; } catch (Exception ex) when (attemptCount > 0) { - Trace.Info($"Catch exception during connect. {attemptCount} attempts left."); + Trace.Info($"Catch exception during connect. {attemptCount} attemp left."); Trace.Error(ex); } @@ -57,15 +53,6 @@ namespace GitHub.Runner.Common } _taskClient = _connection.GetClient(); - } - - private async Task RefreshConnectionAsync(Uri jobServerUrl, VssCredentials jobServerCredential, DelegatingHandler[] delegatingHandler) - { - Trace.Info($"Refresh JobServer VssConnection to get on a different AFD node."); - _hasConnection = false; - _connection?.Dispose(); - _connection = VssUtil.CreateConnection(jobServerUrl, jobServerCredential, delegatingHandler); - await _connection.ConnectAsync(); _hasConnection = true; } diff --git a/src/Runner.Listener/JobDispatcher.cs b/src/Runner.Listener/JobDispatcher.cs index acd9202d3..97422ee47 100644 --- a/src/Runner.Listener/JobDispatcher.cs +++ b/src/Runner.Listener/JobDispatcher.cs @@ -510,8 +510,9 @@ namespace GitHub.Runner.Listener var jobServer = HostContext.GetService(); VssCredentials jobServerCredential = VssUtil.GetVssCredential(systemConnection); + VssConnection jobConnection = VssUtil.CreateConnection(systemConnection.Url, jobServerCredential); + await jobServer.ConnectAsync(jobConnection); - await jobServer.ConnectAsync(systemConnection.Url, jobServerCredential); await LogWorkerProcessUnhandledException(jobServer, message, detailInfo); // Go ahead to finish the job with result 'Failed' if the STDERR from worker is System.IO.IOException, since it typically means we are running out of disk space. @@ -790,8 +791,9 @@ namespace GitHub.Runner.Listener var jobServer = HostContext.GetService(); VssCredentials jobServerCredential = VssUtil.GetVssCredential(systemConnection); + VssConnection jobConnection = VssUtil.CreateConnection(systemConnection.Url, jobServerCredential); - await jobServer.ConnectAsync(systemConnection.Url, jobServerCredential); + await jobServer.ConnectAsync(jobConnection); var timeline = await jobServer.GetTimelineAsync(message.Plan.ScopeIdentifier, message.Plan.PlanType, message.Plan.PlanId, message.Timeline.Id, CancellationToken.None); diff --git a/src/Runner.Worker/JobRunner.cs b/src/Runner.Worker/JobRunner.cs index 3257d1c8d..7f67ed03b 100644 --- a/src/Runner.Worker/JobRunner.cs +++ b/src/Runner.Worker/JobRunner.cs @@ -48,8 +48,8 @@ namespace GitHub.Runner.Worker Trace.Info($"Creating job server with URL: {jobServerUrl}"); // jobServerQueue is the throttling reporter. _jobServerQueue = HostContext.GetService(); - - await jobServer.ConnectAsync(jobServerUrl, jobServerCredential, new DelegatingHandler[] { new ThrottlingReportHandler(_jobServerQueue) }); + VssConnection jobConnection = VssUtil.CreateConnection(jobServerUrl, jobServerCredential, new DelegatingHandler[] { new ThrottlingReportHandler(_jobServerQueue) }); + await jobServer.ConnectAsync(jobConnection); _jobServerQueue.Start(message); HostContext.WritePerfCounter($"WorkerJobServerQueueStarted_{message.RequestId.ToString()}");