Don't restart if we're not in the cradle.

This commit is contained in:
Gav Wood 2016-12-11 04:05:02 +01:00
parent 2865cbaf70
commit d9f6ea56ef
No known key found for this signature in database
GPG Key ID: C49C1ACA1CC9B252
3 changed files with 29 additions and 18 deletions

View File

@ -351,6 +351,9 @@ Legacy Options:
--extradata STRING Equivalent to --extra-data STRING. --extradata STRING Equivalent to --extra-data STRING.
--cache MB Equivalent to --cache-size MB. --cache MB Equivalent to --cache-size MB.
Internal Options:
--can-restart Executable will auto-restart if exiting with 125.
Miscellaneous Options: Miscellaneous Options:
-c --config CONFIG Specify a filename containing a configuration file. -c --config CONFIG Specify a filename containing a configuration file.
(default: {flag_config}) (default: {flag_config})

View File

@ -142,12 +142,12 @@ enum PostExecutionAction {
Quit, Quit,
} }
fn execute(command: Execute) -> Result<PostExecutionAction, String> { fn execute(command: Execute, can_restart: bool) -> Result<PostExecutionAction, String> {
let logger = setup_log(&command.logger).expect("Logger is initialized only once; qed"); let logger = setup_log(&command.logger).expect("Logger is initialized only once; qed");
match command.cmd { match command.cmd {
Cmd::Run(run_cmd) => { Cmd::Run(run_cmd) => {
let restart = run::execute(run_cmd, logger)?; let restart = run::execute(run_cmd, can_restart, logger)?;
Ok(if restart { PostExecutionAction::Restart } else { PostExecutionAction::Quit }) Ok(if restart { PostExecutionAction::Restart } else { PostExecutionAction::Quit })
}, },
Cmd::Version => Ok(PostExecutionAction::Print(Args::print_version())), Cmd::Version => Ok(PostExecutionAction::Print(Args::print_version())),
@ -160,7 +160,7 @@ fn execute(command: Execute) -> Result<PostExecutionAction, String> {
} }
} }
fn start() -> Result<PostExecutionAction, String> { fn start(can_restart: bool) -> Result<PostExecutionAction, String> {
let args: Vec<String> = env::args().collect(); let args: Vec<String> = env::args().collect();
let conf = Configuration::parse(&args).unwrap_or_else(|e| e.exit()); let conf = Configuration::parse(&args).unwrap_or_else(|e| e.exit());
@ -170,7 +170,7 @@ fn start() -> Result<PostExecutionAction, String> {
} }
let cmd = try!(conf.into_command()); let cmd = try!(conf.into_command());
execute(cmd) execute(cmd, can_restart)
} }
#[cfg(not(feature="stratum"))] #[cfg(not(feature="stratum"))]
@ -204,19 +204,21 @@ fn latest_exe_path() -> Option<PathBuf> {
// Starts ~/.parity-updates/parity and returns the code it exits with. // Starts ~/.parity-updates/parity and returns the code it exits with.
fn run_parity() -> Option<i32> { fn run_parity() -> Option<i32> {
use ::std::ffi::OsString;
let prefix = vec![OsString::from("--can-restart"), OsString::from("--force-direct")];
latest_exe_path().and_then(|exe| process::Command::new(exe) latest_exe_path().and_then(|exe| process::Command::new(exe)
.args(&env::args_os().collect::<Vec<_>>()) .args(&(env::args_os().chain(prefix.into_iter()).collect::<Vec<_>>()))
.status() .status()
.map(|es| es.code().unwrap_or(128)) .map(|es| es.code().unwrap_or(128))
.ok() .ok()
) )
} }
const PLEASE_RESTART_EXIT_CODE: i32 = 69; const PLEASE_RESTART_EXIT_CODE: i32 = 69;
// Run our version of parity. // Run our version of parity.
// Returns the exit error code. // Returns the exit error code.
fn main_direct() -> i32 { fn main_direct(can_restart: bool) -> i32 {
let mut alt_mains = HashMap::new(); let mut alt_mains = HashMap::new();
sync_main(&mut alt_mains); sync_main(&mut alt_mains);
stratum_main(&mut alt_mains); stratum_main(&mut alt_mains);
@ -224,7 +226,7 @@ fn main_direct() -> i32 {
f(); f();
0 0
} else { } else {
match start() { match start(can_restart) {
Ok(result) => match result { Ok(result) => match result {
PostExecutionAction::Print(s) => { info!("{}", s); 0 }, PostExecutionAction::Print(s) => { info!("{}", s); 0 },
PostExecutionAction::Restart => PLEASE_RESTART_EXIT_CODE, PostExecutionAction::Restart => PLEASE_RESTART_EXIT_CODE,
@ -270,7 +272,7 @@ fn main() {
loop { loop {
// If we fail to run the updated parity then fallback to local version. // If we fail to run the updated parity then fallback to local version.
trace_main!("Attempting to run latest update ({})...", latest_exe.as_ref().expect("guarded by have_update; latest_exe must exist for have_update; qed").display()); trace_main!("Attempting to run latest update ({})...", latest_exe.as_ref().expect("guarded by have_update; latest_exe must exist for have_update; qed").display());
let exit_code = run_parity().unwrap_or_else(|| { trace_main!("Falling back to local..."); main_direct() }); let exit_code = run_parity().unwrap_or_else(|| { trace_main!("Falling back to local..."); main_direct(true) });
trace_main!("Latest exited with {}", exit_code); trace_main!("Latest exited with {}", exit_code);
if exit_code != PLEASE_RESTART_EXIT_CODE { if exit_code != PLEASE_RESTART_EXIT_CODE {
trace_main!("Quitting..."); trace_main!("Quitting...");
@ -281,6 +283,7 @@ fn main() {
} else { } else {
trace_main!("Running direct"); trace_main!("Running direct");
// Otherwise, we're presumably running the version we want. Just run and fall-through. // Otherwise, we're presumably running the version we want. Just run and fall-through.
process::exit(main_direct()); let can_restart = std::env::args().any(|arg| arg == "--can-restart");
process::exit(main_direct(can_restart));
} }
} }

View File

@ -116,7 +116,7 @@ pub fn open_ui(dapps_conf: &dapps::Configuration, signer_conf: &signer::Configur
Ok(()) Ok(())
} }
pub fn execute(cmd: RunCmd, logger: Arc<RotatingLogger>) -> Result<bool, String> { pub fn execute(cmd: RunCmd, can_restart: bool, logger: Arc<RotatingLogger>) -> Result<bool, String> {
if cmd.ui && cmd.dapps_conf.enabled { if cmd.ui && cmd.dapps_conf.enabled {
// Check if Parity is already running // Check if Parity is already running
let addr = format!("{}:{}", cmd.dapps_conf.interface, cmd.dapps_conf.port); let addr = format!("{}:{}", cmd.dapps_conf.interface, cmd.dapps_conf.port);
@ -415,7 +415,7 @@ pub fn execute(cmd: RunCmd, logger: Arc<RotatingLogger>) -> Result<bool, String>
} }
// Handle exit // Handle exit
wait_for_exit(panic_handler, http_server, ipc_server, dapps_server, signer_server, updater); wait_for_exit(panic_handler, http_server, ipc_server, dapps_server, signer_server, updater, can_restart);
info!("Finishing work, please wait..."); info!("Finishing work, please wait...");
@ -472,7 +472,8 @@ fn wait_for_exit(
_ipc_server: Option<IpcServer>, _ipc_server: Option<IpcServer>,
_dapps_server: Option<WebappServer>, _dapps_server: Option<WebappServer>,
_signer_server: Option<SignerServer>, _signer_server: Option<SignerServer>,
updater: Arc<Updater> updater: Arc<Updater>,
can_restart: bool
) -> bool { ) -> bool {
let exit = Arc::new((Mutex::new(false), Condvar::new())); let exit = Arc::new((Mutex::new(false), Condvar::new()));
@ -485,8 +486,12 @@ fn wait_for_exit(
panic_handler.on_panic(move |_reason| { e.1.notify_all(); }); panic_handler.on_panic(move |_reason| { e.1.notify_all(); });
// Handle updater wanting to restart us // Handle updater wanting to restart us
let e = exit.clone(); if can_restart {
updater.set_exit_handler(move || { *e.0.lock() = true; e.1.notify_all(); }); let e = exit.clone();
updater.set_exit_handler(move || { *e.0.lock() = true; e.1.notify_all(); });
} else {
updater.set_exit_handler(|| info!("Update installed; ready for restart."));
}
// Wait for signal // Wait for signal
let mut l = exit.0.lock(); let mut l = exit.0.lock();