diff --git a/container-runtime/package-lock.json b/container-runtime/package-lock.json index 31478b8f4..7814fa09b 100644 --- a/container-runtime/package-lock.json +++ b/container-runtime/package-lock.json @@ -37,7 +37,7 @@ }, "../sdk/dist": { "name": "@start9labs/start-sdk", - "version": "0.4.0-beta.62", + "version": "0.4.0-beta.64", "license": "MIT", "dependencies": { "@iarna/toml": "^3.0.0", diff --git a/core/src/service/mod.rs b/core/src/service/mod.rs index 9fbcfa300..b11e81859 100644 --- a/core/src/service/mod.rs +++ b/core/src/service/mod.rs @@ -673,16 +673,8 @@ impl Service { #[instrument(skip_all)] pub async fn backup(&self, guard: impl GenericMountGuard) -> Result<(), Error> { let id = &self.seed.id; - let mut file = - AtomicFile::new(guard.path().join(id).with_extension("s9pk"), None::<&str>).await?; - self.seed - .persistent_container - .s9pk - .clone() - .serialize(&mut *file, true) - .await?; - file.save().await?; - // TODO: reverify? + // Prepare the backup future in the actor first, so the cell is + // populated before the actor reacts to the DesiredStatus change. let backup = self .actor .send( @@ -692,6 +684,8 @@ impl Service { }, ) .await??; + // Set status early so the UI reflects "backing up" while the s9pk + // serialization and service stop happen concurrently. self.seed .ctx .db @@ -706,6 +700,15 @@ impl Service { }) .await .result?; + let mut file = + AtomicFile::new(guard.path().join(id).with_extension("s9pk"), None::<&str>).await?; + self.seed + .persistent_container + .s9pk + .clone() + .serialize(&mut *file, true) + .await?; + file.save().await?; backup.await }