diff --git a/docs/strategies/circuit-breaker.md b/docs/strategies/circuit-breaker.md
index de231900791..50ff7a5b7e6 100644
--- a/docs/strategies/circuit-breaker.md
+++ b/docs/strategies/circuit-breaker.md
@@ -185,7 +185,7 @@ sequenceDiagram
C->>P: Calls ExecuteAsync
P->>CB: Calls ExecuteCore
- CB->>CB: Rejects request
+ CB-->>CB: Rejects request
CB->>P: Throws
BrokenCircuitException
P->>C: Propagates exception
deactivate CB
@@ -203,6 +203,8 @@ Let's suppose we have a circuit breaker strategy with the following configuratio
#### Complex: happy path sequence diagram
+The circuit will break and later it will transition into the `HalfOpen` state. The probe will then succeed, so the circuit breaker will go back to the normal (`Closed`) state.
+
```mermaid
sequenceDiagram
autonumber
@@ -230,7 +232,7 @@ sequenceDiagram
C->>P: Calls ExecuteAsync
P->>CB: Calls ExecuteCore
- CB->>CB: Rejects request
+ CB-->>CB: Rejects request
CB->>P: Throws
BrokenCircuitException
P->>C: Propagates exception
@@ -247,6 +249,8 @@ sequenceDiagram
#### Complex: unhappy path sequence diagram
+The circuit will break and later it will transition into the `HalfOpen` state. The probe will then fail, so the circuit breaker will become broken again (the `Open` state).
+
```mermaid
sequenceDiagram
autonumber
@@ -274,7 +278,7 @@ sequenceDiagram
C->>P: Calls ExecuteAsync
P->>CB: Calls ExecuteCore
- CB->>CB: Rejects request
+ CB-->>CB: Rejects request
CB->>P: Throws
BrokenCircuitException
P->>C: Propagates exception
diff --git a/docs/strategies/fallback.md b/docs/strategies/fallback.md
index 81057a9b71e..a501bba6769 100644
--- a/docs/strategies/fallback.md
+++ b/docs/strategies/fallback.md
@@ -91,13 +91,16 @@ sequenceDiagram
actor C as Caller
participant P as Pipeline
participant F as Fallback
+ participant FA as FallbackAction
participant D as DecoratedUserCallback
C->>P: Calls ExecuteAsync
P->>F: Calls ExecuteCore
F->>+D: Invokes
D->>-F: Fails
- F->>F: Falls back to
substitute result
+ F->>+FA: Invokes
+ FA-->>FA: Calculates substitute result
+ FA->>-F: Returns
substituted result
F->>P: Returns
substituted result
P->>C: Returns
substituted result
```
diff --git a/docs/strategies/hedging.md b/docs/strategies/hedging.md
index 132ed78137f..be75d915802 100644
--- a/docs/strategies/hedging.md
+++ b/docs/strategies/hedging.md
@@ -265,7 +265,7 @@ sequenceDiagram
#### Parallel: unhappy path sequence diagram
-The hedging strategy triggers because the `Delay` is set to zero. It succeeds because one of the requests succeeds.
+The hedging strategy triggers because the `Delay` is set to zero. It fails because all requests fail.
```mermaid
sequenceDiagram
@@ -321,9 +321,8 @@ new ResiliencePipelineBuilder()
{
var delay = args.AttemptNumber switch
{
- 0 => TimeSpan.FromSeconds(1),
- 1 => TimeSpan.FromSeconds(2),
- _ => System.Threading.Timeout.InfiniteTimeSpan
+ 0 or 1 => TimeSpan.Zero, // Parallel mode
+ _ => TimeSpan.FromSeconds(-1) // switch to Fallback mode
};
return new ValueTask(delay);
@@ -339,7 +338,7 @@ With this configuration, the hedging strategy:
#### Dynamic: happy path sequence diagram
-The hedging strategy triggers and switches between modes due to the usage of `DelayGenerator`. It succeeds because the last request succeeds.
+The hedging strategy triggers and switches between modes due to our `DelayGenerator`. It succeeds because the last request succeeds.
```mermaid
sequenceDiagram
@@ -356,12 +355,12 @@ sequenceDiagram
Note over H: Parallel mode
par
H->>DG: Gets delay
- DG->>H: 1 second
+ DG->>H: 0 second
H->>HUC: Invokes (R1)
activate HUC
and
H ->> DG: Gets delay
- DG ->> H: 2 seconds
+ DG ->> H: 0 second
H->>+HUC: Invokes (R2)
end
@@ -373,13 +372,13 @@ sequenceDiagram
Note over H: Fallback mode
H->>DG: Gets delay
- DG->>H: Infinite
+ DG->>H: -1 second
H->>+HUC: Invokes (R3)
HUC-->>HUC: Processes R3
HUC->>-H: Fails (R3)
H->>DG: Gets delay
- DG->>H: Infinite
+ DG->>H: -1 second
H->>+HUC: Invokes (R4)
HUC-->>HUC: Processes R4
HUC->>-H: Returns result (R4)
@@ -391,7 +390,7 @@ sequenceDiagram
#### Dynamic: unhappy path sequence diagram
-The hedging strategy triggers and switches between modes due to the usage of `DelayGenerator`. It fails because all requests fail.
+The hedging strategy triggers and switches between modes due our `DelayGenerator`. It fails because all requests fail.
```mermaid
sequenceDiagram
@@ -408,12 +407,12 @@ sequenceDiagram
Note over H: Parallel mode
par
H->>DG: Gets delay
- DG->>H: 1 second
+ DG->>H: 0 second
H->>HUC: Invokes (R1)
activate HUC
and
H->>DG: Gets delay
- DG->>H: 2 seconds
+ DG->>H: 0 second
H->>+HUC: Invokes (R2)
end
@@ -425,13 +424,13 @@ sequenceDiagram
Note over H: Fallback mode
H->>DG: Gets delay
- DG->>H: Infinite
+ DG->>H: -1 second
H->>+HUC: Invokes (R3)
HUC-->>HUC: Processes R3
HUC->>-H: Fails (R3)
H -> DG: Gets delay
- DG->>H: Infinite
+ DG->>H: -1 second
H->>+HUC: Invokes (R4)
HUC-->>HUC: Processes R4
HUC->>-H: Fails (R4)
@@ -486,6 +485,43 @@ new ResiliencePipelineBuilder()
```
+### Action generator: sequence diagram
+
+```mermaid
+sequenceDiagram
+ autonumber
+ actor C as Caller
+ participant P as Pipeline
+ participant H as Hedging
+ participant AG as ActionGenerator
+ participant UC as UserCallback
+ participant HUC as HedgedUserCallback
+
+ C->>P: Calls ExecuteAsync
+ P->>H: Calls ExecuteCore
+
+ activate H
+ H->>+UC: Invokes (R1)
+ UC-->>UC: Processes R1
+ UC->>-H: Fails (R1)
+ H->>+AG: Invokes
+ AG->>-H: Returns factory
+ H-->>H: Invokes factory
+
+ H->>+HUC: Invokes (R2)
+ HUC-->>HUC: Processes R2
+ HUC->>-H: Fails (R2)
+
+ H-->>H: Invokes factory
+ H->>+HUC: Invokes (R3)
+ HUC-->>HUC: Processes R3
+ HUC->>-H: Returns result (R3)
+ deactivate H
+
+ H->>P: Returns result (R3)
+ P->>C: Returns result (R3)
+```
+
### Parameterized callbacks and action generator
When you have control over the callbacks that the resilience pipeline receives, you can parameterize them. This flexibility allows for reusing the callbacks within an action generator.
diff --git a/docs/strategies/rate-limiter.md b/docs/strategies/rate-limiter.md
index 8aaa0f8d5fc..9fc87a86f25 100644
--- a/docs/strategies/rate-limiter.md
+++ b/docs/strategies/rate-limiter.md
@@ -84,6 +84,7 @@ Let's suppose we have a rate limiter strategy with `PermitLimit` : `1` and `Wind
```mermaid
sequenceDiagram
+ autonumber
actor C as Caller
participant P as Pipeline
participant RL as RateLimiter
@@ -112,6 +113,7 @@ sequenceDiagram
```mermaid
sequenceDiagram
+ autonumber
actor C as Caller
participant P as Pipeline
participant RL as RateLimiter
@@ -127,7 +129,7 @@ sequenceDiagram
Note over C: Few seconds later...
C->>P: Calls ExecuteAsync
P->>RL: Calls ExecuteCore
- RL->>RL: Rejects request
+ RL-->>RL: Rejects request
RL->>P: Throws
RateLimiterRejectedException
P->>C: Propagates exception
Note over RL,D: Window end
@@ -156,7 +158,7 @@ sequenceDiagram
P->>CL: Calls ExecuteCore
CL->>+D: Invokes (C1)
P->>CL: Calls ExecuteCore
- CL->>CL: Queues request
+ CL-->>CL: Queues request
D->>-CL: Returns result (C1)
CL->>P: Returns result (C1)
@@ -189,9 +191,9 @@ sequenceDiagram
P->>CL: Calls ExecuteCore
CL->>+D: Invokes (C1)
P->>CL: Calls ExecuteCore
- CL->>CL: Queues request (C2)
+ CL-->>CL: Queues request (C2)
P->>CL: Calls ExecuteCore
- CL->>CL: Rejects request (C3)
+ CL-->>CL: Rejects request (C3)
CL->>P: Throws
RateLimiterRejectedException
P->>C3: Propagates exception
diff --git a/docs/strategies/retry.md b/docs/strategies/retry.md
index 9fe0bbd0553..3b62c4ba275 100644
--- a/docs/strategies/retry.md
+++ b/docs/strategies/retry.md
@@ -122,7 +122,7 @@ sequenceDiagram
Note over R,D: Initial attempt
R->>+D: Invokes
D->>-R: Fails
- R->>R: Sleeps
+ R-->>R: Sleeps
Note over R,D: 1st retry attempt
R->>+D: Invokes
D->>-R: Returns result
@@ -144,11 +144,11 @@ sequenceDiagram
Note over R,D: Initial attempt
R->>+D: Invokes
D->>-R: Fails
- R->>R: Sleeps
+ R-->>R: Sleeps
Note over R,D: 1st retry attempt
R->>+D: Invokes
D->>-R: Fails
- R->>R: Sleeps
+ R-->>R: Sleeps
Note over R,D: 2nd retry attempt
R->>+D: Invokes
D->>-R: Fails
diff --git a/docs/strategies/timeout.md b/docs/strategies/timeout.md
index d0d65c7c710..38b5110211b 100644
--- a/docs/strategies/timeout.md
+++ b/docs/strategies/timeout.md
@@ -92,7 +92,7 @@ sequenceDiagram
C->>P: Calls ExecuteAsync
P->>T: Calls ExecuteCore
T->>+D: Invokes
- D->>D: Performs
long-running
operation
+ D-->>D: Performs
long-running
operation
D->>-T: Returns result
T->>P: Returns result
P->>C: Returns result
@@ -112,8 +112,8 @@ sequenceDiagram
T->>+D: Invokes
activate T
activate D
- D->>D: Performs
long-running
operation
- T->T: Times out
+ D-->>D: Performs
long-running
operation
+ T-->>T: Times out
deactivate T
T->>D: Propagates cancellation
deactivate D
diff --git a/src/Snippets/Docs/Hedging.cs b/src/Snippets/Docs/Hedging.cs
index 051efe543cc..649a3243515 100644
--- a/src/Snippets/Docs/Hedging.cs
+++ b/src/Snippets/Docs/Hedging.cs
@@ -64,9 +64,8 @@ public static void DynamicMode()
{
var delay = args.AttemptNumber switch
{
- 0 => TimeSpan.FromSeconds(1),
- 1 => TimeSpan.FromSeconds(2),
- _ => System.Threading.Timeout.InfiniteTimeSpan
+ 0 or 1 => TimeSpan.Zero, // Parallel mode
+ _ => TimeSpan.FromSeconds(-1) // switch to Fallback mode
};
return new ValueTask(delay);