العودة
Tailscale تكشف عن خطأ WAL-Reset في SQLite عمره 16 عامًا
SiTech Team2 წთ. საკითხავი

Tailscale تكشف عن خطأ WAL-Reset في SQLite عمره 16 عامًا

بعد 19 حالة تلف لقواعد البيانات خلال ستة أشهر، وجدت Tailscale ومطوّرو SQLite سباق بيانات نادرًا كان مخفيًا في المحرك منذ 16 عامًا على الأقل.

على مدى ستة أشهر تعرّضت لوحة التحكّم في Tailscale إلى 19 حالة منفصلة من تلف قواعد البيانات، واتضح أن سببها جميعًا خلل واحد عميق داخل SQLite. ويشرح تدوينة الشركة المفصّلة كيف تعاونت مع مطوّري نواة قاعدة البيانات لتحديد «خلل WAL-Reset» وإصلاحه: سباق بيانات نادر يُقدَّر أنه موجود في SQLite منذ 16 عامًا على الأقل.

أجزاء بكاتب واحد ونقاط تحقّق عدوانية

لوحة التحكّم في Tailscale مقسّمة إلى أجزاء تنسيقية، ولكل جزء قاعدة SQLite خاصة لا يصل إليها سوى عملية Go واحدة — وهو التصميم الذي صُمّم SQLite من أجله. وتستخدم الشركة SQLite قاعدةً أساسية منذ عام 2022: تُلتقط نسخة كاملة كل بضع دقائق وتُرفع إلى S3.

في آب/أغسطس من العام الماضي أبلغ خط البيانات الذي يقرأ تلك النسخ عن خطأ، وأكّد أمر PRAGMA integrity_check أن الملف تالف فعلًا. وتكرّرت الحادثة 19 مرة خلال ستة أشهر. في كل مرة كان يتوقّف عمل لوحة التحكّم الخاصة بالجزء — في الحوادث الأولى لأكثر من ساعة — فتعذّر على الأجهزة التي تعود للاتصال الالتحاق بالشبكة، وصارت لوحة الإدارة وواجهة API غير متاحتين.

خلل يتعذّر إعادة إنتاجه

لم يرتبط التلف بأي جزء أو عميل أو ميزة أو مستوى حِمل بعينه، ولم يتمكّن الفريق من إعادة إنتاجه مخبريًا. لذلك وقّعت Tailscale عقد دعم احترافي مع مطوّري SQLite، ونشرت قياسات تشخيصية جنائية في بيئة الإنتاج. وقدّم خط تسجيل المعاملات، الذي يعيد تشغيل كل عبارة SQL مُعدِّلة على نسخة احتياطية سليمة، أول دليل حقيقي: في حالتين كانت بيانات كُتبت والتزمت بها معاملة واحدة غير مرئية للمعاملات اللاحقة.

خلل WAL-Reset

بنى فريق SQLite أداة tmstmpvfs، وهي غلاف حول طبقة نظام الملفات الافتراضي لتتبّع نقاط التحقّق. كشفت السجلات سباق بيانات نادرًا بين نقطة تحقّق ومعاملة كتابة: تظنّ نقطة التحقّق أن الصفحات نُسخت من ملف WAL إلى ملف القاعدة الرئيسي، لكن ذلك لم يحدث فعلًا، فتُفقد البيانات نهائيًا وتشير الفهارس إلى صفحات غير موجودة. وصدر الإصلاح في SQLite 3.51.3 مضيفًا فحصًا يكتشف إعادة ضبط WAL من خيط آخر.

اضطر المطوّرون إلى سحب الإصدار الأول 3.52.0 بعد أن أطلق إنذارات كاذبة بالتلف في 13 قاعدة لدى Tailscale بسبب مشكلة في فهارس التعابير القديمة. خفّضت Tailscale دقة الطوابع الزمنية إلى ثوانٍ صحيحة، وأضافت SQLite لاحقًا ميزة الفهارس ذاتية الإصلاح. وبعد انتظار شهرين انطلق التحذير التشخيصي أخيرًا، مُثبتًا أن السباق يحدث في الإنتاج أيضًا. ومنذ ذلك الحين مرّت أربعة أشهر دون أي حادثة.

SSiTech

SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي

نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.