aboutsummaryrefslogtreecommitdiff
path: root/src/model/bucket_alias_table.rs
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2021-12-14 13:55:11 +0100
committerAlex Auvolat <alex@adnab.me>2022-01-04 12:45:46 +0100
commit5b1117e582db16cc5aa50840a685875cbd5501f4 (patch)
tree06fec47bf56cb08cb51334454dc15f98352c98f2 /src/model/bucket_alias_table.rs
parent8f6026de5ecd44cbe0fc0bcd47638a1ece860439 (diff)
downloadgarage-5b1117e582db16cc5aa50840a685875cbd5501f4.tar.gz
garage-5b1117e582db16cc5aa50840a685875cbd5501f4.zip
New model for buckets
Diffstat (limited to 'src/model/bucket_alias_table.rs')
-rw-r--r--src/model/bucket_alias_table.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/model/bucket_alias_table.rs b/src/model/bucket_alias_table.rs
new file mode 100644
index 00000000..4d300d05
--- /dev/null
+++ b/src/model/bucket_alias_table.rs
@@ -0,0 +1,68 @@
+use serde::{Deserialize, Serialize};
+
+use garage_table::crdt::*;
+use garage_table::*;
+use garage_util::data::*;
+
+/// The bucket alias table holds the names given to buckets
+/// in the global namespace.
+#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
+pub struct BucketAlias {
+ pub name: String,
+ pub state: crdt::Lww<crdt::Deletable<AliasParams>>,
+}
+
+#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)]
+pub struct AliasParams {
+ pub bucket_id: Uuid,
+ pub website_access: bool,
+}
+
+impl AutoCrdt for AliasParams {
+ const WARN_IF_DIFFERENT: bool = true;
+}
+
+impl BucketAlias {
+ pub fn new(name: String, bucket_id: Uuid, website_access: bool) -> Self {
+ BucketAlias {
+ name,
+ state: crdt::Lww::new(crdt::Deletable::present(AliasParams {
+ bucket_id,
+ website_access,
+ })),
+ }
+ }
+ pub fn is_deleted(&self) -> bool {
+ self.state.get().is_deleted()
+ }
+}
+
+impl Crdt for BucketAlias {
+ fn merge(&mut self, o: &Self) {
+ self.state.merge(&o.state);
+ }
+}
+
+impl Entry<EmptyKey, String> for BucketAlias {
+ fn partition_key(&self) -> &EmptyKey {
+ &EmptyKey
+ }
+ fn sort_key(&self) -> &String {
+ &self.name
+ }
+}
+
+pub struct BucketAliasTable;
+
+impl TableSchema for BucketAliasTable {
+ const TABLE_NAME: &'static str = "bucket_alias";
+
+ type P = EmptyKey;
+ type S = String;
+ type E = BucketAlias;
+ type Filter = DeletedFilter;
+
+ fn matches_filter(entry: &Self::E, filter: &Self::Filter) -> bool {
+ filter.apply(entry.is_deleted())
+ }
+}