gates / gates (push) Successful in 2m29s
- audits/linetest-2026-10-27/: the hold failed four times as built (qBittorrent drains ~14 s), the fix 710ceac, the test through the hold on 0.346.0-rc.1 (94.5 Mbit/s, the limit back exactly), teardown. - audits/release-2026-10-27/: builds, agent release + signed updates, per-box and global floors, box walk. - 09 §3 decisions 269 (R-1250 fix the same day) and 270 (R-1218 live proof waived); D55's window result in 268. - 08 §: the drain-wait design line. STATUS, CONTEXT, register (223 -> 214).
54 lines
3.9 KiB
Markdown
54 lines
3.9 KiB
Markdown
# Line test on a seeding box, 2026-10-27 (R-1250, R-1261) — the hold failed as built, was fixed, and then held
|
||
|
||
Venue: demo-hp guest 9201 (controller 0.345.1, then `0.346.0-rc.1`; agent 0.166.0), a THROWAWAY qBittorrent ("qbline",
|
||
installed and removed through the product), seeding a private 3 GiB sparse file to DooPlex's qBittorrent (download
|
||
only, capped 3–4 Mbit/s, operator yes 2026-10-25). DooPlex's qBittorrent is reachable only inside the cluster, so it
|
||
dialled the seed through a small forwarder on 9201 (`tools/fwd.py`, LAN :6881 → the container). Method: reads of the
|
||
controller log, the agent journal, qBittorrent's own API and the interface counters. Nothing forced the line test.
|
||
|
||
## What the agent's slot is
|
||
|
||
demo-hp's slot is NOT 10:00: `slot_minute=95` (the agent's start line), so its test may start from 11:35 CET. Tester 1's
|
||
is 213 (13:33), demo-felhom's 20 (10:20). The seed was paused on DooPlex from 10:20 to 11:15 so it ran across 11:35
|
||
(`dooplex-add.txt`).
|
||
|
||
## Before the fix — four holds, four refusals (controller 0.345.1)
|
||
|
||
11:36, 11:51, 12:06, 12:21 CET: the controller held qBittorrent at 1 KiB/s, asked the agent, put the limit back
|
||
exactly (5898240 B/s), and the agent refused „not quiet" — 4.2, 4.2, 4.0, 4.0 Mbit/s while held
|
||
(`controller-upwatch-0345-refusals.txt`, `agent-demohp-day.txt`). **The 0.345.1 container's log was dropped when the rc
|
||
replaced it**; the refusal lines were recovered from this session's reads of the watcher's copies (said in that file's
|
||
header). The agent's journal holds the same four refusals independently.
|
||
|
||
Why, measured three ways:
|
||
|
||
1. `sec1-guest.txt` / `sec1-host.txt` (12:05:40–12:08 CET, one sample per second at the container, the guest and the
|
||
host NIC): during the 12:06:17–12:06:32 hold the CONTAINER itself kept sending 2–11 Mbit/s each second — the
|
||
forwarder was not the cause.
|
||
2. `udp-queues.txt`: the transfer is uTP (no TCP socket); every UDP queue was 0 — no buffering outside qBittorrent.
|
||
3. `qbsec-2-clean.txt` (the 12:21 hold) and `limitprobe.txt` (12:27, the controller's own 1 KiB/s value set by hand for
|
||
60 s on the throwaway, then the exact value back; no test started): qBittorrent reports its limit as 1024 within a
|
||
second, yet sends at full speed for **~14 s**, then 0. The agent reads the uplink 5–15 s after the call
|
||
(`RequestSettle` 5 s + `RequestQuietWindow` 10 s), inside that drain — so every test on request was refused.
|
||
|
||
## The fix (operator's choice 2026-10-27: fix in the controller now) — felhom-controller `710ceac`
|
||
|
||
After the hold, `upwatch.waitDrained` polls each held app's OWN upload (`up_info_speed` / Transmission `uploadSpeed`)
|
||
until ≤ 16 KiB/s twice, 2 s apart (at most 90 s; an unreadable speed waits 20 s), and only then asks the agent. Five
|
||
tests, red-proved by four mutations (`redproof-r1250-drain.txt`).
|
||
|
||
## After the fix — the test ran through the hold (`0.346.0-rc.1` on 9201 from 13:24 CET)
|
||
|
||
`rc1-hold-proof.txt`: 13:39:56 held → 13:40:20 „the held app(s) slowed down after 22s — asking the agent" → three runs
|
||
94.5 / 93.4 / 94.4 Mbit/s → **94.5 Mbit/s** stored (`last_ok_at` 12:40:35Z) → 13:41:17 the limit back as it was
|
||
(5898240). The 50 % rule then KEPT the normal limit: the line moved 0.15 %, inside its 20 % band
|
||
(`qblimit.go` „kept"); no household flag; the alternative slot untouched (`upwatch-settings-after.txt`).
|
||
|
||
## Teardown (`teardown.txt`)
|
||
|
||
DooPlex: the torrent and its data removed, `/tmp/r1250` removed, 326 torrents as before, no category left. 9201: the
|
||
app removed through the product with `remove_hdd_data` and `remove_backups` FALSE — its download folder is the shared
|
||
library `media/torrents` (holding `movies`, `tv`, `.temp` from 14–15 October), and it made no backup today; its own
|
||
volume went with it. The forwarder stopped; the hand-made seed folder `r1250` and `/root/r1250` removed. Hub: nothing
|
||
provisioned. 9201 stayed on the rc until the per-box floor moved it to 0.346.0 (15:10 CET).
|