Remove panic when failing to get remote address (#107)
The listener *already* got the remote address when it was accepted, but we drop the value by using `TcpListener::incoming`. By the time we call `socket.peer_addr()`, the connection may have been closed, and thus we were panicking. By removing the panic here, later code should notice that the connection is closed (when a `read` finds EOF), and it should be dropped gracefully. For the same reasons (that the connection might already be closed), this reduces the `error!` from `get_original_dst` to just a `warn!`, just as `set_nodelay` is a `warn!`. No need to yell in that case. Closes https://github.com/linkerd/linkerd2/issues/1787 Signed-off-by: Sean McArthur <sean@buoyant.io>
This commit is contained in:
parent
f1210b4947
commit
4625302bd9
|
@ -77,7 +77,7 @@ mod linux {
|
|||
);
|
||||
if ret != 0 {
|
||||
let e = io::Error::last_os_error();
|
||||
error!("failed to read SO_ORIGINAL_DST: {:?}", e);
|
||||
warn!("failed to read SO_ORIGINAL_DST: {:?}", e);
|
||||
return Err(e);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/// Tokio-level (not Tower-level) proxy-specific networking.
|
||||
|
||||
use bytes::{Buf, BytesMut};
|
||||
use futures::{*, future::Either};
|
||||
use futures::{Async, Future, IntoFuture, Poll, Stream, future::{self, Either}, stream};
|
||||
use std;
|
||||
use std::cmp;
|
||||
use std::io;
|
||||
|
@ -186,13 +186,15 @@ impl BoundPort {
|
|||
// background reactor if `listen_and_fold` is called before we've
|
||||
// initialized the runtime.
|
||||
TcpListener::from_std(inner, &Handle::current())
|
||||
}).and_then(move |listener|
|
||||
listener.incoming()
|
||||
.take(connection_limit)
|
||||
.and_then(move |socket| {
|
||||
let remote_addr = socket.peer_addr()
|
||||
.expect("couldn't get remote addr!");
|
||||
}).and_then(move |mut listener| {
|
||||
let incoming = stream::poll_fn(move || {
|
||||
let ret = try_ready!(listener.poll_accept());
|
||||
Ok(Async::Ready(Some(ret)))
|
||||
});
|
||||
|
||||
incoming
|
||||
.take(connection_limit)
|
||||
.and_then(move |(socket, remote_addr)| {
|
||||
// TODO: On Linux and most other platforms it would be better
|
||||
// to set the `TCP_NODELAY` option on the bound socket and
|
||||
// then have the listening sockets inherit it. However, that
|
||||
|
@ -225,7 +227,7 @@ impl BoundPort {
|
|||
})
|
||||
.filter_map(|x| x)
|
||||
.fold(initial, f)
|
||||
)
|
||||
})
|
||||
.map(|_| ())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue