الخلاصة

  • تفرض RFC 9737 على MDS أثناء فترة الاسترداد أن يقبل stateid مجهولاً من الأصفار في LAYOUTRETURN كي يبلغ العميل عن أخطاء I/O التي شاهدها خلال الانقطاع.
  • قبول القيمة يعني قبول التقرير في قرار الاسترداد، ولا يعني إحياء layout القديم أو تفويض I/O عادي أو إثبات صحة كل mirror.
  • يجب فصل سلطة الكلام عن صحة الشهادة، ثم فصل الشهادة المقبولة عن نجاح إعادة البناء والنتيجة التي تراها التطبيقات.

كان لدى العميل شيء يقوله، لكنه لم يعد يملك المعرّف الذي كان سيقوله به.

قبل إعادة التشغيل، منحه MDS layout يتيح له الوصول مباشرة إلى data servers. خلال غياب MDS استمرت كتابة البيانات، وفشلت عملية على أحد الـ mirrors. عند عودة MDS أصبحت layout stateids القديمة غير صالحة. بقيت المعلومة، واختفت القناة العادية التي تحملها.

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

الأصفار تصريح للقول لا تصريح للتصرف

في pNFS flexible file layout يوزع MDS وصف الـ mirrors، ثم يتعامل العميل مباشرة مع خوادم البيانات. وعندما يكون mirroring عند العميل، عليه تحديث كل النسخ والإبلاغ عن فشل أي عملية.

تحدد RFC 8435 بنية ff_ioerr4 التي تحمل device وoperation وstatus وoffset وlength. تسمي المواصفة هذه الإشارات hints إلى MDS. هي شهادة منظمة ومفيدة، لكنها ليست برهان سلامة شامل لكل بايت.

أثناء grace period يستطيع العميل استرداد open state عبر CLAIM_PREVIOUS ثم إعلان اكتمال الاسترداد بواسطة RECLAIM_COMPLETE. لكنه لا يستطيع استعادة layout stateid القديم أو الحصول على layout جديد لمجرد تفسير خطأ وقع تحت الحالة السابقة.

لهذا يقبل MDS قيمة all-zero كـ lrf_stateid في LAYOUTRETURN داخل grace. نطاقها واضح: إدخال تقرير الخطأ في القرار. لا تحمل إذناً جديداً للقراءة أو الكتابة ولا تجعل layout القديم حياً.

الوقت جزء من معنى الإذن

داخل grace، أي stateid غير صفري في هذا المسار يجب أن يواجه NFS4ERR_GRACE. بعد انتهاء grace، القيمة الصفرية نفسها تواجه NFS4ERR_NO_GRACE. وعند الرد على الشكل المجهول لا يجوز لـ MDS زيادة seqid الخاص بحالة النتيجة.

هكذا لا يتظاهر التقرير بأنه انتقال عادي في حالة layout نافذة. إنه دليل تاريخي قُبل ضمن epoch استرداد محدد.

لا تكفي ملاحظة stateid=0 في packet capture. يجب ربطها بإعادة التشغيل، وحدود grace، وهوية العميل والملف، وwrite intent، ومجموعة mirrors، ومحتوى الخطأ، ورد الخادم. من دون هذا السياق لا تثبت الأصفار أن التقرير كان مقبولاً أو مشروعاً.

هذا نموذج عملي للمواصفة الدنيا: قاعدة مشتركة دقيقة لقيمة واحدة وعملية واحدة وزمن واحد وغرض واحد، من دون تحويل الاستثناء إلى سلطة مستمرة.

الشهادة المقبولة ليست حقيقة كاملة

إذا استرد العميل الملف ولم يبلغ عن خطأ، يجب ألا يعيد MDS بناءه. إذا بلغ عن خطأ، يجب أن يجري resilvering. وإذا لم يسترد ولم يبلغ قبل نهاية grace، يجب أيضاً أن يعيد البناء لأن العميل ربما أعاد التشغيل وفقد حالته.

الفرعان الأخيران يؤديان إلى النتيجة نفسها لكن بدليل مختلف. التقرير الإيجابي يقول إن العميل شاهد مشكلة. الصمت من عميل غائب يعني أن الدليل مفقود. لا يحق للأتمتة تحويل غياب الشاهد إلى شهادة نظافة.

حتى clean reclaim له حد. هو كاف لقرار البروتوكول بعدم resilver، لكنه لا يثبت عدم وجود silent corruption، ولا يجمع ملاحظات كل العملاء، ولا يثبت أن التطبيق سيقبل المحتوى. سلطة الكلام لا تساوي كمال المعرفة.

يجب أن تطابق الشهادة مجموعة المرايا الحالية

يقارن MDS أيضاً layout الوارد مع mirror instances الحالية. إذا اختلفت، يجب تجاهل التقرير وإجراء resilvering. قد يكون العميل صادقاً تماماً بشأن المجموعة القديمة، لكن الحقيقة عن مجموعة سابقة لا تمنح سلطة على مجموعة تغيّرت.

يجب حفظ بصمتين في سجل التدقيق: المجموعة التي شاهدها العميل والمجموعة التي اعتمدها MDS عند القرار. من دون المقارنة قد يبدو أن التقرير المقبول على مستوى النقل تسبب في اختيار المصدر، بينما يكون الخادم قد رفض قابليته وذهب إلى إعادة بناء محافظة.

هوية مجموعة المرايا جزء من الدليل، وليست metadata يمكن حذفها بعد parsing.

الإصلاح يحتاج سلطة وترتيباً جديدين

ينشأ write intent عندما يحصل العميل على LAYOUTIOMODE4_RW. يجب على MDS تتبعه عبر إعادة التشغيل. إذا لزم resilvering فالمسار العام هو fencing للملف، وتسجيل الحاجة، وتحرير write intent، ثم بدء النسخ بعد زوال كل intents. لا يجوز البدء بينما ما زالت سلطة كتابة معلقة.

يستطيع MDS حجب I/O أو تمريره عبره أو إدخال proxy يحدث النسخة الجديدة أثناء النقل. هذه قرارات تنفيذ محلية، لكنها لا تلغي مسؤولية MDS عن اتساق mirrors. وإذا استمر الوصول يجب أن يرى العميل layout نفسه، وأن يبقى الـ proxy حتى نهاية grace.

بعد ذلك تأتي أدلة أخرى: صلاحية source mirror للقراءة، اكتمال ranges، convergence، القراءة اللاحقة، وقبول التطبيق. قبول التقرير لا يختصر هذه السلسلة.

النسخة القديمة ترفض الادعاء وتدفع تكلفة الحذر

إذا لم يدعم MDS الجديد السلوك—أي كان خادماً أقدم—فقد يرد NFS4ERR_BAD_STATEID. على العميل الرجوع إلى السلوك القديم وعدم الإبلاغ عبر هذا المسار. لا يتظاهر الطرفان بأنهما اتفقا.

الثمن هو resilvering محافظ بسبب نقص دليل قابل للاستخدام. يستهلك النظام وقتاً ونطاقاً وIOPS بدلاً من اختراع يقين. يجب تسجيل ذلك كـ fallback بسبب compatibility، لا كنجاح للامتداد.

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

المصادر