Rename ValidatorExit and move to sdk (#17728)
This commit is contained in:
parent
3dcc8e0046
commit
3a647c4bea
|
@ -3,7 +3,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
rpc_health::*,
|
rpc_health::*,
|
||||||
send_transaction_service::{SendTransactionService, TransactionInfo},
|
send_transaction_service::{SendTransactionService, TransactionInfo},
|
||||||
validator::ValidatorExit,
|
|
||||||
};
|
};
|
||||||
use bincode::{config::Options, serialize};
|
use bincode::{config::Options, serialize};
|
||||||
use jsonrpc_core::{types::error, Error, Metadata, Result};
|
use jsonrpc_core::{types::error, Error, Metadata, Result};
|
||||||
|
@ -58,6 +57,7 @@ use solana_sdk::{
|
||||||
commitment_config::{CommitmentConfig, CommitmentLevel},
|
commitment_config::{CommitmentConfig, CommitmentLevel},
|
||||||
epoch_info::EpochInfo,
|
epoch_info::EpochInfo,
|
||||||
epoch_schedule::EpochSchedule,
|
epoch_schedule::EpochSchedule,
|
||||||
|
exit::Exit,
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
sanitize::Sanitize,
|
sanitize::Sanitize,
|
||||||
|
@ -148,7 +148,7 @@ pub struct JsonRpcRequestProcessor {
|
||||||
blockstore: Arc<Blockstore>,
|
blockstore: Arc<Blockstore>,
|
||||||
config: JsonRpcConfig,
|
config: JsonRpcConfig,
|
||||||
snapshot_config: Option<SnapshotConfig>,
|
snapshot_config: Option<SnapshotConfig>,
|
||||||
validator_exit: Arc<RwLock<ValidatorExit>>,
|
validator_exit: Arc<RwLock<Exit>>,
|
||||||
health: Arc<RpcHealth>,
|
health: Arc<RpcHealth>,
|
||||||
cluster_info: Arc<ClusterInfo>,
|
cluster_info: Arc<ClusterInfo>,
|
||||||
genesis_hash: Hash,
|
genesis_hash: Hash,
|
||||||
|
@ -235,7 +235,7 @@ impl JsonRpcRequestProcessor {
|
||||||
bank_forks: Arc<RwLock<BankForks>>,
|
bank_forks: Arc<RwLock<BankForks>>,
|
||||||
block_commitment_cache: Arc<RwLock<BlockCommitmentCache>>,
|
block_commitment_cache: Arc<RwLock<BlockCommitmentCache>>,
|
||||||
blockstore: Arc<Blockstore>,
|
blockstore: Arc<Blockstore>,
|
||||||
validator_exit: Arc<RwLock<ValidatorExit>>,
|
validator_exit: Arc<RwLock<Exit>>,
|
||||||
health: Arc<RpcHealth>,
|
health: Arc<RpcHealth>,
|
||||||
cluster_info: Arc<ClusterInfo>,
|
cluster_info: Arc<ClusterInfo>,
|
||||||
genesis_hash: Hash,
|
genesis_hash: Hash,
|
||||||
|
@ -3772,8 +3772,8 @@ fn deserialize_transaction(
|
||||||
.map(|transaction| (wire_transaction, transaction))
|
.map(|transaction| (wire_transaction, transaction))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn create_validator_exit(exit: &Arc<AtomicBool>) -> Arc<RwLock<ValidatorExit>> {
|
pub(crate) fn create_validator_exit(exit: &Arc<AtomicBool>) -> Arc<RwLock<Exit>> {
|
||||||
let mut validator_exit = ValidatorExit::default();
|
let mut validator_exit = Exit::default();
|
||||||
let exit_ = exit.clone();
|
let exit_ = exit.clone();
|
||||||
validator_exit.register_exit(Box::new(move || exit_.store(true, Ordering::Relaxed)));
|
validator_exit.register_exit(Box::new(move || exit_.store(true, Ordering::Relaxed)));
|
||||||
Arc::new(RwLock::new(validator_exit))
|
Arc::new(RwLock::new(validator_exit))
|
||||||
|
|
|
@ -6,7 +6,6 @@ use crate::{
|
||||||
rpc::{rpc_deprecated_v1_7::*, rpc_full::*, rpc_minimal::*, rpc_obsolete_v1_7::*, *},
|
rpc::{rpc_deprecated_v1_7::*, rpc_full::*, rpc_minimal::*, rpc_obsolete_v1_7::*, *},
|
||||||
rpc_health::*,
|
rpc_health::*,
|
||||||
send_transaction_service::{LeaderInfo, SendTransactionService},
|
send_transaction_service::{LeaderInfo, SendTransactionService},
|
||||||
validator::ValidatorExit,
|
|
||||||
};
|
};
|
||||||
use jsonrpc_core::{futures::prelude::*, MetaIoHandler};
|
use jsonrpc_core::{futures::prelude::*, MetaIoHandler};
|
||||||
use jsonrpc_http_server::{
|
use jsonrpc_http_server::{
|
||||||
|
@ -27,8 +26,8 @@ use solana_runtime::{
|
||||||
snapshot_utils,
|
snapshot_utils,
|
||||||
};
|
};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
genesis_config::DEFAULT_GENESIS_DOWNLOAD_PATH, hash::Hash, native_token::lamports_to_sol,
|
exit::Exit, genesis_config::DEFAULT_GENESIS_DOWNLOAD_PATH, hash::Hash,
|
||||||
pubkey::Pubkey,
|
native_token::lamports_to_sol, pubkey::Pubkey,
|
||||||
};
|
};
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
|
@ -273,7 +272,7 @@ impl JsonRpcService {
|
||||||
poh_recorder: Option<Arc<Mutex<PohRecorder>>>,
|
poh_recorder: Option<Arc<Mutex<PohRecorder>>>,
|
||||||
genesis_hash: Hash,
|
genesis_hash: Hash,
|
||||||
ledger_path: &Path,
|
ledger_path: &Path,
|
||||||
validator_exit: Arc<RwLock<ValidatorExit>>,
|
validator_exit: Arc<RwLock<Exit>>,
|
||||||
trusted_validators: Option<HashSet<Pubkey>>,
|
trusted_validators: Option<HashSet<Pubkey>>,
|
||||||
override_health_check: Arc<AtomicBool>,
|
override_health_check: Arc<AtomicBool>,
|
||||||
optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>,
|
optimistically_confirmed_bank: Arc<RwLock<OptimisticallyConfirmedBank>>,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
rpc::JsonRpcConfig,
|
rpc::JsonRpcConfig,
|
||||||
validator::{Validator, ValidatorConfig, ValidatorExit, ValidatorStartProgress},
|
validator::{Validator, ValidatorConfig, ValidatorStartProgress},
|
||||||
},
|
},
|
||||||
solana_client::rpc_client::RpcClient,
|
solana_client::rpc_client::RpcClient,
|
||||||
solana_gossip::{cluster_info::Node, gossip_service::discover_cluster, socketaddr},
|
solana_gossip::{cluster_info::Node, gossip_service::discover_cluster, socketaddr},
|
||||||
|
@ -18,6 +18,7 @@ use {
|
||||||
clock::{Slot, DEFAULT_MS_PER_SLOT},
|
clock::{Slot, DEFAULT_MS_PER_SLOT},
|
||||||
commitment_config::CommitmentConfig,
|
commitment_config::CommitmentConfig,
|
||||||
epoch_schedule::EpochSchedule,
|
epoch_schedule::EpochSchedule,
|
||||||
|
exit::Exit,
|
||||||
fee_calculator::{FeeCalculator, FeeRateGovernor},
|
fee_calculator::{FeeCalculator, FeeRateGovernor},
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
native_token::sol_to_lamports,
|
native_token::sol_to_lamports,
|
||||||
|
@ -79,7 +80,7 @@ pub struct TestValidatorGenesis {
|
||||||
programs: Vec<ProgramInfo>,
|
programs: Vec<ProgramInfo>,
|
||||||
epoch_schedule: Option<EpochSchedule>,
|
epoch_schedule: Option<EpochSchedule>,
|
||||||
node_config: TestValidatorNodeConfig,
|
node_config: TestValidatorNodeConfig,
|
||||||
pub validator_exit: Arc<RwLock<ValidatorExit>>,
|
pub validator_exit: Arc<RwLock<Exit>>,
|
||||||
pub start_progress: Arc<RwLock<ValidatorStartProgress>>,
|
pub start_progress: Arc<RwLock<ValidatorStartProgress>>,
|
||||||
pub authorized_voter_keypairs: Arc<RwLock<Vec<Arc<Keypair>>>>,
|
pub authorized_voter_keypairs: Arc<RwLock<Vec<Arc<Keypair>>>>,
|
||||||
pub max_ledger_shreds: Option<u64>,
|
pub max_ledger_shreds: Option<u64>,
|
||||||
|
|
|
@ -59,6 +59,7 @@ use solana_runtime::{
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
clock::Slot,
|
clock::Slot,
|
||||||
epoch_schedule::MAX_LEADER_SCHEDULE_EPOCH_OFFSET,
|
epoch_schedule::MAX_LEADER_SCHEDULE_EPOCH_OFFSET,
|
||||||
|
exit::Exit,
|
||||||
genesis_config::GenesisConfig,
|
genesis_config::GenesisConfig,
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
|
@ -70,7 +71,6 @@ use solana_vote_program::vote_state::VoteState;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
fmt,
|
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
ops::Deref,
|
ops::Deref,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
|
@ -135,7 +135,7 @@ pub struct ValidatorConfig {
|
||||||
pub accounts_db_test_hash_calculation: bool,
|
pub accounts_db_test_hash_calculation: bool,
|
||||||
pub accounts_db_use_index_hash_calculation: bool,
|
pub accounts_db_use_index_hash_calculation: bool,
|
||||||
pub tpu_coalesce_ms: u64,
|
pub tpu_coalesce_ms: u64,
|
||||||
pub validator_exit: Arc<RwLock<ValidatorExit>>,
|
pub validator_exit: Arc<RwLock<Exit>>,
|
||||||
pub no_wait_for_vote_to_start_leader: bool,
|
pub no_wait_for_vote_to_start_leader: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ impl Default for ValidatorConfig {
|
||||||
accounts_db_test_hash_calculation: false,
|
accounts_db_test_hash_calculation: false,
|
||||||
accounts_db_use_index_hash_calculation: true,
|
accounts_db_use_index_hash_calculation: true,
|
||||||
tpu_coalesce_ms: DEFAULT_TPU_COALESCE_MS,
|
tpu_coalesce_ms: DEFAULT_TPU_COALESCE_MS,
|
||||||
validator_exit: Arc::new(RwLock::new(ValidatorExit::default())),
|
validator_exit: Arc::new(RwLock::new(Exit::default())),
|
||||||
no_wait_for_vote_to_start_leader: true,
|
no_wait_for_vote_to_start_leader: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,35 +223,6 @@ impl Default for ValidatorStartProgress {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub struct ValidatorExit {
|
|
||||||
exited: bool,
|
|
||||||
exits: Vec<Box<dyn FnOnce() + Send + Sync>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ValidatorExit {
|
|
||||||
pub fn register_exit(&mut self, exit: Box<dyn FnOnce() + Send + Sync>) {
|
|
||||||
if self.exited {
|
|
||||||
exit();
|
|
||||||
} else {
|
|
||||||
self.exits.push(exit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn exit(&mut self) {
|
|
||||||
self.exited = true;
|
|
||||||
for exit in self.exits.drain(..) {
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Debug for ValidatorExit {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
write!(f, "{} exits", self.exits.len())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct TransactionHistoryServices {
|
struct TransactionHistoryServices {
|
||||||
transaction_status_sender: Option<TransactionStatusSender>,
|
transaction_status_sender: Option<TransactionStatusSender>,
|
||||||
|
@ -264,7 +235,7 @@ struct TransactionHistoryServices {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Validator {
|
pub struct Validator {
|
||||||
validator_exit: Arc<RwLock<ValidatorExit>>,
|
validator_exit: Arc<RwLock<Exit>>,
|
||||||
json_rpc_service: Option<JsonRpcService>,
|
json_rpc_service: Option<JsonRpcService>,
|
||||||
pubsub_service: Option<PubSubService>,
|
pubsub_service: Option<PubSubService>,
|
||||||
optimistically_confirmed_bank_tracker: Option<OptimisticallyConfirmedBankTracker>,
|
optimistically_confirmed_bank_tracker: Option<OptimisticallyConfirmedBankTracker>,
|
||||||
|
|
|
@ -2703,7 +2703,7 @@ impl ClusterInfo {
|
||||||
self.id()
|
self.id()
|
||||||
);
|
);
|
||||||
exit.store(true, Ordering::Relaxed);
|
exit.store(true, Ordering::Relaxed);
|
||||||
// TODO: Pass through ValidatorExit here so
|
// TODO: Pass through Exit here so
|
||||||
// that this will exit cleanly.
|
// that this will exit cleanly.
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ use rand::{thread_rng, Rng};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use solana_client::thin_client::create_client;
|
use solana_client::thin_client::create_client;
|
||||||
use solana_core::consensus::VOTE_THRESHOLD_DEPTH;
|
use solana_core::consensus::VOTE_THRESHOLD_DEPTH;
|
||||||
use solana_core::validator::ValidatorExit;
|
|
||||||
use solana_gossip::{
|
use solana_gossip::{
|
||||||
cluster_info::VALIDATOR_PORT_RANGE, contact_info::ContactInfo, gossip_service::discover_cluster,
|
cluster_info::VALIDATOR_PORT_RANGE, contact_info::ContactInfo, gossip_service::discover_cluster,
|
||||||
};
|
};
|
||||||
|
@ -20,6 +19,7 @@ use solana_sdk::{
|
||||||
clock::{self, Slot, NUM_CONSECUTIVE_LEADER_SLOTS},
|
clock::{self, Slot, NUM_CONSECUTIVE_LEADER_SLOTS},
|
||||||
commitment_config::CommitmentConfig,
|
commitment_config::CommitmentConfig,
|
||||||
epoch_schedule::MINIMUM_SLOTS_PER_EPOCH,
|
epoch_schedule::MINIMUM_SLOTS_PER_EPOCH,
|
||||||
|
exit::Exit,
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
poh_config::PohConfig,
|
poh_config::PohConfig,
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
|
@ -178,7 +178,7 @@ pub fn sleep_n_epochs(
|
||||||
|
|
||||||
pub fn kill_entry_and_spend_and_verify_rest(
|
pub fn kill_entry_and_spend_and_verify_rest(
|
||||||
entry_point_info: &ContactInfo,
|
entry_point_info: &ContactInfo,
|
||||||
entry_point_validator_exit: &Arc<RwLock<ValidatorExit>>,
|
entry_point_validator_exit: &Arc<RwLock<Exit>>,
|
||||||
funding_keypair: &Keypair,
|
funding_keypair: &Keypair,
|
||||||
nodes: usize,
|
nodes: usize,
|
||||||
slot_millis: u64,
|
slot_millis: u64,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use solana_core::validator::{ValidatorConfig, ValidatorExit};
|
use solana_core::validator::ValidatorConfig;
|
||||||
|
use solana_sdk::exit::Exit;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
|
||||||
pub fn safe_clone_config(config: &ValidatorConfig) -> ValidatorConfig {
|
pub fn safe_clone_config(config: &ValidatorConfig) -> ValidatorConfig {
|
||||||
|
@ -52,7 +53,7 @@ pub fn safe_clone_config(config: &ValidatorConfig) -> ValidatorConfig {
|
||||||
accounts_db_test_hash_calculation: config.accounts_db_test_hash_calculation,
|
accounts_db_test_hash_calculation: config.accounts_db_test_hash_calculation,
|
||||||
accounts_db_use_index_hash_calculation: config.accounts_db_use_index_hash_calculation,
|
accounts_db_use_index_hash_calculation: config.accounts_db_use_index_hash_calculation,
|
||||||
tpu_coalesce_ms: config.tpu_coalesce_ms,
|
tpu_coalesce_ms: config.tpu_coalesce_ms,
|
||||||
validator_exit: Arc::new(RwLock::new(ValidatorExit::default())),
|
validator_exit: Arc::new(RwLock::new(Exit::default())),
|
||||||
poh_hashes_per_batch: config.poh_hashes_per_batch,
|
poh_hashes_per_batch: config.poh_hashes_per_batch,
|
||||||
no_wait_for_vote_to_start_leader: config.no_wait_for_vote_to_start_leader,
|
no_wait_for_vote_to_start_leader: config.no_wait_for_vote_to_start_leader,
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct Exit {
|
||||||
|
exited: bool,
|
||||||
|
exits: Vec<Box<dyn FnOnce() + Send + Sync>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Exit {
|
||||||
|
pub fn register_exit(&mut self, exit: Box<dyn FnOnce() + Send + Sync>) {
|
||||||
|
if self.exited {
|
||||||
|
exit();
|
||||||
|
} else {
|
||||||
|
self.exits.push(exit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn exit(&mut self) {
|
||||||
|
self.exited = true;
|
||||||
|
for exit in self.exits.drain(..) {
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for Exit {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "{} exits", self.exits.len())
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,7 @@ pub mod entrypoint;
|
||||||
pub mod entrypoint_deprecated;
|
pub mod entrypoint_deprecated;
|
||||||
pub mod entrypoint_native;
|
pub mod entrypoint_native;
|
||||||
pub mod epoch_info;
|
pub mod epoch_info;
|
||||||
|
pub mod exit;
|
||||||
pub mod feature;
|
pub mod feature;
|
||||||
pub mod feature_set;
|
pub mod feature_set;
|
||||||
pub mod genesis_config;
|
pub mod genesis_config;
|
||||||
|
|
|
@ -5,8 +5,11 @@ use {
|
||||||
jsonrpc_ipc_server::{RequestContext, ServerBuilder},
|
jsonrpc_ipc_server::{RequestContext, ServerBuilder},
|
||||||
jsonrpc_server_utils::tokio,
|
jsonrpc_server_utils::tokio,
|
||||||
log::*,
|
log::*,
|
||||||
solana_core::validator::{ValidatorExit, ValidatorStartProgress},
|
solana_core::validator::ValidatorStartProgress,
|
||||||
solana_sdk::signature::{read_keypair_file, Keypair, Signer},
|
solana_sdk::{
|
||||||
|
exit::Exit,
|
||||||
|
signature::{read_keypair_file, Keypair, Signer},
|
||||||
|
},
|
||||||
std::{
|
std::{
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
path::Path,
|
path::Path,
|
||||||
|
@ -21,7 +24,7 @@ pub struct AdminRpcRequestMetadata {
|
||||||
pub rpc_addr: Option<SocketAddr>,
|
pub rpc_addr: Option<SocketAddr>,
|
||||||
pub start_time: SystemTime,
|
pub start_time: SystemTime,
|
||||||
pub start_progress: Arc<RwLock<ValidatorStartProgress>>,
|
pub start_progress: Arc<RwLock<ValidatorStartProgress>>,
|
||||||
pub validator_exit: Arc<RwLock<ValidatorExit>>,
|
pub validator_exit: Arc<RwLock<Exit>>,
|
||||||
pub authorized_voter_keypairs: Arc<RwLock<Vec<Arc<Keypair>>>>,
|
pub authorized_voter_keypairs: Arc<RwLock<Vec<Arc<Keypair>>>>,
|
||||||
}
|
}
|
||||||
impl Metadata for AdminRpcRequestMetadata {}
|
impl Metadata for AdminRpcRequestMetadata {}
|
||||||
|
@ -67,7 +70,7 @@ impl AdminRpc for AdminRpcImpl {
|
||||||
warn!("validator exit requested");
|
warn!("validator exit requested");
|
||||||
meta.validator_exit.write().unwrap().exit();
|
meta.validator_exit.write().unwrap().exit();
|
||||||
|
|
||||||
// TODO: Debug why ValidatorExit doesn't always cause the validator to fully exit
|
// TODO: Debug why Exit doesn't always cause the validator to fully exit
|
||||||
// (rocksdb background processing or some other stuck thread perhaps?).
|
// (rocksdb background processing or some other stuck thread perhaps?).
|
||||||
//
|
//
|
||||||
// If the process is still alive after five seconds, exit harder
|
// If the process is still alive after five seconds, exit harder
|
||||||
|
|
|
@ -6,7 +6,8 @@ use {
|
||||||
},
|
},
|
||||||
solana_core::validator::ValidatorStartProgress,
|
solana_core::validator::ValidatorStartProgress,
|
||||||
solana_sdk::{
|
solana_sdk::{
|
||||||
clock::Slot, commitment_config::CommitmentConfig, native_token::Sol, pubkey::Pubkey,
|
clock::Slot, commitment_config::CommitmentConfig, exit::Exit, native_token::Sol,
|
||||||
|
pubkey::Pubkey,
|
||||||
},
|
},
|
||||||
std::{
|
std::{
|
||||||
io,
|
io,
|
||||||
|
@ -31,7 +32,7 @@ impl Dashboard {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
ledger_path: &Path,
|
ledger_path: &Path,
|
||||||
log_path: Option<&Path>,
|
log_path: Option<&Path>,
|
||||||
validator_exit: Option<&mut solana_core::validator::ValidatorExit>,
|
validator_exit: Option<&mut Exit>,
|
||||||
) -> Result<Self, io::Error> {
|
) -> Result<Self, io::Error> {
|
||||||
println_name_value("Ledger location:", &format!("{}", ledger_path.display()));
|
println_name_value("Ledger location:", &format!("{}", ledger_path.display()));
|
||||||
if let Some(log_path) = log_path {
|
if let Some(log_path) = log_path {
|
||||||
|
|
Loading…
Reference in New Issue