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.

Na stroji běží jedno odvození najednou a zastavené odvození nenechá osiřelé procesy

Na stroji běží jedno odvození najednou a zastavené odvození nenechá osiřelé procesy

majordomus://rule/project.one-derive-at-a-time@1aktivní odvozenomachinekoordinace

odkazuje na

Nic. Tento objekt nedeklaruje žádný odkaz.

Zdůvodnění

Derive přepíše každý commitnutý artefakt. Pod zátěží stojí od minut po hodinu jednoho stroje sdíleného každou relací pracující na tomto repozitáři. 2026-10-09 ho sdílelo devět relací při zátěži 57. Své derive serializovaly přes adresář zámku a prioritní značku vedle primárního checkoutu, ale konvence žila jen v obalech, které si napsaly kolem scripts/derive. Jeden just derive bez obalu běžel vedle zamčeného derive opravy. Zastavení zabilo shell a ne stupeň B: bash odkládá trap, dokud se nevrátí potomek v popředí. Takže generate-site-data běžel dál hodinu, přeřazen pod pid 1, bez jména kohokoli. Integrátor nejdřív obvinil špatnou relaci z držení zámku, který viděl.

Konvence, kterou si musí pamatovat každý pracovník, je konvence, na kterou jeden pracovník zapomene. Skript, který dělá drahou práci, je jediné místo, kterým prochází každé derive, takže zámek a úklid patří tam. Žijí v lib/machine_lock.sh, který scripts/derive sourcuje, takže ho může sourcovat i další skript, který stroj potřebuje. d1 postavil stejný zámek nezávisle (fix/a-derive-takes-the-machine-lock) a vyřadil jej kvůli přezkumu tohoto. Jeho čtení řádků vlastníka bez pid je to, které je zde zachováno.

Požadované chování

  • scripts/derive bere zámek dřív, než cokoli sestaví. Je to adresář vytvořený atomicky pomocí mkdir se souborem vlastníka <tag> <pid>. Výchozí je .derive.lock vedle primárního checkoutu, kde jej relace držely, odvozený ze společného adresáře gitu a nikdy nezapsaný jako cesta stroje. MAJORDOMUS_DERIVE_LOCK jej přepíše.
  • Pid držitele je pid=<n> řádku vlastníka, nebo jeho poslední slovo, a jen když je to číslo. Řádek bez číselného pidu, například ručně převzatý zámek nebo smyčka, která ukončila řádek časem, je živý držitel, kterého nelze zkontrolovat. Nikdy se nerekuperuje a nikdy se nebere za předka. Čeká se na něj a čekání vypíše ten řádek.
  • Je reentrantní: když je pid vlastníka předkem derive, volající drží zámek a derive běží pod ním a nechává jej volajícímu.
  • Zámek, jehož číselný pid vlastníka neběží, se převezme. Převzetí vypíše řádek mrtvého vlastníka. Nikdy není tiché.
  • Zámek uvolní jen proces, který zapsal řádek vlastníka, a jen dokud je řádek přesně tím, co zapsal.
  • Dokud vedle zámku existuje .derive.priority, který nejmenuje branch derive jako celé slovo, zámek se neberou. Značka jmenující feature/x-two nejmenuje feature/x. MAJORDOMUS_DERIVE_IGNORE_PRIORITY=1 je pro autora samotné značky, jehož derive běží pod jiným jménem.
  • Každá fáze běží jako potomek na pozadí pod wait, takže signál se zpracuje okamžitě. Při TERM, INT nebo HUP derive signalizuje každého potomka od nejhlubšího, zabije přeživší, uvolní zámek a skončí s 143, 130 nebo 129.
  • Derive, který najde osiřelý proces dřívějšího derive tohoto checkoutu (rodičovské pid 1, příkaz pod scripts/derive nebo scripts/generate-site-data tohoto checkoutu), jej i jeho strom před startem zastaví a pojmenuje. Řídí se tím project.reclaim-only-what-you-own: jen to, co spustil derive tohoto checkoutu, určené absolutní cestou skriptu a mrtvým rodičem, nikdy podle názvu procesu. scripts/reap-orphans drží stejnou disciplínu pro servery a výstup sestavení.
  • scripts/derive --locked -- <command> spustí příkaz, například celou suite, pod stejným zámkem a stejným zpracováním signálů.

Chování při selhání

Derive, který čeká, řekne proč, jednou za každý důvod: kdo drží zámek nebo co říká marker priority. Po MAJORDOMUS_DERIVE_WAIT_MAX sekundách (výchozí 14 400) to vzdá s kódem 75. Derive spuštěný mimo skript, přímým voláním jeho fází, je mimo vynucování tohoto pravidla a výrok pravidla to zakazuje.

Ověření

test/cases/1018_one_derive_at_a_time_and_no_orphans.sh pohání zámek přes --locked a pozorováním dokazuje tato chování:

  • převzetí a uvolnění zámku;
  • převzetí zámku mrtvého vlastníka se jménem vlastníka ve výstupu, pro obě podoby řádku vlastníka;
  • nikdy nepřebírá řádek vlastníka bez číselného pid, včetně dnešních ručně psaných a časově označených řádků;
  • uvolnit jen proces, jehož řádek to stále je;
  • čekání na živého vlastníka bez zásahu do jeho zámku a vzdání se s exit kódem 75;
  • čekání na značku, která jmenuje jinou větev, nebo delší větev s touto jako prefixem, a běh pro tu, která jmenuje tuto;
  • opětovný vstup pod starým wrapperem;
  • TERM, který nenechá běžet žádného vnuka ani zámek;
  • predikát osiřelosti, nad tabulkou procesů, kterou případ zapíše, který vybere přesně derive tohoto checkoutu s ppid 1 a nikdy derive jiného worktree, sourozence se shodným prefixem, vnořené cesty ani živý derive.

Každá z těchto mutací případ shodí: odstraněné zabití stromu, odstraněné oznámení o převzetí, odstraněná kontrola číselného pid, celoslovná shoda značky změněná na shodu podřetězce, odstraněná kontrola vlastníka při uvolnění a odstraněná slovní hranice cesty. Samotné zabití reaperem nemá živý důkaz: skutečný proces s ppid 1 nelze v testu přenosně vyrobit, takže jeho predikát se dokazuje nad fixture.

Odkud to pochází

kanonický soubor
.ai/repo/rules/project/one-derive-at-a-time.v1.md
identity
project.one-derive-at-a-time@1
dostupné také jako
Zdroj MCP majordomus://rule/project.one-derive-at-a-time@1 · majordomus entity show rule/project-one-derive-at-a-time-1 · GET /api/v1/entity?uri=majordomus://rule/project.one-derive-at-a-time@1
v Cockpitu
/cockpit/objects/rule/project-one-derive-at-a-time-1

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.