[{"data":1,"prerenderedAt":788},["ShallowReactive",2],{"navigation":3,"\u002Flocks\u002Foptions":151,"\u002Flocks\u002Foptions-surround":783},[4,29,56,79,94,121,128,144],{"title":5,"path":6,"stem":7,"children":8,"icon":27,"defaultOpen":28},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-book-open",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Redis setup","\u002Fgetting-started\u002Fredis-setup","1.getting-started\u002F3.redis-setup","i-lucide-database",{"title":23,"path":24,"stem":25,"icon":26},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F4.quickstart","i-lucide-zap","i-lucide-rocket",true,{"title":30,"icon":31,"path":32,"stem":33,"children":34,"page":55},"Concepts","i-lucide-lightbulb","\u002Fconcepts","2.concepts",[35,40,45,50],{"title":36,"path":37,"stem":38,"icon":39},"Keys","\u002Fconcepts\u002Fkeys","2.concepts\u002F1.keys","i-lucide-key-round",{"title":41,"path":42,"stem":43,"icon":44},"Strict vs lax","\u002Fconcepts\u002Fstrict-vs-lax","2.concepts\u002F2.strict-vs-lax","i-lucide-scale",{"title":46,"path":47,"stem":48,"icon":49},"Comparators","\u002Fconcepts\u002Fcomparators","2.concepts\u002F3.comparators","i-lucide-git-compare",{"title":51,"path":52,"stem":53,"icon":54},"Errors","\u002Fconcepts\u002Ferrors","2.concepts\u002F4.errors","i-lucide-triangle-alert",false,{"title":57,"path":58,"stem":59,"children":60,"icon":63},"Counters","\u002Fcounters","3.counters\u002F1.index",[61,64,69,74],{"title":62,"path":58,"stem":59,"icon":63},"Overview","i-lucide-hash",{"title":65,"path":66,"stem":67,"icon":68},"StrictCounter","\u002Fcounters\u002Fstrict-counter","3.counters\u002F2.strict-counter","i-lucide-target",{"title":70,"path":71,"stem":72,"icon":73},"LaxCounter","\u002Fcounters\u002Flax-counter","3.counters\u002F3.lax-counter","i-lucide-wind",{"title":75,"path":76,"stem":77,"icon":78},"Conditional & batch operations","\u002Fcounters\u002Fconditional-and-batch","3.counters\u002F4.conditional-and-batch","i-lucide-layers",{"title":80,"path":81,"stem":82,"children":83,"icon":85},"Instance-aware counters","\u002Finstance-aware-counters","4.instance-aware-counters\u002F1.index",[84,86,90],{"title":62,"path":81,"stem":82,"icon":85},"i-lucide-network",{"title":87,"path":88,"stem":89,"icon":68},"StrictInstanceAwareCounter","\u002Finstance-aware-counters\u002Fstrict","4.instance-aware-counters\u002F2.strict",{"title":91,"path":92,"stem":93,"icon":73},"LaxInstanceAwareCounter","\u002Finstance-aware-counters\u002Flax","4.instance-aware-counters\u002F3.lax",{"title":95,"path":96,"stem":97,"children":98,"icon":100},"Locks","\u002Flocks","5.locks\u002F1.index",[99,101,106,111,116],{"title":62,"path":96,"stem":97,"icon":100},"i-lucide-lock",{"title":102,"path":103,"stem":104,"icon":105},"Mutex","\u002Flocks\u002Fmutex","5.locks\u002F2.mutex","i-lucide-lock-keyhole",{"title":107,"path":108,"stem":109,"icon":110},"RwLock","\u002Flocks\u002Frwlock","5.locks\u002F3.rwlock","i-lucide-book-lock",{"title":112,"path":113,"stem":114,"icon":115},"Lock options","\u002Flocks\u002Foptions","5.locks\u002F4.options","i-lucide-sliders-horizontal",{"title":117,"path":118,"stem":119,"icon":120},"Guard state & errors","\u002Flocks\u002Fguard-state","5.locks\u002F5.guard-state","i-lucide-shield-alert",{"title":122,"path":123,"stem":124,"children":125,"icon":127},"Rate limiting","\u002Frate-limiting","6.rate-limiting\u002F1.index",[126],{"title":122,"path":123,"stem":124,"icon":127},"i-lucide-gauge",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":55},"Reference","i-lucide-book-marked","\u002Freference","7.reference",[134,139],{"title":135,"path":136,"stem":137,"icon":138},"Feature flags","\u002Freference\u002Ffeature-flags","7.reference\u002F1.feature-flags","i-lucide-flag",{"title":140,"path":141,"stem":142,"icon":143},"API reference","\u002Freference\u002Fapi","7.reference\u002F2.api","i-lucide-file-code",{"title":145,"path":146,"stem":147,"children":148,"icon":150},"Changelog","\u002Fchangelog","8.changelog\u002F1.index",[149],{"title":145,"path":146,"stem":147,"icon":150},"i-lucide-scroll",{"id":152,"title":112,"badge":153,"body":154,"date":153,"description":777,"extension":778,"links":153,"meta":779,"navigation":780,"path":113,"seo":781,"stem":114,"__hash__":782},"docs\u002F5.locks\u002F4.options.md",null,{"type":155,"value":156,"toc":772},"minimark",[157,172,177,352,355,417,421,539,543,546,750,768],[158,159,160,161,164,165,167,168,171],"p",{},"Both ",[162,163,102],"code",{}," and ",[162,166,107],{}," are configured with ",[162,169,170],{},"LockOptions",". The required pieces are the key and the connection; everything else has a sensible default.",[173,174,176],"h2",{"id":175},"fields","Fields",[178,179,184],"pre",{"className":180,"code":181,"language":182,"meta":183,"style":183},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","pub struct LockOptions {\n    pub key: DistkitRedisKey,                 \u002F\u002F the resource being locked\n    pub connection_manager: ConnectionManager,\n    pub namespace: DistkitRedisKey,           \u002F\u002F key prefix (default \"distkit-locks\")\n    pub ttl: Duration,                        \u002F\u002F lease length (default 30 s)\n    pub owner_id: Option\u003CString>,             \u002F\u002F default: a fresh UUID v4\n    pub max_wait: Option\u003CDuration>,           \u002F\u002F cap on waiting acquires (None = wait forever)\n    pub retry_interval: Duration,             \u002F\u002F poll gap while waiting (default 50 ms)\n}\n","rust","",[162,185,186,207,231,247,264,282,307,329,346],{"__ignoreMap":183},[187,188,191,195,199,203],"span",{"class":189,"line":190},"line",1,[187,192,194],{"class":193},"sw1J6","pub",[187,196,198],{"class":197},"sbsja"," struct",[187,200,202],{"class":201},"sbgvK"," LockOptions",[187,204,206],{"class":205},"sP7_E"," {\n",[187,208,210,213,217,221,224,227],{"class":189,"line":209},2,[187,211,212],{"class":193},"    pub",[187,214,216],{"class":215},"su5hD"," key",[187,218,220],{"class":219},"smGrS",":",[187,222,223],{"class":201}," DistkitRedisKey",[187,225,226],{"class":205},",",[187,228,230],{"class":229},"sutJx","                 \u002F\u002F the resource being locked\n",[187,232,234,236,239,241,244],{"class":189,"line":233},3,[187,235,212],{"class":193},[187,237,238],{"class":215}," connection_manager",[187,240,220],{"class":219},[187,242,243],{"class":201}," ConnectionManager",[187,245,246],{"class":205},",\n",[187,248,250,252,255,257,259,261],{"class":189,"line":249},4,[187,251,212],{"class":193},[187,253,254],{"class":215}," namespace",[187,256,220],{"class":219},[187,258,223],{"class":201},[187,260,226],{"class":205},[187,262,263],{"class":229},"           \u002F\u002F key prefix (default \"distkit-locks\")\n",[187,265,267,269,272,274,277,279],{"class":189,"line":266},5,[187,268,212],{"class":193},[187,270,271],{"class":215}," ttl",[187,273,220],{"class":219},[187,275,276],{"class":201}," Duration",[187,278,226],{"class":205},[187,280,281],{"class":229},"                        \u002F\u002F lease length (default 30 s)\n",[187,283,285,287,290,292,295,298,301,304],{"class":189,"line":284},6,[187,286,212],{"class":193},[187,288,289],{"class":215}," owner_id",[187,291,220],{"class":219},[187,293,294],{"class":201}," Option",[187,296,297],{"class":205},"\u003C",[187,299,300],{"class":201},"String",[187,302,303],{"class":205},">,",[187,305,306],{"class":229},"             \u002F\u002F default: a fresh UUID v4\n",[187,308,310,312,315,317,319,321,324,326],{"class":189,"line":309},7,[187,311,212],{"class":193},[187,313,314],{"class":215}," max_wait",[187,316,220],{"class":219},[187,318,294],{"class":201},[187,320,297],{"class":205},[187,322,323],{"class":201},"Duration",[187,325,303],{"class":205},[187,327,328],{"class":229},"           \u002F\u002F cap on waiting acquires (None = wait forever)\n",[187,330,332,334,337,339,341,343],{"class":189,"line":331},8,[187,333,212],{"class":193},[187,335,336],{"class":215}," retry_interval",[187,338,220],{"class":219},[187,340,276],{"class":201},[187,342,226],{"class":205},[187,344,345],{"class":229},"             \u002F\u002F poll gap while waiting (default 50 ms)\n",[187,347,349],{"class":189,"line":348},9,[187,350,351],{"class":205},"}\n",[158,353,354],{},"A few notes:",[356,357,358,375,387,409],"ul",{},[359,360,361,367,368,371,372,374],"li",{},[362,363,364],"strong",{},[162,365,366],{},"ttl"," is the lease length. The lock renews itself every ",[162,369,370],{},"ttl\u002F3",", so the ttl only matters if the holder dies - then the lock frees after at most ",[162,373,366],{},". Shorter ttl means faster recovery from a dead holder but more renewal traffic.",[359,376,377,382,383,386],{},[362,378,379],{},[162,380,381],{},"owner_id"," identifies the holder. Leave it ",[162,384,385],{},"None"," to get a UUID. Set it explicitly only if you need a holder to reattach to a lock it already owns.",[359,388,389,394,395,398,399,398,402,405,406,408],{},[362,390,391],{},[162,392,393],{},"max_wait"," bounds the waiting ",[162,396,397],{},"lock","\u002F",[162,400,401],{},"read",[162,403,404],{},"write"," calls. With ",[162,407,385],{},", they wait indefinitely.",[359,410,411,416],{},[362,412,413],{},[162,414,415],{},"namespace"," prefixes the Redis keys distkit creates, keeping lock keys separate from your other data.",[173,418,420],{"id":419},"the-simple-constructor","The simple constructor",[178,422,424],{"className":180,"code":423,"language":182,"meta":183,"style":183},"use distkit::{DistkitRedisKey, lock::LockOptions};\n\nlet key = DistkitRedisKey::try_from(\"my_resource\".to_string())?;\nlet options = LockOptions::new(key, conn); \u002F\u002F all defaults\n",[162,425,426,455,460,507],{"__ignoreMap":183},[187,427,428,431,434,437,440,443,445,448,450,452],{"class":189,"line":190},[187,429,430],{"class":193},"use",[187,432,433],{"class":201}," distkit",[187,435,436],{"class":219},"::",[187,438,439],{"class":205},"{",[187,441,442],{"class":201},"DistkitRedisKey",[187,444,226],{"class":205},[187,446,447],{"class":201}," lock",[187,449,436],{"class":219},[187,451,170],{"class":201},[187,453,454],{"class":205},"};\n",[187,456,457],{"class":189,"line":209},[187,458,459],{"emptyLinePlaceholder":28},"\n",[187,461,462,465,468,471,473,475,479,482,486,490,492,495,498,501,504],{"class":189,"line":233},[187,463,464],{"class":197},"let",[187,466,467],{"class":215}," key ",[187,469,470],{"class":219},"=",[187,472,223],{"class":201},[187,474,436],{"class":219},[187,476,478],{"class":477},"sGLFI","try_from",[187,480,481],{"class":205},"(",[187,483,485],{"class":484},"sjJ54","\"",[187,487,489],{"class":488},"s_sjI","my_resource",[187,491,485],{"class":484},[187,493,494],{"class":219},".",[187,496,497],{"class":477},"to_string",[187,499,500],{"class":205},"())",[187,502,503],{"class":219},"?",[187,505,506],{"class":205},";\n",[187,508,509,511,514,516,518,520,523,525,528,530,533,536],{"class":189,"line":249},[187,510,464],{"class":197},[187,512,513],{"class":215}," options ",[187,515,470],{"class":219},[187,517,202],{"class":201},[187,519,436],{"class":219},[187,521,522],{"class":477},"new",[187,524,481],{"class":205},[187,526,527],{"class":215},"key",[187,529,226],{"class":205},[187,531,532],{"class":215}," conn",[187,534,535],{"class":205},");",[187,537,538],{"class":229}," \u002F\u002F all defaults\n",[173,540,542],{"id":541},"the-builder","The builder",[158,544,545],{},"For anything beyond defaults, use the builder:",[178,547,549],{"className":180,"code":548,"language":182,"meta":183,"style":183},"use std::time::Duration;\nuse distkit::{DistkitRedisKey, lock::LockOptions};\n\nlet key = DistkitRedisKey::try_from(\"my_resource\".to_string())?;\nlet options = LockOptions::builder(key, conn)\n    .ttl(Duration::from_secs(10))\n    .retry_interval(Duration::from_millis(20))\n    .max_wait(Duration::from_secs(5))\n    .owner_id(\"worker-7\")\n    .build();\n",[162,550,551,569,591,595,627,653,678,701,722,739],{"__ignoreMap":183},[187,552,553,555,558,560,563,565,567],{"class":189,"line":190},[187,554,430],{"class":193},[187,556,557],{"class":201}," std",[187,559,436],{"class":219},[187,561,562],{"class":201},"time",[187,564,436],{"class":219},[187,566,323],{"class":201},[187,568,506],{"class":205},[187,570,571,573,575,577,579,581,583,585,587,589],{"class":189,"line":209},[187,572,430],{"class":193},[187,574,433],{"class":201},[187,576,436],{"class":219},[187,578,439],{"class":205},[187,580,442],{"class":201},[187,582,226],{"class":205},[187,584,447],{"class":201},[187,586,436],{"class":219},[187,588,170],{"class":201},[187,590,454],{"class":205},[187,592,593],{"class":189,"line":233},[187,594,459],{"emptyLinePlaceholder":28},[187,596,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625],{"class":189,"line":249},[187,598,464],{"class":197},[187,600,467],{"class":215},[187,602,470],{"class":219},[187,604,223],{"class":201},[187,606,436],{"class":219},[187,608,478],{"class":477},[187,610,481],{"class":205},[187,612,485],{"class":484},[187,614,489],{"class":488},[187,616,485],{"class":484},[187,618,494],{"class":219},[187,620,497],{"class":477},[187,622,500],{"class":205},[187,624,503],{"class":219},[187,626,506],{"class":205},[187,628,629,631,633,635,637,639,642,644,646,648,650],{"class":189,"line":266},[187,630,464],{"class":197},[187,632,513],{"class":215},[187,634,470],{"class":219},[187,636,202],{"class":201},[187,638,436],{"class":219},[187,640,641],{"class":477},"builder",[187,643,481],{"class":205},[187,645,527],{"class":215},[187,647,226],{"class":205},[187,649,532],{"class":215},[187,651,652],{"class":205},")\n",[187,654,655,658,660,662,664,666,669,671,675],{"class":189,"line":284},[187,656,657],{"class":219},"    .",[187,659,366],{"class":477},[187,661,481],{"class":205},[187,663,323],{"class":201},[187,665,436],{"class":219},[187,667,668],{"class":477},"from_secs",[187,670,481],{"class":205},[187,672,674],{"class":673},"srdBf","10",[187,676,677],{"class":205},"))\n",[187,679,680,682,685,687,689,691,694,696,699],{"class":189,"line":309},[187,681,657],{"class":219},[187,683,684],{"class":477},"retry_interval",[187,686,481],{"class":205},[187,688,323],{"class":201},[187,690,436],{"class":219},[187,692,693],{"class":477},"from_millis",[187,695,481],{"class":205},[187,697,698],{"class":673},"20",[187,700,677],{"class":205},[187,702,703,705,707,709,711,713,715,717,720],{"class":189,"line":331},[187,704,657],{"class":219},[187,706,393],{"class":477},[187,708,481],{"class":205},[187,710,323],{"class":201},[187,712,436],{"class":219},[187,714,668],{"class":477},[187,716,481],{"class":205},[187,718,719],{"class":673},"5",[187,721,677],{"class":205},[187,723,724,726,728,730,732,735,737],{"class":189,"line":348},[187,725,657],{"class":219},[187,727,381],{"class":477},[187,729,481],{"class":205},[187,731,485],{"class":484},[187,733,734],{"class":488},"worker-7",[187,736,485],{"class":484},[187,738,652],{"class":205},[187,740,742,744,747],{"class":189,"line":741},10,[187,743,657],{"class":219},[187,745,746],{"class":477},"build",[187,748,749],{"class":205},"();\n",[158,751,752,753,755,756,755,758,755,760,755,762,764,765,494],{},"The builder methods mirror the fields: ",[162,754,415],{},", ",[162,757,366],{},[162,759,381],{},[162,761,393],{},[162,763,684],{},", then ",[162,766,767],{},"build()",[769,770,771],"style",{},"html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":183,"searchDepth":190,"depth":209,"links":773},[774,775,776],{"id":175,"depth":209,"text":176},{"id":419,"depth":209,"text":420},{"id":541,"depth":209,"text":542},"Tune TTL, owner, wait bounds, and namespace via LockOptions and its builder.","md",{},{"icon":115},{"title":112,"description":777},"LxNd3vMkuqFcHydMwoa5osZxDU2vr6iElwS3J7KNmNs",[784,786],{"title":107,"path":108,"stem":109,"description":785,"icon":110,"children":-1},"A writer-preferring distributed reader-writer lock.",{"title":117,"path":118,"stem":119,"description":787,"icon":120,"children":-1},"Reading a guard's lease state and handling acquisition failures.",1781569583359]