Skip to content

Commit 2ac20a9

Browse files
authored
Merge pull request #1080 from muzarski/protocol-error-refactor
errors: protocol error refactor
2 parents ea7c464 + 204f911 commit 2ac20a9

10 files changed

+439
-152
lines changed

scylla/src/statement/prepared_statement.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::frame::types::{Consistency, SerialConsistency};
1818
use crate::history::HistoryListener;
1919
use crate::retry_policy::RetryPolicy;
2020
use crate::routing::Token;
21-
use crate::transport::errors::{BadQuery, QueryError};
21+
use crate::transport::errors::{BadQuery, ProtocolError, QueryError};
2222
use crate::transport::execution_profile::ExecutionProfileHandle;
2323
use crate::transport::partitioner::{Partitioner, PartitionerHasher, PartitionerName};
2424

@@ -241,7 +241,7 @@ impl PreparedStatement {
241241
self.extract_partition_key(serialized_values)
242242
.map_err(|err| match err {
243243
PartitionKeyExtractionError::NoPkIndexValue(_, _) => {
244-
QueryError::ProtocolError("No pk indexes - can't calculate token")
244+
ProtocolError::PartitionKeyExtraction
245245
}
246246
})?;
247247
let token = partition_key

scylla/src/transport/connection.rs

+42-31
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ use std::{
4646
net::{Ipv4Addr, Ipv6Addr},
4747
};
4848

49+
use super::errors::{ProtocolError, UseKeyspaceProtocolError};
4950
use super::iterator::RowIterator;
5051
use super::locator::tablets::{RawTablet, TabletParsingError};
51-
use super::query_result::SingleRowTypedError;
5252
use super::session::AddressTranslator;
5353
use super::topology::{PeerEndpoint, UntranslatedEndpoint, UntranslatedPeer};
5454
use super::NodeAddr;
@@ -299,10 +299,11 @@ impl NonErrorQueryResponse {
299299
let (result, paging_state) = self.into_query_result_and_paging_state()?;
300300

301301
if !paging_state.finished() {
302-
let error_msg = "Internal driver API misuse or a server bug: nonfinished paging state\
303-
would be discarded by `NonErrorQueryResponse::into_query_result`";
304-
error!(error_msg);
305-
return Err(QueryError::ProtocolError(error_msg));
302+
error!(
303+
"Internal driver API misuse or a server bug: nonfinished paging state\
304+
would be discarded by `NonErrorQueryResponse::into_query_result`"
305+
);
306+
return Err(ProtocolError::NonfinishedPagingState.into());
306307
}
307308

308309
Ok(result)
@@ -904,7 +905,11 @@ impl Connection {
904905
// Reprepared statement should keep its id - it's the md5 sum
905906
// of statement contents
906907
if reprepared.get_id() != previous_prepared.get_id() {
907-
Err(UserRequestError::RepreparedIdChanged)
908+
Err(UserRequestError::RepreparedIdChanged {
909+
statement: reprepare_query.contents,
910+
expected_id: previous_prepared.get_id().clone().into(),
911+
reprepared_id: reprepared.get_id().clone().into(),
912+
})
908913
} else {
909914
Ok(())
910915
}
@@ -1284,17 +1289,16 @@ impl Connection {
12841289
self.reprepare(p.get_statement(), p).await?;
12851290
continue;
12861291
} else {
1287-
return Err(QueryError::ProtocolError(
1288-
"The server returned a prepared statement Id that did not exist in the batch",
1289-
));
1292+
return Err(ProtocolError::RepreparedIdMissingInBatch.into());
12901293
}
12911294
}
12921295
_ => Err(err.into()),
12931296
},
12941297
Response::Result(_) => Ok(query_response.into_query_result()?),
1295-
_ => Err(QueryError::ProtocolError(
1296-
"BATCH: Unexpected server response",
1297-
)),
1298+
_ => Err(ProtocolError::UnexpectedResponse(
1299+
query_response.response.to_response_kind(),
1300+
)
1301+
.into()),
12981302
};
12991303
}
13001304
}
@@ -1359,23 +1363,40 @@ impl Connection {
13591363
};
13601364

