Admin RPC Service: move post-init activation to before wait-for-supermajority (#30544)

* Move AdminRpcRequestMetadataPostInit to solana-core

* Move AdminRpcRequestMetadataPostInit write to just before wait_for_supermajority

* Pass AdminRpcRequestMetadataPostInit in TestValidatorGenesis

* Fixup local-cluster
This commit is contained in:
Tyera 2023-03-01 21:38:11 -05:00 committed by GitHub
parent fbcb82dcf8
commit 7b1d446001
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 46 additions and 27 deletions

View File

@ -0,0 +1,17 @@
use {
solana_gossip::cluster_info::ClusterInfo,
solana_runtime::bank_forks::BankForks,
solana_sdk::pubkey::Pubkey,
std::{
collections::HashSet,
sync::{Arc, RwLock},
},
};
#[derive(Clone)]
pub struct AdminRpcRequestMetadataPostInit {
pub cluster_info: Arc<ClusterInfo>,
pub bank_forks: Arc<RwLock<BankForks>>,
pub vote_account: Pubkey,
pub repair_whitelist: Arc<RwLock<HashSet<Pubkey>>>,
}

View File

@ -9,6 +9,7 @@
//!
pub mod accounts_hash_verifier;
pub mod admin_rpc_post_init;
pub mod ancestor_hashes_service;
pub mod banking_stage;
pub mod banking_trace;

View File

@ -4,6 +4,7 @@ pub use solana_perf::report_target_features;
use {
crate::{
accounts_hash_verifier::AccountsHashVerifier,
admin_rpc_post_init::AdminRpcRequestMetadataPostInit,
banking_trace::{self, BankingTracer},
broadcast_stage::BroadcastStageType,
cache_block_meta_service::{CacheBlockMetaSender, CacheBlockMetaService},
@ -395,6 +396,7 @@ impl Validator {
use_quic: bool,
tpu_connection_pool_size: usize,
tpu_enable_udp: bool,
admin_rpc_service_post_init: Arc<RwLock<Option<AdminRpcRequestMetadataPostInit>>>,
) -> Result<Self, String> {
let id = identity_keypair.pubkey();
assert_eq!(&id, node.info.pubkey());
@ -908,6 +910,13 @@ impl Validator {
exit.clone(),
);
*admin_rpc_service_post_init.write().unwrap() = Some(AdminRpcRequestMetadataPostInit {
bank_forks: bank_forks.clone(),
cluster_info: cluster_info.clone(),
vote_account: *vote_account,
repair_whitelist: config.repair_whitelist.clone(),
});
let waited_for_supermajority = match wait_for_supermajority(
config,
Some(&mut process_blockstore),
@ -2147,6 +2156,7 @@ mod tests {
DEFAULT_TPU_USE_QUIC,
DEFAULT_TPU_CONNECTION_POOL_SIZE,
DEFAULT_TPU_ENABLE_UDP,
Arc::new(RwLock::new(None)),
)
.expect("assume successful validator start");
assert_eq!(
@ -2242,6 +2252,7 @@ mod tests {
DEFAULT_TPU_USE_QUIC,
DEFAULT_TPU_CONNECTION_POOL_SIZE,
DEFAULT_TPU_ENABLE_UDP,
Arc::new(RwLock::new(None)),
)
.expect("assume successful validator start")
})

View File

@ -288,6 +288,7 @@ impl LocalCluster {
DEFAULT_TPU_USE_QUIC,
DEFAULT_TPU_CONNECTION_POOL_SIZE,
DEFAULT_TPU_ENABLE_UDP,
Arc::new(RwLock::new(None)),
)
.expect("assume successful validator start");
@ -493,6 +494,7 @@ impl LocalCluster {
DEFAULT_TPU_USE_QUIC,
DEFAULT_TPU_CONNECTION_POOL_SIZE,
DEFAULT_TPU_ENABLE_UDP,
Arc::new(RwLock::new(None)),
)
.expect("assume successful validator start");
@ -865,6 +867,7 @@ impl Cluster for LocalCluster {
DEFAULT_TPU_USE_QUIC,
DEFAULT_TPU_CONNECTION_POOL_SIZE,
DEFAULT_TPU_ENABLE_UDP,
Arc::new(RwLock::new(None)),
)
.expect("assume successful validator start");
cluster_validator_info.validator = Some(restarted_node);

View File

@ -5,6 +5,7 @@ use {
solana_cli_output::CliAccount,
solana_client::rpc_request::MAX_MULTIPLE_ACCOUNTS,
solana_core::{
admin_rpc_post_init::AdminRpcRequestMetadataPostInit,
tower_storage::TowerStorage,
validator::{Validator, ValidatorConfig, ValidatorStartProgress},
},
@ -137,6 +138,7 @@ pub struct TestValidatorGenesis {
pub log_messages_bytes_limit: Option<usize>,
pub transaction_account_lock_limit: Option<usize>,
pub tpu_enable_udp: bool,
admin_rpc_service_post_init: Arc<RwLock<Option<AdminRpcRequestMetadataPostInit>>>,
}
impl Default for TestValidatorGenesis {
@ -170,6 +172,8 @@ impl Default for TestValidatorGenesis {
log_messages_bytes_limit: Option::<usize>::default(),
transaction_account_lock_limit: Option::<usize>::default(),
tpu_enable_udp: DEFAULT_TPU_ENABLE_UDP,
admin_rpc_service_post_init:
Arc::<RwLock<Option<AdminRpcRequestMetadataPostInit>>>::default(),
}
}
}
@ -950,6 +954,7 @@ impl TestValidator {
DEFAULT_TPU_USE_QUIC,
DEFAULT_TPU_CONNECTION_POOL_SIZE,
config.tpu_enable_udp,
config.admin_rpc_service_post_init.clone(),
)?);
// Needed to avoid panics in `solana-responder-gossip` in tests that create a number of

View File

@ -7,12 +7,13 @@ use {
log::*,
serde::{de::Deserializer, Deserialize, Serialize},
solana_core::{
consensus::Tower, tower_storage::TowerStorage, validator::ValidatorStartProgress,
admin_rpc_post_init::AdminRpcRequestMetadataPostInit, consensus::Tower,
tower_storage::TowerStorage, validator::ValidatorStartProgress,
},
solana_gossip::{cluster_info::ClusterInfo, contact_info::ContactInfo},
solana_gossip::contact_info::ContactInfo,
solana_rpc::rpc::verify_pubkey,
solana_rpc_client_api::{config::RpcAccountIndex, custom_error::RpcCustomError},
solana_runtime::{accounts_index::AccountIndex, bank_forks::BankForks},
solana_runtime::accounts_index::AccountIndex,
solana_sdk::{
exit::Exit,
pubkey::Pubkey,
@ -30,14 +31,6 @@ use {
},
};
#[derive(Clone)]
pub struct AdminRpcRequestMetadataPostInit {
pub cluster_info: Arc<ClusterInfo>,
pub bank_forks: Arc<RwLock<BankForks>>,
pub vote_account: Pubkey,
pub repair_whitelist: Arc<RwLock<HashSet<Pubkey>>>,
}
#[derive(Clone)]
pub struct AdminRpcRequestMetadata {
pub rpc_addr: Option<SocketAddr>,
@ -643,11 +636,13 @@ mod tests {
serde_json::Value,
solana_account_decoder::parse_token::spl_token_pubkey,
solana_core::tower_storage::NullTowerStorage,
solana_gossip::cluster_info::ClusterInfo,
solana_ledger::genesis_utils::{create_genesis_config, GenesisConfigInfo},
solana_rpc::rpc::create_validator_exit,
solana_runtime::{
accounts_index::AccountSecondaryIndexes,
bank::{Bank, BankTestConfig},
bank_forks::BankForks,
inline_spl_token,
secondary_index::MAX_NUM_LARGEST_INDEX_KEYS_RETURNED,
},

View File

@ -407,7 +407,7 @@ fn main() {
validator_exit: genesis.validator_exit.clone(),
authorized_voter_keypairs: genesis.authorized_voter_keypairs.clone(),
staked_nodes_overrides: genesis.staked_nodes_overrides.clone(),
post_init: admin_service_post_init.clone(),
post_init: admin_service_post_init,
tower_storage: tower_storage.clone(),
},
);
@ -561,13 +561,6 @@ fn main() {
match genesis.start_with_mint_address(mint_address, socket_addr_space) {
Ok(test_validator) => {
*admin_service_post_init.write().unwrap() =
Some(admin_rpc_service::AdminRpcRequestMetadataPostInit {
bank_forks: test_validator.bank_forks(),
cluster_info: test_validator.cluster_info(),
vote_account: test_validator.vote_account_address(),
repair_whitelist: test_validator.repair_whitelist(),
});
if let Some(dashboard) = dashboard {
dashboard.run(Duration::from_millis(250));
}

View File

@ -1194,7 +1194,7 @@ pub fn main() {
wait_for_supermajority: value_t!(matches, "wait_for_supermajority", Slot).ok(),
known_validators,
repair_validators,
repair_whitelist: repair_whitelist.clone(),
repair_whitelist,
gossip_validators,
wal_recovery_mode,
poh_verify: !matches.is_present("skip_poh_verify"),
@ -1687,18 +1687,12 @@ pub fn main() {
tpu_use_quic,
tpu_connection_pool_size,
tpu_enable_udp,
admin_service_post_init,
)
.unwrap_or_else(|e| {
error!("Failed to start validator: {:?}", e);
exit(1);
});
*admin_service_post_init.write().unwrap() =
Some(admin_rpc_service::AdminRpcRequestMetadataPostInit {
bank_forks: validator.bank_forks.clone(),
cluster_info: validator.cluster_info.clone(),
vote_account,
repair_whitelist,
});
if let Some(filename) = init_complete_file {
File::create(filename).unwrap_or_else(|_| {