Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit fb9d7d2

Browse files
committed
Add --bind-address and --rpc-bind-address validator arguments
1 parent d3b458d commit fb9d7d2

File tree

12 files changed

+189
-100
lines changed

12 files changed

+189
-100
lines changed

archiver-lib/src/archiver.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ use solana_storage_program::{
4747
};
4848
use std::{
4949
io::{self, ErrorKind},
50-
net::{SocketAddr, UdpSocket},
50+
net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket},
5151
path::{Path, PathBuf},
5252
result,
5353
sync::atomic::{AtomicBool, Ordering},
@@ -804,14 +804,15 @@ impl Archiver {
804804
blockstore: &Arc<Blockstore>,
805805
slots_per_segment: u64,
806806
) -> Result<u64> {
807+
let ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));
807808
// Create a client which downloads from the archiver and see that it
808809
// can respond with shreds.
809-
let start_slot = Self::get_archiver_segment_slot(archiver_info.storage_addr);
810+
let start_slot = Self::get_archiver_segment_slot(ip_addr, archiver_info.storage_addr);
810811
info!("Archiver download: start at {}", start_slot);
811812

812813
let exit = Arc::new(AtomicBool::new(false));
813814
let (s_reader, r_reader) = channel();
814-
let repair_socket = Arc::new(bind_in_range(VALIDATOR_PORT_RANGE).unwrap().1);
815+
let repair_socket = Arc::new(bind_in_range(ip_addr, VALIDATOR_PORT_RANGE).unwrap().1);
815816
let t_receiver = receiver(
816817
repair_socket.clone(),
817818
&exit,
@@ -908,8 +909,8 @@ impl Archiver {
908909
true
909910
}
910911

911-
fn get_archiver_segment_slot(to: SocketAddr) -> u64 {
912-
let (_port, socket) = bind_in_range(VALIDATOR_PORT_RANGE).unwrap();
912+
fn get_archiver_segment_slot(bind_ip_addr: IpAddr, to: SocketAddr) -> u64 {
913+
let (_port, socket) = bind_in_range(bind_ip_addr, VALIDATOR_PORT_RANGE).unwrap();
913914
socket
914915
.set_read_timeout(Some(Duration::from_secs(5)))
915916
.unwrap();

archiver/src/main.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ use solana_core::{
1313
contact_info::ContactInfo,
1414
};
1515
use solana_sdk::{commitment_config::CommitmentConfig, signature::Signer};
16-
use std::{net::SocketAddr, path::PathBuf, process::exit, sync::Arc};
16+
use std::{
17+
net::{IpAddr, Ipv4Addr, SocketAddr},
18+
path::PathBuf,
19+
process::exit,
20+
sync::Arc,
21+
};
1722

1823
fn main() {
1924
solana_logger::setup();
@@ -116,6 +121,7 @@ fn main() {
116121
&identity_keypair.pubkey(),
117122
&gossip_addr,
118123
VALIDATOR_PORT_RANGE,
124+
IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
119125
);
120126

121127
println!(

bench-streamer/src/main.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,16 @@ fn main() -> Result<()> {
6767
}
6868

6969
let mut port = 0;
70-
let mut addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0);
70+
let ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));
71+
let mut addr = SocketAddr::new(ip_addr, 0);
7172

7273
let exit = Arc::new(AtomicBool::new(false));
7374

7475
let mut read_channels = Vec::new();
7576
let mut read_threads = Vec::new();
7677
let recycler = PacketsRecycler::default();
7778
for _ in 0..num_sockets {
78-
let read = solana_net_utils::bind_to(port, false).unwrap();
79+
let read = solana_net_utils::bind_to(ip_addr, port, false).unwrap();
7980
read.set_read_timeout(Some(Duration::new(1, 0))).unwrap();
8081

8182
addr = read.local_addr().unwrap();

client/src/thin_client.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use solana_sdk::{
2626
};
2727
use std::{
2828
io,
29-
net::{SocketAddr, UdpSocket},
29+
net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket},
3030
sync::{
3131
atomic::{AtomicBool, AtomicUsize, Ordering},
3232
RwLock,
@@ -603,7 +603,8 @@ impl AsyncClient for ThinClient {
603603
}
604604

605605
pub fn create_client((rpc, tpu): (SocketAddr, SocketAddr), range: (u16, u16)) -> ThinClient {
606-
let (_, transactions_socket) = solana_net_utils::bind_in_range(range).unwrap();
606+
let (_, transactions_socket) =
607+
solana_net_utils::bind_in_range(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), range).unwrap();
607608
ThinClient::new(rpc, tpu, transactions_socket)
608609
}
609610

@@ -612,7 +613,8 @@ pub fn create_client_with_timeout(
612613
range: (u16, u16),
613614
timeout: Duration,
614615
) -> ThinClient {
615-
let (_, transactions_socket) = solana_net_utils::bind_in_range(range).unwrap();
616+
let (_, transactions_socket) =
617+
solana_net_utils::bind_in_range(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), range).unwrap();
616618
ThinClient::new_socket_with_timeout(rpc, tpu, transactions_socket, timeout)
617619
}
618620

core/src/cluster_info.rs

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,16 +1635,18 @@ impl ClusterInfo {
16351635
id: &Pubkey,
16361636
gossip_addr: &SocketAddr,
16371637
) -> (ContactInfo, UdpSocket, Option<TcpListener>) {
1638+
let bind_ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));
16381639
let (port, (gossip_socket, ip_echo)) =
1639-
Node::get_gossip_port(gossip_addr, VALIDATOR_PORT_RANGE);
1640+
Node::get_gossip_port(gossip_addr, VALIDATOR_PORT_RANGE, bind_ip_addr);
16401641
let contact_info = Self::gossip_contact_info(id, SocketAddr::new(gossip_addr.ip(), port));
16411642

16421643
(contact_info, gossip_socket, Some(ip_echo))
16431644
}
16441645

