Skip to content

Commit 5591db7

Browse files
authored
Wen_restart: check block full using blockstore (pyth-network#250)
* Switch to blockstore.is_full() check because replay thread isn't active. * Use make_chaining_slot_entries and add first_parent to the method. Small style fixes. * Switch to blockstore.is_full() check because replay thread isn't active.
1 parent 2537e3e commit 5591db7

File tree

4 files changed

+50
-71
lines changed

4 files changed

+50
-71
lines changed

core/src/repair/repair_service.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,7 +1326,7 @@ mod test {
13261326
let slots: Vec<u64> = vec![1, 3, 5, 7, 8];
13271327
let num_entries_per_slot = max_ticks_per_n_shreds(1, None) + 1;
13281328

1329-
let shreds = make_chaining_slot_entries(&slots, num_entries_per_slot);
1329+
let shreds = make_chaining_slot_entries(&slots, num_entries_per_slot, 0);
13301330
for (mut slot_shreds, _) in shreds.into_iter() {
13311331
slot_shreds.remove(0);
13321332
blockstore.insert_shreds(slot_shreds, None, false).unwrap();
@@ -1621,7 +1621,7 @@ mod test {
16211621
let slots: Vec<u64> = vec![2, 3, 5, 7];
16221622
let num_entries_per_slot = max_ticks_per_n_shreds(3, None) + 1;
16231623

1624-
let shreds = make_chaining_slot_entries(&slots, num_entries_per_slot);
1624+
let shreds = make_chaining_slot_entries(&slots, num_entries_per_slot, 0);
16251625
for (i, (mut slot_shreds, _)) in shreds.into_iter().enumerate() {
16261626
slot_shreds.remove(i);
16271627
blockstore.insert_shreds(slot_shreds, None, false).unwrap();

core/src/repair/repair_weight.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2377,7 +2377,7 @@ mod test {
23772377
assert_eq!(repairs[2].slot(), 5);
23782378

23792379
// Simulate repair on 6 and 5
2380-
for (shreds, _) in make_chaining_slot_entries(&[5, 6], 100) {
2380+
for (shreds, _) in make_chaining_slot_entries(&[5, 6], 100, 0) {
23812381
blockstore.insert_shreds(shreds, None, true).unwrap();
23822382
}
23832383

ledger/src/blockstore.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4658,12 +4658,13 @@ pub fn make_many_slot_shreds(
46584658
pub fn make_chaining_slot_entries(
46594659
chain: &[u64],
46604660
entries_per_slot: u64,
4661+
first_parent: u64,
46614662
) -> Vec<(Vec<Shred>, Vec<Entry>)> {
46624663
let mut slots_shreds_and_entries = vec![];
46634664
for (i, slot) in chain.iter().enumerate() {
46644665
let parent_slot = {
46654666
if *slot == 0 || i == 0 {
4666-
0
4667+
first_parent
46674668
} else {
46684669
chain[i - 1]
46694670
}
@@ -5609,7 +5610,7 @@ pub mod tests {
56095610

56105611
let entries_per_slot = 10;
56115612
let slots = [2, 5, 10];
5612-
let mut all_shreds = make_chaining_slot_entries(&slots[..], entries_per_slot);
5613+
let mut all_shreds = make_chaining_slot_entries(&slots[..], entries_per_slot, 0);
56135614

56145615
// Get the shreds for slot 10, chaining to slot 5
56155616
let (mut orphan_child, _) = all_shreds.remove(2);
@@ -5654,7 +5655,7 @@ pub mod tests {
56545655

56555656
let entries_per_slot = 10;
56565657
let mut slots = vec![2, 5, 10];
5657-
let mut all_shreds = make_chaining_slot_entries(&slots[..], entries_per_slot);
5658+
let mut all_shreds = make_chaining_slot_entries(&slots[..], entries_per_slot, 0);
56585659
let disconnected_slot = 4;
56595660

56605661
let (shreds0, _) = all_shreds.remove(0);
@@ -7428,7 +7429,7 @@ pub mod tests {
74287429
let blockstore = Blockstore::open(ledger_path.path()).unwrap();
74297430
let shreds_per_slot = 10;
74307431
let slots = vec![2, 4, 8, 12];
7431-
let all_shreds = make_chaining_slot_entries(&slots, shreds_per_slot);
7432+
let all_shreds = make_chaining_slot_entries(&slots, shreds_per_slot, 0);
74327433
let slot_8_shreds = all_shreds[2].0.clone();
74337434
for (slot_shreds, _) in all_shreds {
74347435
blockstore.insert_shreds(slot_shreds, None, false).unwrap();
@@ -9963,7 +9964,7 @@ pub mod tests {
99639964
let slots = vec![2, unconfirmed_slot, unconfirmed_child_slot];
99649965

99659966
// Insert into slot 9, mark it as dead
9966-
let shreds: Vec<_> = make_chaining_slot_entries(&slots, 1)
9967+
let shreds: Vec<_> = make_chaining_slot_entries(&slots, 1, 0)
99679968
.into_iter()
99689969
.flat_map(|x| x.0)
99699970
.collect();
@@ -10005,7 +10006,7 @@ pub mod tests {
1000510006
let unconfirmed_slot = 8;
1000610007
let slots = vec![confirmed_slot, unconfirmed_slot];
1000710008

10008-
let shreds: Vec<_> = make_chaining_slot_entries(&slots, 1)
10009+
let shreds: Vec<_> = make_chaining_slot_entries(&slots, 1, 0)
1000910010
.into_iter()
1001010011
.flat_map(|x| x.0)
1001110012
.collect();

wen-restart/src/wen_restart.rs

Lines changed: 40 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ pub(crate) fn aggregate_restart_last_voted_fork_slots(
104104
cluster_info: Arc<ClusterInfo>,
105105
last_voted_fork_slots: &Vec<Slot>,
106106
bank_forks: Arc<RwLock<BankForks>>,
107+
blockstore: Arc<Blockstore>,
107108
wen_restart_repair_slots: Arc<RwLock<Vec<Slot>>>,
108109
exit: Arc<AtomicBool>,
109110
progress: &mut WenRestartProgress,
@@ -160,20 +161,18 @@ pub(crate) fn aggregate_restart_last_voted_fork_slots(
160161
let active_percent = last_voted_fork_slots_aggregate.active_percent();
161162
let mut filtered_slots: Vec<Slot>;
162163
{
163-
let my_bank_forks = bank_forks.read().unwrap();
164164
filtered_slots = last_voted_fork_slots_aggregate
165165
.slots_to_repair_iter()
166166
.filter(|slot| {
167167
if *slot <= &root_slot || is_full_slots.contains(*slot) {
168168
return false;
169169
}
170-
let is_full = my_bank_forks
171-
.get(**slot)
172-
.map_or(false, |bank| bank.is_frozen());
173-
if is_full {
170+
if blockstore.is_full(**slot) {
174171
is_full_slots.insert(**slot);
172+
false
173+
} else {
174+
true
175175
}
176-
!is_full
177176
})
178177
.cloned()
179178
.collect();
@@ -234,6 +233,7 @@ pub fn wait_for_wen_restart(
234233
cluster_info.clone(),
235234
last_voted_fork_slots,
236235
bank_forks.clone(),
236+
blockstore.clone(),
237237
wen_restart_repair_slots.clone().unwrap(),
238238
exit.clone(),
239239
&mut progress,
@@ -382,7 +382,6 @@ mod tests {
382382
use {
383383
crate::wen_restart::*,
384384
assert_matches::assert_matches,
385-
solana_entry::entry,
386385
solana_gossip::{
387386
cluster_info::ClusterInfo,
388387
contact_info::ContactInfo,
@@ -391,7 +390,10 @@ mod tests {
391390
legacy_contact_info::LegacyContactInfo,
392391
restart_crds_values::RestartLastVotedForkSlots,
393392
},
394-
solana_ledger::{blockstore, get_tmp_ledger_path_auto_delete},
393+
solana_ledger::{
394+
blockstore::{make_chaining_slot_entries, Blockstore},
395+
get_tmp_ledger_path_auto_delete,
396+
},
395397
solana_program::{
396398
hash::Hash,
397399
vote::state::{Vote, VoteStateUpdate},
@@ -403,7 +405,6 @@ mod tests {
403405
},
404406
},
405407
solana_sdk::{
406-
pubkey::Pubkey,
407408
signature::{Keypair, Signer},
408409
timing::timestamp,
409410
},
@@ -454,6 +455,16 @@ mod tests {
454455
pub wen_restart_proto_path: PathBuf,
455456
}
456457

458+
fn insert_slots_into_blockstore(
459+
blockstore: Arc<Blockstore>,
460+
first_parent: Slot,
461+
slots_to_insert: &[Slot],
462+
) {
463+
for (shreds, _) in make_chaining_slot_entries(slots_to_insert, 2, first_parent) {
464+
blockstore.insert_shreds(shreds, None, false).unwrap();
465+
}
466+
}
467+
457468
fn wen_restart_test_init(ledger_path: &TempDir) -> WenRestartTestInitResult {
458469
let validator_voting_keypairs: Vec<_> =
459470
(0..10).map(|_| ValidatorVoteKeypairs::new_rand()).collect();
@@ -468,7 +479,7 @@ mod tests {
468479
node_keypair.clone(),
469480
SocketAddrSpace::Unspecified,
470481
));
471-
let blockstore = Arc::new(blockstore::Blockstore::open(ledger_path.path()).unwrap());
482+
let blockstore = Arc::new(Blockstore::open(ledger_path.path()).unwrap());
472483
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config_with_vote_accounts(
473484
10_000,
474485
&validator_voting_keypairs,
@@ -479,42 +490,16 @@ mod tests {
479490
.try_into()
480491
.unwrap();
481492
let mut last_voted_fork_slots = Vec::new();
493+
last_voted_fork_slots.extend([1, last_parent]);
482494
for i in 0..EXPECTED_SLOTS {
483-
let entries = entry::create_ticks(1, 0, Hash::default());
484-
let parent_slot = if i > 0 {
485-
(RestartLastVotedForkSlots::MAX_SLOTS.saturating_add(i))
486-
.try_into()
487-
.unwrap()
488-
} else {
489-
last_parent
490-
};
491-
let slot = (RestartLastVotedForkSlots::MAX_SLOTS
492-
.saturating_add(i)
493-
.saturating_add(1)) as Slot;
494-
let shreds = blockstore::entries_to_test_shreds(
495-
&entries,
496-
slot,
497-
parent_slot,
498-
false,
499-
0,
500-
true, // merkle_variant
495+
last_voted_fork_slots.push(
496+
(RestartLastVotedForkSlots::MAX_SLOTS
497+
.saturating_add(i)
498+
.saturating_add(1)) as Slot,
501499
);
502-
blockstore.insert_shreds(shreds, None, false).unwrap();
503-
last_voted_fork_slots.push(slot);
504500
}
505-
// link directly to slot 1 whose distance to last_vote > RestartLastVotedForkSlots::MAX_SLOTS so it will not be included.
506-
let entries = entry::create_ticks(1, 0, Hash::default());
507-
let shreds = blockstore::entries_to_test_shreds(
508-
&entries,
509-
last_parent,
510-
1,
511-
false,
512-
0,
513-
true, // merkle_variant
514-
);
515-
last_voted_fork_slots.extend([last_parent, 1]);
516-
blockstore.insert_shreds(shreds, None, false).unwrap();
517-
last_voted_fork_slots.sort();
501+
insert_slots_into_blockstore(blockstore.clone(), 0, &last_voted_fork_slots);
502+
last_voted_fork_slots.insert(0, 0);
518503
last_voted_fork_slots.reverse();
519504
let mut wen_restart_proto_path = ledger_path.path().to_path_buf();
520505
wen_restart_proto_path.push("wen_restart_status.proto");
@@ -599,23 +584,6 @@ mod tests {
599584
let _ = remove_file(&test_state.wen_restart_proto_path);
600585
}
601586

602-
fn insert_and_freeze_slots(
603-
bank_forks: Arc<RwLock<BankForks>>,
604-
expected_slots_to_repair: Vec<Slot>,
605-
) {
606-
let mut parent_bank = bank_forks.read().unwrap().root_bank();
607-
for slot in expected_slots_to_repair {
608-
let mut bank_forks_rw = bank_forks.write().unwrap();
609-
bank_forks_rw.insert(Bank::new_from_parent(
610-
parent_bank.clone(),
611-
&Pubkey::default(),
612-
slot,
613-
));
614-
parent_bank = bank_forks_rw.get(slot).unwrap();
615-
parent_bank.freeze();
616-
}
617-
}
618-
619587
#[test]
620588
fn test_wen_restart_normal_flow() {
621589
let ledger_path = get_tmp_ledger_path_auto_delete!();
@@ -673,7 +641,11 @@ mod tests {
673641
}
674642

675643
// Simulating successful repair of missing blocks.
676-
insert_and_freeze_slots(test_state.bank_forks.clone(), expected_slots_to_repair);
644+
insert_slots_into_blockstore(
645+
test_state.blockstore.clone(),
646+
last_vote_slot,
647+
&expected_slots_to_repair,
648+
);
677649

678650
let _ = wen_restart_thread_handle.join();
679651
let progress = read_wen_restart_records(&test_state.wen_restart_proto_path).unwrap();
@@ -934,6 +906,7 @@ mod tests {
934906
let wen_restart_proto_path_clone = test_state.wen_restart_proto_path.clone();
935907
let cluster_info_clone = test_state.cluster_info.clone();
936908
let bank_forks_clone = test_state.bank_forks.clone();
909+
let blockstore_clone = test_state.blockstore.clone();
937910
let exit = Arc::new(AtomicBool::new(false));
938911
let exit_clone = exit.clone();
939912
let mut progress_clone = progress.clone();
@@ -947,6 +920,7 @@ mod tests {
947920
cluster_info_clone,
948921
&last_voted_fork_slots,
949922
bank_forks_clone,
923+
blockstore_clone,
950924
Arc::new(RwLock::new(Vec::new())),
951925
exit_clone,
952926
&mut progress_clone,
@@ -995,7 +969,11 @@ mod tests {
995969
}
996970

997971
// Simulating successful repair of missing blocks.
998-
insert_and_freeze_slots(test_state.bank_forks.clone(), expected_slots_to_repair);
972+
insert_slots_into_blockstore(
973+
test_state.blockstore.clone(),
974+
last_vote_slot,
975+
&expected_slots_to_repair,
976+
);
999977

1000978
let last_voted_fork_slots = test_state.last_voted_fork_slots.clone();
1001979
wen_restart_test_succeed_after_failure(

0 commit comments

Comments
 (0)