Zdůvodnění
Sdílený server je jediný proces, na kterém závisí několik klientů, a jeho jediným sdíleným stavem je jeden soubor lease pod lokální polovinou vrstvy v checkoutu. Cokoli, co v něm může po pádu, ukončení procesu nebo zkopírování checkoutu zůstat, je způsob, jak jeden klient zamkne ostatní, a repozitář, jehož lokální polovina odmítá zápisy, by jinak odmítl každého klienta. Návrh démona odmítá; na oplátku dluží, že proces, který klient spustil, nikdy neselže v obsluze tohoto klienta kvůli tomu, co po sobě nechal jiný proces.
Požadované chování
Pod apps/majordomus-cli/:
- Volba čte lease při každém pokusu a klasifikuje ho. K serveru, který odpovídá za tento kořen, se připojí. Lease, jehož server neodpovídá, soubor, který není dokumentem leasu, prázdný soubor a lease, jehož vlastník nepublikoval žádné URL v rámci bind grace, se každý převezme a log říká který. Na lease bez URL, který je mladší než grace, se čeká. Pokus je omezen časem, nikdy počtem kol.
- Když nelze lease vytvořit, připojit se k němu ani ho nahradit, nebo se nedá spustit sdílený server,
majordomus mcpobslouží svého klienta samostatně, jako to dělá--standalone, a zalogujecannot use the shared servers cestou a důvodem. Vlastní chyby vrstvy (žádný manifest,--strictodmítající degradovaný index) stále končí svými kódy: degradace se týká sdílení, nikdy vrstvy. - Most, jehož server zmizel, volí znovu při své další zprávě; když nemůže ani poskytovat, ani se připojit, platí tentýž degrade dřív, než k nějaké chybě dojde u klienta.
SIGTERM,SIGINTaSIGHUPodstraní lease dřív, než proces signálem zemře.kill -9nelze zachytit; zastaralý lease, který zanechá, spadá pod první bod.- Server, jehož vlastník odešel, končí s poslední připojenou relací; relace HTTP, která se nikdy nerozloučí, vyprší při časovém limitu nečinnosti, takže server nepřežije své klienty o víc než tento limit.
- Server, jehož lease byl převzat, přestane jednat jako server checkoutu a řekne to dřív, než se kdokoli musí ptát podruhé. Jeho index odpovídá
leaseholder: false; sonda, kterou prochází každý čtenář zapamatované adresy, ho odmítne; novéinitializeje odmítnuto s důvodem a s tím, kde je aktuální server; a jeho vlastní zpráva o zdraví říká, že to, co popisuje, je jiný proces. Relace, které už měl, pokračují a proces s nimi skončí — klient uprostřed odpovědi nepřijde o server jen proto, že někdo znovu sestavil spustitelný soubor. Co nesmí nikdy udělat, je převzít klienta, který mohl mít ten skutečný: takový klient dostane nástěnku peerů, historii provádění a generaci vrstvy, které žádný jiný klient checkoutu nevidí, a žádná odpověď to neříká. - Launcher, který klient spouští (
bin/majordomus-cli mcp), nikdy neodmítne klienta pro nedostatek executable, který mohl spustit. Když tento checkout žádný nemá nebo jej nemůže sestavit (žádný cargo, méně volného místa než práh buildu, selhaný build), spustí nainstalovaný release a na stderr pojmenuje release a důvod; jakýkoli jiný příkaz si ponechá exit 12, zastaralý executable, který lze přebudovat, se přebuduje a soubor uvnitř repozitáře nebo ten, který neodpovídá na--version, se nikdy nepovažuje za nainstalovaný release (ADR 0172). - Navázání na adresu, která není loopback, se servíruje s varováním, které pojmenovává, co vystavuje.
- Přemostěná relace a restartovaný server odpovídají bajt po bajtu stejně jako lokální relace.
Každý bod výše dokládá pojmenovaný případ v tests/mcp_shared.rs, v tests/lease_lost.rs nebo v test/cases/90_mcp_shared_server.sh a změna kteréhokoli z nich přistává se svým případem.
Chování při selhání
CI selže: cargo test spouští tests/mcp_shared.rs v jobu rust a test/run.sh spouští případ 90 v jobech test a pages. Recenzent odmítne změnu leasu, volby, failoveru mostu nebo zpracování signálů, která nepřichází se svým případem, a stránku tvrzení pro mcp-lease-resilience, jejíž test už nejmenuje dané chování.
Ověření
RUSTFLAGS='' cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test mcp_shared, RUSTFLAGS='' cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test lease_lost, bash test/run.sh 90_mcp_shared_server, bash test/run.sh 3177_a_client_always_gets_a_server, scripts/rust-check a tvrzení mcp-lease-resilience a mcp-client-always-served v docs/CLAIMS.yaml.