1use std::sync::Arc;
10
11use mssf_core::{
12 WString,
13 runtime::{
14 IPrimaryReplicator, IReplicator, IStatefulServicePartition, executor::BoxedCancelToken,
15 },
16 types::{
17 Epoch, ReplicaInformation, ReplicaRole, ReplicaSetConfig, ReplicaSetQuorumMode,
18 ServicePartitionAccessStatus,
19 },
20};
21
22#[derive(Clone)]
26pub struct EmptyReplicator {
27 name: WString,
28 partition: Option<Arc<dyn IStatefulServicePartition>>,
29}
30
31impl EmptyReplicator {
32 fn read_status(&self) -> Option<ServicePartitionAccessStatus> {
34 self.partition
35 .as_ref()
36 .map(|p| p.get_read_status().ok())
37 .unwrap_or(None)
38 }
39
40 fn write_status(&self) -> Option<ServicePartitionAccessStatus> {
42 self.partition
43 .as_ref()
44 .map(|p| p.get_write_status().ok())
45 .unwrap_or(None)
46 }
47}
48
49impl std::fmt::Debug for EmptyReplicator {
51 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52 write!(f, "EmptyReplicator-{}", self.name)
53 }
54}
55
56impl EmptyReplicator {
57 pub fn new(
59 name: WString,
60 partition: Option<Arc<dyn IStatefulServicePartition>>,
61 ) -> EmptyReplicator {
62 EmptyReplicator { name, partition }
63 }
64}
65
66#[mssf_core::async_trait]
68impl IReplicator for EmptyReplicator {
69 #[tracing::instrument(skip(_token), err, ret)]
70 async fn open(&self, _token: BoxedCancelToken) -> mssf_core::Result<WString> {
71 Ok(WString::from("NoProtocol://localhost:0"))
73 }
74
75 #[tracing::instrument(skip(_token), err, ret)]
76 async fn close(&self, _token: BoxedCancelToken) -> mssf_core::Result<()> {
77 Ok(())
78 }
79
80 #[tracing::instrument(skip(_token), fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
81 async fn change_role(
82 &self,
83 _epoch: Epoch,
84 _role: ReplicaRole,
85 _token: BoxedCancelToken,
86 ) -> mssf_core::Result<()> {
87 Ok(())
88 }
89
90 #[tracing::instrument(skip(_token), fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
91 async fn update_epoch(&self, _epoch: Epoch, _token: BoxedCancelToken) -> mssf_core::Result<()> {
92 Ok(())
93 }
94
95 #[tracing::instrument(err, ret)]
96 fn get_current_progress(&self) -> mssf_core::Result<i64> {
97 Ok(1)
98 }
99
100 #[tracing::instrument(err, ret)]
101 fn get_catch_up_capability(&self) -> mssf_core::Result<i64> {
102 Ok(1)
103 }
104
105 #[tracing::instrument()]
106 fn abort(&self) {
107 tracing::info!("abort");
108 }
109}
110
111#[mssf_core::async_trait]
113impl IPrimaryReplicator for EmptyReplicator {
114 #[tracing::instrument(skip(_token), err, ret)]
115 async fn on_data_loss(&self, _token: BoxedCancelToken) -> mssf_core::Result<u8> {
116 Ok(0)
117 }
118
119 #[tracing::instrument(err, ret)]
120 fn update_catch_up_replica_set_configuration(
121 &self,
122 currentconfiguration: ReplicaSetConfig,
123 previousconfiguration: ReplicaSetConfig,
124 ) -> mssf_core::Result<()> {
125 Ok(())
126 }
127
128 #[tracing::instrument(skip(_token), fields(read_status = ?self.read_status(), write_status = ?self.write_status()), err, ret)]
129 async fn wait_for_catch_up_quorum(
130 &self,
131 _catchupmode: ReplicaSetQuorumMode,
132 _token: BoxedCancelToken,
133 ) -> mssf_core::Result<()> {
134 Ok(())
155 }
156
157 #[tracing::instrument(err, ret)]
158 fn update_current_replica_set_configuration(
159 &self,
160 currentconfiguration: ReplicaSetConfig,
161 ) -> mssf_core::Result<()> {
162 Ok(())
163 }
164
165 #[tracing::instrument(skip(_token), err, ret)]
166 async fn build_replica(
167 &self,
168 _replica: ReplicaInformation,
169 _token: BoxedCancelToken,
170 ) -> mssf_core::Result<()> {
171 Ok(())
172 }
173
174 #[tracing::instrument(err, ret)]
175 fn remove_replica(&self, _replicaid: i64) -> mssf_core::Result<()> {
176 Ok(())
177 }
178}