مشكلة تراجع محتملة في حدث post_edited؟

تقرير خطأ في Discourse: تراجع في حدث :post_edited في أحدث إصدار (latest-release)

يؤثر على: فرع latest-release في Discourse (الإصدار +122)
الحالة: تراجع مؤكد - يمكن تكراره
التاريخ: 15 يناير 2026


الملخص

توقف نشر حدث DiscourseEvent المسمى :post_edited في الإصدارات الأخيرة من latest-release. تكتمل تعديلات المشاركات بنجاح ويتم إنشاء المراجعات، لكن الحدث الذي تعتمد عليه الإضافات (plugins) لا يتم إطلاقه أبدًا. هذا يكسر جميع الإضافات التي تستخدم مشغل الأتمتة post_created_edited وأي إضافات أخرى تستمع إلى أحداث :post_edited.


التكرار (مؤكد)

أكدنا أن هذا تراجع من خلال الاختبار على بيئتي Azure AKS متطابقتين:

قبل التحديث (يعمل)

  • الإصدار: v2026.1.0-latest (بناء أقدم)
  • السلوك: :white_check_mark: يتم إطلاق أحداث :post_edited بشكل صحيح
  • الأتمتة: :white_check_mark: يعمل تلقائيًا

بعد التحديث (معطل)

  • الإصدار: latest-release +1221 hours ago, release +122
  • السلوك: :cross_mark: لا يتم إطلاق أحداث :post_edited أبدًا
  • الأتمتة: :cross_mark: معطلة تمامًا

اكتشاف حاسم: كانت كلتا البيئتين تعملان قبل التحديث. تعطلتا كلتاهما بعد التحديث إلى latest-release +122. هذا يثبت بشكل قاطع أنه تم إدخال تراجع.


تفاصيل البيئة

  • إصدار Discourse: latest-release (الإصدار +122)
  • إصدار Rails: 8.0.4
  • البنية التحتية: خدمة Azure Kubernetes (AKS)
  • صورة Docker: discourse/base:2.0.20260109-0020
  • النشر: تثبيت Docker قياسي لـ Discourse

إجراء الاختبار

الاختبار 1: مستمع الحدث (يثبت أن الحدث لا يتم إطلاقه أبدًا)

# في وحدة تحكم Rails
File.open('/tmp/post_edited_test.log', 'w') { |f| f.write("Test started at #{Time.now}\n") }

DiscourseEvent.on(:post_edited) do |post, topic_changed, revisor|
  File.open('/tmp/post_edited_test.log', 'a') do |f|
    f.write("[#{Time.now}] :post_edited fired! Post #{post.id}\n")
  end
end

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

cat /tmp/post_edited_test.log

النتيجة على latest-release +122: يعرض فقط “Test started” - الحدث لا يتم إطلاقه أبدًا
النتيجة على البناء الأقدم: يعرض إدخالات الحدث مع الطوابع الزمنية ومعرفات المشاركات

الاختبار 2: التحقق من إنشاء المراجعات

post = Post.find(POST_ID)
puts "Post revisions: #{post.revisions.count}"
post.revisions.last(3).each { |rev| puts "  Revision #{rev.number}: #{rev.created_at}" }

النتيجة: يتم إنشاء المراجعات بشكل صحيح مع الطوابع الزمنية المناسبة
الاستنتاج: تتم معالجة التعديلات بنجاح، ولكن لم يتم استدعاء post_process_post أو لم يتم تشغيل الحدث

الاختبار 3: تشغيل الحدث يدويًا (يثبت أن نظام الحدث يعمل)

post = Post.find(POST_ID)
DiscourseEvent.trigger(:post_edited, post, false, PostRevisor.new(post))

النتيجة: يتم تنفيذ معالجات الأحداث بشكل صحيح
الاستنتاج: نظام الحدث يعمل، لكن التشغيل التلقائي أثناء التعديلات معطل


السلوك المتوقع

