Add --restricted-repair-only-mode flag

This commit is contained in:
Michael Vines 2020-09-10 13:15:22 -07:00
parent 3278d78f08
commit 63a67f415e
1 changed files with 63 additions and 25 deletions

View File

@ -607,6 +607,17 @@ pub fn main() {
.requires("entrypoint") .requires("entrypoint")
.help("Skip the RPC vote account sanity check") .help("Skip the RPC vote account sanity check")
) )
.arg(
Arg::with_name("restricted_repair_only_mode")
.long("restricted-repair-only-mode")
.takes_value(false)
.help("Do not publish the Gossip, TPU, TVU or Repair Service ports causing \
the validator to operate in a limited capacity that reduces its \
exposure to the rest of the cluster. \
\
The --no-voting flag is implicit when this flag is enabled \
"),
)
.arg( .arg(
Arg::with_name("dev_halt_at_slot") Arg::with_name("dev_halt_at_slot")
.long("dev-halt-at-slot") .long("dev-halt-at-slot")
@ -815,7 +826,8 @@ pub fn main() {
.requires("expected_bank_hash") .requires("expected_bank_hash")
.value_name("SLOT") .value_name("SLOT")
.validator(is_slot) .validator(is_slot)
.help("After processing the ledger and the next slot is SLOT, wait until a supermajority of stake is visible on gossip before starting PoH"), .help("After processing the ledger and the next slot is SLOT, wait until a \
supermajority of stake is visible on gossip before starting PoH"),
) )
.arg( .arg(
Arg::with_name("hard_forks") Arg::with_name("hard_forks")
@ -977,6 +989,8 @@ pub fn main() {
bind_address bind_address
}; };
let restricted_repair_only_mode = matches.is_present("restricted_repair_only_mode");
let mut validator_config = ValidatorConfig { let mut validator_config = ValidatorConfig {
dev_halt_at_slot: value_t!(matches, "dev_halt_at_slot", Slot).ok(), dev_halt_at_slot: value_t!(matches, "dev_halt_at_slot", Slot).ok(),
expected_genesis_hash: matches expected_genesis_hash: matches
@ -1011,7 +1025,7 @@ pub fn main() {
SocketAddr::new(rpc_bind_address, rpc_port + 3), SocketAddr::new(rpc_bind_address, rpc_port + 3),
) )
}), }),
voting_disabled: matches.is_present("no_voting"), voting_disabled: matches.is_present("no_voting") || restricted_repair_only_mode,
wait_for_supermajority: value_t!(matches, "wait_for_supermajority", Slot).ok(), wait_for_supermajority: value_t!(matches, "wait_for_supermajority", Slot).ok(),
trusted_validators, trusted_validators,
repair_validators, repair_validators,
@ -1022,8 +1036,10 @@ pub fn main() {
}; };
let vote_account = pubkey_of(&matches, "vote_account").unwrap_or_else(|| { let vote_account = pubkey_of(&matches, "vote_account").unwrap_or_else(|| {
if !validator_config.voting_disabled {
warn!("--vote-account not specified, validator will not vote"); warn!("--vote-account not specified, validator will not vote");
validator_config.voting_disabled = true; validator_config.voting_disabled = true;
}
Keypair::new().pubkey() Keypair::new().pubkey()
}); });
@ -1223,6 +1239,18 @@ pub fn main() {
bind_address, bind_address,
); );
if restricted_repair_only_mode {
let any = SocketAddr::new(std::net::IpAddr::V4(std::net::Ipv4Addr::new(0, 0, 0, 0)), 0);
// When in --restricted_repair_only_mode is enabled only the gossip and repair ports
// need to be reachable by the entrypoint to respond to gossip pull requests and repair
// requests initiated by the node. All other ports are unused.
node.info.tpu = any;
node.info.tpu_forwards = any;
node.info.tvu = any;
node.info.tvu_forwards = any;
node.info.serve_repair = any;
}
if !private_rpc { if !private_rpc {
if let Some((rpc_addr, rpc_pubsub_addr, rpc_banks_addr)) = validator_config.rpc_addrs { if let Some((rpc_addr, rpc_pubsub_addr, rpc_banks_addr)) = validator_config.rpc_addrs {
node.info.rpc = SocketAddr::new(node.info.gossip.ip(), rpc_addr.port()); node.info.rpc = SocketAddr::new(node.info.gossip.ip(), rpc_addr.port());
@ -1232,26 +1260,34 @@ pub fn main() {
} }
if let Some(ref cluster_entrypoint) = cluster_entrypoint { if let Some(ref cluster_entrypoint) = cluster_entrypoint {
let mut udp_sockets = vec![ let mut udp_sockets = vec![&node.sockets.gossip, &node.sockets.repair];
&node.sockets.gossip,
&node.sockets.repair, if ContactInfo::is_valid_address(&node.info.serve_repair) {
&node.sockets.serve_repair, udp_sockets.push(&node.sockets.serve_repair);
]; }
if ContactInfo::is_valid_address(&node.info.tpu) {
udp_sockets.extend(node.sockets.tpu.iter()); udp_sockets.extend(node.sockets.tpu.iter());
}
if ContactInfo::is_valid_address(&node.info.tpu_forwards) {
udp_sockets.extend(node.sockets.tpu_forwards.iter()); udp_sockets.extend(node.sockets.tpu_forwards.iter());
}
if ContactInfo::is_valid_address(&node.info.tvu) {
udp_sockets.extend(node.sockets.tvu.iter()); udp_sockets.extend(node.sockets.tvu.iter());
udp_sockets.extend(node.sockets.tvu_forwards.iter());
udp_sockets.extend(node.sockets.broadcast.iter()); udp_sockets.extend(node.sockets.broadcast.iter());
udp_sockets.extend(node.sockets.retransmit_sockets.iter()); udp_sockets.extend(node.sockets.retransmit_sockets.iter());
}
if ContactInfo::is_valid_address(&node.info.tvu_forwards) {
udp_sockets.extend(node.sockets.tvu_forwards.iter());
}
let mut tcp_listeners = vec![]; let mut tcp_listeners = vec![];
if !private_rpc {
if let Some((rpc_addr, rpc_pubsub_addr, rpc_banks_addr)) = validator_config.rpc_addrs { if let Some((rpc_addr, rpc_pubsub_addr, rpc_banks_addr)) = validator_config.rpc_addrs {
for (purpose, addr) in &[ for (purpose, addr) in &[
("RPC", rpc_addr), ("RPC", rpc_addr),
("RPC pubsub", rpc_pubsub_addr), ("RPC pubsub", rpc_pubsub_addr),
("RPC banks", rpc_banks_addr), ("RPC banks", rpc_banks_addr),
] { ] {
if ContactInfo::is_valid_address(&addr) {
tcp_listeners.push(( tcp_listeners.push((
addr.port(), addr.port(),
TcpListener::bind(addr).unwrap_or_else(|err| { TcpListener::bind(addr).unwrap_or_else(|err| {
@ -1268,9 +1304,11 @@ pub fn main() {
} }
} }
if !restricted_repair_only_mode {
if let Some(ip_echo) = &node.sockets.ip_echo { if let Some(ip_echo) = &node.sockets.ip_echo {
let ip_echo = ip_echo.try_clone().expect("unable to clone tcp_listener"); let ip_echo = ip_echo.try_clone().expect("unable to clone tcp_listener");
tcp_listeners.push((node.info.gossip.port(), ip_echo)); tcp_listeners.push((ip_echo.local_addr().unwrap().port(), ip_echo));
}
} }
if !solana_net_utils::verify_reachable_ports( if !solana_net_utils::verify_reachable_ports(