diff --git a/releaseNote.md b/releaseNote.md index 51fc0c645..d1ae63d2f 100644 --- a/releaseNote.md +++ b/releaseNote.md @@ -1,11 +1,7 @@ ## Features ## Bugs -- Fixed a crash on runner startup (#1770) - -## Misc - -- Clarified the type of step running when running job started or completed hooks (#1769) +- Fixed an issue where websockets failed to successfully close when posting log lines (#1790) ## Windows x64 diff --git a/src/Runner.Common/JobServer.cs b/src/Runner.Common/JobServer.cs index a34012b70..ffa70a48e 100644 --- a/src/Runner.Common/JobServer.cs +++ b/src/Runner.Common/JobServer.cs @@ -146,8 +146,10 @@ namespace GitHub.Runner.Common public ValueTask DisposeAsync() { - _websocketClient?.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Shutdown", CancellationToken.None); + CloseWebSocket(WebSocketCloseStatus.NormalClosure, CancellationToken.None); + GC.SuppressFinalize(this); + return ValueTask.CompletedTask; } @@ -256,7 +258,8 @@ namespace GitHub.Runner.Common if (failedAttemptsToPostBatchedLinesByWebsocket * 100 / totalBatchedLinesAttemptedByWebsocket > _minWebsocketFailurePercentageAllowed) { Trace.Info($"Exhausted websocket allowed retries, we will not attempt websocket connection for this job to post lines again."); - _websocketClient?.CloseOutputAsync(WebSocketCloseStatus.InternalServerError, "Shutdown due to failures", cancellationToken); + CloseWebSocket(WebSocketCloseStatus.InternalServerError, cancellationToken); + // By setting it to null, we will ensure that we never try websocket path again for this job _websocketClient = null; } @@ -284,6 +287,19 @@ namespace GitHub.Runner.Common } } + private void CloseWebSocket(WebSocketCloseStatus closeStatus, CancellationToken cancellationToken) + { + try + { + _websocketClient?.CloseOutputAsync(closeStatus, "Closing websocket", cancellationToken); + } + catch (Exception websocketEx) + { + // In some cases this might be okay since the websocket might be open yet, so just close and don't trace exceptions + Trace.Info($"Failed to close websocket gracefully {websocketEx.GetType().Name}"); + } + } + public Task CreateAttachmentAsync(Guid scopeIdentifier, string hubName, Guid planId, Guid timelineId, Guid timelineRecordId, string type, string name, Stream uploadStream, CancellationToken cancellationToken) { CheckConnection(); diff --git a/src/runnerversion b/src/runnerversion index 9f83c0774..2f6dd9ad6 100644 --- a/src/runnerversion +++ b/src/runnerversion @@ -1 +1 @@ -2.289.1 +2.289.2