Maybe Waffle 2022-02-07 22:27:25 +03:00
parent ed48de2f75
commit d259f8aa23

View file

@ -90,6 +90,53 @@ where
}
}
// This diagram explains how `ThrottlingRequest` works/what `send` does
//
// │
// ThrottlingRequest │ worker()
// │
// ┌───────────────┐ │ ┌────────────────────────┐
// ┌──────────────────►│request is sent│ │ │see worker documentation│
// │ └───────┬───────┘ │ │and comments for more │
// │ │ │ │information on how it │
// │ ▼ │ │actually works │
// │ ┌─────────┐ │ └────────────────────────┘
// │ ┌────────────────┐ │send lock│ │
// │ │has worker died?│◄──┤to worker├─────►:───────────┐
// │ └─┬─────────────┬┘ └─────────┘ │ ▼
// │ │ │ │ ┌──────────────────┐
// │ Y └─N───────┐ │ │ *magic* │
// │ │ │ │ └────────┬─────────┘
// │ ▼ ▼ │ │
// │ ┌───────────┐ ┌────────────────┐ │ ▼
// │ │send inner │ │wait for worker │ │ ┌─────────────────┐
// │ │request │ │to allow sending│◄──:◄─┤ `lock.unlock()` │
// │ └───┬───────┘ │this request │ │ └─────────────────┘
// │ │ └────────┬───────┘ │
// │ │ │ │
// │ ▼ ▼ │
// │ ┌──────┐ ┌────────────────────┐ │
// │ │return│ │send inner request │ │
// │ │result│ │and check its result│ │
// │ └──────┘ └─┬─────────┬────────┘ │
// │ ▲ ▲ │ │ │
// │ │ │ │ Err(RetryAfter(n)) │
// │ │ │ else │ │
// │ │ │ │ ▼ │
// │ │ └─────┘ ┌───────────────┐ │
// │ │ │are retries on?│ │
// │ │ └┬─────────────┬┘ │
// │ │ │ │ │
// │ └────────────N─┘ Y │
// │ │ │ ┌──────────────────┐
// │ ▼ │ │ *magic* │
// │ ┌──────────────────┐ │ └──────────────────┘
// ┌┴────────────┐ │notify worker that│ │ ▲
// │retry request│◄──┤RetryAfter error ├──►:───────────┘
// └─────────────┘ │has happened │ │
// └──────────────────┘ │
// │
/// Actual implementation of the `ThrottlingSend` future
async fn send<R>(
mut request: ShareableRequest<R>,