From 4ab41440ad0e0cf14bb17e6a1b6148eeb6bf8e9f Mon Sep 17 00:00:00 2001 From: hommeabeil Date: Wed, 2 Feb 2022 22:09:24 -0500 Subject: [PATCH] do not remove the uds socket on pause --- actix-server/examples/tcp-echo.rs | 2 +- actix-server/src/accept.rs | 6 +++++ actix-server/src/socket.rs | 44 ++++++++++++++++++++++--------- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/actix-server/examples/tcp-echo.rs b/actix-server/examples/tcp-echo.rs index da0b7053..c84910c9 100644 --- a/actix-server/examples/tcp-echo.rs +++ b/actix-server/examples/tcp-echo.rs @@ -31,7 +31,7 @@ async fn run() -> io::Result<()> { let count = Arc::new(AtomicUsize::new(0)); let addr = ("127.0.0.1", 8080); - info!("starting server on port: {}", &addr.0); + info!("starting server on: {}:{}", &addr.0, &addr.1); // Bind socket address and start worker(s). By default, the server uses the number of physical // CPU cores as the worker count. For this reason, the closure passed to bind needs to return diff --git a/actix-server/src/accept.rs b/actix-server/src/accept.rs index 9f7872f8..0602343a 100644 --- a/actix-server/src/accept.rs +++ b/actix-server/src/accept.rs @@ -217,6 +217,8 @@ impl Accept { self.deregister_all(sockets); } + self.terminate_all(sockets); + return true; } @@ -330,6 +332,10 @@ impl Accept { .for_each(|(_, info)| self.deregister_logged(info)); } + fn terminate_all(&self, sockets: &mut[ServerSocketInfo]) { + sockets.iter().for_each(|s| s.lst.terminate()); + } + // Send connection to worker and handle error. fn send_connection(&mut self, conn: Conn) -> Result<(), Conn> { let next = self.next(); diff --git a/actix-server/src/socket.rs b/actix-server/src/socket.rs index 25291fd2..e5a711d0 100644 --- a/actix-server/src/socket.rs +++ b/actix-server/src/socket.rs @@ -38,11 +38,28 @@ impl MioListener { match *self { MioListener::Tcp(ref lst) => lst.accept().map(|(stream, _)| MioStream::Tcp(stream)), #[cfg(unix)] - MioListener::Uds(ref lst) => lst.accept().map(|(stream, _)| MioStream::Uds(stream)), + MioListener::Uds(ref lst) => { + lst.accept().map(|(stream, _)| MioStream::Uds(stream)) + } + } + } + + pub(crate) fn terminate(&self) { + match *self { + MioListener::Tcp(_) => (), + #[cfg(unix)] + MioListener::Uds(ref lst) => { + if let Ok(addr) = lst.local_addr() { + if let Some(path) = addr.as_pathname() { + let _ = std::fs::remove_file(path); + } + } + } } } } + impl Source for MioListener { fn register( &mut self, @@ -74,17 +91,7 @@ impl Source for MioListener { match *self { MioListener::Tcp(ref mut lst) => lst.deregister(registry), #[cfg(unix)] - MioListener::Uds(ref mut lst) => { - let res = lst.deregister(registry); - - // cleanup file path - if let Ok(addr) = lst.local_addr() { - if let Some(path) = addr.as_pathname() { - let _ = std::fs::remove_file(path); - } - } - res - } + MioListener::Uds(ref mut lst) => lst.deregister(registry) } } } @@ -270,4 +277,17 @@ mod tests { assert!(format!("{}", lst).contains("/tmp/sock.xxxxx")); } } + + #[test] + #[cfg(unix)] + fn uds_terminate() { + let socket_path = std::path::Path::new("/tmp/sock.xxxx1"); + let _ = std::fs::remove_file(socket_path); + if let Ok(socket) = MioUnixListener::bind(socket_path) { + let listener = MioListener::Uds(socket); + assert!(socket_path.exists()); + listener.terminate(); + assert!(!socket_path.exists()); + } + } }