واجهنا نفس المشكلة وقمنا بتتبعها إلى ما هو أبعد من ذلك.
السبب الجذري هو أن DiscourseUpdates.has_unseen_features؟ تستدعي GitUtils.has_commit؟، والتي تقوم بتشغيل:
git merge-base --is-ancestor <sha> HEAD
في صور Docker الحديثة لـ Discourse، يتم تكوين المستودع داخل الحاوية كـ نسخة جزئية مع خادم بعيد موعود (promisor remote). عندما يكون بصمة الميزة (feature SHA) غير موجودة محليًا، يحاول Git جلبًا كسولًا من الخادم البعيد (upload-pack)، مما يستغرق حوالي 3-4 ثوانٍ لكل استدعاء.
وبما أنه يتم فحص ميزات متعددة، فإن هذا يؤدي إلى وقت طلب يتجاوز 30 ثانية، وينتهي في النهاية بخطأ 502 (مهلة Unicorn)، خاصةً لمستخدمي الموظفين حيث يتم تنفيذ هذا الفحص.
النقاط الرئيسية:
-
يحدث فقط لمستخدمي الموظفين (عبر
CurrentUserSerializer) -
ناتج عن وجود تسميات غير موجودة في النسخة الجزئية
-
عمليات Git على الكائنات المفقودة تؤدي إلى عمليات بحث بطيئة على الخادم البعيد
-
يمكن إعادة إنتاجها عبر
git merge-base --is-ancestor <missing_sha> HEADداخل الحاوية
تخفيف بسيط هو تخزين نتائج GitUtils.has_commit؟ (على سبيل المثال، لكل HEAD+SHA)، مما يتجنب استدعاءات Git المكلفة المتكررة.