use crate::runtime::executor::BoxedCancelToken;
use crate::types::ReplicaRole;
use crate::types::{Epoch, OpenMode, ReplicaInformation, ReplicaSetConfig, ReplicaSetQuorumMode};
pub trait IStatefulServiceFactory: Send + Sync + 'static {
fn create_replica(
&self,
servicetypename: crate::WString,
servicename: crate::types::Uri,
initializationdata: &[u8],
partitionid: crate::GUID,
replicaid: i64,
) -> crate::Result<Box<dyn IStatefulServiceReplica>>;
}
#[async_trait::async_trait]
pub trait IStatefulServiceReplica: Send + Sync + 'static {
async fn open(
&self,
openmode: OpenMode,
partition: std::sync::Arc<dyn IStatefulServicePartition>,
cancellation_token: BoxedCancelToken,
) -> crate::Result<Box<dyn IPrimaryReplicator>>;
async fn change_role(
&self,
newrole: ReplicaRole,
cancellation_token: BoxedCancelToken,
) -> crate::Result<crate::WString>;
async fn close(&self, cancellation_token: BoxedCancelToken) -> crate::Result<()>;
fn abort(&self);
}
#[async_trait::async_trait]
pub trait IReplicator: Send + Sync + 'static {
async fn open(&self, cancellation_token: BoxedCancelToken) -> crate::Result<crate::WString>;
async fn close(&self, cancellation_token: BoxedCancelToken) -> crate::Result<()>;
async fn change_role(
&self,
epoch: Epoch,
role: ReplicaRole,
cancellation_token: BoxedCancelToken,
) -> crate::Result<()>;
async fn update_epoch(
&self,
epoch: Epoch,
cancellation_token: BoxedCancelToken,
) -> crate::Result<()>;
fn get_current_progress(&self) -> crate::Result<i64>;
fn get_catch_up_capability(&self) -> crate::Result<i64>;
fn abort(&self);
}
#[async_trait::async_trait]
pub trait IPrimaryReplicator: IReplicator {
async fn on_data_loss(&self, cancellation_token: BoxedCancelToken) -> crate::Result<u8>;
fn update_catch_up_replica_set_configuration(
&self,
currentconfiguration: ReplicaSetConfig,
previousconfiguration: ReplicaSetConfig,
) -> crate::Result<()>;
fn update_current_replica_set_configuration(
&self,
currentconfiguration: ReplicaSetConfig,
) -> crate::Result<()>;
async fn wait_for_catch_up_quorum(
&self,
catchupmode: ReplicaSetQuorumMode,
cancellation_token: BoxedCancelToken,
) -> crate::Result<()>;
async fn build_replica(
&self,
replica: ReplicaInformation,
cancellation_token: BoxedCancelToken,
) -> crate::Result<()>;
fn remove_replica(&self, replicaid: i64) -> crate::Result<()>;
}
impl std::fmt::Debug for dyn IPrimaryReplicator {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("IPrimaryReplicator").finish()
}
}
pub trait IStatefulServicePartition: Send + Sync + 'static {
fn create_replicator(&self) -> crate::Result<Box<dyn IPrimaryReplicator>>;
fn get_partition_information(&self)
-> crate::Result<crate::types::ServicePartitionInformation>;
fn get_read_status(&self) -> crate::Result<crate::types::ServicePartitionAccessStatus>;
fn get_write_status(&self) -> crate::Result<crate::types::ServicePartitionAccessStatus>;
fn report_load(&self, metrics: &[crate::types::LoadMetric]) -> crate::Result<()>;
fn report_fault(&self, fault_type: crate::types::FaultType) -> crate::Result<()>;
fn report_move_cost(&self, move_cost: crate::types::MoveCost) -> crate::Result<()>;
fn report_partition_health(
&self,
healthinfo: &crate::types::HealthInformation,
) -> crate::Result<()>;
fn report_replica_health(
&self,
healthinfo: &crate::types::HealthInformation,
) -> crate::Result<()>;
fn try_get_com(
&self,
) -> crate::Result<&mssf_com::FabricRuntime::IFabricStatefulServicePartition>;
}
impl std::fmt::Debug for dyn IStatefulServicePartition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("IStatefulServicePartition").finish()
}
}