use mssf_core::{
WString,
runtime::{
executor::BoxedCancelToken,
stateful::{PrimaryReplicator, Replicator},
stateful_proxy::StatefulServicePartition,
},
types::{
Epoch, ReplicaInformation, ReplicaRole, ReplicaSetConfig, ReplicaSetQuorumMode,
ServicePartitionAccessStatus,
},
};
#[derive(Clone)]
pub struct EmptyReplicator {
name: WString,
partition: Option<StatefulServicePartition>,
}
impl EmptyReplicator {
fn read_status(&self) -> Option<ServicePartitionAccessStatus> {
self.partition
.as_ref()
.map(|p| p.get_read_status().ok())
.unwrap_or(None)
}
fn write_status(&self) -> Option<ServicePartitionAccessStatus> {
self.partition
.as_ref()
.map(|p| p.get_write_status().ok())
.unwrap_or(None)
}
}
impl std::fmt::Debug for EmptyReplicator {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "EmptyReplicator-{}", self.name)
}
}
impl EmptyReplicator {
pub fn new(name: WString, partition: Option<StatefulServicePartition>) -> EmptyReplicator {
EmptyReplicator { name, partition }
}
}
impl Replicator for EmptyReplicator {
#[tracing::instrument(err, ret)]
async fn open(&self, _: BoxedCancelToken) -> mssf_core::Result<WString> {
Ok(WString::from("NoProtocol://localhost:0"))
}
#[tracing::instrument(err, ret)]
async fn close(&self, _: BoxedCancelToken) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
async fn change_role(
&self,
epoch: Epoch,
role: ReplicaRole,
_: BoxedCancelToken,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
async fn update_epoch(&self, epoch: Epoch, _: BoxedCancelToken) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(err, ret)]
fn get_current_progress(&self) -> mssf_core::Result<i64> {
Ok(1)
}
#[tracing::instrument(err, ret)]
fn get_catch_up_capability(&self) -> mssf_core::Result<i64> {
Ok(1)
}
#[tracing::instrument(skip(self))]
fn abort(&self) {
tracing::info!("abort");
}
}
impl PrimaryReplicator for EmptyReplicator {
async fn on_data_loss(&self, _: BoxedCancelToken) -> mssf_core::Result<u8> {
Ok(0)
}
#[tracing::instrument(err, ret)]
fn update_catch_up_replica_set_configuration(
&self,
currentconfiguration: ReplicaSetConfig,
previousconfiguration: ReplicaSetConfig,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
async fn wait_for_catch_up_quorum(
&self,
catchupmode: ReplicaSetQuorumMode,
_: BoxedCancelToken,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(err, ret)]
fn update_current_replica_set_configuration(
&self,
currentconfiguration: ReplicaSetConfig,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(err, ret)]
async fn build_replica(
&self,
replica: ReplicaInformation,
_: BoxedCancelToken,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(err, ret)]
fn remove_replica(&self, _replicaid: i64) -> mssf_core::Result<()> {
Ok(())
}
}