Mit érint valójában egy számláló törlése
Egy számláló törlése itt ma 33 táblát ürít ki. Tegnap még 25-öt ürített.
A kimaradt nyolc mind az előző napon jött létre, délelőtt 11:10 és délután 15:10 között.
Hogyan működik a törlés
A tulajdonos törölheti a számlálóját. Ehhez POST-kérés, a tulajdonos tokenje és a számláló kézzel begépelt száma kell, mert a törlés nem vonható vissza. Semmi nem kerül félre: egy árnyékmásolat épp az ellenkezője lenne annak, amit kértek, az exportlinkek pedig ott vannak a gomb fölött annak, aki szeretne magának egy példányt.
Ezután egyetlen tranzakcióban kiürül egy táblalista, utolsóként a főtábla, és egy sírkő-bejegyzés kerül az archívumba, hogy a számot soha ne lehessen másnak kiadni. Ha bármelyik rész meghiúsul, az egész visszagörgetődik. Jobb, ha semmi sem törlődik, mint ha csak félig.
A fájlban a lista fölött ez a megjegyzés áll:
„Minden tábla, amely tud valamit erről a számlálóról. Listaként, nem szétszórva a kódban: ami innen hiányzik, az árva sorként marad vissza, és senki sem veszi észre.”
A megjegyzés egy nappal előre leírta a rést
Tegnap hat új tábla jelent meg egy új funkcióhoz — oldalon töltött idő, görgetési mélység, kilépési oldalak —, és mellettük még kettő. 11:10 és 15:10 között.
A törlési listát még aznap szerkesztették, hogy egy másik új táblát felvegyenek rá. A nyolc tábla ezután érkezett, a lista pedig többé nem változott. Így egy délutánon át egy számláló törlése 4 840 sornyi viselkedési adatot hagyott hátra, nyolc táblában szétszórva. A rést másnap megtalálták és bezárták; amit megmutatott, az az, hogy a lista teljességéhez az emlékezeten kívül valami másra is szükség van.
Ez nem a hanyagságról szóló történet. Valaki megírta a listát, pontosan értette, miért lista, leírta, mi történik, ha lemarad, és még aznap frissítette is egy táblával. És mégis lemaradt, mert két dolgot fejben tartva összhangban tartani olyasmi, amire az ember megbízhatóan képes, egészen addig a délutánig, amikor már nem.
A javítás és a másik javítás
A nyolc név most már szerepel a listán. Ábécérendbeli helyükre szúrtuk be őket, nem a végére fűztük, mert egy rendezett listában látszik a hiány, egy csak bővülő listában nem.
Ez a kis javítás. Ami igazán számít, az egy szkript, amely megkérdezi az adatbázistól, mely táblák hordoznak számlálószámot, a listát a forrásfájlból olvassa ki ahelyett, hogy megismételné, majd összeveti a kettőt. Aki új táblát vesz fel, egyszer lefuttatja. Nem lehet úgy elfelejteni, ahogy egy listát, mert nem tárol semmit — a választ minden alkalommal a sémából vezeti le.
Első futásakor mást is talált: 25 sort nyolc további táblában, amelyek számlálószáma sem az élő táblában, sem az archívumban nem szerepel. Nem törölt számlálók — azok sírkövet hagynak maguk után. Olyan számok, amelyek semmihez sem tartoznak, többségük nyilvánvaló tesztszám abból az időből, amikor az archívum-ellenőrzés még nem létezett. A sorokat a webgyökéren kívüli fájlba írtuk ki, majd eltávolítottuk.
Ami ebből általánosítható
Minden lista, amelyet valami mással összhangban kell tartani, előbb-utóbb elcsúszik, és a rés láthatatlan lesz, mert egy olyan lista, amelyből hiányzik egy elem, pontosan úgy néz ki, mint egy teljes lista.
A védekezés nem a fegyelem. Hanem az, hogy az egyik oldalt a másikból vezetjük le, és ellenőrizzük, hogy egyeznek-e — és ezt az ellenőrzést akkor futtatjuk, amikor valaki hozzáadja az új elemet, nem akkor, amikor valakinek eszébe jut.
A lista fölötti megjegyzésnek egyetlen szó kivételével mindenben igaza volt. Azt írta, senki sem veszi észre. Valaki észrevette, egy nappal később, mert szkripttel kereste, nem az emlékezetére hagyatkozva.