mirror of
https://gitlab.com/veilid/veilid.git
synced 2025-02-25 08:51:14 -05:00
debug
This commit is contained in:
parent
ef096eb310
commit
0e047a0120
@ -112,7 +112,7 @@ struct ClientWhitelistEntry {
|
|||||||
|
|
||||||
// Mechanism required to contact another node
|
// Mechanism required to contact another node
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
enum ContactMethod {
|
pub(crate) enum ContactMethod {
|
||||||
Unreachable, // Node is not reachable by any means
|
Unreachable, // Node is not reachable by any means
|
||||||
Direct(DialInfo), // Contact the node directly
|
Direct(DialInfo), // Contact the node directly
|
||||||
SignalReverse(NodeRef, NodeRef), // Request via signal the node connect back directly
|
SignalReverse(NodeRef, NodeRef), // Request via signal the node connect back directly
|
||||||
@ -1054,7 +1054,7 @@ impl NetworkManager {
|
|||||||
|
|
||||||
// Figure out how to reach a node
|
// Figure out how to reach a node
|
||||||
#[instrument(level = "trace", skip(self), ret)]
|
#[instrument(level = "trace", skip(self), ret)]
|
||||||
fn get_contact_method(&self, target_node_ref: NodeRef) -> ContactMethod {
|
pub(crate) fn get_contact_method(&self, target_node_ref: NodeRef) -> ContactMethod {
|
||||||
// Try local first
|
// Try local first
|
||||||
let out = self.get_contact_method_local(target_node_ref.clone());
|
let out = self.get_contact_method_local(target_node_ref.clone());
|
||||||
if !matches!(out, ContactMethod::Unreachable) {
|
if !matches!(out, ContactMethod::Unreachable) {
|
||||||
|
@ -165,7 +165,9 @@ impl BucketEntryInner {
|
|||||||
pub fn set_last_connection(&mut self, last_connection: ConnectionDescriptor, timestamp: u64) {
|
pub fn set_last_connection(&mut self, last_connection: ConnectionDescriptor, timestamp: u64) {
|
||||||
self.last_connection = Some((last_connection, timestamp));
|
self.last_connection = Some((last_connection, timestamp));
|
||||||
}
|
}
|
||||||
|
pub fn clear_last_connection(&mut self) {
|
||||||
|
self.last_connection = None;
|
||||||
|
}
|
||||||
pub fn last_connection(&self) -> Option<(ConnectionDescriptor, u64)> {
|
pub fn last_connection(&self) -> Option<(ConnectionDescriptor, u64)> {
|
||||||
self.last_connection
|
self.last_connection
|
||||||
}
|
}
|
||||||
|
@ -370,17 +370,37 @@ impl RoutingTable {
|
|||||||
|
|
||||||
// Attempt to empty the routing table
|
// Attempt to empty the routing table
|
||||||
// should only be performed when there are no node_refs (detached)
|
// should only be performed when there are no node_refs (detached)
|
||||||
pub fn purge(&self) {
|
pub fn purge_buckets(&self) {
|
||||||
let mut inner = self.inner.write();
|
let mut inner = self.inner.write();
|
||||||
log_rtab!(
|
log_rtab!(
|
||||||
"Starting routing table purge. Table currently has {} nodes",
|
"Starting routing table buckets purge. Table currently has {} nodes",
|
||||||
inner.bucket_entry_count
|
inner.bucket_entry_count
|
||||||
);
|
);
|
||||||
for bucket in &mut inner.buckets {
|
for bucket in &mut inner.buckets {
|
||||||
bucket.kick(0);
|
bucket.kick(0);
|
||||||
}
|
}
|
||||||
log_rtab!(debug
|
log_rtab!(debug
|
||||||
"Routing table purge complete. Routing table now has {} nodes",
|
"Routing table buckets purge complete. Routing table now has {} nodes",
|
||||||
|
inner.bucket_entry_count
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to remove last_connections from entries
|
||||||
|
pub fn purge_last_connections(&self) {
|
||||||
|
let mut inner = self.inner.write();
|
||||||
|
log_rtab!(
|
||||||
|
"Starting routing table last_connections purge. Table currently has {} nodes",
|
||||||
|
inner.bucket_entry_count
|
||||||
|
);
|
||||||
|
for bucket in &mut inner.buckets {
|
||||||
|
for entry in bucket.entries() {
|
||||||
|
entry.1.with_mut(|e| {
|
||||||
|
e.clear_last_connection();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_rtab!(debug
|
||||||
|
"Routing table last_connections purge complete. Routing table now has {} nodes",
|
||||||
inner.bucket_entry_count
|
inner.bucket_entry_count
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -201,8 +201,20 @@ impl VeilidAPI {
|
|||||||
) {
|
) {
|
||||||
apibail_internal!("Must be detached to purge");
|
apibail_internal!("Must be detached to purge");
|
||||||
}
|
}
|
||||||
self.network_manager()?.routing_table().purge();
|
self.network_manager()?.routing_table().purge_buckets();
|
||||||
Ok("Buckets purged".to_owned())
|
Ok("Buckets purged".to_owned())
|
||||||
|
} else if args[0] == "connections" {
|
||||||
|
// Purge connection table
|
||||||
|
let connection_manager = self.network_manager()?.connection_manager();
|
||||||
|
connection_manager.shutdown().await;
|
||||||
|
connection_manager.startup().await;
|
||||||
|
|
||||||
|
// Eliminate last_connections from routing table entries
|
||||||
|
self.network_manager()?
|
||||||
|
.routing_table()
|
||||||
|
.purge_last_connections();
|
||||||
|
|
||||||
|
Ok("Connections purged".to_owned())
|
||||||
} else {
|
} else {
|
||||||
Err(VeilidAPIError::InvalidArgument {
|
Err(VeilidAPIError::InvalidArgument {
|
||||||
context: "debug_purge".to_owned(),
|
context: "debug_purge".to_owned(),
|
||||||
@ -244,6 +256,59 @@ impl VeilidAPI {
|
|||||||
Ok("Detached".to_owned())
|
Ok("Detached".to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn debug_contact(&self, args: String) -> Result<String, VeilidAPIError> {
|
||||||
|
let args: Vec<String> = args.split_whitespace().map(|s| s.to_owned()).collect();
|
||||||
|
|
||||||
|
let node_id = get_debug_argument_at(&args, 0, "debug_contact", "node_id", get_dht_key)?;
|
||||||
|
|
||||||
|
let network_manager = self.network_manager()?;
|
||||||
|
let routing_table = network_manager.routing_table();
|
||||||
|
|
||||||
|
let nr = match routing_table.lookup_node_ref(node_id) {
|
||||||
|
Some(nr) => nr,
|
||||||
|
None => return Ok("Node id not found in routing table".to_owned()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let cm = network_manager.get_contact_method(nr);
|
||||||
|
|
||||||
|
Ok(format!("{:#?}", cm))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn debug_ping(&self, args: String) -> Result<String, VeilidAPIError> {
|
||||||
|
let args: Vec<String> = args.split_whitespace().map(|s| s.to_owned()).collect();
|
||||||
|
|
||||||
|
let node_id = get_debug_argument_at(&args, 0, "debug_ping", "node_id", get_dht_key)?;
|
||||||
|
|
||||||
|
let routing_table = self.network_manager()?.routing_table();
|
||||||
|
|
||||||
|
let nr = match routing_table.lookup_node_ref(node_id) {
|
||||||
|
Some(nr) => nr,
|
||||||
|
None => return Ok("Node id not found in routing table".to_owned()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let rpc = self.network_manager()?.rpc_processor();
|
||||||
|
|
||||||
|
// Dump routing table entry
|
||||||
|
let out = match rpc
|
||||||
|
.rpc_call_status(nr)
|
||||||
|
.await
|
||||||
|
.map_err(VeilidAPIError::internal)?
|
||||||
|
{
|
||||||
|
NetworkResult::Value(v) => v,
|
||||||
|
NetworkResult::Timeout => {
|
||||||
|
return Ok("Timeout".to_owned());
|
||||||
|
}
|
||||||
|
NetworkResult::NoConnection(e) => {
|
||||||
|
return Ok(format!("NoConnection({})", e));
|
||||||
|
}
|
||||||
|
NetworkResult::InvalidMessage(e) => {
|
||||||
|
return Ok(format!("InvalidMessage({})", e));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(format!("{:#?}", out))
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn debug_help(&self, _args: String) -> Result<String, VeilidAPIError> {
|
pub async fn debug_help(&self, _args: String) -> Result<String, VeilidAPIError> {
|
||||||
Ok(r#">>> Debug commands:
|
Ok(r#">>> Debug commands:
|
||||||
help
|
help
|
||||||
@ -253,10 +318,12 @@ impl VeilidAPI {
|
|||||||
entry [node_id]
|
entry [node_id]
|
||||||
nodeinfo
|
nodeinfo
|
||||||
config [key [new value]]
|
config [key [new value]]
|
||||||
purge buckets
|
purge [buckets|connections]
|
||||||
attach
|
attach
|
||||||
detach
|
detach
|
||||||
restart network
|
restart network
|
||||||
|
ping [node_id]
|
||||||
|
contact [node_id]
|
||||||
"#
|
"#
|
||||||
.to_owned())
|
.to_owned())
|
||||||
}
|
}
|
||||||
@ -282,6 +349,10 @@ impl VeilidAPI {
|
|||||||
self.debug_entries(rest).await
|
self.debug_entries(rest).await
|
||||||
} else if arg == "entry" {
|
} else if arg == "entry" {
|
||||||
self.debug_entry(rest).await
|
self.debug_entry(rest).await
|
||||||
|
} else if arg == "ping" {
|
||||||
|
self.debug_ping(rest).await
|
||||||
|
} else if arg == "contact" {
|
||||||
|
self.debug_contact(rest).await
|
||||||
} else if arg == "nodeinfo" {
|
} else if arg == "nodeinfo" {
|
||||||
self.debug_nodeinfo(rest).await
|
self.debug_nodeinfo(rest).await
|
||||||
} else if arg == "purge" {
|
} else if arg == "purge" {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user