diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index 09b365b..4cfae66 100644 --- a/src/main.rs +++ b/src/main.rs @@ -86,7 +86,30 @@ async fn main() -> Result<()> { "Using Mycelium REST API" ); - let seeds: Vec<String> = args.seeds.clone(); + let mut seeds: Vec<String> = args.seeds.clone(); + let (state_file, remembered) = match &args.state_file { + Some(path) => { + let (file, remembered) = swarm::state_file::StateFile::open(path.clone()); + (Some(Arc::new(file)), remembered) + } + None => (None, None), + }; + if let Some(remembered) = &remembered { + info!( + swarm_id = %remembered.swarm_id, + seeds = remembered.seeds.len(), + "Remembering a swarm from the state file" + ); + for seed in &remembered.seeds { + if !seeds.contains(seed) { + seeds.push(seed.clone()); + } + } + } else if args.genesis && state_file.is_none() { + warn!( + "--genesis without --state-file: every restart with --genesis starts another new swarm" + ); + } debug!(seed_count = seeds.len(), "Loaded bootstrap configuration"); let (sync_tx, sync_rx) = mpsc::unbounded_channel(); @@ -141,6 +164,7 @@ async fn main() -> Result<()> { electorate_window: Duration::from_secs(args.electorate_window_days * 24 * 3600), blobs: Arc::new(swarm::blob::Blobs::new(args.blob_chunk_kib * 1024)), protocol_writers: Arc::new(args.protocol_writers.iter().cloned().collect()), + state_file, config: Arc::new(config.report()), neighbours: Default::default(), pulling: Default::default(), @@ -155,6 +179,11 @@ async fn main() -> Result<()> { trace!("Application state initialized"); + // Join the remembered swarm and no other; HELLOs claim it. + if let Some(remembered) = remembered { + state.set_expected_swarm_id(remembered.swarm_id).await?; + } + let consumer_state = state.clone(); tokio::spawn(async move { let inner_state = consumer_state.clone(); @@ -205,6 +234,7 @@ async fn main() -> Result<()> { ready = state.is_ready().await, "Bootstrap completed" ); + swarm::state_file::update(&state, true).await; let auth_state = AuthState::new(&args.htpasswd); let app = api::router(state.clone(), auth_state, args.debug_api); @@ -223,6 +253,7 @@ async fn main() -> Result<()> { }); let server_fut = server_builder.into_future(); + let stopping = state.clone(); tokio::pin!(server_fut); tokio::select! { @@ -248,6 +279,7 @@ async fn main() -> Result<()> { } info!("HTTP API server stopped"); + swarm::state_file::update(&stopping, true).await; Ok(()) } |
