Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

errors: protocol error refactor #1080

Merged
merged 25 commits into from
Oct 4, 2024
Merged
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
b3f7081
errors: introduce ProtocolError enum type
muzarski Sep 24, 2024
a530a3f
use_keyspace: make use of `eq_ignore_ascii_case`
muzarski Oct 1, 2024
1aae3a2
errors: UseKeyspaceProtocolError
muzarski Sep 24, 2024
dc824ab
errors: schema version fetch protocol error
muzarski Sep 24, 2024
70c9ca2
errors: nonfinished paging state protocol error
muzarski Sep 24, 2024
5b180f1
errors: LBP empty plan error
muzarski Sep 24, 2024
5fc5768
errors: prepared statement id mismatch protocol error
muzarski Sep 24, 2024
997eb7a
errors: reprepared stmt id changed protocol error
muzarski Sep 24, 2024
06b68ae
errors: fix InvalidCqlType -> QueryError conversion
muzarski Sep 25, 2024
18319d9
errors: partition key extraction error
muzarski Sep 25, 2024
0a2a1ca
errors: TracingProtocolError
muzarski Sep 25, 2024
e904495
errors: reprepared statement's id missing in batch
muzarski Sep 25, 2024
8e4a392
errors: unexpected response protocol error
muzarski Sep 25, 2024
cc7169e
errors: replace QueryError::ProtocolError usage in tests
muzarski Sep 25, 2024
00bca6c
errors: introduce MetadataError
muzarski Sep 25, 2024
37cd965
errors: PeersMetadataError
muzarski Sep 25, 2024
0d9e43f
errors: KeyspacesMetadataError
muzarski Sep 25, 2024
2064774
errors: KeyspaceStrategyError
muzarski Sep 25, 2024
2bc17a2
topology: return error on unexpected NTS option
muzarski Oct 2, 2024
77626d5
errors: UdtMetadataError
muzarski Sep 25, 2024
7059593
errors: TablesMetadataError
muzarski Sep 25, 2024
3e6e348
errors: ViewsMetadataError
muzarski Sep 25, 2024
3514dc2
errors: remove QueryError::InvalidMessage variant
muzarski Sep 25, 2024
e1b3f84
errors: remove QueryError::ProtocolError variant
muzarski Sep 25, 2024
204f911
errors: rename variant ProtocolErrorTyped -> ProtocolError
muzarski Sep 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
errors: UseKeyspaceProtocolError
Added new error type: UseKeyspaceProtocolError and
a corresponding variant to ProtocolError.
muzarski committed Oct 4, 2024
commit 1aae3a2f03e6583c0698f5632c9a44452cbb8285
29 changes: 23 additions & 6 deletions scylla/src/transport/connection.rs
Original file line number Diff line number Diff line change
@@ -46,6 +46,7 @@ use std::{
net::{Ipv4Addr, Ipv6Addr},
};

use super::errors::{ProtocolError, UseKeyspaceProtocolError};
use super::iterator::RowIterator;
use super::locator::tablets::{RawTablet, TabletParsingError};
use super::query_result::SingleRowTypedError;
@@ -1359,24 +1360,40 @@ impl Connection {
};

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

fn verify_use_keyspace_result(
keyspace_name: &VerifiedKeyspaceName,
query_response: QueryResponse,
) -> Result<(), QueryError> {
match query_response.response {
Response::Result(result::Result::SetKeyspace(set_keyspace)) => {
if !set_keyspace
.keyspace_name
.eq_ignore_ascii_case(keyspace_name.as_str())
{
return Err(QueryError::ProtocolError(
"USE <keyspace_name> returned response with different keyspace name",
));
let expected_keyspace_name_lowercase = keyspace_name.as_str().to_lowercase();
let result_keyspace_name_lowercase = set_keyspace.keyspace_name.to_lowercase();

return Err(ProtocolError::UseKeyspace(
UseKeyspaceProtocolError::KeyspaceNameMismatch {
expected_keyspace_name_lowercase,
result_keyspace_name_lowercase,
},
)
.into());
}

Ok(())
}
Response::Error(err) => Err(err.into()),
_ => Err(QueryError::ProtocolError(
"USE <keyspace_name> returned unexpected response",
)),
_ => Err(
ProtocolError::UseKeyspace(UseKeyspaceProtocolError::UnexpectedResponse(
query_response.response.to_response_kind(),
))
.into(),
),
}
}

19 changes: 18 additions & 1 deletion scylla/src/transport/errors.rs
Original file line number Diff line number Diff line change
@@ -242,7 +242,24 @@ pub enum NewSessionError {
/// of internal driver API - a driver bug.
#[derive(Error, Debug, Clone)]
#[non_exhaustive]
pub enum ProtocolError {}
pub enum ProtocolError {
/// USE KEYSPACE protocol error.
#[error("USE KEYSPACE protocol error: {0}")]
UseKeyspace(#[from] UseKeyspaceProtocolError),
}

/// A protocol error that occurred during `USE KEYSPACE <>` request.
#[derive(Error, Debug, Clone)]
#[non_exhaustive]
pub enum UseKeyspaceProtocolError {
#[error("Keyspace name mismtach; expected: {expected_keyspace_name_lowercase}, received: {result_keyspace_name_lowercase}")]
KeyspaceNameMismatch {
expected_keyspace_name_lowercase: String,
result_keyspace_name_lowercase: String,
},
#[error("Received unexpected response: {0}. Expected RESULT:Set_keyspace")]
UnexpectedResponse(CqlResponseKind),
}

/// Error caused by caller creating an invalid query
#[derive(Error, Debug, Clone)]