Syncthing ve SQLite eşitlemesinde POSIX dosya sistemi engeli
Öne çıkanlar
- Syncthing, dosyaları güvenli şekilde değiştirmek için rename sistem çağrısını kullanıyor.
- Açık dosya tanımlayıcısı olan süreçler isim değişse bile eski dosya nesnesine erişmeye devam ediyor.
- Uygulama yeniden başlatılana kadar SQLite bağlantısı güncellenen yeni dosyayı göremiyor.
Yazılımcı Fernando Borretti, Rust ve SQLite kullanarak geliştirdiği Epoch adlı günlük uygulamasında Syncthing ile cihazlar arası senkronizasyon yaparken karşılaştığı veri tutarsızlığı sorununu paylaştı. Dizüstü bilgisayarda yapılan güncellemelerin masaüstü sistemde eşitleme tamamlanmasına rağmen görünmediğini fark eden Borretti, sorunun SQLite kilitlerinden değil, POSIX dosya sistemi dinamiklerinden kaynaklandığını tespit etti.
Syncthing, dosyaları güvenli ve atomik şekilde değiştirmek için POSIX standardındaki rename sistem çağrısını kullanıyor. Ancak çalışan bir uygulamanın açık dosya tanımlayıcısı (file descriptor) varken hedef dosya adı değiştirildiğinde, mevcut süreç eski dosya nesnesine işaret etmeye devam ediyor. Dizin haritası yeni dosyayı gösterse bile açık bağlantıyı koruyan servis eski ve artık haritalanmamış dosyayı okumayı sürdürüyor.
Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.