Adding large folders

This commit is contained in:
2026-02-26 12:00:21 -05:00
parent 5400d82acd
commit 49701c85ad
47332 changed files with 1942573 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="This module contains generic backoff utilities to be used with the retry layer."><title>tower::retry::backoff - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module backoff</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module backoff</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="../index.html">In tower::<wbr>retry</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">tower</a>::<wbr><a href="../index.html">retry</a></div><h1>Module <span>backoff</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../src/tower/retry/backoff.rs.html#1-279">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>This module contains generic <a href="https://en.wikipedia.org/wiki/Exponential_backoff">backoff</a> utilities to be used with the retry
layer.</p>
<p>The <a href="trait.Backoff.html" title="trait tower::retry::backoff::Backoff"><code>Backoff</code></a> trait is a generic way to represent backoffs that can use
any timer type.</p>
<p><a href="struct.ExponentialBackoffMaker.html" title="struct tower::retry::backoff::ExponentialBackoffMaker"><code>ExponentialBackoffMaker</code></a> implements the maker type for<br />
<a href="struct.ExponentialBackoff.html" title="struct tower::retry::backoff::ExponentialBackoff"><code>ExponentialBackoff</code></a> which implements the <a href="trait.Backoff.html" title="trait tower::retry::backoff::Backoff"><code>Backoff</code></a> trait and provides
a batteries included exponential backoff and jitter strategy.</p>
</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.ExponentialBackoff.html" title="struct tower::retry::backoff::ExponentialBackoff">Exponential<wbr>Backoff</a></dt><dd>A jittered <a href="https://en.wikipedia.org/wiki/Exponential_backoff">exponential backoff</a> strategy.</dd><dt><a class="struct" href="struct.ExponentialBackoffMaker.html" title="struct tower::retry::backoff::ExponentialBackoffMaker">Exponential<wbr>Backoff<wbr>Maker</a></dt><dd>A maker type for <a href="struct.ExponentialBackoff.html" title="struct tower::retry::backoff::ExponentialBackoff"><code>ExponentialBackoff</code></a>.</dd><dt><a class="struct" href="struct.InvalidBackoff.html" title="struct tower::retry::backoff::InvalidBackoff">Invalid<wbr>Backoff</a></dt><dd>Backoff validation error.</dd></dl><h2 id="traits" class="section-header">Traits<a href="#traits" class="anchor">§</a></h2><dl class="item-table"><dt><a class="trait" href="trait.Backoff.html" title="trait tower::retry::backoff::Backoff">Backoff</a></dt><dd>A backoff trait where a single mutable reference represents a single
backoff session. Implementors must also implement <a href="https://doc.rust-lang.org/1.93.1/core/clone/trait.Clone.html" title="trait core::clone::Clone"><code>Clone</code></a> which will
reset the backoff back to the default state for the next session.</dd><dt><a class="trait" href="trait.MakeBackoff.html" title="trait tower::retry::backoff::MakeBackoff">Make<wbr>Backoff</a></dt><dd>Trait used to construct <a href="trait.Backoff.html" title="trait tower::retry::backoff::Backoff"><code>Backoff</code></a> trait implementors.</dd></dl></section></div></main></body></html>

View File

@@ -0,0 +1 @@
window.SIDEBAR_ITEMS = {"struct":["ExponentialBackoff","ExponentialBackoffMaker","InvalidBackoff"],"trait":["Backoff","MakeBackoff"]};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,13 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A backoff trait where a single mutable reference represents a single backoff session. Implementors must also implement `Clone` which will reset the backoff back to the default state for the next session."><title>Backoff in tower::retry::backoff - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc trait"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Backoff</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Backoff</a></h2><h3><a href="#required-associated-types">Required Associated Types</a></h3><ul class="block"><li><a href="#associatedtype.Future" title="Future">Future</a></li></ul><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.next_backoff" title="next_backoff">next_backoff</a></li></ul><h3><a href="#implementors">Implementors</a></h3></section><div id="rustdoc-modnav"><h2><a href="index.html">In tower::<wbr>retry::<wbr>backoff</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">tower</a>::<wbr><a href="../index.html">retry</a>::<wbr><a href="index.html">backoff</a></div><h1>Trait <span class="trait">Backoff</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../src/tower/retry/backoff.rs.html#32-39">Source</a> </span></div><pre class="rust item-decl"><code>pub trait Backoff {
type <a href="#associatedtype.Future" class="associatedtype">Future</a>: <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.unit.html">()</a>&gt;;
// Required method
fn <a href="#tymethod.next_backoff" class="fn">next_backoff</a>(&amp;mut self) -&gt; Self::<a class="associatedtype" href="trait.Backoff.html#associatedtype.Future" title="type tower::retry::backoff::Backoff::Future">Future</a>;
}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>A backoff trait where a single mutable reference represents a single
backoff session. Implementors must also implement <a href="https://doc.rust-lang.org/1.93.1/core/clone/trait.Clone.html" title="trait core::clone::Clone"><code>Clone</code></a> which will
reset the backoff back to the default state for the next session.</p>
</div></details><h2 id="required-associated-types" class="section-header">Required Associated Types<a href="#required-associated-types" class="anchor">§</a></h2><div class="methods"><details class="toggle" open><summary><section id="associatedtype.Future" class="method"><a class="src rightside" href="../../../src/tower/retry/backoff.rs.html#35">Source</a><h4 class="code-header">type <a href="#associatedtype.Future" class="associatedtype">Future</a>: <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.unit.html">()</a>&gt;</h4></section></summary><div class="docblock"><p>The future associated with each backoff. This usually will be some sort
of timer.</p>
</div></details></div><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.next_backoff" class="method"><a class="src rightside" href="../../../src/tower/retry/backoff.rs.html#38">Source</a><h4 class="code-header">fn <a href="#tymethod.next_backoff" class="fn">next_backoff</a>(&amp;mut self) -&gt; Self::<a class="associatedtype" href="trait.Backoff.html#associatedtype.Future" title="type tower::retry::backoff::Backoff::Future">Future</a></h4></section></summary><div class="docblock"><p>Initiate the next backoff in the sequence.</p>
</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-Backoff-for-ExponentialBackoff%3CR%3E" class="impl"><a class="src rightside" href="../../../src/tower/retry/backoff.rs.html#170-184">Source</a><a href="#impl-Backoff-for-ExponentialBackoff%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="trait.Backoff.html" title="trait tower::retry::backoff::Backoff">Backoff</a> for <a class="struct" href="struct.ExponentialBackoff.html" title="struct tower::retry::backoff::ExponentialBackoff">ExponentialBackoff</a>&lt;R&gt;<div class="where">where
R: <a class="trait" href="../../util/rng/trait.Rng.html" title="trait tower::util::rng::Rng">Rng</a>,</div></h3></section></summary><div class="impl-items"><section id="associatedtype.Future-1" class="associatedtype trait-impl"><a class="src rightside" href="../../../src/tower/retry/backoff.rs.html#174">Source</a><a href="#associatedtype.Future-1" class="anchor">§</a><h4 class="code-header">type <a href="#associatedtype.Future" class="associatedtype">Future</a> = <a class="struct" href="../../../tokio/time/sleep/struct.Sleep.html" title="struct tokio::time::sleep::Sleep">Sleep</a></h4></section></div></details></div><script src="../../../trait.impl/tower/retry/backoff/trait.Backoff.js" async></script></section></div></main></body></html>

View File

