mirror of https://github.com/fafhrd91/actix-net
Add ServerCommand::Restart and Command::Restart
This PR creates a new `ServerCommand` and corresponding `Command` to restart server workers. Related to actix/actix-web#280
This commit is contained in:
parent
0156f479a0
commit
d19a5e1ea1
|
@ -16,6 +16,7 @@ use super::Token;
|
|||
pub(crate) enum Command {
|
||||
Pause,
|
||||
Resume,
|
||||
Restart,
|
||||
Stop,
|
||||
Worker(WorkerClient),
|
||||
}
|
||||
|
@ -315,6 +316,26 @@ impl Accept {
|
|||
}
|
||||
}
|
||||
}
|
||||
Command::Restart => {
|
||||
for (token, info) in self.sockets.iter_mut() {
|
||||
if let Err(err) = self.poll.deregister(&info.sock) {
|
||||
error!("Can not restart server socket {}", err);
|
||||
}
|
||||
if let Err(err) = self.poll.reregister(
|
||||
&info.sock,
|
||||
mio::Token(token + DELTA),
|
||||
mio::Ready::readable(),
|
||||
mio::PollOpt::edge(),
|
||||
) {
|
||||
error!("Can not restart socket accept process: {}", err);
|
||||
} else {
|
||||
info!(
|
||||
"Accepting connections on {} has been restarted",
|
||||
info.addr
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Command::Stop => {
|
||||
for (_, info) in self.sockets.iter() {
|
||||
let _ = self.poll.deregister(&info.sock);
|
||||
|
|
|
@ -287,6 +287,10 @@ impl ServerBuilder {
|
|||
self.accept.send(Command::Resume);
|
||||
let _ = tx.send(());
|
||||
}
|
||||
ServerCommand::Restart(tx) => {
|
||||
self.accept.send(Command::Restart);
|
||||
let _ = tx.send(());
|
||||
}
|
||||
ServerCommand::Signal(sig) => {
|
||||
// Signals support
|
||||
// Handle `SIGINT`, `SIGTERM`, `SIGQUIT` signals and stop actix system
|
||||
|
|
|
@ -10,6 +10,7 @@ pub(crate) enum ServerCommand {
|
|||
WorkerDied(usize),
|
||||
Pause(oneshot::Sender<()>),
|
||||
Resume(oneshot::Sender<()>),
|
||||
Restart(oneshot::Sender<()>),
|
||||
Signal(Signal),
|
||||
/// Whether to try and shut down gracefully
|
||||
Stop {
|
||||
|
@ -56,6 +57,13 @@ impl Server {
|
|||
rx.map_err(|_| ())
|
||||
}
|
||||
|
||||
/// Restart server
|
||||
pub fn restart(&self) -> impl Future<Item = (), Error = ()> {
|
||||
let (tx, rx) = oneshot::channel();
|
||||
let _ = self.0.unbounded_send(ServerCommand::Restart(tx));
|
||||
rx.map_err(|_| ())
|
||||
}
|
||||
|
||||
/// Stop incoming connection processing, stop all workers and exit.
|
||||
///
|
||||
/// If server starts with `spawn()` method, then spawned thread get terminated.
|
||||
|
|
Loading…
Reference in New Issue