قامت Cloudflare مؤخرًا بتوثيق كيفية قيام فريق التطوير الخاص بها بتحديد وإصلاح خطأ نادر في مكتبة Rust HTTP المستخدمة على نطاق واسع والتي يمكنها اقتطاع استجابات HTTP الكبيرة بصمت مع الاستمرار في إرجاع حالة 200 OK الناجحة. كانت المشكلة موجودة منذ سنوات، ولم يتم تشغيلها إلا في ظل ظروف زمنية محددة، وتم الآن إصلاحها في المراحل الأولية، مما أثار النقاش بين ممارسي Rust حول الحادث وكيفية تعامل Cloudflare معه.

ظهر الخطأ في Cloudflare Images أثناء إعادة تصميم رابط Workers Images الخاص به. بعد بدء التشغيل، قامت بعض طلبات تحويل الصور الكبيرة بإرجاع بيانات مبتورة بشكل متقطع على الرغم من الإبلاغ عن خطأ HTTP 200 نجاح.

في التفاصيل الفنية، يوضح الفريق كيفية عزل السبب الجذري وتحديد مسار العلاج. يلخص ديانا لام، مدير المنتج في Cloudflare، وDiretnan Domnan، كبير مهندسي النظام في Cloudflare، ومات لويس، كبير مهندسي النظام في Cloudflare:

لقد أمضينا ستة أسابيع في مطاردة خطأ غير مرئي تقريبًا – وهي حالة سباق حدثت فقط في ظل ظروف محددة – في المكتبة الفائقة التي أثرت على كيفية إرجاع ربط الصور لبيانات الصورة المعالجة إلى العميل. في النهاية، استغرق الأمر أربعة أسطر من التعليمات البرمجية لإصلاحه.

مكتبة Rust الفائقة هي مكتبة شبكات منخفضة المستوى تنفذ بروتوكول HTTP، مما يوفر وظائف العميل والخادم الأساسية التي تعتمد عليها العديد من أطر عمل وتطبيقات الويب ذات المستوى الأعلى من Rust. بدأ هذا البرنامج في عام 2014 على يد شون ماك آرثر وتم إصداره بموجب ترخيص معهد ماساتشوستس للتكنولوجيا (MIT).

بعد أن بدأ العملاء في الإبلاغ عن الصور المقتطعة، لاحظ الفريق أن الاستجابات أعادت HTTP 200 وطول المحتوى المتوقع، ولكن في إحدى الحالات قدمت 200 كيلو بايت فقط من 3.3 ميجابايت المتوقعة، مما يجعل من الصعب تحديد مصدر الاقتطاع.

قام الفريق بشكل منهجي بعزل كل مكون في مسار الطلب عن طريق إنشاء نسخة موثوقة، والاختبار عبر الإصدارات والبيئات الفائقة، وقياس كل خدمة، واستخدام التتبع الموزع لإزالة الأسباب المحتملة تدريجيًا حتى تم تضييق المشكلة إلى مسار استجابة HTTP لخدمة الصور.

لم يُظهر التتبع والسجلات على مستوى التطبيق أي أخطاء، ولكن تتبع نظام kernel ذو المستوى المنخفض (strace) كشفت أن Hyper كان يغلق الاتصالات قبل الأوان قبل أن يتم إرسال بيانات الاستجابة المخزنة بالكامل، مما يؤكد حالة السباق المعتمدة على التوقيت.

قامت Cloudflare بتتبع الخطأ إلى حلقة إرسال HTTP/1 الخاصة بـ Hyper، والتي تجاهلت بشكل غير صحيح تدفق المخزن المؤقت غير الكامل وأغلقت الاتصال قبل الأوان، مما تسبب في فقدان بيانات الاستجابة المخزنة مؤقتًا في ظل ظروف توقيت نادرة. لإصلاح الخلل، أضاف الفريق اختبارًا حتميًا أعاد إنتاج حالة السباق وقام بتعديل Hyper لضمان مسح البيانات المخزنة مؤقتًا بالكامل قبل إغلاق الاتصال. يضيف لام ودومنان ولويس:

جاء اختراقنا من استخدام الأدوات على مستوى النواة مع الطبقة الوحيدة التي تسجل ما حدث بالفعل على المقبس. وقد عاش الخطأ الأساسي في أجزاء قليلة من الثانية بين التدفق الجزئي والإغلاق المبكر – وهي نافذة لم يتم فتحها إلا بعد أن جعلنا النظام أسرع.

على Reddit، علق Martin Nordholts، أحد المساهمين في مترجم Rust:

هذا هو عيب تصميم معروف في الصدأ غير المتزامن. في حالة مزامنة Rust، إذا تم تجميعها، فإنها تعمل (بشكل عام). في الصدأ غير المتزامن، ليس هذا هو الحال، لسوء الحظ. إحدى فئات المشاكل التي تساهم في ذلك هي الإلغاء الصامت. المقالة هي أحد الأمثلة على الأخطاء التي يمكن أن تسببها.

يسلط جيم فولر الضوء على عدم قيام Cloudflare برعاية Sean McArthur، الذي يحتفظ بمكتبات Rust الأساسية وغيرها من المكتبات:

كتابة لطيفة من قبل شركة أخرى تبلغ إيراداتها 2 مليار دولار والتي لا يبدو أنها تدعم بشكل مباشر المطورين الذين يعملون على المسار الحرج لتحقيق الإيرادات المذكورة.

في أحد مواضيع Hacker News الشهيرة، ركز بعض الممارسين على كود Rust:

كان من الممكن أن يتم وضع علامة على ذلك بواسطة Clippy lints `let_underscore_untyped` أو `let_underscore_must_use`، والتي للأسف لم يتم تمكينها افتراضيًا.

يشكك آخرون في مراقبة Cloudflare:

لا يلاحظ Cloudflare (حتى يشتكي العميل) أنهم يرسلون استجابات معطلة على نطاق واسع؟ كنت أعتقد أنهم سيلاحظون ذلك من خلال أخذ العينات وفحص بعض الردود.

تم دمج الإصلاح والاختبار المصاحب له في المشروع الفائق وسيكون متاحًا في إصدار مستقبلي، مما يمنع خطأ اقتطاع الاستجابة.



شاركها.
اترك تعليقاً