@@ -0,0 +1,10 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Trait used to construct `Backoff` trait implementors."><title>MakeBackoff in tower::retry::backoff - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc trait"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">MakeBackoff</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Make<wbr>Backoff</a></h2><h3><a href="#required-associated-types">Required Associated Types</a></h3><ul class="block"><li><a href="#associatedtype.Backoff" title="Backoff">Backoff</a></li></ul><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.make_backoff" title="make_backoff">make_backoff</a></li></ul><h3><a href="#implementors">Implementors</a></h3></section><div id="rustdoc-modnav"><h2><a href="index.html">In tower::<wbr>retry::<wbr>backoff</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">tower</a>::<wbr><a href="../index.html">retry</a>::<wbr><a href="index.html">backoff</a></div><h1>Trait <span class="trait">Make<wbr>Backoff</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../src/tower/retry/backoff.rs.html#21-27">Source</a> </span></div><pre class="rust item-decl"><code>pub trait MakeBackoff {
type <a href="#associatedtype.Backoff" class="associatedtype">Backoff</a>: <a class="trait" href="trait.Backoff.html" title="trait tower::retry::backoff::Backoff">Backoff</a>;
// Required method
fn <a href="#tymethod.make_backoff" class="fn">make_backoff</a>(&amp;mut self) -&gt; Self::<a class="associatedtype" href="trait.MakeBackoff.html#associatedtype.Backoff" title="type tower::retry::backoff::MakeBackoff::Backoff">Backoff</a>;
}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Trait used to construct <a href="trait.Backoff.html" title="trait tower::retry::backoff::Backoff"><code>Backoff</code></a> trait implementors.</p>
</div></details><h2 id="required-associated-types" class="section-header">Required Associated Types<a href="#required-associated-types" class="anchor">§</a></h2><div class="methods"><details class="toggle" open><summary><section id="associatedtype.Backoff" class="method"><a class="src rightside" href="../../../src/tower/retry/backoff.rs.html#23">Source</a><h4 class="code-header">type <a href="#associatedtype.Backoff" class="associatedtype">Backoff</a>: <a class="trait" href="trait.Backoff.html" title="trait tower::retry::backoff::Backoff">Backoff</a></h4></section></summary><div class="docblock"><p>The backoff type produced by this maker.</p>
</div></details></div><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.make_backoff" class="method"><a class="src rightside" href="../../../src/tower/retry/backoff.rs.html#26">Source</a><h4 class="code-header">fn <a href="#tymethod.make_backoff" class="fn">make_backoff</a>(&amp;mut self) -&gt; Self::<a class="associatedtype" href="trait.MakeBackoff.html#associatedtype.Backoff" title="type tower::retry::backoff::MakeBackoff::Backoff">Backoff</a></h4></section></summary><div class="docblock"><p>Constructs a new backoff type.</p>
</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><details class="toggle implementors-toggle"><summary><section id="impl-MakeBackoff-for-ExponentialBackoffMaker%3CR%3E" class="impl"><a class="src rightside" href="../../../src/tower/retry/backoff.rs.html#117-132">Source</a><a href="#impl-MakeBackoff-for-ExponentialBackoffMaker%3CR%3E" class="anchor">§</a><h3 class="code-header">impl&lt;R&gt; <a class="trait" href="trait.MakeBackoff.html" title="trait tower::retry::backoff::MakeBackoff">MakeBackoff</a> for <a class="struct" href="struct.ExponentialBackoffMaker.html" title="struct tower::retry::backoff::ExponentialBackoffMaker">ExponentialBackoffMaker</a>&lt;R&gt;<div class="where">where
R: <a class="trait" href="../../util/rng/trait.Rng.html" title="trait tower::util::rng::Rng">Rng</a> + <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</div></h3></section></summary><div class="impl-items"><section id="associatedtype.Backoff-1" class="associatedtype trait-impl"><a class="src rightside" href="../../../src/tower/retry/backoff.rs.html#121">Source</a><a href="#associatedtype.Backoff-1" class="anchor">§</a><h4 class="code-header">type <a href="#associatedtype.Backoff" class="associatedtype">Backoff</a> = <a class="struct" href="struct.ExponentialBackoff.html" title="struct tower::retry::backoff::ExponentialBackoff">ExponentialBackoff</a>&lt;R&gt;</h4></section></div></details></div><script src="../../../trait.impl/tower/retry/backoff/trait.MakeBackoff.js" async></script></section></div></main></body></html>

View File

@@ -0,0 +1,61 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A retry “budget” for allowing only a certain amount of retries over time."><title>tower::retry::budget - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module budget</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module budget</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#why-budgets-and-not-max-retries" title="Why budgets and not max retries?">Why budgets and not max retries?</a></li><li><a href="#examples" title="Examples">Examples</a></li></ul><h3><a href="#reexports">Module Items</a></h3><ul class="block"><li><a href="#reexports" title="Re-exports">Re-exports</a></li><li><a href="#modules" title="Modules">Modules</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="../index.html">In tower::<wbr>retry</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">tower</a>::<wbr><a href="../index.html">retry</a></div><h1>Module <span>budget</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../src/tower/retry/budget/mod.rs.html#1-90">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>A retry “budget” for allowing only a certain amount of retries over time.</p>
<h2 id="why-budgets-and-not-max-retries"><a class="doc-anchor" href="#why-budgets-and-not-max-retries">§</a>Why budgets and not max retries?</h2>
<p>The most common way of configuring retries is to specify a maximum
number of retry attempts to perform before giving up. This is a familiar idea to anyone
whos used a web browser: you try to load a webpage, and if it doesnt load, you try again.
If it still doesnt load, you try a third time. Finally you give up.</p>
<p>Unfortunately, there are at least two problems with configuring retries this way:</p>
<p><strong>Choosing the maximum number of retry attempts is a guessing game.</strong>
You need to pick a number thats high enough to make a difference when things are somewhat failing,
but not so high that it generates extra load on the system when its really failing. In practice,
you usually pick a maximum retry attempts number out of a hat (e.g. 3) and hope for the best.</p>
<p><strong>Systems configured this way are vulnerable to retry storms.</strong>
A retry storm begins when one service starts to experience a larger than normal failure rate.
This causes its clients to retry those failed requests. The extra load from the retries causes the
service to slow down further and fail more requests, triggering more retries. If each client is
configured to retry up to 3 times, this can quadruple the number of requests being sent! To make
matters even worse, if any of the clients clients are configured with retries, the number of retries
compounds multiplicatively and can turn a small number of errors into a self-inflicted denial of service attack.</p>
<p>Its generally dangerous to implement retries without some limiting factor. <a href="trait.Budget.html" title="trait tower::retry::budget::Budget"><code>Budget</code></a>s are that limit.</p>
<h2 id="examples"><a class="doc-anchor" href="#examples">§</a>Examples</h2>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::{future, sync::Arc};
<span class="kw">use </span>tower::retry::{budget::{Budget, TpsBudget}, Policy};
<span class="kw">type </span>Req = String;
<span class="kw">type </span>Res = String;
<span class="attr">#[derive(Clone, Debug)]
</span><span class="kw">struct </span>RetryPolicy {
budget: Arc&lt;TpsBudget&gt;,
}
<span class="kw">impl</span>&lt;E&gt; Policy&lt;Req, Res, E&gt; <span class="kw">for </span>RetryPolicy {
<span class="kw">type </span>Future = future::Ready&lt;()&gt;;
<span class="kw">fn </span>retry(<span class="kw-2">&amp;mut </span><span class="self">self</span>, req: <span class="kw-2">&amp;mut </span>Req, result: <span class="kw-2">&amp;mut </span><span class="prelude-ty">Result</span>&lt;Res, E&gt;) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="self">Self</span>::Future&gt; {
<span class="kw">match </span>result {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
<span class="comment">// Treat all `Response`s as success,
// so deposit budget and don't retry...
</span><span class="self">self</span>.budget.deposit();
<span class="prelude-val">None
</span>}
<span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; {
<span class="comment">// Treat all errors as failures...
// Withdraw the budget, don't retry if we overdrew.
</span><span class="kw">let </span>withdrew = <span class="self">self</span>.budget.withdraw();
<span class="kw">if </span>!withdrew {
<span class="kw">return </span><span class="prelude-val">None</span>;
}
<span class="comment">// Try again!
</span><span class="prelude-val">Some</span>(future::ready(()))
}
}
}
<span class="kw">fn </span>clone_request(<span class="kw-2">&amp;mut </span><span class="self">self</span>, req: <span class="kw-2">&amp;</span>Req) -&gt; <span class="prelude-ty">Option</span>&lt;Req&gt; {
<span class="prelude-val">Some</span>(req.clone())
}
}</code></pre></div></div></details><h2 id="reexports" class="section-header">Re-exports<a href="#reexports" class="anchor">§</a></h2><dl class="item-table reexports"><dt id="reexport.TpsBudget"><code>pub use tps_budget::<a class="struct" href="tps_budget/struct.TpsBudget.html" title="struct tower::retry::budget::tps_budget::TpsBudget">TpsBudget</a>;</code></dt></dl><h2 id="modules" class="section-header">Modules<a href="#modules" class="anchor">§</a></h2><dl class="item-table"><dt><a class="mod" href="tps_budget/index.html" title="mod tower::retry::budget::tps_budget">tps_<wbr>budget</a></dt><dd>Transactions Per Minute (Tps) Budget implementations</dd></dl><h2 id="traits" class="section-header">Traits<a href="#traits" class="anchor">§</a></h2><dl class="item-table"><dt><a class="trait" href="trait.Budget.html" title="trait tower::retry::budget::Budget">Budget</a></dt><dd>For more info about <a href="trait.Budget.html" title="trait tower::retry::budget::Budget"><code>Budget</code></a>, please see the <a href="index.html" title="mod tower::retry::budget">module-level documentation</a>.</dd></dl></section></div></main></body></html>

