mirror of https://github.com/rwf2/Rocket.git
Optimistically wait-free retry failed 'accept()'.
This commit is contained in:
parent
f8047f3d34
commit
dd1b51f681
|
@ -52,7 +52,7 @@ impl<L: Listener> Incoming<L> {
|
||||||
pub fn from_listener(listener: L) -> Self {
|
pub fn from_listener(listener: L) -> Self {
|
||||||
Self {
|
Self {
|
||||||
listener,
|
listener,
|
||||||
sleep_on_errors: Some(Duration::from_secs(1)),
|
sleep_on_errors: Some(Duration::from_millis(250)),
|
||||||
pending_error_delay: None,
|
pending_error_delay: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,14 +78,22 @@ impl<L: Listener> Incoming<L> {
|
||||||
|
|
||||||
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<L::Connection>> {
|
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<L::Connection>> {
|
||||||
let mut me = self.project();
|
let mut me = self.project();
|
||||||
|
let mut optimistic_retry = true;
|
||||||
loop {
|
loop {
|
||||||
// Check if a previous sleep timer is active that was set by IO errors.
|
// Check if a previous sleep timer is active that was set by IO errors.
|
||||||
if let Some(delay) = me.pending_error_delay.as_mut().as_pin_mut() {
|
if let Some(delay) = me.pending_error_delay.as_mut().as_pin_mut() {
|
||||||
|
if optimistic_retry {
|
||||||
|
error!("optimistically retrying now");
|
||||||
|
optimistic_retry = false;
|
||||||
|
} else {
|
||||||
|
error!("retrying in {:?}", me.sleep_on_errors);
|
||||||
match delay.poll(cx) {
|
match delay.poll(cx) {
|
||||||
Poll::Ready(()) => {}
|
Poll::Ready(()) => {}
|
||||||
Poll::Pending => return Poll::Pending,
|
Poll::Pending => return Poll::Pending,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
me.pending_error_delay.set(None);
|
me.pending_error_delay.set(None);
|
||||||
|
|
||||||
match me.listener.poll_accept(cx) {
|
match me.listener.poll_accept(cx) {
|
||||||
|
@ -102,7 +110,7 @@ impl<L: Listener> Incoming<L> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(duration) = me.sleep_on_errors {
|
if let Some(duration) = me.sleep_on_errors {
|
||||||
error!("accept error: {}", e);
|
error!("connection accept error: {}", e);
|
||||||
|
|
||||||
// Sleep for the specified duration
|
// Sleep for the specified duration
|
||||||
me.pending_error_delay.set(Some(tokio::time::sleep(*duration)));
|
me.pending_error_delay.set(Some(tokio::time::sleep(*duration)));
|
||||||
|
|
Loading…
Reference in New Issue