13. marca je izdan korektivni ispravak 3.51.3 kompaktne ugrađene DBMS. SQLite. Kod projekta je napisan u C jeziku i distribuira se kao javna domena (public domain).
Zbog problema sa unazadnom kompatibilnošću povezanih s nekim novim funkcijama, verzija 3.52.0 (izdata 6. marta) je povučena.
Spisak izmena verzije 3.51.3:
- 3. marta jedan od razvijača SQLite (Dan) je otkrio i ispravio grešku koja je u retkim slučajevima mogla dovesti do oštećenja baze podataka i nazvana je «WAL-reset bug»:
- Ova greška se javlja samo u bazama podataka koje rade u WAL režimu, ako je na istom fajlu otvoreno dvoje ili više konekcija u različitim nitima ili procesima, i ako te dve konekcije pokušavaju istovremeno da izvrše zapis ili kreiraju kontrolnu tačku.
- Greška je povezana sa sukobom pristupa podacima pod strogim vremenskim ograničenjima. U uobičajenim uslovima rada se javlja veoma retko. Razvijačima nije uspelo da reprodukuju ovu grešku u prirodnim uslovima, tako da su morali da dodaju posebnu logiku testiranja u SQLite, koja namerno stvara uslove za pojavu greške kako bi osigurali da je problem rešen.
- Greška se javlja kada:
- Jedna konekcija vrši proveru kontrolne tačke. Ova prva provera mora biti završena. Drugim rečima, tokom provere je potrebno uspešno kopirati sav sadržaj fajla WAL nazad u bazu podataka i dovesti fajl WAL u stanje u kojem se može resetovati.
- Odmah nakon završetka prve kontrolne tačke pokreće se druga.
- Dok se pokreće druga kontrolna tačka iz koraka 2, druga konekcija na bazu podataka evidentira transakciju koja resetuje fajl WAL i upisuje novi sadržaj na početak fajla WAL.
- Zbog sukoba pristupa podacima druga kontrolna tačka iz koraka 2 ne uzima u obzir da je fajl WAL resetovan kao rezultat evidentiranja transakcije u koraku 3. Druga kontrolna tačka postavlja pogrešnu vrednost za jedno od polja u zaglavlju indeksa WAL. Ovo polje označava da je deo fajla WAL već zabeležen u kontrolnoj tački, iako to zapravo nije tačno.
- Fiksacija dodatnih transakcij vodi do povećanja broja stranica u WAL datoteci, koje premašuju broj stranica koje su postojale u trenutku prve kontrolne tačke iz koraka 1.
- Kasnije, kada se dogodi treća kontrolna tačka, ona propušta celu ili deo transakcije zabeležene u koraku 3. Tako, delovi transakcije iz koraka 3 nikada ne završe u datoteci baze podataka, što dovodi do oštećenja datoteke baze podataka.
- Greška je verovatno prisutna u svim verzijama SQLite-a, počevši od 3.7.0 (21.07.2010) do 3.51.2. Takođe su objavljena ispravka za neke ranije verzije: 3.44.6 in 3.50.7.
- Ostale manje ispravke.
Izvor: linux.org.ru
