aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2024-02-19 10:58:54 +0100
committerAlex Auvolat <alex@adnab.me>2024-02-19 11:45:44 +0100
commitf0bbad2db95b00ec429f498fe15f1007bd87da5e (patch)
tree1000524d2bc1a6c4bfb5b198c8f7242927b81c6a /src
parentb8217361c05883a839996a7db24be71c601e428f (diff)
downloadgarage-f0bbad2db95b00ec429f498fe15f1007bd87da5e.tar.gz
garage-f0bbad2db95b00ec429f498fe15f1007bd87da5e.zip
[networking-fixes] use rpc_public_addr in netapp's HelloMessage
Diffstat (limited to 'src')
-rw-r--r--src/net/netapp.rs19
-rw-r--r--src/rpc/system.rs10
2 files changed, 17 insertions, 12 deletions
diff --git a/src/net/netapp.rs b/src/net/netapp.rs
index b1ad9db8..e572dc11 100644
--- a/src/net/netapp.rs
+++ b/src/net/netapp.rs
@@ -38,6 +38,11 @@ pub(crate) type VersionTag = [u8; 16];
/// Value of the Netapp version used in the version tag
pub(crate) const NETAPP_VERSION_TAG: u64 = 0x6e65746170700005; // netapp 0x0005
+/// HelloMessage is sent by the client on a Netapp connection to indicate
+/// that they are also a server and ready to recieve incoming connections
+/// at the specified address and port. If the client doesn't know their
+/// public address, they don't need to specify it and we look at the
+/// remote address of the socket is used instead.
#[derive(Serialize, Deserialize, Debug)]
pub(crate) struct HelloMessage {
pub server_addr: Option<IpAddr>,
@@ -56,9 +61,6 @@ type OnDisconnectHandler = Box<dyn Fn(NodeID, bool) + Send + Sync>;
/// NetApp can be used in a stand-alone fashion or together with a peering strategy.
/// If using it alone, you will want to set `on_connect` and `on_disconnect` events
/// in order to manage information about the current peer list.
-///
-/// It is generally not necessary to use NetApp stand-alone, as the provided full mesh
-/// and RPS peering strategies take care of the most common use cases.
pub struct NetApp {
listen_params: ArcSwapOption<ListenParams>,
@@ -83,7 +85,7 @@ pub struct NetApp {
struct ListenParams {
listen_addr: SocketAddr,
- public_addr: Option<IpAddr>,
+ public_addr: Option<SocketAddr>,
}
impl NetApp {
@@ -180,7 +182,7 @@ impl NetApp {
pub async fn listen(
self: Arc<Self>,
listen_addr: SocketAddr,
- public_addr: Option<IpAddr>,
+ public_addr: Option<SocketAddr>,
mut must_exit: watch::Receiver<bool>,
) {
let listen_params = ListenParams {
@@ -396,8 +398,11 @@ impl NetApp {
}
if let Some(lp) = self.listen_params.load_full() {
- let server_addr = lp.public_addr;
- let server_port = lp.listen_addr.port();
+ let server_addr = lp.public_addr.map(|x| x.ip());
+ let server_port = lp
+ .public_addr
+ .map(|x| x.port())
+ .unwrap_or(lp.listen_addr.port());
let hello_endpoint = self.hello_endpoint.load_full().unwrap();
tokio::spawn(async move {
hello_endpoint
diff --git a/src/rpc/system.rs b/src/rpc/system.rs
index de44e656..5c6e07b1 100644
--- a/src/rpc/system.rs
+++ b/src/rpc/system.rs
@@ -98,7 +98,6 @@ pub struct System {
system_endpoint: Arc<Endpoint<SystemRpc, System>>,
rpc_listen_addr: SocketAddr,
- #[cfg(any(feature = "consul-discovery", feature = "kubernetes-discovery"))]
rpc_public_addr: Option<SocketAddr>,
bootstrap_peers: Vec<String>,
@@ -369,7 +368,6 @@ impl System {
replication_mode,
replication_factor,
rpc_listen_addr: config.rpc_bind_addr,
- #[cfg(any(feature = "consul-discovery", feature = "kubernetes-discovery"))]
rpc_public_addr,
bootstrap_peers: config.bootstrap_peers.clone(),
#[cfg(feature = "consul-discovery")]
@@ -390,9 +388,11 @@ impl System {
/// Perform bootstraping, starting the ping loop
pub async fn run(self: Arc<Self>, must_exit: watch::Receiver<bool>) {
join!(
- self.netapp
- .clone()
- .listen(self.rpc_listen_addr, None, must_exit.clone()),
+ self.netapp.clone().listen(
+ self.rpc_listen_addr,
+ self.rpc_public_addr,
+ must_exit.clone()
+ ),
self.peering.clone().run(must_exit.clone()),
self.discovery_loop(must_exit.clone()),
self.status_exchange_loop(must_exit.clone()),