2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2026-06-13 22:48:42 +00:00
Files
esiur-dotnet/Tests/Distribution/Deadlock/sweep.ps1
T
2026-06-03 22:11:34 +03:00

56 lines
3.3 KiB
PowerShell

# Scalability sweep for the distributed deadlock test (loopback).
# For each size, starts a fresh server hosting a ring of `nodes` plus `res1`+`res2` densely
# cross-referencing resources, then runs the client (WaitWithCycleDetection) and records the
# graph size, back-edges, cycle-breaks, and completion time. Output: sweep-results.csv / .md
$ErrorActionPreference = "SilentlyContinue"
Set-Location $PSScriptRoot\..\..\..
$srv = "Tests\Distribution\Deadlock\Server\bin\Release\net10.0\Esiur.Tests.Deadlock.Server.exe"
$cli = "Tests\Distribution\Deadlock\Client\bin\Release\net10.0\Esiur.Tests.Deadlock.Client.exe"
$sizes = @(25, 50, 100, 200, 400, 800)
$port = 11200
$rows = @()
foreach ($s in $sizes) {
$port++
Get-Process -Name "Esiur.Tests.Deadlock.Server" -ErrorAction SilentlyContinue | Stop-Process -Force
$so = "Tests\Distribution\Deadlock\sweep_srv_$s.txt"
Remove-Item $so -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $srv -ArgumentList "--port $port --topology ring --nodes $s --res1 $s --res2 $s" -PassThru -NoNewWindow -RedirectStandardOutput $so
# Wait until the server reports it is listening (poll up to 90s).
$census = ""
for ($t = 0; $t -lt 180; $t++) {
Start-Sleep -Milliseconds 500
$c = Get-Content $so -ErrorAction SilentlyContinue
if ($c -match "Listening") { $census = ($c | Select-Object -First 1); break }
}
$backEdges = if ($census -match "backEdges=(\d+)") { $matches[1] } else { "?" }
# Run the client; parse its summary.
$out = & $cli --host 127.0.0.1 --port $port --nodes $s --mode WaitWithCycleDetection --iterations 3 --stall-ms 30000 --hard-ms 180000 2>&1
$total = $s * 3
$median = ($out | Select-String "completion ms: median=([\d.]+)").Matches.Groups[1].Value
$attached = ($out | Select-String "resources attached per run \(max\)=(\d+)").Matches.Groups[1].Value
$breaks = ($out | Select-String "cycle-breaks total=(\d+)").Matches.Groups[1].Value
$completed = ($out | Select-String "completed=(\d+)").Matches.Groups[1].Value
$deadlocked = ($out | Select-String "deadlocked=(\d+)").Matches.Groups[1].Value
$rows += [pscustomobject]@{ nodes=$s; res1=$s; res2=$s; totalResources=$total; backEdges=$backEdges; attached=$attached; cycleBreaks=$breaks; medianMs=$median; completed=$completed; deadlocked=$deadlocked }
Write-Output "size=$s total=$total back=$backEdges attached=$attached breaks=$breaks median=$median ms completed=$completed"
Stop-Process -Id $p.Id -Force -ErrorAction SilentlyContinue
Get-Process -Name "Esiur.Tests.Deadlock.Server" -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Sleep -Seconds 1
}
$rows | Export-Csv -Path "Tests\Distribution\Deadlock\sweep-results.csv" -NoTypeInformation
$md = "| nodes | res1 | res2 | total resources | back-edges | attached/run | cycle-breaks(3 runs) | median ms | completed | deadlocked |`n"
$md += "|------:|-----:|-----:|----------------:|-----------:|-------------:|---------------------:|----------:|----------:|-----------:|`n"
foreach ($r in $rows) { $md += "| $($r.nodes) | $($r.res1) | $($r.res2) | $($r.totalResources) | $($r.backEdges) | $($r.attached) | $($r.cycleBreaks) | $($r.medianMs) | $($r.completed) | $($r.deadlocked) |`n" }
Set-Content -Path "Tests\Distribution\Deadlock\sweep-results.md" -Value $md -Encoding utf8
Write-Output "=== DONE ==="
Write-Output $md