1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-30 18:34:36 +01:00

better sleep on error

This commit is contained in:
Nikolay Kim 2018-03-11 16:52:20 -07:00
parent 692e11a584
commit 49f5c335f6
2 changed files with 18 additions and 4 deletions

View File

@ -8,6 +8,8 @@
* Fix steraming response handling for http/2 * Fix steraming response handling for http/2
* Better sleep on error support
## 0.4.6 (2018-03-10) ## 0.4.6 (2018-03-10)

View File

@ -741,10 +741,9 @@ fn start_accept_thread(
break break
} }
}, },
Err(err) => { Err(ref e) if connection_error(e) => continue,
if err.kind() != io::ErrorKind::WouldBlock { Err(e) => {
error!("Error accepting connection: {:?}", err); error!("Error accepting connection: {:?}", e);
}
// sleep after error // sleep after error
thread::sleep(sleep); thread::sleep(sleep);
break break
@ -818,3 +817,16 @@ fn create_tcp_listener(addr: net::SocketAddr, backlog: i32) -> io::Result<net::T
builder.bind(addr)?; builder.bind(addr)?;
Ok(builder.listen(backlog)?) Ok(builder.listen(backlog)?)
} }
/// This function defines errors that are per-connection. Which basically
/// means that if we get this error from `accept()` system call it means
/// next connection might be ready to be accepted.
///
/// All other errors will incur a timeout before next `accept()` is performed.
/// The timeout is useful to handle resource exhaustion errors like ENFILE
/// and EMFILE. Otherwise, could enter into tight loop.
fn connection_error(e: &io::Error) -> bool {
e.kind() == io::ErrorKind::ConnectionRefused ||
e.kind() == io::ErrorKind::ConnectionAborted ||
e.kind() == io::ErrorKind::ConnectionReset
}