in core/src/layers/retry.rs [793:841]
fn poll_next(&mut self, cx: &mut Context<'_>) -> Poll<Option<Result<Bytes>>> {
if let Some(sleep) = self.sleep.as_mut() {
ready!(sleep.poll_unpin(cx));
self.sleep = None;
}
match ready!(self.inner.poll_next(cx)) {
None => {
self.current_backoff = None;
Poll::Ready(None)
}
Some(Ok(v)) => {
self.current_backoff = None;
Poll::Ready(Some(Ok(v)))
}
Some(Err(err)) if !err.is_temporary() => {
self.current_backoff = None;
Poll::Ready(Some(Err(err)))
}
Some(Err(err)) => {
let backoff = match self.current_backoff.as_mut() {
Some(backoff) => backoff,
None => {
self.current_backoff = Some(self.builder.build());
self.current_backoff.as_mut().unwrap()
}
};
match backoff.next() {
None => {
self.current_backoff = None;
Poll::Ready(Some(Err(err)))
}
Some(dur) => {
self.notify.intercept(
&err,
dur,
&[
("operation", ReadOperation::Next.into_static()),
("path", &self.path),
],
);
self.sleep = Some(Box::pin(tokio::time::sleep(dur)));
self.poll_next(cx)
}
}
}
}
}