كيفية إصلاح خطأ "انقضاء مهلة آلية القفل" في قفل الملفات في ownCloud

إذا أبلغت منصة ownCloud عن انتهاء مهلة قفل الملف أثناء المزامنة أو التحميل أو النقل أو إعادة التسمية أو تجميع الأجزاء، فاعلم أن الخطأ عادةً ما يتعلق بقفل الملفات للمعاملات ، وليس بميزة قفل الملفات اليدوي المتاحة للمستخدم. قفل المعاملات هو آلية أمان داخلية تمنع طلبين من حفظ أو تعديل الملف نفسه في الوقت ذاته. وهو مُفعّل افتراضيًا في ownCloud، ويمكنه استخدام قاعدة البيانات أو Redis كخادم خلفي للقفل.

لا تزال وثائق ownCloud 11 الحالية توصي باستخدام Redis لتأمين الملفات في المعاملات، لأن التأمينات المدعومة بقواعد البيانات تُسبب عبئًا كبيرًا على قاعدة البيانات. في عمليات التثبيت المُجمّعة، يجب أن تستخدم كل عقدة تطبيق نفس مثيل Redis المشترك للتأمين. هذا هو الحل الأمثل الذي يجب فهمه قبل تغيير قيم المهلة الزمنية أو حذف سجلات التأمين.

يشرح هذا الدليل المشكلة من منظور مسؤول مبتدئ: ما معنى القفل، وما يجب نسخه احتياطيًا، وكيفية تأكيد المكون المعطل، وكيفية تكوين Redis، وكيف تغير المجموعات الصورة، وما هي الاختصارات التي يمكن أن تجعل الوضع أسوأ.

معنى الخطأ

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

وفقًا لوثائق قفل الملفات المعاملاتية في ownCloud 11 ، فإن هذه الآلية تتعامل أيضًا مع عمليات التحميل المتقطعة والملفات المشتركة والتخزين الخارجي والملفات المشفرة.

يختلف هذا عن ميزة قفل الملفات اليدوي ، وهي ميزة اختيارية لتسجيل الدخول/الخروج تعتمد على بروتوكول WebDAV، وتتيح للمستخدم قفل ملف عمدًا عبر واجهة الويب. تتميز الأقفال اليدوية بقيم انتهاء صلاحية قابلة للتكوين من قِبل المستخدم. ولا يُصلح تغيير هذه القيم مشكلة في نظام قفل المعاملات الخلفي المُثقل أو المُكوّن بشكل غير صحيح.

قبل أن تبدأ

  • قم بعمل نسخة احتياطية من قاعدة بيانات ownCloud و config/config.php...
  • سجل إصدار ownCloud ونوع النشر: حزمة تقليدية، أو Docker Compose، أو مجموعة متعددة العقد.
  • حدد محرك قاعدة البيانات الخاص بك وما إذا كان Redis مثبتًا بالفعل.
  • سجل العملية التي فشلت بالضبط، مثل مزامنة سطح المكتب، أو تحميل WebDAV، أو إعادة تسمية المجلد، أو التحميل المجزأ.
  • لاحظ ما إذا كانت المشكلة تؤثر على ملف واحد، أو مستخدم واحد، أو العديد من المستخدمين في نفس الوقت.

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

الخطوة الأولى: تحديد آلية القفل المعطلة

ابدأ بفحص سجلات ownCloud، وسجلات خادم الويب، وسجلات PHP-FPM، وحالة خدمة Redis. ابحث عن حالات متكررة لاستثناءات الموارد المقفلة، أو أخطاء انتظار قفل قاعدة البيانات، أو فشل الاتصال بـ Redis، أو نمط يبقى فيه المسار نفسه محظورًا لفترة طويلة بعد انتهاء العملية الأصلية.

