diff --git a/codechain/run_node.rs b/codechain/run_node.rs index 44555739a2..71a09b79b1 100644 --- a/codechain/run_node.rs +++ b/codechain/run_node.rs @@ -14,11 +14,10 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use std::env; use std::fs; use std::path::Path; use std::sync::{Arc, Weak}; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use std::time::{SystemTime, UNIX_EPOCH}; use ccore::{ AccountProvider, AccountProviderError, ChainNotify, Client, ClientConfig, ClientService, EngineInfo, EngineType, @@ -35,7 +34,6 @@ use csync::{BlockSyncExtension, BlockSyncSender, SnapshotService, TransactionSyn use ctimer::TimerLoop; use ctrlc::CtrlC; use fdlimit::raise_fd_limit; -use finally_block::finally; use kvdb::KeyValueDB; use kvdb_rocksdb::{Database, DatabaseConfig}; use parking_lot::{Condvar, Mutex}; @@ -227,17 +225,6 @@ pub fn run_node(matches: &ArgMatches) -> Result<(), String> { let config = load_config(matches)?; - // FIXME: It is the hotfix for #348. - // Remove the below code if you find the proper way to solve #348. - let _wait = finally(|| { - const DEFAULT: u64 = 1; - let wait_before_shutdown = env::var_os("WAIT_BEFORE_SHUTDOWN") - .and_then(|sec| sec.into_string().ok()) - .and_then(|sec| sec.parse().ok()) - .unwrap_or(DEFAULT); - ::std::thread::sleep(Duration::from_secs(wait_before_shutdown)); - }); - let scheme = match &config.operating.chain { Some(chain) => chain.scheme()?, None => return Err("chain is not specified".to_string()), diff --git a/core/src/verification/queue/mod.rs b/core/src/verification/queue/mod.rs index ec59d51670..79402d8553 100644 --- a/core/src/verification/queue/mod.rs +++ b/core/src/verification/queue/mod.rs @@ -67,14 +67,12 @@ pub struct VerificationQueue { engine: Arc, verification: Arc>, processing: RwLock>, // hash to score - #[allow(dead_code)] deleting: Arc, ready_signal: Arc, total_score: RwLock, #[allow(dead_code)] empty: Arc, more_to_verify: Arc, - #[allow(dead_code)] verifier_handles: Vec>, max_queue_size: usize, max_mem_use: usize, @@ -161,11 +159,20 @@ impl VerificationQueue { let more_to_verify = more_to_verify.clone(); let ready_signal = ready_signal.clone(); let empty = empty.clone(); + let deleting = Arc::clone(&deleting); let handle = thread::Builder::new() .name(format!("Verifier #{}", i)) .spawn(move || { - VerificationQueue::verify(&verification, &*engine, &*ready_signal, &*empty, &*more_to_verify, i) + VerificationQueue::verify( + &verification, + &*engine, + &*ready_signal, + &*empty, + &*more_to_verify, + &*deleting, + i, + ) }) .expect("Failed to create verifier thread."); verifier_handles.push(handle); @@ -192,6 +199,7 @@ impl VerificationQueue { ready_signal: &QueueSignal, empty: &SCondvar, more_to_verify: &SCondvar, + deleting: &AtomicBool, _id: usize, ) { loop { @@ -204,9 +212,15 @@ impl VerificationQueue { } while verification.unverified.lock().is_empty() { + if deleting.load(AtomicOrdering::SeqCst) { + return + } more_to_verify_mutex = more_to_verify.wait(more_to_verify_mutex).unwrap(); } } + if deleting.load(AtomicOrdering::SeqCst) { + return + } // do work. let item = { @@ -474,6 +488,16 @@ impl VerificationQueue { } } +impl Drop for VerificationQueue { + fn drop(&mut self) { + self.deleting.store(true, AtomicOrdering::SeqCst); + self.more_to_verify.notify_all(); + for handle in self.verifier_handles.drain(0..) { + handle.join().unwrap(); + } + } +} + // the internal queue sizes. struct Sizes { unverified: AtomicUsize, diff --git a/test/src/helper/spawn.ts b/test/src/helper/spawn.ts index e74a5bc919..fd9c3089a3 100644 --- a/test/src/helper/spawn.ts +++ b/test/src/helper/spawn.ts @@ -171,8 +171,6 @@ export default class CodeChain { } const useDebugBuild = process.env.NODE_ENV !== "production"; process.env.RUST_LOG = logLevel; - // NOTE: https://github.com/CodeChain-io/codechain/issues/348 - process.env.WAIT_BEFORE_SHUTDOWN = "0"; const baseArgs = [...this.argv, ...argv]; if (disableIpc) {