aboutsummaryrefslogtreecommitdiffstats
path: root/src/transport/identity.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/identity.rs')
-rw-r--r--src/transport/identity.rs25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/transport/identity.rs b/src/transport/identity.rs
index 303177a..886f601 100644
--- a/src/transport/identity.rs
+++ b/src/transport/identity.rs
@@ -187,6 +187,8 @@ impl Book {
}
IdentityStats {
proven,
+ // Asked of the transports outside this lock (`IdentityTransport::stats`).
+ relayed: std::collections::BTreeMap::new(),
hinted: self
.hints
.keys()
@@ -294,6 +296,22 @@ impl Shared {
}
impl Shared {
+ /// Of the nodes in `proven`, those each transport reaches only through a relay, by
+ /// transport (`IdentityStats::relayed`); asked of the transports, so not under the
+ /// book's lock.
+ fn relayed(
+ &self,
+ proven: &HashMap<String, Vec<String>>,
+ ) -> std::collections::BTreeMap<String, usize> {
+ let mut relayed = std::collections::BTreeMap::new();
+ for address in proven.values().flatten() {
+ if self.paths.connection(address) == Some(Connection::Relayed) {
+ *relayed.entry(scheme_of(address).to_owned()).or_insert(0) += 1;
+ }
+ }
+ relayed
+ }
+
fn lock(&self) -> MutexGuard<'_, Book> {
self.book.lock_or_recover()
}
@@ -581,8 +599,13 @@ impl Transport for IdentityTransport {
/// The identity layer's, and each transport's.
fn stats(&self) -> TransportStats {
let mut stats = self.shared.paths.stats();
+ let (mut identity, proven) = {
+ let books = self.shared.lock();
+ (books.stats(), books.proven.clone())
+ };
+ identity.relayed = self.shared.relayed(&proven);
stats.merge(TransportStats {
- identity: Some(self.shared.lock().stats()),
+ identity: Some(identity),
..TransportStats::default()
});
stats