diff --git a/sync/src/block_connector/block_connector_service.rs b/sync/src/block_connector/block_connector_service.rs index 1e4d554ca6..5a8faee75a 100644 --- a/sync/src/block_connector/block_connector_service.rs +++ b/sync/src/block_connector/block_connector_service.rs @@ -10,12 +10,15 @@ use super::CreateBlockResponse; use crate::block_connector::{ ExecuteRequest, MinerRequest, MinerResponse, ResetRequest, WriteBlockChainService, }; +use crate::store::sync_dag_store::SyncDagStore; +use crate::store::sync_dag_store::SyncDagStoreConfig; use crate::sync::{CheckSyncEvent, SyncService}; use crate::tasks::{BlockConnectedEvent, BlockConnectedFinishEvent, BlockDiskCheckEvent}; use anyhow::{bail, format_err, Ok, Result}; use network_api::PeerProvider; use starcoin_chain::BlockChain; use starcoin_chain_api::{ChainReader, ConnectBlockError, WriteableChainService}; +use starcoin_config::RocksdbConfig; use starcoin_config::{NodeConfig, G_CRATE_VERSION}; use starcoin_consensus::Consensus; use starcoin_crypto::HashValue; @@ -30,6 +33,7 @@ use starcoin_service_registry::{ }; use starcoin_storage::{BlockStore, Storage}; use starcoin_sync_api::PeerNewBlock; +use starcoin_sync_api::SyncAsyncService; use starcoin_txpool::TxPoolService; use starcoin_txpool_api::TxPoolSyncService; #[cfg(test)] @@ -352,7 +356,26 @@ impl ServiceHandler where TransactionPoolServiceT: TxPoolSyncService + 'static, { - fn handle(&mut self, msg: ResetRequest, _ctx: &mut ServiceContext) -> Result<()> { + fn handle(&mut self, msg: ResetRequest, ctx: &mut ServiceContext) -> Result<()> { + // cancel the sync to avoid the db writing conflict + let sync_service = ctx.service_ref::()?.clone(); + async_std::task::block_on(async { + sync_service.cancel().await?; + anyhow::Ok(()) + })?; + + let config = ctx.get_shared::>()?; + + let sync_dag_store = SyncDagStore::create_from_path( + config.storage.sync_dir(), + SyncDagStoreConfig::create_with_params( + config.storage.cache_size(), + RocksdbConfig::default(), + ), + )?; + + sync_dag_store.delete_all_dag_sync_block()?; + self.chain_service.reset(msg.block_hash) } }