summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs34
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(())
}