16451646
/// A Node with dummy ports to spy on gossip via pull requests
16461647
pub fn spy_node(id: &Pubkey) -> (ContactInfo, UdpSocket, Option<TcpListener>) {
1647-
let (_, gossip_socket) = bind_in_range(VALIDATOR_PORT_RANGE).unwrap();
1648+
let bind_ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));
1649+
let (_, gossip_socket) = bind_in_range(bind_ip_addr, VALIDATOR_PORT_RANGE).unwrap();
16481650
let contact_info = Self::spy_contact_info(id);
16491651

16501652
(contact_info, gossip_socket, None)
@@ -1759,16 +1761,18 @@ impl Node {
17591761
}
17601762
}
17611763
pub fn new_localhost_with_pubkey(pubkey: &Pubkey) -> Self {
1764+
let bind_ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));
17621765
let tpu = UdpSocket::bind("127.0.0.1:0").unwrap();
1763-
let (gossip_port, (gossip, ip_echo)) = bind_common_in_range((1024, 65535)).unwrap();
1766+
let (gossip_port, (gossip, ip_echo)) =
1767+
bind_common_in_range(bind_ip_addr, (1024, 65535)).unwrap();
17641768
let gossip_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), gossip_port);
17651769
let tvu = UdpSocket::bind("127.0.0.1:0").unwrap();
17661770
let tvu_forwards = UdpSocket::bind("127.0.0.1:0").unwrap();
17671771
let tpu_forwards = UdpSocket::bind("127.0.0.1:0").unwrap();
17681772
let repair = UdpSocket::bind("127.0.0.1:0").unwrap();
1769-
let rpc_port = find_available_port_in_range((1024, 65535)).unwrap();
1773+
let rpc_port = find_available_port_in_range(bind_ip_addr, (1024, 65535)).unwrap();
17701774
let rpc_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), rpc_port);
1771-
let rpc_pubsub_port = find_available_port_in_range((1024, 65535)).unwrap();
1775+
let rpc_pubsub_port = find_available_port_in_range(bind_ip_addr, (1024, 65535)).unwrap();
17721776
let rpc_pubsub_addr =
17731777
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), rpc_pubsub_port);
17741778

