diff options
author | Alex Auvolat <alex@adnab.me> | 2022-06-09 15:43:26 +0200 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2022-06-09 15:43:26 +0200 |
commit | c1baa102029e8706e1a7ffdd58dde2afc2a690d5 (patch) | |
tree | 17123b6568f6f1746f2710bf2d57bb4992931213 /src/model | |
parent | ea1022f8325591b5e6e2addd457eb23a1783dc5f (diff) | |
download | garage-c1baa102029e8706e1a7ffdd58dde2afc2a690d5.tar.gz garage-c1baa102029e8706e1a7ffdd58dde2afc2a690d5.zip |
Add quotas to bucket table and show them in CLI
Diffstat (limited to 'src/model')
-rw-r--r-- | src/model/bucket_table.rs | 19 | ||||
-rw-r--r-- | src/model/migrate.rs | 1 | ||||
-rw-r--r-- | src/model/s3/object_table.rs | 7 |
3 files changed, 24 insertions, 3 deletions
diff --git a/src/model/bucket_table.rs b/src/model/bucket_table.rs index 7c7b9f30..130eb6a6 100644 --- a/src/model/bucket_table.rs +++ b/src/model/bucket_table.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use garage_table::crdt::Crdt; +use garage_table::crdt::*; use garage_table::*; use garage_util::data::*; use garage_util::time::*; @@ -44,6 +44,9 @@ pub struct BucketParams { pub website_config: crdt::Lww<Option<WebsiteConfig>>, /// CORS rules pub cors_config: crdt::Lww<Option<Vec<CorsRule>>>, + /// Bucket quotas + #[serde(default)] + pub quotas: crdt::Lww<BucketQuotas>, } #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] @@ -62,6 +65,18 @@ pub struct CorsRule { pub expose_headers: Vec<String>, } +#[derive(Default, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)] +pub struct BucketQuotas { + /// Maximum size in bytes (bucket size = sum of sizes of objects in the bucket) + pub max_size: Option<u64>, + /// Maximum number of non-deleted objects in the bucket + pub max_objects: Option<u64>, +} + +impl AutoCrdt for BucketQuotas { + const WARN_IF_DIFFERENT: bool = true; +} + impl BucketParams { /// Create an empty BucketParams with no authorized keys and no website accesss pub fn new() -> Self { @@ -72,6 +87,7 @@ impl BucketParams { local_aliases: crdt::LwwMap::new(), website_config: crdt::Lww::new(None), cors_config: crdt::Lww::new(None), + quotas: crdt::Lww::new(BucketQuotas::default()), } } } @@ -86,6 +102,7 @@ impl Crdt for BucketParams { self.website_config.merge(&o.website_config); self.cors_config.merge(&o.cors_config); + self.quotas.merge(&o.quotas); } } diff --git a/src/model/migrate.rs b/src/model/migrate.rs index 25acb4b0..5fc67069 100644 --- a/src/model/migrate.rs +++ b/src/model/migrate.rs @@ -77,6 +77,7 @@ impl Migrate { local_aliases: LwwMap::new(), website_config: Lww::new(website), cors_config: Lww::new(None), + quotas: Lww::new(Default::default()), }), }) .await?; diff --git a/src/model/s3/object_table.rs b/src/model/s3/object_table.rs index 027acea0..23cce1d3 100644 --- a/src/model/s3/object_table.rs +++ b/src/model/s3/object_table.rs @@ -315,9 +315,12 @@ impl CountedItem for Object { } fn counts(&self) -> Vec<(&'static str, i64)> { - let n_objects = if self.is_tombstone() { 0 } else { 1 }; - let versions = self.versions(); + let n_objects = if versions.iter().any(|v| v.is_data()) { + 0 + } else { + 1 + }; let n_unfinished_uploads = versions .iter() .filter(|v| matches!(v.state, ObjectVersionState::Uploading(_))) |