Skip to content

Conversation

@ManickaP
Copy link
Member

Addresses the last issue with unobserved exception leaking from _connectionCloseTcs.

Fixes #80111


Testing
I used Miha's trick from #80111 (comment) to manually check for unobserved exceptions from HTTP tests, but we don't have a collection fixture like QuicTestCollection to add similar print like:

Console.WriteLine($"Unobserved exceptions of {s_unobservedExceptions.Count} different types: {Environment.NewLine}{string.Join(Environment.NewLine + new string('=', 120) + Environment.NewLine, s_unobservedExceptions.Select(pair => $"Count {pair.Value}: {pair.Key}"))}");

in HTTP. And adding it and annotating the whole test lib felt like out of the scope for this PR.

Also note that from xUnit 3 there should be Assembly Fixtures which wouldn't require annotating every single test class in an assembly.

@dotnet-policy-service
Copy link
Contributor

Tagging subscribers to this area: @dotnet/ncl
See info in area-owners.md if you want to be subscribed.

}

internal static bool TryGetStreamExceptionForMsQuicStatus(int status, [NotNullWhen(true)] out Exception? exception, bool streamWasSuccessfullyStarted = true, string? message = null)
internal static bool TryGetStreamExceptionForMsQuicStatus(int status, [NotNullWhen(true)] out Exception? exception)
Copy link
Member Author

@ManickaP ManickaP Jul 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need the special exception here. MsQuic will throw either ABORTED or INVALID_STATE in case the connection is closed (remotely / locally). It also doesn't use these statuses for anything else.

}
}

public static void ObserveException(this Task task)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follows the same pattern as LogExceptions in HttpConnection.

/// <summary>
/// Completed when connection shutdown is initiated.
/// </summary>
private readonly TaskCompletionSource _connectionCloseTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just moved around to be next to other connection closure fields.

Debug.Assert(_connectionCloseTcs.Task.IsCompleted);
_handle.Dispose();
_shutdownTokenSource.Dispose();
_connectionCloseTcs.Task.ObserveException();
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the FIX.

@rzikm
Copy link
Member

rzikm commented Jul 15, 2024

Also note that from xUnit 3 there should be Assembly Fixtures which wouldn't require annotating every single test class in an assembly.

I thought the same when I added dumping MsQuic counters for System.Net.Quic tests. But I am not sure we can just go and update xUnit to v3

@ManickaP ManickaP requested review from a team and rzikm July 15, 2024 13:55
@ManickaP
Copy link
Member Author

I thought the same when I added dumping MsQuic counters for System.Net.Quic tests. But I am not sure we can just go and update xUnit to v3

I don't think it's even out yet 😄

Copy link
Member

@rzikm rzikm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ManickaP
Copy link
Member Author

/azp run runtime-libraries-coreclr outerloop

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@ManickaP ManickaP merged commit 817a2fb into dotnet:main Jul 16, 2024
@ManickaP ManickaP deleted the quic-unobserved-ex branch July 16, 2024 07:12
@github-actions github-actions bot locked and limited conversation to collaborators Aug 15, 2024
@karelz karelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.Net.Quic is leaking UnobservedTaskExceptions

3 participants