@@ -1183,6 +1183,54 @@ impl Storage {
11831183 self . put ( key, & value)
11841184 . expect ( "db put matched blocks should be ok" ) ;
11851185 }
1186+
1187+ pub fn cleanup_invalid_matched_blocks ( & self ) {
1188+ use ckb_types:: prelude:: Unpack ;
1189+ use log:: warn;
1190+
1191+ let tip_number: u64 = self . get_tip_header ( ) . raw ( ) . number ( ) . unpack ( ) ;
1192+
1193+ loop {
1194+ let entry = self . get_earliest_matched_blocks ( ) ;
1195+ if entry. is_none ( ) {
1196+ break ;
1197+ }
1198+
1199+ let ( start_number, blocks_count, block_hashes) = entry. unwrap ( ) ;
1200+ let mut should_remove = false ;
1201+
1202+ for ( block_hash, _) in & block_hashes {
1203+ if let Some ( header) = self . get_header ( block_hash) {
1204+ let stored_number: u64 = header. number ( ) ;
1205+ if stored_number < start_number || stored_number >= start_number + blocks_count
1206+ {
1207+ warn ! (
1208+ "Invalid matched block {:#x} at number {} outside expected range [{}, {}), removing entry at start_number={}" ,
1209+ block_hash, stored_number, start_number, start_number + blocks_count, start_number
1210+ ) ;
1211+ should_remove = true ;
1212+ break ;
1213+ }
1214+ } else {
1215+ if start_number + 1000 < tip_number {
1216+ warn ! (
1217+ "Matched block {:#x} not found in storage, entry at start_number={} is {} blocks behind tip, removing" ,
1218+ block_hash, start_number, tip_number - start_number
1219+ ) ;
1220+ should_remove = true ;
1221+ break ;
1222+ }
1223+ }
1224+ }
1225+
1226+ if should_remove {
1227+ self . remove_matched_blocks ( start_number) ;
1228+ } else {
1229+ break ;
1230+ }
1231+ }
1232+ }
1233+
11861234 pub fn add_fetched_header ( & self , hwe : & HeaderWithExtension ) {
11871235 let mut batch = self . batch ( ) ;
11881236 let block_hash = hwe. header . calc_header_hash ( ) ;
0 commit comments