GuardMgr: Launch a background task to keep the list of bridge

descriptors updated as appropriate.
This commit is contained in:
Nick Mathewson 2022-11-04 10:27:37 -04:00
parent e93ee14270
commit d395ae75a5
2 changed files with 38 additions and 1 deletions

View File

@ -116,3 +116,31 @@ pub(crate) async fn keep_netdir_updated<RT: tor_rtcompat::Runtime>(
}
}
}
/// Background task to keep a guard manager up-to-date with a given bridge
/// descriptor provider.
#[cfg(feature = "bridge-client")]
pub(crate) async fn keep_bridge_descs_updated<RT: tor_rtcompat::Runtime>(
runtime: RT,
inner: Weak<Mutex<GuardMgrInner>>,
bridge_desc_provider: Weak<dyn crate::bridge::BridgeDescProvider>,
) {
use crate::bridge::BridgeDescEvent as E;
let mut event_stream = match bridge_desc_provider.upgrade().map(|p| p.events()) {
Some(s) => s,
None => return,
};
while let Some(event) = event_stream.next().await {
match event {
E::SomethingChanged => {
if let Some(inner) = inner.upgrade() {
let mut inner = inner.lock().expect("Poisoned lock");
inner.update(runtime.wallclock());
} else {
return;
}
}
}
}
}

View File

@ -394,7 +394,16 @@ impl<R: Runtime> GuardMgr<R> {
let mut inner = self.inner.lock().expect("Poisoned lock");
inner.bridge_desc_provider = Some(weak_provider.clone());
}
// TODO pt-client: launch a keep_bridge_descs_updated task.
let weak_inner = Arc::downgrade(&self.inner);
let rt_clone = self.runtime.clone();
self.runtime
.spawn(daemon::keep_bridge_descs_updated(
rt_clone,
weak_inner,
weak_provider,
))
.map_err(|e| GuardMgrError::from_spawn("periodic guard netdir updater", e))?;
Ok(())
}