I2128 — Pronájem odstraní jen proces, který jej drží, a serve stop zastaví server řádně
Podmínit každé odstranění i každé přepsání souboru lease tím, že jednající jej stále drží, a SIGTERM, který posílá serve stop, přeměnit na uspořádané zastavení, které server už má.
HOTOVO vlna 0 · p1 · profil implementation · běží samostatně
Cíl
Podmínit každé odstranění i každé přepsání souboru lease tím, že jednající jej stále drží, a SIGTERM, který posílá serve stop, přeměnit na uspořádané zastavení, které server už má.
Proč
Tři nálezy. Obsluha signálu odstraní lease, kdykoli je nastaveno HELD, a znovu vyvolá signál s SIG_DFL (apps/majordomus-cli/src/lease.rs:1164-1212, unlink na 1197-1211), takže mezi převzetím a dalším 500ms tikem starého vlastníka SIGTERM staremu vlastníkovi odstraní lease nového vlastníka. take_over čte, porovná a pak volá remove_file (apps/majordomus-cli/src/lease.rs:778-798) ve třech krocích, takže dva voliči, kteří oba usoudili, že lease je zastaralý, se mohou proložit a druhý odstraní čerstvý lease prvního; publish zkontroluje is_mine a pak přejmenuje pevný dočasný název server.json.tmp (apps/majordomus-cli/src/lease.rs:1082-1107) bez fsync, takže převzetí mezi kontrolou a přejmenováním je přepsáno. serve stop posílá SIGTERM (apps/majordomus-cli/src/commands/serve.rs:814,890-903) a SharedServer::stop (apps/majordomus-cli/src/shared.rs:282-289, uzavření epizod a vyprázdnění meshe) se nikdy nespustí; apps/majordomus-cli/tests/mcp_shared.rs::sigterm_removes_the_lease_before_the_process_dies tvrdí, že proces umírá na signál 15, zatímco komentář v apps/majordomus-cli/src/shared.rs:274-281 naznačuje, že serve stop spouští uspořádané zastavení. Každé serve stop nechává otevřené epizody pro recover_orphans a přerušuje odpovědi za běhu. LeaseView.pid je zdokumentováno jako informativní (apps/majordomus-cli/src/capability/builtin/server.rs:236), ačkoli o živosti (apps/majordomus-cli/src/lease.rs:742), nároku na spuštění (apps/majordomus-cli/src/commands/serve.rs:354-356) a serve stop (apps/majordomus-cli/src/commands/serve.rs:814) se rozhoduje podle něj. Výchozí audit z 2026-10-09 na masteru 1fb8d6be44, mezery životního cyklu 5 a 11, drift 5 a 6. Řádné ukončení odpovědí za běhu v produkčním kontejneru je I0906 (fly-deployment); tento úkol pokrývá lease a epizody lokálně.
Aktuální stav
Odstranění lease signal handlerem a take_over nepřekontroluje token. serve stop je tvrdé zabití, které lease odstraní jako první.
Cílový stav
Smyčka serve převádí SIGTERM na příznak, který dotazuje, čeká omezenou dobu, než peeři odejdou, a spouští SharedServer::stop; teprve potom je lease uvolněna cestou, která kontroluje is_mine. take_over přejmenuje zastaralý soubor stranou pod vlastním tokenem a před nárokováním potvrdí, co přesunul. publish zapíše tmp soubor pojmenovaný podle svého tokenu a před přejmenováním jej synchronizuje. Druhý SIGTERM nebo uplynutí meze proces stále ukončí.
Rozsah
- apps/majordomus-cli/src/lease.rs
- apps/majordomus-cli/src/shared.rs
- apps/majordomus-cli/src/commands/serve.rs
- apps/majordomus-cli/src/capability/builtin/server.rs
- apps/majordomus-cli/tests/mcp_shared.rs
- apps/majordomus-cli/tests/serve_lifecycle.rs
- test/cases
- docs/MCP.md
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- SIGTERM serveru, jehož lease byl převzat ve stejném ticku, nechá soubor lease nového vlastníka na místě
- Po serve stop jsou epizody zastaveného serveru uzavřeny a recover_orphans žádnou z nich nenajde
- Dva electory, které oba usoudily, že lease je zastaralé, skončí s právě jedním lease, drženým procesem, který soubor jmenuje
- Zastavený proces skončí vlastním návratem, ne signálem 15, v dokumentovaném limitu serve stop
- Komentář v apps/majordomus-cli/src/shared.rs:274-281 a dokumentace LeaseView.pid popisují, co kód dělá
Validace
- bin/majordomus plan validate
- cargo test --test mcp_shared --test serve_lifecycle --test shared_units
- MJ_TEST_JOBS=4 bash test/run.sh 113_shared_server_survives_a_crash
Požadované důkazy
- sigterm_spares_a_successor_lease_test
- serve_stop_closes_episodes_test
- concurrent_takeover_test
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| sigterm_spares_a_successor_lease_test | ci | gh run view 38635619021 --log --job 116098148455 (validate na masteru c0e3585dc8, rust (3): cargo test --test lease_holder) | tests/lease_holder.rs sigterm_spares_a_successor_lease ... ok v běhu validate 38635619021 (success) na c0e3585dc8; dodáno commitem 632acc00d42 | c0e3585 |
| serve_stop_closes_episodes_test | ci | gh run view 38635619021 --log --job 116098148455 (validate na masteru c0e3585dc8, rust (3): cargo test --test lease_holder --test serve_lifecycle) | tests/lease_holder.rs serve_stop_ends_the_server_in_order_and_closes_its_episodes ... ok, s tests/serve_lifecycle.rs a_server_stops_on_a_signal_whether_it_reads_a_pipe_or_runs_unbounded ... ok, v validate běhu 38635619021 (success) na c0e3585dc8; dodáno v 632acc00d42 a 19fdd2a0db1 | c0e3585 |
| concurrent_takeover_test | ci | gh run view 38635619021 --log --job 116098148534 (validate on master c0e3585dc8, rust (2): cargo test --lib) | lease::tests::two_electors_that_judged_one_lease_stale_end_with_exactly_one_lease ... ok v běhu validate 38635619021 (success) na c0e3585dc8; dodáno v 632acc00d42 | c0e3585 |
Časová osa
- zahájeno
- 2026-10-15T04:32:23Z
- ověřeno
- 2026-10-15T04:32:30Z
- dokončeno
- 2026-10-15T04:32:47Z
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/I2128.yaml. Načtěte ho zpět pomocí majordomus plan show I2128.