2017-10-12

2038-problemet

Idag är AOL inte så känt. Men som America Online var de ett av de första företagen som erbjöd privatpersoner att koppla upp sig, först till BBS:er, senare till internet.

En vårdag för några år sedan började deras webbservrar att krascha. Samtidigt. Och hårt – felet låg djupt inne i programvaran. Men var?

Efter långt om länge (att leta efter den här sortens fel är vansinnigt tidsödande, tröttsamt och frustrerande) så hittade man felet. Det ska åtminstone sägas att det var ett intressant fel ...

Webbservrarna använde en databas, så klart. Databasen hade en bugg som man löste, eller snarare kringgick, genom att lägga in en "evig" databasförfrågan. Normalt vill man få ett felmeddelande om en förfrågan inte får något svar inom si eller så många sekunder t.ex., men i det här fallet ville man inte få det. Eftersom man inte kunde sätta någon parameter TimeOut = Never eller liknande så satte man timeout till en tidpunkt jättelångt in i framtiden. Närmare bestämt 1 000 000 000 sekunder, eller drygt 31 år. Det borde verkligen räcka, kan man tycka.

Det gjorde det också. Men istället uppstod ett helt annat problem. I efterhand inser man att de borde ha insett det – tänk så mycket lättare (och roligare!) det är att inse saker i efterhand. För den 12 maj 2006 var det drygt 31 år kvar till den 19 januari 2038.

Hur så? Den 19 januari 2038 är 2 147 483 648 sekunder efter den 1 januari 1970. (Nu brister de nördigare delarna av publiken (som inte redan kände till det hela) ut i ett "aah".)

Hur så? Datorer som använder Unix, Linux eller besläktade system har en tideräkning som utgår ifrån nyår 1970 och räknar i sekunder. Eftersom man regelmässigt använt 32 bitar (i praktiken 31) så innebär det att tideräkningen slår om till noll efter 2 147 483 648 sekunder. Den sekunden infaller natten till den 19 januari 2038.

Så när AOL:s webbservrar den 12 maj 2006 snackade med sina databaser, och som vanligt lade in en "evig" förfrågan med timeout en miljard sekunder i framtiden, så innebar det plötsligt att tidpunkten inte låg drygt 31 år i framtiden – utan drygt 36 år i det förflutna. Eftersom den tidpunkten avgjort passerats så avslutades förfrågan, varpå servern kraschade. Hårt.

Lösningen blev att sätta timeout-värdet till lägre än en miljard sekunder. Den fungerade för AOL just då och lär hålla ett tag till (om det nu är aktuellt elva år senare). Men även om få av oss behöver bekymra oss för fulknep som buggar ut i AOL:s webbservrar så är vi desto mer beroende av att en massa andra datorer fungerar. Därför kommer "2038-buggen" att bli allt angelägnare ju närmare vi kommer den 19 januari 2038 (ett betydligt intressantare datum än 29 augusti 2017 någonsin var). Lösningen på det problemet är att ersätta en tideräkning på 32 bitar med en tideräkning på 64 bitar. Det har gjorts på många ställen och arbetet fortsätter.

Wikipedia: Year 2038 problem
Justin Mason: Year 2038 Bug Strikes Early, taint.org 20 juli 2006

Inga kommentarer: