فی الحال ٹیسٹنگ جاری ہے: مکمل ہونے پر GitHub کوڈ کھول دیا جائے گا۔

فیلڈ کی پابندیاں اور قدروں کی حدیں

درخواست کے فیلڈز (C→S)

فیلڈقسمدرست حدمطلبخلاف ورزی پر
opASCII 1BA(0x41) · R(0x52)درخواست کی قسمE bad_op
waitu80255 (سیکنڈ)0 بغیر queue فوری کوشش؛ 1..255 acquire انتظار کی حد— (قسم کے لحاظ سے ہمیشہ درست)
leaseu81250 (سیکنڈ)Lease؛ 0 اور 251..255 مسترد/reservedE bad_lease
owneru64 BE02^64-1 مکملحصول کی کوشش کا شناخت کنندہ (کلائنٹ بناتا ہے)— (سرور اس کی جانچ نہیں کرتا)
tokenu64 BEسرور کی جاری کردہ قدرکیا اجراء ہونا ہے یہ طے کرتا ہے (صرف R)مطابقت نہ ہونے پر N
keyUTF-81 – 128 بائٹسلاک کا نام۔ اسپیس (0x20) یا نئی لائن (0x0A) نہیںE bad_key
  • لامحدود wait/lease نہیں ہے۔ سرکاری کلائنٹس ایک سیکنڈ سے کم قدر کو اوپر round کر کے range جانچتے ہیں اور clamp یا send کے بجائے پہلے واضح input error دیتے ہیں۔ Default lease 30 سیکنڈ ہے۔
  • سرکاری client API میں wait، call شروع ہونے سے local queue، یقینی unsent connection retry اور write کے ذریعے response تک پورے acquire کی حد ہے۔ صرف ایک monotonic operation deadline بنائی جاتی ہے؛ اصل send سے عین پہلے writer باقی وقت کو u8 سیکنڈ میں اوپر round کر کے frame کے wait میں رکھتا ہے۔ اس لیے دیر سے دستیاب connection یا یقینی unsent failover server wait کو شروع سے دوبارہ نہیں چلا سکتا۔ deadline پر request ابھی queue میں ہو تو وہ یقینی unsent timeout ہے؛ اگر ایک byte بھی بھیجا گیا ہو سکتا ہے تو اسی exact session کو بند کر کے نتیجہ Indeterminate ہوتا ہے۔ صرف اصل wait=0 wire 0 استعمال کرتا ہے، اور اس فوری کوشش کی الگ finite I/O deadline ہے تاکہ رکا ہوا transport ہمیشہ کے لیے نہ روکے۔ اگر deadline سے عین پہلے correlated A Ticket delivery gate پر دیر سے ملے تو server waiter پہلے ہی ختم ہو چکا ہے: session کھلا رہتا ہے، معلوم exact token کا compensating release کیا جاتا ہے اور نتیجہ Indeterminate رہتا ہے۔ Correlated T/B یقینی non-acquisition ہیں۔
  • اصل wait=0 کے لیے wire اور server رویہ بغیر queue صرف ایک فوری کوشش ہی رہتا ہے۔ اس کی الگ 5 سیکنڈ transport deadline میں، یقینی unsent failure دوسری connection منتخب کر کے اسی owner سے retry کر سکتا ہے۔ ایک byte بھی بھیجا گیا ہو سکتا ہے تو اس کے بعد acquire کبھی retransmit نہیں ہوتا۔
  • سرکاری client API میں wire پر موجود نہ ہونے والا min_work_budget لازمی ہے۔ یہ critical work + متوقع pause + DB commit/rollback completion کو کور کرے، 0..250 سیکنڈ ہو اور normalized lease سے زیادہ نہ ہو۔ خلاف ورزی send سے پہلے UnsupportedDuration/InsufficientLease قسم کی error دیتی ہے۔
  • کلید کی لمبائی حروف میں نہیں، بائٹس میں گنی جاتی ہے — کوریائی حروف UTF-8 میں فی حرف 3 بائٹس لیتے ہیں، اس لیے زیادہ سے زیادہ 42 حروف۔
  • owner صرف response correlation ID ہے، اختیار نہیں۔ اسے دوبارہ استعمال کرنے سے active token واپس یا lease renew نہیں ہوتا۔ ایک client کی concurrent in-flight requests کے لیے الگ nonzero values لازم ہیں؛ counter صفر یا wrap ہونے پر سرکاری clients fail-closed ہوتے ہیں۔
  • معلوم token کے explicit اور compensating release کے لیے call/enqueue سے reconnect/retry سمیت مطلق 5 سیکنڈ ہیں۔ R کامیابی اور N پہلے سے ختم یا current token نہ ہونے کو بتاتا ہے۔ response نہ ملنا کامیابی نہیں؛ bounded compensation queue بھرنے پر lease expiry safety net ہے۔
  • bad_key ایک خالی کلید، 128 بائٹس سے زیادہ کلید، اسپیس یا نئی لائن رکھنے والی کلید، اور غلط UTF-8 — ان سب پر لاگو ہوتا ہے۔ سرکاری کلائنٹس اضافی طور پر کبھی \r نہیں بھیجتے — \r پر ختم ہونے والی کلید خاموشی سے ایک مختلف کلید بن جاتی۔

جواب کے فیلڈز (S→C)

