More fullnode to validator renaming (#6337)
This commit is contained in:
parent
5650231df3
commit
322fcea6e5
|
@ -207,7 +207,7 @@ killNodes() {
|
||||||
set -x
|
set -x
|
||||||
curl --retry 5 --retry-delay 2 --retry-connrefused \
|
curl --retry 5 --retry-delay 2 --retry-connrefused \
|
||||||
-X POST -H 'Content-Type: application/json' \
|
-X POST -H 'Content-Type: application/json' \
|
||||||
-d '{"jsonrpc":"2.0","id":1, "method":"fullnodeExit"}' \
|
-d '{"jsonrpc":"2.0","id":1, "method":"validatorExit"}' \
|
||||||
http://localhost:$port
|
http://localhost:$port
|
||||||
)
|
)
|
||||||
done
|
done
|
||||||
|
|
|
@ -679,20 +679,20 @@ impl RpcClient {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fullnode_exit(&self) -> io::Result<bool> {
|
pub fn validator_exit(&self) -> io::Result<bool> {
|
||||||
let response = self
|
let response = self
|
||||||
.client
|
.client
|
||||||
.send(&RpcRequest::FullnodeExit, None, 0)
|
.send(&RpcRequest::ValidatorExit, None, 0)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
io::Error::new(
|
io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
format!("FullnodeExit request failure: {:?}", err),
|
format!("ValidatorExit request failure: {:?}", err),
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
serde_json::from_value(response).map_err(|err| {
|
serde_json::from_value(response).map_err(|err| {
|
||||||
io::Error::new(
|
io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
format!("FullnodeExit parse failure: {:?}", err),
|
format!("ValidatorExit parse failure: {:?}", err),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ pub struct RpcEpochInfo {
|
||||||
pub enum RpcRequest {
|
pub enum RpcRequest {
|
||||||
ConfirmTransaction,
|
ConfirmTransaction,
|
||||||
DeregisterNode,
|
DeregisterNode,
|
||||||
FullnodeExit,
|
ValidatorExit,
|
||||||
GetAccountInfo,
|
GetAccountInfo,
|
||||||
GetBalance,
|
GetBalance,
|
||||||
GetClusterNodes,
|
GetClusterNodes,
|
||||||
|
@ -54,7 +54,7 @@ impl RpcRequest {
|
||||||
let method = match self {
|
let method = match self {
|
||||||
RpcRequest::ConfirmTransaction => "confirmTransaction",
|
RpcRequest::ConfirmTransaction => "confirmTransaction",
|
||||||
RpcRequest::DeregisterNode => "deregisterNode",
|
RpcRequest::DeregisterNode => "deregisterNode",
|
||||||
RpcRequest::FullnodeExit => "fullnodeExit",
|
RpcRequest::ValidatorExit => "validatorExit",
|
||||||
RpcRequest::GetAccountInfo => "getAccountInfo",
|
RpcRequest::GetAccountInfo => "getAccountInfo",
|
||||||
RpcRequest::GetBalance => "getBalance",
|
RpcRequest::GetBalance => "getBalance",
|
||||||
RpcRequest::GetClusterNodes => "getClusterNodes",
|
RpcRequest::GetClusterNodes => "getClusterNodes",
|
||||||
|
|
|
@ -268,8 +268,8 @@ impl ThinClient {
|
||||||
self.rpc_client().check_signature(signature)
|
self.rpc_client().check_signature(signature)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fullnode_exit(&self) -> io::Result<bool> {
|
pub fn validator_exit(&self) -> io::Result<bool> {
|
||||||
self.rpc_client().fullnode_exit()
|
self.rpc_client().validator_exit()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_num_blocks_since_signature_confirmation(
|
pub fn get_num_blocks_since_signature_confirmation(
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
//! It includes a full Rust implementation of the architecture (see
|
//! It includes a full Rust implementation of the architecture (see
|
||||||
//! [Validator](server/struct.Validator.html)) as well as hooks to GPU implementations of its most
|
//! [Validator](server/struct.Validator.html)) as well as hooks to GPU implementations of its most
|
||||||
//! paralellizable components (i.e. [SigVerify](sigverify/index.html)). It also includes
|
//! paralellizable components (i.e. [SigVerify](sigverify/index.html)). It also includes
|
||||||
//! command-line tools to spin up fullnodes and a Rust library
|
//! command-line tools to spin up validators and a Rust library
|
||||||
//!
|
//!
|
||||||
|
|
||||||
pub mod bank_forks;
|
pub mod bank_forks;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//! The `local_vote_signer_service` can be started locally to sign fullnode votes
|
//! The `local_vote_signer_service` can be started locally to sign validator votes
|
||||||
|
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use solana_netutil::PortRange;
|
use solana_netutil::PortRange;
|
||||||
|
|
|
@ -28,14 +28,14 @@ use std::time::{Duration, Instant};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct JsonRpcConfig {
|
pub struct JsonRpcConfig {
|
||||||
pub enable_fullnode_exit: bool, // Enable the 'fullnodeExit' command
|
pub enable_validator_exit: bool, // Enable the 'validatorExit' command
|
||||||
pub drone_addr: Option<SocketAddr>,
|
pub drone_addr: Option<SocketAddr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for JsonRpcConfig {
|
impl Default for JsonRpcConfig {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
enable_fullnode_exit: false,
|
enable_validator_exit: false,
|
||||||
drone_addr: None,
|
drone_addr: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,15 +197,15 @@ impl JsonRpcRequestProcessor {
|
||||||
.get_pubkeys_for_slot(slot, &self.bank_forks))
|
.get_pubkeys_for_slot(slot, &self.bank_forks))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fullnode_exit(&self) -> Result<bool> {
|
pub fn validator_exit(&self) -> Result<bool> {
|
||||||
if self.config.enable_fullnode_exit {
|
if self.config.enable_validator_exit {
|
||||||
warn!("fullnode_exit request...");
|
warn!("validator_exit request...");
|
||||||
if let Some(x) = self.validator_exit.write().unwrap().take() {
|
if let Some(x) = self.validator_exit.write().unwrap().take() {
|
||||||
x.exit()
|
x.exit()
|
||||||
}
|
}
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else {
|
} else {
|
||||||
debug!("fullnode_exit ignored");
|
debug!("validator_exit ignored");
|
||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -356,8 +356,8 @@ pub trait RpcSol {
|
||||||
#[rpc(meta, name = "getStoragePubkeysForSlot")]
|
#[rpc(meta, name = "getStoragePubkeysForSlot")]
|
||||||
fn get_storage_pubkeys_for_slot(&self, _: Self::Metadata, _: u64) -> Result<Vec<Pubkey>>;
|
fn get_storage_pubkeys_for_slot(&self, _: Self::Metadata, _: u64) -> Result<Vec<Pubkey>>;
|
||||||
|
|
||||||
#[rpc(meta, name = "fullnodeExit")]
|
#[rpc(meta, name = "validatorExit")]
|
||||||
fn fullnode_exit(&self, _: Self::Metadata) -> Result<bool>;
|
fn validator_exit(&self, _: Self::Metadata) -> Result<bool>;
|
||||||
|
|
||||||
#[rpc(meta, name = "getNumBlocksSinceSignatureConfirmation")]
|
#[rpc(meta, name = "getNumBlocksSinceSignatureConfirmation")]
|
||||||
fn get_num_blocks_since_signature_confirmation(
|
fn get_num_blocks_since_signature_confirmation(
|
||||||
|
@ -689,8 +689,8 @@ impl RpcSol for RpcSolImpl {
|
||||||
.get_storage_pubkeys_for_slot(slot)
|
.get_storage_pubkeys_for_slot(slot)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fullnode_exit(&self, meta: Self::Metadata) -> Result<bool> {
|
fn validator_exit(&self, meta: Self::Metadata) -> Result<bool> {
|
||||||
meta.request_processor.read().unwrap().fullnode_exit()
|
meta.request_processor.read().unwrap().validator_exit()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_version(&self, _: Self::Metadata) -> Result<RpcVersionInfo> {
|
fn get_version(&self, _: Self::Metadata) -> Result<RpcVersionInfo> {
|
||||||
|
@ -1238,7 +1238,7 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_rpc_request_processor_config_default_trait_fullnode_exit_fails() {
|
fn test_rpc_request_processor_config_default_trait_validator_exit_fails() {
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
let validator_exit = create_validator_exit(&exit);
|
let validator_exit = create_validator_exit(&exit);
|
||||||
let request_processor = JsonRpcRequestProcessor::new(
|
let request_processor = JsonRpcRequestProcessor::new(
|
||||||
|
@ -1247,23 +1247,23 @@ pub mod tests {
|
||||||
new_bank_forks().0,
|
new_bank_forks().0,
|
||||||
&validator_exit,
|
&validator_exit,
|
||||||
);
|
);
|
||||||
assert_eq!(request_processor.fullnode_exit(), Ok(false));
|
assert_eq!(request_processor.validator_exit(), Ok(false));
|
||||||
assert_eq!(exit.load(Ordering::Relaxed), false);
|
assert_eq!(exit.load(Ordering::Relaxed), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_rpc_request_processor_allow_fullnode_exit_config() {
|
fn test_rpc_request_processor_allow_validator_exit_config() {
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
let validator_exit = create_validator_exit(&exit);
|
let validator_exit = create_validator_exit(&exit);
|
||||||
let mut config = JsonRpcConfig::default();
|
let mut config = JsonRpcConfig::default();
|
||||||
config.enable_fullnode_exit = true;
|
config.enable_validator_exit = true;
|
||||||
let request_processor = JsonRpcRequestProcessor::new(
|
let request_processor = JsonRpcRequestProcessor::new(
|
||||||
StorageState::default(),
|
StorageState::default(),
|
||||||
config,
|
config,
|
||||||
new_bank_forks().0,
|
new_bank_forks().0,
|
||||||
&validator_exit,
|
&validator_exit,
|
||||||
);
|
);
|
||||||
assert_eq!(request_processor.fullnode_exit(), Ok(true));
|
assert_eq!(request_processor.validator_exit(), Ok(true));
|
||||||
assert_eq!(exit.load(Ordering::Relaxed), true);
|
assert_eq!(exit.load(Ordering::Relaxed), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ pub fn ed25519_verify(
|
||||||
// micro-benchmarks show GPU time for smallest batch around 15-20ms
|
// micro-benchmarks show GPU time for smallest batch around 15-20ms
|
||||||
// and CPU speed for 64-128 sigverifies around 10-20ms. 64 is a nice
|
// and CPU speed for 64-128 sigverifies around 10-20ms. 64 is a nice
|
||||||
// power-of-two number around that accounting for the fact that the CPU
|
// power-of-two number around that accounting for the fact that the CPU
|
||||||
// may be busy doing other things while being a real fullnode
|
// may be busy doing other things while being a real validator
|
||||||
// TODO: dynamically adjust this crossover
|
// TODO: dynamically adjust this crossover
|
||||||
if count < 64 {
|
if count < 64 {
|
||||||
return ed25519_verify_cpu(batches);
|
return ed25519_verify_cpu(batches);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//! The `fullnode` module hosts all the fullnode microservices.
|
//! The `validator` module hosts all the validator microservices.
|
||||||
|
|
||||||
use crate::bank_forks::{BankForks, SnapshotConfig};
|
use crate::bank_forks::{BankForks, SnapshotConfig};
|
||||||
use crate::blocktree::{Blocktree, CompletedSlotsReceiver};
|
use crate::blocktree::{Blocktree, CompletedSlotsReceiver};
|
||||||
|
|
|
@ -229,7 +229,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
|
||||||
}
|
}
|
||||||
println!("\nSending stop request to node {:?}", pubkey);
|
println!("\nSending stop request to node {:?}", pubkey);
|
||||||
|
|
||||||
let result = RpcClient::new_socket(node.rpc).fullnode_exit()?;
|
let result = RpcClient::new_socket(node.rpc).validator_exit()?;
|
||||||
if result {
|
if result {
|
||||||
println!("Stop signal accepted");
|
println!("Stop signal accepted");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -114,17 +114,17 @@ pub fn send_many_transactions(
|
||||||
expected_balances
|
expected_balances
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fullnode_exit(entry_point_info: &ContactInfo, nodes: usize) {
|
pub fn validator_exit(entry_point_info: &ContactInfo, nodes: usize) {
|
||||||
let (cluster_nodes, _) = discover_cluster(&entry_point_info.gossip, nodes).unwrap();
|
let (cluster_nodes, _) = discover_cluster(&entry_point_info.gossip, nodes).unwrap();
|
||||||
assert!(cluster_nodes.len() >= nodes);
|
assert!(cluster_nodes.len() >= nodes);
|
||||||
for node in &cluster_nodes {
|
for node in &cluster_nodes {
|
||||||
let client = create_client(node.client_facing_addr(), VALIDATOR_PORT_RANGE);
|
let client = create_client(node.client_facing_addr(), VALIDATOR_PORT_RANGE);
|
||||||
assert!(client.fullnode_exit().unwrap());
|
assert!(client.validator_exit().unwrap());
|
||||||
}
|
}
|
||||||
sleep(Duration::from_millis(DEFAULT_SLOT_MILLIS));
|
sleep(Duration::from_millis(DEFAULT_SLOT_MILLIS));
|
||||||
for node in &cluster_nodes {
|
for node in &cluster_nodes {
|
||||||
let client = create_client(node.client_facing_addr(), VALIDATOR_PORT_RANGE);
|
let client = create_client(node.client_facing_addr(), VALIDATOR_PORT_RANGE);
|
||||||
assert!(client.fullnode_exit().is_err());
|
assert!(client.validator_exit().is_err());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ pub fn kill_entry_and_spend_and_verify_rest(
|
||||||
));
|
));
|
||||||
info!("done sleeping for first 2 warmup epochs");
|
info!("done sleeping for first 2 warmup epochs");
|
||||||
info!("killing entry point: {}", entry_point_info.id);
|
info!("killing entry point: {}", entry_point_info.id);
|
||||||
assert!(client.fullnode_exit().unwrap());
|
assert!(client.validator_exit().unwrap());
|
||||||
info!("sleeping for some time");
|
info!("sleeping for some time");
|
||||||
sleep(Duration::from_millis(
|
sleep(Duration::from_millis(
|
||||||
slot_millis * NUM_CONSECUTIVE_LEADER_SLOTS,
|
slot_millis * NUM_CONSECUTIVE_LEADER_SLOTS,
|
||||||
|
|
|
@ -58,7 +58,7 @@ impl ReplicatorInfo {
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct ClusterConfig {
|
pub struct ClusterConfig {
|
||||||
/// The fullnode config that should be applied to every node in the cluster
|
/// The validator config that should be applied to every node in the cluster
|
||||||
pub validator_configs: Vec<ValidatorConfig>,
|
pub validator_configs: Vec<ValidatorConfig>,
|
||||||
/// Number of replicators in the cluster
|
/// Number of replicators in the cluster
|
||||||
/// Note- replicators will timeout if ticks_per_slot is much larger than the default 8
|
/// Note- replicators will timeout if ticks_per_slot is much larger than the default 8
|
||||||
|
@ -100,9 +100,9 @@ pub struct LocalCluster {
|
||||||
pub funding_keypair: Keypair,
|
pub funding_keypair: Keypair,
|
||||||
/// Entry point from which the rest of the network can be discovered
|
/// Entry point from which the rest of the network can be discovered
|
||||||
pub entry_point_info: ContactInfo,
|
pub entry_point_info: ContactInfo,
|
||||||
pub fullnode_infos: HashMap<Pubkey, ClusterValidatorInfo>,
|
pub validator_infos: HashMap<Pubkey, ClusterValidatorInfo>,
|
||||||
pub listener_infos: HashMap<Pubkey, ClusterValidatorInfo>,
|
pub listener_infos: HashMap<Pubkey, ClusterValidatorInfo>,
|
||||||
fullnodes: HashMap<Pubkey, Validator>,
|
validators: HashMap<Pubkey, Validator>,
|
||||||
pub genesis_block: GenesisBlock,
|
pub genesis_block: GenesisBlock,
|
||||||
replicators: Vec<Replicator>,
|
replicators: Vec<Replicator>,
|
||||||
pub replicator_infos: HashMap<Pubkey, ReplicatorInfo>,
|
pub replicator_infos: HashMap<Pubkey, ReplicatorInfo>,
|
||||||
|
@ -190,9 +190,9 @@ impl LocalCluster {
|
||||||
&config.validator_configs[0],
|
&config.validator_configs[0],
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut fullnodes = HashMap::new();
|
let mut validators = HashMap::new();
|
||||||
let mut fullnode_infos = HashMap::new();
|
let mut validator_infos = HashMap::new();
|
||||||
fullnodes.insert(leader_pubkey, leader_server);
|
validators.insert(leader_pubkey, leader_server);
|
||||||
let leader_info = ValidatorInfo {
|
let leader_info = ValidatorInfo {
|
||||||
keypair: leader_keypair,
|
keypair: leader_keypair,
|
||||||
voting_keypair: leader_voting_keypair,
|
voting_keypair: leader_voting_keypair,
|
||||||
|
@ -204,15 +204,15 @@ impl LocalCluster {
|
||||||
let cluster_leader =
|
let cluster_leader =
|
||||||
ClusterValidatorInfo::new(leader_info, config.validator_configs[0].clone());
|
ClusterValidatorInfo::new(leader_info, config.validator_configs[0].clone());
|
||||||
|
|
||||||
fullnode_infos.insert(leader_pubkey, cluster_leader);
|
validator_infos.insert(leader_pubkey, cluster_leader);
|
||||||
|
|
||||||
let mut cluster = Self {
|
let mut cluster = Self {
|
||||||
funding_keypair: mint_keypair,
|
funding_keypair: mint_keypair,
|
||||||
entry_point_info: leader_contact_info,
|
entry_point_info: leader_contact_info,
|
||||||
fullnodes,
|
validators,
|
||||||
replicators: vec![],
|
replicators: vec![],
|
||||||
genesis_block,
|
genesis_block,
|
||||||
fullnode_infos,
|
validator_infos,
|
||||||
replicator_infos: HashMap::new(),
|
replicator_infos: HashMap::new(),
|
||||||
listener_infos: HashMap::new(),
|
listener_infos: HashMap::new(),
|
||||||
};
|
};
|
||||||
|
@ -250,14 +250,14 @@ impl LocalCluster {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn exit(&mut self) {
|
pub fn exit(&mut self) {
|
||||||
for node in self.fullnodes.values_mut() {
|
for node in self.validators.values_mut() {
|
||||||
node.exit();
|
node.exit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn close_preserve_ledgers(&mut self) {
|
pub fn close_preserve_ledgers(&mut self) {
|
||||||
self.exit();
|
self.exit();
|
||||||
for (_, node) in self.fullnodes.drain() {
|
for (_, node) in self.validators.drain() {
|
||||||
node.join().unwrap();
|
node.join().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ impl LocalCluster {
|
||||||
&validator_config,
|
&validator_config,
|
||||||
);
|
);
|
||||||
|
|
||||||
self.fullnodes
|
self.validators
|
||||||
.insert(validator_keypair.pubkey(), validator_server);
|
.insert(validator_keypair.pubkey(), validator_server);
|
||||||
let validator_pubkey = validator_keypair.pubkey();
|
let validator_pubkey = validator_keypair.pubkey();
|
||||||
let validator_info = ClusterValidatorInfo::new(
|
let validator_info = ClusterValidatorInfo::new(
|
||||||
|
@ -339,7 +339,8 @@ impl LocalCluster {
|
||||||
if validator_config.voting_disabled {
|
if validator_config.voting_disabled {
|
||||||
self.listener_infos.insert(validator_pubkey, validator_info);
|
self.listener_infos.insert(validator_pubkey, validator_info);
|
||||||
} else {
|
} else {
|
||||||
self.fullnode_infos.insert(validator_pubkey, validator_info);
|
self.validator_infos
|
||||||
|
.insert(validator_pubkey, validator_info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,7 +385,7 @@ impl LocalCluster {
|
||||||
fn close(&mut self) {
|
fn close(&mut self) {
|
||||||
self.close_preserve_ledgers();
|
self.close_preserve_ledgers();
|
||||||
for ledger_path in self
|
for ledger_path in self
|
||||||
.fullnode_infos
|
.validator_infos
|
||||||
.values()
|
.values()
|
||||||
.map(|f| &f.info.ledger_path)
|
.map(|f| &f.info.ledger_path)
|
||||||
.chain(self.replicator_infos.values().map(|info| &info.ledger_path))
|
.chain(self.replicator_infos.values().map(|info| &info.ledger_path))
|
||||||
|
@ -567,11 +568,11 @@ impl LocalCluster {
|
||||||
|
|
||||||
impl Cluster for LocalCluster {
|
impl Cluster for LocalCluster {
|
||||||
fn get_node_pubkeys(&self) -> Vec<Pubkey> {
|
fn get_node_pubkeys(&self) -> Vec<Pubkey> {
|
||||||
self.fullnodes.keys().cloned().collect()
|
self.validators.keys().cloned().collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_validator_client(&self, pubkey: &Pubkey) -> Option<ThinClient> {
|
fn get_validator_client(&self, pubkey: &Pubkey) -> Option<ThinClient> {
|
||||||
self.fullnode_infos.get(pubkey).map(|f| {
|
self.validator_infos.get(pubkey).map(|f| {
|
||||||
create_client(
|
create_client(
|
||||||
f.info.contact_info.client_facing_addr(),
|
f.info.contact_info.client_facing_addr(),
|
||||||
VALIDATOR_PORT_RANGE,
|
VALIDATOR_PORT_RANGE,
|
||||||
|
@ -580,13 +581,13 @@ impl Cluster for LocalCluster {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exit_node(&mut self, pubkey: &Pubkey) -> ClusterValidatorInfo {
|
fn exit_node(&mut self, pubkey: &Pubkey) -> ClusterValidatorInfo {
|
||||||
let mut node = self.fullnodes.remove(&pubkey).unwrap();
|
let mut node = self.validators.remove(&pubkey).unwrap();
|
||||||
|
|
||||||
// Shut down the fullnode
|
// Shut down the validator
|
||||||
node.exit();
|
node.exit();
|
||||||
node.join().unwrap();
|
node.join().unwrap();
|
||||||
|
|
||||||
self.fullnode_infos.remove(&pubkey).unwrap()
|
self.validator_infos.remove(&pubkey).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn restart_node(&mut self, pubkey: &Pubkey, mut cluster_validator_info: ClusterValidatorInfo) {
|
fn restart_node(&mut self, pubkey: &Pubkey, mut cluster_validator_info: ClusterValidatorInfo) {
|
||||||
|
@ -604,22 +605,22 @@ impl Cluster for LocalCluster {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Restart the node
|
// Restart the node
|
||||||
let fullnode_info = &cluster_validator_info.info;
|
let validator_info = &cluster_validator_info.info;
|
||||||
|
|
||||||
let restarted_node = Validator::new(
|
let restarted_node = Validator::new(
|
||||||
node,
|
node,
|
||||||
&fullnode_info.keypair,
|
&validator_info.keypair,
|
||||||
&fullnode_info.ledger_path,
|
&validator_info.ledger_path,
|
||||||
&fullnode_info.voting_keypair.pubkey(),
|
&validator_info.voting_keypair.pubkey(),
|
||||||
&fullnode_info.voting_keypair,
|
&validator_info.voting_keypair,
|
||||||
&fullnode_info.storage_keypair,
|
&validator_info.storage_keypair,
|
||||||
entry_point_info,
|
entry_point_info,
|
||||||
true,
|
true,
|
||||||
&cluster_validator_info.config,
|
&cluster_validator_info.config,
|
||||||
);
|
);
|
||||||
|
|
||||||
self.fullnodes.insert(*pubkey, restarted_node);
|
self.validators.insert(*pubkey, restarted_node);
|
||||||
self.fullnode_infos.insert(*pubkey, cluster_validator_info);
|
self.validator_infos.insert(*pubkey, cluster_validator_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exit_restart_node(&mut self, pubkey: &Pubkey, validator_config: ValidatorConfig) {
|
fn exit_restart_node(&mut self, pubkey: &Pubkey, validator_config: ValidatorConfig) {
|
||||||
|
@ -646,7 +647,7 @@ mod test {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
let num_nodes = 1;
|
let num_nodes = 1;
|
||||||
let cluster = LocalCluster::new_with_equal_stakes(num_nodes, 100, 3);
|
let cluster = LocalCluster::new_with_equal_stakes(num_nodes, 100, 3);
|
||||||
assert_eq!(cluster.fullnodes.len(), num_nodes);
|
assert_eq!(cluster.validators.len(), num_nodes);
|
||||||
assert_eq!(cluster.replicators.len(), 0);
|
assert_eq!(cluster.replicators.len(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -654,7 +655,7 @@ mod test {
|
||||||
fn test_local_cluster_start_and_exit_with_config() {
|
fn test_local_cluster_start_and_exit_with_config() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
let mut validator_config = ValidatorConfig::default();
|
let mut validator_config = ValidatorConfig::default();
|
||||||
validator_config.rpc_config.enable_fullnode_exit = true;
|
validator_config.rpc_config.enable_validator_exit = true;
|
||||||
validator_config.storage_slots_per_turn = SLOTS_PER_TURN_TEST;
|
validator_config.storage_slots_per_turn = SLOTS_PER_TURN_TEST;
|
||||||
const NUM_NODES: usize = 1;
|
const NUM_NODES: usize = 1;
|
||||||
let num_replicators = 1;
|
let num_replicators = 1;
|
||||||
|
@ -668,7 +669,7 @@ mod test {
|
||||||
..ClusterConfig::default()
|
..ClusterConfig::default()
|
||||||
};
|
};
|
||||||
let cluster = LocalCluster::new(&config);
|
let cluster = LocalCluster::new(&config);
|
||||||
assert_eq!(cluster.fullnodes.len(), NUM_NODES);
|
assert_eq!(cluster.validators.len(), NUM_NODES);
|
||||||
assert_eq!(cluster.replicators.len(), num_replicators);
|
assert_eq!(cluster.replicators.len(), num_replicators);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ fn test_ledger_cleanup_service() {
|
||||||
);
|
);
|
||||||
cluster.close_preserve_ledgers();
|
cluster.close_preserve_ledgers();
|
||||||
//check everyone's ledgers and make sure only ~100 slots are stored
|
//check everyone's ledgers and make sure only ~100 slots are stored
|
||||||
for (_, info) in &cluster.fullnode_infos {
|
for (_, info) in &cluster.validator_infos {
|
||||||
let mut slots = 0;
|
let mut slots = 0;
|
||||||
let blocktree = Blocktree::open(&info.info.ledger_path).unwrap();
|
let blocktree = Blocktree::open(&info.info.ledger_path).unwrap();
|
||||||
blocktree
|
blocktree
|
||||||
|
@ -130,22 +130,22 @@ fn test_spend_and_verify_all_nodes_env_num_nodes() {
|
||||||
#[allow(unused_attributes)]
|
#[allow(unused_attributes)]
|
||||||
#[test]
|
#[test]
|
||||||
#[should_panic]
|
#[should_panic]
|
||||||
fn test_fullnode_exit_default_config_should_panic() {
|
fn test_validator_exit_default_config_should_panic() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
error!("test_fullnode_exit_default_config_should_panic");
|
error!("test_validator_exit_default_config_should_panic");
|
||||||
let num_nodes = 2;
|
let num_nodes = 2;
|
||||||
let local = LocalCluster::new_with_equal_stakes(num_nodes, 10_000, 100);
|
let local = LocalCluster::new_with_equal_stakes(num_nodes, 10_000, 100);
|
||||||
cluster_tests::fullnode_exit(&local.entry_point_info, num_nodes);
|
cluster_tests::validator_exit(&local.entry_point_info, num_nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[serial]
|
#[serial]
|
||||||
fn test_fullnode_exit_2() {
|
fn test_validator_exit_2() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
error!("test_fullnode_exit_2");
|
error!("test_validator_exit_2");
|
||||||
let num_nodes = 2;
|
let num_nodes = 2;
|
||||||
let mut validator_config = ValidatorConfig::default();
|
let mut validator_config = ValidatorConfig::default();
|
||||||
validator_config.rpc_config.enable_fullnode_exit = true;
|
validator_config.rpc_config.enable_validator_exit = true;
|
||||||
let config = ClusterConfig {
|
let config = ClusterConfig {
|
||||||
cluster_lamports: 10_000,
|
cluster_lamports: 10_000,
|
||||||
node_stakes: vec![100; num_nodes],
|
node_stakes: vec![100; num_nodes],
|
||||||
|
@ -153,7 +153,7 @@ fn test_fullnode_exit_2() {
|
||||||
..ClusterConfig::default()
|
..ClusterConfig::default()
|
||||||
};
|
};
|
||||||
let local = LocalCluster::new(&config);
|
let local = LocalCluster::new(&config);
|
||||||
cluster_tests::fullnode_exit(&local.entry_point_info, num_nodes);
|
cluster_tests::validator_exit(&local.entry_point_info, num_nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cluster needs a supermajority to remain, so the minimum size for this test is 4
|
// Cluster needs a supermajority to remain, so the minimum size for this test is 4
|
||||||
|
@ -164,7 +164,7 @@ fn test_leader_failure_4() {
|
||||||
error!("test_leader_failure_4");
|
error!("test_leader_failure_4");
|
||||||
let num_nodes = 4;
|
let num_nodes = 4;
|
||||||
let mut validator_config = ValidatorConfig::default();
|
let mut validator_config = ValidatorConfig::default();
|
||||||
validator_config.rpc_config.enable_fullnode_exit = true;
|
validator_config.rpc_config.enable_validator_exit = true;
|
||||||
let config = ClusterConfig {
|
let config = ClusterConfig {
|
||||||
cluster_lamports: 10_000,
|
cluster_lamports: 10_000,
|
||||||
node_stakes: vec![100; 4],
|
node_stakes: vec![100; 4],
|
||||||
|
@ -189,7 +189,7 @@ fn test_two_unbalanced_stakes() {
|
||||||
let num_ticks_per_slot = 10;
|
let num_ticks_per_slot = 10;
|
||||||
let num_slots_per_epoch = MINIMUM_SLOTS_PER_EPOCH as u64;
|
let num_slots_per_epoch = MINIMUM_SLOTS_PER_EPOCH as u64;
|
||||||
|
|
||||||
validator_config.rpc_config.enable_fullnode_exit = true;
|
validator_config.rpc_config.enable_validator_exit = true;
|
||||||
let mut cluster = LocalCluster::new(&ClusterConfig {
|
let mut cluster = LocalCluster::new(&ClusterConfig {
|
||||||
node_stakes: vec![999_990, 3],
|
node_stakes: vec![999_990, 3],
|
||||||
cluster_lamports: 1_000_000,
|
cluster_lamports: 1_000_000,
|
||||||
|
@ -208,7 +208,7 @@ fn test_two_unbalanced_stakes() {
|
||||||
);
|
);
|
||||||
cluster.close_preserve_ledgers();
|
cluster.close_preserve_ledgers();
|
||||||
let leader_pubkey = cluster.entry_point_info.id;
|
let leader_pubkey = cluster.entry_point_info.id;
|
||||||
let leader_ledger = cluster.fullnode_infos[&leader_pubkey]
|
let leader_ledger = cluster.validator_infos[&leader_pubkey]
|
||||||
.info
|
.info
|
||||||
.ledger_path
|
.ledger_path
|
||||||
.clone();
|
.clone();
|
||||||
|
@ -430,7 +430,7 @@ fn test_snapshots_blocktree_floor() {
|
||||||
|
|
||||||
// Check the validator ledger doesn't contain any slots < slot_floor
|
// Check the validator ledger doesn't contain any slots < slot_floor
|
||||||
cluster.close_preserve_ledgers();
|
cluster.close_preserve_ledgers();
|
||||||
let validator_ledger_path = &cluster.fullnode_infos[&validator_id];
|
let validator_ledger_path = &cluster.validator_infos[&validator_id];
|
||||||
let blocktree = Blocktree::open(&validator_ledger_path.info.ledger_path).unwrap();
|
let blocktree = Blocktree::open(&validator_ledger_path.info.ledger_path).unwrap();
|
||||||
|
|
||||||
// Skip the zeroth slot in blocktree that the ledger is initialized with
|
// Skip the zeroth slot in blocktree that the ledger is initialized with
|
||||||
|
@ -490,7 +490,7 @@ fn test_snapshots_restart_validity() {
|
||||||
let tar = snapshot_utils::get_snapshot_tar_path(&snapshot_package_output_path);
|
let tar = snapshot_utils::get_snapshot_tar_path(&snapshot_package_output_path);
|
||||||
wait_for_next_snapshot(&cluster, &tar);
|
wait_for_next_snapshot(&cluster, &tar);
|
||||||
|
|
||||||
// Create new account paths since fullnode exit is not guaranteed to cleanup RPC threads,
|
// Create new account paths since validator exit is not guaranteed to cleanup RPC threads,
|
||||||
// which may delete the old accounts on exit at any point
|
// which may delete the old accounts on exit at any point
|
||||||
let (new_account_storage_dirs, new_account_storage_paths) =
|
let (new_account_storage_dirs, new_account_storage_paths) =
|
||||||
generate_account_paths(num_account_paths);
|
generate_account_paths(num_account_paths);
|
||||||
|
@ -566,7 +566,7 @@ fn test_faulty_node(faulty_node_type: BroadcastStageType) {
|
||||||
);
|
);
|
||||||
|
|
||||||
let corrupt_node = cluster
|
let corrupt_node = cluster
|
||||||
.fullnode_infos
|
.validator_infos
|
||||||
.iter()
|
.iter()
|
||||||
.find(|(_, v)| v.config.broadcast_stage_type == faulty_node_type)
|
.find(|(_, v)| v.config.broadcast_stage_type == faulty_node_type)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -616,7 +616,7 @@ fn run_repairman_catchup(num_repairmen: u64) {
|
||||||
// their root could actually be much less than 31. This is why we give a num_root_buffer_slots buffer.
|
// their root could actually be much less than 31. This is why we give a num_root_buffer_slots buffer.
|
||||||
let stakers_slot_offset = num_slots_per_epoch + num_root_buffer_slots;
|
let stakers_slot_offset = num_slots_per_epoch + num_root_buffer_slots;
|
||||||
|
|
||||||
validator_config.rpc_config.enable_fullnode_exit = true;
|
validator_config.rpc_config.enable_validator_exit = true;
|
||||||
|
|
||||||
let lamports_per_repairman = 1000;
|
let lamports_per_repairman = 1000;
|
||||||
|
|
||||||
|
@ -740,7 +740,7 @@ fn setup_snapshot_validator_config(
|
||||||
|
|
||||||
// Create the validator config
|
// Create the validator config
|
||||||
let mut validator_config = ValidatorConfig::default();
|
let mut validator_config = ValidatorConfig::default();
|
||||||
validator_config.rpc_config.enable_fullnode_exit = true;
|
validator_config.rpc_config.enable_validator_exit = true;
|
||||||
validator_config.snapshot_config = Some(snapshot_config);
|
validator_config.snapshot_config = Some(snapshot_config);
|
||||||
validator_config.account_paths = Some(account_storage_paths);
|
validator_config.account_paths = Some(account_storage_paths);
|
||||||
|
|
||||||
|
|
|
@ -4815,7 +4815,7 @@
|
||||||
},
|
},
|
||||||
"id": 41,
|
"id": 41,
|
||||||
"panels": [],
|
"panels": [],
|
||||||
"title": "Fullnode Streamer",
|
"title": "Validator Streamer",
|
||||||
"type": "row"
|
"type": "row"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
"FromPort": 8000,
|
"FromPort": 8000,
|
||||||
"IpRanges": [
|
"IpRanges": [
|
||||||
{
|
{
|
||||||
"Description": "fullnode UDP range",
|
"Description": "validator UDP range",
|
||||||
"CidrIp": "0.0.0.0/0"
|
"CidrIp": "0.0.0.0/0"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
"Ipv6Ranges": [
|
"Ipv6Ranges": [
|
||||||
{
|
{
|
||||||
"CidrIpv6": "::/0",
|
"CidrIpv6": "::/0",
|
||||||
"Description": "fullnode UDP range"
|
"Description": "validator UDP range"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -100,7 +100,7 @@
|
||||||
"FromPort": 8000,
|
"FromPort": 8000,
|
||||||
"IpRanges": [
|
"IpRanges": [
|
||||||
{
|
{
|
||||||
"Description": "fullnode TCP range",
|
"Description": "validator TCP range",
|
||||||
"CidrIp": "0.0.0.0/0"
|
"CidrIp": "0.0.0.0/0"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -110,7 +110,7 @@
|
||||||
"Ipv6Ranges": [
|
"Ipv6Ranges": [
|
||||||
{
|
{
|
||||||
"CidrIpv6": "::/0",
|
"CidrIpv6": "::/0",
|
||||||
"Description": "fullnode TCP range"
|
"Description": "validator TCP range"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# |source| this file
|
# |source| this file
|
||||||
#
|
#
|
||||||
# Adjusts system settings for optimal fullnode performance
|
# Adjusts system settings for optimal validator performance
|
||||||
#
|
#
|
||||||
|
|
||||||
sysctl_write() {
|
sysctl_write() {
|
||||||
|
|
|
@ -335,7 +335,7 @@ pub fn main() {
|
||||||
Arg::with_name("enable_rpc_exit")
|
Arg::with_name("enable_rpc_exit")
|
||||||
.long("enable-rpc-exit")
|
.long("enable-rpc-exit")
|
||||||
.takes_value(false)
|
.takes_value(false)
|
||||||
.help("Enable the JSON RPC 'fullnodeExit' API. Only enable in a debug environment"),
|
.help("Enable the JSON RPC 'validatorExit' API. Only enable in a debug environment"),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("rpc_drone_addr")
|
Arg::with_name("rpc_drone_addr")
|
||||||
|
@ -457,7 +457,7 @@ pub fn main() {
|
||||||
|
|
||||||
validator_config.voting_disabled = matches.is_present("no_voting");
|
validator_config.voting_disabled = matches.is_present("no_voting");
|
||||||
|
|
||||||
validator_config.rpc_config.enable_fullnode_exit = matches.is_present("enable_rpc_exit");
|
validator_config.rpc_config.enable_validator_exit = matches.is_present("enable_rpc_exit");
|
||||||
|
|
||||||
validator_config.rpc_config.drone_addr = matches.value_of("rpc_drone_addr").map(|address| {
|
validator_config.rpc_config.drone_addr = matches.value_of("rpc_drone_addr").map(|address| {
|
||||||
solana_netutil::parse_host_port(address).expect("failed to parse drone address")
|
solana_netutil::parse_host_port(address).expect("failed to parse drone address")
|
||||||
|
|
Loading…
Reference in New Issue