13. marca bol vydaný opravnú verziu 3.51.3 kompaktného zabudovaného DBMS SQLite. Kód projektu je napísaný v jazyku C a je šírený ako verejný majetok (public domain).
Vzhľadom na problémy spätnej kompatibility, ktoré súvisia s niektorými novými funkciami, verzia 3.52.0 (vydaná 6. marca) bola stiahnutá.
Zoznam zmien verzie 3.51.3:
- 3. marca jeden z vývojárov SQLite (Dan) objavil a opravil chybu, ktorá v zriedkavých prípadoch mohla viesť k poškodeniu databázy, a nazval ju „WAL-reset bug“:
- Táto chyba sa vyskytuje iba v databázach bežiacich v režime WAL, ak je k rovnakému súboru otvorených viacero pripojení v rôznych vláknach alebo procesoch, a ak sa tieto dve pripojenia pokúšajú vykonať zápis alebo vytvoriť kontrolný bod súčasne.
- Chyba súvisí s konfliktom prístupu k údajom pri prísnych časových obmedzeniach. V normálnych podmienkach prevádzky sa vyskytuje mimoriadne zriedkavo. Vývojárom sa nepodarilo zopakovať túto chybu v prirodzených podmienkach, a preto museli do SQLite pridať špeciálnu logiku testovania, ktorá zámerne vytvára podmienky pre vznik chyby, aby sa uistili, že problém bol vyriešený.
- Chyba nastáva, keď:
- Jedno pripojenie vykonáva overenie kontrolného bodu. Toto prvé overenie musí byť dokončené. Inými slovami, počas overenia je potrebné úspešne skopírovať celé obsahu súboru WAL späť do databázy a uviesť súbor WAL do stavu, v ktorom môže byť zrušený.
- Ihneď po dokončení prvého kontrolného bodu sa spúšťa druhý.
- Kým sa spúšťa druhý kontrolný bod z kroku 2, iné pripojenie k databáze zaznamenáva transakciu, ktorá zruší súbor WAL a zapíše nové obsahy na začiatok súboru WAL.
- V dôsledku konfliktu prístupu k údajom druhý kontrolný bod z kroku 2 nezohľadňuje, že súbor WAL bol zrušený v dôsledku zaznamenania transakcie v kroku 3. Druhý kontrolný bod nastavuje nesprávnu hodnotu pre jedno z polí v hlavičke WAL. Toto pole ukazuje, že časť súboru WAL už bola zaznamenaná v kontrolnom bode, hoci to v skutočnosti nie je pravda.
- Zaznamenávanie dodatočných transakcií vedie k zvýšeniu počtu stránok v súbore WAL, ktorý presahuje počet stránok, ktoré existovali v čase prvej kontrolnej bodky z kroku 1.
- Neskôr, keď vznikne tretia kontrolná bodka, preskočí celú alebo časť transakcie zaznamenanej v kroku 3. Takže časti transakcie z kroku 3 sa nikdy nedostanú do súboru databázy, čo vedie k poškodeniu súboru databázy.
- Chyba je pravdepodobne prítomná vo všetkých verziách SQLite od 3.7.0 (21.07.2010) po 3.51.2. Opravy boli vydané aj pre niektoré staršie verzie: 3.44.6 a 3.50.7.
- Iné drobné opravy.
Zdroj: linux.org.ru