عند تعديل مشاركة عبر واجهة الويب:

  1. يتم حفظ التعديل بنجاح :white_check_mark:
  2. يتم إنشاء مراجعة للمشاركة :white_check_mark:
  3. يتم استدعاء PostRevisor#post_process_post :cross_mark:
  4. يتم تشغيل حدث :post_edited :cross_mark:
  5. يتم تنفيذ معالجات الحدث :cross_mark:

الخطوات 1-2 فقط تعمل. الخطوات 3-5 معطلة.


السلوك الفعلي

تُظهر سجلات الإنتاج إكمال التعديل بنجاح:

Started PUT "/posts/3631" for 88.97.179.124 at 2026-01-15 13:06:19 +0000
Processing by PostsController#update as JSON
Completed 200 OK in 676ms

لا توجد أخطاء، ولا استثناءات، ولكن لم يتم نشر أي حدث :post_edited.

يجب تشغيل الحدث في /var/www/discourse/lib/post_revisor.rb السطر 759:

def post_process_post
  @post.invalidate_oneboxes = true
  @post.trigger_post_process
  DiscourseEvent.trigger(:post_edited, @post, self.topic_changed?, self)
end

يتم استدعاء هذه الطريقة من السطر 341 ولكن الحدث لا يتم إطلاقه.


التأثير

الميزات الرسمية المتأثرة

  • أتمتة Discourse (Discourse Automation): مشغل post_created_edited معطل تمامًا
  • تفشل جميع مسارات سير عمل الأتمتة التي تعتمد على تعديلات المشاركات بصمت

الإضافات المتأثرة

جميع الإضافات التي تستمع إلى أحداث :post_edited معطلة:

  • discourse-automation - مشغلات الأتمتة الرسمية
  • discourse-ai - الإشراف بالذكاء الاصطناعي على المشاركات المعدلة
  • discourse-doc-categories - تحديثات فهرس الوثائق
  • discourse-topic-voting - مسارات سير عمل استرداد الأصوات
  • أي إضافات مخصصة تستخدم أحداث تعديل المشاركات

جدول زمني للتراجع

  1. البناء الأقدم: v2026.1.0-latest - أحداث :post_edited كانت تعمل :white_check_mark:
  2. تم التحديث إلى: latest-release (الإصدار +122) - أحداث :post_edited معطلة :cross_mark:
  3. تم التأكيد على: بيئتي إنتاج مستقلتين (تعطلتا كلتاهما بعد التحديث)

هذا يثبت بشكل قاطع أنه تم إدخال تراجع في إصدارات latest-release الأخيرة.


الحل البديل (Workaround)

التشغيل اليدوي عبر وحدة تحكم Rails يعمل:

automation = DiscourseAutomation::Automation.find(AUTOMATION_ID)
post = Post.find(POST_ID)
automation.trigger!({"post" => post})

هذا يؤكد أن نظام الأتمتة نفسه يعمل - التشغيل التلقائي للحدث هو المعطل فقط.


ملاحظات التكوين

  • الإعدادات التي تم التحقق منها: جميع الإعدادات المتعلقة بالتحرير قياسية/افتراضية
  • فترة السماح: تم الاختبار مع تعديلات خارج فترة السماح (لا تأثير)
  • الإضافات: 50 إضافة مثبتة (الإضافات الرسمية القياسية)
  • لا توجد تعديلات أساسية: تثبيت Discourse نظيف
  • البيئة: كلتا بيئتي الاختبار عبارة عن عمليات نشر متطابقة لـ Azure AKS

الدليل الرئيسي

أهم اكتشاف:

كان لدينا بيئة تطوير تعمل على بناء أقدم. بعد التحديث إلى latest-release +122، توقفت الأتمتة عن العمل. هذا يثبت بيقين أن تراجعًا قد تم إدخاله في الإصدارات الأخيرة.

كلتا البيئتين تُظهران الآن سلوكًا معطلاً متطابقًا بعد أن كانتا على نفس الإصدار.


قابلية التكرار

