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

إعادة المحاولة تبني الحالة، ولا تستأنف التدفق

عندما تنقطع جلسة SSH، لا يتبقى في الطرف البعيد سوى ما دفعه إلى القرص ولا شيء غيره. لا يوجد رمز جلسة لإعادة الالتحاق به ولا رقم تسلسل لإعادة لعبه. تبدأ الجولة التالية اتصالًا جديدًا، وتقرأ المصدر مرة أخرى، وتسأل المستقبِل عمّا لديه بالفعل.

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

قرِّر أين يعيش الجزء القابل لإعادة الاستخدام

السلوك الافتراضي يكتب الملف الجزئي في مسار الوجهة، ما يجعل أرشيفًا نصف مكتوب مرئيًا تحت الاسم النهائي. ينقله --partial-dir إلى مجلد من اختيارك، ويصف الدليل ذلك المجلد بأنه محتفظ به لاستخدامه كبيانات في نقل لاحق. يُحلّ الاسم النسبي تحت مجلد الوجهة، وهو ما تريده عندما قد يكون للطرفين تخطيطان مختلفان.

rsync -e ssh --partial-dir=.rsync-partial --info=progress2 -- \
  large-archive.bin [email protected]:/srv/incoming/

الترتيب مهم في الوجهة أيضًا: يحتاج المجلد الجزئي إلى مساحة كافية للجزء، ويحتاج الحجم إلى مساحة كافية للملف المكتمل كذلك. ملء الحجم الهدف في منتصف النقل يُنتج فشلًا يبدو مشكلة شبكة وليس كذلك، وقد يترك الجزء المحتفظ به مبتورًا. تحقق من المساحة الحرة على المضيف المستقبِل قبل أن تبدأ الجولة، لا بعد أن تفشل. بضع ثوانٍ مع df -h عبر مسار SSH نفسه هي أرخص اختبار ممكن للخطة.

الأذونات شاغل أصغر لكنه حقيقي. مجلد جزئي قابل للكتابة من حسابات غير ذات صلة يسمح لشخص آخر باستبدال محتوى ستعامله جولتك التالية كأنه مستلَم بالفعل. أبقِه مملوكًا لحساب النقل، ولا تضعه في مكان تنشر منه خدمات أخرى.

شغِّل النسخة نفسها، لا نسخة أذكى

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

لا تضف --whole-file وأنت تتوقع سلوك الفروق. ذلك الخيار يقول لـ rsync أن ينسخ الملف كاملًا دون مقارنة المجموع الاختباري المتدحرج، وهو خيار معقول على وصلة محلية سريعة وخيار خاطئ تمامًا بعد رفع طويل فاشل. --inplace يغيّر الحكاية أيضًا: فهو يكتب في ملف الوجهة مباشرة، لذا يترك الانقطاع ملفًا يخلط المحتوى القديم والجديد دون جزء منفصل يمكن الرجوع إليه.

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

لا تقبل الكائن إلا بعد أن يطابق

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

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

اترك المصدر وشأنه حتى يؤكد المتلقي. إعادة توليد الأرشيف بين المحاولات تغيّر أساس المقارنة، والجولة التالية إما تنقل كل شيء تقريبًا أو تُنتج ملفًا لا يطابق المصدر القديم ولا الجديد.

عندما تكون الوصلة، لا العلامة، هي الحد

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

قارن المسارات البديلة المسموح بها بالملف نفسه والوجهة نفسها، ولاحظ من أين يعيد كل منها البدء بعد انقطاع. ذلك العمود الواحد يخبرك عن رفع اثني عشر غيغابايت عبر VPN أكثر من أي معدل ذروة قيس في اختبار قصير.

مقالات ذات صلة