13611365
let query_response = self.query_raw_unpaged(&query, PagingState::start()).await?;
1366+
Self::verify_use_keyspace_result(keyspace_name, query_response)
1367+
}
13621368

1369+
fn verify_use_keyspace_result(
1370+
keyspace_name: &VerifiedKeyspaceName,
1371+
query_response: QueryResponse,
1372+
) -> Result<(), QueryError> {
13631373
match query_response.response {
13641374
Response::Result(result::Result::SetKeyspace(set_keyspace)) => {
1365-
if set_keyspace.keyspace_name.to_lowercase()
1366-
!= keyspace_name.as_str().to_lowercase()
1375+
if !set_keyspace
1376+
.keyspace_name
1377+
.eq_ignore_ascii_case(keyspace_name.as_str())
13671378
{
1368-
return Err(QueryError::ProtocolError(
1369-
"USE <keyspace_name> returned response with different keyspace name",
1370-
));
1379+
let expected_keyspace_name_lowercase = keyspace_name.as_str().to_lowercase();
1380+
let result_keyspace_name_lowercase = set_keyspace.keyspace_name.to_lowercase();
1381+
1382+
return Err(ProtocolError::UseKeyspace(
1383+
UseKeyspaceProtocolError::KeyspaceNameMismatch {
1384+
expected_keyspace_name_lowercase,
1385+
result_keyspace_name_lowercase,
1386+
},
1387+
)
1388+
.into());
13711389
}
13721390

13731391
Ok(())
13741392
}
13751393
Response::Error(err) => Err(err.into()),
1376-
_ => Err(QueryError::ProtocolError(
1377-
"USE <keyspace_name> returned unexpected response",
1378-
)),
1394+
_ => Err(
1395+
ProtocolError::UseKeyspace(UseKeyspaceProtocolError::UnexpectedResponse(
1396+
query_response.response.to_response_kind(),
1397+
))
1398+
.into(),
1399+
),
13791400
}
13801401
}
13811402

@@ -1425,17 +1446,7 @@ impl Connection {
14251446
.query_unpaged(LOCAL_VERSION)
14261447
.await?
14271448
.single_row_typed()
1428-
.map_err(|err| match err {
1429-
SingleRowTypedError::RowsExpected(_) => {
1430-
QueryError::ProtocolError("Version query returned not rows")
1431-
}
1432-
SingleRowTypedError::BadNumberOfRows(_) => {
1433-
QueryError::ProtocolError("system.local query returned a wrong number of rows")
1434-
}
1435-
SingleRowTypedError::FromRowError(_) => {
1436-
QueryError::ProtocolError("Row is not uuid type as it should be")
1437-
}
1438-
})?;
1449+
.map_err(ProtocolError::SchemaVersionFetch)?;
14391450
Ok(version_id)
14401451
}
14411452

scylla/src/transport/downgrading_consistency_retry_policy.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,9 @@ mod tests {
185185
use bytes::Bytes;
186186

187187
use crate::test_utils::setup_tracing;
188-
use crate::transport::errors::{BadQuery, BrokenConnectionErrorKind, ConnectionPoolError};
188+
use crate::transport::errors::{
189+
BadQuery, BrokenConnectionErrorKind, ConnectionPoolError, ProtocolError,
190+
};
189191

190192
use super::*;
191193

@@ -284,7 +286,7 @@ mod tests {
284286
cl,
285287
);
286288
downgrading_consistency_policy_assert_never_retries(
287-
QueryError::ProtocolError("test"),
289+
ProtocolError::NonfinishedPagingState.into(),
288290
cl,
289291
);
290292
}

0 commit comments

Comments
 (0)