View File

@@ -0,0 +1 @@
window.SIDEBAR_ITEMS = {"mod":["tps_budget"],"trait":["Budget"]};

View File

@@ -0,0 +1,2 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Transactions Per Minute (Tps) Budget implementations"><title>tower::retry::budget::tps_budget - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../../" data-static-root-path="../../../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module tps_budget</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module tps_<wbr>budget</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="../index.html">In tower::<wbr>retry::<wbr>budget</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../../index.html">tower</a>::<wbr><a href="../../index.html">retry</a>::<wbr><a href="../index.html">budget</a></div><h1>Module <span>tps_<wbr>budget</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../../src/tower/retry/budget/tps_budget.rs.html#1-260">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Transactions Per Minute (Tps) Budget implementations</p>
</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.TpsBudget.html" title="struct tower::retry::budget::tps_budget::TpsBudget">TpsBudget</a></dt><dd>A Transactions Per Minute config for managing retry tokens.</dd></dl></section></div></main></body></html>

View File

@@ -0,0 +1 @@
window.SIDEBAR_ITEMS = {"struct":["TpsBudget"]};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="For more info about `Budget`, please see the module-level documentation."><title>Budget in tower::retry::budget - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc trait"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Budget</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Budget</a></h2><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.deposit" title="deposit">deposit</a></li><li><a href="#tymethod.withdraw" title="withdraw">withdraw</a></li></ul><h3><a href="#implementors">Implementors</a></h3></section><div id="rustdoc-modnav"><h2><a href="index.html">In tower::<wbr>retry::<wbr>budget</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">tower</a>::<wbr><a href="../index.html">retry</a>::<wbr><a href="index.html">budget</a></div><h1>Trait <span class="trait">Budget</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../src/tower/retry/budget/mod.rs.html#80-90">Source</a> </span></div><pre class="rust item-decl"><code>pub trait Budget {
// Required methods
fn <a href="#tymethod.deposit" class="fn">deposit</a>(&amp;self);
<span class="item-spacer"></span> fn <a href="#tymethod.withdraw" class="fn">withdraw</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.bool.html">bool</a>;
}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>For more info about <a href="trait.Budget.html" title="trait tower::retry::budget::Budget"><code>Budget</code></a>, please see the <a href="index.html" title="mod tower::retry::budget">module-level documentation</a>.</p>
</div></details><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.deposit" class="method"><a class="src rightside" href="../../../src/tower/retry/budget/mod.rs.html#83">Source</a><h4 class="code-header">fn <a href="#tymethod.deposit" class="fn">deposit</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Store a “deposit” in the budget, which will be used to permit future
withdrawals.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.withdraw" class="method"><a class="src rightside" href="../../../src/tower/retry/budget/mod.rs.html#89">Source</a><h4 class="code-header">fn <a href="#tymethod.withdraw" class="fn">withdraw</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check whether there is enough “balance” in the budget to issue a new
retry.</p>
<p>If there is not enough, false is returned.</p>
</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"><section id="impl-Budget-for-TpsBudget" class="impl"><a class="src rightside" href="../../../src/tower/retry/budget/tps_budget.rs.html#173-181">Source</a><a href="#impl-Budget-for-TpsBudget" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="trait.Budget.html" title="trait tower::retry::budget::Budget">Budget</a> for <a class="struct" href="tps_budget/struct.TpsBudget.html" title="struct tower::retry::budget::tps_budget::TpsBudget">TpsBudget</a></h3></section></div><script src="../../../trait.impl/tower/retry/budget/trait.Budget.js" async></script></section></div></main></body></html>

