Skip to content

Commit eff526c

Browse files
committed
RUST-679 Use error strings when marking servers as unknown from CMAP
1 parent 08c5b33 commit eff526c

File tree

7 files changed

+26
-22
lines changed

7 files changed

+26
-22
lines changed

src/cmap/test/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ impl Executor {
163163
let manager = pool.manager.clone();
164164
RUNTIME.execute(async move {
165165
while let Some(update) = update_receiver.recv().await {
166-
match update.message() {
166+
match update.into_message() {
167167
ServerUpdate::Error { .. } => manager.clear(),
168168
}
169169
}

src/cmap/worker.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ async fn establish_connection(
562562
};
563563
handler.handle_connection_closed_event(event);
564564
}
565-
server_updater.handle_error(e.clone(), generation).await;
565+
server_updater.handle_error(&e, generation).await;
566566
manager.handle_connection_failed();
567567
}
568568
Ok(ref mut connection) => {

src/runtime/acknowledged_message.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ impl<M, R> AcknowledgedMessage<M, R> {
2121
}
2222

2323
/// Get the message.
24-
pub(crate) fn message(&self) -> &M {
25-
&self.message
24+
pub(crate) fn into_message(self) -> M {
25+
self.message
2626
}
2727

2828
/// Send acknowledgement to the receiver.

src/sdam/monitor.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use super::{
1212
use crate::{
1313
bson::doc,
1414
cmap::{is_master, Command, Connection, Handshaker, PoolGenerationSubscriber},
15-
error::{Error, Result},
15+
error::Result,
1616
is_master::IsMasterReply,
1717
options::{ClientOptions, StreamAddress},
1818
RUNTIME,
@@ -159,7 +159,7 @@ impl HeartbeatMonitor {
159159
.map(|sd| sd.is_available())
160160
.unwrap_or(false)
161161
{
162-
self.handle_error(e, topology, server).await;
162+
self.handle_error(e.to_string(), topology, server).await;
163163
retried = true;
164164
self.perform_is_master().await
165165
} else {
@@ -174,7 +174,7 @@ impl HeartbeatMonitor {
174174
ServerDescription::new(server.address.clone(), Some(Ok(reply)));
175175
topology.update(server, server_description).await
176176
}
177-
Err(e) => self.handle_error(e, topology, server).await || retried,
177+
Err(e) => self.handle_error(e.to_string(), topology, server).await || retried,
178178
}
179179
}
180180

@@ -217,8 +217,8 @@ impl HeartbeatMonitor {
217217
result
218218
}
219219

220-
async fn handle_error(&mut self, error: Error, topology: &Topology, server: &Server) -> bool {
221-
topology.handle_pre_handshake_error(&error, server).await
220+
async fn handle_error(&mut self, error: String, topology: &Topology, server: &Server) -> bool {
221+
topology.handle_pre_handshake_error(error, server).await
222222
}
223223
}
224224

@@ -244,13 +244,13 @@ impl UpdateMonitor {
244244
_ => return,
245245
};
246246

247-
match update.message() {
247+
match update.into_message() {
248248
ServerUpdate::Error {
249249
error,
250250
error_generation,
251251
} => {
252-
if *error_generation == self.generation_subscriber.generation() {
253-
topology.handle_pre_handshake_error(&error, &server).await;
252+
if error_generation == self.generation_subscriber.generation() {
253+
topology.handle_pre_handshake_error(error, &server).await;
254254
}
255255
}
256256
}

src/sdam/state/mod.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,10 @@ impl Topology {
227227

228228
/// Updates the topology based on an error that occurs before the handshake has completed during
229229
/// an operation.
230-
pub(crate) async fn handle_pre_handshake_error(&self, error: &Error, server: &Server) -> bool {
230+
pub(crate) async fn handle_pre_handshake_error(&self, error: String, server: &Server) -> bool {
231231
let state_lock = self.state.write().await;
232232
let changed = self
233-
.mark_server_as_unknown(&error, &server, state_lock)
233+
.mark_server_as_unknown(error, &server, state_lock)
234234
.await;
235235
if changed {
236236
server.pool.clear();
@@ -249,13 +249,13 @@ impl Topology {
249249
// SDAM spec.
250250
if error.is_non_timeout_network_error() {
251251
let state_lock = self.state.write().await;
252-
self.mark_server_as_unknown(error, &server, state_lock)
252+
self.mark_server_as_unknown(error.to_string(), &server, state_lock)
253253
.await;
254254
server.pool.clear();
255255
} else if error.is_recovering() || error.is_not_master() {
256256
let state_lock = self.state.write().await;
257257

258-
self.mark_server_as_unknown(error, &server, state_lock)
258+
self.mark_server_as_unknown(error.to_string(), &server, state_lock)
259259
.await;
260260

261261
let wire_version = conn
@@ -279,12 +279,11 @@ impl Topology {
279279
/// Returns whether the topology changed as a result of the update.
280280
async fn mark_server_as_unknown(
281281
&self,
282-
error: &Error,
282+
error: String,
283283
server: &Server,
284284
state_lock: RwLockWriteGuard<'_, TopologyState>,
285285
) -> bool {
286-
let description =
287-
ServerDescription::new(server.address.clone(), Some(Err(error.to_string())));
286+
let description = ServerDescription::new(server.address.clone(), Some(Err(error)));
288287
self.update_and_notify(server, description, state_lock)
289288
.await
290289
}

src/sdam/state/server.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ impl Server {
7474
/// TODO: add success cases from application handshakes.
7575
#[derive(Debug)]
7676
pub(crate) enum ServerUpdate {
77-
Error { error: Error, error_generation: u32 },
77+
Error {
78+
error: String,
79+
error_generation: u32,
80+
},
7881
}
7982

8083
#[derive(Debug)]
@@ -106,9 +109,9 @@ impl ServerUpdateSender {
106109

107110
/// Update the server based on the given error.
108111
/// This will block until the topology has processed the error.
109-
pub(crate) async fn handle_error(&mut self, error: Error, error_generation: u32) {
112+
pub(crate) async fn handle_error(&mut self, error: &Error, error_generation: u32) {
110113
let reason = ServerUpdate::Error {
111-
error,
114+
error: error.to_string(),
112115
error_generation,
113116
};
114117

src/test/util/event.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ pub type EventQueue<T> = Arc<RwLock<VecDeque<T>>>;
3131
pub type CmapEvent = crate::cmap::test::event::Event;
3232

3333
#[derive(Clone, Debug, From)]
34+
#[allow(clippy::large_enum_variant)]
3435
pub enum Event {
3536
CmapEvent(CmapEvent),
3637
CommandEvent(CommandEvent),
3738
}
3839

3940
#[derive(Clone, Debug)]
41+
#[allow(clippy::large_enum_variant)]
4042
pub enum CommandEvent {
4143
CommandStartedEvent(CommandStartedEvent),
4244
CommandSucceededEvent(CommandSucceededEvent),

0 commit comments

Comments
 (0)