Tailscale-მა SQLite-ში 16-წლიანი WAL-Reset ბაგი ამოიკვლია
ექვს თვეში ბაზის დაზიანების 19 შემთხვევის შემდეგ Tailscale-მა და SQLite-ის დეველოპერებმა იშვიათი data race იპოვეს — ბაგი, რომელიც ბაზის ბირთვში სულ მცირე 16 წელი იმალებოდა.
ექვსი თვის განმავლობაში Tailscale-ის კონტროლის სიბრტყე მონაცემთა ბაზის დაზიანების 19 ცალკეულ შემთხვევას გადაეყარა, რომლებიც ერთი და იმავე ბაგის — SQLite-ის სიღრმეში ჩამალული შეცდომის — შედეგი იყო. კომპანიის ბლოგპოსტის თანახმად, SQLite-ის ბირთვის დეველოპერებთან ერთად მათ იპოვეს და გაასწორეს „WAL-Reset ბაგი“ — იშვიათი მონაცემთა რბოლა, რომელიც, შეფასებით, SQLite-ში სულ მცირე 16 წელი არსებობდა.
ერთეული მწერალი და აგრესიული ჩექპოინტები
Tailscale-ის კონტროლის სიბრტყე დაყოფილია კოორდინაციის შარდებად, რომელთაგან თითოეულს საკუთარი SQLite ბაზა აქვს და მას მხოლოდ ერთი Go პროცესი იყენებს — ზუსტად ის დიზაინი, რისთვისაც SQLite შექმნილია. კომპანია SQLite-ს ძირითად ბაზად 2022 წლიდან იყენებს: ყოველ რამდენიმე წუთში სრული სნეპშოტი იღება და S3-ში იტვირთება.
გასული წლის აგვისტოში ამ სარეზერვო ასლების წამკითხავმა პაიპლაინმა შეცდომა დააფიქსირა, ხოლო PRAGMA integrity_check-მა ფაილის დაზიანება დაადასტურა. შემთხვევა კიდევ 18-ჯერ გაიმეორა. ყოველ ჯერზე შარდის კონტროლის სიბრტყე ითიშებოდა — თავდაპირველად ერთ საათზე მეტხანს — რის გამოც ახლად ჩართული მოწყობილობები ვერ უკავშირდებოდნენ, ადმინის კონსოლი და API კი მიუწვდომელი იყო.
ბაგი, რომლის რეპროდუცირებაც ვერ მოხერხდა
დაზიანება არც ერთ კონკრეტულ შარდს, მომხმარებელს, ფუნქციას თუ დატვირთვის დონეს არ უკავშირდებოდა და გუნდმა მისი რეპროდუცირებაც ვერ შეძლო. Tailscale-მა SQLite-ის დეველოპერებთან პროფესიული მხარდაჭერის კონტრაქტი გააფორმა და წარმოების გარემოში ფორენზიკული ტელემეტრია ჩართო. ტრანზაქციების ლოგირების პაიპლაინმა, რომელიც ყველა ცვლილების შემტან SQL განაცხადს კარგ სარეზერვო ასლზე ითამაშებს, პირველი ნამდვილი მინიშნება მისცა: ორ შემთხვევაში ერთი ტრანზაქციის მიერ ჩაწერილი მონაცემები მომდევნო ტრანზაქციებისთვის უხილავი იყო.
WAL-Reset ბაგი
SQLite-ის გუნდმა ააგო tmstmpvfs — ვირტუალური ფაილური სისტემის ფენის გარსი — რომ ჩექპოინტების მიმდინარეობა გამხდარიყო ხილული. ლოგებმა გამოავლინა იშვიათი data race ჩექპოინტსა და ჩაწერის ტრანზაქციას შორის: ჩექპოინტი ფიქრობს, რომ გვერდები WAL-იდან მთავარ ბაზაში გადაკოპირებულია, თუმცა ასე არ არის — მონაცემები სამუდამოდ იკარგება და ინდექსები არარსებულ გვერდებზე მიუთითებენ. გამოსწორება, რომელიც SQLite 3.51.3-ში გამოვიდა, ამატებს შემოწმებას, რომელიც აფიქსირებს, როდის გადატვირთა WAL სხვა ნაკადმა.
პირველი მცდელობა — 3.52.0 — გაუქმდა, რადგან მან Tailscale-ის 13 ბაზაზე ცრუ გაფრთხილებები გამოიწვია ძველ expression ინდექსებთან დაკავშირებული პრობლემის გამო. Tailscale-მა დროის ნიშნულების სიზუსტე მთელ წამებამდე შეამცირა; SQLite-მა მოგვიანებით თვითაღდგენადი ინდექსების ფუნქცია დაამატა. ორთვიანი ლოდინის შემდეგ დიაგნოსტიკური გაფრთხილება საბოლოოდ ამოქმედდა და დაადასტურა, რომ ეს რბოლა წარმოებაშიც ხდება. მას შემდეგ ოთხი თვეა ინციდენტი არ მომხდარა.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.