in core/src/layers/retry.rs [701:745]
fn poll_read(&mut self, cx: &mut Context<'_>, buf: &mut [u8]) -> Poll<Result<usize>> {
if let Some(sleep) = self.sleep.as_mut() {
ready!(sleep.poll_unpin(cx));
self.sleep = None;
}
match ready!(self.inner.poll_read(cx, buf)) {
Ok(v) => {
self.current_backoff = None;
Poll::Ready(Ok(v))
}
Err(err) if !err.is_temporary() => {
self.current_backoff = None;
Poll::Ready(Err(err))
}
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(Err(err))
}
Some(dur) => {
self.notify.intercept(
&err,
dur,
&[
("operation", ReadOperation::Read.into_static()),
("path", &self.path),
],
);
self.sleep = Some(Box::pin(tokio::time::sleep(dur)));
self.poll_read(cx, buf)
}
}
}
}
}