غير قادر على "حذف جميع المنشورات" عندما تكون هناك منشورات تنتمي إلى موضوع ضخم

أواجه مشكلة في مجتمعي. لا أستطيع “حذف جميع المنشورات” لبعض المستخدمين. ما أستنتجه هو أن المشكلة تحدث فقط للحسابات القديمة التي تحتوي على عدد كبير من المنشورات. الحسابات الأحدث لا تواجه هذه المشكلة.

لقد راجعت إعدادات الموقع وزدت الحد المسموح به لحذف جميع المنشورات إلى 10,000.

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

أرى في وحدة تحكم المتصفح الخاص بي رسالة خطأ 502 تتعلق بالمنشور:
image

لقد راجعت سجلات الخادم الخاص بي، وأرى هذا الخطأ يظهر بعد محاولة الحذف:

TypeError: undefined is not an object (evaluating ‘s.users’)
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver/t/topic/64828/2502

هل هناك مكان يمكنني البحث فيه للعثور على مصدر المشكلة؟ السجلات؟

إعجاب واحد (1)

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

4 إعجابات

هذا هو الخطأ الذي يظهر في السجل بعد محاولتي حذف جميع المنشورات:

TypeError: undefined is not an object (evaluating 's.users')
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver.com/t/topic/64828/2502
إعجاب واحد (1)

لاحظت أنه يحذف بعض المنشورات (حوالي 5) قبل ظهور مربع حوار الخطأ. لا أعرف ما إذا كان هذا ذا صلة.

صحيح، كان يجب أن أقرأ منشورك بعناية أكبر.

يبدو أن الفشل يحدث في الموضوع ذي المعرف 64828. هل أنشأ المستخدم منشورات في هذا الموضوع؟

نعتذر، لكن بعد التدقيق الدقيق، يبدو أن هذا الخطأ يتعلق بشيء آخر.
أرى هذا الآن وأشتبه في أنه قد يكون بسبب انتهاء مهلة الطلب:

image

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

لقد كتبت تطبيقًا صغيرًا يستدعي واجهة برمجة التطبيقات (API) الخاصة بـ Discourse على تثبيتاتي. يقوم بحذف كل منشور على حدة بدلاً من الحذف الدفعي. لذا، بالنسبة لـ 700 منشور، سيقوم بإجراء 700 استدعاء لواجهة برمجة التطبيقات. ليست الطريقة الأكثر كفاءة، لكنها كانت مفيدة.

أرى أن هناك 20 منشورًا مشكلة. يبدو أن وظيفة “الحذف الكل” تتوقف بمجرد وصولها إلى أحد هذه المنشورات ولا يمكنها حذفها. لم تتمكن واجهة برمجة التطبيقات من حذف هذه المنشورات لسبب ما. قمت بحذف معظمها يدويًا الآن من خلال الدخول إلى المنشور والضغط على زر الحذف كما يفعل المشرف عادةً.

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

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

عند محاولة الحذف يدويًا، أحصل على هذا السجل:
23

هل لديكم أي أفكار أو اقتراحات؟

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

إعجاب واحد (1)

أنا عالق الآن. لا أستطيع حذف المنشورات في تلك المواضيع الكبيرة، ولا أستطيع حذف المواضيع نفسها. كلا الإجراءين ينتهيان بظهور نافذة خطأ 502 Gateway.

:صرخة:

هل جربت حذف هذه المنشورات الخمسة باستخدام وحدة التحكم؟

./launcher enter app
rails c
Post.find(THE_POST_ID).destroy
إعجابَين (2)

نعم! هذا يعمل. لا أعرف Ruby أو Rails على الإطلاق، لكني أستطيع ربط عدد من المنشورات في أمر واحد مثل هذا:

Post.find(POST1_ID).destroy; Post.find(POST2_ID).destroy

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

بشكل عام، تُحذف المنشورات في Discourse بشكل ناعم (soft-deleted) ولا تُحذف بشكل نهائي (hard-deleted). باستخدام الأمر destroy، قمت بحذفها من قاعدة البيانات فقط، وقد طلبت منك استخدامه لأن المنشورات التي كنت تحاول حذفها كانت تابعة لمواضيع طويلة للغاية.

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

لحذف موضوع بشكل دائم، قم بتشغيل

Topic.find(THE_TOPIC_ID).destroy
إعجاب واحد (1)

ملاحظة فقط: لتجنب هذا النوع من مشاكل الأداء :arrow_up: قمنا أيضًا بإدخال بعض الإعدادات لتجنب إنشاء المواضيع العملاقة. راجع التفاصيل على The MEGATOPIC: public good, or public menace?

إعجابَين (2)

شكرًا لك على النصيحة. الأمر يتوافق مع ما توقعت، وسأستخدم أمر الحذف فقط كحل أخير.

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

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

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

الحل الأبسط هو أن يتولى بعض المشرفين المهمة ويقوموا بتقسيم (ثم إغلاق) المواضيع الضخمة إلى مواضيع متعددة، على سبيل المثال:

  • :lock:[عنوان الموضوع الضخم] الجزء 1
  • :lock:[عنوان الموضوع الضخم] الجزء 2
  • :lock:[عنوان الموضوع الضخم] الجزء 3
  • :lock:[عنوان الموضوع الضخم] الجزء […]
  • :unlock:[عنوان الموضوع الضخم] الجزء 10

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

نعم، ستكون هذه مهمة مملة، لكن هذا أيضًا أحد الأسباب التي تجعل وجود موضوع يحتوي على 55 ألفًا أو 17 ألف مشاركة أمرًا غير مجدٍ تمامًا، لأن nobody لن يقرأها.

4 إعجابات

لدينا الآن ميزة (إعدادات الموقع) لهذا الغرض تحديدًا!

4 إعجابات