src/api2/admin/datastore.rs: implement API to return last GC status
This commit is contained in:
parent
8d76e8b773
commit
f2b99c34f7
|
@ -323,10 +323,13 @@ fn garbage_collection_status(
|
||||||
|
|
||||||
let store = param["store"].as_str().unwrap();
|
let store = param["store"].as_str().unwrap();
|
||||||
|
|
||||||
|
let datastore = DataStore::lookup_datastore(&store)?;
|
||||||
|
|
||||||
println!("Garbage collection status on store {}", store);
|
println!("Garbage collection status on store {}", store);
|
||||||
|
|
||||||
Ok(json!(null))
|
let status = datastore.last_gc_status();
|
||||||
|
|
||||||
|
Ok(serde_json::to_value(&status)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn api_method_garbage_collection_status() -> ApiMethod {
|
pub fn api_method_garbage_collection_status() -> ApiMethod {
|
||||||
|
@ -391,7 +394,7 @@ pub fn router() -> Router {
|
||||||
{"subdir": "gc" },
|
{"subdir": "gc" },
|
||||||
{"subdir": "groups" },
|
{"subdir": "groups" },
|
||||||
{"subdir": "snapshots" },
|
{"subdir": "snapshots" },
|
||||||
{"subdir": "status" },
|
//{"subdir": "status" },
|
||||||
{"subdir": "prune" },
|
{"subdir": "prune" },
|
||||||
])),
|
])),
|
||||||
ObjectSchema::new("Directory index.")
|
ObjectSchema::new("Directory index.")
|
||||||
|
|
|
@ -4,12 +4,15 @@ use std::path::{Path, PathBuf};
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::os::unix::io::AsRawFd;
|
use std::os::unix::io::AsRawFd;
|
||||||
|
use serde_derive::Serialize;
|
||||||
|
|
||||||
use openssl::sha;
|
use openssl::sha;
|
||||||
|
|
||||||
use crate::tools;
|
use crate::tools;
|
||||||
|
|
||||||
|
#[derive(Clone, Serialize)]
|
||||||
pub struct GarbageCollectionStatus {
|
pub struct GarbageCollectionStatus {
|
||||||
|
pub upid: Option<String>,
|
||||||
pub used_bytes: usize,
|
pub used_bytes: usize,
|
||||||
pub used_chunks: usize,
|
pub used_chunks: usize,
|
||||||
pub disk_bytes: usize,
|
pub disk_bytes: usize,
|
||||||
|
@ -19,6 +22,7 @@ pub struct GarbageCollectionStatus {
|
||||||
impl Default for GarbageCollectionStatus {
|
impl Default for GarbageCollectionStatus {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
GarbageCollectionStatus {
|
GarbageCollectionStatus {
|
||||||
|
upid: None,
|
||||||
used_bytes: 0,
|
used_bytes: 0,
|
||||||
used_chunks: 0,
|
used_chunks: 0,
|
||||||
disk_bytes: 0,
|
disk_bytes: 0,
|
||||||
|
|
|
@ -26,6 +26,7 @@ lazy_static!{
|
||||||
pub struct DataStore {
|
pub struct DataStore {
|
||||||
chunk_store: Arc<ChunkStore>,
|
chunk_store: Arc<ChunkStore>,
|
||||||
gc_mutex: Mutex<bool>,
|
gc_mutex: Mutex<bool>,
|
||||||
|
last_gc_status: Mutex<GarbageCollectionStatus>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DataStore {
|
impl DataStore {
|
||||||
|
@ -65,9 +66,12 @@ impl DataStore {
|
||||||
|
|
||||||
let chunk_store = ChunkStore::open(store_name, path)?;
|
let chunk_store = ChunkStore::open(store_name, path)?;
|
||||||
|
|
||||||
|
let gc_status = GarbageCollectionStatus::default();
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
chunk_store: Arc::new(chunk_store),
|
chunk_store: Arc::new(chunk_store),
|
||||||
gc_mutex: Mutex::new(false),
|
gc_mutex: Mutex::new(false),
|
||||||
|
last_gc_status: Mutex::new(gc_status),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,6 +231,10 @@ impl DataStore {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn last_gc_status(&self) -> GarbageCollectionStatus {
|
||||||
|
self.last_gc_status.lock().unwrap().clone()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn garbage_collection(&self, worker: Arc<WorkerTask>) -> Result<(), Error> {
|
pub fn garbage_collection(&self, worker: Arc<WorkerTask>) -> Result<(), Error> {
|
||||||
|
|
||||||
if let Ok(ref mut _mutex) = self.gc_mutex.try_lock() {
|
if let Ok(ref mut _mutex) = self.gc_mutex.try_lock() {
|
||||||
|
@ -236,7 +244,7 @@ impl DataStore {
|
||||||
let oldest_writer = self.chunk_store.oldest_writer();
|
let oldest_writer = self.chunk_store.oldest_writer();
|
||||||
|
|
||||||
let mut gc_status = GarbageCollectionStatus::default();
|
let mut gc_status = GarbageCollectionStatus::default();
|
||||||
gc_status.used_bytes = 0;
|
gc_status.upid = Some(worker.to_string());
|
||||||
|
|
||||||
worker.log("Start GC phase1 (mark chunks)");
|
worker.log("Start GC phase1 (mark chunks)");
|
||||||
|
|
||||||
|
@ -250,6 +258,8 @@ impl DataStore {
|
||||||
worker.log(&format!("Disk bytes: {}", gc_status.disk_bytes));
|
worker.log(&format!("Disk bytes: {}", gc_status.disk_bytes));
|
||||||
worker.log(&format!("Disk chunks: {}", gc_status.disk_chunks));
|
worker.log(&format!("Disk chunks: {}", gc_status.disk_chunks));
|
||||||
|
|
||||||
|
*self.last_gc_status.lock().unwrap() = gc_status;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
bail!("Start GC failed - (already running/locked)");
|
bail!("Start GC failed - (already running/locked)");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue