@@ -24,7 +24,7 @@ use slot_clock::{SlotClock, TestingSlotClock};
24
24
use std:: marker:: PhantomData ;
25
25
use std:: sync:: Arc ;
26
26
use std:: time:: Duration ;
27
- use store:: { HotColdDB , ItemStore } ;
27
+ use store:: { Error as StoreError , HotColdDB , ItemStore } ;
28
28
use task_executor:: ShutdownReason ;
29
29
use types:: {
30
30
BeaconBlock , BeaconState , ChainSpec , EthSpec , Graffiti , Hash256 , PublicKeyBytes , Signature ,
@@ -237,11 +237,11 @@ where
237
237
238
238
let genesis_block = store
239
239
. get_block ( & chain. genesis_block_root )
240
- . map_err ( |e| format ! ( "DB error when reading genesis block: {:?} ", e) ) ?
240
+ . map_err ( |e| descriptive_db_error ( " genesis block", & e) ) ?
241
241
. ok_or ( "Genesis block not found in store" ) ?;
242
242
let genesis_state = store
243
243
. get_state ( & genesis_block. state_root ( ) , Some ( genesis_block. slot ( ) ) )
244
- . map_err ( |e| format ! ( "DB error when reading genesis state: {:?} ", e) ) ?
244
+ . map_err ( |e| descriptive_db_error ( " genesis state", & e) ) ?
245
245
. ok_or ( "Genesis block not found in store" ) ?;
246
246
247
247
self . genesis_time = Some ( genesis_state. genesis_time ( ) ) ;
@@ -436,12 +436,12 @@ where
436
436
437
437
let head_block = store
438
438
. get_block ( & head_block_root)
439
- . map_err ( |e| format ! ( "DB error when reading head block: {:?} ", e) ) ?
439
+ . map_err ( |e| descriptive_db_error ( " head block", & e) ) ?
440
440
. ok_or ( "Head block not found in store" ) ?;
441
441
let head_state_root = head_block. state_root ( ) ;
442
442
let head_state = store
443
443
. get_state ( & head_state_root, Some ( head_block. slot ( ) ) )
444
- . map_err ( |e| format ! ( "DB error when reading head state: {:?} ", e) ) ?
444
+ . map_err ( |e| descriptive_db_error ( " head state", & e) ) ?
445
445
. ok_or ( "Head state not found in store" ) ?;
446
446
447
447
let mut canonical_head = BeaconSnapshot {
@@ -653,6 +653,21 @@ fn genesis_block<T: EthSpec>(
653
653
) )
654
654
}
655
655
656
+ // Helper function to return more useful errors when reading from the database.
657
+ fn descriptive_db_error ( item : & str , error : & StoreError ) -> String {
658
+ let additional_info = if let StoreError :: SszDecodeError ( _) = error {
659
+ "Ensure the data directory is not initialized for a different network. The \
660
+ --purge-db flag can be used to permanently delete the existing data directory."
661
+ } else {
662
+ "Database corruption may be present. If the issue persists, use \
663
+ --purge-db to permanently delete the existing data directory."
664
+ } ;
665
+ format ! (
666
+ "DB error when reading {}: {:?}. {}" ,
667
+ item, error, additional_info
668
+ )
669
+ }
670
+
656
671
#[ cfg( not( debug_assertions) ) ]
657
672
#[ cfg( test) ]
658
673
mod test {
0 commit comments