46
46
borrow:: Cow ,
47
47
cell:: RefCell ,
48
48
cmp,
49
- collections:: { BTreeMap , HashMap , HashSet } ,
49
+ collections:: { hash_map :: Entry as HashMapEntry , BTreeMap , HashMap , HashSet } ,
50
50
convert:: TryInto ,
51
51
fs,
52
52
io:: { Error as IoError , ErrorKind } ,
@@ -216,11 +216,19 @@ pub struct BlockstoreInsertionMetrics {
216
216
pub num_inserted : u64 ,
217
217
pub num_repair : u64 ,
218
218
pub num_recovered : usize ,
219
+ num_recovered_blockstore_error : usize ,
219
220
pub num_recovered_inserted : usize ,
220
221
pub num_recovered_failed_sig : usize ,
221
222
pub num_recovered_failed_invalid : usize ,
222
223
pub num_recovered_exists : usize ,
223
224
pub index_meta_time : u64 ,
225
+ num_data_shreds_exists : usize ,
226
+ num_data_shreds_invalid : usize ,
227
+ num_data_shreds_blockstore_error : usize ,
228
+ num_coding_shreds_exists : usize ,
229
+ num_coding_shreds_invalid : usize ,
230
+ num_coding_shreds_invalid_erasure_config : usize ,
231
+ num_coding_shreds_inserted : usize ,
224
232
}
225
233
226
234
impl SlotMetaWorkingSetEntry {
@@ -280,6 +288,38 @@ impl BlockstoreInsertionMetrics {
280
288
self . num_recovered_exists as i64 ,
281
289
i64
282
290
) ,
291
+ (
292
+ "num_recovered_blockstore_error" ,
293
+ self . num_recovered_blockstore_error,
294
+ i64
295
+ ) ,
296
+ ( "num_data_shreds_exists" , self . num_data_shreds_exists, i64 ) ,
297
+ ( "num_data_shreds_invalid" , self . num_data_shreds_invalid, i64 ) ,
298
+ (
299
+ "num_data_shreds_blockstore_error" ,
300
+ self . num_data_shreds_blockstore_error,
301
+ i64
302
+ ) ,
303
+ (
304
+ "num_coding_shreds_exists" ,
305
+ self . num_coding_shreds_exists,
306
+ i64
307
+ ) ,
308
+ (
309
+ "num_coding_shreds_invalid" ,
310
+ self . num_coding_shreds_invalid,
311
+ i64
312
+ ) ,
313
+ (
314
+ "num_coding_shreds_invalid_erasure_config" ,
315
+ self . num_coding_shreds_invalid_erasure_config,
316
+ i64
317
+ ) ,
318
+ (
319
+ "num_coding_shreds_inserted" ,
320
+ self . num_coding_shreds_inserted,
321
+ i64
322
+ ) ,
283
323
) ;
284
324
}
285
325
}
@@ -841,7 +881,7 @@ impl Blockstore {
841
881
} else {
842
882
ShredSource :: Turbine
843
883
} ;
844
- if let Ok ( completed_data_sets ) = self . check_insert_data_shred (
884
+ match self . check_insert_data_shred (
845
885
shred,
846
886
& mut erasure_metas,
847
887
& mut index_working_set,
@@ -854,10 +894,17 @@ impl Blockstore {
854
894
leader_schedule,
855
895
shred_source,
856
896
) {
857
- newly_completed_data_sets. extend ( completed_data_sets) ;
858
- inserted_indices. push ( i) ;
859
- metrics. num_inserted += 1 ;
860
- }
897
+ Err ( InsertDataShredError :: Exists ) => metrics. num_data_shreds_exists += 1 ,
898
+ Err ( InsertDataShredError :: InvalidShred ) => metrics. num_data_shreds_invalid += 1 ,
899
+ Err ( InsertDataShredError :: BlockstoreError ( _) ) => {
900
+ metrics. num_data_shreds_blockstore_error += 1 ;
901
+ }
902
+ Ok ( completed_data_sets) => {
903
+ newly_completed_data_sets. extend ( completed_data_sets) ;
904
+ inserted_indices. push ( i) ;
905
+ metrics. num_inserted += 1 ;
906
+ }
907
+ } ;
861
908
} else if shred. is_code ( ) {
862
909
self . check_cache_coding_shred (
863
910
shred,
@@ -868,6 +915,7 @@ impl Blockstore {
868
915
handle_duplicate,
869
916
is_trusted,
870
917
is_repaired,
918
+ metrics,
871
919
) ;
872
920
} else {
873
921
panic ! ( "There should be no other case" ) ;
@@ -917,7 +965,10 @@ impl Blockstore {
917
965
metrics. num_recovered_failed_invalid += 1 ;
918
966
None
919
967
}
920
- Err ( InsertDataShredError :: BlockstoreError ( _) ) => None ,
968
+ Err ( InsertDataShredError :: BlockstoreError ( _) ) => {
969
+ metrics. num_recovered_blockstore_error += 1 ;
970
+ None
971
+ }
921
972
Ok ( completed_data_sets) => {
922
973
newly_completed_data_sets. extend ( completed_data_sets) ;
923
974
metrics. num_recovered_inserted += 1 ;
@@ -1062,6 +1113,7 @@ impl Blockstore {
1062
1113
|| shred1. coding_header . num_data_shreds != shred2. coding_header . num_data_shreds
1063
1114
}
1064
1115
1116
+ #[ allow( clippy:: too_many_arguments) ]
1065
1117
fn check_cache_coding_shred < F > (
1066
1118
& self ,
1067
1119
shred : Shred ,
@@ -1072,6 +1124,7 @@ impl Blockstore {
1072
1124
handle_duplicate : & F ,
1073
1125
is_trusted : bool ,
1074
1126
is_repaired : bool ,
1127
+ metrics : & mut BlockstoreInsertionMetrics ,
1075
1128
) -> bool
1076
1129
where
1077
1130
F : Fn ( Shred ) ,
@@ -1089,11 +1142,13 @@ impl Blockstore {
1089
1142
1090
1143
if !is_trusted {
1091
1144
if index_meta. coding ( ) . is_present ( shred_index) {
1145
+ metrics. num_coding_shreds_exists += 1 ;
1092
1146
handle_duplicate ( shred) ;
1093
1147
return false ;
1094
1148
}
1095
1149
1096
1150
if !Blockstore :: should_insert_coding_shred ( & shred, & self . last_root ) {
1151
+ metrics. num_coding_shreds_invalid += 1 ;
1097
1152
return false ;
1098
1153
}
1099
1154
}
@@ -1112,6 +1167,7 @@ impl Blockstore {
1112
1167
} ) ;
1113
1168
1114
1169
if erasure_config != erasure_meta. config {
1170
+ metrics. num_coding_shreds_invalid_erasure_config += 1 ;
1115
1171
let conflicting_shred = self . find_conflicting_coding_shred (
1116
1172
& shred,
1117
1173
slot,
@@ -1152,10 +1208,11 @@ impl Blockstore {
1152
1208
// committed
1153
1209
index_meta. coding_mut ( ) . set_present ( shred_index, true ) ;
1154
1210
1155
- just_received_coding_shreds
1156
- . entry ( ( slot, shred_index) )
1157
- . or_insert_with ( || shred) ;
1158
-
1211
+ if let HashMapEntry :: Vacant ( entry) = just_received_coding_shreds. entry ( ( slot, shred_index) )
1212
+ {
1213
+ metrics. num_coding_shreds_inserted += 1 ;
1214
+ entry. insert ( shred) ;
1215
+ }
1159
1216
true
1160
1217
}
1161
1218
@@ -5673,6 +5730,7 @@ pub mod tests {
5673
5730
} ,
5674
5731
false ,
5675
5732
false ,
5733
+ & mut BlockstoreInsertionMetrics :: default ( ) ,
5676
5734
) ) ;
5677
5735
5678
5736
// insert again fails on dupe
@@ -5689,6 +5747,7 @@ pub mod tests {
5689
5747
} ,
5690
5748
false ,
5691
5749
false ,
5750
+ & mut BlockstoreInsertionMetrics :: default ( ) ,
5692
5751
) ) ;
5693
5752
assert_eq ! ( counter. load( Ordering :: Relaxed ) , 1 ) ;
5694
5753
}
0 commit comments