pub struct PeerSyncProtocol {
pub state: SyncState,
pub conflict_policy: ConflictPolicy,
pub pending_ops: VecDeque<SyncOperation>,
pub sync_log: VecDeque<(String, SyncOperation, u64)>,
}Expand description
Bidirectional state-synchronisation protocol backed by vector clocks and CRDTs.
Fields§
§state: SyncStateThe local replicated state.
conflict_policy: ConflictPolicyHow concurrent writes to the same key are resolved.
pending_ops: VecDeque<SyncOperation>Operations that have been enqueued but not yet dispatched to remote peers.
sync_log: VecDeque<(String, SyncOperation, u64)>Audit log: (peer_id, operation, wall_timestamp).
Implementations§
Source§impl PeerSyncProtocol
impl PeerSyncProtocol
Sourcepub fn new(node_id: String, conflict_policy: ConflictPolicy) -> Self
pub fn new(node_id: String, conflict_policy: ConflictPolicy) -> Self
Create a new protocol instance for the given node.
§Arguments
node_id— a stable, globally-unique identifier for this node.conflict_policy— the policy applied when concurrent writes collide.
Sourcepub fn local_put(&mut self, key: String, value: Vec<u8>, now: u64) -> SyncEntry
pub fn local_put(&mut self, key: String, value: Vec<u8>, now: u64) -> SyncEntry
Write value at key and return the resulting SyncEntry.
The local vector clock is incremented before the entry is stored so that the returned entry strictly succeeds every previously stored entry from this node.
Sourcepub fn local_delete(&mut self, key: String, _now: u64)
pub fn local_delete(&mut self, key: String, _now: u64)
Mark key as deleted.
The key is added to the tombstone set and any live entry for it is removed. The local clock is incremented so that the deletion causally succeeds any previous entry.
Sourcepub fn apply_remote_op(
&mut self,
peer_id: &str,
op: SyncOperation,
now: u64,
) -> Result<(), SyncError>
pub fn apply_remote_op( &mut self, peer_id: &str, op: SyncOperation, now: u64, ) -> Result<(), SyncError>
Apply an operation received from a remote peer.
The sync audit log is updated regardless of whether the operation caused a state change.
§Errors
SyncError::Tombstoned— aPutarrived for a tombstoned key.SyncError::ConflictRejected—ConflictPolicy::RejectConflictrejected a conflictingPut.SyncError::InvalidOperation— aMergewith zero entries was supplied.
Sourcepub fn resolve_conflict(
&self,
existing: &SyncEntry,
incoming: &SyncEntry,
) -> Result<SyncEntry, SyncError>
pub fn resolve_conflict( &self, existing: &SyncEntry, incoming: &SyncEntry, ) -> Result<SyncEntry, SyncError>
Resolve a write–write conflict between existing and incoming according
to the active ConflictPolicy.
§Errors
Returns SyncError::ConflictRejected when the policy is
ConflictPolicy::RejectConflict.
Sourcepub fn generate_delta(&self, since_clock: &VectorClock) -> Vec<SyncOperation>
pub fn generate_delta(&self, since_clock: &VectorClock) -> Vec<SyncOperation>
Generate the set of local entries that a peer is missing.
An entry is considered missing from the peer when its clock does not
happen-before since_clock (i.e. the peer has not yet observed it).
All matching entries are returned as a single SyncOperation::Merge.
An empty Vec is returned when nothing needs to be sent.
Sourcepub fn full_sync(&self) -> SyncOperation
pub fn full_sync(&self) -> SyncOperation
Return all live (non-tombstoned) entries as a single
SyncOperation::Merge suitable for a full-state transfer.
Sourcepub fn is_tombstoned(&self, key: &str) -> bool
pub fn is_tombstoned(&self, key: &str) -> bool
Returns true if key has been deleted (tombstoned).
Sourcepub fn entry_count(&self) -> usize
pub fn entry_count(&self) -> usize
Number of live (non-tombstoned) entries.
Sourcepub fn clock_value(&self, node_id: &str) -> u64
pub fn clock_value(&self, node_id: &str) -> u64
The current vector-clock counter for node_id, or 0 if unknown.
Sourcepub fn stats(&self) -> PspSyncStats
pub fn stats(&self) -> PspSyncStats
Return a statistics snapshot for this instance.
Auto Trait Implementations§
impl Freeze for PeerSyncProtocol
impl RefUnwindSafe for PeerSyncProtocol
impl Send for PeerSyncProtocol
impl Sync for PeerSyncProtocol
impl Unpin for PeerSyncProtocol
impl UnsafeUnpin for PeerSyncProtocol
impl UnwindSafe for PeerSyncProtocol
Blanket Implementations§
impl<T> Allocation for T
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more