]> git.proxmox.com Git - proxmox-backup.git/commitdiff
RRD_CACHE: use a OnceCell instead of lazy_static
authorDietmar Maurer <dietmar@proxmox.com>
Wed, 13 Oct 2021 08:24:39 +0000 (10:24 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 13 Oct 2021 11:36:02 +0000 (13:36 +0200)
And initialize only with proxmox-backup-proxy. Other binaries dont need it.

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/api2/node/rrd.rs
src/api2/status.rs
src/bin/proxmox-backup-api.rs
src/bin/proxmox-backup-proxy.rs
src/lib.rs

index c59a35a4412d789a1481c81c416d63f4d83312ae..b53076d79d21cc03e66cbe098098dbc1f1bdc9c7 100644 (file)
@@ -10,7 +10,7 @@ use pbs_api_types::{
 
 use proxmox_rrd::rrd::RRD_DATA_ENTRIES;
 
-use crate::RRD_CACHE;
+use crate::get_rrd_cache;
 
 pub fn create_value_from_rrd(
     basedir: &str,
@@ -22,8 +22,10 @@ pub fn create_value_from_rrd(
     let mut result = Vec::new();
     let now = proxmox_time::epoch_f64();
 
+    let rrd_cache = get_rrd_cache()?;
+
     for name in list {
-        let (start, reso, list) = match RRD_CACHE.extract_cached_data(basedir, name, now, timeframe, cf) {
+        let (start, reso, list) = match rrd_cache.extract_cached_data(basedir, name, now, timeframe, cf) {
             Some(result) => result,
             None => continue,
         };
index 9c7d4f7d2ed105f2797d829b5939a78a9cc6c456..40a9e5b46e82d4a53e86e36841f19310dd185be0 100644 (file)
@@ -22,7 +22,7 @@ use pbs_datastore::DataStore;
 use pbs_config::CachedUserInfo;
 
 use crate::tools::statistics::{linear_regression};
-use crate::RRD_CACHE;
+use crate::get_rrd_cache;
 
 #[api(
     returns: {
@@ -90,6 +90,8 @@ pub fn datastore_status(
 
     let mut list = Vec::new();
 
+    let rrd_cache = get_rrd_cache()?;
+
     for (store, (_, _)) in &config.sections {
         let user_privs = user_info.lookup_privs(&auth_id, &["datastore", &store]);
         let allowed = (user_privs & (PRIV_DATASTORE_AUDIT| PRIV_DATASTORE_BACKUP)) != 0;
@@ -123,7 +125,8 @@ pub fn datastore_status(
         let rrd_dir = format!("datastore/{}", store);
         let now = proxmox_time::epoch_f64();
 
-        let get_rrd = |what: &str| RRD_CACHE.extract_cached_data(
+
+        let get_rrd = |what: &str| rrd_cache.extract_cached_data(
             &rrd_dir,
             what,
             now,
index 3c963a7735e0b8738f9d631d176683b935b6573b..8d6c3170b0c1cad5af2c35daccd1aa9fd18c0528 100644 (file)
@@ -16,7 +16,6 @@ use proxmox_rest_server::{daemon, AuthError, ApiConfig, RestServer, RestEnvironm
 
 use proxmox_backup::server::auth::check_pbs_auth;
 use proxmox_backup::auth_helpers::*;
-use proxmox_backup::RRD_CACHE;
 use proxmox_backup::config;
 
 fn main() {
@@ -73,9 +72,6 @@ async fn run() -> Result<(), Error> {
     config::update_self_signed_cert(false)?;
 
     proxmox_backup::server::create_run_dir()?;
-
-    RRD_CACHE.apply_journal()?;
-
     proxmox_backup::server::jobstate::create_jobstate_dir()?;
     proxmox_backup::tape::create_tape_status_dir()?;
     proxmox_backup::tape::create_drive_state_dir()?;
index 8da98ff836d7f211a49da75449b4c96464e07dcd..66d81bdbf462f4219a89dde742b0e844f262f524 100644 (file)
@@ -32,7 +32,7 @@ use proxmox_rest_server::{
 };
 
 use proxmox_backup::{
-    RRD_CACHE,
+    get_rrd_cache, initialize_rrd_cache,
     server::{
         auth::check_pbs_auth,
         jobstate::{
@@ -208,6 +208,9 @@ async fn run() -> Result<(), Error> {
     let _ = public_auth_key(); // load with lazy_static
     let _ = csrf_secret(); // load with lazy_static
 
+    let rrd_cache = initialize_rrd_cache()?;
+    rrd_cache.apply_journal()?;
+
     let mut config = ApiConfig::new(
         pbs_buildcfg::JS_DIR,
         &proxmox_backup::api2::ROUTER,
@@ -901,14 +904,18 @@ async fn run_stat_generator() {
 }
 
 fn rrd_update_gauge(name: &str, value: f64) {
-    if let Err(err) = RRD_CACHE.update_value(name, value, DST::Gauge) {
-        eprintln!("rrd::update_value '{}' failed - {}", name, err);
+    if let Ok(rrd_cache) = get_rrd_cache() {
+        if let Err(err) = rrd_cache.update_value(name, value, DST::Gauge) {
+            eprintln!("rrd::update_value '{}' failed - {}", name, err);
+        }
     }
 }
 
 fn rrd_update_derive(name: &str, value: f64) {
-    if let Err(err) = RRD_CACHE.update_value(name, value, DST::Derive) {
-        eprintln!("rrd::update_value '{}' failed - {}", name, err);
+    if let Ok(rrd_cache) = get_rrd_cache() {
+        if let Err(err) = rrd_cache.update_value(name, value, DST::Derive) {
+            eprintln!("rrd::update_value '{}' failed - {}", name, err);
+        }
     }
 }
 
index 5d2b45907837aeda01fdf15dd974f982845e7c3d..a1ac23bf7d8000011388fab34a6c2876b4e30725 100644 (file)
@@ -5,6 +5,9 @@
 
 use std::path::PathBuf;
 
+use once_cell::sync::OnceCell;
+use anyhow::{format_err, Error};
+
 use proxmox::tools::fs::CreateOptions;
 
 use pbs_buildcfg::configdir;
@@ -39,25 +42,39 @@ pub fn cert_info() -> Result<CertInfo, anyhow::Error> {
     CertInfo::from_path(PathBuf::from(configdir!("/proxy.pem")))
 }
 
-lazy_static::lazy_static!{
-    /// Proxmox Backup Server RRD cache instance
-    pub static ref RRD_CACHE: RRDCache = {
-        let backup_user = pbs_config::backup_user().unwrap();
-        let file_options = CreateOptions::new()
-            .owner(backup_user.uid)
-            .group(backup_user.gid);
-
-       let dir_options = CreateOptions::new()
-            .owner(backup_user.uid)
-            .group(backup_user.gid);
-
-        let apply_interval = 30.0*60.0; // 30 minutes
-
-        RRDCache::new(
-            "/var/lib/proxmox-backup/rrdb",
-            Some(file_options),
-            Some(dir_options),
-            apply_interval,
-        ).unwrap()
-    };
+pub static RRD_CACHE: OnceCell<RRDCache> = OnceCell::new();
+
+/// Get the RRD cache instance
+pub fn get_rrd_cache() -> Result<&'static RRDCache, Error> {
+    RRD_CACHE.get().ok_or_else(|| format_err!("RRD cache not initialized!"))
+}
+
+/// Initialize the RRD cache instance
+///
+/// Note: Only a single process must do this (proxmox-backup-proxy)
+pub fn initialize_rrd_cache() -> Result<&'static RRDCache, Error> {
+
+    let backup_user = pbs_config::backup_user()?;
+
+    let file_options = CreateOptions::new()
+        .owner(backup_user.uid)
+        .group(backup_user.gid);
+
+    let dir_options = CreateOptions::new()
+        .owner(backup_user.uid)
+        .group(backup_user.gid);
+
+    let apply_interval = 30.0*60.0; // 30 minutes
+
+    let cache = RRDCache::new(
+        "/var/lib/proxmox-backup/rrdb",
+        Some(file_options),
+        Some(dir_options),
+        apply_interval,
+    )?;
+
+    RRD_CACHE.set(cache)
+        .map_err(|_| format_err!("RRD cache already initialized!"))?;
+
+    Ok(RRD_CACHE.get().unwrap())
 }