mirror of
https://github.com/deuxfleurs-org/garage.git
synced 2026-08-31 17:28:13 +00:00
Refactor how things are migrated
This commit is contained in:
+30
-20
@@ -12,6 +12,7 @@ use garage_rpc::system::System;
|
||||
use garage_util::background::BackgroundRunner;
|
||||
use garage_util::data::*;
|
||||
use garage_util::error::*;
|
||||
use garage_util::migrate::Migrate;
|
||||
use garage_util::time::*;
|
||||
|
||||
use garage_table::crdt::*;
|
||||
@@ -29,14 +30,28 @@ pub trait CountedItem: Clone + PartialEq + Send + Sync + 'static {
|
||||
fn counts(&self) -> Vec<(&'static str, i64)>;
|
||||
}
|
||||
|
||||
/// A counter entry in the global table
|
||||
#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)]
|
||||
pub struct CounterEntry<T: CountedItem> {
|
||||
pub pk: T::CP,
|
||||
pub sk: T::CS,
|
||||
pub values: BTreeMap<String, CounterValue>,
|
||||
mod v08 {
|
||||
use super::*;
|
||||
|
||||
/// A counter entry in the global table
|
||||
#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)]
|
||||
pub struct CounterEntry<T: CountedItem> {
|
||||
pub pk: T::CP,
|
||||
pub sk: T::CS,
|
||||
pub values: BTreeMap<String, CounterValue>,
|
||||
}
|
||||
|
||||
/// A counter entry in the global table
|
||||
#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)]
|
||||
pub struct CounterValue {
|
||||
pub node_values: BTreeMap<Uuid, (u64, i64)>,
|
||||
}
|
||||
|
||||
impl<T: CountedItem> garage_util::migrate::InitialFormat for CounterEntry<T> {}
|
||||
}
|
||||
|
||||
pub use v08::*;
|
||||
|
||||
impl<T: CountedItem> Entry<T::CP, T::CS> for CounterEntry<T> {
|
||||
fn partition_key(&self) -> &T::CP {
|
||||
&self.pk
|
||||
@@ -78,12 +93,6 @@ impl<T: CountedItem> CounterEntry<T> {
|
||||
}
|
||||
}
|
||||
|
||||
/// A counter entry in the global table
|
||||
#[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)]
|
||||
pub struct CounterValue {
|
||||
pub node_values: BTreeMap<Uuid, (u64, i64)>,
|
||||
}
|
||||
|
||||
impl<T: CountedItem> Crdt for CounterEntry<T> {
|
||||
fn merge(&mut self, other: &Self) {
|
||||
for (name, e2) in other.values.iter() {
|
||||
@@ -195,11 +204,9 @@ impl<T: CountedItem> IndexCounter<T> {
|
||||
let tree_key = self.table.data.tree_key(pk, sk);
|
||||
|
||||
let mut entry = match tx.get(&self.local_counter, &tree_key[..])? {
|
||||
Some(old_bytes) => {
|
||||
rmp_serde::decode::from_read_ref::<_, LocalCounterEntry<T>>(&old_bytes)
|
||||
.map_err(Error::RmpDecode)
|
||||
.map_err(db::TxError::Abort)?
|
||||
}
|
||||
Some(old_bytes) => LocalCounterEntry::<T>::decode(&old_bytes)
|
||||
.ok_or_message("Cannot decode local counter entry")
|
||||
.map_err(db::TxError::Abort)?,
|
||||
None => LocalCounterEntry {
|
||||
pk: pk.clone(),
|
||||
sk: sk.clone(),
|
||||
@@ -214,7 +221,8 @@ impl<T: CountedItem> IndexCounter<T> {
|
||||
ent.1 += *inc;
|
||||
}
|
||||
|
||||
let new_entry_bytes = rmp_to_vec_all_named(&entry)
|
||||
let new_entry_bytes = entry
|
||||
.encode()
|
||||
.map_err(Error::RmpEncode)
|
||||
.map_err(db::TxError::Abort)?;
|
||||
tx.insert(&self.local_counter, &tree_key[..], new_entry_bytes)?;
|
||||
@@ -263,7 +271,7 @@ impl<T: CountedItem> IndexCounter<T> {
|
||||
tv.1 = 0;
|
||||
}
|
||||
|
||||
let local_counter_bytes = rmp_to_vec_all_named(&local_counter)?;
|
||||
let local_counter_bytes = local_counter.encode()?;
|
||||
self.local_counter
|
||||
.insert(&local_counter_k, &local_counter_bytes)?;
|
||||
|
||||
@@ -330,7 +338,7 @@ impl<T: CountedItem> IndexCounter<T> {
|
||||
tv.1 += v;
|
||||
}
|
||||
|
||||
let local_counter_bytes = rmp_to_vec_all_named(&local_counter)?;
|
||||
let local_counter_bytes = local_counter.encode()?;
|
||||
self.local_counter
|
||||
.insert(&local_counter_key, local_counter_bytes)?;
|
||||
|
||||
@@ -357,6 +365,8 @@ struct LocalCounterEntry<T: CountedItem> {
|
||||
values: BTreeMap<String, (u64, i64)>,
|
||||
}
|
||||
|
||||
impl<T: CountedItem> garage_util::migrate::InitialFormat for LocalCounterEntry<T> {}
|
||||
|
||||
impl<T: CountedItem> LocalCounterEntry<T> {
|
||||
fn into_counter_entry(self, this_node: Uuid) -> CounterEntry<T> {
|
||||
CounterEntry {
|
||||
|
||||
Reference in New Issue
Block a user