يعرض الطرفية رسالة انتهاء مهلة قفل ownCloud، ونشاط عملية PHP، وحالة خدمة Redis
تحقق من سجل أخطاء ownCloud وحالة PHP وRedis قبل تغيير إعدادات القفل. الهدف هو تحديد ما إذا كان سبب انتهاء المهلة هو تنازع القفل، أو عدم توفر الخادم الخلفي، أو بطء قاعدة البيانات.

تتضمن الفحوصات المفيدة على مضيف لينكس ما يلي:

systemctl status redis-server
redis-cli PING
ps -ef | grep php
tail -n 200 /path/to/owncloud/data/owncloud.log

يجب أن يُعيد أمر Redis السليم قيمة صحيحة PONG. إذا تم تكوين ownCloud للوصول إلى Redis عبر مقبس أو اسم مضيف حاوية أو كلمة مرور أو مضيف بعيد، فاختبر مسار الاتصال نفسه الذي يستخدمه ownCloud فعليًا بدلاً من افتراض أن redis-cliالاختبار المحلي يثبت اتصال التطبيق.

إذا احتوى سجل النظام على رسالة قاعدة بيانات مشابهة لـ "انتهت مهلة انتظار القفل"، فابحث أيضًا عن مشكلة التنازع على قاعدة البيانات. نظام قفل قاعدة البيانات القديم يعمل، لكن وثائق ownCloud تحذر صراحةً من أنه يُحمّل قاعدة البيانات بعبء كبير.

الخطوة الثانية: نقل عملية قفل الملفات للمعاملات إلى Redis

لتثبيت ownCloud بالطريقة التقليدية، قم بتهيئة Redis كخادم memcache.lockingخلفي في ملف التكوين config/config.php. توفر وثائق التخزين المؤقت للذاكرة الحالية لـ ownCloud مثالاً على استخدام Redis TCP مشابهاً لما يلي:

'filelocking.enabled' => true,
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
    'host' => 'localhost',
    'port' => 6379,
    'timeout' => 0,
    'password' => '',
],
مثال على ملف config.php الخاص بـ ownCloud يوضح تفعيل قفل الملفات للمعاملات واختيار Redis كخادم خلفي لقفل الذاكرة المؤقتة memcache.locking
استخدم Redis كخادم خلفي لتأمين المعاملات بدلاً من ترك عمليات التأمين ذات الحجم الكبير في قاعدة البيانات. عدّل قيم المضيف والمنفذ والمقبس والمصادقة لتناسب بيئتك.

لا تقم بنسخ كلمة المرور الفارغة حرفيًا إلى إعداد Redis مُعرَّض للإنترنت. توصي وثائق التخزين المؤقت للذاكرة في ownCloud بحماية Redis بشكل مناسب. من الأفضل أن يكون الوصول إلى Redis متاحًا فقط من مضيفي ownCloud الموثوق بهم أو شبكة الحاويات الداخلية.

في إعدادات دوكر الرسمية لـ ownCloud، يتم تفعيل Redis باستخدام متغيرات البيئة. توضح وثائق ownCloud 11 الحالية ما يلي:

OWNCLOUD_REDIS_ENABLED=true
OWNCLOUD_REDIS_HOST=redis
OWNCLOUD_REDIS_PORT=6379

عند تفعيل Redis في نموذج النشر هذا، يقوم ownCloud تلقائيًا بتعيين كلٍ من ذاكرة التخزين المؤقت الموزعة وذاكرة التخزين المؤقت للقفل إلى Redis. استخدم التكوين الخاص بالنشر والموثق لتثبيتك بدلاً من دمج متغيرات بيئة Docker مع ملف يتم صيانته يدويًا، config.phpإلا إذا كنت تفهم أي طبقة لها الأولوية.

الخطوة 3: في المجموعة، اجعل كل عقدة تستخدم نفس Redis

