Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

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ě

Součást runtime-lifecycle — Jeden použitelný server na checkout se spouští, připojuje, zastavuje a hlásí svůj stav bez souběhů a skrytých zabití.

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átypcommandvýsledeku commitu
sigterm_spares_a_successor_lease_testcigh 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 632acc00d42c0e3585
serve_stop_closes_episodes_testcigh 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 19fdd2a0db1c0e3585
concurrent_takeover_testcigh 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 632acc00d42c0e3585

Č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.

Prohledává názvy a popisy všech stránek, které tento web publikuje.