@@ -77,7 +77,15 @@ pub fn inspect_cli_app<'a, 'b>() -> App<'a, 'b> {
77
77
Arg :: with_name ( "freezer" )
78
78
. long ( "freezer" )
79
79
. help ( "Inspect the freezer DB rather than the hot DB" )
80
- . takes_value ( false ) ,
80
+ . takes_value ( false )
81
+ . conflicts_with ( "blobs-db" ) ,
82
+ )
83
+ . arg (
84
+ Arg :: with_name ( "blobs-db" )
85
+ . long ( "blobs-db" )
86
+ . help ( "Inspect the blobs DB rather than the hot DB" )
87
+ . takes_value ( false )
88
+ . conflicts_with ( "freezer" ) ,
81
89
)
82
90
. arg (
83
91
Arg :: with_name ( "output-dir" )
@@ -88,6 +96,34 @@ pub fn inspect_cli_app<'a, 'b>() -> App<'a, 'b> {
88
96
)
89
97
}
90
98
99
+ pub fn compact_cli_app < ' a , ' b > ( ) -> App < ' a , ' b > {
100
+ App :: new ( "compact" )
101
+ . setting ( clap:: AppSettings :: ColoredHelp )
102
+ . about ( "Compact database manually" )
103
+ . arg (
104
+ Arg :: with_name ( "column" )
105
+ . long ( "column" )
106
+ . value_name ( "TAG" )
107
+ . help ( "3-byte column ID (see `DBColumn`)" )
108
+ . takes_value ( true )
109
+ . required ( true ) ,
110
+ )
111
+ . arg (
112
+ Arg :: with_name ( "freezer" )
113
+ . long ( "freezer" )
114
+ . help ( "Inspect the freezer DB rather than the hot DB" )
115
+ . takes_value ( false )
116
+ . conflicts_with ( "blobs-db" ) ,
117
+ )
118
+ . arg (
119
+ Arg :: with_name ( "blobs-db" )
120
+ . long ( "blobs-db" )
121
+ . help ( "Inspect the blobs DB rather than the hot DB" )
122
+ . takes_value ( false )
123
+ . conflicts_with ( "freezer" ) ,
124
+ )
125
+ }
126
+
91
127
pub fn prune_payloads_app < ' a , ' b > ( ) -> App < ' a , ' b > {
92
128
App :: new ( "prune-payloads" )
93
129
. alias ( "prune_payloads" )
@@ -162,6 +198,7 @@ pub fn cli_app<'a, 'b>() -> App<'a, 'b> {
162
198
. subcommand ( migrate_cli_app ( ) )
163
199
. subcommand ( version_cli_app ( ) )
164
200
. subcommand ( inspect_cli_app ( ) )
201
+ . subcommand ( compact_cli_app ( ) )
165
202
. subcommand ( prune_payloads_app ( ) )
166
203
. subcommand ( prune_blobs_app ( ) )
167
204
. subcommand ( prune_states_app ( ) )
@@ -251,6 +288,7 @@ pub struct InspectConfig {
251
288
skip : Option < usize > ,
252
289
limit : Option < usize > ,
253
290
freezer : bool ,
291
+ blobs_db : bool ,
254
292
/// Configures where the inspect output should be stored.
255
293
output_dir : PathBuf ,
256
294
}
@@ -261,6 +299,7 @@ fn parse_inspect_config(cli_args: &ArgMatches) -> Result<InspectConfig, String>
261
299
let skip = clap_utils:: parse_optional ( cli_args, "skip" ) ?;
262
300
let limit = clap_utils:: parse_optional ( cli_args, "limit" ) ?;
263
301
let freezer = cli_args. is_present ( "freezer" ) ;
302
+ let blobs_db = cli_args. is_present ( "blobs-db" ) ;
264
303
265
304
let output_dir: PathBuf =
266
305
clap_utils:: parse_optional ( cli_args, "output-dir" ) ?. unwrap_or_else ( PathBuf :: new) ;
@@ -270,39 +309,28 @@ fn parse_inspect_config(cli_args: &ArgMatches) -> Result<InspectConfig, String>
270
309
skip,
271
310
limit,
272
311
freezer,
312
+ blobs_db,
273
313
output_dir,
274
314
} )
275
315
}
276
316
277
317
pub fn inspect_db < E : EthSpec > (
278
318
inspect_config : InspectConfig ,
279
319
client_config : ClientConfig ,
280
- runtime_context : & RuntimeContext < E > ,
281
- log : Logger ,
282
320
) -> Result < ( ) , String > {
283
- let spec = runtime_context. eth2_config . spec . clone ( ) ;
284
321
let hot_path = client_config. get_db_path ( ) ;
285
322
let cold_path = client_config. get_freezer_db_path ( ) ;
286
323
let blobs_path = client_config. get_blobs_db_path ( ) ;
287
324
288
- let db = HotColdDB :: < E , LevelDB < E > , LevelDB < E > > :: open (
289
- & hot_path,
290
- & cold_path,
291
- & blobs_path,
292
- |_, _, _| Ok ( ( ) ) ,
293
- client_config. store ,
294
- spec,
295
- log,
296
- )
297
- . map_err ( |e| format ! ( "{:?}" , e) ) ?;
298
-
299
325
let mut total = 0 ;
300
326
let mut num_keys = 0 ;
301
327
302
328
let sub_db = if inspect_config. freezer {
303
- & db. cold_db
329
+ LevelDB :: < E > :: open ( & cold_path) . map_err ( |e| format ! ( "Unable to open freezer DB: {e:?}" ) ) ?
330
+ } else if inspect_config. blobs_db {
331
+ LevelDB :: < E > :: open ( & blobs_path) . map_err ( |e| format ! ( "Unable to open blobs DB: {e:?}" ) ) ?
304
332
} else {
305
- & db . hot_db
333
+ LevelDB :: < E > :: open ( & hot_path ) . map_err ( |e| format ! ( "Unable to open hot DB: {e:?}" ) ) ?
306
334
} ;
307
335
308
336
let skip = inspect_config. skip . unwrap_or ( 0 ) ;
@@ -385,6 +413,50 @@ pub fn inspect_db<E: EthSpec>(
385
413
Ok ( ( ) )
386
414
}
387
415
416
+ pub struct CompactConfig {
417
+ column : DBColumn ,
418
+ freezer : bool ,
419
+ blobs_db : bool ,
420
+ }
421
+
422
+ fn parse_compact_config ( cli_args : & ArgMatches ) -> Result < CompactConfig , String > {
423
+ let column = clap_utils:: parse_required ( cli_args, "column" ) ?;
424
+ let freezer = cli_args. is_present ( "freezer" ) ;
425
+ let blobs_db = cli_args. is_present ( "blobs-db" ) ;
426
+ Ok ( CompactConfig {
427
+ column,
428
+ freezer,
429
+ blobs_db,
430
+ } )
431
+ }
432
+
433
+ pub fn compact_db < E : EthSpec > (
434
+ compact_config : CompactConfig ,
435
+ client_config : ClientConfig ,
436
+ log : Logger ,
437
+ ) -> Result < ( ) , Error > {
438
+ let hot_path = client_config. get_db_path ( ) ;
439
+ let cold_path = client_config. get_freezer_db_path ( ) ;
440
+ let blobs_path = client_config. get_blobs_db_path ( ) ;
441
+ let column = compact_config. column ;
442
+
443
+ let ( sub_db, db_name) = if compact_config. freezer {
444
+ ( LevelDB :: < E > :: open ( & cold_path) ?, "freezer_db" )
445
+ } else if compact_config. blobs_db {
446
+ ( LevelDB :: < E > :: open ( & blobs_path) ?, "blobs_db" )
447
+ } else {
448
+ ( LevelDB :: < E > :: open ( & hot_path) ?, "hot_db" )
449
+ } ;
450
+ info ! (
451
+ log,
452
+ "Compacting database" ;
453
+ "db" => db_name,
454
+ "column" => ?column
455
+ ) ;
456
+ sub_db. compact_column ( column) ?;
457
+ Ok ( ( ) )
458
+ }
459
+
388
460
pub struct MigrateConfig {
389
461
to : SchemaVersion ,
390
462
}
@@ -538,7 +610,10 @@ pub fn prune_states<E: EthSpec>(
538
610
// Check that the user has confirmed they want to proceed.
539
611
if !prune_config. confirm {
540
612
match db. get_anchor_info ( ) {
541
- Some ( anchor_info) if anchor_info. state_upper_limit == STATE_UPPER_LIMIT_NO_RETAIN => {
613
+ Some ( anchor_info)
614
+ if anchor_info. state_lower_limit == 0
615
+ && anchor_info. state_upper_limit == STATE_UPPER_LIMIT_NO_RETAIN =>
616
+ {
542
617
info ! ( log, "States have already been pruned" ) ;
543
618
return Ok ( ( ) ) ;
544
619
}
@@ -586,7 +661,11 @@ pub fn run<T: EthSpec>(cli_args: &ArgMatches<'_>, env: Environment<T>) -> Result
586
661
}
587
662
( "inspect" , Some ( cli_args) ) => {
588
663
let inspect_config = parse_inspect_config ( cli_args) ?;
589
- inspect_db ( inspect_config, client_config, & context, log)
664
+ inspect_db :: < T > ( inspect_config, client_config)
665
+ }
666
+ ( "compact" , Some ( cli_args) ) => {
667
+ let compact_config = parse_compact_config ( cli_args) ?;
668
+ compact_db :: < T > ( compact_config, client_config, log) . map_err ( format_err)
590
669
}
591
670
( "prune-payloads" , Some ( _) ) => {
592
671
prune_payloads ( client_config, & context, log) . map_err ( format_err)
0 commit comments