sysmaster/backport-fix-support-for-adjusting-the-memory-usage-of-databa.patch

1307 lines
44 KiB
Diff
Raw Normal View History

2023-06-19 15:29:11 +08:00
From 2c9a53516432d039501bc58652b9f05b57356373 Mon Sep 17 00:00:00 2001
From: xuxiaozhou1 <xuxiaozhou1@huawei.com>
Date: Mon, 5 Jun 2023 20:33:00 +0800
Subject: [PATCH] fix: support for adjusting the memory usage of database
---
coms/mount/src/rentry.rs | 12 +--
coms/service/src/rentry.rs | 12 +--
coms/socket/src/rentry.rs | 18 ++--
coms/target/src/rentry.rs | 6 +-
core/bin/job/junit.rs | 34 ++++++--
core/bin/job/manager.rs | 9 +-
core/bin/job/notify.rs | 6 +-
core/bin/job/stat.rs | 6 +-
core/bin/job/table.rs | 6 +-
core/bin/job/transaction.rs | 10 ++-
core/bin/main.rs | 2 +-
core/bin/manager/config.rs | 5 ++
core/bin/manager/mod.rs | 11 ++-
core/bin/unit/datastore/child.rs | 14 ++-
core/bin/unit/datastore/deps.rs | 14 ++-
core/bin/unit/datastore/sets.rs | 18 ++--
core/bin/unit/entry/uentry.rs | 6 +-
core/bin/unit/manager.rs | 5 +-
core/bin/unit/runtime.rs | 14 ++-
core/lib/rel/api.rs | 52 +++++++++--
core/lib/rel/base.rs | 115 ++++++++++++------------
core/lib/rel/history.rs | 144 ++++++++++++++++++++++++++-----
core/lib/rel/mod.rs | 2 +-
docs/man/sysmaster.conf.md | 8 ++
24 files changed, 376 insertions(+), 153 deletions(-)
mode change 100644 => 100755 core/bin/unit/datastore/child.rs
diff --git a/coms/mount/src/rentry.rs b/coms/mount/src/rentry.rs
index 45c0ce0..bf0004e 100644
--- a/coms/mount/src/rentry.rs
+++ b/coms/mount/src/rentry.rs
@@ -103,8 +103,8 @@ impl ReDbTable for MountReDb<String, MountReMng> {
self.0.cache_2_db(db_wtxn);
}
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.0.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.0.buffer_2_db(db_wtxn);
}
fn import<'a>(&self, db_rtxn: &ReDbRoTxn) {
@@ -112,7 +112,7 @@ impl ReDbTable for MountReDb<String, MountReMng> {
}
fn switch_set(&self, switch: bool) {
- self.0.set_switch(switch);
+ self.0.switch_buffer(switch);
}
}
@@ -125,8 +125,8 @@ impl ReDbTable for MountReDb<u32, MountReFrame> {
self.0.cache_2_db(db_wtxn);
}
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.0.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.0.buffer_2_db(db_wtxn);
}
fn import<'a>(&self, db_rtxn: &ReDbRoTxn) {
@@ -134,6 +134,6 @@ impl ReDbTable for MountReDb<u32, MountReFrame> {
}
fn switch_set(&self, switch: bool) {
- self.0.set_switch(switch);
+ self.0.switch_buffer(switch);
}
}
diff --git a/coms/service/src/rentry.rs b/coms/service/src/rentry.rs
index a68a3df..7099e01 100644
--- a/coms/service/src/rentry.rs
+++ b/coms/service/src/rentry.rs
@@ -623,8 +623,8 @@ impl ReDbTable for ServiceReDb<String, ServiceReConf> {
self.0.cache_2_db(db_wtxn);
}
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.0.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.0.buffer_2_db(db_wtxn);
}
fn import<'a>(&self, db_rtxn: &ReDbRoTxn) {
@@ -632,7 +632,7 @@ impl ReDbTable for ServiceReDb<String, ServiceReConf> {
}
fn switch_set(&self, switch: bool) {
- self.0.set_switch(switch);
+ self.0.switch_buffer(switch);
}
}
@@ -645,8 +645,8 @@ impl ReDbTable for ServiceReDb<String, ServiceReMng> {
self.0.cache_2_db(db_wtxn);
}
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.0.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.0.buffer_2_db(db_wtxn);
}
fn import<'a>(&self, db_rtxn: &ReDbRoTxn) {
@@ -654,6 +654,6 @@ impl ReDbTable for ServiceReDb<String, ServiceReMng> {
}
fn switch_set(&self, switch: bool) {
- self.0.set_switch(switch);
+ self.0.switch_buffer(switch);
}
}
diff --git a/coms/socket/src/rentry.rs b/coms/socket/src/rentry.rs
index 44f5be3..c0f5818 100644
--- a/coms/socket/src/rentry.rs
+++ b/coms/socket/src/rentry.rs
@@ -335,8 +335,8 @@ impl ReDbTable for SocketReDb<String, SocketReConf> {
self.0.cache_2_db(db_wtxn);
}
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.0.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.0.buffer_2_db(db_wtxn);
}
fn import<'a>(&self, db_rtxn: &ReDbRoTxn) {
@@ -344,7 +344,7 @@ impl ReDbTable for SocketReDb<String, SocketReConf> {
}
fn switch_set(&self, switch: bool) {
- self.0.set_switch(switch);
+ self.0.switch_buffer(switch);
}
}
@@ -357,8 +357,8 @@ impl ReDbTable for SocketReDb<String, SocketReMng> {
self.0.cache_2_db(db_wtxn);
}
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.0.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.0.buffer_2_db(db_wtxn);
}
fn import<'a>(&self, db_rtxn: &ReDbRoTxn) {
@@ -366,7 +366,7 @@ impl ReDbTable for SocketReDb<String, SocketReMng> {
}
fn switch_set(&self, switch: bool) {
- self.0.set_switch(switch);
+ self.0.switch_buffer(switch);
}
}
@@ -379,8 +379,8 @@ impl ReDbTable for SocketReDb<u32, SocketReFrame> {
self.0.cache_2_db(db_wtxn);
}
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.0.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.0.buffer_2_db(db_wtxn);
}
fn import<'a>(&self, db_rtxn: &ReDbRoTxn) {
@@ -388,6 +388,6 @@ impl ReDbTable for SocketReDb<u32, SocketReFrame> {
}
fn switch_set(&self, switch: bool) {
- self.0.set_switch(switch);
+ self.0.switch_buffer(switch);
}
}
diff --git a/coms/target/src/rentry.rs b/coms/target/src/rentry.rs
index 9d3f90c..9e218b3 100644
--- a/coms/target/src/rentry.rs
+++ b/coms/target/src/rentry.rs
@@ -77,8 +77,8 @@ impl ReDbTable for TargetReDb<String, TargetReMng> {
self.0.cache_2_db(db_wtxn);
}
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.0.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.0.buffer_2_db(db_wtxn);
}
fn import<'a>(&self, db_rtxn: &ReDbRoTxn) {
@@ -86,6 +86,6 @@ impl ReDbTable for TargetReDb<String, TargetReMng> {
}
fn switch_set(&self, switch: bool) {
- self.0.set_switch(switch);
+ self.0.switch_buffer(switch);
}
}
diff --git a/core/bin/job/junit.rs b/core/bin/job/junit.rs
index f1a55b6..b56ec11 100644
--- a/core/bin/job/junit.rs
+++ b/core/bin/job/junit.rs
@@ -817,11 +817,13 @@ mod tests {
use crate::unit::{JobMode, UnitRe};
use basic::logger;
use event::Events;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
fn juv_api_len() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(JobRe::new(&reli));
let unit_test1 = prepare_unit(&reli);
let mut id: u128 = 0;
@@ -848,7 +850,9 @@ mod tests {
#[test]
fn juv_api_merge() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let unit_test1 = prepare_unit(&reli);
let (_, job_start, _, _, _) = prepare_jobs(&reli, &unit_test1, JobMode::Replace);
let (_, stage_start, _, _, _) = prepare_jobs(&reli, &unit_test1, JobMode::Replace);
@@ -881,7 +885,9 @@ mod tests {
#[test]
fn juv_api_reshuffle() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let unit_test1 = prepare_unit(&reli);
let (job_nop, job_start, job_reload, job_restart, _) =
prepare_jobs(&reli, &unit_test1, JobMode::Replace);
@@ -923,7 +929,9 @@ mod tests {
#[test]
fn juv_api_replace_with_unirreversible() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let unit_test1 = prepare_unit(&reli);
let mode = JobMode::Replace;
let (_, uv_start, _, _, uv_stop) = prepare_jobs(&reli, &unit_test1, mode);
@@ -958,7 +966,9 @@ mod tests {
#[test]
fn juv_api_replace_with_irreversible() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let unit_test1 = prepare_unit(&reli);
let mode = JobMode::ReplaceIrreversible;
let (_, uv_start, _, _, uv_stop) = prepare_jobs(&reli, &unit_test1, mode);
@@ -993,7 +1003,9 @@ mod tests {
#[test]
fn juv_api_order_with_unignore() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let unit_test1 = prepare_unit(&reli);
let mode = JobMode::Replace;
let (uv_nop, uv_start, _, _, uv_stop) = prepare_jobs(&reli, &unit_test1, mode);
@@ -1093,7 +1105,9 @@ mod tests {
#[test]
fn juv_api_order_with_ignore() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let unit_test1 = prepare_unit(&reli);
let mode = JobMode::IgnoreDependencies;
let (uv_nop, uv_start, _, _, uv_stop) = prepare_jobs(&reli, &unit_test1, mode);
@@ -1192,7 +1206,9 @@ mod tests {
#[test]
fn juv_calc_ready() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let unit_test1 = prepare_unit(&reli);
let (job_nop, job_start, _, _, _) = prepare_jobs(&reli, &unit_test1, JobMode::Replace);
let uv = JobUnit::new(Rc::clone(&unit_test1));
diff --git a/core/bin/job/manager.rs b/core/bin/job/manager.rs
index 028c4d5..85af037 100755
--- a/core/bin/job/manager.rs
+++ b/core/bin/job/manager.rs
@@ -814,12 +814,15 @@ mod tests {
use crate::unit::DataManager;
use crate::unit::{UnitRe, UnitRelations};
use basic::logger;
+ use sysmaster::rel::ReliConf;
//#[test]
#[allow(dead_code)]
fn job_reli() {
logger::init_log_to_console("test_unit_load", log::LevelFilter::Trace);
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let event = Rc::new(Events::new().unwrap());
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
@@ -1148,7 +1151,9 @@ mod tests {
) {
let event = Rc::new(Events::new().unwrap());
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let name_test1 = String::from("test1.service");
diff --git a/core/bin/job/notify.rs b/core/bin/job/notify.rs
index 271b648..8678633 100644
--- a/core/bin/job/notify.rs
+++ b/core/bin/job/notify.rs
@@ -147,7 +147,7 @@ mod tests {
use crate::unit::UnitX;
use basic::logger;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
fn jn_api() {
@@ -178,7 +178,9 @@ mod tests {
fn prepare_unit_single() -> (Rc<Reliability>, Rc<UnitDb>, Rc<UnitX>) {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let name_test1 = String::from("test1.service");
diff --git a/core/bin/job/stat.rs b/core/bin/job/stat.rs
index 1163d00..2711412 100644
--- a/core/bin/job/stat.rs
+++ b/core/bin/job/stat.rs
@@ -450,7 +450,7 @@ mod tests {
use crate::unit::UnitX;
use basic::logger;
use event::Events;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
fn js_api() {
@@ -486,7 +486,9 @@ mod tests {
fn prepare_unit_single() -> (Rc<Reliability>, Rc<UnitDb>, Rc<UnitX>) {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let name_test1 = String::from("test1.service");
diff --git a/core/bin/job/table.rs b/core/bin/job/table.rs
index 7b77b1a..5a9f7b2 100644
--- a/core/bin/job/table.rs
+++ b/core/bin/job/table.rs
@@ -1022,12 +1022,14 @@ mod tests {
use crate::unit::UnitRe;
use basic::logger;
use event::Events;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
fn job_table_record_suspend() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let job_rentry = Rc::new(JobRe::new(&reli));
diff --git a/core/bin/job/transaction.rs b/core/bin/job/transaction.rs
index b79e6ff..c4842c4 100644
--- a/core/bin/job/transaction.rs
+++ b/core/bin/job/transaction.rs
@@ -420,7 +420,7 @@ mod tests {
use crate::unit::{UnitRe, UnitRelations};
use basic::logger;
use event::Events;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
fn jt_api_expand_check() {}
@@ -682,7 +682,9 @@ mod tests {
relation: UnitRelations,
) -> (Rc<Reliability>, Rc<UnitDb>, Rc<UnitX>, Rc<UnitX>) {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let name_test1 = String::from("test1.service");
@@ -699,7 +701,9 @@ mod tests {
fn prepare_unit_single() -> (Rc<Reliability>, Rc<UnitDb>, Rc<UnitX>) {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let name_test1 = String::from("test1.service");
diff --git a/core/bin/main.rs b/core/bin/main.rs
index eb06ed6..0239ce9 100644
--- a/core/bin/main.rs
+++ b/core/bin/main.rs
@@ -117,10 +117,10 @@ fn main() -> Result<()> {
if !switch {
if !args.deserialize {
manager.debug_clear_restore();
+ log::info!("debug: clear data restored.");
}
// if switch is false unregister init's reexec signal.
register_reexec_signal(false);
- log::info!("debug: clear data restored.");
}
manager.setup_cgroup()?;
diff --git a/core/bin/manager/config.rs b/core/bin/manager/config.rs
index b5b2857..8b7aaab 100644
--- a/core/bin/manager/config.rs
+++ b/core/bin/manager/config.rs
@@ -15,6 +15,7 @@
use confique::Config;
pub const SYSTEM_CONFIG: &str = "/etc/sysmaster/system.toml";
+const RELI_HISTORY_MAPSIZE_DEFAULT: usize = 1048576; // 1M
#[derive(Config, Debug)]
pub struct ManagerConfig {
@@ -29,6 +30,9 @@ pub struct ManagerConfig {
pub LogTarget: String,
#[config(default = "")]
pub LogFile: String,
+
+ #[config(default = 1048576)] // RELI_HISTORY_MAPSIZE_DEFAULT
+ pub DbSize: usize,
}
impl ManagerConfig {
@@ -51,6 +55,7 @@ impl Default for ManagerConfig {
LogLevel: log::LevelFilter::Debug,
LogTarget: "console".to_string(),
LogFile: String::new(),
+ DbSize: RELI_HISTORY_MAPSIZE_DEFAULT,
}
}
}
diff --git a/core/bin/manager/mod.rs b/core/bin/manager/mod.rs
index 17a2e29..ee49efa 100644
--- a/core/bin/manager/mod.rs
+++ b/core/bin/manager/mod.rs
@@ -40,7 +40,7 @@ use std::collections::HashSet;
use std::path::PathBuf;
use std::rc::Rc;
use sysmaster::error::*;
-use sysmaster::rel::{ReliLastFrame, Reliability};
+use sysmaster::rel::{ReliConf, ReliLastFrame, Reliability};
use alive_timer::AliveTimer;
@@ -203,7 +203,11 @@ impl Manager {
/// create factory instance
pub fn new(mode: Mode, action: Action, manager_config: Rc<ManagerConfig>) -> Self {
let event = Rc::new(Events::new().unwrap());
- let reli = Rc::new(Reliability::new(rentry::RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new()
+ .set_map_size(manager_config.DbSize)
+ .set_max_dbs(rentry::RELI_HISTORY_MAX_DBS),
+ ));
let mut l_path = LookupPaths::new();
l_path.init_lookup_paths();
let lookup_path = Rc::new(l_path);
@@ -386,6 +390,9 @@ impl Manager {
fn prepare_reexec(&self) -> Result<()> {
// restore external resource, like: fd, ...
// do nothing now
+
+ // compact db
+ self.reli.compact()?;
Ok(())
}
diff --git a/core/bin/unit/datastore/child.rs b/core/bin/unit/datastore/child.rs
old mode 100644
new mode 100755
index f4460f0..be29470
--- a/core/bin/unit/datastore/child.rs
+++ b/core/bin/unit/datastore/child.rs
@@ -167,12 +167,14 @@ mod tests {
use crate::unit::rentry::UnitRe;
use crate::unit::test::test_utils;
use basic::logger;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
#[should_panic]
fn child_add_watch_pid_empty() {
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let name_test3 = String::from("test3.service");
@@ -185,7 +187,9 @@ mod tests {
#[test]
fn child_add_watch_pid() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let name_test1 = String::from("test1.service");
@@ -210,7 +214,9 @@ mod tests {
#[test]
fn child_unwatch_pid() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let name_test1 = String::from("test1.service");
diff --git a/core/bin/unit/datastore/deps.rs b/core/bin/unit/datastore/deps.rs
index 80836ef..cd934b7 100644
--- a/core/bin/unit/datastore/deps.rs
+++ b/core/bin/unit/datastore/deps.rs
@@ -392,12 +392,14 @@ mod tests {
use crate::unit::data::DataManager;
use crate::unit::test::test_utils;
use basic::logger;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
fn dep_insert() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let dep = UnitDep::new(&rentry, &Rc::new(sets));
@@ -440,7 +442,9 @@ mod tests {
#[test]
fn dep_gets_atom() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let dep = UnitDep::new(&rentry, &Rc::new(sets));
@@ -495,7 +499,9 @@ mod tests {
#[test]
fn dep_is_dep_atom_with() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let dep = UnitDep::new(&rentry, &Rc::new(sets));
diff --git a/core/bin/unit/datastore/sets.rs b/core/bin/unit/datastore/sets.rs
index 9a94a4b..4e105e7 100644
--- a/core/bin/unit/datastore/sets.rs
+++ b/core/bin/unit/datastore/sets.rs
@@ -89,12 +89,14 @@ mod tests {
use crate::unit::rentry::UnitRe;
use crate::unit::test::test_utils;
use basic::logger;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
fn sets_insert() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let name_test1 = String::from("test1.service");
@@ -115,7 +117,9 @@ mod tests {
#[test]
fn sets_remove() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let name_test1 = String::from("test1.service");
@@ -142,7 +146,9 @@ mod tests {
#[test]
fn sets_get() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let name_test1 = String::from("test1.service");
@@ -167,7 +173,9 @@ mod tests {
#[test]
fn sets_getall() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let sets = UnitSets::new();
let name_test1 = String::from("test1.service");
diff --git a/core/bin/unit/entry/uentry.rs b/core/bin/unit/entry/uentry.rs
index 0c6e044..5b93e97 100644
--- a/core/bin/unit/entry/uentry.rs
+++ b/core/bin/unit/entry/uentry.rs
@@ -763,13 +763,15 @@ mod tests {
use crate::unit::test::test_utils::UmIfD;
use basic::{logger, path_lookup::LookupPaths};
use std::rc::Rc;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
use sysmaster::unit::UnitType;
use crate::{plugin::Plugin, unit::data::DataManager, unit::util::UnitFile};
fn unit_init() -> Rc<Unit> {
logger::init_log_to_console("test_unit_entry", log::LevelFilter::Trace);
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let mut l_path = LookupPaths::new();
diff --git a/core/bin/unit/manager.rs b/core/bin/unit/manager.rs
index d5c3e10..505a051 100644
--- a/core/bin/unit/manager.rs
+++ b/core/bin/unit/manager.rs
@@ -1404,6 +1404,7 @@ mod tests {
use nix::sys::wait::WaitStatus;
use std::thread;
use std::time::Duration;
+ use sysmaster::rel::ReliConf;
use sysmaster::unit::UnitActiveState;
fn init_dm_for_test() -> (Rc<DataManager>, Rc<Events>, Rc<UnitManager>) {
@@ -1414,7 +1415,9 @@ mod tests {
let event = Rc::new(Events::new().unwrap());
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let state = Rc::new(RefCell::new(State::Init));
let um = UnitManager::new(
&event,
diff --git a/core/bin/unit/runtime.rs b/core/bin/unit/runtime.rs
index 215a5a7..5c4f45e 100644
--- a/core/bin/unit/runtime.rs
+++ b/core/bin/unit/runtime.rs
@@ -380,12 +380,14 @@ mod tests {
use crate::unit::rentry::UnitRe;
use crate::unit::test;
use basic::logger;
- use sysmaster::rel::Reliability;
+ use sysmaster::rel::{ReliConf, Reliability};
#[test]
fn rt_push_load_queue() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let rt = UnitRT::new(&reli, &rentry, &db);
@@ -412,7 +414,9 @@ mod tests {
#[test]
fn rt_dispatch_load_queue() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let rt = UnitRT::new(&reli, &rentry, &db);
@@ -430,7 +434,9 @@ mod tests {
#[test]
fn rt_dispatch_target_dep_queue() {
let dm = Rc::new(DataManager::new());
- let reli = Rc::new(Reliability::new(RELI_HISTORY_MAX_DBS));
+ let reli = Rc::new(Reliability::new(
+ ReliConf::new().set_max_dbs(RELI_HISTORY_MAX_DBS),
+ ));
let rentry = Rc::new(UnitRe::new(&reli));
let db = Rc::new(UnitDb::new(&rentry));
let rt = UnitRT::new(&reli, &rentry, &db);
diff --git a/core/lib/rel/api.rs b/core/lib/rel/api.rs
index 60a3543..59e4ac9 100644
--- a/core/lib/rel/api.rs
+++ b/core/lib/rel/api.rs
@@ -36,6 +36,41 @@ const RELI_DEBUG_PANIC_FILE: &str = "panic.debug";
const RELI_DEBUG_PFIRST_FILE: &str = "panic_first.debug";
const RELI_DEBUG_SLEEP_FILE: &str = "sleep.debug";
+/// the configuration of reliability instance
+pub struct ReliConf {
+ // history
+ map_size: Option<usize>,
+ max_dbs: Option<u32>,
+}
+
+impl ReliConf {
+ /// create the configuration
+ pub fn new() -> ReliConf {
+ ReliConf {
+ map_size: None,
+ max_dbs: None,
+ }
+ }
+
+ /// set the map size
+ pub fn set_map_size(&mut self, map_size: usize) -> &mut Self {
+ self.map_size = Some(map_size);
+ self
+ }
+
+ /// set the max numbers of db
+ pub fn set_max_dbs(&mut self, max_dbs: u32) -> &mut Self {
+ self.max_dbs = Some(max_dbs);
+ self
+ }
+}
+
+impl Default for ReliConf {
+ fn default() -> Self {
+ ReliConf::new()
+ }
+}
+
/// reliability instance
#[derive(Debug)]
pub struct Reliability {
@@ -62,13 +97,13 @@ impl Drop for Reliability {
impl Reliability {
/// create reliability instance
- pub fn new(max_db: u32) -> Reliability {
+ pub fn new(conf: &ReliConf) -> Reliability {
let dir_s = reli_prepare().expect("reliability prepare");
let reli = Reliability {
dir_string: dir_s.clone(),
enable: ReliEnable::new(&dir_s),
last: ReliLast::new(&dir_s),
- history: ReliHistory::new(&dir_s, max_db),
+ history: ReliHistory::new(&dir_s, conf.map_size, conf.max_dbs),
pending: ReliPending::new(&dir_s),
station: ReliStation::new(),
};
@@ -154,7 +189,7 @@ impl Reliability {
if reload {
// If daemon-reload or daemon-reexec, we need to update all changes, clear db, and submit all changes to db.
self.db_insert();
- self.history.reflush();
+ self.history.flush();
// Due to changes in db, we need to reload the data from db to cache.
self.history.import();
}
@@ -168,6 +203,11 @@ impl Reliability {
self.last.clear_frame();
}
+ /// compact the database
+ pub fn compact(&self) -> Result<()> {
+ self.history.compact()
+ }
+
/// get the enable flag
pub fn enable(&self) -> bool {
self.enable.enable()
@@ -205,9 +245,9 @@ impl Reliability {
self.last.ignore()
}
- /// get the ignore flag of history data
- pub fn history_ignore(&self) -> bool {
- self.history.ignore()
+ /// get the switch flag of history data
+ pub fn history_switch(&self) -> bool {
+ self.history.switch()
}
/// do the debug action: enable the recover process
diff --git a/core/lib/rel/base.rs b/core/lib/rel/base.rs
index 274b504..29200df 100644
--- a/core/lib/rel/base.rs
+++ b/core/lib/rel/base.rs
@@ -31,13 +31,19 @@ pub struct ReDb<K, V> {
switch: RefCell<bool>,
// data
+ /* database */
db: Database<SerdeBincode<K>, SerdeBincode<V>>,
+
+ /* cache */
cache: RefCell<HashMap<K, V>>,
add: RefCell<HashMap<K, V>>,
del: RefCell<HashSet<K>>,
+
+ /* buffer */
+ buffer: RefCell<HashMap<K, V>>, // daemon-reload or daemon-reexec will temporarily store the data here first, and finally refreshes it to db.
+
+ /* property */
name: String,
- buf: RefCell<HashMap<K, V>>, // daemon-reload or daemon-reexec will temporarily store the data here first, and finally refreshes it to db.
- //_phantom: PhantomData<&'a K>,
}
impl<K, V> ReDbTable for ReDb<K, V>
@@ -53,9 +59,8 @@ where
self.cache_2_db(db_wtxn);
}
- /// daemon-reload or daemon-reexec export all data to database
- fn reexport(&self, db_wtxn: &mut ReDbRwTxn) {
- self.rebuf_2_db(db_wtxn);
+ fn flush(&self, db_wtxn: &mut ReDbRwTxn) {
+ self.buffer_2_db(db_wtxn);
}
fn import(&self, db_rtxn: &ReDbRoTxn) {
@@ -63,7 +68,7 @@ where
}
fn switch_set(&self, switch: bool) {
- self.set_switch(switch);
+ self.switch_buffer(switch);
}
}
@@ -81,9 +86,8 @@ where
cache: RefCell::new(HashMap::new()),
add: RefCell::new(HashMap::new()),
del: RefCell::new(HashSet::new()),
+ buffer: RefCell::new(HashMap::new()),
name: String::from(db_name),
- buf: RefCell::new(HashMap::new()),
- //_phantom: PhantomData,
}
}
@@ -95,52 +99,56 @@ where
self.del.borrow_mut().clear();
}
- /// set the ignore flag of data
- pub fn set_switch(&self, switch: bool) {
+ /// set the buffer-switch flag of data
+ pub fn switch_buffer(&self, switch: bool) {
*self.switch.borrow_mut() = switch;
}
/// insert a entry
pub fn insert(&self, k: K, v: V) {
let switch = self.switch();
- log::debug!(
- "ReDb[{}] switch:{:?} insert, key:{:?}, value:{:?}.",
- &self.name,
- switch,
- &k,
- &v
- );
+ log::debug!("ReDb[{}] insert, key:{:?}, value:{:?}.", &self.name, &k, &v);
+ log::debug!("insert with switch:{:?}.", switch);
if switch {
- self.buf.borrow_mut().insert(k, v);
- return;
- }
-
- // remove "del" + insert "add"
- self.del.borrow_mut().remove(&k);
- self.add.borrow_mut().insert(k.clone(), v.clone());
+ // update buffer only
+ self.buffer.borrow_mut().insert(k, v);
+ } else {
+ // remove "del" + insert "add"
+ self.del.borrow_mut().remove(&k);
+ self.add.borrow_mut().insert(k.clone(), v.clone());
- // update cache
- self.cache.borrow_mut().insert(k, v);
+ // update cache
+ self.cache.borrow_mut().insert(k, v);
+ }
}
/// remove a entry
pub fn remove(&self, k: &K) {
- let n = &self.name;
let switch = self.switch();
- log::debug!("ReDb[{}] switch:{:?}, remove, key:{:?}.", n, switch, &k);
+ log::debug!("ReDb[{}] remove, key:{:?}.", &self.name, &k);
+ log::debug!("remove with switch:{:?}.", switch);
if switch {
- self.buf.borrow_mut().remove(k);
- return;
- }
+ // update buffer only
+ self.buffer.borrow_mut().remove(k);
+ } else {
+ // remove "add" + insert "del"
+ self.add.borrow_mut().remove(k);
+ self.del.borrow_mut().insert(k.clone());
- // remove "add" + insert "del"
- self.add.borrow_mut().remove(k);
- self.del.borrow_mut().insert(k.clone());
+ // update cache
+ self.cache.borrow_mut().remove(k);
+ }
+ }
- // update cache
- self.cache.borrow_mut().remove(k);
+ /// get the existence of the key
+ pub fn contains_key(&self, k: &K) -> bool {
+ if self.switch() {
+ self.buffer.borrow().contains_key(k)
+ } else {
+ self.cache.borrow().contains_key(k)
+ }
}
/// get a entry
@@ -151,15 +159,6 @@ where
value
}
- /// get the existence of the key
- pub fn contains_key(&self, k: &K) -> bool {
- if self.switch() {
- return self.buf.borrow().contains_key(k);
- }
-
- self.cache.borrow().contains_key(k)
- }
-
/// get all keys
pub fn keys(&self) -> Vec<K> {
let keys = self
@@ -184,7 +183,7 @@ where
entries
}
- /// export all data from cache to database
+ /// export changed data from cache to database
pub fn cache_2_db(&self, wtxn: &mut ReDbRwTxn) {
// "add" -> db.put + clear "add"
for (k, v) in self.add.borrow().iter() {
@@ -199,17 +198,19 @@ where
self.del.borrow_mut().clear();
}
- /// export all data from cache to database
- pub fn rebuf_2_db(&self, wtxn: &mut ReDbRwTxn) {
- // "buf" -> db.put + clear "buf"
- for (k, v) in self.buf.borrow().iter() {
+ /// flush all data from buffer to database
+ pub fn buffer_2_db(&self, wtxn: &mut ReDbRwTxn) {
+ // clear all data, including "db" and "cache"
+ self.do_clear(wtxn);
+
+ // "buffer" -> db.put + clear "buffer"
+ for (k, v) in self.buffer.borrow().iter() {
self.db.put(&mut wtxn.0, k, v).expect("history.put");
}
-
- self.buf.borrow_mut().clear();
+ self.buffer.borrow_mut().clear();
}
- /// emport all data from database to cache
+ /// import all data from database to cache
pub fn db_2_cache(&self, rtxn: &ReDbRoTxn)
where
K: DeserializeOwned,
@@ -257,13 +258,13 @@ impl<'e> ReDbRoTxn<'e> {
pub trait ReDbTable {
/// clear all data
fn clear(&self, wtxn: &mut ReDbRwTxn);
- /// export all data to database
+ /// export the changed data to database
fn export(&self, wtxn: &mut ReDbRwTxn);
- /// daemon-reload or daemon-reexec export all data to database
- fn reexport(&self, wtxn: &mut ReDbRwTxn);
+ /// flush all data to database
+ fn flush(&self, wtxn: &mut ReDbRwTxn);
/// import all data from database
fn import(&self, rtxn: &ReDbRoTxn);
- /// set the switch flag of data, does switch control whether to use cache or buf
+ /// set the switch flag of data, does switch control whether to use cache or buffer
fn switch_set(&self, switch: bool);
}
diff --git a/core/lib/rel/history.rs b/core/lib/rel/history.rs
index 846f8c5..f9e2146 100644
--- a/core/lib/rel/history.rs
+++ b/core/lib/rel/history.rs
@@ -12,18 +12,29 @@
use super::base::{ReDbRoTxn, ReDbRwTxn, ReDbTable};
use crate::error::*;
-use heed::{Env, EnvOpenOptions};
+use heed::{CompactionOption, Env, EnvOpenOptions};
use std::cell::RefCell;
use std::collections::HashMap;
-use std::path::Path;
+use std::fmt;
+use std::fs::{self, File};
+use std::path::{Path, PathBuf};
use std::rc::Rc;
-use std::{fmt, fs};
+
+const RELI_HISTORY_A_DIR: &str = "a";
+const RELI_HISTORY_B_DIR: &str = "b";
+const RELI_HISTORY_BFLAG_FILE: &str = "b.effect";
const RELI_HISTORY_DIR: &str = "history.mdb";
+const RELI_HISTORY_DATA_FILE: &str = "data.mdb";
+const RELI_HISTORY_LOCK_FILE: &str = "lock.mdb";
pub struct ReliHistory {
// control
- ignore: RefCell<bool>,
+ switch: RefCell<bool>,
+
+ // directory
+ b_exist: bool,
+ hdir: String, // home-directory
// environment
env: Env,
@@ -42,18 +53,19 @@ impl fmt::Debug for ReliHistory {
}
impl ReliHistory {
- pub fn new(dir_str: &str, max: u32) -> ReliHistory {
- // init environment
- let path = Path::new(dir_str).join(RELI_HISTORY_DIR);
- let env = EnvOpenOptions::new()
- .map_size(10 * 1024 * 1024)
- .max_dbs(max)
- .open(path)
- .unwrap();
+ pub fn new(dir_str: &str, map_size: Option<usize>, max_dbs: Option<u32>) -> ReliHistory {
+ // init environment, path: dir/history.mdb/(a|b)/
+ let history = history_path_get(dir_str);
+ let b_exist = bflag_path_get(history.clone()).exists();
+ let path = history.join(&subdir_cur_get(b_exist));
+ let env = open_env(path.clone(), map_size, max_dbs).expect("history open env");
+ log::info!("history with path {:?} successfully.", path);
// return
ReliHistory {
- ignore: RefCell::new(false),
+ switch: RefCell::new(false),
+ b_exist,
+ hdir: String::from(dir_str),
env,
dbs: RefCell::new(HashMap::new()),
}
@@ -75,7 +87,7 @@ impl ReliHistory {
// create transaction
let mut db_wtxn = ReDbRwTxn::new(&self.env).expect("history.write_txn");
- // flush to db
+ // export to db
for (_, db) in self.dbs.borrow().iter() {
db.export(&mut db_wtxn);
}
@@ -84,15 +96,13 @@ impl ReliHistory {
db_wtxn.0.commit().expect("history.commit");
}
- /// daemon-reload or daemon-reexec clear db and data reflush to db
- pub fn reflush(&self) {
+ pub(super) fn flush(&self) {
// create transaction
let mut db_wtxn = ReDbRwTxn::new(&self.env).expect("history.write_txn");
// flush to db
for (_, db) in self.dbs.borrow().iter() {
- db.clear(&mut db_wtxn);
- db.reexport(&mut db_wtxn);
+ db.flush(&mut db_wtxn);
}
// commit
@@ -108,9 +118,48 @@ impl ReliHistory {
}
}
+ pub(super) fn compact(&self) -> Result<()> {
+ // a -> b or b -> a
+ // prepare next
+ let history = history_path_get(&self.hdir);
+ let next_path = history.join(&subdir_next_get(self.b_exist));
+ let next_file = next_path.join(RELI_HISTORY_DATA_FILE);
+
+ // clear next: delete and re-create the whole directory
+ fs::remove_dir_all(next_path.clone()).context(IoSnafu)?;
+ fs::create_dir_all(next_path).context(IoSnafu)?;
+
+ // copy to next
+ self.env
+ .copy_to_path(next_file.clone(), CompactionOption::Disabled)
+ .context(HeedSnafu)?;
+ log::info!("compact to file {:?} successfully.", next_file);
+
+ // remark the next flag at last: the another one
+ let bflag = bflag_path_get(history.clone());
+ if self.b_exist {
+ fs::remove_file(bflag).context(IoSnafu)?;
+ } else {
+ File::create(bflag).context(IoSnafu)?;
+ }
+
+ // try to clear previous: it would be done in the next re-exec, but we try to delete it as soon as possible.
+ let cur_path = history.join(subdir_cur_get(self.b_exist));
+ let cur_data = cur_path.join(RELI_HISTORY_DATA_FILE);
+ let cur_lock = cur_path.join(RELI_HISTORY_LOCK_FILE);
+ if let Err(e) = fs::remove_file(cur_data.clone()) {
+ log::error!("remove data file {:?} failed, err = {:?}", cur_data, e);
+ }
+ if let Err(e) = fs::remove_file(cur_lock.clone()) {
+ log::error!("remove lock file {:?} failed, err = {:?}", cur_lock, e);
+ }
+
+ Ok(())
+ }
+
pub fn switch_set(&self, switch: bool) {
// set switch
- *self.ignore.borrow_mut() = switch;
+ *self.switch.borrow_mut() = switch;
for (_, db) in self.dbs.borrow().iter() {
db.switch_set(switch);
}
@@ -124,16 +173,67 @@ impl ReliHistory {
self.dbs.borrow_mut().clear();
}
- pub fn ignore(&self) -> bool {
- *self.ignore.borrow()
+ pub fn switch(&self) -> bool {
+ *self.switch.borrow()
}
}
pub fn prepare(dir_str: &str) -> Result<()> {
- let history = Path::new(dir_str).join(RELI_HISTORY_DIR);
+ // directory
+ let history = history_path_get(dir_str);
if !history.exists() {
fs::create_dir_all(&history).context(IoSnafu)?;
}
+ // sub-directory
+ let a = history.join(RELI_HISTORY_A_DIR);
+ if !a.exists() {
+ fs::create_dir_all(&a).context(IoSnafu)?;
+ }
+
+ let b = history.join(RELI_HISTORY_B_DIR);
+ if !b.exists() {
+ fs::create_dir_all(&b).context(IoSnafu)?;
+ }
+
Ok(())
}
+
+fn open_env(path: PathBuf, map_size: Option<usize>, max_dbs: Option<u32>) -> heed::Result<Env> {
+ let mut eoo = EnvOpenOptions::new();
+ if let Some(size) = map_size {
+ eoo.map_size(size);
+ }
+ if let Some(max) = max_dbs {
+ eoo.max_dbs(max);
+ }
+ eoo.open(path)
+}
+
+fn subdir_next_get(b_exist: bool) -> String {
+ if b_exist {
+ // b->a
+ String::from(RELI_HISTORY_A_DIR)
+ } else {
+ // a->b
+ String::from(RELI_HISTORY_B_DIR)
+ }
+}
+
+fn subdir_cur_get(b_exist: bool) -> String {
+ if b_exist {
+ // b
+ String::from(RELI_HISTORY_B_DIR)
+ } else {
+ // a
+ String::from(RELI_HISTORY_A_DIR)
+ }
+}
+
+fn bflag_path_get(history: PathBuf) -> PathBuf {
+ history.join(RELI_HISTORY_BFLAG_FILE)
+}
+
+fn history_path_get(dir: &str) -> PathBuf {
+ Path::new(dir).join(RELI_HISTORY_DIR)
+}
diff --git a/core/lib/rel/mod.rs b/core/lib/rel/mod.rs
index 757a74b..07470e4 100644
--- a/core/lib/rel/mod.rs
+++ b/core/lib/rel/mod.rs
@@ -11,7 +11,7 @@
// See the Mulan PSL v2 for more details.
//! reliability module
-pub use api::{reli_debug_enable_switch, reli_debug_get_switch, Reliability};
+pub use api::{reli_debug_enable_switch, reli_debug_get_switch, ReliConf, Reliability};
pub use base::{reli_dir_prepare, ReDb, ReDbRoTxn, ReDbRwTxn, ReDbTable};
use serde::{Deserialize, Serialize};
pub use station::{ReStation, ReStationKind};
diff --git a/docs/man/sysmaster.conf.md b/docs/man/sysmaster.conf.md
index 039b543..2b91f34 100644
--- a/docs/man/sysmaster.conf.md
+++ b/docs/man/sysmaster.conf.md
@@ -19,3 +19,11 @@ sysmaster支持从`/etc/sysmaster/system.toml`中读取系统配置,用于配
### LogFile
支持配置为`"`括起来的绝对路径,仅当`"LogTarget"`配置为`"file"`时生效。如果配置为空或不配置,将强制修改`LogTarget`为`"console"`。
+
+## 外置db配置
+
+支持通过`DbSize`等配置调整外置db参量。
+
+### DbSize
+
+DbSize参量支持配置为最大内存占用规格单位为字节。当配置值小于当前sysmaster所用内存值时以当前sysmaster所用内存值为准。此配置在系统启动或者daemon-reexec后生效。
--
2.33.0