@@ -1811,45 +1815,52 @@ impl Node {
18111815
fn get_gossip_port(
18121816
gossip_addr: &SocketAddr,
18131817
port_range: PortRange,
1818+
bind_ip_addr: IpAddr,
18141819
) -> (u16, (UdpSocket, TcpListener)) {
18151820
if gossip_addr.port() != 0 {
18161821
(
18171822
gossip_addr.port(),
1818-
bind_common(gossip_addr.port(), false).unwrap_or_else(|e| {
1823+
bind_common(bind_ip_addr, gossip_addr.port(), false).unwrap_or_else(|e| {
18191824
panic!("gossip_addr bind_to port {}: {}", gossip_addr.port(), e)
18201825
}),
18211826
)
18221827
} else {
1823-
bind_common_in_range(port_range).expect("Failed to bind")
1828+
bind_common_in_range(bind_ip_addr, port_range).expect("Failed to bind")
18241829
}
18251830
}
1826-
fn bind(port_range: PortRange) -> (u16, UdpSocket) {
1827-
bind_in_range(port_range).expect("Failed to bind")
1831+
fn bind(bind_ip_addr: IpAddr, port_range: PortRange) -> (u16, UdpSocket) {
1832+
bind_in_range(bind_ip_addr, port_range).expect("Failed to bind")
18281833
}
1834+
18291835
pub fn new_with_external_ip(
18301836
pubkey: &Pubkey,
18311837
gossip_addr: &SocketAddr,
18321838
port_range: PortRange,
1839+
bind_ip_addr: IpAddr,
18331840
) -> Node {
1834-
let (gossip_port, (gossip, ip_echo)) = Self::get_gossip_port(gossip_addr, port_range);
1841+
let (gossip_port, (gossip, ip_echo)) =
1842+
Self::get_gossip_port(gossip_addr, port_range, bind_ip_addr);
18351843

1836-
let (tvu_port, tvu_sockets) = multi_bind_in_range(port_range, 8).expect("tvu multi_bind");
1844+
let (tvu_port, tvu_sockets) =
1845+
multi_bind_in_range(bind_ip_addr, port_range, 8).expect("tvu multi_bind");
18371846

18381847
let (tvu_forwards_port, tvu_forwards_sockets) =
1839-
multi_bind_in_range(port_range, 8).expect("tvu_forwards multi_bind");
1848+
multi_bind_in_range(bind_ip_addr, port_range, 8).expect("tvu_forwards multi_bind");
18401849

1841-
let (tpu_port, tpu_sockets) = multi_bind_in_range(port_range, 32).expect("tpu multi_bind");
1850+
let (tpu_port, tpu_sockets) =
1851+
multi_bind_in_range(bind_ip_addr, port_range, 32).expect("tpu multi_bind");
18421852

18431853
let (tpu_forwards_port, tpu_forwards_sockets) =
1844-
multi_bind_in_range(port_range, 8).expect("tpu_forwards multi_bind");
1854+
multi_bind_in_range(bind_ip_addr, port_range, 8).expect("tpu_forwards multi_bind");
18451855

18461856
let (_, retransmit_sockets) =
1847-
multi_bind_in_range(port_range, 8).expect("retransmit multi_bind");
1857+
multi_bind_in_range(bind_ip_addr, port_range, 8).expect("retransmit multi_bind");
18481858

1849-
let (repair_port, repair) = Self::bind(port_range);
1850-
let (serve_repair_port, serve_repair) = Self::bind(port_range);
1859+
let (repair_port, repair) = Self::bind(bind_ip_addr, port_range);
1860+
let (serve_repair_port, serve_repair) = Self::bind(bind_ip_addr, port_range);
18511861

1852-
let (_, broadcast) = multi_bind_in_range(port_range, 4).expect("broadcast multi_bind");
1862+
let (_, broadcast) =
1863+
multi_bind_in_range(bind_ip_addr, port_range, 4).expect("broadcast multi_bind");
18531864

18541865
let info = ContactInfo {
18551866
id: *pubkey,
@@ -1889,9 +1900,10 @@ impl Node {
18891900
pubkey: &Pubkey,
18901901
gossip_addr: &SocketAddr,
18911902
port_range: PortRange,
1903+
bind_ip_addr: IpAddr,
18921904
) -> Node {
1893-
let mut new = Self::new_with_external_ip(pubkey, gossip_addr, port_range);
1894-
let (storage_port, storage_socket) = Self::bind(port_range);
1905+
let mut new = Self::new_with_external_ip(pubkey, gossip_addr, port_range, bind_ip_addr);
1906+
let (storage_port, storage_socket) = Self::bind(bind_ip_addr, port_range);
18951907

18961908
new.info.storage_addr = SocketAddr::new(gossip_addr.ip(), storage_port);
18971909
new.sockets.storage = Some(storage_socket);
@@ -2025,6 +2037,7 @@ mod tests {
20252037
&Pubkey::new_rand(),
20262038
&socketaddr!(ip, 0),
20272039
VALIDATOR_PORT_RANGE,
2040+
IpAddr::V4(ip),
20282041
);
20292042

20302043
check_node_sockets(&node, IpAddr::V4(ip), VALIDATOR_PORT_RANGE);
@@ -2034,14 +2047,15 @@ mod tests {
20342047
fn new_with_external_ip_test_gossip() {
20352048
let ip = IpAddr::V4(Ipv4Addr::from(0));
20362049
let port = {
2037-
bind_in_range(VALIDATOR_PORT_RANGE)
2050+
bind_in_range(ip, VALIDATOR_PORT_RANGE)
20382051
.expect("Failed to bind")
20392052
.0
20402053
};
20412054
let node = Node::new_with_external_ip(
20422055
&Pubkey::new_rand(),
20432056
&socketaddr!(0, port),
20442057
VALIDATOR_PORT_RANGE,
2058+
ip,
20452059
);
20462060

20472061
check_node_sockets(&node, ip, VALIDATOR_PORT_RANGE);
@@ -2056,6 +2070,7 @@ mod tests {
20562070
&Pubkey::new_rand(),
20572071
&socketaddr!(ip, 0),
20582072
VALIDATOR_PORT_RANGE,
2073+
IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
20592074
);
20602075

20612076
let ip = IpAddr::V4(ip);

core/src/gossip_service.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use solana_ledger::bank_forks::BankForks;
99
use solana_perf::recycler::Recycler;
1010
use solana_sdk::pubkey::Pubkey;
1111
use solana_sdk::signature::{Keypair, Signer};
12-
use std::net::{SocketAddr, TcpListener, UdpSocket};
12+
use std::net::{IpAddr, Ipv4Addr, SocketAddr, TcpListener, UdpSocket};
1313
use std::sync::atomic::{AtomicBool, Ordering};
1414
use std::sync::mpsc::channel;
1515
use std::sync::{Arc, RwLock};
@@ -163,7 +163,11 @@ pub fn get_multi_client(nodes: &[ContactInfo]) -> (ThinClient, usize) {
163163
.collect();
164164
let rpc_addrs: Vec<_> = addrs.iter().map(|addr| addr.0).collect();
165165
let tpu_addrs: Vec<_> = addrs.iter().map(|addr| addr.1).collect();
166-
let (_, transactions_socket) = solana_net_utils::bind_in_range(VALIDATOR_PORT_RANGE).unwrap();
166+
let (_, transactions_socket) = solana_net_utils::bind_in_range(
167+
IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
168+
VALIDATOR_PORT_RANGE,
169+
)
170+
.unwrap();
167171
let num_nodes = tpu_addrs.len();
168172
(
169173
ThinClient::new_from_addrs(rpc_addrs, tpu_addrs, transactions_socket),

core/src/local_vote_signer_service.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@ pub struct LocalVoteSignerService {
1515
impl LocalVoteSignerService {
1616
#[allow(clippy::new_ret_no_self)]
1717
pub fn new(port_range: PortRange) -> (Self, SocketAddr) {
18-
let addr = solana_net_utils::find_available_port_in_range(port_range)
19-
.map(|port| SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), port))
20-
.expect("Failed to find an available port for local vote signer service");
18+
let ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));
19+
let addr = SocketAddr::new(
20+
ip_addr,
21+
solana_net_utils::find_available_port_in_range(ip_addr, port_range)
22+
.expect("Failed to find an available port for local vote signer service"),
23+
);
2124
let exit = Arc::new(AtomicBool::new(false));
2225
let thread_exit = exit.clone();
2326
let thread = Builder::new()

core/src/retransmit_stage.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ mod tests {
284284
use solana_ledger::create_new_tmp_ledger;
285285
use solana_net_utils::find_available_port_in_range;
286286
use solana_sdk::pubkey::Pubkey;
287+
use std::net::{IpAddr, Ipv4Addr};
287288

288289
#[test]
289290
fn test_skip_repair() {
@@ -300,11 +301,12 @@ mod tests {
300301
let bank_forks = Arc::new(RwLock::new(bank_forks));
301302

302303
let mut me = ContactInfo::new_localhost(&Pubkey::new_rand(), 0);
303-
let port = find_available_port_in_range((8000, 10000)).unwrap();
304+
let ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));
305+
let port = find_available_port_in_range(ip_addr, (8000, 10000)).unwrap();
304306
let me_retransmit = UdpSocket::bind(format!("127.0.0.1:{}", port)).unwrap();
305307
// need to make sure tvu and tpu are valid addresses
306308
me.tvu_forwards = me_retransmit.local_addr().unwrap();
307-
let port = find_available_port_in_range((8000, 10000)).unwrap();
309+
let port = find_available_port_in_range(ip_addr, (8000, 10000)).unwrap();
308310
me.tvu = UdpSocket::bind(format!("127.0.0.1:{}", port))
309311
.unwrap()
310312
.local_addr()

core/src/rpc_service.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,10 @@ mod tests {
262262
let cluster_info = Arc::new(RwLock::new(ClusterInfo::new_with_invalid_keypair(
263263
ContactInfo::default(),
264264
)));
265+
let ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));
265266
let rpc_addr = SocketAddr::new(
266-
IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
267-
solana_net_utils::find_available_port_in_range((10000, 65535)).unwrap(),
267+
ip_addr,
268+
solana_net_utils::find_available_port_in_range(ip_addr, (10000, 65535)).unwrap(),
268269
);
269270
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank.slot(), bank)));
270271
let block_commitment_cache = Arc::new(RwLock::new(BlockCommitmentCache::default()));

gossip/src/main.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,11 @@ fn main() -> Result<(), Box<dyn error::Error>> {
197197
let gossip_addr = SocketAddr::new(
198198
gossip_host,
199199
value_t!(matches, "gossip_port", u16).unwrap_or_else(|_| {
200-
solana_net_utils::find_available_port_in_range((0, 1))
201-
.expect("unable to find an available gossip port")
200+
solana_net_utils::find_available_port_in_range(
201+
IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
202+
(0, 1),
203+
)
204+
.expect("unable to find an available gossip port")
202205
}),
203206
);
204207

0 commit comments

Comments
 (0)