-
Notifications
You must be signed in to change notification settings - Fork 4.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DRAFT] Add Keep-Alive Ping and Timeout implementation #105672
Conversation
Note regarding the
|
Note regarding the
|
Tagging subscribers to this area: @dotnet/ncl |
/azp run runtime-libraries-coreclr outerloop |
Azure Pipelines successfully started running 1 pipeline(s). |
/azp run runtime-libraries-coreclr outerloop |
Azure Pipelines successfully started running 1 pipeline(s). |
For history: The weird hang happened (flaky) on linux mono minijit or interpreter with Debug libraries test: we cancel CloseAsync and expect the cancellation to abort the websocket (so it will surface in awaiting the read task) Task receiveTask = cws.ReceiveAsync(new byte[1], testTimeoutCts.Token);
var cancelCloseCts = new CancellationTokenSource();
await Assert.ThrowsAnyAsync<OperationCanceledException>(async () =>
{
Task t = cws.CloseAsync(WebSocketCloseStatus.NormalClosure, null, cancelCloseCts.Token);
cancelCloseCts.Cancel();
await t;
});
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => receiveTask); code in question (simplified): private async Task CloseAsyncPrivate(...)
{
Log.CloseAsyncPrivateStarted();
try
{
//...
await SendCloseFrameAsync(...);
//...
Log("Waiting for a close frame");
//...
CancellationTokenRegistration registration = default;
try
{
if (cancellationToken.CanBeCanceled)
{
Log("Registering for cancellation");
registration = cancellationToken.Register(static s =>
{
Log("Aborting due to cancellation");
((ManagedWebSocket)s!).Abort();
}, this);
}
//...
Log("Waiting for the _receiveMutex...");
await _receiveMutex.EnterAsync(cancellationToken); // this one ends up throwing TCE
// ...
}
finally
{
// ...
Log("Disposing cancellation registration");
registration.Dispose();
Log("Cancellation registration disposed");
}
}
//...
}
catch (Exception exc)
{
Log.Exception(exc);
throw;
}
finally
{
Log.CloseAsyncPrivateCompleted();
}
} logs:
Note: 13:31:51 is when TCE happens, but Abort only starts at 13:32:21 Full trace
|
Draft Pull Request was automatically closed for 30 days of inactivity. Please let us know if you'd like to reopen it. |
Description TBA
ClientWebSocket tests TBA
[UPD 7/30] Existing WebSocket microbenchmarks (keep-alive disabled):