From 371e52cb48bae99232547f6fae6a0487a85c2d04 Mon Sep 17 00:00:00 2001 From: tv Date: Sat, 24 Oct 2026 16:18:58 +0200 Subject: add chunked download and use it during rejoin --- src/state.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/state.rs') diff --git a/src/state.rs b/src/state.rs index df053a6..0f30732 100644 --- a/src/state.rs +++ b/src/state.rs @@ -597,6 +597,8 @@ pub(crate) struct AppState { pub(crate) alias: Option, /// Members alive within this window vote on remakes (`--electorate-window-days`). pub(crate) electorate_window: Duration, + /// Chunked transfers served and fetched (`swarm::blob`). + pub(crate) blobs: Arc, /// The effective configuration with sources, imported values left out /// (`config::Loaded::report`), for `GET /admin/config`. pub(crate) config: Arc, @@ -1029,6 +1031,28 @@ impl Host for AppState { crate::swarm::members::electorate(doc, now_ms, self.electorate_window) } + fn fetch_change( + &self, + hash: ChangeHash, + ) -> impl Future> + Send { + let state = self.clone(); + async move { + let epoch = state.local_epoch(); + let peers: Vec = state + .peer_summaries() + .await + .into_iter() + .filter(|peer| peer.active && peer.epoch == Some(epoch)) + .map(|peer| peer.id) + .collect(); + crate::swarm::blob::fetch_change(&state, hash, peers).await + } + } + + fn request_sync(&self) { + crate::swarm::source::resync_everyone(self); + } + fn is_node_ready(&self) -> impl Future + Send { let state = self.clone(); async move { state.is_ready().await } -- cgit v1.3.1