I2126 — Server zaneprázdněný voláním nástrojů se nikdy nepřebírá, jako by byl mrtvý
Zařídit, aby sonda lease dosáhla na server, jehož všichni HTTP workeři právě provádějí volání nástrojů, a aby prokázala, že dosáhla držitele lease, takže klientovi, který rozhoduje, zda vlastník žije, neodpoví plný pool workerů ani jiný proces.
HOTOVO vlna 0 · p1 · profil implementation · běží samostatně
Cíl
Zařídit, aby sonda lease dosáhla na server, jehož všichni HTTP workeři právě provádějí volání nástrojů, a aby prokázala, že dosáhla držitele lease, takže klientovi, který rozhoduje, zda vlastník žije, neodpoví plný pool workerů ani jiný proces.
Proč
Sonda, kterou klient posílá před převzetím, je GET / (apps/majordomus-cli/src/lease.rs:896-925), obsluhovaná týmiž čtyřmi workery (apps/majordomus-cli/src/http/server.rs:23), které synchronně spouštějí každé tools/call. Čtyři volání nástrojů, která přesáhnou timeout sondy plus odklad obsazenosti (asi 12 s, apps/majordomus-cli/src/lease.rs:43-62, 555-568), způsobí, že zdravý server vypadá zaseknutý, a další klient, který se spustí, převezme jeho lease. is_own (apps/majordomus-cli/src/lease.rs:429) opravuje jen server sondující sám sebe. GET / je také nejdražší trasa: rozkládá index a každý povrch, zatímco /api/v1/live a /api/v1/ready existují (apps/majordomus-cli/src/capability/builtin/health.rs:691,702) a sonda je nepoužívá. Sonda porovnává name, repository_id a leaseholder (apps/majordomus-cli/src/lease.rs:902-905), ale ne token lease, pid ani started_at, a GET / je nevystavuje. Výchozí audit z 2026-10-09 na masteru 1fb8d6be44, mezera životního cyklu 3 a řádek fencingu.
Aktuální stav
apps/majordomus-cli/tests/lease_busy.rs pokrývá živého vlastníka, který odpovídá pozdě, a toho, který neodpovídá nikdy; žádný test nezaměstná každého pracovníka, zatímco volí druhý klient, a žádná sonda token neporovnává.
Cílový stav
Pracovníci jen přijímají; každý požadavek se vyřizuje na vlastním vlákně až do MAX_HANDLERS (64), takže sonda lease dostane odpověď, zatímco běží pomalá volání nástrojů, a stop čeká ohraničenou dobu na předané požadavky. Odložená část, trasa sondy živosti nesoucí digest tokenu lease a kontrola, která odmítne server s odlišným tokenem, je I2700.
Rozsah
- apps/majordomus-cli/src/lease.rs
- apps/majordomus-cli/src/http/server.rs
- apps/majordomus-cli/src/http/router.rs
- apps/majordomus-cli/src/capability/builtin/health.rs
- apps/majordomus-cli/tests/lease_busy.rs
- test/cases
- docs/MCP.md
Závislosti
Žádné. Tento úkol je kořenem grafu.
Co na tom čeká
Kritéria přijetí
- Při čtyřech probíhajících voláních nástrojů, z nichž každé přesáhne timeout sondy plus nečinnou toleranci, se pátý klient připojí k běžícímu serveru a soubor lease zůstane beze změny
Validace
- bin/majordomus plan validate
- cargo test --test lease_busy --test mcp_shared
Požadované důkazy
- busy_pool_is_not_taken_over_test
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| busy_pool_is_not_taken_over_test | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test http_busy_probe busy_pool_is_not_taken_over_test | test result: ok. 2 passed; 0 failed (whole file) (run 2026-10-14 12:00-12:15Z on master 2ca25bb9cf plus this change) | 2ca25bb |
Časová osa
- zahájeno
- 2026-10-14T12:15:43Z
- ověřeno
- —
- dokončeno
- 2026-10-14T12:16:23Z
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Kanonický záznam: .ai/repo/project/issues/I2126.yaml. Přečtěte si ho zpět pomocí majordomus plan show I2126.