diff --git a/src/api3/datastore.rs b/src/api3/datastore.rs index df4c0f29..5dc2d256 100644 --- a/src/api3/datastore.rs +++ b/src/api3/datastore.rs @@ -1,9 +1,5 @@ use failure::*; -use std::collections::HashMap; -use lazy_static::lazy_static; -use std::sync::{Arc, Mutex}; - use crate::api::schema::*; use crate::api::router::*; use serde_json::{json, Value}; @@ -12,33 +8,12 @@ use crate::config::datastore; use crate::backup::datastore::*; -lazy_static!{ - static ref datastore_map: Mutex>> = Mutex::new(HashMap::new()); -} - -fn lookup_datastore(name: &str) -> Result, Error> { - - let mut map = datastore_map.lock().unwrap(); - - if let Some(datastore) = map.get(name) { - return Ok(datastore.clone()); - } - - if let Ok(datastore) = DataStore::open(name) { - let datastore = Arc::new(datastore); - map.insert(name.to_string(), datastore.clone()); - return Ok(datastore); - } - - bail!("store not found"); -} - // this is just a test for mutability/mutex handling - will remove later fn start_garbage_collection(param: Value, _info: &ApiMethod) -> Result { let name = param["name"].as_str().unwrap(); - let datastore = lookup_datastore(name)?; + let datastore = DataStore::lookup_datastore(name)?; println!("Starting garbage collection on store {}", name); diff --git a/src/backup/chunk_store.rs b/src/backup/chunk_store.rs index 784d02b3..f75744aa 100644 --- a/src/backup/chunk_store.rs +++ b/src/backup/chunk_store.rs @@ -31,7 +31,7 @@ impl Default for GarbageCollectionStatus { pub struct ChunkStore { name: String, // used for error reporting - base: PathBuf, + pub (crate) base: PathBuf, chunk_dir: PathBuf, mutex: Mutex, _lockfile: File, diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs index 571e9396..03b07fec 100644 --- a/src/backup/datastore.rs +++ b/src/backup/datastore.rs @@ -1,7 +1,9 @@ use failure::*; use std::path::{PathBuf, Path}; -use std::sync::Mutex; +use std::collections::HashMap; +use lazy_static::lazy_static; +use std::sync::{Mutex, Arc}; use crate::config::datastore; use super::chunk_store::*; @@ -12,8 +14,38 @@ pub struct DataStore { gc_mutex: Mutex, } +lazy_static!{ + static ref datastore_map: Mutex>> = Mutex::new(HashMap::new()); +} + impl DataStore { + pub fn lookup_datastore(name: &str) -> Result, Error> { + + let config = datastore::config()?; + let (_, store_config) = config.sections.get(name) + .ok_or(format_err!("no such datastore '{}'", name))?; + + let path = store_config["path"].as_str().unwrap(); + + let mut map = datastore_map.lock().unwrap(); + + if let Some(datastore) = map.get(name) { + // Compare Config - if changed, create new Datastore object! + if (datastore.chunk_store.base == PathBuf::from(path)) { + return Ok(datastore.clone()); + } + } + + if let Ok(datastore) = DataStore::open(name) { + let datastore = Arc::new(datastore); + map.insert(name.to_string(), datastore.clone()); + return Ok(datastore); + } + + bail!("store not found"); + } + pub fn open(store_name: &str) -> Result { let config = datastore::config()?;