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.

Uzel mesh může nabízet sdílenou build cache, peerové ji zjišťují a vybírají a kompilace na ní nikdy nezávisí

Uzel mesh může nabízet sdílenou build cache, peerové ji zjišťují a vybírají a kompilace na ní nikdy nezávisí

majordomus://adr/adr-0157navrženo meshbuildcacheschopnost

odkazuje na

odkazuje na něj

157. Uzel mesh může nabízet sdílenou build cache, peeři ji objevují a vybírají a kompilace na ní nikdy nezávisí

Kontext

Dne 2026-10-13 cluster nemohl derivovat: oba deklarované offload hosty byly pod svým minimem volného místa 10 GiB (7 a 1), Mac vlastníka neměl volný disk a byl vyčištěn ručně a derive jednoho dokumentačního pull requestu stál třikrát za dvě hodiny třináct minut času kompilátoru, pokaždé ze studené cache. Každý stroj kompiluje stejný Rust pro stejné commity, každý do vlastní cache: ADR 0139 sdílí to, co cargo kompiluje, mezi worktree jednoho stroje a výslovně říká, že sccache „zůstává volitelné a není součástí tohoto rozhodnutí“. Nic nesdílí kompilaci mezi stroji.

Příkaz vlastníka téhož dne pojmenovává tvar: jeden uzel s velkým diskem (aarch64 Jetson s 783 GB volného místa) drží sdílené úložiště objektů, každý uzel používá nejdřív svůj lokální disk a pak toto úložiště a výsledek se ověřuje a validuje, nepředpokládá.

Rozhodnutí

  1. Schopnost, ne hostitel. Uzel může nabízet build-cache: protocol: s3, provider (nejdřív MinIO), scope: mesh, neutajovaný koncový bod, bucket, prioritu, kapacitu a rezervu a zdraví. Nic kanonického nejmenuje stroj; prvním poskytovatelem je ten uzel, který to nabízí. Klienti žádají o build-cache/s3.
  2. Nabízeno za běhu, necommitováno. Deklarace repozitáře drží jen politiku — které poskytovatele a protokoly přijímat, pojmenování bucketů, expiraci, minimální rezervu. Koncový bod je fakt o běžícím uzlu a putuje jako podepsaný, vypršující záznam mesh (nástěnka ADR 0044, živost žurnálu): poskytovatel, který se zastaví, je v rámci své životnosti zastaralý a nikdo neupravuje klienta. Soukromá adresa se nikdy nezapisuje do sledovaného souboru ani publikované stránky.
  3. Výběr je čistá funkce nabídek, politiky a naměřené latence: nejdřív zdravé, pak rozsah, priorita, rezerva, doba odezvy a id uzlu jako poslední deterministické rozhodnutí při shodě. Odpovídá zvolenou nabídkou a proč, včetně přeskočených kandidátů. Bez nabídky odpoví „žádná“ a to je normální odpověď.
  4. Klient se odvozuje, nikdy nenastavuje ručně. majordomus env vydává konfiguraci sccache pro vybranou nabídku — lokální disk jako první úroveň, nabídka jako druhá — a .envrc zůstává tenkým adaptérem, jakým je (project.envrc-is-an-adapter). Bez nabídky, nebo se sccache, který nezvládá dvě úrovně, je klient jen lokální, a bez sccache vůbec je build přesně takový, jaký býval.
  5. Cache je zrychlení, nikdy závislost. Provider, který je mimo provoz, pomalý, plný nebo odmítá přihlašovací údaj, musí nechat build správný a ne o mnoho pomalejší: klient se vrátí k lokální úrovni, selhání je diagnostika jmenující příčinu bez tajemství a sonda je omezená (rozpočet 80 ms pro environment/services.rs; neznámé, nikdy „nefunguje“).
  6. Nic přenositelného se nepředpokládá. Klíč cache je klíčem sccache: toolchain, cíl a příznaky. Zásah napříč architekturami se netvrdí; důkaz sdíleného zásahu se provádí mezi dvěma uzly jedné platformy, a kde nejsou dva, řekne to.
  7. Tajemství zůstávají mimo model. Nabídka, výběr, CLI, API, nástroj MCP, UI a dokumentace nenesou žádný klíč. Přihlašovací údaje klienta se na uzel zřizují s SSH přístupem vlastníka do souboru s režimem 0600 mimo repozitář, jeden klíč na uzel, který lze odvolat, a zápis bez něj úložiště odmítne.