يمكن تكراره بنسبة 100٪ - تم اختباره على بيئتين مستقلتين:

  1. تثبيت Discourse latest-release (الإصدار +122)
  2. إنشاء أتمتة باستخدام مشغل post_created_edited
  3. تعديل مشاركة
  4. لاحظ أن الأتمتة لا يتم تشغيلها أبدًا
  5. تأكد من أن حدث :post_edited لا يتم إطلاقه أبدًا باستخدام مستمع الاختبار

الملخص

هذا تراجع مؤكد في latest-release (الإصدار +122). كان حدث :post_edited يعمل في الإصدارات السابقة وتوقف عن العمل بعد التحديث. أكدت بيئتان مستقلتان نفس السلوك. هذا يكسر وظيفة الأتمتة الأساسية لـ Discourse وجميع الإضافات التي تعتمد على أحداث تعديل المشاركات.

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

هذه ليست الطريقة التي يعمل بها DiscourseEvent - فهي ليست بين العمليات بل داخل العملية الواحدة. لذا يتم التقاط الأحداث فقط بواسطة المستمعين في نفس العملية التي أطلقتها.

في حالة أتمتة ديسكورس، اختبرتها للتو محليًا بالإعدادات التالية

وقمت بتحرير مشاركة وتم إرسال رسالة الدردشة بنجاح

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

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

شكرًا @zogstrip - لقد اختبرنا أيضًا من خلال مراقبة سجلات الإنتاج أثناء التحرير عبر واجهة الويب:

إجراء الاختبار:

  1. مسح فترة تهدئة الأتمتة عبر وحدة التحكم
  2. مراقبة السجلات: tail -f /var/www/discourse/log/production.log | grep "PDF Automation"
  3. تعديل منشور عبر متصفح الويب (نفس عملية الأتمتة)
  4. النتيجة: يكتمل التعديل بنجاح (200 OK)، ولكن الأتمتة لا يتم تشغيلها أبدًا

لدينا بيئتان متطابقتان (DEV و PROD على Azure AKS):

  • قبل التحديث: عملت أتمتة DEV بشكل مثالي (تظهر إدخالات ملف السجل)
  • بعد التحديث إلى latest-release (+122): توقفت أتمتة DEV و PROD عن العمل
  • تم الاختبار عبر واجهة الويب: لا تزال الأتمتة لا يتم تشغيلها

إعداد الأتمتة الخاص بنا:

  • المشغل: post_created_edited
  • البرنامج النصي: قابل للبرمجة النصية مخصص (run_pdf_generation)
  • التصفية: مُعرّف الفئة 34، الوسم “hd96-24”

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

هل يمكنك المحاولة باستخدام أتمتة “أبسط” تستخدم نفس المشغل؟ هل هناك أي شيء ذي صلة محتمل في /logs؟

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

فكرة جيدة - سأقوم بإنشاء مثال أساسي لاستنساخ المشكلة وإرساله يوم الاثنين. أتمنى لك عطلة نهاية أسبوع سعيدة :slight_smile:

لقد كنت على حق تمامًا بشأن مشكلة العمليات البينية مع DiscourseEvent - شكرًا لك على هذا التوضيح!

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

هذا يؤكد: مشغل post_created_edited يعمل بشكل صحيح.

جاء ارتباكنا من:

  1. الاختبار باستخدام مستمع وحدة تحكم Rails (خطأ - بين العمليات)
  2. فقدان برنامجنا النصي المخصص لملف PDF أثناء إعادة البناء وكنا نواجه صعوبة في إعادة تسجيله بشكل دائم

آلية المشغل نفسها تعمل كما هو متوقع. نعتذر عن الارتباك وشكراً لك على المساعدة!

يسرني أن كل شيء يعمل كما هو متوقع :+1:

الآن الجزء الصعب، وهو تحديد السبب الجذري لعدم عمل السكريبت المخصص run_pdf_generation لديك بعد الآن :sweat_smile:

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