SQLite 3.51.3 s opravou možného poškodenia databázy v režime WAL

SQLite 3.51.3 s opravou možného poškodenia databázy v režime WAL

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ď:
      1. 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ý.
      2. Ihneď po dokončení prvého kontrolného bodu sa spúšťa druhý.
      3. 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.
      4. 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.
      5. 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.
      6. 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

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster