Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
7295e1d
Lower practical RPS chart scales by one y-axis step when bars still c…
justcoding121 Oct 4, 2026
440efc5
Drop the Linux practical chart another 20k once the legend clears the…
justcoding121 Oct 4, 2026
0b69f55
Serve Plus cache hits on terminate-lite so a warmed GET skips the ori…
justcoding121 Oct 4, 2026
0753573
Run product and body RPS suites on every OS, and the rest on Linux.
justcoding121 Oct 4, 2026
d7a1bf7
Skip edition pairs that a shard CSV does not contain.
justcoding121 Oct 4, 2026
ec39642
Give the RPS suite check a token so it can see status artifacts.
justcoding121 Oct 4, 2026
1270e8e
Run every RPS suite mode on all three OS except Linux-only editions.
justcoding121 Oct 4, 2026
8cf8b77
Add the nginx prior-knowledge h2c check the product smoke probe calls.
justcoding121 Oct 4, 2026
5de6fed
Publish the Linux cache hit path and the three missing Plus rows.
justcoding121 Oct 4, 2026
10e3850
Publish the Linux Plus re-measure after the terminate-lite cache fix.
justcoding121 Oct 4, 2026
78af617
Drop the Windows and macOS MITM tables now that those arms are Linux-…
justcoding121 Oct 4, 2026
44e9a41
Drop the Windows columns from the Editions table.
justcoding121 Oct 4, 2026
de7186b
Merge branch 'beta' into develop
justcoding121 Oct 4, 2026
a40f92b
Point the Performance contents links at real heading anchors.
justcoding121 Oct 4, 2026
a887d44
Point same-page links at the heading ids GitHub and the website actua…
justcoding121 Oct 4, 2026
fc38a13
Clear the open Sonar code smells without changing per-frame HTTP/2 se…
justcoding121 Oct 4, 2026
68147e5
Keep the EnsureBodiesLoadedAsync overloads adjacent.
justcoding121 Oct 4, 2026
7fd3892
Merge pull request #1074 from justcoding121/fix/sonar-zero-smells
justcoding121 Oct 4, 2026
a3f6e9c
Update documentation
github-actions[bot] Oct 4, 2026
361a467
Make the response-cache helpers match the Sonar rules without touchin…
justcoding121 Oct 4, 2026
caa080b
Update documentation
github-actions[bot] Oct 4, 2026
65eec2b
Keep cache stores and H3 stream teardown allocation-free after the So…
justcoding121 Oct 4, 2026
ec13dbe
Update documentation
github-actions[bot] Oct 4, 2026
482f598
Spread HTTP/2 and HTTP/3 RPS load across many client connections so n…
justcoding121 Oct 4, 2026
2d6c5a6
Publish the many-connection RPS re-measure so the wiki matches the cl…
justcoding121 Oct 4, 2026
b3bf2c3
chore(release): bump product version to 7.0.17 for the next beta cut.
justcoding121 Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions .github/workflows/rps-saturation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ on:
required: false
type: string
default: ''
arm_excludes:
description: 'Drop arms whose name matches this substring (same syntax as arm_contains)'
required: false
type: string
default: ''
workflow_dispatch:
inputs:
mode:
Expand Down Expand Up @@ -243,6 +248,10 @@ on:
description: 'Optional arm-name substring filter (e.g. nc-tiny). Empty = all arms in mode.'
required: false
default: ''
arm_excludes:
description: 'Drop arms whose name matches this substring. Empty = keep every arm.'
required: false
default: ''

