1 use std
::path
::PathBuf
;
2 use std
::collections
::HashMap
;
3 use std
::sync
::{RwLock}
;
5 use anyhow
::{format_err, Error}
;
6 use lazy_static
::lazy_static
;
8 use proxmox
::tools
::fs
::{create_path, CreateOptions}
;
10 use crate::api2
::types
::{RRDMode, RRDTimeFrameResolution}
;
14 const PBS_RRD_BASEDIR
: &str = "/var/lib/proxmox-backup/rrdb";
17 static ref RRD_CACHE
: RwLock
<HashMap
<String
, RRD
>> = {
18 RwLock
::new(HashMap
::new())
22 /// Create rrdd stat dir with correct permission
23 pub fn create_rrdb_dir() -> Result
<(), Error
> {
25 let backup_user
= crate::backup
::backup_user()?
;
26 let opts
= CreateOptions
::new()
27 .owner(backup_user
.uid
)
28 .group(backup_user
.gid
);
30 create_path(PBS_RRD_BASEDIR
, None
, Some(opts
))
31 .map_err(|err
: Error
| format_err
!("unable to create rrdb stat dir - {}", err
))?
;
36 pub fn update_value(rel_path
: &str, value
: f64, dst
: DST
, save
: bool
) -> Result
<(), Error
> {
38 let mut path
= PathBuf
::from(PBS_RRD_BASEDIR
);
41 std
::fs
::create_dir_all(path
.parent().unwrap())?
;
43 let mut map
= RRD_CACHE
.write().unwrap();
44 let now
= proxmox
::tools
::time
::epoch_f64();
46 if let Some(rrd
) = map
.get_mut(rel_path
) {
47 rrd
.update(now
, value
);
48 if save { rrd.save(&path)?; }
50 let mut rrd
= match RRD
::load(&path
) {
53 if err
.kind() != std
::io
::ErrorKind
::NotFound
{
54 eprintln
!("overwriting RRD file {:?}, because of load error: {}", path
, err
);
59 rrd
.update(now
, value
);
60 if save { rrd.save(&path)?; }
61 map
.insert(rel_path
.into(), rrd
);
67 pub fn extract_cached_data(
71 timeframe
: RRDTimeFrameResolution
,
73 ) -> Option
<(u64, u64, Vec
<Option
<f64>>)> {
75 let map
= RRD_CACHE
.read().unwrap();
77 match map
.get(&format
!("{}/{}", base
, name
)) {
78 Some(rrd
) => Some(rrd
.extract_data(now
, timeframe
, mode
)),