validator: add `set-public-tpu-address` command (#30452)

This commit is contained in:
DimAn 2023-04-12 15:32:22 +02:00 committed by GitHub
parent 7f7351d763
commit 9136f80d36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 78 additions and 1 deletions

View File

@ -24,7 +24,7 @@ use {
cluster_info_metrics::{
submit_gossip_stats, Counter, GossipStats, ScopedTimer, TimedGuard,
},
contact_info::{ContactInfo, LegacyContactInfo},
contact_info::{ContactInfo, Error as ContactInfoError, LegacyContactInfo},
crds::{Crds, Cursor, GossipRoute},
crds_gossip::CrdsGossip,
crds_gossip_error::CrdsGossipError,
@ -677,6 +677,13 @@ impl ClusterInfo {
self.push_self();
}
pub fn set_tpu(&self, tpu_addr: SocketAddr) -> Result<(), ContactInfoError> {
self.my_contact_info.write().unwrap().set_tpu(tpu_addr)?;
self.insert_self();
self.push_self();
Ok(())
}
pub fn lookup_contact_info<F, Y>(&self, id: &Pubkey, map: F) -> Option<Y>
where
F: FnOnce(&LegacyContactInfo) -> Y,

View File

@ -226,6 +226,13 @@ pub trait AdminRpc {
secondary_index: RpcAccountIndex,
max_entries: usize,
) -> Result<Vec<(String, usize)>>;
#[rpc(meta, name = "setPublicTpuAddress")]
fn set_public_tpu_address(
&self,
meta: Self::Metadata,
public_tpu_addr: SocketAddr,
) -> Result<()>;
}
pub struct AdminRpcImpl;
@ -588,6 +595,30 @@ impl AdminRpc for AdminRpcImpl {
Ok(largest_keys)
})
}
fn set_public_tpu_address(
&self,
meta: Self::Metadata,
public_tpu_addr: SocketAddr,
) -> Result<()> {
debug!("set_public_tpu_address rpc request received: {public_tpu_addr}");
meta.with_post_init(|post_init| {
post_init
.cluster_info
.set_tpu(public_tpu_addr)
.map_err(|err| {
error!("Failed to set public TPU address to {public_tpu_addr}: {err}");
jsonrpc_core::error::Error::internal_error()
})?;
warn!(
"Public TPU addresses set to {} (udp) and {} (quic)",
post_init.cluster_info.my_contact_info().tpu().unwrap(),
post_init.cluster_info.my_contact_info().tpu_quic().unwrap(),
);
Ok(())
})
}
}
impl AdminRpcImpl {

View File

@ -1614,6 +1614,19 @@ pub fn app<'a>(version: &'a str, default_args: &'a DefaultArgs) -> App<'a, 'a> {
)
.after_help("Note: If this command exits with a non-zero status \
then this not a good time for a restart")
).
subcommand(
SubCommand::with_name("set-public-tpu-address")
.about("Specify TPU address to advertise in gossip")
.arg(
Arg::with_name("public_tpu_addr")
.index(1)
.value_name("HOST:PORT")
.takes_value(true)
.required(true)
.validator(solana_net_utils::is_host_port)
.help("TPU address to advertise in gossip")
),
);
}

View File

@ -835,6 +835,32 @@ pub fn main() {
_ => unreachable!(),
}
}
("set-public-tpu-address", Some(subcommand_matches)) => {
let public_tpu_addr: SocketAddr = subcommand_matches
.value_of("public_tpu_addr")
.map(|public_tpu_addr| {
solana_net_utils::parse_host_port(public_tpu_addr).unwrap_or_else(|err| {
eprintln!("Failed to parse --set-public-tpu-address HOST:PORT {err}");
exit(1);
})
})
.unwrap();
let admin_client = admin_rpc_service::connect(&ledger_path);
admin_rpc_service::runtime()
.block_on(async move {
admin_client
.await?
.set_public_tpu_address(public_tpu_addr)
.await
})
.unwrap_or_else(|err| {
println!("setPublicTpuAddress request failed: {err}");
exit(1);
});
return;
}
_ => unreachable!(),
};