From 11c93231aa6478912701aaa65b7c4761ef78bd11 Mon Sep 17 00:00:00 2001 From: J H Date: Mon, 4 Mar 2024 13:37:48 -0700 Subject: [PATCH] fix: Let the service be able to be started --- core/startos/src/service/mod.rs | 35 +++++++++++++++---- .../src/service/service_effect_handler.rs | 18 +++++----- core/startos/src/service/transition/mod.rs | 2 +- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index b572caa89..b5a9c4bb2 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -389,7 +389,7 @@ impl Service { } } -#[derive(Clone)] +#[derive(Debug, Clone)] struct RunningStatus { health: OrdMap, started: DateTime, @@ -406,7 +406,32 @@ pub(self) struct ServiceActorSeed { synchronized: Arc, } +impl ServiceActorSeed { + pub fn started(&self) { + self.persistent_container + .current_state + .send_replace(StartStop::Start); + self.persistent_container + .running_status + .send_modify(|running_status| { + *running_status = + Some( + std::mem::take(running_status).unwrap_or_else(|| RunningStatus { + health: Default::default(), + started: Utc::now(), + }), + ); + }) + } + pub fn stopped(&self) { + self.persistent_container + .current_state + .send_replace(StartStop::Stop); + self.persistent_container.running_status.send_replace(None); + } +} struct ServiceActor(Arc); + impl Actor for ServiceActor { fn init(&mut self, jobs: &mut BackgroundJobs) { let seed = self.0.clone(); @@ -418,7 +443,7 @@ impl Actor for ServiceActor { let mut transition = seed.transition_state.subscribe(); let mut running = seed.running_status.clone(); loop { - let (desired_state, current_state, transition_kind, running_status) = ( + let (desired_state, current_state, transition_kind, running_status) = dbg!( temp_desired.borrow().unwrap_or(*desired.borrow()), *current.borrow(), transition.borrow().as_ref().map(|t| t.kind()), @@ -464,10 +489,8 @@ impl Actor for ServiceActor { timeout: todo!("sigterm timeout"), } } - (None, StartStop::Start, StartStop::Stop, _) => { - MainStatus::Starting - } - (None, StartStop::Start, StartStop::Start, None) => { + (None, StartStop::Start, StartStop::Stop, _) + | (None, StartStop::Start, StartStop::Start, None) => { MainStatus::Starting } (None, StartStop::Start, StartStop::Start, Some(status)) => { diff --git a/core/startos/src/service/service_effect_handler.rs b/core/startos/src/service/service_effect_handler.rs index 4a8e647d7..c4a9584d3 100644 --- a/core/startos/src/service/service_effect_handler.rs +++ b/core/startos/src/service/service_effect_handler.rs @@ -1,9 +1,10 @@ -use std::ffi::OsString; use std::os::unix::process::CommandExt; use std::path::{Path, PathBuf}; use std::str::FromStr; use std::sync::{Arc, Weak}; +use std::{ffi::OsString, time::Instant}; +use chrono::Utc; use clap::builder::{TypedValueParser, ValueParserFactory}; use clap::Parser; use imbl_value::json; @@ -12,7 +13,6 @@ use patch_db::json_ptr::JsonPointer; use rpc_toolkit::{from_fn, from_fn_async, AnyContext, Context, Empty, HandlerExt, ParentHandler}; use tokio::process::Command; -use crate::db::model::ExposedUI; use crate::disk::mount::filesystem::idmapped::IdMapped; use crate::disk::mount::filesystem::loop_dev::LoopDev; use crate::disk::mount::filesystem::overlayfs::OverlayGuard; @@ -25,6 +25,7 @@ use crate::status::health_check::HealthCheckResult; use crate::status::MainStatus; use crate::util::clap::FromStrParser; use crate::util::{new_guid, Invoke}; +use crate::{db::model::ExposedUI, service::RunningStatus}; use crate::{echo, ARCH}; #[derive(Clone)] @@ -487,6 +488,7 @@ async fn stopped(context: EffectContext, params: ParamsMaybePackageId) -> Result Ok(json!(matches!(package, MainStatus::Stopped))) } async fn running(context: EffectContext, params: ParamsMaybePackageId) -> Result { + dbg!("Starting the running {params:?}"); let context = context.deref()?; let peeked = context.ctx.db.peek().await; let package_id = params.package_id.unwrap_or_else(|| context.id.clone()); @@ -586,14 +588,12 @@ struct SetMainStatus { status: Status, } async fn set_main_status(context: EffectContext, params: SetMainStatus) -> Result { + dbg!(format!("Status for main will be is {params:?}")); let context = context.deref()?; - context - .persistent_container - .current_state - .send_replace(match params.status { - Status::Running => StartStop::Start, - Status::Stopped => StartStop::Stop, - }); + match params.status { + Status::Running => context.started(), + Status::Stopped => context.stopped(), + } Ok(Value::Null) } diff --git a/core/startos/src/service/transition/mod.rs b/core/startos/src/service/transition/mod.rs index 29c1be38d..b472434d4 100644 --- a/core/startos/src/service/transition/mod.rs +++ b/core/startos/src/service/transition/mod.rs @@ -51,7 +51,7 @@ impl Drop for TransitionState { } } -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct TempDesiredState(pub(super) Arc>>); impl TempDesiredState { pub fn stop(&self) {