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.

Uzavřít epizodu, jejíž klient se nikdy nevrátil

Zabitý provider neposílá událost konce. Uzavřete epizodu, kterou zanechal otevřenou, na základě důkazů, právě jednou, bez nárokování práce, kterou neodvedl.

zaručeno Relace a předávkapokročilýoperátoragentzapisuje stav

Situace

Provider spadne, je zabit nebo ztratí spojení. Epizoda, kterou otevřel, je stále v state/sessions-open/, protože koncová událost, která by ji uzavřela, nikdy nedorazila. Ten soubor nevlastní nic: session start se stejným klíčem je navždy odmítnuto, continuity hlásí epizodu, ve které nikdo není, a práce, kterou další worker skutečně odvede, se nepřipíše žádné epizodě.

Smazat soubor by bylo nasnadě, a bylo by to špatně. Epizoda je záznam úseku práce a řádky účetní knihy, které orazítkovala, jsou jediným svědectvím o tom, co tento úsek obsahoval.

Co spouštíte

  • recover episodes --check: kandidáti, každý s posledním okamžikem, kdy je známo, že žil, a s tím, co by se s ním stalo
  • recover episodes: uzavře ty, jejichž důkazy říkají, že klient je pryč, a nic jiného

Každý krok zde čte úložiště přímo přes recover a ne přes session status, a je to záměrné: session status vypisuje startovací head epizody, což je v každém repozitáři, kde demonstrace běží, jiný commit, takže scénář, který by na něm tvrdil, by způsobil, že se publikovaný katalog liší od checkoutu, který jej vygeneroval.

Scénář

setup: session-stranded
given:
  - 'two episodes open here: one whose client is gone, and one this process is inside'
steps:
  - id: the-plan
    run: ['recover', 'episodes', '--check']
    note: 'every candidate is measured and the measurement is printed, including the ones nothing happens to'
    expect:
      exit: 0
      stdout_contains: ['last seen 2020-01-01T00:00:00Z', 'stranded:', 'live: this process is inside it', 'check: 1 action']
  - id: dry-run-wrote-nothing
    run: ['recover', 'episodes', '--check']
    note: 'the check is a dry run: the second one plans exactly what the first one did'
    expect:
      exit: 0
      stdout_contains: ['stranded:', 'check: 1 action']
  - id: recover
    run: ['recover', 'episodes']
    note: 'the stranded episode is closed into a record; the live one is untouched'
    expect:
      exit: 0
      stdout_contains: ['.ai/repo/sessions/', 'recovered: 1 action']
  - id: idempotent
    run: ['recover', 'episodes']
    note: 'a second run has nothing to do: one episode, one record'
    expect:
      exit: 0
      stdout_contains: ['nothing to recover']
  - id: still-live
    run: ['recover', 'episodes', '--check']
    note: 'the episode somebody is working in survived the sweep and is still listed as live'
    expect:
      exit: 0
      stdout_contains: ['live: this process is inside it', 'nothing to recover']
then:
  - 'an episode under the staleness threshold is never closed, and neither is the one this process resolves to'
  - 'an episode whose last sign of life cannot be read as a timestamp is skipped and counted, never closed'
  - 'the recovered record claims no commits and no changed files: the tree at recovery time belongs to whoever is working now'
  - 'the reason is a ledger event, session.recovered, naming the recovered episode rather than the recoverer'

Výsledek

Úložiště drží jeden záznam na epizodu a žádnou epizodu, ve které nikdo není. Záznam sám ve svém těle říká, že ho napsala obnova a na základě jakých důkazů — takže čtenář o měsíce později pozná uzavřenou epizodu od obnovené, a ani jednu od vymyšlené, protože obnova nezapisuje nic, co nedokáže doložit.

Scénář

Provedeno proti skutečnému nástroji v repozitáři připraveném pomocí session-stranded, při každém generování tohoto webu. To, co následuje, není popis toho, co by se mělo stát; je to to, co se stalo.

dáno

  • dvě epizody jsou zde otevřené: jedna, jejíž klient je pryč, a jedna, ve které tento proces je

kdy

  1. 1majordomus recover episodes --check
  2. 2majordomus recover episodes --check
  3. 3majordomus recover episodes
  4. 4majordomus recover episodes
  5. 5majordomus recover episodes --check