فیلڈقسمحدکن جوابات میں
tokenu64 BE1 یا اس سے زیادہ، ہر اجرا پر بڑھتا ہےA (نیا اجرا) · R/N (درخواست کی بازگشت)
owneru64 BEدرخواست کی قدر بعینہٖA · T · B (درخواست کی بازگشت)
keyUTF-8درخواست کی قدر بعینہٖ (1–128 B)A · T · B · R · N
addrUTF-8host:portM · L
reasonASCIIمقررہ 8 اسبابE

سرور token 0 کبھی جاری نہیں کرتا۔ Single موجودہ process lifetime کا counter استعمال کرتا ہے؛ cluster consensus-replicated counter استعمال کرتا اور overflow سے پہلے fail-closed ہوتا ہے۔ Wall clock یا randomness restart کے بعد monotonicity کی ضمانت نہیں۔

فکسڈ ہیڈر کی لمبائی

op کے فوراً بعد آنے والا مقررہ لمبائی کا بائنری حصہ۔ ان بائٹس میں 0x0A ہو سکتا ہے، اس لیے پارسر کو نئی لائن تلاش کرنے سے پہلے بالکل یہی لمبائی پڑھ لینی چاہیے۔

سمتopفکسڈ ہیڈرترکیب
C→SA10 Bwait(1) + lease(1) + owner(8)
C→SR8 Btoken(8)
S→CA16 Btoken(8) + owner(8)
S→CT · B8 Bowner(8)
S→CR · N8 Btoken(8)
S→CM · L · E0 Bکوئی نہیں (op کے فوراً بعد متن)

بائٹس کم ہونے پر E bad_request ملتا ہے۔

فریم کا سائز

شےقدر
فریم کی بالائی حد (\n کے بغیر)192 بائٹس — اس سے زیادہ پر E line_too_long
زیادہ سے زیادہ A درخواست1 + 10 + 128 + 1 = 140 B
زیادہ سے زیادہ R درخواست1 + 8 + 128 + 1 = 138 B
زیادہ سے زیادہ A جواب1 + 16 + 128 + 1 = 146 B
خالی فریم (صرف \n)keep-alive — سرور اسے نظر انداز کرتا ہے

192B حد زیادہ سے زیادہ frame (146B) سے بڑی ہے، اس لیے compliant client اسے نہیں چھوتا۔ ساختی طور پر malformed یا oversized frame کے بعد framing قابل اعتماد نہیں رہتی اور connection بند کیا جاتا ہے۔

تصدیقی ہینڈ شیک

شےقدر
ہیشSHA-256 (challenge لائن میں درج)
noncebase64url کے 8 حروف
جوابی ڈائجسٹbase64url کے 43 حروف (بغیر padding)
لائن کی بالائی حد256 بائٹس
وقت کی حد10 سیکنڈز (TLS مذاکرات سمیت) — اس سے زیادہ پر کنکشن بند

تفصیلی طریقۂ کار کے لیے تصدیقی ہینڈ شیک دیکھیں۔

سرور سائیڈ حدود

کلائنٹ یہ قدریں براہ راست مقرر نہیں کرتا مگر یہ رویہ متاثر کرتی ہیں۔

آئٹمڈیفالٹسیٹنگحد سے تجاوز پر
فی key waiter2048 (hard cap 16384)MAX_WAITERSB (busy)
کل waiters16384 (hard cap 65536)MAX_TOTAL_WAITERSاس acquire کو B
concurrent client connections1024 (hard cap 8192)MAX_CONNECTIONSفوراً بند
فی connection pending replies256compile-timeسست connection بند
global in-flight acquire4096compile-timeاس acquire کو B
global in-flight release512، الگ lanecompile-timeconnection close تک bounded انتظار
cluster active keys65536compile-timeنئی key acquire کو B

Read buffer (4096B)، response batch (64)، شروع client frame کا progress timeout (5 سیکنڈ) اور single expiry sweep (5 سیکنڈ) compile-time constants ہیں۔ Cluster expiry full scan کے بجائے token-validating deadline min-heap استعمال کرتا ہے۔ کنفیگریشن دیکھیں۔

تمام acquire، نئی key اور تمام waiter کا admission hard limit کے 90% پر بند اور usage 75% سے کم ہونے پر دوبارہ کھلتا ہے۔ اس لیے limit سے پہلے بھی نیا acquire B پا سکتا ہے؛ release اور Raft recovery کی reserved capacity اس hysteresis سے الگ ہے۔

خلاف ورزی ← جواب کا خلاصہ

صورتحالجوابکنکشن
نامعلوم opE bad_opبند
فکسڈ ہیڈر کمE bad_requestبند
lease = 0 یا 251..255E bad_leaseبند
کلید خالی / 128 B سے زیادہ / اسپیس یا نئی لائن والی / UTF-8 نہیںE bad_keyبند
فریم 192 B سے زیادہE line_too_longبند
تصدیقی ڈائجسٹ مطابقت نہیں رکھتاE auth_failedبند
انتظار کی قطار بھری ہوئیB + owner + keyبرقرار
اجراء کا ٹوکن مطابقت نہیں رکھتاN + token + keyبرقرار

خرابی کے تمام اسباب اور کنکشن کے ساتھ سلوک کے لیے جواب · خرابی E دیکھیں۔