Handle ErrorKind::Interrupted when waiting for events

ErrorKind::Interrupted (libc::EINTR) errors should not break the
HttpServer requests loop, they are internally consumed and reported
as no events rather than requests errors.

Signed-off-by: Adrian Catangiu <acatan@amazon.com>
This commit is contained in:
Adrian Catangiu
2020-03-30 20:54:00 +03:00
committed by Adrian Catangiu
parent c9ffb90aeb
commit c33861a13b
2 changed files with 7 additions and 3 deletions

View File

@@ -1 +1 @@
{"coverage_score": 92.8, "exclude_path": "", "crate_features": ""}
{"coverage_score": 92.4, "exclude_path": "", "crate_features": ""}

View File

@@ -1,5 +1,6 @@
// Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
extern crate epoll;
use std::collections::HashMap;
@@ -301,8 +302,11 @@ impl HttpServer {
// current thread until at least one event is received.
// The received notifications will then populate the `events` array with
// `event_count` elements, where 1 <= event_count <= MAX_CONNECTIONS.
let event_count =
epoll::wait(self.epoll_fd, -1, &mut events[..]).map_err(ServerError::IOError)?;
let event_count = match epoll::wait(self.epoll_fd, -1, &mut events[..]) {
Ok(event_count) => event_count,
Err(e) if e.kind() == std::io::ErrorKind::Interrupted => 0,
Err(e) => return Err(ServerError::IOError(e)),
};
// We use `take()` on the iterator over `events` as, even though only
// `events_count` events have been inserted into `events`, the size of
// the array is still `MAX_CONNECTIONS`, so we discard empty elements