Il 13 marzo è stato rilasciato un aggiornamento correttivo della versione 3.51.3 del database incorporato compatto. SQLite. Il codice del progetto è scritto in C e distribuito come pubblico dominio.
A causa di problemi di retrocompatibilità legati ad alcune nuove funzionalità, la versione 3.52.0 (rilasciata il 6 marzo) è stata ritirata.
Elenco delle modifiche della versione 3.51.3:
- Il 3 marzo uno degli sviluppatori di SQLite (Dan) ha scoperto e risolto un bug che in rari casi poteva portare alla corruzione del database, noto come «WAL-reset bug»:
- Questo bug si verifica solo nei database che operano in modalità WAL, se lo stesso file è aperto da due o più connessioni in thread o processi diversi, e se queste due connessioni tentano di eseguire scritture o di creare un checkpoint simultaneamente.
- Il problema è legato a conflitti di accesso ai dati in condizioni di rigide restrizioni temporali. Normalmente, si verifica raramente durante l'uso. Gli sviluppatori non sono riusciti a riprodurre questo errore in condizioni naturali e hanno dovuto aggiungere a SQLite una logica di test speciale che crea intenzionalmente condizioni per il verificarsi del bug, per assicurarsi che il problema fosse risolto.
- L'errore si verifica quando:
- Una connessione esegue il controllo del punto di controllo. Questo primo controllo deve essere completato. In altre parole, durante il controllo è necessario copiare con successo tutto il contenuto del file WAL nel database e portare il file WAL in uno stato in cui può essere azzerato.
- Non appena il primo punto di controllo è completato, viene avviato il secondo.
- Mentre il secondo punto di controllo dal passo 2 viene avviato, un'altra connessione al database registra una transazione che azzera il file WAL e scrive nuovo contenuto all'inizio del file WAL.
- A causa di un conflitto di accesso ai dati, il secondo punto di controllo dal passo 2 non considera che il file WAL è stato azzerato a causa della registrazione della transazione nel passo 3. Il secondo punto di controllo imposta un valore errato per uno dei campi nell'intestazione del WAL. Questo campo indica che parte del file WAL è già stata registrata nel punto di controllo, anche se in realtà non è così.
- La registrazione di transazioni aggiuntive porta a un aumento del numero di pagine nel file WAL, che supera il numero di pagine esistenti al momento del primo punto di controllo dal passo 1.
- In seguito, quando viene raggiunto il terzo checkpoint, salta l'intera o parte della transazione registrata al passo 3. Di conseguenza, parti della transazione dal passo 3 non vengono mai salvate nel file del database, causando la corruzione del file di database.
- L'errore è probabilmente presente in tutte le versioni di SQLite, dalla 3.7.0 (21.07.2010) fino alla 3.51.2. Sono stati anche rilasciati correttivi per alcune versioni precedenti: 3.44.6 e 3.50.7.
- Altri piccoli correttivi.
Fonte: linux.org.ru
