Geri Dön
Tailscale, SQLite'taki 16 yıllık WAL-Reset hatasını buldu
SiTech Team2 წთ. საკითხავი

Tailscale, SQLite'taki 16 yıllık WAL-Reset hatasını buldu

Altı ayda 19 veritabanı bozulması olayının ardından Tailscale ve SQLite geliştiricileri, motorda en az 16 yıldır gizlenen nadir bir veri yarışını ortaya çıkardı.

Altı ay boyunca Tailscale'in kontrol düzlemi, veritabanı bozulmasına yol açan 19 ayrı olay yaşadı; hepsinin nedeni SQLite'ın derinliklerindeki tek bir hataydı. Şirket ayrıntılı blog yazısında, veritabanının çekirdek geliştiricileriyle birlikte “WAL-Reset hatası”nı nasıl bulduğunu ve düzelttiğini anlatıyor: SQLite'ta en az 16 yıldır var olduğu tahmin edilen nadir bir veri yarışı.

Tek yazarlı parçalar ve agresif checkpoint'ler

Tailscale'in kontrol düzlemi koordinasyon parçalarına (shard) ayrılmış durumda; her birinde yalnızca tek bir Go sürecinin eriştiği bir SQLite veritabanı var — SQLite'ın tam da tasarlandığı model. Şirket 2022'den beri SQLite'ı birincil veritabanı olarak kullanıyor: birkaç dakikada bir tam anlık görüntü alınıp S3'e yükleniyor.

Geçen yılın ağustos ayında bu yedekleri okuyan veri hattı bir hata bildirdi ve PRAGMA integrity_check komutu dosyanın bozuk olduğunu doğruladı. Olay tekrarlandı: altı ayda toplam 19 kez. Her seferinde ilgili parçanın kontrol düzlemi durduruldu — ilk olaylarda bir saatten uzun süre — bu yüzden yeni açılan cihazlar bağlanamadı, yönetim konsolu ve API erişilemez oldu.

Yeniden üretilemeyen hata

Bozulma belirli bir parça, müşteri, özellik veya yük seviyesiyle ilişkilendirilemedi ve ekip hatayı laboratuvarda yeniden üretemedi. Tailscale, SQLite geliştiricileriyle profesyonel destek sözleşmesi imzaladı ve üretim ortamına adli telemetri kurdu. Değiştirici her SQL ifadesini sağlam bir yedek üzerinde yeniden oynatan işlem günlüğü hattı ilk gerçek ipucunu verdi: iki olayda bir işlemin yazıp onayladığı veriler sonraki işlemler için görünmezdi.

WAL-Reset hatası

SQLite ekibi, checkpoint'leri izlemek için sanal dosya sistemi katmanının etrafına tmstmpvfs adlı bir sarmalayıcı yazdı. Günlükler, bir checkpoint ile bir yazma işlemi arasındaki nadir bir veri yarışını ortaya çıkardı: checkpoint, sayfaların WAL'den ana dosyaya kopyalandığını sanıyor, ama kopyalanmamış oluyor — veriler kalıcı olarak kayboluyor ve indeksler var olmayan sayfaları gösteriyor. SQLite 3.51.3 ile yayımlanan düzeltme, WAL'in başka bir iş parçacığı tarafından sıfırlandığını saptayan ek bir kontrol ekliyor.

İlk sürüm olan 3.52.0 geri çekilmek zorunda kaldı; çünkü eski ifade indeksleriyle ilgili bir sorun nedeniyle Tailscale'in 13 veritabanında yanlış bozulma uyarıları tetikledi. Tailscale zaman damgalarının hassasiyetini tam saniyeye indirdi; SQLite ise sonradan kendini onaran indeks özelliğini ekledi. İki aylık bekleyişin ardından tanılama uyarısı sonunda çalıştı ve yarışın üretimde de gerçekleştiğini kanıtladı. O günden bu yana dört ay boyunca olay yaşanmadı.

SSiTech

SiTech — AI destekli web geliştirme

Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.