SQLite è uno dei database più diffusi in assoluto: gira dentro browser, smartphone, applicazioni desktop, dispositivi embedded e servizi cloud, spesso senza che l’utente ne sia consapevole. Proprio per questo sorprende che una race condition introdotta con il supporto al Write-Ahead Logging (WAL), disponibile dalla versione 3.7.0 del 2010, sia riuscita a restare nascosta per quasi 16 anni.

A portarla alla luce è stata Tailscale, dopo una serie di episodi di corruzione apparentemente inspiegabili nei database usati internamente. Il problema non compariva sotto carichi estremi né richiedeva configurazioni anomale: scattava solo quando un checkpoint e una nuova scrittura sul WAL si sovrapponevano in una finestra temporale estremamente stretta. In quelle condizioni SQLite poteva considerare alcune pagine già trasferite nel database principale quando, in realtà, risiedevano ancora soltanto nel WAL.

Il difetto, oggi noto come WAL-Reset bug, ha provocato 19 incidenti in circa 6 mesi nei sistemi Tailscale ed è risultato particolarmente difficile da riprodurre in laboratorio.

L’indagine, condotta insieme agli sviluppatori di SQLite, ha richiesto nuovi strumenti di diagnostica e ha infine portato alla correzione inclusa in SQLite 3.51.3. La vicenda è interessante perché mostra quanto possano essere insidiose le race condition nei componenti più maturi: il codice può funzionare correttamente per miliardi di operazioni e fallire soltanto quando due eventi si incrociano nell’ordine sbagliato.