Skip to content

Commit 83b3a75

Browse files
committed
session: handle disconnection errors synchronously
When issuing an asynchronous operation on a session, such as executing or preparing a statement, let's synchronously ensure that the session is connected before proceeding. If the session is not connected, return an error immediately instead of allowing the operation to continue and asynchronously fail later. This change is not much observable by a user, but it's necessary to introduce the next change involving runtime configuration.
1 parent f148966 commit 83b3a75

File tree

1 file changed

+46
-26
lines changed

1 file changed

+46
-26
lines changed

scylla-rust-wrapper/src/session.rs

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -279,13 +279,18 @@ pub unsafe extern "C" fn cass_session_execute_batch(
279279
let mut state = batch_from_raw.state.clone();
280280
let batch_exec_profile = batch_from_raw.exec_profile.clone();
281281

282+
let Some(connected_session) = session_guard.connected.as_ref() else {
283+
return CassFuture::make_ready_raw(Err((
284+
CassError::CASS_ERROR_LIB_NO_HOSTS_AVAILABLE,
285+
"Session is not connected".msg(),
286+
)));
287+
};
288+
282289
let future = async move {
283-
let Some(connected_session) = session_guard.connected.as_ref() else {
284-
return Err((
285-
CassError::CASS_ERROR_LIB_NO_HOSTS_AVAILABLE,
286-
"Session is not connected".msg(),
287-
));
288-
};
290+
let connected_session = session_guard
291+
.connected
292+
.as_ref()
293+
.expect("This should have been handled synchronously!");
289294

290295
let session = &connected_session.session;
291296

@@ -338,6 +343,13 @@ pub unsafe extern "C" fn cass_session_execute(
338343
)));
339344
};
340345

346+
let Some(connected_session) = session_guard.connected.as_ref() else {
347+
return CassFuture::make_ready_raw(Err((
348+
CassError::CASS_ERROR_LIB_NO_HOSTS_AVAILABLE,
349+
"Session is not connected".msg(),
350+
)));
351+
};
352+
341353
let paging_state = statement_opt.paging_state.clone();
342354
let paging_enabled = statement_opt.paging_enabled;
343355
let mut statement = statement_opt.statement.clone();
@@ -366,15 +378,13 @@ pub unsafe extern "C" fn cass_session_execute(
366378
let statement_exec_profile = statement_opt.exec_profile.clone();
367379

368380
let future = async move {
369-
let Some(cass_connected_session) = session_guard.connected.as_ref() else {
370-
return Err((
371-
CassError::CASS_ERROR_LIB_NO_HOSTS_AVAILABLE,
372-
"Session is not connected".msg(),
373-
));
374-
};
375-
let session = &cass_connected_session.session;
381+
let connected_session = session_guard
382+
.connected
383+
.as_ref()
384+
.expect("This should have been handled synchronously!");
385+
let session = &connected_session.session;
376386

377-
let handle = cass_connected_session
387+
let handle = connected_session
378388
.get_or_resolve_profile_handle(statement_exec_profile.as_ref())
379389
.await?;
380390

@@ -500,6 +510,13 @@ pub unsafe extern "C" fn cass_session_prepare_from_existing(
500510
)));
501511
};
502512

513+
let Some(connected_session) = session_guard.connected.as_ref() else {
514+
return CassFuture::make_ready_raw(Err((
515+
CassError::CASS_ERROR_LIB_NO_HOSTS_AVAILABLE,
516+
"Session is not connected".msg(),
517+
)));
518+
};
519+
503520
let statement = cass_statement.statement.clone();
504521

505522
CassFuture::make_raw(
@@ -511,12 +528,10 @@ pub unsafe extern "C" fn cass_session_prepare_from_existing(
511528
}
512529
};
513530

514-
let Some(connected_session) = session_guard.connected.as_ref() else {
515-
return Err((
516-
CassError::CASS_ERROR_LIB_NO_HOSTS_AVAILABLE,
517-
"Session is not connected".msg(),
518-
));
519-
};
531+
let connected_session = session_guard
532+
.connected
533+
.as_ref()
534+
.expect("This should have been handled synchronously!");
520535

521536
let prepared = connected_session
522537
.session
@@ -566,15 +581,20 @@ pub unsafe extern "C" fn cass_session_prepare_n(
566581
)));
567582
};
568583

584+
let Some(connected_session) = session_guard.connected.as_ref() else {
585+
return CassFuture::make_ready_raw(Err((
586+
CassError::CASS_ERROR_LIB_NO_HOSTS_AVAILABLE,
587+
"Session is not connected".msg(),
588+
)));
589+
};
590+
569591
let query = Statement::new(query_str.to_string());
570592

571593
let fut = async move {
572-
let Some(connected_session) = session_guard.connected.as_ref() else {
573-
return Err((
574-
CassError::CASS_ERROR_LIB_NO_HOSTS_AVAILABLE,
575-
"Session is not connected".msg(),
576-
));
577-
};
594+
let connected_session = session_guard
595+
.connected
596+
.as_ref()
597+
.expect("This should have been handled synchronously!");
578598

579599
let prepared = connected_session
580600
.session

0 commit comments

Comments
 (0)