বর্তমানে পরীক্ষা চলছে: সম্পূর্ণ হলে GitHub কোড উন্মুক্ত করা হবে।

ফিল্ড সীমাবদ্ধতা ও মানের পরিসর

অনুরোধ ফিল্ড (C→S)

ফিল্ডধরনবৈধ পরিসরঅর্থলঙ্ঘন হলে
opASCII ১BA(0x41) · R(0x52)অনুরোধের ধরনE bad_op
waitu80255 (সেকেন্ড)0 queue ছাড়া তাৎক্ষণিক চেষ্টা; 1..255 acquire অপেক্ষার সীমা— (টাইপ অনুযায়ী সবসময় বৈধ)
leaseu81250 (সেকেন্ড)Lease; 0251..255 প্রত্যাখ্যাত/reservedE bad_lease
owneru64 BE02^64-1 পুরোটাইঅর্জন-প্রচেষ্টার শনাক্তকারী (ক্লায়েন্টের তৈরি)— (সার্ভার যাচাই করে না)
tokenu64 BEসার্ভারের ইস্যু করা মানকী মুক্ত হবে তা নির্দিষ্ট করে (R-এর জন্য)না মিললে N
keyUTF-8১ – ১২৮ বাইটলকের নাম। স্পেস (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 ব্যবহার করে, এবং এই immediate attempt-এরও আলাদা 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 ছাড়া মাত্র একটি immediate attempt-ই থাকে। এর আলাদা 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-এ প্রতি অক্ষরে ৩ বাইট নেয়, তাই সর্বোচ্চ ৪২ অক্ষর।
  • owner শুধু response correlation ID, authority নয়। একই মান আবার ব্যবহার করলে active token ফেরে না বা lease renew হয় না। একই client-এর concurrent in-flight request-এ আলাদা nonzero value দরকার; counter 0 বা wrap হলে official 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-তে খালি কী, ১২৮ বাইটের বেশি, স্পেস/নিউলাইনসহ কী, এবং অবৈধ UTF-8 — সবই অন্তর্ভুক্ত। অফিসিয়াল ক্লায়েন্টগুলো আরও কখনো \r পাঠায় না — \r-এ শেষ হওয়া কী নীরবে ভিন্ন একটি কী হয়ে যাবে।

সাড়া ফিল্ড (S→C)

ফিল্ডধরনপরিসরযেসব সাড়ায় থাকে
tokenu64 BE1 বা তার বেশি, প্রতি ইস্যুতে বাড়েA (নতুন ইস্যু) · R/N (অনুরোধের প্রতিধ্বনি)
owneru64 BEঅনুরোধের মান হুবহুA · T · B (অনুরোধের প্রতিধ্বনি)
keyUTF-8অনুরোধের মান হুবহু (১–১২৮B)A · T · B · R · N
addrUTF-8host:portM · L
reasonASCIIনির্ধারিত ৮টি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→SR৮ Btoken(8)
S→CA১৬ Btoken(8) + owner(8)
S→CT · B৮ Bowner(8)
S→CR · N৮ Btoken(8)
S→CM · L · E০ Bনেই (op-এর পরেই টেক্সট)

বাইট কম পড়লে E bad_request

ফ্রেমের আকার

বিষয়মান
ফ্রেমের সর্বোচ্চ সীমা (\n বাদে)১৯২ বাইট — বেশি হলে E line_too_long
সর্বোচ্চ A অনুরোধ1 + 10 + 128 + 1 = ১৪০ B
সর্বোচ্চ R অনুরোধ1 + 8 + 128 + 1 = ১৩৮ B
সর্বোচ্চ A সাড়া1 + 16 + 128 + 1 = ১৪৬ B
খালি ফ্রেম (শুধু \n)keep-alive — সার্ভার উপেক্ষা করে

192B সীমা সর্বোচ্চ frame (146B)-এর চেয়ে বড়, তাই compliant client এতে পৌঁছায় না। কাঠামোগতভাবে malformed বা oversized frame-এর পর framing বিশ্বাস করা হয় না এবং connection বন্ধ করা হয়।

প্রমাণীকরণ হ্যান্ডশেক

বিষয়মান
হ্যাশSHA-256 (challenge লাইনে উল্লেখ থাকে)
noncebase64url-এর ৮ অক্ষর
সাড়া ডাইজেস্টbase64url-এর ৪৩ অক্ষর (প্যাডিং ছাড়া)
লাইনের সর্বোচ্চ সীমা২৫৬ বাইট
সময়সীমা১০ সেকেন্ড (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 wait
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বন্ধ
কী খালি / ১২৮B-এর বেশি / স্পেস বা নিউলাইনসহ / UTF-8 নয়E bad_keyবন্ধ
ফ্রেম ১৯২B-এর বেশিE line_too_longবন্ধ
প্রমাণীকরণ ডাইজেস্ট মেলে নাE auth_failedবন্ধ
অপেক্ষমাণের সারি পূর্ণB + owner + keyবজায় থাকে
মুক্তির টোকেন মেলে নাN + token + keyবজায় থাকে

সব ত্রুটির কারণ ও সংযোগ ব্যবস্থাপনার জন্য সাড়া · ত্রুটি E দেখুন।