قيد الاختبار حاليًا: سيتم فتح كود GitHub عند الاكتمال.

A · حصول

البنيةrefresh

هذا طلب acquire للقفل. تمثل lease شبكة الأمان التي يستعيد بها الخادم الـkey بعد انتهاء المدة إن اختفى العميل دون release. تحدد wait الانتظار بالثواني؛ وتعني 0 محاولة فورية واحدة بلا دخول queue. لا يوجد انتظار بلا نهاية. النجاح يعيد تم الحصول A، وانتهاء الانتظار Timeout T، وامتلاء queue/server capacity مشغول B.

owner — معرّف ربط الاستجابة

owner هو معرّف استجابة محاولة acquire واحدة. ينشئ العميل قيمة جديدة لكل call، ويعيد الخادم echo القيمة نفسها في A وT وB لربط استجابات pipeline.

ليس owner صلاحية للقفل ولا fencing token. إعادة إرسال key وowner نفسيهما لا تعيد active token ولا تجدد lease. إذا كان من الممكن إرسال بايت واحد من الطلب بلا استجابة مؤكدة، فلا يعيد العميل acquire تلقائيًا بالـowner نفسه؛ النتيجة Indeterminate. لا يجوز دخول critical section، ويُستعاد grant غير المرصود في موعد أقصاه lease expiry.

تنشئ العملاء الرسمية مرة واحدة monotonic deadline للعملية كلها من wait المطبّعة لدى caller، وتحافظ على تلك deadline وعلى owner نفسه في retry المؤكد عدم إرساله. قبل الإرسال مباشرة يقرّب writer الوقت المتبقي إلى الأعلى ويعيد حساب wire wait، ولذلك لا يبدأ اتصال متأخر انتظارًا جديدًا قدره 255 ثانية على server. لا يُرسل طلب queued تجاوز deadline الكلية؛ وإذا كان من الممكن أنه أُرسل، تُغلق الـsession الدقيقة الخاصة به وينتهي بـIndeterminate. وإذا اكتُشف A مترابط من قبل deadline متأخرًا عند gate تسليم Ticket، فلا حاجة لإغلاق session، لكن يُجدول release تعويضي للـexact token ويُعاد Indeterminate. يظل T وB المترابطان timeout نهائيًا وbusy نهائيًا على الترتيب.

يظل wait=0 الأصلي محاولة فورية على wire. خلال transport deadline المنفصلة ومدتها 5 ثوان، لا يجوز للعميل اختيار اتصال آخر وإعادة المحاولة بالـowner نفسه إلا ما دام الطلب مؤكد عدم إرساله؛ وتظل المحاولة الفعلية على server-side واحدة بالضبط. لا تحدث أي إعادة إرسال بعد احتمال الإرسال.

ترميز البايتات: op حرف ASCII، وwait/lease ثنائيان (u8، big-endian)، وowner ثنائي (u64، big-endian)، وkey نص UTF-8 (متغير الطول، يُعرض كـ N في البنية). \n الأخير هو 0A. الرأس الثابت قيمة ثنائية قد تحتوي على 0x0A، لذا يجب استهلاكه أولًا حسب عدد البايتات قبل البحث عن سطر جديد.

التدفق

العميل
الخادم
A · حصول (key · wait · lease · owner)
مفتاح غير محجوز ← يُصدر فورًا
A · تم الحصول عليه (token)
محجوز ← انتظار الدور في طابور FIFO
عند حلول الدور A · تم الحصول عليه (token)
تجاوز wait ← T · انتهاء المهلة
wait=0 + القفل محجوز → T · عدم حصول فوري
امتلاء الطابور ← B · مشغول
طلباستجابة

راجع مصفوفة الطلب × حالة المفتاح للقواعد الكاملة لسلوك الخادم حسب حالة المفتاح.