reduce frequency of interface resets on ios

This commit is contained in:
Christien Rioux 2024-07-25 21:10:12 -04:00
parent e759e50983
commit 87a0e38e36
13 changed files with 51 additions and 20 deletions

View File

@ -27,6 +27,9 @@ else
LIPO_OUT_NAME="lipo-ios" LIPO_OUT_NAME="lipo-ios"
fi fi
set -euxo pipefail
LIPOS=""
for arch in $ARCHS for arch in $ARCHS
do do
if [ "$arch" == "arm64" ]; then if [ "$arch" == "arm64" ]; then

View File

@ -1,4 +1,5 @@
#!/bin/bash #!/bin/bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
pushd $SCRIPTDIR >/dev/null pushd $SCRIPTDIR >/dev/null
@ -23,6 +24,9 @@ ARCHS=${ARCHS:=arm64}
LIPO_OUT_NAME="lipo-darwin" LIPO_OUT_NAME="lipo-darwin"
set -euxo pipefail
LIPOS=""
for arch in $ARCHS for arch in $ARCHS
do do
if [ "$arch" == "arm64" ]; then if [ "$arch" == "arm64" ]; then

View File

@ -351,6 +351,7 @@ impl Network {
}) })
.collect(); .collect();
addrs.sort(); addrs.sort();
addrs.dedup();
addrs addrs
} }

View File

@ -112,7 +112,7 @@ impl Network {
#[instrument(level = "trace", skip_all)] #[instrument(level = "trace", skip_all)]
async fn create_udp_protocol_handler(&self, addr: SocketAddr) -> EyreResult<bool> { async fn create_udp_protocol_handler(&self, addr: SocketAddr) -> EyreResult<bool> {
log_net!("create_udp_protocol_handler on {:?}", &addr); log_net!(debug "create_udp_protocol_handler on {:?}", &addr);
// Create a reusable socket // Create a reusable socket
let Some(socket) = new_bound_default_udp_socket(addr)? else { let Some(socket) = new_bound_default_udp_socket(addr)? else {

View File

@ -116,6 +116,7 @@ impl NetworkManager {
log_network_result!(debug "Reverse connection failed to {}, falling back to inbound relay via {}", target_node_ref, relay_nr); log_network_result!(debug "Reverse connection failed to {}, falling back to inbound relay via {}", target_node_ref, relay_nr);
network_result_try!(this.try_possibly_relayed_contact_method(NodeContactMethod::InboundRelay(relay_nr), destination_node_ref, data).await?) network_result_try!(this.try_possibly_relayed_contact_method(NodeContactMethod::InboundRelay(relay_nr), destination_node_ref, data).await?)
} else { } else {
log_network_result!(debug "Reverse connection successful to {} via {}", target_node_ref, relay_nr);
network_result_try!(nres) network_result_try!(nres)
} }
} }
@ -128,6 +129,7 @@ impl NetworkManager {
log_network_result!(debug "Hole punch failed to {}, falling back to inbound relay via {}", target_node_ref, relay_nr); log_network_result!(debug "Hole punch failed to {}, falling back to inbound relay via {}", target_node_ref, relay_nr);
network_result_try!(this.try_possibly_relayed_contact_method(NodeContactMethod::InboundRelay(relay_nr), destination_node_ref, data).await?) network_result_try!(this.try_possibly_relayed_contact_method(NodeContactMethod::InboundRelay(relay_nr), destination_node_ref, data).await?)
} else { } else {
log_network_result!(debug "Hole punch successful to {} via {}", target_node_ref, relay_nr);
network_result_try!(nres) network_result_try!(nres)
} }
} }

View File

@ -599,13 +599,13 @@ impl BucketEntryInner {
return; return;
} }
self.envelope_support.push(envelope_version); self.envelope_support.push(envelope_version);
self.envelope_support.dedup();
self.envelope_support.sort(); self.envelope_support.sort();
self.envelope_support.dedup();
} }
pub fn set_envelope_support(&mut self, mut envelope_support: Vec<u8>) { pub fn set_envelope_support(&mut self, mut envelope_support: Vec<u8>) {
envelope_support.dedup();
envelope_support.sort(); envelope_support.sort();
envelope_support.dedup();
self.envelope_support = envelope_support; self.envelope_support = envelope_support;
} }

View File

@ -60,8 +60,8 @@ impl RoutingTable {
}; };
envelope_support.push(es); envelope_support.push(es);
} }
envelope_support.dedup();
envelope_support.sort(); envelope_support.sort();
envelope_support.dedup();
// Node Id // Node Id
let mut node_ids = TypedKeyGroup::new(); let mut node_ids = TypedKeyGroup::new();

View File

