typedb_driver/connection/server/
mod.rs1pub(crate) mod server_connection;
21pub(crate) mod server_manager;
22pub mod server_routing;
23pub mod server_version;
24
25use crate::common::address::{Address, address_translation::AddressTranslation};
26
27pub const DEFAULT_SERVER_ID: u64 = 0;
28
29pub trait Replica: Clone {
30 fn id(&self) -> u64;
32
33 fn role(&self) -> Option<ReplicationRole>;
35
36 fn is_primary(&self) -> bool;
38
39 fn term(&self) -> Option<u64>;
41}
42
43#[derive(Debug, Clone, Eq, PartialEq, Hash)]
45pub enum Server {
46 Available(AvailableServer),
47 Unavailable { replication_status: Option<ReplicationStatus> },
48}
49
50impl Server {
51 pub(crate) fn available_from_private(
52 private_address: Address,
53 replication_status: Option<ReplicationStatus>,
54 ) -> Self {
55 Self::Available(AvailableServer::from_private(private_address, replication_status))
56 }
57
58 pub(crate) fn translate_address(&mut self, address_translation: &AddressTranslation) {
59 match self {
60 Server::Available(available) => available.translate_address(address_translation),
61 Server::Unavailable { .. } => {}
62 }
63 }
64
65 pub(crate) fn translated(mut self, address_translation: &AddressTranslation) -> Self {
66 self.translate_address(address_translation);
67 self
68 }
69
70 pub(crate) fn replication_status(&self) -> &Option<ReplicationStatus> {
71 match self {
72 Server::Available(available_server) => available_server.replication_status(),
73 Server::Unavailable { replication_status } => replication_status,
74 }
75 }
76
77 pub fn address(&self) -> Option<&Address> {
79 match self {
80 Server::Available(available_server) => Some(available_server.address()),
81 Server::Unavailable { .. } => None,
82 }
83 }
84}
85
86impl Replica for Server {
87 fn id(&self) -> u64 {
89 self.replication_status().map(|status| status.id).unwrap_or(DEFAULT_SERVER_ID)
90 }
91
92 fn role(&self) -> Option<ReplicationRole> {
94 self.replication_status().map(|status| status.role).flatten()
95 }
96
97 fn is_primary(&self) -> bool {
99 matches!(self.role(), Some(ReplicationRole::Primary))
100 }
101
102 fn term(&self) -> Option<u64> {
104 self.replication_status().map(|status| status.term).flatten()
105 }
106}
107
108#[derive(Debug, Clone, Eq, PartialEq, Hash)]
110pub struct AvailableServer {
111 private_address: Address,
112 public_address: Option<Address>,
113 replication_status: Option<ReplicationStatus>,
114}
115
116impl AvailableServer {
117 pub(crate) fn from_private(private_address: Address, replication_status: Option<ReplicationStatus>) -> Self {
118 Self { private_address, public_address: None, replication_status }
119 }
120
121 pub(crate) fn translate_address(&mut self, address_translation: &AddressTranslation) {
122 if let Some(translated) = address_translation.to_public(&self.private_address) {
123 self.public_address = Some(translated);
124 }
125 }
126
127 pub(crate) fn translated(mut self, address_translation: &AddressTranslation) -> Self {
128 self.translate_address(address_translation);
129 self
130 }
131
132 pub(crate) fn private_address(&self) -> &Address {
133 &self.private_address
134 }
135
136 pub(crate) fn replication_status(&self) -> &Option<ReplicationStatus> {
137 &self.replication_status
138 }
139
140 pub fn address(&self) -> &Address {
142 self.public_address.as_ref().unwrap_or_else(|| &self.private_address)
143 }
144}
145
146impl Replica for AvailableServer {
147 fn id(&self) -> u64 {
149 self.replication_status().map(|status| status.id).unwrap_or(DEFAULT_SERVER_ID)
150 }
151
152 fn role(&self) -> Option<ReplicationRole> {
154 self.replication_status().map(|status| status.role).flatten()
155 }
156
157 fn is_primary(&self) -> bool {
159 matches!(self.role(), Some(ReplicationRole::Primary))
160 }
161
162 fn term(&self) -> Option<u64> {
164 self.replication_status().map(|status| status.term).flatten()
165 }
166}
167
168#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
170pub struct ReplicationStatus {
171 pub(crate) id: u64,
173 pub(crate) role: Option<ReplicationRole>,
175 pub(crate) term: Option<u64>,
177}
178
179impl Default for ReplicationStatus {
180 fn default() -> Self {
181 Self { id: DEFAULT_SERVER_ID, role: None, term: None }
182 }
183}
184
185#[repr(C)]
187#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
188pub enum ReplicationRole {
189 Primary,
191 Candidate,
193 Secondary,
195}