ledger-tool: Move AccountsDbConfig building to common helper function (#29975)

Several subcommands may wish to specify AccountsDb configuration
options. The matching is currently duplicated in both "verify" and
"create-snapshot" command, so move the config to a common helper.

Note that each subcommand that wishes to use any argument will still
need to add the argument to its' argument list under App::new().
This commit is contained in:
steviez 2023-01-30 14:59:35 -06:00 committed by GitHub
parent 1de87c00a7
commit 1e6e623da5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 48 additions and 70 deletions

View File

@ -1021,6 +1021,52 @@ fn hardforks_of(matches: &ArgMatches<'_>, name: &str) -> Option<Vec<Slot>> {
}
}
// Build an `AccountsDbConfig` from subcommand arguments. All of the arguments
// matched by this functional are either optional or have a default value.
// Thus, a subcommand need not support all of the arguments that are matched
// by this function.
fn get_accounts_db_config(ledger_path: &Path, arg_matches: &ArgMatches<'_>) -> AccountsDbConfig {
let accounts_index_bins = value_t!(arg_matches, "accounts_index_bins", usize).ok();
let accounts_index_index_limit_mb =
if let Some(limit) = value_t!(arg_matches, "accounts_index_memory_limit_mb", usize).ok() {
IndexLimitMb::Limit(limit)
} else if arg_matches.is_present("disable_accounts_disk_index") {
IndexLimitMb::InMemOnly
} else {
IndexLimitMb::Unspecified
};
let accounts_index_drives: Vec<PathBuf> = if arg_matches.is_present("accounts_index_path") {
values_t_or_exit!(arg_matches, "accounts_index_path", String)
.into_iter()
.map(PathBuf::from)
.collect()
} else {
vec![ledger_path.join("accounts_index.ledger-tool")]
};
let accounts_index_config = AccountsIndexConfig {
bins: accounts_index_bins,
index_limit_mb: accounts_index_index_limit_mb,
drives: Some(accounts_index_drives),
..AccountsIndexConfig::default()
};
let filler_accounts_config = FillerAccountsConfig {
count: value_t!(arg_matches, "accounts_filler_count", usize).unwrap_or(0),
size: value_t!(arg_matches, "accounts_filler_size", usize).unwrap_or(0),
};
AccountsDbConfig {
index: Some(accounts_index_config),
accounts_hash_cache_path: Some(ledger_path.join(AccountsDb::ACCOUNTS_HASH_CACHE_DIR)),
filler_accounts_config,
ancient_append_vec_offset: value_t!(arg_matches, "accounts_db_ancient_append_vecs", i64)
.ok(),
exhaustively_verify_refcounts: arg_matches.is_present("accounts_db_verify_refcounts"),
skip_initial_hash_calc: arg_matches.is_present("accounts_db_skip_initial_hash_calculation"),
..AccountsDbConfig::default()
}
}
fn load_bank_forks(
arg_matches: &ArgMatches,
genesis_config: &GenesisConfig,
@ -2706,13 +2752,7 @@ fn main() {
}
}
("verify", Some(arg_matches)) => {
let mut accounts_index_config = AccountsIndexConfig::default();
if let Some(bins) = value_t!(arg_matches, "accounts_index_bins", usize).ok() {
accounts_index_config.bins = Some(bins);
}
let exit_signal = Arc::new(AtomicBool::new(false));
let no_os_memory_stats_reporting =
arg_matches.is_present("no_os_memory_stats_reporting");
let system_monitor_service = SystemMonitorService::new(
@ -2725,56 +2765,6 @@ fn main() {
},
);
accounts_index_config.index_limit_mb = if let Some(limit) =
value_t!(arg_matches, "accounts_index_memory_limit_mb", usize).ok()
{
IndexLimitMb::Limit(limit)
} else if arg_matches.is_present("disable_accounts_disk_index") {
IndexLimitMb::InMemOnly
} else {
IndexLimitMb::Unspecified
};
{
let mut accounts_index_paths: Vec<PathBuf> =
if arg_matches.is_present("accounts_index_path") {
values_t_or_exit!(arg_matches, "accounts_index_path", String)
.into_iter()
.map(PathBuf::from)
.collect()
} else {
vec![]
};
if accounts_index_paths.is_empty() {
accounts_index_paths = vec![ledger_path.join("accounts_index")];
}
accounts_index_config.drives = Some(accounts_index_paths);
}
let filler_accounts_config = FillerAccountsConfig {
count: value_t_or_exit!(arg_matches, "accounts_filler_count", usize),
size: value_t_or_exit!(arg_matches, "accounts_filler_size", usize),
};
let accounts_db_config = Some(AccountsDbConfig {
index: Some(accounts_index_config),
accounts_hash_cache_path: Some(
ledger_path.join(AccountsDb::ACCOUNTS_HASH_CACHE_DIR),
),
filler_accounts_config,
ancient_append_vec_offset: value_t!(
arg_matches,
"accounts_db_ancient_append_vecs",
i64
)
.ok(),
exhaustively_verify_refcounts: arg_matches
.is_present("accounts_db_verify_refcounts"),
skip_initial_hash_calc: arg_matches
.is_present("accounts_db_skip_initial_hash_calculation"),
..AccountsDbConfig::default()
});
let debug_keys = pubkeys_of(arg_matches, "debug_key")
.map(|pubkeys| Arc::new(pubkeys.into_iter().collect::<HashSet<_>>()));
@ -2793,7 +2783,7 @@ fn main() {
usize
)
.ok(),
accounts_db_config,
accounts_db_config: Some(get_accounts_db_config(&ledger_path, arg_matches)),
verify_index: arg_matches.is_present("verify_accounts_index"),
allow_dead_slots: arg_matches.is_present("allow_dead_slots"),
accounts_db_test_hash_calculation: arg_matches
@ -3026,18 +3016,6 @@ fn main() {
output_directory.display()
);
let accounts_db_config = Some(AccountsDbConfig {
ancient_append_vec_offset: value_t!(
arg_matches,
"accounts_db_ancient_append_vecs",
i64
)
.ok(),
skip_initial_hash_calc: arg_matches
.is_present("accounts_db_skip_initial_hash_calculation"),
..AccountsDbConfig::default()
});
match load_bank_forks(
arg_matches,
&genesis_config,
@ -3046,7 +3024,7 @@ fn main() {
new_hard_forks,
halt_at_slot: Some(snapshot_slot),
poh_verify: false,
accounts_db_config,
accounts_db_config: Some(get_accounts_db_config(&ledger_path, arg_matches)),
..ProcessOptions::default()
},
snapshot_archive_path,