احتمال حدوث حالة تسابق عند تعديل منشور

المشكلة

يمكن أن تؤدي التعديلات المتزامنة على صفحة ويكي واحدة إلى سلوك غير متوقع. في حالتي، أصبحت علاقة quoted_posts بين منشورين غير صحيحة.

قد يؤدي هذا إلى مشاكل أخرى عند استخدام quoted_posts، كما في حالة User#refresh_avatar. فغياب quoted_posts يجعل من المستحيل إعادة معالجة جميع المنشورات المُقتَبة.

السبب المحتمل

التحذير المُدرج في هذا التعديل غير كافٍ لحماية التعديلات المتزامنة على منشور، حيث أن الفحص ليس ذريًا. هذه حالة نادرة ولكنها لا تزال ممكنة الحدوث.

تُستدعي PostRevisor#revise! الدالة QuotedPost.extract_from(@post)، والتي تحذف جميع quoted_posts إذا لم يكن هناك أي اقتباسات في المنشور. عندما يُجري تعديلان استدعاءً لـ PostRevisor#revise! في وقت واحد، أحدهما لإضافة منشور مُقتَب والآخر لإضافة منشور مُقتَب، فقد ينتهي الأمر بمحتوى المنشور بالاحتفاظ بتعديل يحتوي على اقتباسات بينما تُدمر علاقة quoted_post بواسطة التعديل الذي لا يحتوي على أي اقتباسات.

الإصلاح المحتمل

ربما يجب أن ننظر في الحصول على قفل Redis عند تعديل منشور.

3 إعجابات

هذا ممكن على ما أظرف، وأنا لستُ معارضًا بقوة لإضافة قفل موزّع هنا. لكن التحدي يكمن في أنني لا أريد المخاطرة بأي تعارضات (deadlocks)، لذا يجب أن نكون حذرين للغاية.

إذا كان التحرير المتزامن هو ما تفضّله حقًا، فلماذا لا تجرب ميزة التحرير المشترك؟

3 إعجابات