From 0da0797f713cb1d10eb4ee3af10b98c1918e0d56 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 5 Apr 2021 17:23:02 -0400 Subject: [PATCH 1/5] fix: patch proposal --- .../src/burnchains/bitcoin_regtest_controller.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs b/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs index 9aa382c30a..7ca14116ce 100644 --- a/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs +++ b/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs @@ -1305,6 +1305,8 @@ impl BitcoinRegtestController { &self, height_to_wait: Option, ) -> Result { + let mut timeout = 0; + let step = 100; loop { let canonical_burnchain_tip = self .burnchain_db @@ -1314,12 +1316,18 @@ impl BitcoinRegtestController { .unwrap(); let canonical_sortition_tip = SortitionDB::get_canonical_burn_chain_tip(self.sortdb_ref().conn()).unwrap(); - if canonical_burnchain_tip.block_height == canonical_sortition_tip.block_height { + + if canonical_burnchain_tip.block_height == canonical_sortition_tip.block_height + || timeout > 30_000 + { let (_, state_transition) = self .sortdb_ref() .get_sortition_result(&canonical_sortition_tip.sortition_id) .expect("Sortition DB error.") .expect("BUG: no data for the canonical chain tip"); + if timeout > 30_000 { + error!("Aborting wait_for_sortitions"); + } return Ok(BurnchainTip { block_snapshot: canonical_sortition_tip, received_at: Instant::now(), @@ -1344,7 +1352,8 @@ impl BitcoinRegtestController { return Err(BurnchainControllerError::CoordinatorClosed); } // yield some time - sleep_ms(100); + sleep_ms(step); + timeout += step; } } From e09ebf2bc1d065f79efa207fa1526f8ce7e01498 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 6 Apr 2021 15:19:08 -0400 Subject: [PATCH 2/5] Revert "fix: patch proposal" This reverts commit 0da0797f713cb1d10eb4ee3af10b98c1918e0d56. --- .../src/burnchains/bitcoin_regtest_controller.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs b/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs index 7ca14116ce..9aa382c30a 100644 --- a/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs +++ b/testnet/stacks-node/src/burnchains/bitcoin_regtest_controller.rs @@ -1305,8 +1305,6 @@ impl BitcoinRegtestController { &self, height_to_wait: Option, ) -> Result { - let mut timeout = 0; - let step = 100; loop { let canonical_burnchain_tip = self .burnchain_db @@ -1316,18 +1314,12 @@ impl BitcoinRegtestController { .unwrap(); let canonical_sortition_tip = SortitionDB::get_canonical_burn_chain_tip(self.sortdb_ref().conn()).unwrap(); - - if canonical_burnchain_tip.block_height == canonical_sortition_tip.block_height - || timeout > 30_000 - { + if canonical_burnchain_tip.block_height == canonical_sortition_tip.block_height { let (_, state_transition) = self .sortdb_ref() .get_sortition_result(&canonical_sortition_tip.sortition_id) .expect("Sortition DB error.") .expect("BUG: no data for the canonical chain tip"); - if timeout > 30_000 { - error!("Aborting wait_for_sortitions"); - } return Ok(BurnchainTip { block_snapshot: canonical_sortition_tip, received_at: Instant::now(), @@ -1352,8 +1344,7 @@ impl BitcoinRegtestController { return Err(BurnchainControllerError::CoordinatorClosed); } // yield some time - sleep_ms(step); - timeout += step; + sleep_ms(100); } } From d4e23c8471f080e5c3f952c7dff50d022c24edf4 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 6 Apr 2021 15:19:34 -0400 Subject: [PATCH 3/5] fix: announce burnchain block --- testnet/stacks-node/src/run_loop/neon.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/testnet/stacks-node/src/run_loop/neon.rs b/testnet/stacks-node/src/run_loop/neon.rs index df43268f00..d888f1e3b3 100644 --- a/testnet/stacks-node/src/run_loop/neon.rs +++ b/testnet/stacks-node/src/run_loop/neon.rs @@ -270,6 +270,11 @@ impl RunLoop { }) .unwrap(); + // We announce a new burn block so that the chains coordinator + // can resume prior work and handle eventual unprocessed sortitions + // stored during a previous session. + coordinator_senders.announce_new_burn_block(); + let mut burnchain_tip = burnchain .wait_for_sortitions(None) .expect("Unable to get burnchain tip"); From 13daa42e7107d83f986f894f0b1a433b899a9a34 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 6 Apr 2021 15:23:43 -0400 Subject: [PATCH 4/5] chore: cargo fmt --- testnet/stacks-node/src/run_loop/neon.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testnet/stacks-node/src/run_loop/neon.rs b/testnet/stacks-node/src/run_loop/neon.rs index d888f1e3b3..ca229b24fa 100644 --- a/testnet/stacks-node/src/run_loop/neon.rs +++ b/testnet/stacks-node/src/run_loop/neon.rs @@ -271,7 +271,7 @@ impl RunLoop { .unwrap(); // We announce a new burn block so that the chains coordinator - // can resume prior work and handle eventual unprocessed sortitions + // can resume prior work and handle eventual unprocessed sortitions // stored during a previous session. coordinator_senders.announce_new_burn_block(); From 36f7c12c38a14e2d5ef23b0c8277edf9667f17a0 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 6 Apr 2021 15:53:01 -0400 Subject: [PATCH 5/5] fix: terminating event observer --- testnet/stacks-node/src/event_dispatcher.rs | 18 ++++++++++++++++-- testnet/stacks-node/src/node.rs | 18 +++++++++--------- testnet/stacks-node/src/run_loop/neon.rs | 2 +- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/testnet/stacks-node/src/event_dispatcher.rs b/testnet/stacks-node/src/event_dispatcher.rs index 0b5654c605..fd5f26bd70 100644 --- a/testnet/stacks-node/src/event_dispatcher.rs +++ b/testnet/stacks-node/src/event_dispatcher.rs @@ -7,7 +7,10 @@ use std::thread::sleep; use std::time::Duration; use std::{ collections::{HashMap, HashSet}, - sync::{Arc, Mutex}, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, Mutex, + }, }; use async_h1::client; @@ -36,6 +39,7 @@ use super::node::ChainTip; #[derive(Debug, Clone)] struct EventObserver { endpoint: String, + should_keep_running: Arc, } const STATUS_RESP_TRUE: &str = "success"; @@ -73,6 +77,11 @@ impl EventObserver { let backoff = Duration::from_millis((1.0 * 1_000.0) as u64); loop { + if !self.should_keep_running.load(Ordering::SeqCst) { + info!("Terminating event observer"); + return; + } + let body = body.clone(); let mut req = Request::new(Method::Post, url.clone()); req.append_header("Content-Type", "application/json") @@ -627,11 +636,16 @@ impl EventDispatcher { } } - pub fn register_observer(&mut self, conf: &EventObserverConfig) { + pub fn register_observer( + &mut self, + conf: &EventObserverConfig, + should_keep_running: Arc, + ) { // let event_observer = EventObserver::new(&conf.address, conf.port); info!("Registering event observer at: {}", conf.endpoint); let event_observer = EventObserver { endpoint: conf.endpoint.clone(), + should_keep_running, }; let observer_index = self.registered_observers.len() as u16; diff --git a/testnet/stacks-node/src/node.rs b/testnet/stacks-node/src/node.rs index efb201587a..ff700b4a83 100644 --- a/testnet/stacks-node/src/node.rs +++ b/testnet/stacks-node/src/node.rs @@ -18,6 +18,7 @@ use stacks::chainstate::stacks::db::{ use stacks::chainstate::stacks::events::{ StacksTransactionEvent, StacksTransactionReceipt, TransactionOrigin, }; +use stacks::chainstate::stacks::index::TrieHash; use stacks::chainstate::stacks::{ CoinbasePayload, StacksAddress, StacksBlock, StacksBlockHeader, StacksMicroblock, StacksTransaction, StacksTransactionSigner, TransactionAnchorMode, TransactionPayload, @@ -33,6 +34,11 @@ use stacks::net::{ rpc::RPCHandlerArgs, Error as NetError, PeerAddress, }; +use stacks::util::get_epoch_time_secs; +use stacks::util::hash::Sha256Sum; +use stacks::util::secp256k1::Secp256k1PrivateKey; +use stacks::util::strings::UrlString; +use stacks::util::vrf::VRFPublicKey; use stacks::{ burnchains::{Burnchain, BurnchainHeaderHash, Txid}, chainstate::stacks::db::{ @@ -41,13 +47,7 @@ use stacks::{ }, }; use std::sync::mpsc::{sync_channel, Receiver, SyncSender}; - -use stacks::chainstate::stacks::index::TrieHash; -use stacks::util::get_epoch_time_secs; -use stacks::util::hash::Sha256Sum; -use stacks::util::secp256k1::Secp256k1PrivateKey; -use stacks::util::strings::UrlString; -use stacks::util::vrf::VRFPublicKey; +use std::sync::{atomic::AtomicBool, Arc}; #[derive(Debug, Clone)] pub struct ChainTip { @@ -311,7 +311,7 @@ impl Node { let mut event_dispatcher = EventDispatcher::new(); for observer in &config.events_observers { - event_dispatcher.register_observer(observer); + event_dispatcher.register_observer(observer, Arc::new(AtomicBool::new(true))); } event_dispatcher.process_boot_receipts(receipts); @@ -342,7 +342,7 @@ impl Node { let mut event_dispatcher = EventDispatcher::new(); for observer in &config.events_observers { - event_dispatcher.register_observer(observer); + event_dispatcher.register_observer(observer, Arc::new(AtomicBool::new(true))); } let chainstate_path = config.get_chainstate_path_str(); diff --git a/testnet/stacks-node/src/run_loop/neon.rs b/testnet/stacks-node/src/run_loop/neon.rs index ca229b24fa..a075354493 100644 --- a/testnet/stacks-node/src/run_loop/neon.rs +++ b/testnet/stacks-node/src/run_loop/neon.rs @@ -180,7 +180,7 @@ impl RunLoop { // setup dispatcher let mut event_dispatcher = EventDispatcher::new(); for observer in self.config.events_observers.iter() { - event_dispatcher.register_observer(observer); + event_dispatcher.register_observer(observer, should_keep_running.clone()); } let use_test_genesis_data = use_test_genesis_chainstate(&self.config);