1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use async_trait::async_trait;
use std::collections::HashSet;
use std::fmt::Debug;
use std::sync::Arc;

use tokio::sync::oneshot;

use crate::moiradb::MoiraDb;
pub type DBValue<V> = Arc<Option<V>>;

pub type Block<K, C> = Vec<Arc<Transaction<K, C>>>;

#[async_trait]
pub trait Command<K, V>
where
    K: Debug,
    V: Debug,
    Self: Debug,
{
    async fn execute(&self, db: &mut MoiraDb<K, V, Self>) -> TransactionResult;

    fn merge_operator(_key: &K, _prev_value: DBValue<V>, _updates: Vec<DBValue<V>>) -> DBValue<V> {
        unimplemented!();
    }
}

pub trait MergeCommand<K, V>: Command<K, V>
where
    K: Debug,
    V: Debug,
    Self: Debug,
{
}

#[derive(Debug, PartialEq, Clone, Copy)]
pub enum ExecState {
    Abort,
    Commit,
    Merge,
    NoWrite,
    Pending,
    Reschedule,
}

#[derive(Debug)]
pub struct Entry<K, V, C> {
    pub transaction: Arc<Transaction<K, C>>,
    pub state: ExecState,
    pub value: Option<DBValue<V>>,
    pub futures: Vec<oneshot::Sender<(Vec<DBValue<V>>, DBValue<V>)>>,
}

#[derive(Debug)]
pub enum MoiraCommand<K, V, C>
where
    C: ?Sized + Debug,
    K: Debug,
    V: Debug,
{
    Read(K, u64, oneshot::Sender<(Vec<DBValue<V>>, DBValue<V>)>),
    Outcome(MoiraDb<K, V, C>),
}

#[derive(Debug)]
pub struct Transaction<K, C: ?Sized> {
    pub seq: u64,
    pub write_set: HashSet<K>,
    pub command: C,
}

#[derive(Debug, PartialEq)]
pub enum TransactionResult {
    Commit,
    Abort(String),
    Reschedule,
}