@ -93,6 +93,7 @@ pub fn decode_node_info(reader: &veilid_capnp::node_info::Reader) -> Result<Node
// Unsorted is okay, some nodes may have a different envelope order preference // Unsorted is okay, some nodes may have a different envelope order preference
// But nothing should show up more than once // But nothing should show up more than once
let mut eversions = envelope_support.clone(); let mut eversions = envelope_support.clone();
eversions.sort();
eversions.dedup(); eversions.dedup();
if eversions.len() != envelope_support.len() { if eversions.len() != envelope_support.len() {
return Err(RPCError::protocol("duplicate envelope versions")); return Err(RPCError::protocol("duplicate envelope versions"));
@ -122,6 +123,7 @@ pub fn decode_node_info(reader: &veilid_capnp::node_info::Reader) -> Result<Node
// Unsorted is okay, some nodes may have a different crypto order preference // Unsorted is okay, some nodes may have a different crypto order preference
// But nothing should show up more than once // But nothing should show up more than once
let mut ckinds = crypto_support.clone(); let mut ckinds = crypto_support.clone();
ckinds.sort();
ckinds.dedup(); ckinds.dedup();
if ckinds.len() != crypto_support.len() { if ckinds.len() != crypto_support.len() {
return Err(RPCError::protocol("duplicate crypto kinds")); return Err(RPCError::protocol("duplicate crypto kinds"));

View File

@ -629,6 +629,17 @@ impl RPCProcessor {
// Reply received // Reply received
let recv_ts = get_aligned_timestamp(); let recv_ts = get_aligned_timestamp();
// Record answer received
self.record_answer_received(
waitable_reply.send_ts,
recv_ts,
rpcreader.header.body_len,
waitable_reply.node_ref.clone(),
waitable_reply.safety_route,
waitable_reply.remote_private_route,
waitable_reply.reply_private_route,
);
// Ensure the reply comes over the private route that was requested // Ensure the reply comes over the private route that was requested
if let Some(reply_private_route) = waitable_reply.reply_private_route { if let Some(reply_private_route) = waitable_reply.reply_private_route {
match &rpcreader.header.detail { match &rpcreader.header.detail {
@ -648,17 +659,6 @@ impl RPCProcessor {
} }
}; };
} }
// Record answer received
self.record_answer_received(
waitable_reply.send_ts,
recv_ts,
rpcreader.header.body_len,
waitable_reply.node_ref.clone(),
waitable_reply.safety_route,
waitable_reply.remote_private_route,
waitable_reply.reply_private_route,
)
} }
}; };
out out

View File

@ -116,7 +116,10 @@ where
pub fn get_op_context(&self, op_id: OperationId) -> Result<C, RPCError> { pub fn get_op_context(&self, op_id: OperationId) -> Result<C, RPCError> {
let inner = self.inner.lock(); let inner = self.inner.lock();
let Some(waiting_op) = inner.waiting_op_table.get(&op_id) else { let Some(waiting_op) = inner.waiting_op_table.get(&op_id) else {
return Err(RPCError::ignore("Missing operation id getting op context")); return Err(RPCError::ignore(format!(
"Missing operation id getting op context: id={}",
op_id
)));
}; };
Ok(waiting_op.context.clone()) Ok(waiting_op.context.clone())
} }

View File

@ -153,6 +153,10 @@ pub struct CmdlineArgs {
#[cfg(feature = "rt-tokio")] #[cfg(feature = "rt-tokio")]
#[arg(long)] #[arg(long)]
console: bool, console: bool,
/// change ingore_log_targets
#[arg(long)]
ignore_log_targets: Option<Vec<String>>,
} }
#[instrument(level = "trace", skip_all, err)] #[instrument(level = "trace", skip_all, err)]
@ -308,6 +312,11 @@ fn main() -> EyreResult<()> {
settingsrw.logging.console.enabled = true; settingsrw.logging.console.enabled = true;
} }
if let Some(ignore_log_targets) = args.ignore_log_targets {
println!("Changing ignored log targets: {:?}", ignore_log_targets);
settingsrw.logging.terminal.ignore_log_targets = ignore_log_targets
}
drop(settingsrw); drop(settingsrw);
// Set specific config settings // Set specific config settings

View File

@ -427,9 +427,15 @@ impl NetworkInterfaces {
} }
// Sort one more time to get the best interface addresses overall // Sort one more time to get the best interface addresses overall
intf_addrs.sort(); let mut addresses = intf_addrs
.iter()
.map(|x| x.if_addr().ip())
.collect::<Vec<_>>();
addresses.sort();
addresses.dedup();
// Now export just the addresses // Now export just the addresses
inner.interface_address_cache = intf_addrs.iter().map(|x| x.if_addr().ip()).collect() inner.interface_address_cache = addresses;
} }
} }

View File

@ -321,11 +321,12 @@ pub fn listen_address_to_socket_addrs(listen_address: &str) -> Result<Vec<Socket
}) })
} }
pub trait Dedup<T: PartialEq + Clone> { /// Dedup, but doesn't require a sorted vec, and keeps the element order
pub trait RemoveDuplicates<T: PartialEq + Clone> {
fn remove_duplicates(&mut self); fn remove_duplicates(&mut self);
} }
impl<T: PartialEq + Clone> Dedup<T> for Vec<T> { impl<T: PartialEq + Clone> RemoveDuplicates<T> for Vec<T> {
fn remove_duplicates(&mut self) { fn remove_duplicates(&mut self) {
let mut already_seen = Vec::new(); let mut already_seen = Vec::new();
self.retain(|item| match already_seen.contains(item) { self.retain(|item| match already_seen.contains(item) {