fixes to RPC networking #721
2 changed files with 17 additions and 12 deletions
|
@ -38,6 +38,11 @@ pub(crate) type VersionTag = [u8; 16];
|
||||||
/// Value of the Netapp version used in the version tag
|
/// Value of the Netapp version used in the version tag
|
||||||
pub(crate) const NETAPP_VERSION_TAG: u64 = 0x6e65746170700005; // netapp 0x0005
|
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)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub(crate) struct HelloMessage {
|
pub(crate) struct HelloMessage {
|
||||||
pub server_addr: Option<IpAddr>,
|
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.
|
/// 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
|
/// 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.
|
/// 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 {
|
pub struct NetApp {
|
||||||
listen_params: ArcSwapOption<ListenParams>,
|
listen_params: ArcSwapOption<ListenParams>,
|
||||||
|
|
||||||
|
@ -83,7 +85,7 @@ pub struct NetApp {
|
||||||
|
|
||||||
struct ListenParams {
|
struct ListenParams {
|
||||||
listen_addr: SocketAddr,
|
listen_addr: SocketAddr,
|
||||||
public_addr: Option<IpAddr>,
|
public_addr: Option<SocketAddr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NetApp {
|
impl NetApp {
|
||||||
|
@ -180,7 +182,7 @@ impl NetApp {
|
||||||
pub async fn listen(
|
pub async fn listen(
|
||||||
self: Arc<Self>,
|
self: Arc<Self>,
|
||||||
listen_addr: SocketAddr,
|
listen_addr: SocketAddr,
|
||||||
public_addr: Option<IpAddr>,
|
public_addr: Option<SocketAddr>,
|
||||||
mut must_exit: watch::Receiver<bool>,
|
mut must_exit: watch::Receiver<bool>,
|
||||||
) {
|
) {
|
||||||
let listen_params = ListenParams {
|
let listen_params = ListenParams {
|
||||||
|
@ -396,8 +398,11 @@ impl NetApp {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(lp) = self.listen_params.load_full() {
|
if let Some(lp) = self.listen_params.load_full() {
|
||||||
let server_addr = lp.public_addr;
|
let server_addr = lp.public_addr.map(|x| x.ip());
|
||||||
let server_port = lp.listen_addr.port();
|
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();
|
let hello_endpoint = self.hello_endpoint.load_full().unwrap();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
hello_endpoint
|
hello_endpoint
|
||||||
|
|
|
@ -98,7 +98,6 @@ pub struct System {
|
||||||
system_endpoint: Arc<Endpoint<SystemRpc, System>>,
|
system_endpoint: Arc<Endpoint<SystemRpc, System>>,
|
||||||
|
|
||||||
rpc_listen_addr: SocketAddr,
|
rpc_listen_addr: SocketAddr,
|
||||||
#[cfg(any(feature = "consul-discovery", feature = "kubernetes-discovery"))]
|
|
||||||
rpc_public_addr: Option<SocketAddr>,
|
rpc_public_addr: Option<SocketAddr>,
|
||||||
bootstrap_peers: Vec<String>,
|
bootstrap_peers: Vec<String>,
|
||||||
|
|
||||||
|
@ -369,7 +368,6 @@ impl System {
|
||||||
replication_mode,
|
replication_mode,
|
||||||
replication_factor,
|
replication_factor,
|
||||||
rpc_listen_addr: config.rpc_bind_addr,
|
rpc_listen_addr: config.rpc_bind_addr,
|
||||||
#[cfg(any(feature = "consul-discovery", feature = "kubernetes-discovery"))]
|
|
||||||
rpc_public_addr,
|
rpc_public_addr,
|
||||||
bootstrap_peers: config.bootstrap_peers.clone(),
|
bootstrap_peers: config.bootstrap_peers.clone(),
|
||||||
#[cfg(feature = "consul-discovery")]
|
#[cfg(feature = "consul-discovery")]
|
||||||
|
@ -390,9 +388,11 @@ impl System {
|
||||||
/// Perform bootstraping, starting the ping loop
|
/// Perform bootstraping, starting the ping loop
|
||||||
pub async fn run(self: Arc<Self>, must_exit: watch::Receiver<bool>) {
|
pub async fn run(self: Arc<Self>, must_exit: watch::Receiver<bool>) {
|
||||||
join!(
|
join!(
|
||||||
self.netapp
|
self.netapp.clone().listen(
|
||||||
.clone()
|
self.rpc_listen_addr,
|
||||||
.listen(self.rpc_listen_addr, None, must_exit.clone()),
|
self.rpc_public_addr,
|
||||||
|
must_exit.clone()
|
||||||
|
),
|
||||||
self.peering.clone().run(must_exit.clone()),
|
self.peering.clone().run(must_exit.clone()),
|
||||||
self.discovery_loop(must_exit.clone()),
|
self.discovery_loop(must_exit.clone()),
|
||||||
self.status_exchange_loop(must_exit.clone()),
|
self.status_exchange_loop(must_exit.clone()),
|
||||||
|
|
Loading…
Reference in a new issue