@@ -6,9 +6,12 @@ use crate::version::default_client_version;
66use clap:: {
77 builder:: { PossibleValue , TypedValueParser } ,
88 error:: ErrorKind ,
9- Arg , Args , Command , Error ,
9+ value_parser, Arg , Args , Command , Error ,
10+ } ;
11+ use reth_db:: {
12+ mdbx:: { MaxReadTransactionDuration , SyncMode } ,
13+ ClientVersion ,
1014} ;
11- use reth_db:: { mdbx:: MaxReadTransactionDuration , ClientVersion } ;
1215use reth_storage_errors:: db:: LogLevel ;
1316
1417/// Parameters for database configuration
@@ -34,6 +37,12 @@ pub struct DatabaseArgs {
3437 /// Maximum number of readers allowed to access the database concurrently.
3538 #[ arg( long = "db.max-readers" ) ]
3639 pub max_readers : Option < u64 > ,
40+ /// Controls how aggressively the database synchronizes data to disk.
41+ #[ arg(
42+ long = "db.sync-mode" ,
43+ value_parser = value_parser!( SyncMode ) ,
44+ ) ]
45+ pub sync_mode : Option < SyncMode > ,
3746}
3847
3948impl DatabaseArgs {
@@ -61,6 +70,7 @@ impl DatabaseArgs {
6170 . with_geometry_max_size ( self . max_size )
6271 . with_growth_step ( self . growth_step )
6372 . with_max_readers ( self . max_readers )
73+ . with_sync_mode ( self . sync_mode )
6474 }
6575}
6676
@@ -340,4 +350,36 @@ mod tests {
340350 let cmd = CommandParser :: < DatabaseArgs > :: try_parse_from ( [ "reth" ] ) . unwrap ( ) ;
341351 assert_eq ! ( cmd. args. log_level, None ) ;
342352 }
353+
354+ #[ test]
355+ fn test_command_parser_with_valid_default_sync_mode ( ) {
356+ let cmd = CommandParser :: < DatabaseArgs > :: try_parse_from ( [ "reth" ] ) . unwrap ( ) ;
357+ assert ! ( cmd. args. sync_mode. is_none( ) ) ;
358+ }
359+
360+ #[ test]
361+ fn test_command_parser_with_valid_sync_mode_durable ( ) {
362+ let cmd =
363+ CommandParser :: < DatabaseArgs > :: try_parse_from ( [ "reth" , "--db.sync-mode" , "durable" ] )
364+ . unwrap ( ) ;
365+ assert ! ( matches!( cmd. args. sync_mode, Some ( SyncMode :: Durable ) ) ) ;
366+ }
367+
368+ #[ test]
369+ fn test_command_parser_with_valid_sync_mode_safe_no_sync ( ) {
370+ let cmd = CommandParser :: < DatabaseArgs > :: try_parse_from ( [
371+ "reth" ,
372+ "--db.sync-mode" ,
373+ "safe-no-sync" ,
374+ ] )
375+ . unwrap ( ) ;
376+ assert ! ( matches!( cmd. args. sync_mode, Some ( SyncMode :: SafeNoSync ) ) ) ;
377+ }
378+
379+ #[ test]
380+ fn test_command_parser_with_invalid_sync_mode ( ) {
381+ let result =
382+ CommandParser :: < DatabaseArgs > :: try_parse_from ( [ "reth" , "--db.sync-mode" , "ultra-fast" ] ) ;
383+ assert ! ( result. is_err( ) ) ;
384+ }
343385}
0 commit comments