K2V #293
17 changed files with 129 additions and 24 deletions
|
@ -7,7 +7,7 @@ use garage_model::bucket_alias_table::*;
|
||||||
use garage_model::bucket_table::Bucket;
|
use garage_model::bucket_table::Bucket;
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
use garage_model::key_table::Key;
|
use garage_model::key_table::Key;
|
||||||
use garage_model::object_table::ObjectFilter;
|
use garage_model::s3::object_table::ObjectFilter;
|
||||||
use garage_model::permission::BucketKeyPerm;
|
use garage_model::permission::BucketKeyPerm;
|
||||||
use garage_table::util::*;
|
use garage_table::util::*;
|
||||||
use garage_util::crdt::*;
|
use garage_util::crdt::*;
|
||||||
|
|
|
@ -11,11 +11,11 @@ use garage_table::*;
|
||||||
use garage_util::data::*;
|
use garage_util::data::*;
|
||||||
use garage_util::time::*;
|
use garage_util::time::*;
|
||||||
|
|
||||||
use garage_model::block_ref_table::*;
|
use garage_model::s3::block_ref_table::*;
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
use garage_model::key_table::Key;
|
use garage_model::key_table::Key;
|
||||||
use garage_model::object_table::*;
|
use garage_model::s3::object_table::*;
|
||||||
use garage_model::version_table::*;
|
use garage_model::s3::version_table::*;
|
||||||
|
|
||||||
use crate::api_server::{parse_bucket_key, resolve_bucket};
|
use crate::api_server::{parse_bucket_key, resolve_bucket};
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
|
|
|
@ -6,7 +6,7 @@ use garage_util::data::*;
|
||||||
use garage_util::time::*;
|
use garage_util::time::*;
|
||||||
|
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
use garage_model::object_table::*;
|
use garage_model::s3::object_table::*;
|
||||||
|
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
use crate::s3_xml;
|
use crate::s3_xml;
|
||||||
|
|
|
@ -14,8 +14,8 @@ use garage_table::EmptyKey;
|
||||||
use garage_util::data::*;
|
use garage_util::data::*;
|
||||||
|
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
use garage_model::object_table::*;
|
use garage_model::s3::object_table::*;
|
||||||
use garage_model::version_table::*;
|
use garage_model::s3::version_table::*;
|
||||||
|
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,8 @@ use garage_util::error::Error as GarageError;
|
||||||
use garage_util::time::*;
|
use garage_util::time::*;
|
||||||
|
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
use garage_model::object_table::*;
|
use garage_model::s3::object_table::*;
|
||||||
use garage_model::version_table::Version;
|
use garage_model::s3::version_table::Version;
|
||||||
|
|
||||||
use garage_table::EmptyKey;
|
use garage_table::EmptyKey;
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,10 @@ use garage_util::error::Error as GarageError;
|
||||||
use garage_util::time::*;
|
use garage_util::time::*;
|
||||||
|
|
||||||
use garage_block::manager::INLINE_THRESHOLD;
|
use garage_block::manager::INLINE_THRESHOLD;
|
||||||
use garage_model::block_ref_table::*;
|
use garage_model::s3::block_ref_table::*;
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
use garage_model::object_table::*;
|
use garage_model::s3::object_table::*;
|
||||||
use garage_model::version_table::*;
|
use garage_model::s3::version_table::*;
|
||||||
|
|
||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
use crate::s3_xml;
|
use crate::s3_xml;
|
||||||
|
|
|
@ -21,7 +21,7 @@ use garage_model::garage::Garage;
|
||||||
use garage_model::helper::error::{Error, OkOrBadRequest};
|
use garage_model::helper::error::{Error, OkOrBadRequest};
|
||||||
use garage_model::key_table::*;
|
use garage_model::key_table::*;
|
||||||
use garage_model::migrate::Migrate;
|
use garage_model::migrate::Migrate;
|
||||||
use garage_model::object_table::ObjectFilter;
|
use garage_model::s3::object_table::ObjectFilter;
|
||||||
use garage_model::permission::*;
|
use garage_model::permission::*;
|
||||||
|
|
||||||
use crate::cli::*;
|
use crate::cli::*;
|
||||||
|
|
|
@ -2,10 +2,10 @@ use std::sync::Arc;
|
||||||
|
|
||||||
use tokio::sync::watch;
|
use tokio::sync::watch;
|
||||||
|
|
||||||
use garage_model::block_ref_table::*;
|
use garage_model::s3::block_ref_table::*;
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
use garage_model::object_table::*;
|
use garage_model::s3::object_table::*;
|
||||||
use garage_model::version_table::*;
|
use garage_model::s3::version_table::*;
|
||||||
use garage_table::*;
|
use garage_table::*;
|
||||||
use garage_util::error::Error;
|
use garage_util::error::Error;
|
||||||
|
|
||||||
|
|
|
@ -13,13 +13,14 @@ use garage_table::replication::TableFullReplication;
|
||||||
use garage_table::replication::TableShardedReplication;
|
use garage_table::replication::TableShardedReplication;
|
||||||
use garage_table::*;
|
use garage_table::*;
|
||||||
|
|
||||||
use crate::block_ref_table::*;
|
use crate::s3::block_ref_table::*;
|
||||||
|
use crate::s3::object_table::*;
|
||||||
|
use crate::s3::version_table::*;
|
||||||
|
|
||||||
use crate::bucket_alias_table::*;
|
use crate::bucket_alias_table::*;
|
||||||
use crate::bucket_table::*;
|
use crate::bucket_table::*;
|
||||||
use crate::helper;
|
use crate::helper;
|
||||||
use crate::key_table::*;
|
use crate::key_table::*;
|
||||||
use crate::object_table::*;
|
|
||||||
use crate::version_table::*;
|
|
||||||
|
|
||||||
/// An entire Garage full of data
|
/// An entire Garage full of data
|
||||||
pub struct Garage {
|
pub struct Garage {
|
||||||
|
|
35
src/model/k2v/causality.rs
Normal file
35
src/model/k2v/causality.rs
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
|
use garage_util::data::*;
|
||||||
|
|
||||||
|
/// Node IDs used in K2V are u64 integers that are the abbreviation
|
||||||
|
/// of full Garage node IDs which are 256-bit UUIDs.
|
||||||
|
pub type K2VNodeId = u64;
|
||||||
|
|
||||||
|
pub fn make_node_id(node_id: Uuid) -> K2VNodeId {
|
||||||
|
let mut tmp = [0u8; 8];
|
||||||
|
tmp.copy_from_slice(&node_id.as_slice()[..8]);
|
||||||
|
u64::from_be_bytes(tmp)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub struct CausalityContext {
|
||||||
|
pub vector_clock: BTreeMap<K2VNodeId, u64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CausalityContext {
|
||||||
|
/// Empty causality context
|
||||||
|
pub fn new_empty() -> Self {
|
||||||
|
Self {
|
||||||
|
vector_clock: BTreeMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// Make binary representation and encode in base64
|
||||||
|
pub fn serialize(&self) -> String {
|
||||||
|
unimplemented!(); //TODO
|
||||||
|
}
|
||||||
|
/// Parse from base64-encoded binary representation
|
||||||
|
pub fn parse(s: &str) -> Self {
|
||||||
|
unimplemented!(); //TODO
|
||||||
|
}
|
||||||
|
}
|
63
src/model/k2v/item_table.rs
Normal file
63
src/model/k2v/item_table.rs
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
|
use garage_util::data::*;
|
||||||
|
|
||||||
|
use garage_table::crdt::*;
|
||||||
|
use garage_table::*;
|
||||||
|
|
||||||
|
use crate::k2v::causality::*;
|
||||||
|
|
||||||
|
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
|
||||||
|
pub struct K2VItem {
|
||||||
|
pub bucket_id: Uuid,
|
||||||
|
pub partition_key: String,
|
||||||
|
pub sort_key: String,
|
||||||
|
|
||||||
|
items: BTreeMap<K2VNodeId, DvvsEntry>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
|
||||||
|
struct DvvsEntry {
|
||||||
|
t_discard: u64,
|
||||||
|
values: Vec<(u64, DvvsValue)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize)]
|
||||||
|
pub enum DvvsValue {
|
||||||
|
Value(#[serde(with = "serde_bytes")] Vec<u8>),
|
||||||
|
Deleted,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl K2VItem {
|
||||||
|
/// Creates a new K2VItem when no previous entry existed in the db
|
||||||
|
pub fn new(this_node: Uuid, value: DvvsValue) -> Self {
|
||||||
|
unimplemented!(); // TODO
|
||||||
|
}
|
||||||
|
/// Updates a K2VItem with a new value or a deletion event
|
||||||
|
pub fn update(&mut self, this_node: Uuid, context: CausalityContext, new_value: DvvsValue) {
|
||||||
|
unimplemented!(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Extract the causality context of a K2V Item
|
||||||
|
pub fn causality_context(&self) -> CausalityContext {
|
||||||
|
unimplemented!(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Extract the list of values
|
||||||
|
pub fn values(&'_ self) -> Vec<&'_ DvvsValue> {
|
||||||
|
unimplemented!(); // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Crdt for K2VItem {
|
||||||
|
fn merge(&mut self, other: &Self) {
|
||||||
|
unimplemented!(); // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Crdt for DvvsEntry {
|
||||||
|
fn merge(&mut self, other: &Self) {
|
||||||
|
unimplemented!(); // TODO
|
||||||
|
}
|
||||||
|
}
|
3
src/model/k2v/mod.rs
Normal file
3
src/model/k2v/mod.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
pub mod item_table;
|
||||||
|
|
||||||
|
pub mod causality;
|
|
@ -3,12 +3,12 @@ extern crate tracing;
|
||||||
|
|
||||||
pub mod permission;
|
pub mod permission;
|
||||||
|
|
||||||
pub mod block_ref_table;
|
|
||||||
pub mod bucket_alias_table;
|
pub mod bucket_alias_table;
|
||||||
pub mod bucket_table;
|
pub mod bucket_table;
|
||||||
pub mod key_table;
|
pub mod key_table;
|
||||||
pub mod object_table;
|
|
||||||
pub mod version_table;
|
pub mod s3;
|
||||||
|
pub mod k2v;
|
||||||
|
|
||||||
pub mod garage;
|
pub mod garage;
|
||||||
pub mod helper;
|
pub mod helper;
|
||||||
|
|
3
src/model/s3/mod.rs
Normal file
3
src/model/s3/mod.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
pub mod block_ref_table;
|
||||||
|
pub mod object_table;
|
||||||
|
pub mod version_table;
|
|
@ -9,7 +9,7 @@ use garage_table::crdt::*;
|
||||||
use garage_table::replication::TableShardedReplication;
|
use garage_table::replication::TableShardedReplication;
|
||||||
use garage_table::*;
|
use garage_table::*;
|
||||||
|
|
||||||
use crate::version_table::*;
|
use crate::s3::version_table::*;
|
||||||
|
|
||||||
use garage_model_050::object_table as old;
|
use garage_model_050::object_table as old;
|
||||||
|
|
|
@ -8,7 +8,7 @@ use garage_table::crdt::*;
|
||||||
use garage_table::replication::TableShardedReplication;
|
use garage_table::replication::TableShardedReplication;
|
||||||
use garage_table::*;
|
use garage_table::*;
|
||||||
|
|
||||||
use crate::block_ref_table::*;
|
use crate::s3::block_ref_table::*;
|
||||||
|
|
||||||
use garage_model_050::version_table as old;
|
use garage_model_050::version_table as old;
|
||||||
|
|
Loading…
Reference in a new issue