From 2abe051a1fbf6e6b9f2d057d82e2b06021a35184 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Mon, 1 Jul 2019 17:10:14 -0700 Subject: [PATCH] run command now kills child process on SIGTERM to cleanly exit (#4896) automerge --- Cargo.lock | 27 +++++++++++++++++++++++++++ install/Cargo.toml | 1 + install/src/command.rs | 26 ++++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b3a1b70cdf..00e2db4f5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,6 +42,11 @@ dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "arc-swap" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "argon2rs" version = "0.2.5" @@ -2141,6 +2146,24 @@ dependencies = [ "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "signal-hook" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "signal-hook-registry 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "signal-hook-registry" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "siphasher" version = "0.2.3" @@ -2535,6 +2558,7 @@ dependencies = [ "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde_yaml 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)", + "signal-hook 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "solana-client 0.17.0", "solana-config-api 0.17.0", "solana-logger 0.17.0", @@ -3519,6 +3543,7 @@ dependencies = [ "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" "checksum ar 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "579681b3fecd1e9d6b5ce6969e05f9feb913f296eddaf595be1166a5ca597bc4" +"checksum arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841" "checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" @@ -3753,6 +3778,8 @@ dependencies = [ "checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" +"checksum signal-hook 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "72ab58f1fda436857e6337dcb6a5aaa34f16c5ddc87b3a8b6ef7a212f90b9c5a" +"checksum signal-hook-registry 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cded4ffa32146722ec54ab1f16320568465aa922aa9ab4708129599740da85d7" "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" diff --git a/install/Cargo.toml b/install/Cargo.toml index 40405b6709..22430602d4 100644 --- a/install/Cargo.toml +++ b/install/Cargo.toml @@ -30,6 +30,7 @@ ring = "0.13.2" serde = "1.0.94" serde_derive = "1.0.94" serde_yaml = "0.8.9" +signal-hook = "0.1.9" solana-client = { path = "../client", version = "0.17.0" } solana-config-api = { path = "../programs/config_api", version = "0.17.0" } solana-logger = { path = "../logger", version = "0.17.0" } diff --git a/install/src/command.rs b/install/src/command.rs index d5d40141b0..a34dd647da 100644 --- a/install/src/command.rs +++ b/install/src/command.rs @@ -14,7 +14,7 @@ use solana_sdk::transaction::Transaction; use std::fs::{self, File}; use std::io::{self, BufReader, Read}; use std::path::{Path, PathBuf}; -use std::thread::sleep; +use std::sync::mpsc; use std::time::SystemTime; use std::time::{Duration, Instant}; use tempdir::TempDir; @@ -759,6 +759,19 @@ pub fn run( let mut child_option: Option = None; let mut now = Instant::now(); + + let (signal_sender, signal_receiver) = mpsc::channel(); + if !cfg!(windows) { + use signal_hook::{iterator::Signals, SIGTERM}; + let signals = Signals::new(&[SIGTERM]).unwrap(); + std::thread::spawn(move || { + for sig in signals.forever() { + eprintln!("run: received signal {:?}", sig); + let _ = signal_sender.send(()); + } + }); + } + loop { child_option = match child_option { Some(mut child) => match child.try_wait() { @@ -806,6 +819,15 @@ pub fn run( }; now = Instant::now(); } - sleep(Duration::from_secs(1)); + + if let Ok(()) = signal_receiver.recv_timeout(Duration::from_secs(1)) { + // Handle SIGTERM... + if let Some(ref mut child) = child_option { + stop_process(child).unwrap_or_else(|err| { + eprintln!("Failed to stop child: {:?}", err); + }); + } + std::process::exit(0); + } } }