فیلڈ کی پابندیاں اور قدروں کی حدیں
درخواست کے فیلڈز (C→S)
| فیلڈ | قسم | درست حد | مطلب | خلاف ورزی پر |
|---|---|---|---|---|
op | ASCII 1B | A(0x41) · R(0x52) | درخواست کی قسم | E bad_op |
wait | u8 | 0–255 (سیکنڈ) | 0 بغیر queue فوری کوشش؛ 1..255 acquire انتظار کی حد | — (قسم کے لحاظ سے ہمیشہ درست) |
lease | u8 | 1–250 (سیکنڈ) | Lease؛ 0 اور 251..255 مسترد/reserved | E bad_lease |
owner | u64 BE | 0 – 2^64-1 مکمل | حصول کی کوشش کا شناخت کنندہ (کلائنٹ بناتا ہے) | — (سرور اس کی جانچ نہیں کرتا) |
token | u64 BE | سرور کی جاری کردہ قدر | کیا اجراء ہونا ہے یہ طے کرتا ہے (صرف R) | مطابقت نہ ہونے پر N |
key | UTF-8 | 1 – 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=0wire0استعمال کرتا ہے، اور اس فوری کوشش کی الگ finite I/O deadline ہے تاکہ رکا ہوا transport ہمیشہ کے لیے نہ روکے۔ اگر deadline سے عین پہلے correlatedATicket delivery gate پر دیر سے ملے تو server waiter پہلے ہی ختم ہو چکا ہے: session کھلا رہتا ہے، معلوم exact token کا compensating release کیا جاتا ہے اور نتیجہIndeterminateرہتا ہے۔ CorrelatedT/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)
| فیلڈ | قسم | حد | کن جوابات میں |
|---|---|---|---|
token | u64 BE | 1 یا اس سے زیادہ، ہر اجرا پر بڑھتا ہے | A (نیا اجرا) · R/N (درخواست کی بازگشت) |
owner | u64 BE | درخواست کی قدر بعینہٖ | A · T · B (درخواست کی بازگشت) |
key | UTF-8 | درخواست کی قدر بعینہٖ (1–128 B) | A · T · B · R · N |
addr | UTF-8 | host:port | M · L |
reason | ASCII | مقررہ 8 اسباب | E |
سرور token 0 کبھی جاری نہیں کرتا۔ Single موجودہ process lifetime کا counter استعمال کرتا ہے؛ cluster consensus-replicated counter استعمال کرتا اور overflow سے پہلے fail-closed ہوتا ہے۔ Wall clock یا randomness restart کے بعد monotonicity کی ضمانت نہیں۔
فکسڈ ہیڈر کی لمبائی
op کے فوراً بعد آنے والا مقررہ لمبائی کا بائنری حصہ۔ ان بائٹس میں 0x0A ہو سکتا ہے، اس لیے پارسر کو نئی لائن تلاش کرنے سے پہلے بالکل یہی لمبائی پڑھ لینی چاہیے۔
| سمت | op | فکسڈ ہیڈر | ترکیب |
|---|---|---|---|
| C→S | A | 10 B | wait(1) + lease(1) + owner(8) |
| C→S | R | 8 B | token(8) |
| S→C | A | 16 B | token(8) + owner(8) |
| S→C | T · B | 8 B | owner(8) |
| S→C | R · N | 8 B | token(8) |
| S→C | M · L · E | 0 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 لائن میں درج) |
| nonce | base64url کے 8 حروف |
| جوابی ڈائجسٹ | base64url کے 43 حروف (بغیر padding) |
| لائن کی بالائی حد | 256 بائٹس |
| وقت کی حد | 10 سیکنڈز (TLS مذاکرات سمیت) — اس سے زیادہ پر کنکشن بند |
تفصیلی طریقۂ کار کے لیے تصدیقی ہینڈ شیک دیکھیں۔
سرور سائیڈ حدود
کلائنٹ یہ قدریں براہ راست مقرر نہیں کرتا مگر یہ رویہ متاثر کرتی ہیں۔
| آئٹم | ڈیفالٹ | سیٹنگ | حد سے تجاوز پر |
|---|---|---|---|
| فی key waiter | 2048 (hard cap 16384) | MAX_WAITERS | B (busy) |
| کل waiters | 16384 (hard cap 65536) | MAX_TOTAL_WAITERS | اس acquire کو B |
| concurrent client connections | 1024 (hard cap 8192) | MAX_CONNECTIONS | فوراً بند |
| فی connection pending replies | 256 | compile-time | سست connection بند |
| global in-flight acquire | 4096 | compile-time | اس acquire کو B |
| global in-flight release | 512، الگ lane | compile-time | connection close تک bounded انتظار |
| cluster active keys | 65536 | compile-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 سے الگ ہے۔
خلاف ورزی ← جواب کا خلاصہ
| صورتحال | جواب | کنکشن |
|---|---|---|
| نامعلوم op | E bad_op | بند |
| فکسڈ ہیڈر کم | E bad_request | بند |
lease = 0 یا 251..255 | E 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 دیکھیں۔