mirror of
https://github.com/deuxfleurs-org/garage.git
synced 2026-08-27 07:27:40 +00:00
Merge pull request 'garage_db: rename len to approximate_len as it is used for stats only' (#1141) from db-approximate-len into main-v1
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/1141
This commit is contained in:
@@ -408,8 +408,8 @@ impl BlockManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get number of items in the refcount table
|
/// Get number of items in the refcount table
|
||||||
pub fn rc_len(&self) -> Result<usize, Error> {
|
pub fn rc_approximate_len(&self) -> Result<usize, Error> {
|
||||||
Ok(self.rc.rc_table.len()?)
|
Ok(self.rc.rc_table.approximate_len()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Send command to start/stop/manager scrub worker
|
/// Send command to start/stop/manager scrub worker
|
||||||
@@ -427,7 +427,7 @@ impl BlockManager {
|
|||||||
|
|
||||||
/// List all resync errors
|
/// List all resync errors
|
||||||
pub fn list_resync_errors(&self) -> Result<Vec<BlockResyncErrorInfo>, Error> {
|
pub fn list_resync_errors(&self) -> Result<Vec<BlockResyncErrorInfo>, Error> {
|
||||||
let mut blocks = Vec::with_capacity(self.resync.errors.len()?);
|
let mut blocks = Vec::with_capacity(self.resync.errors.approximate_len()?);
|
||||||
for ent in self.resync.errors.iter()? {
|
for ent in self.resync.errors.iter()? {
|
||||||
let (hash, cnt) = ent?;
|
let (hash, cnt) = ent?;
|
||||||
let cnt = ErrorCounter::decode(&cnt);
|
let cnt = ErrorCounter::decode(&cnt);
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ impl BlockManagerMetrics {
|
|||||||
.init(),
|
.init(),
|
||||||
_rc_size: meter
|
_rc_size: meter
|
||||||
.u64_value_observer("block.rc_size", move |observer| {
|
.u64_value_observer("block.rc_size", move |observer| {
|
||||||
if let Ok(value) = rc_tree.len() {
|
if let Ok(value) = rc_tree.approximate_len() {
|
||||||
observer.observe(value as u64, &[])
|
observer.observe(value as u64, &[])
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -58,7 +58,7 @@ impl BlockManagerMetrics {
|
|||||||
.init(),
|
.init(),
|
||||||
_resync_queue_len: meter
|
_resync_queue_len: meter
|
||||||
.u64_value_observer("block.resync_queue_length", move |observer| {
|
.u64_value_observer("block.resync_queue_length", move |observer| {
|
||||||
if let Ok(value) = resync_queue.len() {
|
if let Ok(value) = resync_queue.approximate_len() {
|
||||||
observer.observe(value as u64, &[]);
|
observer.observe(value as u64, &[]);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -68,7 +68,7 @@ impl BlockManagerMetrics {
|
|||||||
.init(),
|
.init(),
|
||||||
_resync_errored_blocks: meter
|
_resync_errored_blocks: meter
|
||||||
.u64_value_observer("block.resync_errored_blocks", move |observer| {
|
.u64_value_observer("block.resync_errored_blocks", move |observer| {
|
||||||
if let Ok(value) = resync_errors.len() {
|
if let Ok(value) = resync_errors.approximate_len() {
|
||||||
observer.observe(value as u64, &[]);
|
observer.observe(value as u64, &[]);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
+8
-6
@@ -106,13 +106,13 @@ impl BlockResyncManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get length of resync queue
|
/// Get length of resync queue
|
||||||
pub fn queue_len(&self) -> Result<usize, Error> {
|
pub fn queue_approximate_len(&self) -> Result<usize, Error> {
|
||||||
Ok(self.queue.len()?)
|
Ok(self.queue.approximate_len()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get number of blocks that have an error
|
/// Get number of blocks that have an error
|
||||||
pub fn errors_len(&self) -> Result<usize, Error> {
|
pub fn errors_approximate_len(&self) -> Result<usize, Error> {
|
||||||
Ok(self.errors.len()?)
|
Ok(self.errors.approximate_len()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clear the error counter for a block and put it in queue immediately
|
/// Clear the error counter for a block and put it in queue immediately
|
||||||
@@ -548,9 +548,11 @@ impl Worker for ResyncWorker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
WorkerStatus {
|
WorkerStatus {
|
||||||
queue_length: Some(self.manager.resync.queue_len().unwrap_or(0) as u64),
|
queue_length: Some(self.manager.resync.queue_approximate_len().unwrap_or(0) as u64),
|
||||||
tranquility: Some(tranquility),
|
tranquility: Some(tranquility),
|
||||||
persistent_errors: Some(self.manager.resync.errors_len().unwrap_or(0) as u64),
|
persistent_errors: Some(
|
||||||
|
self.manager.resync.errors_approximate_len().unwrap_or(0) as u64
|
||||||
|
),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,10 +132,14 @@ impl IDb for FjallDb {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn len(&self, tree_idx: usize) -> Result<usize> {
|
fn approximate_len(&self, tree_idx: usize) -> Result<usize> {
|
||||||
|
let tree = self.get_tree(tree_idx)?;
|
||||||
|
Ok(tree.approximate_len())
|
||||||
|
}
|
||||||
|
fn is_empty(&self, tree_idx: usize) -> Result<bool> {
|
||||||
let tree = self.get_tree(tree_idx)?;
|
let tree = self.get_tree(tree_idx)?;
|
||||||
let tx = self.keyspace.read_tx();
|
let tx = self.keyspace.read_tx();
|
||||||
Ok(tx.len(&tree)?)
|
Ok(tx.is_empty(&tree)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn insert(&self, tree_idx: usize, key: &[u8], value: &[u8]) -> Result<()> {
|
fn insert(&self, tree_idx: usize, key: &[u8], value: &[u8]) -> Result<()> {
|
||||||
|
|||||||
+9
-4
@@ -154,7 +154,7 @@ impl Db {
|
|||||||
let tree_names = other.list_trees()?;
|
let tree_names = other.list_trees()?;
|
||||||
for name in tree_names {
|
for name in tree_names {
|
||||||
let tree = self.open_tree(&name)?;
|
let tree = self.open_tree(&name)?;
|
||||||
if tree.len()? > 0 {
|
if !tree.is_empty()? {
|
||||||
return Err(Error(format!("tree {} already contains data", name).into()));
|
return Err(Error(format!("tree {} already contains data", name).into()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,8 +196,12 @@ impl Tree {
|
|||||||
self.0.get(self.1, key.as_ref())
|
self.0.get(self.1, key.as_ref())
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn len(&self) -> Result<usize> {
|
pub fn approximate_len(&self) -> Result<usize> {
|
||||||
self.0.len(self.1)
|
self.0.approximate_len(self.1)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn is_empty(&self) -> Result<bool> {
|
||||||
|
self.0.is_empty(self.1)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -335,7 +339,8 @@ pub(crate) trait IDb: Send + Sync {
|
|||||||
fn snapshot(&self, path: &PathBuf) -> Result<()>;
|
fn snapshot(&self, path: &PathBuf) -> Result<()>;
|
||||||
|
|
||||||
fn get(&self, tree: usize, key: &[u8]) -> Result<Option<Value>>;
|
fn get(&self, tree: usize, key: &[u8]) -> Result<Option<Value>>;
|
||||||
fn len(&self, tree: usize) -> Result<usize>;
|
fn approximate_len(&self, tree: usize) -> Result<usize>;
|
||||||
|
fn is_empty(&self, tree: usize) -> Result<bool>;
|
||||||
|
|
||||||
fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()>;
|
fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()>;
|
||||||
fn remove(&self, tree: usize, key: &[u8]) -> Result<()>;
|
fn remove(&self, tree: usize, key: &[u8]) -> Result<()>;
|
||||||
|
|||||||
@@ -126,11 +126,16 @@ impl IDb for LmdbDb {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn len(&self, tree: usize) -> Result<usize> {
|
fn approximate_len(&self, tree: usize) -> Result<usize> {
|
||||||
let tree = self.get_tree(tree)?;
|
let tree = self.get_tree(tree)?;
|
||||||
let tx = self.db.read_txn()?;
|
let tx = self.db.read_txn()?;
|
||||||
Ok(tree.len(&tx)?.try_into().unwrap())
|
Ok(tree.len(&tx)?.try_into().unwrap())
|
||||||
}
|
}
|
||||||
|
fn is_empty(&self, tree: usize) -> Result<bool> {
|
||||||
|
let tree = self.get_tree(tree)?;
|
||||||
|
let tx = self.db.read_txn()?;
|
||||||
|
Ok(tree.is_empty(&tx)?)
|
||||||
|
}
|
||||||
|
|
||||||
fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()> {
|
fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()> {
|
||||||
let tree = self.get_tree(tree)?;
|
let tree = self.get_tree(tree)?;
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ impl IDb for SqliteDb {
|
|||||||
self.internal_get(&self.db.get()?, &tree, key)
|
self.internal_get(&self.db.get()?, &tree, key)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn len(&self, tree: usize) -> Result<usize> {
|
fn approximate_len(&self, tree: usize) -> Result<usize> {
|
||||||
let tree = self.get_tree(tree)?;
|
let tree = self.get_tree(tree)?;
|
||||||
let db = self.db.get()?;
|
let db = self.db.get()?;
|
||||||
|
|
||||||
@@ -172,6 +172,10 @@ impl IDb for SqliteDb {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_empty(&self, tree: usize) -> Result<bool> {
|
||||||
|
Ok(self.approximate_len(tree)? == 0)
|
||||||
|
}
|
||||||
|
|
||||||
fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()> {
|
fn insert(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()> {
|
||||||
let tree = self.get_tree(tree)?;
|
let tree = self.get_tree(tree)?;
|
||||||
let db = self.db.get()?;
|
let db = self.db.get()?;
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@ fn test_suite(db: Db) {
|
|||||||
|
|
||||||
assert!(tree.insert(ka, va).is_ok());
|
assert!(tree.insert(ka, va).is_ok());
|
||||||
assert_eq!(tree.get(ka).unwrap().unwrap(), va);
|
assert_eq!(tree.get(ka).unwrap().unwrap(), va);
|
||||||
assert_eq!(tree.len().unwrap(), 1);
|
assert_eq!(tree.iter().unwrap().count(), 1);
|
||||||
|
|
||||||
// ---- test transaction logic ----
|
// ---- test transaction logic ----
|
||||||
|
|
||||||
|
|||||||
+12
-7
@@ -219,7 +219,7 @@ impl AdminRpcHandler {
|
|||||||
|
|
||||||
// Gather block manager statistics
|
// Gather block manager statistics
|
||||||
writeln!(&mut ret, "\nBlock manager stats:").unwrap();
|
writeln!(&mut ret, "\nBlock manager stats:").unwrap();
|
||||||
let rc_len = self.garage.block_manager.rc_len()?.to_string();
|
let rc_len = self.garage.block_manager.rc_approximate_len()?.to_string();
|
||||||
|
|
||||||
writeln!(
|
writeln!(
|
||||||
&mut ret,
|
&mut ret,
|
||||||
@@ -230,13 +230,13 @@ impl AdminRpcHandler {
|
|||||||
writeln!(
|
writeln!(
|
||||||
&mut ret,
|
&mut ret,
|
||||||
" resync queue length: {}",
|
" resync queue length: {}",
|
||||||
self.garage.block_manager.resync.queue_len()?
|
self.garage.block_manager.resync.queue_approximate_len()?
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
writeln!(
|
writeln!(
|
||||||
&mut ret,
|
&mut ret,
|
||||||
" blocks with resync errors: {}",
|
" blocks with resync errors: {}",
|
||||||
self.garage.block_manager.resync.errors_len()?
|
self.garage.block_manager.resync.errors_approximate_len()?
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@@ -346,16 +346,21 @@ impl AdminRpcHandler {
|
|||||||
F: TableSchema + 'static,
|
F: TableSchema + 'static,
|
||||||
R: TableReplication + 'static,
|
R: TableReplication + 'static,
|
||||||
{
|
{
|
||||||
let data_len = t.data.store.len().map_err(GarageError::from)?.to_string();
|
let data_len = t
|
||||||
let mkl_len = t.merkle_updater.merkle_tree_len()?.to_string();
|
.data
|
||||||
|
.store
|
||||||
|
.approximate_len()
|
||||||
|
.map_err(GarageError::from)?
|
||||||
|
.to_string();
|
||||||
|
let mkl_len = t.merkle_updater.merkle_tree_approximate_len()?.to_string();
|
||||||
|
|
||||||
Ok(format!(
|
Ok(format!(
|
||||||
" {}\t{}\t{}\t{}\t{}",
|
" {}\t{}\t{}\t{}\t{}",
|
||||||
F::TABLE_NAME,
|
F::TABLE_NAME,
|
||||||
data_len,
|
data_len,
|
||||||
mkl_len,
|
mkl_len,
|
||||||
t.merkle_updater.todo_len()?,
|
t.merkle_updater.todo_approximate_len()?,
|
||||||
t.data.gc_todo_len()?
|
t.data.gc_todo_approximate_len()?
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,13 +121,13 @@ impl Worker for LifecycleWorker {
|
|||||||
mpu_aborted,
|
mpu_aborted,
|
||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
let n_objects = self.garage.object_table.data.store.len().ok();
|
let n_objects = self.garage.object_table.data.store.approximate_len().ok();
|
||||||
let progress = match n_objects {
|
let progress = match n_objects {
|
||||||
None => "...".to_string(),
|
Some(total) if total > 0 => format!(
|
||||||
Some(total) => format!(
|
|
||||||
"~{:.2}%",
|
"~{:.2}%",
|
||||||
100. * std::cmp::min(*counter, total) as f32 / total as f32
|
100. * std::cmp::min(*counter, total) as f32 / total as f32
|
||||||
),
|
),
|
||||||
|
_ => "...".to_string(),
|
||||||
};
|
};
|
||||||
WorkerStatus {
|
WorkerStatus {
|
||||||
progress: Some(progress),
|
progress: Some(progress),
|
||||||
|
|||||||
+2
-2
@@ -367,7 +367,7 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn gc_todo_len(&self) -> Result<usize, Error> {
|
pub fn gc_todo_approximate_len(&self) -> Result<usize, Error> {
|
||||||
Ok(self.gc_todo.len()?)
|
Ok(self.gc_todo.approximate_len()?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -313,7 +313,7 @@ impl<F: TableSchema, R: TableReplication> Worker for GcWorker<F, R> {
|
|||||||
|
|
||||||
fn status(&self) -> WorkerStatus {
|
fn status(&self) -> WorkerStatus {
|
||||||
WorkerStatus {
|
WorkerStatus {
|
||||||
queue_length: Some(self.gc.data.gc_todo_len().unwrap_or(0) as u64),
|
queue_length: Some(self.gc.data.gc_todo_approximate_len().unwrap_or(0) as u64),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -287,12 +287,12 @@ impl<F: TableSchema, R: TableReplication> MerkleUpdater<F, R> {
|
|||||||
MerkleNode::decode_opt(&ent)
|
MerkleNode::decode_opt(&ent)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn merkle_tree_len(&self) -> Result<usize, Error> {
|
pub fn merkle_tree_approximate_len(&self) -> Result<usize, Error> {
|
||||||
Ok(self.data.merkle_tree.len()?)
|
Ok(self.data.merkle_tree.approximate_len()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn todo_len(&self) -> Result<usize, Error> {
|
pub fn todo_approximate_len(&self) -> Result<usize, Error> {
|
||||||
Ok(self.data.merkle_todo.len()?)
|
Ok(self.data.merkle_todo.approximate_len()?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,7 +306,7 @@ impl<F: TableSchema, R: TableReplication> Worker for MerkleWorker<F, R> {
|
|||||||
|
|
||||||
fn status(&self) -> WorkerStatus {
|
fn status(&self) -> WorkerStatus {
|
||||||
WorkerStatus {
|
WorkerStatus {
|
||||||
queue_length: Some(self.0.todo_len().unwrap_or(0) as u64),
|
queue_length: Some(self.0.todo_approximate_len().unwrap_or(0) as u64),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ impl TableMetrics {
|
|||||||
.u64_value_observer(
|
.u64_value_observer(
|
||||||
"table.size",
|
"table.size",
|
||||||
move |observer| {
|
move |observer| {
|
||||||
if let Ok(value) = store.len() {
|
if let Ok(value) = store.approximate_len() {
|
||||||
observer.observe(
|
observer.observe(
|
||||||
value as u64,
|
value as u64,
|
||||||
&[KeyValue::new("table_name", table_name)],
|
&[KeyValue::new("table_name", table_name)],
|
||||||
@@ -48,7 +48,7 @@ impl TableMetrics {
|
|||||||
.u64_value_observer(
|
.u64_value_observer(
|
||||||
"table.merkle_tree_size",
|
"table.merkle_tree_size",
|
||||||
move |observer| {
|
move |observer| {
|
||||||
if let Ok(value) = merkle_tree.len() {
|
if let Ok(value) = merkle_tree.approximate_len() {
|
||||||
observer.observe(
|
observer.observe(
|
||||||
value as u64,
|
value as u64,
|
||||||
&[KeyValue::new("table_name", table_name)],
|
&[KeyValue::new("table_name", table_name)],
|
||||||
@@ -62,7 +62,7 @@ impl TableMetrics {
|
|||||||
.u64_value_observer(
|
.u64_value_observer(
|
||||||
"table.merkle_updater_todo_queue_length",
|
"table.merkle_updater_todo_queue_length",
|
||||||
move |observer| {
|
move |observer| {
|
||||||
if let Ok(v) = merkle_todo.len() {
|
if let Ok(v) = merkle_todo.approximate_len() {
|
||||||
observer.observe(
|
observer.observe(
|
||||||
v as u64,
|
v as u64,
|
||||||
&[KeyValue::new("table_name", table_name)],
|
&[KeyValue::new("table_name", table_name)],
|
||||||
@@ -76,7 +76,7 @@ impl TableMetrics {
|
|||||||
.u64_value_observer(
|
.u64_value_observer(
|
||||||
"table.gc_todo_queue_length",
|
"table.gc_todo_queue_length",
|
||||||
move |observer| {
|
move |observer| {
|
||||||
if let Ok(value) = gc_todo.len() {
|
if let Ok(value) = gc_todo.approximate_len() {
|
||||||
observer.observe(
|
observer.observe(
|
||||||
value as u64,
|
value as u64,
|
||||||
&[KeyValue::new("table_name", table_name)],
|
&[KeyValue::new("table_name", table_name)],
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ impl<F: TableSchema, R: TableReplication> Worker for InsertQueueWorker<F, R> {
|
|||||||
|
|
||||||
fn status(&self) -> WorkerStatus {
|
fn status(&self) -> WorkerStatus {
|
||||||
WorkerStatus {
|
WorkerStatus {
|
||||||
queue_length: Some(self.0.data.insert_queue.len().unwrap_or(0) as u64),
|
queue_length: Some(self.0.data.insert_queue.approximate_len().unwrap_or(0) as u64),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user