Skip to content

Commit e399e1e

Browse files
committed
close unneeded relays
1 parent b8964e7 commit e399e1e

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

crates/notedeck/src/subman.rs

+48-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use futures::{channel::mpsc, FutureExt, StreamExt};
2-
use std::collections::BTreeMap;
2+
use std::collections::{BTreeMap, BTreeSet};
33
use std::fmt;
44
use std::{cell::RefCell, cmp::Ordering, rc::Rc};
55
use thiserror::Error;
@@ -24,6 +24,7 @@ use crate::RelaySpec;
2424
/// async fn main() -> Result<(), Box<dyn Error>> {
2525
/// let mut ndb = Ndb::new("the/db/path/", &Config::new())?;
2626
/// let mut subman = SubMan::new(ndb.clone(), RelayPool::new());
27+
/// let default_relays = vec![];
2728
///
2829
/// // Define a filter and build the subscription specification
2930
/// let filter = Filter::new().kinds(vec![1, 2, 3]).build();
@@ -33,7 +34,7 @@ use crate::RelaySpec;
3334
/// .build();
3435
///
3536
/// // Subscribe and obtain a SubReceiver
36-
/// let mut receiver = subman.subscribe(spec)?;
37+
/// let mut receiver = subman.subscribe(spec, &default_relays)?;
3738
///
3839
/// // Process incoming note keys
3940
/// loop {
@@ -514,6 +515,7 @@ impl SubMan {
514515
pub fn process_relays<H: LegacyRelayHandler>(
515516
&mut self,
516517
legacy_relay_handler: &mut H,
518+
default_relays: &[RelaySpec],
517519
) -> SubResult<()> {
518520
let wakeup = move || {
519521
// ignore
@@ -580,6 +582,9 @@ impl SubMan {
580582
}
581583
}
582584
}
585+
586+
self.close_unneeded_relays(default_relays);
587+
583588
Ok(())
584589
}
585590

@@ -646,6 +651,41 @@ impl SubMan {
646651
}
647652
}
648653
}
654+
655+
fn close_unneeded_relays(&mut self, default_relays: &[RelaySpec]) {
656+
let current_relays: BTreeSet<String> = self.pool.urls();
657+
let needed_relays: BTreeSet<String> = self.needed_relays(default_relays);
658+
let unneeded_relays: BTreeSet<_> =
659+
current_relays.difference(&needed_relays).cloned().collect();
660+
if !unneeded_relays.is_empty() {
661+
debug!("closing unneeded relays: {:?}", unneeded_relays);
662+
self.pool.remove_urls(&unneeded_relays);
663+
}
664+
}
665+
666+
fn needed_relays(&self, default_relays: &[RelaySpec]) -> BTreeSet<String> {
667+
let mut needed: BTreeSet<String> = default_relays.iter().map(|rs| rs.url.clone()).collect();
668+
// for every remote subscription
669+
for ssr in self.rmt.values() {
670+
// that has remote substate (all will)
671+
if let Some(ref rmtsubstate) = ssr.borrow().rmt {
672+
// for each subscription remote relay
673+
for (relay, state) in &rmtsubstate.relays {
674+
// include any that are in-play
675+
match state {
676+
RelaySubState::Error(_) | RelaySubState::Closed => {
677+
// these are terminal and we don't need this relay
678+
}
679+
_ => {
680+
// relays in all other states are needed
681+
_ = needed.insert(relay.clone());
682+
}
683+
}
684+
}
685+
}
686+
}
687+
needed
688+
}
649689
}
650690

651691
pub trait LegacyRelayHandler {
@@ -755,13 +795,15 @@ mod tests {
755795
// setup an ndb and subman to test
756796
let (_mndb, ndb) = ManagedNdb::setup(&testdbs_path_async!());
757797
let mut subman = SubMan::new(ndb.clone(), RelayPool::new());
798+
let default_relays = vec![];
758799

759800
// subscribe to some stuff
760801
let mut receiver = subman.subscribe(
761802
SubSpecBuilder::new()
762803
.filters(vec![Filter::new().kinds(vec![1]).build()])
763804
.constraint(SubConstraint::OnlyLocal)
764805
.build(),
806+
&default_relays,
765807
)?;
766808
let lclid = receiver.lclid().unwrap();
767809

@@ -796,13 +838,15 @@ mod tests {
796838
// setup an ndb and subman to test
797839
let (_mndb, ndb) = ManagedNdb::setup(&testdbs_path_async!());
798840
let mut subman = SubMan::new(ndb.clone(), RelayPool::new());
841+
let default_relays = vec![];
799842

800843
// subscribe to some stuff
801844
let mut receiver = subman.subscribe(
802845
SubSpecBuilder::new()
803846
.filters(vec![Filter::new().kinds(vec![1]).build()])
804847
.constraint(SubConstraint::OnlyLocal)
805848
.build(),
849+
&default_relays,
806850
)?;
807851
let lclid = receiver.lclid().unwrap();
808852

@@ -842,13 +886,15 @@ mod tests {
842886
// setup an ndb and subman to test
843887
let (_mndb, ndb) = ManagedNdb::setup(&testdbs_path_async!());
844888
let mut subman = SubMan::new(ndb.clone(), RelayPool::new());
889+
let default_relays = vec![];
845890

846891
// subscribe to some stuff
847892
let mut receiver = subman.subscribe(
848893
SubSpecBuilder::new()
849894
.filters(vec![Filter::new().kinds(vec![1]).build()])
850895
.constraint(SubConstraint::OnlyLocal)
851896
.build(),
897+
&default_relays,
852898
)?;
853899
let lclid = receiver.lclid().unwrap();
854900

crates/notedeck_columns/src/app.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ fn try_process_event<'a>(
155155
ctx.input(|i| handle_key_events(i, current_columns));
156156

157157
{
158+
let default_relays = app_ctx.accounts.get_all_selected_account_relays();
158159
let mut relay_handler = RelayHandler::new(
159160
app_ctx.unknown_ids,
160161
app_ctx.note_cache,
@@ -163,7 +164,10 @@ fn try_process_event<'a>(
163164
&mut damus.timeline_cache,
164165
damus.since_optimize,
165166
);
166-
app_ctx.subman.process_relays(&mut relay_handler).ok();
167+
app_ctx
168+
.subman
169+
.process_relays(&mut relay_handler, &default_relays)
170+
.ok();
167171
}
168172

169173
for (_kind, timeline) in damus.timeline_cache.timelines.iter_mut() {

0 commit comments

Comments
 (0)