pak

  • epizoda pod prahem zastaralosti se nikdy nezavře, ani ta, na kterou se tento proces vyřeší
  • epizoda, jejíž poslední známku života nelze přečíst jako časové razítko, se přeskočí a započítá, nikdy neuzavře
  • obnovený záznam netvrdí žádné commity ani změněné soubory: strom v době obnovy patří tomu, kdo právě pracuje
  • důvodem je událost knihy, session.recovered, jmenující obnovenou epizodu, ne obnovitele

Co nástroj udělal

Důkaz běhu, z něhož byla tato stránka vygenerována: pass, 5 kroků. Výstup je normalizován: cesta repozitáře, časová razítka, id a doby trvání jsou zástupné hodnoty; nic dalšího se neupravuje.

Testováno v test/cases/94_use_cases.sh, který spouští každý scénář a odmítne krok, jehož zaznamenaný výstup není tím, co vyprodukoval.

  1. každý kandidát je změřen a měření se vypíše, včetně těch, se kterými se nic nestane

    episodes — open episodes in .ai/local/state/sessions-open
      s-<id>  key=gone-client  last seen <time> (ledger, <age> ago)
        stranded: <age> ago, over the 12h threshold; close with outcome interrupted
      s-<id>  key=this-client  last seen <time> (ledger, <age> ago)
        live: this process is inside it; never a candidate
    
    check: 1 action(s) would be taken and nothing was written (run: majordomus recover all)
    • exit 0
    • stdout_contains /last seen 2020-01-01T00:00:00Z/
    • stdout_contains /stranded:/
    • stdout_contains /live: this process is inside it/
    • stdout_contains /check: 1 action/
  2. kontrola je dry run: druhá naplánuje přesně to, co udělala první

    episodes — open episodes in .ai/local/state/sessions-open
      s-<id>  key=gone-client  last seen <time> (ledger, <age> ago)
        stranded: <age> ago, over the 12h threshold; close with outcome interrupted
      s-<id>  key=this-client  last seen <time> (ledger, <age> ago)
        live: this process is inside it; never a candidate
    
    check: 1 action(s) would be taken and nothing was written (run: majordomus recover all)
    • exit 0
    • stdout_contains /stranded:/
    • stdout_contains /check: 1 action/
  3. uvízlá epizoda se uzavře do záznamu; živá zůstane nedotčena

    episodes — open episodes in .ai/local/state/sessions-open
      s-<id>  key=gone-client  last seen <time> (ledger, <age> ago)
        stranded: <age> ago, over the 12h threshold; close with outcome interrupted
        wrote .ai/repo/sessions/<time>--s-<id>--main--<head>--<hash>.md
      s-<id>  key=this-client  last seen <time> (ledger, <age> ago)
        live: this process is inside it; never a candidate
    
    recovered: 1 action(s); re-running this command now takes none
    • exit 0
    • stdout_contains /.ai/repo/sessions//
    • stdout_contains /recovered: 1 action/
  4. druhý běh nemá co dělat: jedna epizoda, jeden záznam

    episodes — open episodes in .ai/local/state/sessions-open
      s-<id>  key=this-client  last seen <time> (ledger, <age> ago)
        live: this process is inside it; never a candidate
    
    nothing to recover; the stores are as the contract describes them
    • exit 0
    • stdout_contains /nothing to recover/
  5. epizoda, ve které někdo pracuje, přežila úklid a je stále vedena jako živá

    episodes — open episodes in .ai/local/state/sessions-open
      s-<id>  key=this-client  last seen <time> (ledger, <age> ago)
        live: this process is inside it; never a candidate
    
    nothing to recover; the stores are as the contract describes them
    • exit 0
    • stdout_contains /live: this process is inside it/
    • stdout_contains /nothing to recover/

Proč to nástroj ví

Řetězec od této stránky ke kódu: případ užití jmenuje příkazy, pravidla a tvrzení; každé pravidlo se dispatchuje z registru a každé tvrzení jmenuje test, který ho dokazuje; scénář výše provedl příkazy. Nic v tomto řetězci není text o záměru.

Související případy užití

Vypočteno z toho, co sdílejí: tvrzení, pravidla, příkazy, kategorie, aplikace. Tento seznam nikdo neudržuje.

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