use std::time::Duration;
use crate::ids::ShardId;
use crate::ids::{KvKey, KvValue};
use crate::sync_codec::ballot::{Ballot, Stamp};
use crate::sync_codec::ids::SyncNodeId;
use crate::tree::Hash;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct WriteId {
pub origin: SyncNodeId,
pub origin_creation: u32,
pub counter: u64,
}
impl WriteId {
#[must_use]
pub fn new(origin: impl Into<SyncNodeId>, origin_creation: u32, counter: u64) -> Self {
Self {
origin: origin.into(),
origin_creation,
counter,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RejectReason {
CasMismatch,
ApplyError,
Fenced,
}
impl RejectReason {
pub(crate) const fn to_wire(self) -> u8 {
match self {
Self::CasMismatch => 0,
Self::ApplyError => 1,
Self::Fenced => 2,
}
}
pub(crate) const fn from_wire(value: u8) -> Result<Self, crate::sync_codec::error::SyncError> {
match value {
0 => Ok(Self::CasMismatch),
1 => Ok(Self::ApplyError),
2 => Ok(Self::Fenced),
_ => Err(crate::sync_codec::error::SyncError::InvalidMessage),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AckOutcome {
Applied,
Rejected(RejectReason),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WriteProposal {
pub write_id: WriteId,
pub shard_id: ShardId,
pub key: KvKey,
pub expected: Option<Hash>,
pub value: KvValue,
pub ttl: Option<Duration>,
pub epoch: Ballot,
pub seq: u64,
pub tombstone: bool,
}
impl WriteProposal {
#[must_use]
pub fn stamp(&self) -> Stamp {
Stamp::new(self.epoch.clone(), self.seq)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WriteAck {
pub write_id: WriteId,
pub acker: SyncNodeId,
pub acker_creation: u32,
pub outcome: AckOutcome,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchWriteEntry {
pub key: KvKey,
pub expected: Option<Hash>,
pub value: KvValue,
pub ttl: Option<Duration>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchWriteProposal {
pub write_id: WriteId,
pub shard_id: ShardId,
pub entries: Vec<BatchWriteEntry>,
pub stamp: Stamp,
}
impl BatchWriteProposal {
#[must_use]
pub fn stamp(&self) -> Stamp {
self.stamp.clone()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchWriteAck {
pub write_id: WriteId,
pub acker: SyncNodeId,
pub acker_creation: u32,
pub outcome: AckOutcome,
}