Dne 13. března došlo k aktualizaci 3.51.3 kompaktní integrované DBMS. SQLite. Kód projektu je napsán v jazyce C a je šířen jako veřejné vlastnictví (public domain).
Ve spojení s problémy zpětné kompatibility, souvisejícími s některými novými funkcemi, verze 3.52.0 (uvolněná 6. března) byla stažena.
Seznam změn verze 3.51.3:
- Dne 3. března jeden z vývojářů SQLite (Dan) objevil a opravil chybu, která v ojedinělých případech mohla vést k poškození databáze a nazvaná "WAL-reset bug":
- Tato chyba se vyskytuje pouze v databázích pracujících v režimu WAL, pokud je ke stejnému souboru otevřeno více než jedno připojení v různých vláknech nebo procesech, a pokud se tato dvě připojení pokoušejí provést zápis nebo vytvořit kontrolní bod současně.
- Chyba je spojena s konfliktem přístupu k datům při přísných časových limitech. V běžných provozních podmínkách se vyskytuje velmi zřídka. Vývojářům se nepodařilo tuto chybu reprodukovat v přirozených podmínkách, a museli do SQLite přidat speciální testovací logiku, která záměrně vytváří podmínky pro vznik chyby, aby se ujistili, že problém je vyřešen.
- Chyba vzniká, když:
- Jedno připojení provádí kontrolu kontrolního bodu. Tato první kontrola musí být dokončena. Jinými slovy, během této kontroly je nutné úspěšně zkopírovat celý obsah souboru WAL zpět do databáze a uvést soubor WAL do stavu, ve kterém může být resetován.
- Okamžitě po dokončení práce prvního kontrolního bodu začíná druhý.
- Zatímco se iniciuje druhý kontrolní bod z kroku 2, jiné připojení k databázi zapisuje transakci, která resetuje soubor WAL a zapisuje nový obsah na začátek souboru WAL.
- V důsledku konfliktu přístupu k datům druhý kontrolní bod z kroku 2 nevnímá, že soubor WAL byl resetován v důsledku potvrzení transakce v kroku 3. Druhý kontrolní bod nastavuje nesprávnou hodnotu pro jedno z polí v hlavičce WAL indexu. Toto pole naznačuje, že část souboru WAL byla již potvrzena v kontrolním bodu, i když ve skutečnosti tomu tak není.
- Potvrzení dalších transakcí vede k zvýšení počtu stránek v souboru WAL, který přesahuje počet stránek, jenž existoval v okamžiku prvního kontrolního bodu z kroku 1.
- Později, když se objeví třetí kontrolní bod, přeskočí celou nebo část transakce záznamu na etapě 3. Tím pádem části transakce z etapy 3 nikdy nebudou vloženy do databázového souboru, což způsobí jeho poškození.
- Chyba pravděpodobně existuje ve všech verzích SQLite, počínaje 3.7.0 (21.07.2010) až po 3.51.2. Byly také vydány opravy pro některé starší verze: 3.44.6 a 3.50.7.
- Další drobná vylepšení.
Zdroj: linux.org.ru
