Egy webcím, amely hosszabb volt az oszlopánál
2026. augusztus 9-én húsz számlálókép nem jelent meg. Nem rosszul rajzolódott ki, nem is lassan — a látogató egyáltalán semmit sem kapott ott, ahol a számlálónak lennie kellett volna.
Az ok egy 255 karakternél hosszabb webcím volt. Mostantól már íráskor levágjuk, és a számlálókép nem függ többé annak a címnek a hosszától, amelyről értesül.
A láncolat
Annak az oszlopnak a típusa, amely azt tárolja, melyik oldalra érkezett egy látogatás: varchar(255). A cím ennél hosszabban érkezett. A beszúrás ezzel a hibával hiúsult meg: SQLSTATE 22001, azaz az adat túl hosszú az oszlophoz, ami ebben a kódban kivételt váltott ki.
A statisztika írása ráadásul azelőtt történik, hogy a kép elkészülne. Így a kivétel nem csak egy statisztikai sort vitt el. Megszakította a kérést, és éppen ez a kérés állítja elő a számlálóképet. Egy hosszú című oldal a saját számlálóját tette tönkre, csendben, minden látogató számára.
A hosszú címek nem egzotikusak. Egy egymásba ágyazott útvonalakat használó galéria, egy webshop, amelynek címéhez egy hirdetési platform egy tucat követési paramétert fűz, egy keresési találati oldal — bármelyik erőlködés nélkül túllépi a 255 karaktert.
A javítás, és a javítás, amelyet nem választottunk
A címet most a beszúrás előtt az oszlop szélességére vágjuk. Egy nagyon hosszú URL-ből húsz karakter elveszik az oldallistában; más nem változik.
Az alternatíva az oszlop kiszélesítése lett volna. Ezt elvetettük: nincs olyan szélesség, amelyet ne lehetne túllépni, és egy nagyobb szám választása csak távolabbra tolja ugyanazt a hibát, ahol majd nehezebb lesz felismerni, amikor bekövetkezik. A hibának meg kell szűnnie végzetesnek lenni, nem pedig ritkábbá válnia.
Ha a beszúrást try/catch blokkba csomagoltuk volna, az is megszüntette volna a látható tünetet, és rosszabb lett volna: a számláló megjelenik, a sor csendben eltűnik, és az oldallistából örökre pontosan a legbonyolultabb című oldalak hiányoznának, anélkül hogy bármelyik naplóban nyoma lenne.
Két tanulság
A külső bemenetet az oszlop szélességére kell vágni, nem abban reménykedni, hogy belefér. Bármi, ami kívülről érkezik — egy webcím, egy hivatkozó, egy user agent, egy oldalcím — olyan hosszú, amilyennek valaki más eldöntötte, és az adatbázisnak erről megvan a véleménye, amelyet elutasítással fejez ki.
Tudni kell, mi függ még egy hibától a folyamat további részében. Ez statisztikai hiba volt egy statisztikai szolgáltatásban, és a látható kár egy hiányzó kép volt. Az írás és a kirajzolás egy kérésen osztozott; a kódban semmi sem jelezte, hogy össze vannak kapcsolva, és semmi sem figyelmeztetett arra, hogy egy sikertelen beszúrás a képet is magával viszi.
Egy nap alatt húsz hibás kép nem sok. Egészen más miatt olvasott naplókban bukkantunk rá – az ilyen hibákat általában így találják meg, és ezért érdemes továbbra is olvasni őket.