Tailscale SQLite-də 16 illik WAL-Reset xətasını aşkar edib
Altı ayda 19 verilənlər bazası zədələnməsi hadisəsindən sonra Tailscale və SQLite tərtibatçıları mühərrikdə ən azı 16 ildir gizlənən nadir data race tapıblar.
Altı ay ərzində Tailscale-in idarəetmə müstəvisi verilənlər bazasının zədələnməsi ilə bağlı 19 ayrı hadisə yaşayıb və hamısı SQLite-ın dərinliklərindəki tək bir xətadan qaynaqlanıb. Şirkətin ətraflı blog yazısına görə, verilənlər bazasının əsas tərtibatçıları ilə birlikdə onlar “WAL-Reset” xətasını tapıb və düzəldiblər — SQLite-da ən azı 16 ildir mövcud olduğu təxmin edilən nadir data race.
Tək yazıcılı şardlar və aqressiv checkpoint-lər
Tailscale-in idarəetmə müstəvisi koordinasiya şardlarına bölünüb; hər birində yalnız bir Go prosesinin daxil olduğu SQLite bazası var — SQLite-ın məhz nəzərdə tutduğu dizayn. Şirkət SQLite-ı 2022-ci ildən əsas baza kimi istifadə edir: hər neçə dəqiqədən bir tam snapshot alınır və S3-ə yüklənir.
Keçən ilin avqustunda bu ehtiyat nüsxələrini oxuyan data pipeline xəta bildirib və PRAGMA integrity_check faylın zədələndiyini təsdiqləyib. Hadisə təkrarlanıb: altı ayda cəmi 19 dəfə. Hər dəfə şardın idarəetmə müstəvisi dayandırılıb — ilk hallarda bir saatdan çox — buna görə yeni qoşulan cihazlar qoşula bilməyib, admin konsolu və API isə əlçatmaz olub.
Yenidən yaradıla bilməyən nasazlıq
Zədələnmə konkret bir şard, müştəri, funksiya və ya yükləmə səviyyəsi ilə əlaqələndirilə bilmədi və onu təkrar yaratmaq mümkün olmadı. Tailscale SQLite tərtibatçıları ilə peşəkar dəstək müqaviləsi bağlayıb və istehsalat mühitində forenzik telemetriya yerləşdirib. Dəyişdirici hər SQL ifadəsini sağlam ehtiyat nüsxə üzərində təkrar oynadan tranzaksiya jurnalı pipeline-ı ilk əsl ipucunu verib: iki halda bir tranzaksiyanın yazdığı və təsdiqlədiyi məlumatlar sonrakı tranzaksiyalar üçün görünməz olub.
WAL-Reset xətası
SQLite komandası checkpoint-ləri izləmək üçün virtual fayl sistemi qatının ətrafında tmstmpvfs adlı sarğı yaradıb. Jurnallar checkpoint ilə yazma tranzaksiyası arasında nadir data race aşkar edib: checkpoint səhifələrin WAL-dan əsas bazaya köçürüldüyünü düşünür, əslində isə köçürülməyib — məlumatlar birdəfəlik itir və indekslər mövcud olmayan səhifələri göstərir. SQLite 3.51.3 ilə buraxılan düzəliş WAL-ın başqa bir thread tərəfindən sıfırlandığını aşkarlayan əlavə yoxlama gətirir.
İlk versiya — 3.52.0 — geri götürülməli olub, çünki köhnə expression indeksləri ilə bağlı problem səbəbindən Tailscale-in 13 bazasında yanlış zədələnmə xəbərdarlıqları yaradıb. Tailscale zaman nişanlarının dəqiqliyini tam saniyələrə endirib, SQLite isə sonradan özünü bərpa edən indeks funksiyasını əlavə edib. İki ay gözlədikdən sonra diaqnostik xəbərdarlıq nəhayət işə düşüb və yarışın istehsalatda da baş verdiyini sübut edib. O vaxtdan dörd aydır heç bir hadisə baş verməyib.
SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.