Ročne Plaťte ročne a získajte 2 mesiace zadarmo pri každom platenom pláne. Zobraziť plány
Prihlásiť sa Začnite zadarmo

Stránka spotreby ukazovala viac, a nepohol sa ani halier

Začnime tým, čo sa pri čítaní zvyšku najľahšie stratí: žiadne peniaze neboli odobraté. Žiadna peňaženka nebola strhnutá dvakrát, žiadna karta nebola zúčtovaná, žiadny limit predplatného nebol minutý na prácu, ktorá sa ni…

Začnime tým, čo sa pri čítaní zvyšku najľahšie stratí: žiadne peniaze neboli odobraté. Žiadna peňaženka nebola strhnutá dvakrát, žiadna karta nebola zúčtovaná, žiadny limit predplatného nebol minutý na prácu, ktorá sa nikdy nestala.

Pokazené bolo číslo na obrazovke. Pri niektorých účtoch ukazoval rozpis spotreby na tvojej vlastnej stránke účtu viac — pri najhoršom, ktorý sme odmerali, 2,4-násobok účtovnej knihy, ktorú má zhŕňať. Kniha bola po celý čas správna. Rovnako mesačné stropy, ktoré sa čítajú úplne inde. Bola to chyba zobrazenia, je opravená, a toto bola jej príčina.

Kľúč, ktorý hľadal niečo, čo nikto nezapísal

Práca, ktorá vznikne kvôli niečomu, čo si urobil — aktualizácia denného súhrnu spotreby, pripísanie odporúčania, rozposlanie upozornenia — sa nedeje vnútri tvojej požiadavky. Požiadavka zapíše správu a konzument na pozadí ju o chvíľu vyzdvihne; práve to bráni tomu, aby pomalý vedľajší efekt spomalil rýchlu stránku.

Nebezpečenstvom takého usporiadania je urobiť tú istú prácu dvakrát, lebo broker po zádrhu ochotne doručí tú istú správu znova. Obranou je schránka: pred spracovaním si konzument správu nárokuje zápisom riadku nesúceho kľúč tej správy, a jedinečný index robí druhý nárok nemožným.

Ten náš si nárokoval cez dvojicu — nájomca, ktorému správa patrila, plus kľúč správy — a túto dvojicu vyhľadával proti identifikátoru nájomcu, ktorý nesie obálka správy a ktorý je vyplnený.

Nárokovacie riadky nenesli identifikátor nájomcu vôbec. Každý bol prázdny, a bol taký od začiatku. Vlastná dokumentácia entity doslova tvrdila, že ho framework pri vkladaní opečiatkuje. Nikdy to neurobil. Odmerané proti produkcii v deň, keď sme to našli: všetkých 3 344 riadkov schránky prázdnych, zatiaľ čo 1 174 z 1 451 riadkov na produkujúcej strane nieslo skutočného nájomcu — presne preto nikto nepodozrieval čítajúcu stranu.

Vyhľadávanie teda žiadalo (nájomca, kľúč), uložený riadok bol (nič, kľúč), a nikdy sa nemohli zhodovať.

Nič nezlyhalo, a práve preto to bežalo týždne

Vyhľadávanie, ktoré sa nikdy nemôže zhodnúť, znie ako niečo, čo by malo na prvý pokus vyhodiť chybu. Urobilo pravý opak.

Nárok rozhodol, že správa je nová. Vloženie potom narazilo na jedinečný index a bolo odmietnuté ako duplicita — správne, lebo riadok tam už bol. Záložná vetva to odmietnutie zachytila a prečítala ho láskavo: zrejme si to nárokovalo iné doručenie, tu niet čo robiť. Obálka zostala v stave „ešte na spracovanie", a keďže bola ešte na spracovanie, ďalšie doručenie ju vyzdvihlo a prácu urobilo znova.

Každý konzument nanovo spracúval svoj vlastný nevybavený objem zhruba každých štyridsaťpäť sekúnd, donekonečna. Robilo to dvadsaťšesť z nich. Jeden produkčný riadok sa dokončil 333 hodín po svojom príchode — a väčšinu toho času sa dokončoval znova a znova.

Čo to vlastne pokazilo

Z tých dvadsiatich šiestich konzumentov štyria akumulujú namiesto prepisovania. Tí štyria sú fakturačné projekcie, ktoré číta stránka spotreby, a práve tam to vyplávalo na povrch.