permissions:
contents: read
Expand All @@ -260,6 +269,7 @@ jobs:
RPS_REPEATS: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.repeats || 1 }}
RPS_ARM_SHARD: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.arm_shard || 'all' }}
RPS_ARM_CONTAINS: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.arm_contains || '' }}
RPS_ARM_EXCLUDES: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.arm_excludes || '' }}
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -890,6 +900,7 @@ jobs:
RPS_REPEATS: ${{ env.RPS_REPEATS }}
RPS_ARM_SHARD: ${{ env.RPS_ARM_SHARD }}
RPS_ARM_CONTAINS: ${{ env.RPS_ARM_CONTAINS }}
RPS_ARM_EXCLUDES: ${{ env.RPS_ARM_EXCLUDES }}
run: |
$hap = Join-Path $env:RUNNER_TEMP 'haproxy-quic/sbin/haproxy'
$hapArgs = @()
Expand All @@ -902,6 +913,10 @@ jobs:
Write-Host "Arm name filter: $($env:RPS_ARM_CONTAINS)"
$containsArgs = @('-ArmContains', $env:RPS_ARM_CONTAINS)
}
if ($env:RPS_ARM_EXCLUDES) {
Write-Host "Arm name exclude: $($env:RPS_ARM_EXCLUDES)"
$containsArgs += @('-ArmExcludes', $env:RPS_ARM_EXCLUDES)
}
pwsh tools/RpsLoadProbe/run-rps.ps1 `
-Mode $env:RPS_MODE `
-Concurrency $env:RPS_CONCURRENCY `
Expand Down Expand Up @@ -949,7 +964,8 @@ jobs:
-ResultsDir tools/RpsLoadProbe/results `
-Mode $env:RPS_MODE `
-ArmShard $env:RPS_ARM_SHARD `
-Repeats ([int]$env:RPS_REPEATS)
-Repeats ([int]$env:RPS_REPEATS) `
-ArmExcludes $env:RPS_ARM_EXCLUDES

# Post-ramp gates: hard-fail on every event (including workflow_dispatch).
# fail-fast: false keeps sibling OS jobs running; Upload CSV uses if: always().
Expand All @@ -962,7 +978,7 @@ jobs:
$csv = Get-ChildItem tools/RpsLoadProbe/results -Filter 'rps-ramp-*.csv' |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
if (-not $csv) { throw 'No CSV found for edition gate validation' }
pwsh tools/RpsLoadProbe/validate-edition-gates.ps1 -CsvPath $csv.FullName
pwsh tools/RpsLoadProbe/validate-edition-gates.ps1 -CsvPath $csv.FullName -AllowPartial

- name: Validate compare-product gates
id: gate-product
Expand Down
53 changes: 44 additions & 9 deletions .github/workflows/rps-suite.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
# One job per wiki row for a single ramp mode, on all three OS.
# One job per wiki row for a single ramp mode.
# Every mode runs on Windows, Linux, and macOS except compare-editions, which is Linux only.
# Skipped Windows and macOS jobs on editions must not fail the suite.
# compare-product on Windows and macOS drops twp-mitm-* arms. Linux keeps them in the same
# job as that row's reverse peers so Lite÷Reverse stays same-VM.
# compare-spot on beta/stable pull requests is not this workflow.
# Dispatch one run per mode (compare-product, compare-bodies, ...) so each table has one
# Source URL and the paste scripts, which look arms up by name, never mix modes.
# compare-saturation and compare-editions stay one job per OS (key "all"): saturation Block A
# compares proxy arms against origin-direct from the same job.
# compare-saturation stays one job per OS (key "all"): saturation Block A compares proxy
# arms against origin-direct from the same job. compare-editions is one group per wiki row;
# each group contains the feature arm and the baseline it is divided by.
#
# Free-plan account limits: 20 concurrent jobs, 5 of them macOS. This workflow caps each OS
# matrix itself; runs of different modes still queue together against the account limit.
Expand Down Expand Up @@ -41,6 +47,11 @@ on:
description: 'Concurrent Windows or Linux legs'
required: true
default: '15'
only_keys:
description: 'Comma-separated group keys (empty = every group for the mode)'
required: false
default: ''
type: string

permissions:
contents: read
Expand All @@ -66,10 +77,11 @@ jobs:
shell: pwsh
env:
SUITE_MODE: ${{ inputs.mode }}
ONLY_KEYS: ${{ inputs.only_keys }}
run: |
$ErrorActionPreference = 'Stop'
# These modes compare arms that must share a job, so they stay unsharded.
$unsharded = @('compare-saturation', 'compare-editions')
# Saturation compares proxy arms against origin-direct from the same job.
$unsharded = @('compare-saturation')
if ($unsharded -contains $env:SUITE_MODE) {
$keys = @('all')
}
Expand All @@ -87,6 +99,15 @@ jobs:
# Longest rows first so the slowest work starts in the first wave.
$keys = @($groups | Sort-Object Arms -Descending | Select-Object -ExpandProperty Key)
}
if (-not [string]::IsNullOrWhiteSpace($env:ONLY_KEYS)) {
$want = [System.Collections.Generic.HashSet[string]]::new([StringComparer]::OrdinalIgnoreCase)
foreach ($part in $env:ONLY_KEYS.Split(',')) {
$trimmed = $part.Trim()
if ($trimmed) { [void]$want.Add($trimmed) }
}
$keys = @($keys | Where-Object { $want.Contains($_) })
if ($keys.Count -eq 0) { throw "only_keys matched no groups: $($env:ONLY_KEYS)" }
}
Write-Host ("{0}: {1} group(s): {2}" -f $env:SUITE_MODE, $keys.Count, ($keys -join ', '))
# Piping a one-element array into ConvertTo-Json unwraps it to a JSON string.
# fromJSON then is not an array, and the OS matrices are skipped (saturation,
Expand Down Expand Up @@ -114,6 +135,7 @@ jobs:
windows:
name: ${{ inputs.mode }} / ${{ matrix.key }} / windows
needs: prep
if: ${{ inputs.mode != 'compare-editions' }}
strategy:
fail-fast: false
max-parallel: ${{ fromJSON(inputs.max_parallel_other) }}
Expand All @@ -125,10 +147,12 @@ jobs:
runner_os: windows-latest
arm_shard: ${{ matrix.key }}
repeats: ${{ inputs.repeats }}
arm_excludes: ${{ inputs.mode == 'compare-product' && 'twp-mitm-' || '' }}

macos:
name: ${{ inputs.mode }} / ${{ matrix.key }} / macos
needs: prep
if: ${{ inputs.mode != 'compare-editions' }}
strategy:
fail-fast: false
max-parallel: ${{ fromJSON(inputs.max_parallel_mac) }}
Expand All @@ -140,6 +164,7 @@ jobs:
runner_os: macos-15
arm_shard: ${{ matrix.key }}
repeats: ${{ inputs.repeats }}
arm_excludes: ${{ inputs.mode == 'compare-product' && 'twp-mitm-' || '' }}

aggregate:
name: aggregate ${{ inputs.mode }}
Expand All @@ -150,6 +175,7 @@ jobs:
- name: Check every row on every OS
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
SUITE_MODE: ${{ inputs.mode }}
KEYS_JSON: ${{ needs.prep.outputs.keys }}
LINUX_RESULT: ${{ needs.linux.result }}
Expand All @@ -159,8 +185,14 @@ jobs:
$ErrorActionPreference = 'Stop'
$keys = @($env:KEYS_JSON | ConvertFrom-Json)
$arts = gh api "repos/$env:GITHUB_REPOSITORY/actions/runs/$env:GITHUB_RUN_ID/artifacts?per_page=100" --paginate --jq '.artifacts[] | select(.name | startswith("rps-status-")) | .name'
if ($LASTEXITCODE -ne 0) { throw "Could not list status artifacts (gh exit $LASTEXITCODE)" }
$statusNames = @($arts | Where-Object { $_ })
$osLabels = [ordered]@{ linux = 'ubuntu-latest'; windows = 'windows-latest'; macos = 'macos-15' }
$linuxOnly = $env:SUITE_MODE -eq 'compare-editions'
$osLabels = [ordered]@{ linux = 'ubuntu-latest' }
if (-not $linuxOnly) {
$osLabels.windows = 'windows-latest'
$osLabels.macos = 'macos-15'
}
$missing = @()
foreach ($key in $keys) {
$label = ($key -replace '/', '-')
Expand All @@ -169,6 +201,7 @@ jobs:
if ($statusNames -notcontains $name) { $missing += $name }
}
}
$expected = if ($linuxOnly) { "$($keys.Count) x Linux only" } else { "$($keys.Count) x 3 OS" }
$summary = @(
"### RPS suite: $env:SUITE_MODE",
"",
Expand All @@ -178,7 +211,7 @@ jobs:
"| windows | $env:WINDOWS_RESULT |",
"| macos | $env:MACOS_RESULT |",
"",
"Expected rows: $($keys.Count) x 3 OS.",
"Expected rows: $expected.",
"Status artifacts found: $($statusNames.Count)."
)
if ($missing) {
Expand All @@ -187,8 +220,10 @@ jobs:
$summary += ($missing | ForEach-Object { "- $_" })
}
$summary -join "`n" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8
$osFailed = @($env:LINUX_RESULT, $env:WINDOWS_RESULT, $env:MACOS_RESULT) | Where-Object { $_ -ne 'success' }
$checked = @($env:LINUX_RESULT)
if (-not $linuxOnly) { $checked += @($env:WINDOWS_RESULT, $env:MACOS_RESULT) }
$osFailed = @($checked | Where-Object { $_ -ne 'success' })
if ($missing -or $osFailed) {
throw "Suite incomplete: $($missing.Count) status artifact(s) missing, OS results: linux=$env:LINUX_RESULT windows=$env:WINDOWS_RESULT macos=$env:MACOS_RESULT"
}
Write-Host "Suite complete: $($keys.Count) rows x 3 OS"
Write-Host "Suite complete: $expected"
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ <h3 id="constructors">Constructors
<a href="https://github.com/justcoding121/titanium-web-proxy/new/develop/apiSpec/new?filename=Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware__ctor_Titanium_Web_Proxy_Abstractions_Plugins_IHttpResponseCache_System_Nullable_System_TimeSpan__.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.%23ctor(Titanium.Web.Proxy.Abstractions.Plugins.IHttpResponseCache%2CSystem.Nullable%7BSystem.TimeSpan%7D)%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Edit this page</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/titanium-web-proxy/blob/develop/src/Titanium.Web.Proxy/Caching/HttpResponseCacheMiddleware.cs/#L22">View Source</a>
<a href="https://github.com/justcoding121/titanium-web-proxy/blob/develop/src/Titanium.Web.Proxy/Caching/HttpResponseCacheMiddleware.cs/#L27">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware__ctor_" data-uid="Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.#ctor*"></a>
<h4 id="Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware__ctor_Titanium_Web_Proxy_Abstractions_Plugins_IHttpResponseCache_System_Nullable_System_TimeSpan__" data-uid="Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.#ctor(Titanium.Web.Proxy.Abstractions.Plugins.IHttpResponseCache,System.Nullable{System.TimeSpan})">HttpResponseCacheMiddleware(IHttpResponseCache, TimeSpan?)</h4>
Expand Down Expand Up @@ -167,7 +167,7 @@ <h3 id="methods">Methods
<a href="https://github.com/justcoding121/titanium-web-proxy/new/develop/apiSpec/new?filename=Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware_InvokeAsync_Titanium_Web_Proxy_Abstractions_Middleware_ProxyMiddlewareContext_Titanium_Web_Proxy_Abstractions_Middleware_ProxyMiddlewareDelegate_System_Threading_CancellationToken_.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.InvokeAsync(Titanium.Web.Proxy.Abstractions.Middleware.ProxyMiddlewareContext%2CTitanium.Web.Proxy.Abstractions.Middleware.ProxyMiddlewareDelegate%2CSystem.Threading.CancellationToken)%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Edit this page</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/titanium-web-proxy/blob/develop/src/Titanium.Web.Proxy/Caching/HttpResponseCacheMiddleware.cs/#L28">View Source</a>
<a href="https://github.com/justcoding121/titanium-web-proxy/blob/develop/src/Titanium.Web.Proxy/Caching/HttpResponseCacheMiddleware.cs/#L33">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware_InvokeAsync_" data-uid="Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.InvokeAsync*"></a>
<h4 id="Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware_InvokeAsync_Titanium_Web_Proxy_Abstractions_Middleware_ProxyMiddlewareContext_Titanium_Web_Proxy_Abstractions_Middleware_ProxyMiddlewareDelegate_System_Threading_CancellationToken_" data-uid="Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.InvokeAsync(Titanium.Web.Proxy.Abstractions.Middleware.ProxyMiddlewareContext,Titanium.Web.Proxy.Abstractions.Middleware.ProxyMiddlewareDelegate,System.Threading.CancellationToken)">InvokeAsync(ProxyMiddlewareContext, ProxyMiddlewareDelegate, CancellationToken)</h4>
Expand Down Expand Up @@ -224,11 +224,11 @@ <h5 class="returns">Returns</h5>
<a href="https://github.com/justcoding121/titanium-web-proxy/new/develop/apiSpec/new?filename=Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware_TryCacheCurrentResponse_Titanium_Web_Proxy_EventArguments_SessionEventArgs_.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.TryCacheCurrentResponse(Titanium.Web.Proxy.EventArguments.SessionEventArgs)%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">Edit this page</a>
</span>
<span class="small pull-right mobile-hide">
<a href="https://github.com/justcoding121/titanium-web-proxy/blob/develop/src/Titanium.Web.Proxy/Caching/HttpResponseCacheMiddleware.cs/#L78">View Source</a>
<a href="https://github.com/justcoding121/titanium-web-proxy/blob/develop/src/Titanium.Web.Proxy/Caching/HttpResponseCacheMiddleware.cs/#L99">View Source</a>
</span>
<a id="Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware_TryCacheCurrentResponse_" data-uid="Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.TryCacheCurrentResponse*"></a>
<h4 id="Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware_TryCacheCurrentResponse_Titanium_Web_Proxy_EventArguments_SessionEventArgs_" data-uid="Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.TryCacheCurrentResponse(Titanium.Web.Proxy.EventArguments.SessionEventArgs)">TryCacheCurrentResponse(SessionEventArgs)</h4>
<div class="markdown level1 summary"><p>Call from <a class="xref" href="Titanium.Web.Proxy.ProxyServer.html#Titanium_Web_Proxy_ProxyServer_AfterResponse">AfterResponse</a> when caching upstream 200 bodies.</p>
<div class="markdown level1 summary"><p>Call from the session response path when a small 200 body is already buffered.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="declaration">Declaration</h5>
Expand Down Expand Up @@ -268,7 +268,7 @@ <h3 id="implements">Implements</h3>
<a href="https://github.com/justcoding121/titanium-web-proxy/new/develop/apiSpec/new?filename=Titanium_Web_Proxy_Caching_HttpResponseCacheMiddleware.md&amp;value=---%0Auid%3A%20Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A" class="contribution-link">Edit this page</a>
</li>
<li>
<a href="https://github.com/justcoding121/titanium-web-proxy/blob/develop/src/Titanium.Web.Proxy/Caching/HttpResponseCacheMiddleware.cs/#L17" class="contribution-link">View Source</a>
<a href="https://github.com/justcoding121/titanium-web-proxy/blob/develop/src/Titanium.Web.Proxy/Caching/HttpResponseCacheMiddleware.cs/#L19" class="contribution-link">View Source</a>
</li>
</ul>
</div>
Expand Down
Loading
Loading