المجموعة هي عملية نشر تتضمن عدة خوادم تطبيقات ownCloud خلف موازن تحميل. في هذا التصميم، يجب أن يكون القفل المُنشأ على إحدى عقد التطبيق مرئيًا لجميع العقد الأخرى. لا يمكن لذاكرة التخزين المؤقت APCu الخاصة بكل عقدة أو مثيلات Redis المنفصلة لكل عقدة توفير حالة القفل المشتركة هذه .

مخطط يوضح خوادم تطبيقات ownCloud المتعددة التي تشترك في مثيل Redis واحد لقفل الملفات وقاعدة بيانات واحدة
في عملية نشر ownCloud متعددة العقد، يجب على جميع خوادم التطبيقات استخدام خدمة قفل Redis نفسها حتى ترى كل عقدة حالة قفل الملف نفسها.

دليل التخزين المشترك المجمع في ownCloud واضحٌ تمامًا: استخدم نسخة Redis مشتركة واحدة يمكن الوصول إليها من جميع عُقد التطبيق. ويحذر من الاعتماد على أقفال نظام الملفات أو NFS لتأمين تطبيقات ownCloud.

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

الخطوة الرابعة: تحقق من الإعدادات وأعد محاولة العملية الأصلية

بعد تهيئة Redis، تحقق من إعدادات ownCloud النشطة باستخدام الأمر occ. اعتمادًا على تثبيتك، قد يتم استدعاء الأمر كمستخدم خادم الويب أو من خلال Docker Compose.

sudo -u www-data php occ config:system:get memcache.locking
sudo -u www-data php occ config:system:get filelocking.enabled

يجب أن يُظهر الأمر الأول رسالة خطأ \OC\Memcache\Redis، ويجب أن يبقى قفل الملفات للمعاملات مُفعّلاً. لا تُحاول "حل" المشكلة بتعطيل قفل الملفات، فهذا يُزيل ضمانة سلامة البيانات بدلاً من إصلاح النظام.

يقوم الطرفية بالتحقق من اتصال Redis وتكوين memcache.locking الخاص بـ ownCloud، مع ملاحظة تفصل بين القفل المعاملي والقفل اليدوي.
تأكد من اتصال Redis وتفعيل نظام قفل الملفات في ownCloud، ثم أعد عملية المزامنة أو التحميل التي فشلت في البداية. لا يلزم إجراء فحص كامل للملفات لمجرد إثبات حل مشكلة القفل.

أعد الآن محاولة العملية الفاشلة نفسها. إذا انتهت مهلة تحميل عميل سطح المكتب، فأعد تحميله. إذا فشلت عملية نقل مجلد، فأعد نقله. راقب سجلات ownCloud وRedis أثناء الاختبار. تُعد إعادة المحاولة الناجحة دون حدوث مهلة قفل متكررة دليلاً أقوى بكثير من تشغيل أمر صيانة غير ذي صلة.

ماذا لو ظل الملف يظهر مقفلاً؟

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

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

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

لا تخلط بين قفل المعاملات وقفل الملفات اليدوي.

ميزة غاية التحكم النموذجي
قفل الملفات المعاملاتية يحمي عمليات الملفات المتزامنة ويحفظها memcache.locking، عادةً ما يكون Redis
قفل الملفات يدويًا يقوم المستخدم عمداً بسحب/قفل ملف مشترك إعدادات مهلة قفل WebDAV وكسر القفل

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

إذا كانت مشكلتك تتعلق تحديدًا بقفل يدوي أنشأه المستخدم، فإن أوامر مثل هذه ستكون ذات صلة:

docker compose exec owncloud occ config:app:set files lock_timeout_default --value 1800
docker compose exec owncloud occ config:app:set files lock_timeout_max --value 86400

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

أخطاء شائعة تزيد من سوء مهلة القفل

حذف صفوف القفل من قاعدة البيانات أثناء تفعيل ownCloud

قد يتعارض هذا مع الطلبات الجارية، وقد يؤدي إلى إزالة الأقفال الصحيحة. كما أنه يعالج العرض فقط دون إصلاح إعدادات قاعدة البيانات أو Redis التي تسببت في انتهاء المهلة.

