refactor checkpoint

This commit is contained in:
John Smith
2022-04-17 13:28:39 -04:00
parent 71f7017235
commit 5527740f6a
12 changed files with 392 additions and 196 deletions

View File

@@ -23,9 +23,9 @@ pub fn encode_node_info(
encode_dial_info(&node_info.dial_info_list[idx], &mut di_builder)?;
}
if let Some(rpi) = node_info.relay_peer_info {
if let Some(rpi) = &node_info.relay_peer_info {
let mut rpi_builder = builder.reborrow().init_relay_peer_info();
encode_peer_info(&rpi, &mut rpi_builder)?;
encode_peer_info(rpi, &mut rpi_builder)?;
}
Ok(())
@@ -46,7 +46,7 @@ pub fn decode_node_info(
&reader
.reborrow()
.get_outbound_protocols()
.map_err(map_error_capnp_notinschema!())?,
.map_err(map_error_capnp_error!())?,
)?;
let dil_reader = reader
@@ -69,7 +69,7 @@ pub fn decode_node_info(
&reader
.reborrow()
.get_relay_peer_info()
.map_err(map_error_capnp_notinschema!())?,
.map_err(map_error_capnp_error!())?,
false,
)?))
} else {

View File

@@ -6,8 +6,8 @@ pub fn encode_signal_info(
builder: &mut veilid_capnp::operation_signal::Builder,
) -> Result<(), RPCError> {
match signal_info {
SignalInfo::HolePunch { receipt, node_info } => {
let mut hp_builder = builder.init_hole_punch();
SignalInfo::HolePunch { receipt, peer_info } => {
let mut hp_builder = builder.reborrow().init_hole_punch();
let rcpt_builder =
hp_builder
.reborrow()
@@ -15,11 +15,11 @@ pub fn encode_signal_info(
"invalid receipt length in hole punch signal info"
))?);
rcpt_builder.copy_from_slice(receipt.as_slice());
let mut ni_builder = hp_builder.init_node_info();
encode_node_info(&node_info, &mut ni_builder)?;
let mut pi_builder = hp_builder.init_peer_info();
encode_peer_info(peer_info, &mut pi_builder)?;
}
SignalInfo::ReverseConnect { receipt, node_info } => {
let mut hp_builder = builder.init_reverse_connect();
SignalInfo::ReverseConnect { receipt, peer_info } => {
let mut hp_builder = builder.reborrow().init_reverse_connect();
let rcpt_builder =
hp_builder
.reborrow()
@@ -27,8 +27,8 @@ pub fn encode_signal_info(
"invalid receipt length in reverse connect signal info"
))?);
rcpt_builder.copy_from_slice(receipt.as_slice());
let mut ni_builder = hp_builder.init_node_info();
encode_node_info(&node_info, &mut ni_builder)?;
let mut pi_builder = hp_builder.init_peer_info();
encode_peer_info(peer_info, &mut pi_builder)?;
}
}
@@ -55,12 +55,12 @@ pub fn decode_signal_info(
"invalid receipt in hole punch signal info"
))?
.to_vec();
let ni_reader = r.get_node_info().map_err(map_error_protocol!(
"invalid node info in hole punch signal info"
let pi_reader = r.get_peer_info().map_err(map_error_protocol!(
"invalid peer info in hole punch signal info"
))?;
let node_info = decode_node_info(&ni_reader, true)?;
let peer_info = decode_peer_info(&pi_reader, true)?;
SignalInfo::HolePunch { receipt, node_info }
SignalInfo::HolePunch { receipt, peer_info }
}
veilid_capnp::operation_signal::ReverseConnect(r) => {
// Extract reverse connect reader
@@ -74,12 +74,12 @@ pub fn decode_signal_info(
"invalid receipt in reverse connect signal info"
))?
.to_vec();
let ni_reader = r.get_node_info().map_err(map_error_protocol!(
"invalid node info in reverse connect signal info"
let pi_reader = r.get_peer_info().map_err(map_error_protocol!(
"invalid peer info in reverse connect signal info"
))?;
let node_info = decode_node_info(&ni_reader, true)?;
let peer_info = decode_peer_info(&pi_reader, true)?;
SignalInfo::ReverseConnect { receipt, node_info }
SignalInfo::ReverseConnect { receipt, peer_info }
}
},
)

View File

