ফিল্ড সীমাবদ্ধতা ও মানের পরিসর
অনুরোধ ফিল্ড (C→S)
| ফিল্ড | ধরন | বৈধ পরিসর | অর্থ | লঙ্ঘন হলে |
|---|---|---|---|---|
op | ASCII ১B | 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 | ১ – ১২৮ বাইট | লকের নাম। স্পেস (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ব্যবহার করে, এবং এই immediate attempt-এরও আলাদা 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 ছাড়া মাত্র একটি 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)
| ফিল্ড | ধরন | পরিসর | যেসব সাড়ায় থাকে |
|---|---|---|---|
token | u64 BE | 1 বা তার বেশি, প্রতি ইস্যুতে বাড়ে | A (নতুন ইস্যু) · R/N (অনুরোধের প্রতিধ্বনি) |
owner | u64 BE | অনুরোধের মান হুবহু | A · T · B (অনুরোধের প্রতিধ্বনি) |
key | UTF-8 | অনুরোধের মান হুবহু (১–১২৮B) | A · T · B · R · N |
addr | UTF-8 | host:port | M · L |
reason | ASCII | নির্ধারিত ৮টি | 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 | ৮ B | token(8) |
| S→C | A | ১৬ B | token(8) + owner(8) |
| S→C | T · B | ৮ B | owner(8) |
| S→C | R · N | ৮ B | token(8) |
| S→C | M · 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 লাইনে উল্লেখ থাকে) |
| nonce | base64url-এর ৮ অক্ষর |
| সাড়া ডাইজেস্ট | base64url-এর ৪৩ অক্ষর (প্যাডিং ছাড়া) |
| লাইনের সর্বোচ্চ সীমা | ২৫৬ বাইট |
| সময়সীমা | ১০ সেকেন্ড (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 wait |
| 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 | বন্ধ |
| কী খালি / ১২৮B-এর বেশি / স্পেস বা নিউলাইনসহ / UTF-8 নয় | E bad_key | বন্ধ |
| ফ্রেম ১৯২B-এর বেশি | E line_too_long | বন্ধ |
| প্রমাণীকরণ ডাইজেস্ট মেলে না | E auth_failed | বন্ধ |
| অপেক্ষমাণের সারি পূর্ণ | B + owner + key | বজায় থাকে |
| মুক্তির টোকেন মেলে না | N + token + key | বজায় থাকে |
সব ত্রুটির কারণ ও সংযোগ ব্যবস্থাপনার জন্য সাড়া · ত্রুটি E দেখুন।