From 180e7fef0a1bdd396865eff92ec6f1d7f0e7511e Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Fri, 10 Jun 2022 11:27:58 +0200 Subject: [PATCH] Actually distribute counters over nodes --- src/api/admin/bucket.rs | 26 +------------------------- src/api/s3/put.rs | 2 +- src/garage/admin.rs | 26 +++----------------------- src/garage/cli/cmd.rs | 4 ++-- src/garage/cli/util.rs | 13 +++---------- src/model/s3/object_table.rs | 16 ++++++++-------- 6 files changed, 18 insertions(+), 69 deletions(-) diff --git a/src/api/admin/bucket.rs b/src/api/admin/bucket.rs index 2ceacdb5..ac8a8a40 100644 --- a/src/api/admin/bucket.rs +++ b/src/api/admin/bucket.rs @@ -33,28 +33,10 @@ pub async fn handle_list_buckets(garage: &Arc) -> Result, ) .await?; - let ring = garage.system.ring.borrow().clone(); - let counters = garage - .object_counter_table - .table - .get_range( - &EmptyKey, - None, - Some((DeletedFilter::NotDeleted, ring.layout.node_id_vec.clone())), - 15000, - EnumerationOrder::Forward, - ) - .await? - .iter() - .map(|x| (x.sk, x.filtered_values(&ring))) - .collect::>(); - let res = buckets .into_iter() .map(|b| { let state = b.state.as_option().unwrap(); - let empty_cnts = HashMap::new(); - let cnts = counters.get(&b.id).unwrap_or(&empty_cnts); ListBucketResultItem { id: hex::encode(b.id), global_aliases: state @@ -74,9 +56,6 @@ pub async fn handle_list_buckets(garage: &Arc) -> Result, alias: n.to_string(), }) .collect::>(), - objects: cnts.get(OBJECTS).cloned().unwrap_or_default(), - bytes: cnts.get(BYTES).cloned().unwrap_or_default(), - unfinshed_uploads: cnts.get(UNFINISHED_UPLOADS).cloned().unwrap_or_default(), } }) .collect::>(); @@ -90,9 +69,6 @@ struct ListBucketResultItem { id: String, global_aliases: Vec, local_aliases: Vec, - objects: i64, - bytes: i64, - unfinshed_uploads: i64, } #[derive(Serialize)] @@ -143,7 +119,7 @@ async fn bucket_info_results( let counters = garage .object_counter_table .table - .get(&EmptyKey, &bucket_id) + .get(&bucket_id, &EmptyKey) .await? .map(|x| x.filtered_values(&garage.system.ring.borrow())) .unwrap_or_default(); diff --git a/src/api/s3/put.rs b/src/api/s3/put.rs index bbe7fd34..9ef37421 100644 --- a/src/api/s3/put.rs +++ b/src/api/s3/put.rs @@ -226,7 +226,7 @@ async fn check_quotas( let key = key.to_string(); let (prev_object, counters) = futures::try_join!( garage.object_table.get(&bucket.id, &key), - garage.object_counter_table.table.get(&EmptyKey, &bucket.id), + garage.object_counter_table.table.get(&bucket.id, &EmptyKey), )?; let counters = counters diff --git a/src/garage/admin.rs b/src/garage/admin.rs index 6630ae16..48914655 100644 --- a/src/garage/admin.rs +++ b/src/garage/admin.rs @@ -39,10 +39,7 @@ pub enum AdminRpc { // Replies Ok(String), - BucketList { - buckets: Vec, - counters: HashMap>, - }, + BucketList(Vec), BucketInfo { bucket: Bucket, relevant_keys: HashMap, @@ -97,24 +94,7 @@ impl AdminRpcHandler { ) .await?; - let ring = self.garage.system.ring.borrow().clone(); - let counters = self - .garage - .object_counter_table - .table - .get_range( - &EmptyKey, - None, - Some((DeletedFilter::NotDeleted, ring.layout.node_id_vec.clone())), - 15000, - EnumerationOrder::Forward, - ) - .await? - .iter() - .map(|x| (x.sk, x.filtered_values(&ring))) - .collect::>(); - - Ok(AdminRpc::BucketList { buckets, counters }) + Ok(AdminRpc::BucketList(buckets)) } async fn handle_bucket_info(&self, query: &BucketOpt) -> Result { @@ -135,7 +115,7 @@ impl AdminRpcHandler { .garage .object_counter_table .table - .get(&EmptyKey, &bucket_id) + .get(&bucket_id, &EmptyKey) .await? .map(|x| x.filtered_values(&self.garage.system.ring.borrow())) .unwrap_or_default(); diff --git a/src/garage/cli/cmd.rs b/src/garage/cli/cmd.rs index e8e834e8..3a0bd956 100644 --- a/src/garage/cli/cmd.rs +++ b/src/garage/cli/cmd.rs @@ -166,8 +166,8 @@ pub async fn cmd_admin( AdminRpc::Ok(msg) => { println!("{}", msg); } - AdminRpc::BucketList { buckets, counters } => { - print_bucket_list(buckets, counters); + AdminRpc::BucketList(bl) => { + print_bucket_list(bl); } AdminRpc::BucketInfo { bucket, diff --git a/src/garage/cli/util.rs b/src/garage/cli/util.rs index 28a34daa..329e8a3e 100644 --- a/src/garage/cli/util.rs +++ b/src/garage/cli/util.rs @@ -9,11 +9,11 @@ use garage_model::bucket_table::*; use garage_model::key_table::*; use garage_model::s3::object_table::{BYTES, OBJECTS, UNFINISHED_UPLOADS}; -pub fn print_bucket_list(buckets: Vec, counters: HashMap>) { +pub fn print_bucket_list(bl: Vec) { println!("List of buckets:"); let mut table = vec![]; - for bucket in buckets { + for bucket in bl { let aliases = bucket .aliases() .iter() @@ -31,18 +31,11 @@ pub fn print_bucket_list(buckets: Vec, counters: HashMap format!("[{} local aliases]", s.len()), }; - let empty_counters = HashMap::new(); - let cnt = counters.get(&bucket.id).unwrap_or(&empty_counters); - table.push(format!( - "\t{}\t{}\t{}\t{}\t{}\t{}", + "\t{}\t{}\t{}", aliases.join(","), local_aliases_n, hex::encode(bucket.id), - bytesize::ByteSize::b(cnt.get(BYTES).cloned().unwrap_or_default() as u64) - .to_string_as(true), - cnt.get(OBJECTS).cloned().unwrap_or_default(), - cnt.get(UNFINISHED_UPLOADS).cloned().unwrap_or_default(), )); } format_table(table); diff --git a/src/model/s3/object_table.rs b/src/model/s3/object_table.rs index 23cce1d3..f3c8a3fb 100644 --- a/src/model/s3/object_table.rs +++ b/src/model/s3/object_table.rs @@ -302,17 +302,17 @@ impl TableSchema for ObjectTable { impl CountedItem for Object { const COUNTER_TABLE_NAME: &'static str = "bucket_object_counter"; - // Partition key = nothing - type CP = EmptyKey; - // Sort key = bucket id - type CS = Uuid; + // Partition key = bucket id + type CP = Uuid; + // Sort key = nothing + type CS = EmptyKey; - fn counter_partition_key(&self) -> &EmptyKey { - &EmptyKey - } - fn counter_sort_key(&self) -> &Uuid { + fn counter_partition_key(&self) -> &Uuid { &self.bucket_id } + fn counter_sort_key(&self) -> &EmptyKey { + &EmptyKey + } fn counts(&self) -> Vec<(&'static str, i64)> { let versions = self.versions();