use bytes::Bytes;
use tokio::sync::oneshot;
use crate::error::Result;
use crate::replicator::{OpenContext, ReplicatorHandle};
use crate::types::{
DataLossAction, Epoch, Lsn, OpenMode, OperationStream, ReplicaId, ReplicaInfo,
ReplicaSetConfig, ReplicaSetQuorumMode, Role,
};
pub enum ReplicatorControlEvent {
Open {
mode: OpenMode,
reply: oneshot::Sender<Result<()>>,
},
Close {
reply: oneshot::Sender<Result<()>>,
},
Abort,
ChangeRole {
epoch: Epoch,
role: Role,
reply: oneshot::Sender<Result<()>>,
},
UpdateEpoch {
epoch: Epoch,
reply: oneshot::Sender<Result<()>>,
},
OnDataLoss {
reply: oneshot::Sender<Result<DataLossAction>>,
},
UpdateCatchUpConfiguration {
current: ReplicaSetConfig,
previous: ReplicaSetConfig,
reply: oneshot::Sender<Result<()>>,
},
UpdateCurrentConfiguration {
current: ReplicaSetConfig,
reply: oneshot::Sender<Result<()>>,
},
WaitForCatchUpQuorum {
mode: ReplicaSetQuorumMode,
reply: oneshot::Sender<Result<()>>,
},
BuildReplica {
replica: ReplicaInfo,
reply: oneshot::Sender<Result<()>>,
},
RemoveReplica {
replica_id: ReplicaId,
reply: oneshot::Sender<Result<()>>,
},
}
pub struct ReplicateRequest {
pub data: Bytes,
pub reply: oneshot::Sender<Result<Lsn>>,
}
pub enum LifecycleEvent {
Open {
ctx: OpenContext,
reply: oneshot::Sender<Result<ReplicatorHandle>>,
},
ChangeRole {
new_role: Role,
reply: oneshot::Sender<Result<String>>,
},
Close { reply: oneshot::Sender<Result<()>> },
Abort,
}
pub enum StateProviderEvent {
UpdateEpoch {
epoch: Epoch,
previous_epoch_last_lsn: Lsn,
reply: oneshot::Sender<Result<()>>,
},
GetLastCommittedLsn { reply: oneshot::Sender<Result<Lsn>> },
GetCopyContext {
reply: oneshot::Sender<Result<OperationStream>>,
},
GetCopyState {
up_to_lsn: Lsn,
copy_context: OperationStream,
reply: oneshot::Sender<Result<OperationStream>>,
},
OnDataLoss {
reply: oneshot::Sender<Result<bool>>,
},
}