@@ -1222,73 +1222,27 @@ impl CollatorStdImpl {
1222
1222
mc_data_stuff : & McDataStuff ,
1223
1223
block_id_short : & BlockIdShort ,
1224
1224
) -> Result < Option < Vec < QueueShardBoundedRange > > > {
1225
- let mc_block_id = mc_data_stuff. current . block_id ;
1226
-
1227
- let prov_mc_state = if let Some ( ref prev_mc_state) = mc_data_stuff. previous {
1228
- prev_mc_state
1229
- } else {
1225
+ let Some ( prev_state) = & mc_data_stuff. previous else {
1230
1226
return Ok ( None ) ;
1231
1227
} ;
1232
1228
1233
- let prev_mc_block_shards: FastHashMap < ShardIdent , ShardDescriptionShort > =
1234
- prov_mc_state. shards . iter ( ) . cloned ( ) . collect ( ) ;
1235
-
1236
- let mut ranges = Vec :: < QueueShardBoundedRange > :: new ( ) ;
1237
-
1238
- // Load max_message from masterchain block diff
1239
- let Some ( master_max_msg) = self
1240
- . get_max_message ( & mc_block_id)
1241
- . await
1242
- . context ( "loading diff for mc block" ) ?
1243
- else {
1244
- return Ok ( None ) ;
1245
- } ;
1246
-
1247
- ranges. push ( QueueShardBoundedRange {
1248
- shard_ident : mc_block_id. shard ,
1249
- from : Bound :: Included ( master_max_msg) ,
1250
- to : Bound :: Included ( master_max_msg) ,
1251
- } ) ;
1252
-
1253
- // Iterate over all updated shard blocks and add their diff ranges
1254
- for ( shard, current_descr) in mc_data_stuff
1255
- . current
1256
- . shards
1257
- . iter ( )
1258
- . filter ( |( shard, d) | d. top_sc_block_updated && shard != & block_id_short. shard )
1259
- {
1260
- let Some ( prev_descr) = prev_mc_block_shards. get ( shard) else {
1261
- tracing:: warn!( target: tracing_targets:: COLLATOR , "prev_mc_block_shards not found: {shard:?}" ) ;
1262
- return Ok ( None ) ;
1263
- } ;
1264
-
1265
- if prev_descr. seqno == 0 {
1266
- return Ok ( None ) ;
1229
+ let prev_shards: FastHashMap < _ , _ > = prev_state. shards . iter ( ) . cloned ( ) . collect ( ) ;
1230
+
1231
+ let mut shard_pairs = Vec :: new ( ) ;
1232
+ for ( shard, curr) in mc_data_stuff. current . shards . iter ( ) {
1233
+ if curr. top_sc_block_updated && * shard != block_id_short. shard {
1234
+ if let Some ( prev) = prev_shards. get ( shard) {
1235
+ shard_pairs. push ( (
1236
+ * shard,
1237
+ prev. get_block_id ( * shard) ,
1238
+ curr. get_block_id ( * shard) ,
1239
+ ) ) ;
1240
+ }
1267
1241
}
1268
-
1269
- let Some ( first_diff_msg) = self
1270
- . get_max_message ( & prev_descr. get_block_id ( * shard) )
1271
- . await
1272
- . context ( "loading first diff msg" ) ?
1273
- else {
1274
- return Ok ( None ) ;
1275
- } ;
1276
- let Some ( last_diff_msg) = self
1277
- . get_max_message ( & current_descr. get_block_id ( * shard) )
1278
- . await
1279
- . context ( "loading last diff msg" ) ?
1280
- else {
1281
- return Ok ( None ) ;
1282
- } ;
1283
-
1284
- ranges. push ( QueueShardBoundedRange {
1285
- shard_ident : * shard,
1286
- from : Bound :: Excluded ( first_diff_msg) ,
1287
- to : Bound :: Included ( last_diff_msg) ,
1288
- } ) ;
1289
1242
}
1290
1243
1291
- Ok ( Some ( ranges) )
1244
+ self . build_ranges ( & mc_data_stuff. current . block_id , shard_pairs)
1245
+ . await
1292
1246
}
1293
1247
1294
1248
/// Collect ranges for loading cumulative statistics if collation block is master
@@ -1299,67 +1253,69 @@ impl CollatorStdImpl {
1299
1253
mc_data_stuff : & McDataStuff ,
1300
1254
top_shard_blocks_info : Vec < TopBlockDescription > ,
1301
1255
) -> Result < Option < Vec < QueueShardBoundedRange > > > {
1302
- let prev_mc_block_id = mc_data_stuff. current . block_id ;
1303
-
1304
- let prev_mc_block_shards: FastHashMap < ShardIdent , ShardDescriptionShort > =
1305
- mc_data_stuff. current . shards . iter ( ) . cloned ( ) . collect ( ) ;
1256
+ let prev_shards: FastHashMap < _ , _ > = mc_data_stuff. current . shards . iter ( ) . cloned ( ) . collect ( ) ;
1257
+
1258
+ let mut shard_pairs = Vec :: new ( ) ;
1259
+ for top in top_shard_blocks_info {
1260
+ if let Some ( prev) = prev_shards. get ( & top. block_id . shard ) {
1261
+ shard_pairs. push ( (
1262
+ top. block_id . shard ,
1263
+ prev. get_block_id ( top. block_id . shard ) ,
1264
+ top. block_id ,
1265
+ ) ) ;
1266
+ }
1267
+ }
1306
1268
1307
- let mut ranges = Vec :: < QueueShardBoundedRange > :: new ( ) ;
1269
+ self . build_ranges ( & mc_data_stuff. current . block_id , shard_pairs)
1270
+ . await
1271
+ }
1308
1272
1309
- // Load max_message from masterchain block diff
1273
+ async fn build_ranges (
1274
+ & self ,
1275
+ master_block_id : & BlockId ,
1276
+ shard_pairs : Vec < ( ShardIdent , BlockId , BlockId ) > ,
1277
+ ) -> Result < Option < Vec < QueueShardBoundedRange > > > {
1310
1278
let Some ( master_max_msg) = self
1311
- . get_max_message ( & prev_mc_block_id )
1279
+ . get_diff_max_message ( master_block_id )
1312
1280
. await
1313
1281
. context ( "loading diff for mc block" ) ?
1314
1282
else {
1315
1283
return Ok ( None ) ;
1316
1284
} ;
1317
1285
1318
- ranges. push ( QueueShardBoundedRange {
1319
- shard_ident : prev_mc_block_id. shard ,
1286
+ // add mc block diff range
1287
+ let mut ranges = vec ! [ QueueShardBoundedRange {
1288
+ shard_ident: master_block_id. shard,
1320
1289
from: Bound :: Included ( master_max_msg) ,
1321
1290
to: Bound :: Included ( master_max_msg) ,
1322
- } ) ;
1323
-
1324
- // Iterate over all updated shard blocks and add their diff ranges
1325
- for top_block_description in top_shard_blocks_info {
1326
- let Some ( prev_descr) = prev_mc_block_shards. get ( & top_block_description. block_id . shard )
1327
- else {
1328
- tracing:: warn!( target: tracing_targets:: COLLATOR , "prev_mc_block_shards not found: {:?}" , top_block_description. block_id. shard) ;
1329
- return Ok ( None ) ;
1330
- } ;
1291
+ } ] ;
1331
1292
1332
- if prev_descr. seqno == 0 {
1293
+ for ( shard, prev_id, curr_id) in shard_pairs {
1294
+ if prev_id. seqno == 0 {
1333
1295
return Ok ( None ) ;
1334
1296
}
1335
1297
1336
- let Some ( first_diff_msg) = self
1337
- . get_max_message ( & prev_descr. get_block_id ( top_block_description. block_id . shard ) )
1338
- . await
1339
- . context ( "loading first diff msg" ) ?
1340
- else {
1341
- return Ok ( None ) ;
1342
- } ;
1343
- let Some ( last_diff_msg) = self
1344
- . get_max_message ( & top_block_description. block_id )
1345
- . await
1346
- . context ( "loading last diff msg" ) ?
1347
- else {
1348
- return Ok ( None ) ;
1349
- } ;
1350
-
1351
- ranges. push ( QueueShardBoundedRange {
1352
- shard_ident : top_block_description. block_id . shard ,
1353
- from : Bound :: Excluded ( first_diff_msg) ,
1354
- to : Bound :: Included ( last_diff_msg) ,
1355
- } ) ;
1298
+ let ( first_msg, last_msg) = tokio:: try_join!(
1299
+ self . get_diff_max_message( & prev_id) ,
1300
+ self . get_diff_max_message( & curr_id)
1301
+ )
1302
+ . context ( "loading shard diffs" ) ?;
1303
+
1304
+ match ( first_msg, last_msg) {
1305
+ ( Some ( first) , Some ( last) ) => ranges. push ( QueueShardBoundedRange {
1306
+ shard_ident : shard,
1307
+ from : Bound :: Excluded ( first) ,
1308
+ to : Bound :: Included ( last) ,
1309
+ } ) ,
1310
+ _ => return Ok ( None ) ,
1311
+ }
1356
1312
}
1357
1313
1358
1314
Ok ( Some ( ranges) )
1359
1315
}
1360
1316
1361
1317
/// Helper function that retrieves `max_message` from either MQ or state diff
1362
- async fn get_max_message ( & self , block_id : & BlockId ) -> Result < Option < QueueKey > > {
1318
+ async fn get_diff_max_message ( & self , block_id : & BlockId ) -> Result < Option < QueueKey > > {
1363
1319
if let Some ( diff) =
1364
1320
self . mq_adapter
1365
1321
. get_diff_info ( & block_id. shard , block_id. seqno , DiffZone :: Both ) ?
0 commit comments