diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index 2a52afee..c3074646 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -404,16 +404,19 @@ impl Future for ServerWorker { let factory_id = restart.factory_id; let token = restart.token; - let mut item = ready!(restart.fut.as_mut().poll(cx)).unwrap_or_else(|_| { - panic!( - "Can not restart {:?} service", - this.factories[factory_id].name(token) - ) - }); - - // Token should have a matching index with returned item vec. - debug_assert_eq!(item.get(token.0).unwrap().0, token); - let (token, service) = item.remove(token.0); + let service = ready!(restart.fut.as_mut().poll(cx)) + .unwrap_or_else(|_| { + panic!( + "Can not restart {:?} service", + this.factories[factory_id].name(token) + ) + }) + .into_iter() + // Find the same token from vector. There should be only one + // So the first match would be enough. + .find(|(t, _)| *t == token) + .map(|(_, service)| service) + .expect("No BoxedServerService found"); trace!( "Service {:?} has been restarted", diff --git a/actix-server/tests/test_server.rs b/actix-server/tests/test_server.rs index d7176d85..a7d3845d 100644 --- a/actix-server/tests/test_server.rs +++ b/actix-server/tests/test_server.rs @@ -365,11 +365,14 @@ fn test_service_restart() { let _ = server.stop(false); let _ = h.join().unwrap(); - let addr = unused_addr(); + let addr1 = unused_addr(); + let addr2 = unused_addr(); let (tx, rx) = mpsc::channel(); let num = Arc::new(AtomicUsize::new(0)); + let num2 = Arc::new(AtomicUsize::new(0)); let num_clone = num.clone(); + let num2_clone = num2.clone(); let h = thread::spawn(move || { let num = num.clone(); @@ -377,7 +380,7 @@ fn test_service_restart() { let server = Server::build() .backlog(1) .disable_signals() - .bind("addr", addr, move || { + .bind("addr1", addr1, move || { let num = num.clone(); fn_factory(move || { let num = num.clone(); @@ -385,6 +388,14 @@ fn test_service_restart() { }) }) .unwrap() + .bind("addr2", addr2, move || { + let num2 = num2.clone(); + fn_factory(move || { + let num2 = num2.clone(); + async move { Ok::<_, ()>(TestService(num2)) } + }) + }) + .unwrap() .workers(1) .run(); @@ -397,13 +408,16 @@ fn test_service_restart() { thread::sleep(time::Duration::from_millis(500)); for _ in 0..5 { - let conn = net::TcpStream::connect(addr).unwrap(); + let conn = net::TcpStream::connect(addr1).unwrap(); + conn.shutdown(Shutdown::Both).unwrap(); + let conn = net::TcpStream::connect(addr2).unwrap(); conn.shutdown(Shutdown::Both).unwrap(); } thread::sleep(time::Duration::from_secs(1)); assert!(num_clone.load(Ordering::SeqCst) > 5); + assert!(num2_clone.load(Ordering::SeqCst) > 5); sys.stop(); let _ = server.stop(false);