View File

@@ -0,0 +1,2 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Future types"><title>tower::retry::future - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module future</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module future</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="../index.html">In tower::<wbr>retry</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">tower</a>::<wbr><a href="../index.html">retry</a></div><h1>Module <span>future</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../../src/tower/retry/future.rs.html#1-119">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Future types</p>
</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.ResponseFuture.html" title="struct tower::retry::future::ResponseFuture">Response<wbr>Future</a></dt><dd>The <a href="https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html" title="trait core::future::future::Future"><code>Future</code></a> returned by a <a href="../struct.Retry.html" title="struct tower::retry::Retry"><code>Retry</code></a> service.</dd></dl></section></div></main></body></html>

View File

@@ -0,0 +1 @@
window.SIDEBAR_ITEMS = {"struct":["ResponseFuture"]};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,3 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Middleware for retrying “failed” requests."><title>tower::retry - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module retry</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module retry</a></h2><h3><a href="#modules">Module Items</a></h3><ul class="block"><li><a href="#modules" title="Modules">Modules</a></li><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="../index.html">In crate tower</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">tower</a></div><h1>Module <span>retry</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/tower/retry/mod.rs.html#1-94">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Middleware for retrying “failed” requests.</p>
</div></details><h2 id="modules" class="section-header">Modules<a href="#modules" class="anchor">§</a></h2><dl class="item-table"><dt><a class="mod" href="backoff/index.html" title="mod tower::retry::backoff">backoff</a></dt><dd>This module contains generic <a href="https://en.wikipedia.org/wiki/Exponential_backoff">backoff</a> utilities to be used with the retry
layer.</dd><dt><a class="mod" href="budget/index.html" title="mod tower::retry::budget">budget</a></dt><dd>A retry “budget” for allowing only a certain amount of retries over time.</dd><dt><a class="mod" href="future/index.html" title="mod tower::retry::future">future</a></dt><dd>Future types</dd></dl><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.Retry.html" title="struct tower::retry::Retry">Retry</a></dt><dd>Configure retrying requests of “failed” responses.</dd><dt><a class="struct" href="struct.RetryLayer.html" title="struct tower::retry::RetryLayer">Retry<wbr>Layer</a></dt><dd>Retry requests based on a policy</dd></dl><h2 id="traits" class="section-header">Traits<a href="#traits" class="anchor">§</a></h2><dl class="item-table"><dt><a class="trait" href="trait.Policy.html" title="trait tower::retry::Policy">Policy</a></dt><dd>A “retry policy” to classify if a request should be retried.</dd></dl></section></div></main></body></html>

View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="0;URL=../../../tower/retry/struct.RetryLayer.html">
<title>Redirection</title>
</head>
<body>
<p>Redirecting to <a href="../../../tower/retry/struct.RetryLayer.html">../../../tower/retry/struct.RetryLayer.html</a>...</p>
<script>location.replace("../../../tower/retry/struct.RetryLayer.html" + location.search + location.hash);</script>
</body>
</html>

View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="0;URL=../../../tower/retry/trait.Policy.html">
<title>Redirection</title>
</head>
<body>
<p>Redirecting to <a href="../../../tower/retry/trait.Policy.html">../../../tower/retry/trait.Policy.html</a>...</p>
<script>location.replace("../../../tower/retry/trait.Policy.html" + location.search + location.hash);</script>
</body>
</html>

View File

@@ -0,0 +1 @@
window.SIDEBAR_ITEMS = {"mod":["backoff","budget","future"],"struct":["Retry","RetryLayer"],"trait":["Policy"]};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,79 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A “retry policy” to classify if a request should be retried."><title>Policy in tower::retry - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tower" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc trait"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Policy</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../tower/index.html">tower</a><span class="version">0.5.3</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Policy</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#example" title="Example">Example</a></li></ul><h3><a href="#required-associated-types">Required Associated Types</a></h3><ul class="block"><li><a href="#associatedtype.Future" title="Future">Future</a></li></ul><h3><a href="#required-methods">Required Methods</a></h3><ul class="block"><li><a href="#tymethod.clone_request" title="clone_request">clone_request</a></li><li><a href="#tymethod.retry" title="retry">retry</a></li></ul><h3><a href="#implementors">Implementors</a></h3></section><div id="rustdoc-modnav"><h2><a href="index.html">In tower::<wbr>retry</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">tower</a>::<wbr><a href="index.html">retry</a></div><h1>Trait <span class="trait">Policy</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/tower/retry/policy.rs.html#46-90">Source</a> </span></div><pre class="rust item-decl"><code>pub trait Policy&lt;Req, Res, E&gt; {
type <a href="#associatedtype.Future" class="associatedtype">Future</a>: <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.unit.html">()</a>&gt;;
// Required methods
fn <a href="#tymethod.retry" class="fn">retry</a>(
&amp;mut self,
req: <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.reference.html">&amp;mut Req</a>,
result: &amp;mut <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;Res, E&gt;,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;Self::<a class="associatedtype" href="trait.Policy.html#associatedtype.Future" title="type tower::retry::Policy::Future">Future</a>&gt;;
<span class="item-spacer"></span> fn <a href="#tymethod.clone_request" class="fn">clone_request</a>(&amp;mut self, req: <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.reference.html">&amp;Req</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;Req&gt;;
}</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>A “retry policy” to classify if a request should be retried.</p>
<h2 id="example"><a class="doc-anchor" href="#example">§</a>Example</h2>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tower::retry::Policy;
<span class="kw">use </span>std::future;
<span class="kw">type </span>Req = String;
<span class="kw">type </span>Res = String;
<span class="kw">struct </span>Attempts(usize);
<span class="kw">impl</span>&lt;E&gt; Policy&lt;Req, Res, E&gt; <span class="kw">for </span>Attempts {
<span class="kw">type </span>Future = future::Ready&lt;()&gt;;
<span class="kw">fn </span>retry(<span class="kw-2">&amp;mut </span><span class="self">self</span>, req: <span class="kw-2">&amp;mut </span>Req, result: <span class="kw-2">&amp;mut </span><span class="prelude-ty">Result</span>&lt;Res, E&gt;) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="self">Self</span>::Future&gt; {
<span class="kw">match </span>result {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
<span class="comment">// Treat all `Response`s as success,
// so don't retry...
</span><span class="prelude-val">None
</span>},
<span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; {
<span class="comment">// Treat all errors as failures...
// But we limit the number of attempts...
</span><span class="kw">if </span><span class="self">self</span>.<span class="number">0 </span>&gt; <span class="number">0 </span>{
<span class="comment">// Try again!
</span><span class="self">self</span>.<span class="number">0 </span>-= <span class="number">1</span>;
<span class="prelude-val">Some</span>(future::ready(()))
} <span class="kw">else </span>{
<span class="comment">// Used all our attempts, no retry...
</span><span class="prelude-val">None
</span>}
}
}
}
<span class="kw">fn </span>clone_request(<span class="kw-2">&amp;mut </span><span class="self">self</span>, req: <span class="kw-2">&amp;</span>Req) -&gt; <span class="prelude-ty">Option</span>&lt;Req&gt; {
<span class="prelude-val">Some</span>(req.clone())
}
}</code></pre></div></div></details><h2 id="required-associated-types" class="section-header">Required Associated Types<a href="#required-associated-types" class="anchor">§</a></h2><div class="methods"><details class="toggle" open><summary><section id="associatedtype.Future" class="method"><a class="src rightside" href="../../src/tower/retry/policy.rs.html#48">Source</a><h4 class="code-header">type <a href="#associatedtype.Future" class="associatedtype">Future</a>: <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&lt;Output = <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.unit.html">()</a>&gt;</h4></section></summary><div class="docblock"><p>The <a href="https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html" title="trait core::future::future::Future"><code>Future</code></a> type returned by <a href="trait.Policy.html#tymethod.retry" title="method tower::retry::Policy::retry"><code>Policy::retry</code></a>.</p>
</div></details></div><h2 id="required-methods" class="section-header">Required Methods<a href="#required-methods" class="anchor">§</a></h2><div class="methods"><details class="toggle method-toggle" open><summary><section id="tymethod.retry" class="method"><a class="src rightside" href="../../src/tower/retry/policy.rs.html#83">Source</a><h4 class="code-header">fn <a href="#tymethod.retry" class="fn">retry</a>(
&amp;mut self,
req: <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.reference.html">&amp;mut Req</a>,
result: &amp;mut <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;Res, E&gt;,
) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;Self::<a class="associatedtype" href="trait.Policy.html#associatedtype.Future" title="type tower::retry::Policy::Future">Future</a>&gt;</h4></section></summary><div class="docblock"><p>Check the policy if a certain request should be retried.</p>
<p>This method is passed a reference to the original request, and either
the <a href="../trait.Service.html#associatedtype.Response" title="associated type tower::Service::Response"><code>Service::Response</code></a> or <a href="../trait.Service.html#associatedtype.Error" title="associated type tower::Service::Error"><code>Service::Error</code></a> from the inner service.</p>
<p>If the request should <strong>not</strong> be retried, return <code>None</code>.</p>
<p>If the request <em>should</em> be retried, return <code>Some</code> future that will delay
the next retry of the request. This can be used to sleep for a certain
duration, to wait for some external condition to be met before retrying,
or resolve right away, if the request should be retried immediately.</p>
<h6 id="mutating-requests"><a class="doc-anchor" href="#mutating-requests">§</a>Mutating Requests</h6>
<p>The policy MAY chose to mutate the <code>req</code>: if the request is mutated, the
mutated request will be sent to the inner service in the next retry.
This can be helpful for use cases like tracking the retry count in a
header.</p>
<h6 id="mutating-results"><a class="doc-anchor" href="#mutating-results">§</a>Mutating Results</h6>
<p>The policy MAY chose to mutate the result. This enables the retry
policy to convert a failure into a success and vice versa. For example,
if the policy is used to poll while waiting for a state change, the
policy can switch the result to emit a specific error when retries are
exhausted.</p>
<p>The policy can also record metadata on the request to include
information about the number of retries required or to record that a
failure failed after exhausting all retries.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="tymethod.clone_request" class="method"><a class="src rightside" href="../../src/tower/retry/policy.rs.html#89">Source</a><h4 class="code-header">fn <a href="#tymethod.clone_request" class="fn">clone_request</a>(&amp;mut self, req: <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.reference.html">&amp;Req</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;Req&gt;</h4></section></summary><div class="docblock"><p>Tries to clone a request before being passed to the inner service.</p>
<p>If the request cannot be cloned, return <a href="https://doc.rust-lang.org/1.93.1/core/option/enum.Option.html#variant.None" title="variant core::option::Option::None"><code>None</code></a>. Moreover, the retry
function will not be called if the <a href="https://doc.rust-lang.org/1.93.1/core/option/enum.Option.html#variant.None" title="variant core::option::Option::None"><code>None</code></a> is returned.</p>
</div></details></div><h2 id="implementors" class="section-header">Implementors<a href="#implementors" class="anchor">§</a></h2><div id="implementors-list"></div><script src="../../trait.impl/tower/retry/policy/trait.Policy.js" async></script></section></div></main></body></html>