Letno Plačajte letno in pridobite 2 meseca brezplačno pri vsakem plačljivem paketu. Oglejte si pakete
Prijava Začni brezplačno

Stran porabe je kazala preveč, denar pa se ni premaknil

Začnimo s tistim, kar se ob branju preostanka najlaže izgubi: denar ni bil vzet. Nobena denarnica ni bila bremenjena dvakrat, nobena kartica ni bila obremenjena, nobena naročniška kvota ni bila porabljena za delo, ki se…

Začnimo s tistim, kar se ob branju preostanka najlaže izgubi: denar ni bil vzet. Nobena denarnica ni bila bremenjena dvakrat, nobena kartica ni bila obremenjena, nobena naročniška kvota ni bila porabljena za delo, ki se ni zgodilo.

Pokvarjena je bila številka na zaslonu. Pri nekaterih računih je razčlenitev porabe na tvoji lastni strani računa kazala preveč — pri najslabšem, ki smo ga izmerili, 2,4-kratnik glavne knjige, ki naj bi jo povzemala. Knjiga je bila ves čas pravilna. Prav tako mesečne zgornje meje, ki se berejo s povsem drugega mesta. Šlo je za napako prikaza, odpravljena je, in tukaj je njen vzrok.

Ključ, ki je iskal nekaj, česar nihče ni zapisal

Delo, ki nastane zaradi nečesa, kar si storil — posodobitev dnevnega povzetka porabe, knjiženje priporočila, razpošiljanje obvestila — se ne zgodi znotraj tvoje zahteve. Zahteva zapiše sporočilo, ozadnji porabnik pa ga trenutek zatem pobere; prav to preprečuje, da bi počasen stranski učinek upočasnil hitro stran.

Nevarnost te ureditve je, da se isto delo opravi dvakrat, saj posrednik po zatiku isto sporočilo rade volje dostavi znova. Obramba je prejemna mapa: pred obdelavo porabnik sporočilo prevzame tako, da zapiše vrstico s ključem tega sporočila, edinstveni indeks pa drugi prevzem onemogoči.

Naš je prevzemal po paru — najemnik, ki mu je sporočilo pripadalo, plus ključ sporočila — in ta par iskal glede na identifikator najemnika, ki ga nosi ovojnica sporočila in ki je izpolnjen.

Vrstice prevzema identifikatorja najemnika sploh niso nosile. Vsaka je bila prazna, in bila je taka že od začetka. Lastna dokumentacija entitete je dobesedno trdila, da ga ogrodje ob vstavljanju vtisne. Nikoli ga ni. Izmerjeno na produkciji na dan odkritja: vseh 3.344 vrstic prejemne mape prazno, medtem ko je 1.174 od 1.451 vrstic na proizvajalni strani nosilo resničnega najemnika — prav zato nihče ni sumil bralne strani.

Iskanje je torej zahtevalo (najemnik, ključ), shranjena vrstica je bila (nič, ključ), in nikoli se nista mogla ujeti.

Nič ni odpovedalo, in prav zato je teklo tedne

Iskanje, ki se nikoli ne more ujeti, zveni kot nekaj, kar bi moralo ob prvem poskusu sprožiti napako. Naredilo je nasprotno.

Prevzem je odločil, da je sporočilo novo. Vstavljanje je nato trčilo ob edinstveni indeks in bilo zavrnjeno kot podvojitev — pravilno, saj je bila vrstica že tam. Nadomestna veja je to zavrnitev ujela in jo prebrala dobrohotno: nekaj drugega je to najbrž že prevzelo, tu ni kaj storiti. Ovojnica je ostala v stanju „še za obdelavo", in ker je bila še za obdelavo, jo je naslednja dostava pobrala in delo opravila znova.

Vsak porabnik je znova obdeloval svoj zaostanek približno vsakih petinštirideset sekund, v nedogled. To jih je počelo šestindvajset. Ena produkcijska vrstica se je zaključila 333 ur po prihodu — in se je večino tega časa zaključevala znova in znova.

Kaj je dejansko pokvarilo

Od teh šestindvajsetih porabnikov jih štirje kopičijo, namesto da bi prepisovali. Ti štirje so obračunske projekcije, ki jih bere stran porabe, in tam je stvar priplavala na površje.

Imeli so izrecno zaščito prav pred tem, napisano po avgustovskem incidentu, ko se je en sam dogodek devetkrat uporabil na merilniku. Ta zaščita vrstico označi kot uspešno pred obdelavo, da ponovna dostava oznako najde in se ustavi. Oznaka se je vsakič zapisala pravilno. Naslednji prevzem jo je nato iskal z istim pokvarjenim ključem in je ni našel. To jamstvo je bilo prazno od dneva izdaje.

Česa to ni prizadelo, je vredno natančno našteti, saj „obračunska projekcija" zveni vznemirljivo, dejstva pa niso:

  • Glavna knjiga je bila pravilna. Vsak klic umetne inteligence zapiše natanko en obračunski zapis z lastnim posnetkom cene, in nič na tej poti jih ne zapisuje.
  • Nobena denarnica se ni premaknila. Stanja izhajajo iz knjige, nikoli iz povzetka.
  • Nobena zgornja meja se ni premaknila. Varuh proračuna bere ločen števec, in ta je edini vir resnice o tem, koliko si porabil ta mesec. Nihče ni bil prezgodaj odrezan zaradi napihnjene številke in nihče ni prišel skozi, ki ne bi smel.

Edino, kar prizadeti povzetek bere, je zgodovina porabe na tvoji lastni strani računa — tvoja vsota in razčlenitev, kam je šla. To je celoten polmer učinka, in ta je bil, da je kazalo preveč.

Polovica, ki je nihče ni gledal

Isto pokvarjeno iskanje je sedelo še na drugem mestu: na poti, ki teče, ko sporočilo spodleti. Tam nikoli ni našlo vrstice, ki bi jo moralo posodobiti, tik pod njim pa je sedela veja s komentarjem „v praksi nedosegljivo" — ki je ob vsakem spodletu vračala „ta napaka je končna".

Števec ponovnih poskusov tako nikoli ni napredoval in nobeno zastrupljeno sporočilo ni nikoli prišlo v vrsto nedostavljivih. Cela plast obravnave napak je bila izklopljena, za komentarjem, ki je vsakemu bralcu povedal, da tu ni česa preverjati.

Popravek

Obe iskanji zdaj ključata po ključu sporočila znotraj skupine porabnikov, kar edinstveni indeks tako ali tako uveljavlja. Ključi sporočil izhajajo iz identifikatorja tistega, kar jih je ustvarilo, zato se med najemniki po sami zasnovi ne morejo trčiti.

Dokumentacija, ki je trdila o vtiskovanju, je bila popravljena in ne izbrisana. Tisti stavek je bil past, in izbris ne bi pustil ničesar, kar pove, da je nekdo končno preveril.

Vedenje pritrjuje devet testov. Šest jih na stari kodi pade, kar smo potrdili tako, da smo staro kodo vrnili.

Pospravljanje pozneje

Napihnjene vrstice se popravijo same. Delavec vsako uro znova zgradi dnevne povzetke iz glavne knjige, v oknu dveh dni. Tekel je ves čas in izgubljal: enkrat na uro proti porabniku, ki znova uporablja vsakih petinštirideset sekund, ni poštena dirka.

Ker porabnik ne teče več znova, delavec zmaguje. Dva dneva, ki sta bila še znotraj tega okna, sta bila iz knjige znova zgrajena takoj, ko je bil popravek v produkciji. Dva prejšnja dneva sta iz okna že izpadla, in kar na njiju ostaja, je naš lastni račun plus ena zanemarljiva razlika drugje — zato smo ju pustili, namesto da bi zaradi tega širili okno v produkciji. Zdelo se je bolje kot namigovati, da je bilo čiščenje popolno.

Kaj smo iz tega odnesli

Ključ za odstranjevanje podvojitev mora zrcaliti to, kar indeks dejansko uveljavlja, ne tega, kar koda misli, da je bilo zapisano. Polovici tega ključa sta se hranili iz različnih polj in nobena ni bila nikoli izmerjena glede na drugo. Zdaj sta obe, in test, ki to dokazuje, se ob napačni različici obarva rdeče.

Deli LinkedIn X E-pošta
Preizkusite na lastnem deluVsak odgovor pokaže, koliko je stal. Začnite z brezplačnim paketom. Začni brezplačno
Prejemajte novosti o izdelku, ne šuma Novi modeli, funkcije in poudarki dnevnika sprememb - kratko sporočilo, ko nekaj resnično izide.
Z naročnino se strinjate s prejemanjem e-poštnih sporočil ToRun z novostmi izdelka. Naročnino lahko kadar koli prekličete. Pravilnik o zasebnosti