use std::sync::Arc;
use mssf_core::{
WString,
runtime::{
IPrimaryReplicator, IReplicator, IStatefulServicePartition, executor::BoxedCancelToken,
},
types::{
Epoch, ReplicaInformation, ReplicaRole, ReplicaSetConfig, ReplicaSetQuorumMode,
ServicePartitionAccessStatus,
},
};
#[derive(Clone)]
pub struct EmptyReplicator {
name: WString,
partition: Option<Arc<dyn IStatefulServicePartition>>,
}
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<Arc<dyn IStatefulServicePartition>>,
) -> EmptyReplicator {
EmptyReplicator { name, partition }
}
}
#[mssf_core::async_trait]
impl IReplicator for EmptyReplicator {
#[tracing::instrument(skip(_token), err, ret)]
async fn open(&self, _token: BoxedCancelToken) -> mssf_core::Result<WString> {
Ok(WString::from("NoProtocol://localhost:0"))
}
#[tracing::instrument(skip(_token), err, ret)]
async fn close(&self, _token: BoxedCancelToken) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(skip(_token), fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
async fn change_role(
&self,
_epoch: Epoch,
_role: ReplicaRole,
_token: BoxedCancelToken,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(skip(_token), fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
async fn update_epoch(&self, _epoch: Epoch, _token: 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()]
fn abort(&self) {
tracing::info!("abort");
}
}
#[mssf_core::async_trait]
impl IPrimaryReplicator for EmptyReplicator {
#[tracing::instrument(skip(_token), err, ret)]
async fn on_data_loss(&self, _token: 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(skip(_token), fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
async fn wait_for_catch_up_quorum(
&self,
_catchupmode: ReplicaSetQuorumMode,
_token: BoxedCancelToken,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(err, ret)]
fn update_current_replica_set_configuration(
&self,
currentconfiguration: ReplicaSetConfig,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(skip(_token), err, ret)]
async fn build_replica(
&self,
_replica: ReplicaInformation,
_token: BoxedCancelToken,
) -> mssf_core::Result<()> {
Ok(())
}
#[tracing::instrument(err, ret)]
fn remove_replica(&self, _replicaid: i64) -> mssf_core::Result<()> {
Ok(())
}
}