From ae319774e5adbbec061bacc59e3ff5cc77fb82c8 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 20 Feb 2024 16:44:55 +0300 Subject: [PATCH] feat(config): Introduce ephemeral and persistent storage --- crates/core-manager/src/manager.rs | 1 - crates/server-config/src/defaults.rs | 9 +++- crates/server-config/src/dir_config.rs | 69 +++++++++++++++++++++----- nox/src/node.rs | 2 +- 4 files changed, 65 insertions(+), 16 deletions(-) diff --git a/crates/core-manager/src/manager.rs b/crates/core-manager/src/manager.rs index 8376914ea5..fb1a445e88 100644 --- a/crates/core-manager/src/manager.rs +++ b/crates/core-manager/src/manager.rs @@ -427,7 +427,6 @@ impl CoreManagerFunctions for PersistentCoreManager { drop(lock); let toml = toml::to_string_pretty(&persistent_state) .map_err(|err| PersistError::SerializationError { err })?; - drop(lock); let exists = self.file_path.exists(); let mut file = if exists { File::open(self.file_path.clone()).map_err(|err| PersistError::IoError { err })? diff --git a/crates/server-config/src/defaults.rs b/crates/server-config/src/defaults.rs index 1c784012e8..4e14cf890b 100644 --- a/crates/server-config/src/defaults.rs +++ b/crates/server-config/src/defaults.rs @@ -99,7 +99,14 @@ pub fn default_base_dir() -> PathBuf { format!(".fluence/v{CONFIG_VERSION}").into() } -pub fn services_base_dir(base_dir: &Path) -> PathBuf { +pub fn persistent_dir(base_dir: &Path) -> PathBuf { + base_dir.join("persistent") +} +pub fn ephemeral_dir(base_dir: &Path) -> PathBuf { + base_dir.join("ephemeral") +} + +pub fn services_dir(base_dir: &Path) -> PathBuf { base_dir.join("services") } diff --git a/crates/server-config/src/dir_config.rs b/crates/server-config/src/dir_config.rs index d3487fda47..f200631b8d 100644 --- a/crates/server-config/src/dir_config.rs +++ b/crates/server-config/src/dir_config.rs @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -use crate::defaults::{avm_base_dir, default_base_dir, services_base_dir}; +use crate::defaults::{avm_base_dir, default_base_dir, services_dir}; use air_interpreter_fs::air_interpreter_path; use fs_utils::{canonicalize, create_dirs, to_abs_path}; +use crate::{ephemeral_dir, persistent_dir}; use eyre::WrapErr; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -28,8 +29,17 @@ pub struct UnresolvedDirConfig { #[serde(default = "default_base_dir")] pub base_dir: PathBuf, - /// Base directory for resources needed by application services - pub services_base_dir: Option, + /// Base directory for persistent resources + pub persistent_base_dir: Option, + + /// Base directory for ephemeral resources + pub ephemeral_base_dir: Option, + + /// Base directory for persistent resources needed by application services + pub services_persistent_dir: Option, + + /// Base directory for ephemeral resources needed by application services + pub services_ephemeral_dir: Option, /// Base directory for resources needed by application services pub avm_base_dir: Option, @@ -57,14 +67,34 @@ impl UnresolvedDirConfig { pub fn resolve(self) -> eyre::Result { let base = to_abs_path(self.base_dir); - let services_base_dir = self.services_base_dir.unwrap_or(services_base_dir(&base)); - let avm_base_dir = self.avm_base_dir.unwrap_or(avm_base_dir(&base)); + let ephemeral_base_dir = self.ephemeral_base_dir.unwrap_or(ephemeral_dir(&base)); + let persistent_base_dir = self.persistent_base_dir.unwrap_or(persistent_dir(&base)); + + // ephemeral dirs + let services_ephemeral_dir = self + .services_ephemeral_dir + .unwrap_or(services_dir(&ephemeral_base_dir)); + let avm_base_dir = self + .avm_base_dir + .unwrap_or(avm_base_dir(&ephemeral_base_dir)); + + // persistent dirs + let services_persistent_dir = self + .services_persistent_dir + .unwrap_or(services_dir(&persistent_base_dir)); let air_interpreter_path = self .air_interpreter_path - .unwrap_or(air_interpreter_path(&base)); - let spell_base_dir = self.spell_base_dir.unwrap_or(base.join("spell")); - let keypairs_base_dir = self.keypairs_base_dir.unwrap_or(base.join("keypairs")); - let workers_base_dir = self.workers_base_dir.unwrap_or(base.join("workers")); + .unwrap_or(air_interpreter_path(&persistent_base_dir)); + let spell_base_dir = self + .spell_base_dir + .unwrap_or(persistent_base_dir.join("spell")); + let keypairs_base_dir = self + .keypairs_base_dir + .unwrap_or(persistent_base_dir.join("keypairs")); + let workers_base_dir = self + .workers_base_dir + .unwrap_or(persistent_base_dir.join("workers")); + let cc_events_dir = self.cc_events_dir.unwrap_or(base.join("cc_events")); let core_state_path = self .core_state_path @@ -73,27 +103,39 @@ impl UnresolvedDirConfig { create_dirs(&[ &base, - &services_base_dir, + // ephemeral dirs + &ephemeral_base_dir, + &services_ephemeral_dir, &avm_base_dir, + // persistent dirs + &persistent_base_dir, + &services_persistent_dir, &spell_base_dir, &keypairs_base_dir, &workers_base_dir, + // other &cc_events_dir, ]) .context("creating configured directories")?; let base = canonicalize(base)?; - let services_base_dir = canonicalize(services_base_dir)?; + // ephemeral dirs let avm_base_dir = canonicalize(avm_base_dir)?; + let services_ephemeral_dir = canonicalize(services_ephemeral_dir)?; + + // persistent dirs + let services_persistent_dir = canonicalize(services_persistent_dir)?; let spell_base_dir = canonicalize(spell_base_dir)?; let keypairs_base_dir = canonicalize(keypairs_base_dir)?; let workers_base_dir = canonicalize(workers_base_dir)?; + let cc_events_dir = canonicalize(cc_events_dir)?; Ok(ResolvedDirConfig { base_dir: base, - services_base_dir, avm_base_dir, + services_ephemeral_dir, + services_persistent_dir, air_interpreter_path, spell_base_dir, keypairs_base_dir, @@ -107,9 +149,10 @@ impl UnresolvedDirConfig { #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ResolvedDirConfig { pub base_dir: PathBuf, - pub services_base_dir: PathBuf, /// Directory where particle's prev_data is stored pub avm_base_dir: PathBuf, + pub services_ephemeral_dir: PathBuf, + pub services_persistent_dir: PathBuf, /// Directory where interpreter's WASM module is stored pub air_interpreter_path: PathBuf, pub spell_base_dir: PathBuf, diff --git a/nox/src/node.rs b/nox/src/node.rs index 039164c623..71a2792ac3 100644 --- a/nox/src/node.rs +++ b/nox/src/node.rs @@ -147,7 +147,7 @@ impl Node { let services_config = ServicesConfig::new( scopes.get_host_peer_id(), - config.dir_config.services_base_dir.clone(), + config.dir_config.services_persistent_dir.clone(), config_utils::particles_vault_dir(&config.dir_config.avm_base_dir), config.services_envs.clone(), config.management_peer_id,