mirror of
https://github.com/deuxfleurs-org/garage.git
synced 2026-08-17 17:17:47 +00:00
New buckets for 0.6.0: fix model and migration
This commit is contained in:
@@ -57,10 +57,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Build a new CRDT from a previous non-compatible one
|
||||
///
|
||||
/// Compared to new, the CRDT's timestamp is not set to now
|
||||
/// but must be set to the previous, non-compatible, CRDT's timestamp.
|
||||
/// Build a new LWW CRDT from its raw pieces: a timestamp and the value
|
||||
pub fn raw(ts: u64, value: T) -> Self {
|
||||
Self { ts, v: value }
|
||||
}
|
||||
|
||||
@@ -38,10 +38,11 @@ where
|
||||
Self { vals: vec![] }
|
||||
}
|
||||
|
||||
/// Used to migrate from a map defined in an incompatible format. This produces
|
||||
/// a map that contains a single item with the specified timestamp (copied from
|
||||
/// the incompatible format). Do this as many times as you have items to migrate,
|
||||
/// and put them all together using the CRDT merge operator.
|
||||
/// This produces a map that contains a single item with the specified timestamp.
|
||||
///
|
||||
/// Used to migrate from a map defined in an incompatible format. Do this as many
|
||||
/// times as you have items to migrate, and put them all together using the
|
||||
/// CRDT merge operator.
|
||||
pub fn raw_item(k: K, ts: u64, v: V) -> Self {
|
||||
Self {
|
||||
vals: vec![(k, ts, v)],
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
use std::iter::{FromIterator, IntoIterator};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::crdt::crdt::*;
|
||||
@@ -98,3 +100,26 @@ where
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
/// A crdt map can be created from an iterator of key-value pairs.
|
||||
/// Note that all keys in the iterator must be distinct:
|
||||
/// this function will throw a panic if it is not the case.
|
||||
impl<K, V> FromIterator<(K, V)> for Map<K, V>
|
||||
where
|
||||
K: Clone + Ord,
|
||||
V: Clone + Crdt,
|
||||
{
|
||||
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
|
||||
let mut vals: Vec<(K, V)> = iter.into_iter().collect();
|
||||
vals.sort_by_cached_key(|tup| tup.0.clone());
|
||||
|
||||
// sanity check
|
||||
for i in 1..vals.len() {
|
||||
if vals[i - 1].0 == vals[i].0 {
|
||||
panic!("Duplicate key in crdt::Map resulting from .from_iter() or .collect()");
|
||||
}
|
||||
}
|
||||
|
||||
Self { vals }
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -119,17 +119,17 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Trait to map error to the Bad Request error code
|
||||
/// Trait to map any error type to Error::Message
|
||||
pub trait OkOrMessage {
|
||||
type S2;
|
||||
fn ok_or_message<M: Into<String>>(self, message: M) -> Self::S2;
|
||||
type S;
|
||||
fn ok_or_message<M: Into<String>>(self, message: M) -> Result<Self::S, Error>;
|
||||
}
|
||||
|
||||
impl<T, E> OkOrMessage for Result<T, E>
|
||||
where
|
||||
E: std::fmt::Display,
|
||||
{
|
||||
type S2 = Result<T, Error>;
|
||||
type S = T;
|
||||
fn ok_or_message<M: Into<String>>(self, message: M) -> Result<T, Error> {
|
||||
match self {
|
||||
Ok(x) => Ok(x),
|
||||
@@ -139,7 +139,7 @@ where
|
||||
}
|
||||
|
||||
impl<T> OkOrMessage for Option<T> {
|
||||
type S2 = Result<T, Error>;
|
||||
type S = T;
|
||||
fn ok_or_message<M: Into<String>>(self, message: M) -> Result<T, Error> {
|
||||
match self {
|
||||
Some(x) => Ok(x),
|
||||
|
||||
Reference in New Issue
Block a user