change(state): Condense CodeTimer::start() and Span::current() calls in state service (#6337)
* starts the timer at the top of the call() method * assigns 'span' at the top of the call methods
This commit is contained in:
parent
58da3576b9
commit
6d0ce112db
|
@ -894,13 +894,13 @@ impl Service<Request> for StateService {
|
||||||
#[instrument(name = "state", skip(self, req))]
|
#[instrument(name = "state", skip(self, req))]
|
||||||
fn call(&mut self, req: Request) -> Self::Future {
|
fn call(&mut self, req: Request) -> Self::Future {
|
||||||
req.count_metric();
|
req.count_metric();
|
||||||
|
let timer = CodeTimer::start();
|
||||||
|
let span = Span::current();
|
||||||
|
|
||||||
match req {
|
match req {
|
||||||
// Uses queued_non_finalized_blocks and pending_utxos in the StateService
|
// Uses queued_non_finalized_blocks and pending_utxos in the StateService
|
||||||
// Accesses shared writeable state in the StateService, NonFinalizedState, and ZebraDb.
|
// Accesses shared writeable state in the StateService, NonFinalizedState, and ZebraDb.
|
||||||
Request::CommitBlock(prepared) => {
|
Request::CommitBlock(prepared) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
self.assert_block_can_be_validated(&prepared);
|
self.assert_block_can_be_validated(&prepared);
|
||||||
|
|
||||||
self.pending_utxos
|
self.pending_utxos
|
||||||
|
@ -916,7 +916,7 @@ impl Service<Request> for StateService {
|
||||||
// there shouldn't be any other code running in the same task,
|
// there shouldn't be any other code running in the same task,
|
||||||
// so we don't need to worry about blocking it:
|
// so we don't need to worry about blocking it:
|
||||||
// https://docs.rs/tokio/latest/tokio/task/fn.block_in_place.html
|
// https://docs.rs/tokio/latest/tokio/task/fn.block_in_place.html
|
||||||
let span = Span::current();
|
|
||||||
let rsp_rx = tokio::task::block_in_place(move || {
|
let rsp_rx = tokio::task::block_in_place(move || {
|
||||||
span.in_scope(|| self.queue_and_commit_non_finalized(prepared))
|
span.in_scope(|| self.queue_and_commit_non_finalized(prepared))
|
||||||
});
|
});
|
||||||
|
@ -948,8 +948,6 @@ impl Service<Request> for StateService {
|
||||||
// Uses queued_finalized_blocks and pending_utxos in the StateService.
|
// Uses queued_finalized_blocks and pending_utxos in the StateService.
|
||||||
// Accesses shared writeable state in the StateService.
|
// Accesses shared writeable state in the StateService.
|
||||||
Request::CommitFinalizedBlock(finalized) => {
|
Request::CommitFinalizedBlock(finalized) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
// # Consensus
|
// # Consensus
|
||||||
//
|
//
|
||||||
// A non-finalized block verification could have called AwaitUtxo
|
// A non-finalized block verification could have called AwaitUtxo
|
||||||
|
@ -973,7 +971,6 @@ impl Service<Request> for StateService {
|
||||||
// The work is all done, the future just waits on a channel for the result
|
// The work is all done, the future just waits on a channel for the result
|
||||||
timer.finish(module_path!(), line!(), "CommitFinalizedBlock");
|
timer.finish(module_path!(), line!(), "CommitFinalizedBlock");
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
async move {
|
async move {
|
||||||
rsp_rx
|
rsp_rx
|
||||||
.await
|
.await
|
||||||
|
@ -995,13 +992,11 @@ impl Service<Request> for StateService {
|
||||||
// Uses pending_utxos and queued_non_finalized_blocks in the StateService.
|
// Uses pending_utxos and queued_non_finalized_blocks in the StateService.
|
||||||
// If the UTXO isn't in the queued blocks, runs concurrently using the ReadStateService.
|
// If the UTXO isn't in the queued blocks, runs concurrently using the ReadStateService.
|
||||||
Request::AwaitUtxo(outpoint) => {
|
Request::AwaitUtxo(outpoint) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
// Prepare the AwaitUtxo future from PendingUxtos.
|
// Prepare the AwaitUtxo future from PendingUxtos.
|
||||||
let response_fut = self.pending_utxos.queue(outpoint);
|
let response_fut = self.pending_utxos.queue(outpoint);
|
||||||
// Only instrument `response_fut`, the ReadStateService already
|
// Only instrument `response_fut`, the ReadStateService already
|
||||||
// instruments its requests with the same span.
|
// instruments its requests with the same span.
|
||||||
let span = Span::current();
|
|
||||||
let response_fut = response_fut.instrument(span).boxed();
|
let response_fut = response_fut.instrument(span).boxed();
|
||||||
|
|
||||||
// Check the non-finalized block queue outside the returned future,
|
// Check the non-finalized block queue outside the returned future,
|
||||||
|
@ -1151,15 +1146,14 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
#[instrument(name = "read_state", skip(self, req))]
|
#[instrument(name = "read_state", skip(self, req))]
|
||||||
fn call(&mut self, req: ReadRequest) -> Self::Future {
|
fn call(&mut self, req: ReadRequest) -> Self::Future {
|
||||||
req.count_metric();
|
req.count_metric();
|
||||||
|
let timer = CodeTimer::start();
|
||||||
|
let span = Span::current();
|
||||||
|
|
||||||
match req {
|
match req {
|
||||||
// Used by the StateService.
|
// Used by the StateService.
|
||||||
ReadRequest::Tip => {
|
ReadRequest::Tip => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let tip = state.non_finalized_state_receiver.with_watch_data(
|
let tip = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1180,11 +1174,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Used by the StateService.
|
// Used by the StateService.
|
||||||
ReadRequest::Depth(hash) => {
|
ReadRequest::Depth(hash) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let depth = state.non_finalized_state_receiver.with_watch_data(
|
let depth = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1205,11 +1196,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Used by the StateService.
|
// Used by the StateService.
|
||||||
ReadRequest::BestChainNextMedianTimePast => {
|
ReadRequest::BestChainNextMedianTimePast => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let non_finalized_state = state.latest_non_finalized_state();
|
let non_finalized_state = state.latest_non_finalized_state();
|
||||||
|
@ -1234,11 +1222,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Used by the get_block (raw) RPC and the StateService.
|
// Used by the get_block (raw) RPC and the StateService.
|
||||||
ReadRequest::Block(hash_or_height) => {
|
ReadRequest::Block(hash_or_height) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let block = state.non_finalized_state_receiver.with_watch_data(
|
let block = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1263,11 +1248,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// For the get_raw_transaction RPC and the StateService.
|
// For the get_raw_transaction RPC and the StateService.
|
||||||
ReadRequest::Transaction(hash) => {
|
ReadRequest::Transaction(hash) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let transaction_and_height = state
|
let transaction_and_height = state
|
||||||
|
@ -1288,11 +1270,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Used by the getblock (verbose) RPC.
|
// Used by the getblock (verbose) RPC.
|
||||||
ReadRequest::TransactionIdsForBlock(hash_or_height) => {
|
ReadRequest::TransactionIdsForBlock(hash_or_height) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let transaction_ids = state.non_finalized_state_receiver.with_watch_data(
|
let transaction_ids = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1322,11 +1301,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadRequest::UnspentBestChainUtxo(outpoint) => {
|
ReadRequest::UnspentBestChainUtxo(outpoint) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let utxo = state.non_finalized_state_receiver.with_watch_data(
|
let utxo = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1351,11 +1327,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Manually used by the StateService to implement part of AwaitUtxo.
|
// Manually used by the StateService to implement part of AwaitUtxo.
|
||||||
ReadRequest::AnyChainUtxo(outpoint) => {
|
ReadRequest::AnyChainUtxo(outpoint) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let utxo = state.non_finalized_state_receiver.with_watch_data(
|
let utxo = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1376,11 +1349,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Used by the StateService.
|
// Used by the StateService.
|
||||||
ReadRequest::BlockLocator => {
|
ReadRequest::BlockLocator => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let block_locator = state.non_finalized_state_receiver.with_watch_data(
|
let block_locator = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1403,11 +1373,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Used by the StateService.
|
// Used by the StateService.
|
||||||
ReadRequest::FindBlockHashes { known_blocks, stop } => {
|
ReadRequest::FindBlockHashes { known_blocks, stop } => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let block_hashes = state.non_finalized_state_receiver.with_watch_data(
|
let block_hashes = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1434,11 +1401,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Used by the StateService.
|
// Used by the StateService.
|
||||||
ReadRequest::FindBlockHeaders { known_blocks, stop } => {
|
ReadRequest::FindBlockHeaders { known_blocks, stop } => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let block_headers = state.non_finalized_state_receiver.with_watch_data(
|
let block_headers = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1469,11 +1433,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadRequest::SaplingTree(hash_or_height) => {
|
ReadRequest::SaplingTree(hash_or_height) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let sapling_tree = state.non_finalized_state_receiver.with_watch_data(
|
let sapling_tree = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1497,11 +1458,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadRequest::OrchardTree(hash_or_height) => {
|
ReadRequest::OrchardTree(hash_or_height) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let orchard_tree = state.non_finalized_state_receiver.with_watch_data(
|
let orchard_tree = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1526,11 +1484,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// For the get_address_balance RPC.
|
// For the get_address_balance RPC.
|
||||||
ReadRequest::AddressBalance(addresses) => {
|
ReadRequest::AddressBalance(addresses) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let balance = state.non_finalized_state_receiver.with_watch_data(
|
let balance = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1558,11 +1513,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
addresses,
|
addresses,
|
||||||
height_range,
|
height_range,
|
||||||
} => {
|
} => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let tx_ids = state.non_finalized_state_receiver.with_watch_data(
|
let tx_ids = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1594,11 +1546,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// For the get_address_utxos RPC.
|
// For the get_address_utxos RPC.
|
||||||
ReadRequest::UtxosByAddresses(addresses) => {
|
ReadRequest::UtxosByAddresses(addresses) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let utxos = state.non_finalized_state_receiver.with_watch_data(
|
let utxos = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1623,11 +1572,8 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadRequest::CheckBestChainTipNullifiersAndAnchors(unmined_tx) => {
|
ReadRequest::CheckBestChainTipNullifiersAndAnchors(unmined_tx) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let latest_non_finalized_best_chain =
|
let latest_non_finalized_best_chain =
|
||||||
|
@ -1664,14 +1610,12 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
// Used by the get_block and get_block_hash RPCs.
|
// Used by the get_block and get_block_hash RPCs.
|
||||||
ReadRequest::BestChainBlockHash(height) => {
|
ReadRequest::BestChainBlockHash(height) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
// # Performance
|
// # Performance
|
||||||
//
|
//
|
||||||
// Allow other async tasks to make progress while concurrently reading blocks from disk.
|
// Allow other async tasks to make progress while concurrently reading blocks from disk.
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let hash = state.non_finalized_state_receiver.with_watch_data(
|
let hash = state.non_finalized_state_receiver.with_watch_data(
|
||||||
|
@ -1697,15 +1641,13 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
// Used by get_block_template RPC.
|
// Used by get_block_template RPC.
|
||||||
#[cfg(feature = "getblocktemplate-rpcs")]
|
#[cfg(feature = "getblocktemplate-rpcs")]
|
||||||
ReadRequest::ChainInfo => {
|
ReadRequest::ChainInfo => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
let latest_non_finalized_state = self.latest_non_finalized_state();
|
let latest_non_finalized_state = self.latest_non_finalized_state();
|
||||||
|
|
||||||
// # Performance
|
// # Performance
|
||||||
//
|
//
|
||||||
// Allow other async tasks to make progress while concurrently reading blocks from disk.
|
// Allow other async tasks to make progress while concurrently reading blocks from disk.
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
// # Correctness
|
// # Correctness
|
||||||
|
@ -1739,14 +1681,12 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
// Used by getmininginfo, getnetworksolps, and getnetworkhashps RPCs.
|
// Used by getmininginfo, getnetworksolps, and getnetworkhashps RPCs.
|
||||||
#[cfg(feature = "getblocktemplate-rpcs")]
|
#[cfg(feature = "getblocktemplate-rpcs")]
|
||||||
ReadRequest::SolutionRate { num_blocks, height } => {
|
ReadRequest::SolutionRate { num_blocks, height } => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
// # Performance
|
// # Performance
|
||||||
//
|
//
|
||||||
// Allow other async tasks to make progress while concurrently reading blocks from disk.
|
// Allow other async tasks to make progress while concurrently reading blocks from disk.
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
let latest_non_finalized_state = state.latest_non_finalized_state();
|
let latest_non_finalized_state = state.latest_non_finalized_state();
|
||||||
|
@ -1794,14 +1734,12 @@ impl Service<ReadRequest> for ReadStateService {
|
||||||
|
|
||||||
#[cfg(feature = "getblocktemplate-rpcs")]
|
#[cfg(feature = "getblocktemplate-rpcs")]
|
||||||
ReadRequest::CheckBlockProposalValidity(prepared) => {
|
ReadRequest::CheckBlockProposalValidity(prepared) => {
|
||||||
let timer = CodeTimer::start();
|
|
||||||
|
|
||||||
let state = self.clone();
|
let state = self.clone();
|
||||||
|
|
||||||
// # Performance
|
// # Performance
|
||||||
//
|
//
|
||||||
// Allow other async tasks to make progress while concurrently reading blocks from disk.
|
// Allow other async tasks to make progress while concurrently reading blocks from disk.
|
||||||
let span = Span::current();
|
|
||||||
tokio::task::spawn_blocking(move || {
|
tokio::task::spawn_blocking(move || {
|
||||||
span.in_scope(move || {
|
span.in_scope(move || {
|
||||||
tracing::info!("attempting to validate and commit block proposal onto a cloned non-finalized state");
|
tracing::info!("attempting to validate and commit block proposal onto a cloned non-finalized state");
|
||||||
|
|
Loading…
Reference in New Issue