Skip to content

Commit 4a12e7c

Browse files
committed
[cmd] add server stop command
1 parent f1b7072 commit 4a12e7c

File tree

2 files changed

+60
-14
lines changed

2 files changed

+60
-14
lines changed

src/bin.rs

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use nix::unistd::getpid;
3131

3232
use librain::{server, worker, VERSION};
3333
use librain::errors::Result;
34+
use librain::client::client::Client;
3435

3536
const DEFAULT_SERVER_PORT: u16 = 7210;
3637
const DEFAULT_WORKER_PORT: u16 = 0;
@@ -162,6 +163,22 @@ impl WorkerConfig {
162163
}
163164
}
164165

166+
fn resolve_server_address(address: &str) -> SocketAddr {
167+
match address.to_socket_addrs() {
168+
Err(_) => {
169+
error!("Cannot resolve server address");
170+
exit(1);
171+
}
172+
Ok(mut addrs) => match addrs.next() {
173+
None => {
174+
error!("Cannot resolve server address");
175+
exit(1);
176+
}
177+
Some(ref addr) => *addr,
178+
},
179+
}
180+
}
181+
165182
fn run_worker(_global_args: &ArgMatches, cmd_args: &ArgMatches) {
166183
info!("Starting Rain {} worker", VERSION);
167184
let ready_file = cmd_args.value_of("READY_FILE");
@@ -173,19 +190,7 @@ fn run_worker(_global_args: &ArgMatches, cmd_args: &ArgMatches) {
173190
server_address = format!("{}:{}", server_address, DEFAULT_SERVER_PORT);
174191
}
175192

176-
let server_addr = match server_address.to_socket_addrs() {
177-
Err(_) => {
178-
error!("Cannot resolve server address: ");
179-
exit(1);
180-
}
181-
Ok(mut addrs) => match addrs.next() {
182-
None => {
183-
error!("Cannot resolve server address");
184-
exit(1);
185-
}
186-
Some(ref addr) => *addr,
187-
},
188-
};
193+
let server_addr = resolve_server_address(&server_address);
189194

190195
let state = {
191196
let config = cmd_args.value_of("WORKER_CONFIG").map(|path| {
@@ -385,6 +390,30 @@ fn run_starter(_global_args: &ArgMatches, cmd_args: &ArgMatches) {
385390
}
386391
}
387392

393+
fn stop_server(_global_args: &ArgMatches, cmd_args: &ArgMatches) {
394+
let default_address = format!("localhost:{}", DEFAULT_SERVER_PORT);
395+
let mut address = cmd_args
396+
.value_of("SERVER_ADDRESS")
397+
.unwrap_or(&default_address)
398+
.to_string();
399+
400+
if !address.contains(':') {
401+
address = format!("{}:{}", address, DEFAULT_SERVER_PORT);
402+
}
403+
404+
let scheduler: SocketAddr = resolve_server_address(&address);
405+
let mut client = Client::new(&scheduler).unwrap_or_else(|err| {
406+
error!("Couldn't connect to server at {}: {}", address, err);
407+
exit(1);
408+
});
409+
client.terminate_server().unwrap_or_else(|err| {
410+
error!("Couldn't stop server: {}", err);
411+
exit(1);
412+
});
413+
414+
println!("Server at {} was successfully stopped", address);
415+
}
416+
388417
fn init_log() {
389418
// T emporary simple logger for better module log control, default level is INFO
390419
// TODO: replace with Fern or log4rs later
@@ -543,15 +572,22 @@ fn main() {
543572
.long("--logdir")
544573
.help("Logging directory for workers & server (default /tmp/rain-logs/run-$HOSTANE-$PID)")
545574
.takes_value(true)))
575+
.subcommand( // ---- STOP ----
576+
SubCommand::with_name("stop")
577+
.about("Stop server and all workers connected to it")
578+
.arg(Arg::with_name("SERVER_ADDRESS")
579+
.help("Address of the server (default = localhost:7210)")
580+
.takes_value(true)))
546581
.get_matches();
547582

548583
match args.subcommand() {
549584
("server", Some(cmd_args)) => run_server(&args, cmd_args),
550585
("worker", Some(cmd_args)) => run_worker(&args, cmd_args),
551586
("start", Some(cmd_args)) => run_starter(&args, cmd_args),
587+
("stop", Some(cmd_args)) => stop_server(&args, cmd_args),
552588
_ => {
553589
error!("No subcommand provided.");
554-
::std::process::exit(1);
590+
exit(1);
555591
}
556592
}
557593
}

src/server/rpc/client.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use errors::{Error, ErrorKind, Result};
1313
use common::{Attributes, DataType};
1414
use common::RcSet;
1515
use common::events::{ObjectDescriptor, TaskDescriptor};
16+
use std::process::exit;
1617

1718
pub struct ClientServiceImpl {
1819
state: StateRef,
@@ -519,4 +520,13 @@ impl client_service::Server for ClientServiceImpl {
519520
results.get_state().unwrap().set_ok(());
520521
Promise::ok(())
521522
}
523+
524+
fn terminate_server(
525+
&mut self,
526+
params: client_service::TerminateServerParams,
527+
results: client_service::TerminateServerResults,
528+
) -> Promise<(), ::capnp::Error> {
529+
exit(0);
530+
Promise::ok(())
531+
}
522532
}

0 commit comments

Comments
 (0)