-
Notifications
You must be signed in to change notification settings - Fork 4.8k
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
[HTTP/3] Stress hack for msquic dropping connections #84793
Changes from 11 commits
df45d59
df7b541
bd6c04d
fa5820e
b649716
ed73b02
7e4d512
1f8f56e
d2c113c
7613f06
0a9731f
e316a13
949d82b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,7 +14,7 @@ if (-not ([string]::IsNullOrEmpty($args[0]))) { | |
|
||
$LibrariesConfiguration = "Release" | ||
if (-not ([string]::IsNullOrEmpty($args[1]))) { | ||
$LibrariesConfiguration = $args[0] | ||
$LibrariesConfiguration = $args[1] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixes in this file are unrelated. Both |
||
} | ||
|
||
$TestHostRoot="$RepoRoot/artifacts/bin/testhost/net$Version-windows-$LibrariesConfiguration-x64" | ||
|
@@ -53,11 +53,11 @@ if (-not (Test-Path -Path "$TestHostRoot/shared/Microsoft.AspNetCore.App")) { | |
Write-Host "Building solution." | ||
dotnet build -c $StressConfiguration | ||
|
||
$Runscript=".\run-stress-$LibrariesConfiguration-$StressConfiguration.ps1" | ||
$Runscript=".\run-stress-$StressConfiguration-$LibrariesConfiguration.ps1" | ||
if (-not (Test-Path $Runscript)) { | ||
Write-Host "Generating Runscript." | ||
Add-Content -Path $Runscript -Value "& '$TestHostRoot/dotnet' exec --roll-forward Major ./bin/$StressConfiguration/net$Version/HttpStress.dll `$args" | ||
} | ||
|
||
Write-Host "To run tests type:" | ||
Write-Host "$Runscript [stress test args]" | ||
Write-Host "$Runscript [stress test args]" |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -130,7 +130,7 @@ static MsQuicApi() | |
} | ||
string? gitHash = Marshal.PtrToStringUTF8((IntPtr)libGitHash); | ||
|
||
MsQuicLibraryVersion = $"{Interop.Libraries.MsQuic} version={version} commit={gitHash}"; | ||
MsQuicLibraryVersion = $"{Interop.Libraries.MsQuic} {version} ({gitHash})"; | ||
|
||
if (version < s_minMsQuicVersion) | ||
{ | ||
|
@@ -143,7 +143,7 @@ static MsQuicApi() | |
|
||
if (NetEventSource.Log.IsEnabled()) | ||
{ | ||
NetEventSource.Info(null, $"Loaded MsQuic library version '{version}', commit '{gitHash}'."); | ||
NetEventSource.Info(null, $"Loaded MsQuic library '{MsQuicLibraryVersion}'."); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Brilliant 😆 |
||
} | ||
|
||
// Assume SChannel is being used on windows and query for the actual provider from the library if querying is supported | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,8 +13,8 @@ | |
using Xunit.Abstractions; | ||
using System.Diagnostics.Tracing; | ||
using System.Net.Sockets; | ||
using System.Reflection; | ||
using Microsoft.Quic; | ||
using static Microsoft.Quic.MsQuic; | ||
|
||
namespace System.Net.Quic.Tests | ||
{ | ||
|
@@ -44,14 +44,20 @@ public abstract class QuicTestBase : IDisposable | |
|
||
static unsafe QuicTestBase() | ||
{ | ||
Console.WriteLine($"MsQuic {(IsSupported ? "supported" : "not supported")} and using '{MsQuicApi.MsQuicLibraryVersion}'."); | ||
// If any of the reflection bellow breaks due to changes in "System.Net.Quic.MsQuicApi", also check and fix HttpStress project as it uses the same hack. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm wondering if this should go somewhere to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sounds good, I'll look into it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should keep in mind that whatever utility helper we add, its' file has to be also copied to the container, so avoiding duplication has a higher cost in complexity here than normally. At the moment I'm undecided if it's worth it, would prefer to do the docker copying work mentioned in #84793 (comment) first, planning to jump to it tomorrow. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, I'm holding back. Let me know when/if I should look into it. |
||
Type msQuicApiType = typeof(QuicConnection).Assembly.GetType("System.Net.Quic.MsQuicApi"); | ||
|
||
string msQuicLibraryVersion = (string)msQuicApiType.GetProperty("MsQuicLibraryVersion", BindingFlags.NonPublic | BindingFlags.Static).GetGetMethod(true).Invoke(null, Array.Empty<object?>()); | ||
Console.WriteLine($"MsQuic {(IsSupported ? "supported" : "not supported")} and using '{msQuicLibraryVersion}'."); | ||
|
||
if (IsSupported) | ||
{ | ||
object msQuicApiInstance = msQuicApiType.GetProperty("Api", BindingFlags.NonPublic | BindingFlags.Static).GetGetMethod(true).Invoke(null, Array.Empty<object?>()); | ||
QUIC_API_TABLE* apiTable = (QUIC_API_TABLE*)(Pointer.Unbox(msQuicApiType.GetProperty("ApiTable").GetGetMethod().Invoke(msQuicApiInstance, Array.Empty<object?>()))); | ||
QUIC_SETTINGS settings = default(QUIC_SETTINGS); | ||
settings.IsSet.MaxWorkerQueueDelayUs = 1; | ||
settings.MaxWorkerQueueDelayUs = 2_500_000u; // 2.5s, 10x the default | ||
if (StatusFailed(MsQuicApi.Api.ApiTable->SetParam(null, QUIC_PARAM_GLOBAL_SETTINGS, (uint)sizeof(QUIC_SETTINGS), (byte*)&settings))) | ||
if (MsQuic.StatusFailed(apiTable->SetParam(null, MsQuic.QUIC_PARAM_GLOBAL_SETTINGS, (uint)sizeof(QUIC_SETTINGS), (byte*)&settings))) | ||
{ | ||
Console.WriteLine($"Unable to set MsQuic MaxWorkerQueueDelayUs."); | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,7 @@ | |
<Compile Include="$(CommonPath)System\Net\ArrayBuffer.cs" Link="ProductionCode\Common\System\Net\ArrayBuffer.cs" /> | ||
<Compile Include="$(CommonPath)System\Net\MultiArrayBuffer.cs" Link="ProductionCode\Common\System\Net\MultiArrayBuffer.cs" /> | ||
<Compile Include="$(CommonPath)System\Net\StreamBuffer.cs" Link="ProductionCode\Common\System\Net\StreamBuffer.cs" /> | ||
<Compile Include="$(CommonPath)System\Net\Security\TlsAlertMessage.cs" Link="Common\System\Net\Security\TlsAlertMessage.cs" /> | ||
<Compile Include="$(CommonTestPath)System\IO\ConnectedStreams.cs" Link="Common\System\IO\ConnectedStreams.cs" /> | ||
<Compile Include="$(CommonTestPath)System\Net\Capability.Security.cs" Link="Common\System\Net\Capability.Security.cs" /> | ||
<Compile Include="$(CommonTestPath)System\Net\Configuration.cs" Link="Common\System\Net\Configuration.cs" /> | ||
|
@@ -31,18 +32,8 @@ | |
</ItemGroup> | ||
<!-- Shared production code --> | ||
<ItemGroup> | ||
<Compile Include="$(CommonPath)System\Net\Logging\NetEventSource.Common.cs" Link="Common\System\Net\Logging\NetEventSource.Common.cs" /> | ||
<Compile Include="..\..\src\System\Net\Quic\Internal\MsQuicApi.cs" Link="ProductionCode\System\Net\Quic\Internal\MsQuicApi.cs" /> | ||
<Compile Include="..\..\src\System\Net\Quic\Internal\MsQuicApi.NativeMethods.cs" Link="ProductionCode\System\Net\Quic\Internal\MsQuicApi.NativeMethods.cs" /> | ||
<Compile Include="..\..\src\System\Net\Quic\Internal\MsQuicSafeHandle.cs" Link="ProductionCode\System\Net\Quic\Internal\MsQuicSafeHandle.cs" /> | ||
<Compile Include="..\..\src\System\Net\Quic\Internal\ThrowHelper.cs" Link="ProductionCode\System\Net\Quic\Internal\ThrowHelper.cs" /> | ||
<Compile Include="..\..\src\System\Net\Quic\Interop\*.cs" Link="ProductionCode\System\Net\Quic\Interop\*.cs" /> | ||
<Compile Include="..\..\src\System\Net\Quic\NetEventSource.Quic.cs" Link="ProductionCode\System\Net\Quic\NetEventSource.Quic.cs" /> | ||
<Compile Include="..\..\src\System\Net\Quic\QuicDefaults.cs" Link="ProductionCode\System\Net\Quic\QuicDefaults.cs" /> | ||
<Compile Include="$(CommonPath)Interop\Windows\Interop.Libraries.cs" Link="Common\Interop\Windows\Interop.Libraries.cs" Condition="'$(TargetPlatformIdentifier)' == 'windows'" /> | ||
<Compile Include="$(CommonPath)Interop\Linux\Interop.Libraries.cs" Link="Common\Interop\Linux\Interop.Libraries.cs" Condition="'$(TargetPlatformIdentifier)' == 'linux'" /> | ||
<Compile Include="$(CommonPath)Interop\OSX\Interop.Libraries.cs" Link="Common\Interop\OSX\Interop.Libraries.cs" Condition="'$(TargetPlatformIdentifier)' == 'osx'" /> | ||
<Compile Include="$(CommonPath)System\Net\Security\TlsAlertMessage.cs" Link="Common\System\Net\Security\TlsAlertMessage.cs" /> | ||
<Compile Include="..\..\src\System\Net\Quic\Interop\*.cs" LinkBase="ProductionCode\System\Net\Quic\Interop" /> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
</ItemGroup> | ||
<ItemGroup> | ||
<ProjectReference Include="$(CommonTestPath)StreamConformanceTests\StreamConformanceTests.csproj" /> | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ManickaP unfortunately, this line fails with
NullReferenceException
in release builds. I assume theMsQuicLibraryVersion
is being trimmed away, since it's unused in the production code.We could workaround this by moving the version extraction to a shared test-utility (together with the MaxWorkerQueue hack helper), but IMHO it's not worth it unless we think that it's super-important to know the msquic version for stress test troubleshooting.
For now I'm just removing it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is it possible that there is image without MsQuic?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you mean? If you are suspecting lack of msquic as the root cause of this error - it's not the case. Removing code messing with MsQuicLibraryVersion makes things work (= HTTP/3 stress runs).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In that case you'd get "unknown" as the MsQuic version, the code expects that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Another option would be to tell the trimmer to keep it there via
DynamicDependency
. And this is just one string.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should try to clarify whether test-only usage of
DynamicDependency
is ok, without that, I prefer to defensively assume it's not.