@@ -23,10 +23,9 @@ type OperationId = u64;
#[derive(Debug, Clone)]
pub enum Destination {
Direct(NodeRef), // Can only be sent directly
Normal(NodeRef), // Can be sent via relays as well as directly
Relay(NodeRef, DHTKey), // Can only be sent via a relay
PrivateRoute(PrivateRoute), // Must be encapsulated in a private route
Direct(NodeRef), // Send to node
Relay(NodeRef, DHTKey), // Send to node for relay purposes
PrivateRoute(PrivateRoute), // Send to private route
}
#[derive(Debug, Clone)]
@@ -215,22 +214,25 @@ impl RPCProcessor {
}
fn filter_peer_scope(&self, peer_info: &PeerInfo) -> bool {
// if local peer scope is enabled, then don't reject any peer info
if self.enable_local_peer_scope {
return true;
}
// reject attempts to include non-public addresses in results
if self.default_peer_scope == PeerScope::Global {
for di in &peer_info.node_info.dial_info_list {
for di in &peer_info.node_info.dial_info_list {
if !di.is_global() {
// non-public address causes rejection
return false;
}
}
if let Some(rpi) = &peer_info.node_info.relay_peer_info {
for di in &rpi.node_info.dial_info_list {
if !di.is_global() {
// non-public address causes rejection
return false;
}
}
if let Some(rpi) = peer_info.node_info.relay_peer_info {
for di in &rpi.node_info.dial_info_list {
if !di.is_global() {
// non-public address causes rejection
return false;
}
}
}
}
true
}
@@ -278,7 +280,7 @@ impl RPCProcessor {
if let Some(nr) = routing_table.lookup_node_ref(node_id) {
// ensure we have some dial info for the entry already,
// if not, we should do the find_node anyway
if !nr.has_any_dial_info() {
if nr.has_any_dial_info() {
return Ok(nr);
}
}
@@ -434,13 +436,13 @@ impl RPCProcessor {
// To where are we sending the request
match &dest {
Destination::Direct(node_ref) | Destination::Normal(node_ref) => {
Destination::Direct(node_ref) | Destination::Relay(node_ref, _) => {
// Send to a node without a private route
// --------------------------------------
// Get the actual destination node id, accounting for outbound relaying
let (node_ref, node_id) = if matches!(dest, Destination::Normal(_)) {
self.get_direct_destination(node_ref.clone())?
// Get the actual destination node id accounting for relays
let (node_ref, node_id) = if let Destination::Relay(_, dht_key) = dest {
(node_ref.clone(), dht_key)
} else {
let node_id = node_ref.node_id();
(node_ref.clone(), node_id)
@@ -487,7 +489,7 @@ impl RPCProcessor {
let mut pr_msg_builder = ::capnp::message::Builder::new_default();
let mut pr_builder =
pr_msg_builder.init_root::<veilid_capnp::private_route::Builder>();
encode_private_route(&private_route, &mut pr_builder)?;
encode_private_route(private_route, &mut pr_builder)?;
let pr_reader = pr_builder.into_reader();
// Reply with 'route' operation
@@ -899,7 +901,7 @@ impl RPCProcessor {
if redirect {
let routing_table = self.routing_table();
let filter = dial_info.make_filter(true);
let peers = routing_table.find_fast_nodes_filtered(&filter);
let peers = routing_table.find_fast_public_nodes_filtered(&filter);
if peers.is_empty() {
return Err(rpc_error_internal(format!(
"no peers matching filter '{:?}'",
@@ -1110,7 +1112,7 @@ impl RPCProcessor {
// Handle it
let network_manager = self.network_manager();
network_manager
.process_receipt(rcpt_data)
.process_in_band_receipt(rcpt_data, rpcreader.header.peer_noderef)
.await
.map_err(map_error_string!())
}
@@ -1497,7 +1499,7 @@ impl RPCProcessor {
// Wait for receipt
match eventual_value.await {
ReceiptEvent::Returned => Ok(true),
ReceiptEvent::Returned(_) => Ok(true),
ReceiptEvent::Expired => Ok(false),
ReceiptEvent::Cancelled => {
Err(rpc_error_internal("receipt was dropped before expiration"))
@@ -1588,12 +1590,9 @@ impl RPCProcessor {
pub async fn rpc_call_signal(
&self,
dest: Destination,
relay_dial_info: DialInfo,
safety_route: Option<&SafetyRouteSpec>,
signal_info: SignalInfo,
) -> Result<(), RPCError> {
let network_manager = self.network_manager();
//
let sig_msg = {
let mut sig_msg = ::capnp::message::Builder::new_default();
let mut question = sig_msg.init_root::<veilid_capnp::operation::Builder>();