use crate::runtime::executor::BoxedCancelToken;
use crate::types::ReplicaRole;
use crate::types::{Epoch, OpenMode, ReplicaInformation, ReplicaSetConfig, ReplicaSetQuorumMode};
use super::stateful_proxy::StatefulServicePartition;
pub trait StatefulServiceFactory {
fn create_replica(
&self,
servicetypename: &crate::WString,
servicename: &crate::WString,
initializationdata: &[u8],
partitionid: &crate::GUID,
replicaid: i64,
) -> crate::Result<impl StatefulServiceReplica>;
}
#[trait_variant::make(StatefulServiceReplica: Send)]
pub trait LocalStatefulServiceReplica: Send + Sync + 'static {
async fn open(
&self,
openmode: OpenMode,
partition: &StatefulServicePartition,
cancellation_token: BoxedCancelToken,
) -> crate::Result<impl PrimaryReplicator>;
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);
}
#[trait_variant::make(Replicator: Send)]
pub trait LocalReplicator: 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);
}
#[trait_variant::make(PrimaryReplicator: Send)]
pub trait LocalPrimaryReplicator: Replicator {
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<()>;
}