Skip to content

Commit 326d7e8

Browse files
authored
RUST-845 Properly retry transactions in sync transactions test (#808)
1 parent f16fac2 commit 326d7e8

File tree

1 file changed

+49
-9
lines changed

1 file changed

+49
-9
lines changed

src/sync/test.rs

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use tokio::sync::RwLockReadGuard;
1010

1111
use crate::{
1212
bson::{doc, Document},
13-
error::Result,
13+
error::{Result, TRANSIENT_TRANSACTION_ERROR, UNKNOWN_TRANSACTION_COMMIT_RESULT},
1414
options::{
1515
Acknowledgment,
1616
ClientOptions,
@@ -21,7 +21,7 @@ use crate::{
2121
WriteConcern,
2222
},
2323
runtime,
24-
sync::{Client, Collection},
24+
sync::{Client, ClientSession, Collection},
2525
test::{TestClient as AsyncTestClient, LOCK},
2626
};
2727

@@ -243,6 +243,27 @@ fn transactions() {
243243
return;
244244
}
245245

246+
fn run_transaction_with_retry(
247+
session: &mut ClientSession,
248+
f: impl Fn(&mut ClientSession) -> Result<()>,
249+
) -> Result<()> {
250+
loop {
251+
match f(session) {
252+
Ok(()) => {
253+
return Ok(());
254+
}
255+
Err(error) => {
256+
if error.contains_label(TRANSIENT_TRANSACTION_ERROR) {
257+
continue;
258+
} else {
259+
session.abort_transaction()?;
260+
return Err(error);
261+
}
262+
}
263+
}
264+
}
265+
}
266+
246267
let options = CLIENT_OPTIONS.clone();
247268
let client = Client::with_options(options).expect("client creation should succeed");
248269
let mut session = client
@@ -258,17 +279,36 @@ fn transactions() {
258279
session
259280
.start_transaction(None)
260281
.expect("start transaction should succeed");
261-
coll.insert_one_with_session(doc! { "x": 1 }, None, &mut session)
262-
.expect("insert should succeed");
263-
session
264-
.commit_transaction()
265-
.expect("commit transaction should succeed");
282+
283+
run_transaction_with_retry(&mut session, |s| {
284+
coll.insert_one_with_session(doc! { "x": 1 }, None, s)?;
285+
Ok(())
286+
})
287+
.unwrap();
288+
289+
loop {
290+
match session.commit_transaction() {
291+
Ok(()) => {
292+
break;
293+
}
294+
Err(error) => {
295+
if error.contains_label(UNKNOWN_TRANSACTION_COMMIT_RESULT) {
296+
continue;
297+
} else {
298+
panic!("error while committing: {}", error);
299+
}
300+
}
301+
}
302+
}
266303

267304
session
268305
.start_transaction(None)
269306
.expect("start transaction should succeed");
270-
coll.insert_one_with_session(doc! { "x": 1 }, None, &mut session)
271-
.expect("insert should succeed");
307+
run_transaction_with_retry(&mut session, |s| {
308+
coll.insert_one_with_session(doc! { "x": 1 }, None, s)?;
309+
Ok(())
310+
})
311+
.unwrap();
272312
session
273313
.abort_transaction()
274314
.expect("abort transaction should succeed");

0 commit comments

Comments
 (0)