From e7734d20537c4ffa1f50ba540407845465c675a3 Mon Sep 17 00:00:00 2001 From: quake Date: Tue, 19 Dec 2023 11:26:18 +0900 Subject: [PATCH] fix: resolve empty filter related message bug --- .../filter/get_block_filter_check_points_process.rs | 10 +++++----- sync/src/filter/get_block_filter_hashes_process.rs | 4 ++-- sync/src/filter/get_block_filters_process.rs | 11 ++++++----- sync/src/types/mod.rs | 7 +++++++ 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/sync/src/filter/get_block_filter_check_points_process.rs b/sync/src/filter/get_block_filter_check_points_process.rs index e3a9680a10..a194525052 100644 --- a/sync/src/filter/get_block_filter_check_points_process.rs +++ b/sync/src/filter/get_block_filter_check_points_process.rs @@ -34,11 +34,11 @@ impl<'a> GetBlockFilterCheckPointsProcess<'a> { pub fn execute(self) -> Status { let active_chain = self.filter.shared.active_chain(); let start_number: BlockNumber = self.message.to_entity().start_number().unpack(); - let tip_number: BlockNumber = active_chain.tip_number(); + let latest: BlockNumber = active_chain.get_latest_built_filter_block_number(); let mut block_filter_hashes = Vec::new(); - if tip_number >= start_number { + if latest >= start_number { for block_number in (start_number..start_number + BATCH_SIZE * CHECK_POINT_INTERVAL) .step_by(CHECK_POINT_INTERVAL as usize) { @@ -59,9 +59,9 @@ impl<'a> GetBlockFilterCheckPointsProcess<'a> { let message = packed::BlockFilterMessage::new_builder() .set(content) .build(); - attempt!(send_message_to(self.nc.as_ref(), self.peer, &message)); + attempt!(send_message_to(self.nc.as_ref(), self.peer, &message)) + } else { + Status::ignored() } - - Status::ok() } } diff --git a/sync/src/filter/get_block_filter_hashes_process.rs b/sync/src/filter/get_block_filter_hashes_process.rs index e692743586..c1a3f5a6e0 100644 --- a/sync/src/filter/get_block_filter_hashes_process.rs +++ b/sync/src/filter/get_block_filter_hashes_process.rs @@ -32,11 +32,11 @@ impl<'a> GetBlockFilterHashesProcess<'a> { pub fn execute(self) -> Status { let active_chain = self.filter.shared.active_chain(); let start_number: BlockNumber = self.message.to_entity().start_number().unpack(); - let tip_number: BlockNumber = active_chain.tip_number(); + let latest: BlockNumber = active_chain.get_latest_built_filter_block_number(); let mut block_filter_hashes = Vec::new(); - if tip_number >= start_number { + if latest >= start_number { let parent_block_filter_hash = if start_number > 0 { match active_chain .get_block_hash(start_number - 1) diff --git a/sync/src/filter/get_block_filters_process.rs b/sync/src/filter/get_block_filters_process.rs index 9fa1b55520..22e527f0e5 100644 --- a/sync/src/filter/get_block_filters_process.rs +++ b/sync/src/filter/get_block_filters_process.rs @@ -33,8 +33,9 @@ impl<'a> GetBlockFiltersProcess<'a> { pub fn execute(self) -> Status { let active_chain = self.filter.shared.active_chain(); let start_number: BlockNumber = self.message.to_entity().start_number().unpack(); - let tip_number: BlockNumber = active_chain.tip_number(); - if tip_number >= start_number { + let latest: BlockNumber = active_chain.get_latest_built_filter_block_number(); + + if latest >= start_number { let mut block_hashes = Vec::new(); let mut filters = Vec::new(); for block_number in start_number..start_number + BATCH_SIZE { @@ -58,9 +59,9 @@ impl<'a> GetBlockFiltersProcess<'a> { let message = packed::BlockFilterMessage::new_builder() .set(content) .build(); - attempt!(send_message_to(self.nc.as_ref(), self.peer, &message)); + attempt!(send_message_to(self.nc.as_ref(), self.peer, &message)) + } else { + Status::ignored() } - - Status::ok() } } diff --git a/sync/src/types/mod.rs b/sync/src/types/mod.rs index 67ab26c1a7..0f7bc49275 100644 --- a/sync/src/types/mod.rs +++ b/sync/src/types/mod.rs @@ -2085,6 +2085,13 @@ impl ActiveChain { self.store().get_block_filter_hash(hash) } + pub fn get_latest_built_filter_block_number(&self) -> BlockNumber { + self.snapshot + .get_latest_built_filter_data_block_hash() + .and_then(|hash| self.snapshot.get_block_number(&hash)) + .unwrap_or_default() + } + pub fn shared(&self) -> &SyncShared { &self.shared }