Skip to content

Commit 604d035

Browse files
SmaGManRexagon
authored andcommitted
fix(collator): use prev processed anchor info when it ahead of master
1 parent fd14779 commit 604d035

File tree

2 files changed

+73
-12
lines changed

2 files changed

+73
-12
lines changed

collator/src/collator/mod.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@ impl CollatorStdImpl {
932932
prev_processed_upto_externals: Option<&ExternalsProcessedUpto>,
933933
) -> Option<AnchorsProcessingInfo> {
934934
// try get from mc data
935-
let mut info_opt = None;
935+
let mut from_mc_info_opt = None;
936936
if !shard_id.is_masterchain() {
937937
if let Some((mc_processed_to_anchor_id, mc_processed_to_msgs_offset)) = mc_data
938938
.processed_upto
@@ -946,13 +946,14 @@ impl CollatorStdImpl {
946946
// and top shard was not updated in master
947947
// it means that no shard blocks were collated between masters
948948
// because there were no messages for processing
949-
// and we can omit anchors rpocessing info from shard
949+
// and we can omit top processed anchor from shard
950+
// if it lower then top processed from master
950951
for (top_shard_id, top_shard_descr) in mc_data.shards.iter() {
951952
if shard_id == top_shard_id
952953
&& prev_block_id.seqno == top_shard_descr.seqno
953954
&& !top_shard_descr.top_sc_block_updated
954955
{
955-
info_opt = Some(AnchorsProcessingInfo {
956+
from_mc_info_opt = Some(AnchorsProcessingInfo {
956957
processed_to_anchor_id: mc_processed_to_anchor_id,
957958
processed_to_msgs_offset: mc_processed_to_msgs_offset,
958959
last_imported_chain_time: mc_data.gen_chain_time,
@@ -965,18 +966,33 @@ impl CollatorStdImpl {
965966
}
966967

967968
// try get from prev data
968-
if info_opt.is_none() {
969-
info_opt = prev_processed_upto_externals
969+
let from_prev_info_opt =
970+
prev_processed_upto_externals
970971
.as_ref()
971972
.map(|upto| AnchorsProcessingInfo {
972973
processed_to_anchor_id: upto.processed_to.0,
973974
processed_to_msgs_offset: upto.processed_to.1,
974975
last_imported_chain_time: prev_gen_chain_time,
975976
last_imported_in_block_id: *prev_block_id,
976977
});
977-
}
978978

979-
info_opt
979+
// choose the higher one
980+
match (from_mc_info_opt, from_prev_info_opt) {
981+
(Some(from_mc_info), Some(from_prev_info)) => {
982+
if from_mc_info.processed_to_anchor_id > from_prev_info.processed_to_anchor_id
983+
|| (from_mc_info.processed_to_anchor_id
984+
== from_prev_info.processed_to_anchor_id
985+
&& from_mc_info.processed_to_msgs_offset
986+
> from_prev_info.processed_to_msgs_offset)
987+
{
988+
Some(from_mc_info)
989+
} else {
990+
Some(from_prev_info)
991+
}
992+
}
993+
(from_mc_info_opt, None) => from_mc_info_opt,
994+
(None, from_prev_info_opt) => from_prev_info_opt,
995+
}
980996
}
981997

982998
/// 1. Get last imported anchor id from cache

collator/src/collator/tests/collator_tests.rs

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ fn test_get_anchors_processing_info() {
331331

332332
// ======
333333
// collated shard block 0:17, then collated master block 1:967
334-
// master block processed all extrenals, so it processed the same anchors
334+
// master block processed less externals because of large queue
335335
let prev_block_id = BlockId {
336336
shard: shard_id,
337337
seqno: 17,
@@ -347,8 +347,8 @@ fn test_get_anchors_processing_info() {
347347
mc_data.block_id.seqno = 967;
348348
mc_data.gen_chain_time = 1732479499855;
349349
mc_data.processed_upto.externals = Some(ExternalsProcessedUpto {
350-
processed_to: (1764, 23429),
351-
read_to: (1764, 23429),
350+
processed_to: (1752, 12000),
351+
read_to: (1752, 12000),
352352
});
353353
let (_, shard_desc) = mc_data.shards.get_mut(0).unwrap();
354354
shard_desc.seqno = 17;
@@ -387,8 +387,53 @@ fn test_get_anchors_processing_info() {
387387
assert_eq!(anchors_proc_info.last_imported_in_block_id, prev_block_id);
388388

389389
//======
390-
// collated master block 1:1005, it used shard block 0:17
391-
// so master processed anchors ahead of shard
390+
// collated master block 1:968, it used the same shard block 0:17
391+
// master still processed less externals then shard
392+
mc_data.block_id.seqno = 968;
393+
mc_data.gen_chain_time = 1732479502300;
394+
mc_data.processed_upto.externals = Some(ExternalsProcessedUpto {
395+
processed_to: (1756, 7000),
396+
read_to: (1756, 7000),
397+
});
398+
let (_, shard_desc) = mc_data.shards.get_mut(0).unwrap();
399+
shard_desc.seqno = 17;
400+
shard_desc.top_sc_block_updated = false;
401+
402+
//------
403+
// will get anchors processing info from prev shard state
404+
// because it is still ahead of master
405+
let anchors_proc_info_opt = CollatorStdImpl::get_anchors_processing_info(
406+
&shard_id,
407+
&mc_data,
408+
&prev_block_id,
409+
prev_gen_chain_time,
410+
prev_processed_upto_externals.as_ref(),
411+
);
412+
assert!(anchors_proc_info_opt.is_some());
413+
let anchors_proc_info = anchors_proc_info_opt.unwrap();
414+
assert_eq!(
415+
anchors_proc_info.processed_to_anchor_id,
416+
prev_processed_upto_externals
417+
.as_ref()
418+
.map(|upto| upto.processed_to.0)
419+
.unwrap_or_default(),
420+
);
421+
assert_eq!(
422+
anchors_proc_info.processed_to_msgs_offset,
423+
prev_processed_upto_externals
424+
.as_ref()
425+
.map(|upto| upto.processed_to.1)
426+
.unwrap_or_default(),
427+
);
428+
assert_eq!(
429+
anchors_proc_info.last_imported_chain_time,
430+
prev_gen_chain_time,
431+
);
432+
assert_eq!(anchors_proc_info.last_imported_in_block_id, prev_block_id);
433+
434+
//======
435+
// collated master block 1:1005, it used the same shard block 0:17
436+
// but master processed anchors ahead of shard
392437
mc_data.block_id.seqno = 1005;
393438
mc_data.gen_chain_time = 1732479530330;
394439
mc_data.processed_upto.externals = Some(ExternalsProcessedUpto {

0 commit comments

Comments
 (0)