Op 13 maart vond de correctie-uitgave 3.51.3 van de compacte ingebedde database plaats. SQLiteHet project is geschreven in C en wordt verspreid als openbaar domein.
Vanwege compatibiliteitsproblemen met sommige nieuwe functies is versie 3.52.0 (uitgebracht op 6 maart) teruggetrokken.
Wijzigingenlijst voor versie 3.51.3:
- Op 3 maart ontdekte en verhelpt een van de SQLite-ontwikkelaars (Dan) een fout die in zeldzame gevallen kon leiden tot databasecorruptie en genoemd werd „WAL-resetfout“:
- Deze fout doet zich alleen voor in databases die in WAL-modus draaien, als er twee of meer verbindingen met hetzelfde bestand open zijn in verschillende threads of processen, en als deze twee verbindingen tegelijkertijd proberen te schrijven of een checkpoint te maken.
- De fout is gerelateerd aan een gegevenstoegangsconflict onder strikte tijdslimieten. Onder normale operationele omstandigheden komt het zeer zelden voor. De ontwikkelaars zijn er nooit in geslaagd deze fout te reproduceren onder natuurlijke omstandigheden, en ze moesten speciale testlogica aan SQLite toevoegen die opzettelijk omstandigheden creëert die de fout veroorzaken, om zeker te zijn dat het probleem is verholpen.
- De fout doet zich voor wanneer:
- Een verbinding een checkpoint controleert. Deze eerste controle moet zijn voltooid. Met andere woorden, tijdens de controle moet de inhoud van het WAL-bestand met succes terug naar de database worden gekopieerd en moet het WAL-bestand in een staat worden gebracht waarin het kan worden gereset.
- Direct na het voltooien van de eerste checkpoint wordt de tweede gestart.
- Terwijl de tweede checkpoint uit stap 2 wordt gestart, registreert een andere databaseverbinding een transactie die het WAL-bestand reset en nieuwe inhoud aan het begin van het WAL-bestand schrijft.
- Vanwege het gegevenstoegangsconflict houdt de tweede checkpoint uit stap 2 er geen rekening mee dat het WAL-bestand is gereset als gevolg van het bevestigen van de transactie in stap 3. De tweede checkpoint stelt een onjuist waarde in voor een van de velden in de WAL-indexkop. Dit veld geeft aan dat een deel van het WAL-bestand al is bevestigd in de checkpoint, terwijl dat in werkelijkheid niet het geval is.
- Het bevestigen van extra transacties leidt tot een toename van het aantal pagina's in het WAL-bestand, dat het aantal pagina's overschrijdt dat bestond op het moment van de eerste checkpoint uit stap 1.
- Later, when the third checkpoint occurs, it skips the entire transaction or part of it recorded in step 3. As a result, parts of the transaction from step 3 do not make it into the database file, causing the database file to become corrupted.
- The error is likely present in all versions of SQLite from 3.7.0 (21.07.2010) to 3.51.2. Fixes have also been released for some earlier versions: 3.44.6 en 3.50.7.
- Other minor fixes.
Bron: linux.org.ru
