@@ -763,10 +763,10 @@ impl Blockstore {
763
763
fn get_recovery_data_shreds < ' a > (
764
764
& ' a self ,
765
765
index : & ' a Index ,
766
- slot : Slot ,
767
766
erasure_meta : & ' a ErasureMeta ,
768
767
prev_inserted_shreds : & ' a HashMap < ShredId , Shred > ,
769
768
) -> impl Iterator < Item = Shred > + ' a {
769
+ let slot = index. slot ;
770
770
erasure_meta. data_shreds_indices ( ) . filter_map ( move |i| {
771
771
let key = ShredId :: new ( slot, u32:: try_from ( i) . unwrap ( ) , ShredType :: Data ) ;
772
772
if let Some ( shred) = prev_inserted_shreds. get ( & key) {
@@ -792,10 +792,10 @@ impl Blockstore {
792
792
fn get_recovery_coding_shreds < ' a > (
793
793
& ' a self ,
794
794
index : & ' a Index ,
795
- slot : Slot ,
796
795
erasure_meta : & ' a ErasureMeta ,
797
796
prev_inserted_shreds : & ' a HashMap < ShredId , Shred > ,
798
797
) -> impl Iterator < Item = Shred > + ' a {
798
+ let slot = index. slot ;
799
799
erasure_meta. coding_shreds_indices ( ) . filter_map ( move |i| {
800
800
let key = ShredId :: new ( slot, u32:: try_from ( i) . unwrap ( ) , ShredType :: Code ) ;
801
801
if let Some ( shred) = prev_inserted_shreds. get ( & key) {
@@ -823,19 +823,12 @@ impl Blockstore {
823
823
index : & Index ,
824
824
erasure_meta : & ErasureMeta ,
825
825
prev_inserted_shreds : & HashMap < ShredId , Shred > ,
826
- leader_schedule_cache : & LeaderScheduleCache ,
827
826
reed_solomon_cache : & ReedSolomonCache ,
828
827
) -> std:: result:: Result < Vec < Shred > , shred:: Error > {
829
828
// Find shreds for this erasure set and try recovery
830
- let slot = index. slot ;
831
- let available_shreds: Vec < _ > = self
832
- . get_recovery_data_shreds ( index, slot, erasure_meta, prev_inserted_shreds)
833
- . chain ( self . get_recovery_coding_shreds ( index, slot, erasure_meta, prev_inserted_shreds) )
834
- . collect ( ) ;
835
- let get_slot_leader = |slot : Slot | -> Option < Pubkey > {
836
- leader_schedule_cache. slot_leader_at ( slot, /*bank:*/ None )
837
- } ;
838
- shred:: recover ( available_shreds, reed_solomon_cache, get_slot_leader)
829
+ let data = self . get_recovery_data_shreds ( index, erasure_meta, prev_inserted_shreds) ;
830
+ let code = self . get_recovery_coding_shreds ( index, erasure_meta, prev_inserted_shreds) ;
831
+ shred:: recover ( data. chain ( code) , reed_solomon_cache)
839
832
}
840
833
841
834
/// Collects and reports [`BlockstoreRocksDbColumnFamilyMetrics`] for the
@@ -942,7 +935,6 @@ impl Blockstore {
942
935
erasure_metas : & ' a BTreeMap < ErasureSetId , WorkingEntry < ErasureMeta > > ,
943
936
index_working_set : & ' a HashMap < u64 , IndexMetaWorkingSetEntry > ,
944
937
prev_inserted_shreds : & ' a HashMap < ShredId , Shred > ,
945
- leader_schedule_cache : & ' a LeaderScheduleCache ,
946
938
reed_solomon_cache : & ' a ReedSolomonCache ,
947
939
) -> impl Iterator < Item = Vec < Shred > > + ' a {
948
940
// Recovery rules:
@@ -964,7 +956,6 @@ impl Blockstore {
964
956
index,
965
957
erasure_meta,
966
958
prev_inserted_shreds,
967
- leader_schedule_cache,
968
959
reed_solomon_cache,
969
960
)
970
961
} ) ?
@@ -987,49 +978,46 @@ impl Blockstore {
987
978
metrics : & mut BlockstoreInsertionMetrics ,
988
979
) {
989
980
let mut start = Measure :: start ( "Shred recovery" ) ;
990
- if let Some ( leader_schedule_cache) = leader_schedule {
991
- let mut recovered_shreds = Vec :: new ( ) ;
992
- let recovered_data_shreds: Vec < _ > = self
993
- . try_shred_recovery (
994
- & shred_insertion_tracker. erasure_metas ,
995
- & shred_insertion_tracker. index_working_set ,
996
- & shred_insertion_tracker. just_inserted_shreds ,
997
- leader_schedule_cache,
998
- reed_solomon_cache,
999
- )
1000
- . map ( |mut shreds| {
1001
- // All shreds should be retransmitted, but because there
1002
- // are no more missing data shreds in the erasure batch,
1003
- // coding shreds are not stored in blockstore.
1004
- recovered_shreds
1005
- . extend ( shred:: drain_coding_shreds ( & mut shreds) . map ( Shred :: into_payload) ) ;
1006
- recovered_shreds. extend ( shreds. iter ( ) . map ( Shred :: payload) . cloned ( ) ) ;
1007
- shreds
1008
- } )
1009
- . collect ( ) ;
1010
- if !recovered_shreds. is_empty ( ) {
1011
- let _ = retransmit_sender. send ( recovered_shreds) ;
1012
- }
1013
- for shred in recovered_data_shreds. into_iter ( ) . flatten ( ) {
1014
- metrics. num_recovered += 1 ;
1015
- * match self . check_insert_data_shred (
1016
- shred,
1017
- shred_insertion_tracker,
1018
- is_trusted,
1019
- leader_schedule,
1020
- ShredSource :: Recovered ,
1021
- ) {
1022
- Err ( InsertDataShredError :: Exists ) => & mut metrics. num_recovered_exists ,
1023
- Err ( InsertDataShredError :: InvalidShred ) => {
1024
- & mut metrics. num_recovered_failed_invalid
1025
- }
1026
- Err ( InsertDataShredError :: BlockstoreError ( err) ) => {
1027
- error ! ( "blockstore error: {err}" ) ;
1028
- & mut metrics. num_recovered_blockstore_error
1029
- }
1030
- Ok ( ( ) ) => & mut metrics. num_recovered_inserted ,
1031
- } += 1 ;
1032
- }
981
+ let mut recovered_shreds = Vec :: new ( ) ;
982
+ let recovered_data_shreds: Vec < _ > = self
983
+ . try_shred_recovery (
984
+ & shred_insertion_tracker. erasure_metas ,
985
+ & shred_insertion_tracker. index_working_set ,
986
+ & shred_insertion_tracker. just_inserted_shreds ,
987
+ reed_solomon_cache,
988
+ )
989
+ . map ( |mut shreds| {
990
+ // All shreds should be retransmitted, but because there are no
991
+ // more missing data shreds in the erasure batch, coding shreds
992
+ // are not stored in blockstore.
993
+ recovered_shreds
994
+ . extend ( shred:: drain_coding_shreds ( & mut shreds) . map ( Shred :: into_payload) ) ;
995
+ recovered_shreds. extend ( shreds. iter ( ) . map ( Shred :: payload) . cloned ( ) ) ;
996
+ shreds
997
+ } )
998
+ . collect ( ) ;
999
+ if !recovered_shreds. is_empty ( ) {
1000
+ let _ = retransmit_sender. send ( recovered_shreds) ;
1001
+ }
1002
+ for shred in recovered_data_shreds. into_iter ( ) . flatten ( ) {
1003
+ metrics. num_recovered += 1 ;
1004
+ * match self . check_insert_data_shred (
1005
+ shred,
1006
+ shred_insertion_tracker,
1007
+ is_trusted,
1008
+ leader_schedule,
1009
+ ShredSource :: Recovered ,
1010
+ ) {
1011
+ Err ( InsertDataShredError :: Exists ) => & mut metrics. num_recovered_exists ,
1012
+ Err ( InsertDataShredError :: InvalidShred ) => {
1013
+ & mut metrics. num_recovered_failed_invalid
1014
+ }
1015
+ Err ( InsertDataShredError :: BlockstoreError ( err) ) => {
1016
+ error ! ( "blockstore error: {err}" ) ;
1017
+ & mut metrics. num_recovered_blockstore_error
1018
+ }
1019
+ Ok ( ( ) ) => & mut metrics. num_recovered_inserted ,
1020
+ } += 1 ;
1033
1021
}
1034
1022
start. stop ( ) ;
1035
1023
metrics. shred_recovery_elapsed_us += start. as_us ( ) ;
0 commit comments