]>
git.proxmox.com Git - proxmox-backup.git/blob - proxmox-rrd/src/cache/rrd_map.rs
3 use std
::collections
::HashMap
;
5 use anyhow
::{bail, Error}
;
7 use proxmox_sys
::fs
::create_path
;
9 use crate::rrd
::{CF, DST, RRD}
;
11 use super::CacheConfig
;
14 config
: Arc
<CacheConfig
>,
15 map
: HashMap
<String
, RRD
>,
16 load_rrd_cb
: fn(path
: &Path
, rel_path
: &str, dst
: DST
) -> RRD
,
22 config
: Arc
<CacheConfig
>,
23 load_rrd_cb
: fn(path
: &Path
, rel_path
: &str, dst
: DST
) -> RRD
,
39 ) -> Result
<(), Error
> {
40 if let Some(rrd
) = self.map
.get_mut(rel_path
) {
41 if !new_only
|| time
> rrd
.last_update() {
42 rrd
.update(time
, value
);
45 let mut path
= self.config
.basedir
.clone();
48 path
.parent().unwrap(),
49 Some(self.config
.dir_options
.clone()),
50 Some(self.config
.dir_options
.clone()),
53 let mut rrd
= (self.load_rrd_cb
)(&path
, rel_path
, dst
);
55 if !new_only
|| time
> rrd
.last_update() {
56 rrd
.update(time
, value
);
58 self.map
.insert(rel_path
.to_string(), rrd
);
63 pub fn file_list(&self) -> Vec
<String
> {
64 let mut list
= Vec
::new();
66 for rel_path
in self.map
.keys() {
67 list
.push(rel_path
.clone());
73 pub fn flush_rrd_file(&self, rel_path
: &str) -> Result
<(), Error
> {
74 if let Some(rrd
) = self.map
.get(rel_path
) {
75 let mut path
= self.config
.basedir
.clone();
77 rrd
.save(&path
, self.config
.file_options
.clone(), true)
79 bail
!("rrd file {} not loaded", rel_path
);
83 pub fn extract_cached_data(
91 ) -> Result
<Option
<(u64, u64, Vec
<Option
<f64>>)>, Error
> {
92 match self.map
.get(&format
!("{}/{}", base
, name
)) {
93 Some(rrd
) => Ok(Some(rrd
.extract_data(cf
, resolution
, start
, end
)?
)),