تعطيل قفل الملفات للمعاملات

يُستخدم نظام قفل المعاملات لحماية عمليات الملفات من التعديل المتزامن. أبقِه مُفعّلاً وقم بإصلاح النظام الخلفي.

استخدام APCu للتأمين المشترك في مجموعة

APCu عبارة عن ذاكرة تخزين مؤقت محلية لكل عقدة. وهي مناسبة للتخزين المؤقت المحلي، ولكنها لا توفر حالة قفل مشتركة عبر خوادم التطبيقات المتعددة. استخدم Redis المشترك للتخزين المؤقت الموزع والمؤمَّن في عمليات النشر العنقودية.

تشغيل نسخة واحدة من Redis لكل عقدة تطبيق

هذا يعني أن كل خادم سيتمتع برؤية مختلفة لأقفال الملفات. تحتاج جميع العُقد إلى خدمة Redis مشتركة لتنسيق الأقفال.

زيادة وقت انتظار قفل قاعدة البيانات دون إصلاح التنازع

قد يؤدي تمديد مهلة قاعدة البيانات إلى زيادة وقت انتظار المستخدمين. نقل حركة بيانات تأمين المعاملات إلى Redis يقلل من عبء تأمين قاعدة البيانات ويعالج مشكلة الاختناق المعماري.

جعل مدة صلاحية القفل قصيرة بشكل غير واقعي

قد تحتاج عملية تخزين خارجية بطيئة أو عملية تحميل كبيرة إلى وقتٍ كافٍ. انتهاء صلاحية قفلها قبل الأوان قد يسمح لطلب آخر بتعديل نفس المورد في الوقت نفسه.

قائمة التحقق السريعة لحل المشكلات

  • تأكد من أن الخطأ يتعلق بقفل المعاملات وليس بقفل يدوي أنشأه المستخدم.
  • تحقق من سجلات ownCloud وPHP وقاعدة البيانات وRedis في نفس الفترة الزمنية تقريبًا.
  • تأكد من إمكانية الوصول إلى Redis من وقت تشغيل ownCloud، وليس فقط من سطر الأوامر الخاص بك.
  • تم ضبطه memcache.lockingعلى \OC\Memcache\Redis.
  • أبقِ filelocking.enabledالجهاز مُفعّلاً.
  • في مجموعة الخوادم، قم بتوجيه كل عقدة إلى نفس مثيل Redis.
  • أعد محاولة المزامنة أو التحميل أو النقل الأصلية مع مراقبة السجلات.
  • لا تستخدم عمليات فحص الإصلاح أو تغييرات انتهاء صلاحية القفل إلا عندما تشير الأدلة إلى تلف البيانات الوصفية أو الأقفال القديمة.

خلاصة القول

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

يتبع هذا النهج وثائق ownCloud الحالية: يبقى قفل الملفات المعاملاتي ممكّنًا، ويتعامل Redis مع حالة القفل المشترك، ويتم التعامل مع إعدادات مهلة قفل الملفات اليدوي كميزة منفصلة بدلاً من إصلاح مهلة القفل الشاملة.

اترك تعليقاً

حل مشكلة تعليق وضع الصيانة في Nextcloud مع OCC

حل مشكلة تعليق وضع الصيانة في Nextcloud مع OCC

قم بمسح صفحة صيانة Nextcloud العالقة بأمان باستخدام OCC، وتحقق مما إذا كانت الترقية غير مكتملة، وتأكد من أن المثيل جاهز للمستخدمين.

إصلاح مشكلة تأجيل البريد الصادر في زيمبرا: "انتهت مهلة الاتصال بالمنفذ 25"

إصلاح مشكلة تأجيل البريد الصادر في زيمبرا: "انتهت مهلة الاتصال بالمنفذ 25"

