Add "init" subcommand
This commit is contained in:
parent
c06568f3db
commit
49c908dc50
|
@ -1,6 +1,6 @@
|
||||||
use clap::{
|
use clap::{
|
||||||
crate_description, crate_name, value_t, value_t_or_exit, values_t, values_t_or_exit, App, Arg,
|
crate_description, crate_name, value_t, value_t_or_exit, values_t, values_t_or_exit, App,
|
||||||
ArgMatches,
|
AppSettings, Arg, ArgMatches, SubCommand,
|
||||||
};
|
};
|
||||||
use log::*;
|
use log::*;
|
||||||
use rand::{seq::SliceRandom, thread_rng, Rng};
|
use rand::{seq::SliceRandom, thread_rng, Rng};
|
||||||
|
@ -58,6 +58,12 @@ use std::{
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
enum Operation {
|
||||||
|
Initialize,
|
||||||
|
Run,
|
||||||
|
}
|
||||||
|
|
||||||
fn port_range_validator(port_range: String) -> Result<(), String> {
|
fn port_range_validator(port_range: String) -> Result<(), String> {
|
||||||
if let Some((start, end)) = solana_net_utils::parse_port_range(&port_range) {
|
if let Some((start, end)) = solana_net_utils::parse_port_range(&port_range) {
|
||||||
if end - start < MINIMUM_VALIDATOR_PORT_RANGE_WIDTH {
|
if end - start < MINIMUM_VALIDATOR_PORT_RANGE_WIDTH {
|
||||||
|
@ -760,54 +766,6 @@ fn rpc_bootstrap(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
|
||||||
fn create_validator(
|
|
||||||
node: Node,
|
|
||||||
identity_keypair: &Arc<Keypair>,
|
|
||||||
ledger_path: &Path,
|
|
||||||
vote_account: &Pubkey,
|
|
||||||
authorized_voter_keypairs: Vec<Arc<Keypair>>,
|
|
||||||
cluster_entrypoints: Vec<ContactInfo>,
|
|
||||||
mut validator_config: ValidatorConfig,
|
|
||||||
rpc_bootstrap_config: RpcBootstrapConfig,
|
|
||||||
no_port_check: bool,
|
|
||||||
use_progress_bar: bool,
|
|
||||||
maximum_local_snapshot_age: Slot,
|
|
||||||
) -> Validator {
|
|
||||||
if validator_config.cuda {
|
|
||||||
solana_perf::perf_libs::init_cuda();
|
|
||||||
enable_recycler_warming();
|
|
||||||
}
|
|
||||||
solana_ledger::entry::init_poh();
|
|
||||||
solana_runtime::snapshot_utils::remove_tmp_snapshot_archives(ledger_path);
|
|
||||||
|
|
||||||
if !cluster_entrypoints.is_empty() {
|
|
||||||
rpc_bootstrap(
|
|
||||||
&node,
|
|
||||||
&identity_keypair,
|
|
||||||
&ledger_path,
|
|
||||||
&vote_account,
|
|
||||||
&authorized_voter_keypairs,
|
|
||||||
&cluster_entrypoints,
|
|
||||||
&mut validator_config,
|
|
||||||
rpc_bootstrap_config,
|
|
||||||
no_port_check,
|
|
||||||
use_progress_bar,
|
|
||||||
maximum_local_snapshot_age,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Validator::new(
|
|
||||||
node,
|
|
||||||
&identity_keypair,
|
|
||||||
&ledger_path,
|
|
||||||
&vote_account,
|
|
||||||
authorized_voter_keypairs,
|
|
||||||
cluster_entrypoints,
|
|
||||||
&validator_config,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let default_dynamic_port_range =
|
let default_dynamic_port_range =
|
||||||
&format!("{}-{}", VALIDATOR_PORT_RANGE.0, VALIDATOR_PORT_RANGE.1);
|
&format!("{}-{}", VALIDATOR_PORT_RANGE.0, VALIDATOR_PORT_RANGE.1);
|
||||||
|
@ -830,6 +788,7 @@ pub fn main() {
|
||||||
|
|
||||||
let matches = App::new(crate_name!()).about(crate_description!())
|
let matches = App::new(crate_name!()).about(crate_description!())
|
||||||
.version(solana_version::version!())
|
.version(solana_version::version!())
|
||||||
|
.setting(AppSettings::VersionlessSubcommands)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name(SKIP_SEED_PHRASE_VALIDATION_ARG.name)
|
Arg::with_name(SKIP_SEED_PHRASE_VALIDATION_ARG.name)
|
||||||
.long(SKIP_SEED_PHRASE_VALIDATION_ARG.long)
|
.long(SKIP_SEED_PHRASE_VALIDATION_ARG.long)
|
||||||
|
@ -1454,8 +1413,23 @@ pub fn main() {
|
||||||
.conflicts_with("no_accounts_db_caching")
|
.conflicts_with("no_accounts_db_caching")
|
||||||
.hidden(true)
|
.hidden(true)
|
||||||
)
|
)
|
||||||
|
.after_help("The default subcommand is run")
|
||||||
|
.subcommand(
|
||||||
|
SubCommand::with_name("init")
|
||||||
|
.about("Initialize the ledger directory then exit")
|
||||||
|
)
|
||||||
|
.subcommand(
|
||||||
|
SubCommand::with_name("run")
|
||||||
|
.about("Run the validator")
|
||||||
|
)
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
|
let operation = match matches.subcommand().0 {
|
||||||
|
"" | "run" => Operation::Run,
|
||||||
|
"init" => Operation::Initialize,
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
|
||||||
let identity_keypair = Arc::new(keypair_of(&matches, "identity").unwrap_or_else(Keypair::new));
|
let identity_keypair = Arc::new(keypair_of(&matches, "identity").unwrap_or_else(Keypair::new));
|
||||||
|
|
||||||
let authorized_voter_keypairs = keypairs_of(&matches, "authorized_voter_keypairs")
|
let authorized_voter_keypairs = keypairs_of(&matches, "authorized_voter_keypairs")
|
||||||
|
@ -1906,18 +1880,42 @@ pub fn main() {
|
||||||
solana_metrics::set_host_id(identity_keypair.pubkey().to_string());
|
solana_metrics::set_host_id(identity_keypair.pubkey().to_string());
|
||||||
solana_metrics::set_panic_hook("validator");
|
solana_metrics::set_panic_hook("validator");
|
||||||
|
|
||||||
let validator = create_validator(
|
if validator_config.cuda {
|
||||||
|
solana_perf::perf_libs::init_cuda();
|
||||||
|
enable_recycler_warming();
|
||||||
|
}
|
||||||
|
solana_ledger::entry::init_poh();
|
||||||
|
solana_runtime::snapshot_utils::remove_tmp_snapshot_archives(&ledger_path);
|
||||||
|
|
||||||
|
if !cluster_entrypoints.is_empty() {
|
||||||
|
rpc_bootstrap(
|
||||||
|
&node,
|
||||||
|
&identity_keypair,
|
||||||
|
&ledger_path,
|
||||||
|
&vote_account,
|
||||||
|
&authorized_voter_keypairs,
|
||||||
|
&cluster_entrypoints,
|
||||||
|
&mut validator_config,
|
||||||
|
rpc_bootstrap_config,
|
||||||
|
no_port_check,
|
||||||
|
use_progress_bar,
|
||||||
|
maximum_local_snapshot_age,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if operation == Operation::Initialize {
|
||||||
|
info!("Validator ledger initialization complete");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let validator = Validator::new(
|
||||||
node,
|
node,
|
||||||
&identity_keypair,
|
&identity_keypair,
|
||||||
&ledger_path,
|
&ledger_path,
|
||||||
&vote_account,
|
&vote_account,
|
||||||
authorized_voter_keypairs,
|
authorized_voter_keypairs,
|
||||||
cluster_entrypoints,
|
cluster_entrypoints,
|
||||||
validator_config,
|
&validator_config,
|
||||||
rpc_bootstrap_config,
|
|
||||||
no_port_check,
|
|
||||||
use_progress_bar,
|
|
||||||
maximum_local_snapshot_age,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some(filename) = init_complete_file {
|
if let Some(filename) = init_complete_file {
|
||||||
|
|
Loading…
Reference in New Issue