Mali výslovnú ochranu presne proti tomuto, napísanú po augustovom incidente, keď sa jediná udalosť aplikovala na ukazovateľ deväťkrát. Ochrana označí riadok ako úspešný pred spracovaním, aby opakované doručenie značku našlo a zastavilo sa. Značka sa zakaždým zapísala správne. Ďalší nárok ju potom hľadal tým istým pokazeným kľúčom a nenašiel ju. Tá záruka bola prázdna odo dňa, keď bola vydaná.

Čoho sa to nedotklo, stojí za presný výpočet, lebo „fakturačná projekcia" znie poplašne a fakty poplašné nie sú:

  • Účtovná kniha bola správna. Každé volanie AI zapisuje presne jeden fakturačný záznam s vlastnou snímkou ceny a nič na tejto ceste ich nezapisuje.
  • Žiadna peňaženka sa nepohla. Zostatky pochádzajú z knihy, nikdy zo súhrnu.
  • Žiadny strop sa nepohol. Strážca rozpočtu číta samostatné počítadlo, a to je jediný zdroj pravdy o tom, koľko si tento mesiac minul. Nikto nebol kvôli nafúknutému číslu odstrihnutý skôr a nikto neprešiel, kto nemal.

Jediné, čo dotknutý súhrn číta, je história spotreby na tvojej vlastnej stránke účtu — tvoj súčet a rozpis toho, na čo šiel. To je celý polomer dopadu, a spočíval v tom, že ukazoval viac.

Polovica, na ktorú sa nikto nepozeral

To isté pokazené vyhľadávanie sedelo na druhom mieste: na ceste, ktorá beží, keď správa zlyhá. Tam nikdy nenašlo riadok, ktorý malo aktualizovať, a hneď pod ním sedela vetva s komentárom „v praxi nedosiahnuteľné" — vracajúca pri každom zlyhaní „toto zlyhanie je konečné".

Počítadlo opakovaní sa teda nikdy neposunulo a žiadna otrávená správa sa nikdy nedostala do frontu nedoručiteľných. Celá vrstva spracovania chýb bola vypnutá, za komentárom, ktorý každému čitateľovi hovoril, že tu niet čo kontrolovať.

Oprava

Obe vyhľadávania teraz kľúčujú podľa kľúča správy v rámci skupiny konzumentov, čo je to, čo jedinečný index aj tak vynucuje. Kľúče správ sa odvodzujú od identifikátora toho, čo ich vytvorilo, takže z podstaty nemôžu kolidovať naprieč nájomcami.

Dokumentácia, ktorá tvrdila to opečiatkovanie, bola opravená, nie zmazaná. Tá veta bola tou pascou a zmazať ju by znamenalo nezanechať nič, čo hovorí, že to konečne niekto preveril.

Správanie istí deväť testov. Šesť z nich na starom kóde padá, čo sme potvrdili tým, že sme starý kód vrátili späť.

Upratovanie potom

Nafúknuté riadky sa opravia samy. Worker každú hodinu prestavuje denné súhrny z účtovnej knihy, v okne dvoch dní. Bežal celý čas a prehrával: raz za hodinu proti konzumentovi, ktorý aplikuje znova každých štyridsaťpäť sekúnd, nie je férové preteky.

Keď sa už konzument neopakuje, vyhráva. Dva dni, ktoré ešte spadali do toho okna, boli z knihy prestavané, len čo bola oprava nasadená. Dva skoršie dni už z okna vypadli a to, čo na nich zostáva, je náš vlastný účet plus jeden zanedbateľný rozdiel inde — nechali sme ich teda tak, namiesto toho, aby sme kvôli tomu rozširovali okno v produkcii. Zdalo sa to lepšie než naznačovať, že upratovanie bolo úplné.

Čo sme si z toho odniesli

Deduplikačný kľúč musí zrkadliť to, čo index skutočne vynucuje, nie to, čo si kód myslí, že bolo zapísané. Dve polovice tohto kľúča sa plnili z rôznych polí a ani jedna nikdy nebola zmeraná proti druhej. Teraz sú obe, a test, ktorý to dokazuje, je proti chybnej verzii červený.

Zdieľať LinkedIn X E-mail
Vyskúšajte to na vlastnej práciKaždá odpoveď ukazuje, koľko stála. Začnite s bezplatným plánom. Začnite zadarmo
Novinky o produkte, žiadny šum Nové modely, funkcie a hlavné body changelogu – krátky e-mail, keď naozaj niečo vyjde.
Prihlásením súhlasíte so zasielaním e-mailov s novinkami produktu ToRun. Odhlásiť sa môžete kedykoľvek. Zásady ochrany osobných údajov