قم بتشخيص أخطاء تأجيل البريد الصادر في Zimbra على المنفذ 25. تحقق من قائمة الانتظار، وMX DNS، وجدران الحماية، وحظر الموفر، وقم بتكوين مرحل SMTP معتمد.

كيفية إعداد خادم مصفوفة على Raspberry Pi 4 باستخدام Conduit

كيفية إعداد خادم مصفوفة على Raspberry Pi 4 باستخدام Conduit

قم بإعداد خادم منزلي خفيف الوزن من نوع Matrix على Raspberry Pi 4 باستخدام Conduit و Docker و NGINX و HTTPS وعناصر التحكم في التسجيل والاتحاد والفحوصات.

كيفية تهيئة Jitsi Videobridge لإعداد خادم متعدد قابل للتوسع

كيفية تهيئة Jitsi Videobridge لإعداد خادم متعدد قابل للتوسع

أضف خوادم Jitsi Videobridge إلى نشر Jitsi Meet مشترك، وقم بتكوين التسجيل والوصول إلى جدار الحماية، وتحقق من اختيار الجسر، وتعرف على متى تكون هناك حاجة إلى Octo.

كيفية تثبيت شهادة SSL تجارية على خادم Zimbra

كيفية تثبيت شهادة SSL تجارية على خادم Zimbra

قم بتثبيت شهادة SSL تجارية على Zimbra بأمان: أنشئ طلب توقيع الشهادة (CSR)، وقم ببناء سلسلة CA، وتحقق من المفتاح والشهادة، وقم بنشرها، وأعد تشغيل الخدمات، وتأكد من HTTPS.

كيفية تخصيص واجهة وشعار BigBlueButton

كيفية تخصيص واجهة وشعار BigBlueButton

قم بتغيير شعار BigBlueButton الافتراضي، وأضف شعارًا إلى الاجتماعات الفردية، وافهم متى تتطلب العلامة التجارية الأوسع للواجهة إصدارًا مخصصًا للعميل.

كيفية مسح سجلات تدقيق Zimbra لتحرير مساحة القرص بأمان

كيفية مسح سجلات تدقيق Zimbra لتحرير مساحة القرص بأمان

تعرف على كيفية تحديد سجلات التدقيق القديمة لـ Zimbra وأرشفتها وضغطها وإزالتها، ومتى يجب تجنب اقتطاع ملف audit.log، وكيفية التحقق من استعادة مساحة القرص والتسجيل بشكل صحيح.

إصلاح مشكلة "فشل الاتصال بخادم التخزين" في برنامج Kopano Dagent

إصلاح مشكلة "فشل الاتصال بخادم التخزين" في برنامج Kopano Dagent

قم باستكشاف أخطاء اتصال خادم تخزين Kopano dagent وإصلاحها عن طريق التحقق من حالة الخادم، ومقبس الخادم، وأذونات مقبس Unix، والمستمعين عن بعد، واختبارات التسليم المتحكم بها.

كيفية إصلاح خطأ "انقضاء مهلة آلية القفل" في قفل الملفات في ownCloud

كيفية إصلاح خطأ "انقضاء مهلة آلية القفل" في قفل الملفات في ownCloud

قم بإصلاح أخطاء مهلة قفل الملفات في ownCloud عن طريق تحديد الأقفال المعاملاتية، ونقل تخزين القفل إلى Redis، والتحقق من المجموعات، وإعادة الاختبار بأمان.

كيفية إصلاح مشكلة نفاد ذاكرة برنامج Matrix Synapse أثناء المزامنة

كيفية إصلاح مشكلة نفاد ذاكرة برنامج Matrix Synapse أثناء المزامنة

قم باستكشاف أخطاء Matrix Synapse المتعلقة بـ OOM أثناء /sync عن طريق فحص ضغط الذاكرة، وضبط ذاكرة التخزين المؤقت بعناية، وعزل المزامنة الأولية، ومراقبة العمال.