Důsledky

  • Nejpomalejší věc, kterou uzel dělá — kompilace Rustu, který už jinde zkompiloval — se stává čtením z disku v LAN, pro každý uzel se stejným toolchainem a cílem.
  • Nový poskytovatel je záznam, ne změna kódu, a druhý poskytovatel je řazen, ne konfigurován.
  • Nová rodina operací (čtení nabídek a výběr, provisioning, ověření) se připojí k registru pomocí capability! a je promítnuta do CLI, MCP, HTTP a OpenAPI pomocí majordomus generate, jak vyžaduje docs/CAPABILITIES.md.
  • Inzertní datagram mesh je omezen velikostí; nabídka putuje deníkem jako záznam s expirací, ne inzercí UDP.

Zamítnuté alternativy

  • Commitnutý seznam endpointů. Je to druhý registr, který zahnívá při první změně adresy, a publikuje soukromou adresu.
  • Distribuovaná kompilace (sccache-dist, icecream). Přesouvá kompilátory mezi stroji jedné platformy a je mnohem větším povrchem důvěry a selhání než cache.
  • Učinit Jetson povinným, nebo ho pojmenovat. Poskytovatel, který nemůže chybět, není cache; a první hostitel je náhoda toho, který disk byl velký.
  • Zápis ~/.cargo/config.toml u peerů. Je to soubor uživatele. Odvozená konfigurace se exportuje přes prostředí a chybějící sccache je diagnostika, ne tichá úprava.

Změřeno 2026-10-13

První poskytovatel byl nastaven a ověřen dřív, než bylo toto rozhodnutí sepsáno, a měření ho mění:

  • MinIO už nepublikuje žádné binárky. dl.min.io odpovídá 410 Gone pro server i klienta; poslední zdrojová značka je RELEASE.2025-10-15T17-29-55Z. Poskytovatel zde byl sestaven z této značky (statický spustitelný soubor linux/arm64), což z něj dělá build, který za nás nikdo neudržuje. Proto je provider polem nabídky: server S3 s podporovanými releasy (Garage, SeaweedFS) jej nahradí bez změny modelu.
  • sccache 0.18.0 má obě úrovně (SCCACHE_MULTILEVEL_CHAIN=disk,s3, s SCCACHE_MULTILEVEL_WRITE_ERROR_POLICY). Bylo to přečteno ze spustitelného souboru, ne předpokládáno.
  • Byl ukázán skutečný vzdálený zásah: lokální úroveň byla smazána, druhá kompilace hlásila jeden zásah z úložiště a shodný objekt.
  • Poskytovatel, který je nedostupný při startu serveru sccache, shodí kompilaci (exit 2, žádný objekt): startovní kontrola úložiště je tvrdá chyba. Poskytovatel, který se zastaví, zatímco server běží, ne: kompilace uspěje jako minutí. Rozhodnutí 5 je tedy pravidlo o tom, kdy se druhá úroveň zařadí do řetězu — jen když je nabídka zdravá v okamžiku startu serveru — a ne jen o tom, co se děje po selhání.
  • Zápisy bez přihlašovacího údaje jsou odmítnuty (403), identita klienta nemůže vytvořit bucket ani se dostat do administračního rozhraní a vidí jen jeden bucket.

Ověření

Model a výběr dokazují unit testy (objevování, determinismus, žádná nabídka, zastaralá nabídka). Odvození klienta, záložní postup při zastaveném poskytovateli a odmítnutí neautentizovaného zápisu dokazuje test/cases/3013_a_mesh_build_cache.sh proti atrapě koncového bodu S3. Tvrzení, že druhý uzel zasáhne to, co zapsal první, je dokázáno na dvou skutečných uzlech jedné platformy, nebo ohlášeno jako nedokázané. Akceptací je kontrakt balíčku, který vlastník založil (majordomus-jetson-mesh-cache-claude-pack/contracts/acceptance.md), položku po položce.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0157-the-mesh-offers-a-shared-build-cache.md
identity
adr-0157
dostupné také jako
Zdroj MCP majordomus://adr/adr-0157 · majordomus entity show adr/adr-0157 · GET /api/v1/entity?uri=majordomus://adr/adr-0157
v Cockpitu
/cockpit/objects/adr/adr-0157

Tato stránka je generována z výše uvedeného souboru pomocí scripts/generate-site-data; úprava stránky nic nemění, úprava souboru změní všechna rozhraní. Výše uvedené vztahy jsou hrany docs/generated/graph.json, které spustitelný program zapisuje ze stejného indexu.

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