Skip to main content

scylla_proxy/
errors.rs

1use std::net::SocketAddr;
2
3use scylla_cql::frame::frame_errors::{
4    FrameBodyExtensionsParseError, FrameHeaderParseError, LowLevelDeserializationError,
5};
6use thiserror::Error;
7
8#[derive(Debug, Error)]
9pub enum ReadFrameError {
10    #[error("Failed to read frame header: {0}")]
11    Header(#[from] FrameHeaderParseError),
12    #[error("Failed to decompress frame: {0}")]
13    Compression(#[from] FrameBodyExtensionsParseError),
14}
15
16#[derive(Debug, Error)]
17pub enum DoorkeeperError {
18    #[error("Listen on {0} failed with {1}")]
19    Listen(SocketAddr, std::io::Error),
20    #[error("Connection attempt from driver to proxy {0} failed with {1}")]
21    DriverConnectionAttempt(SocketAddr, std::io::Error),
22    #[error("Connection to node {0} failed with {1}")]
23    NodeConnectionAttempt(SocketAddr, std::io::Error),
24    #[error("Could not create TCP socket: {0}")]
25    SocketCreate(std::io::Error),
26    #[error("Could not bind socket to ephemeral port: {0}")]
27    SocketBind(std::io::Error),
28    #[error("Shard-aware connection failed, because no more possible ports are left")]
29    NoMorePorts,
30    #[error("Could not send Options frame for obtaining shards number: {0}")]
31    ObtainingShardNumber(std::io::Error),
32    #[error("Could not send read Supported frame for obtaining shards number: {0}")]
33    ObtainingShardNumberFrame(ReadFrameError),
34    #[error("Could not read Supported options: {0}")]
35    ObtainingShardNumberParseOptions(LowLevelDeserializationError),
36    #[error("ShardInfo parameters missing")]
37    ObtainingShardNumberNoShardInfo,
38    #[error("Could not parse shard number: {0}")]
39    ObtainingShardNumberParseShardNumber(std::num::ParseIntError),
40    #[error("0 as number of shards!")]
41    ObtainingShardNumberGotZero,
42}
43
44#[derive(Debug, Error)]
45pub enum WorkerError {
46    #[error("Driver {0} disconnected")]
47    DriverDisconnected(SocketAddr),
48    #[error("Node {0} disconnected")]
49    NodeDisconnected(SocketAddr),
50}
51
52#[derive(Debug, Error)]
53pub enum ProxyError {
54    #[error("Doorkeeper failed: {0}")]
55    Doorkeeper(DoorkeeperError),
56    #[error("Worker failed: {0}")]
57    Worker(WorkerError),
58    #[error("Could not await proxy finish: {0}")]
59    AwaitFinishFailure(String),
60    #[error("All error reporting channels have already been closed")]
61    SanityCheckFailure,
62}
63
64impl From<WorkerError> for ProxyError {
65    fn from(err: WorkerError) -> Self {
66        ProxyError::Worker(err)
67    }
68}
69
70impl From<DoorkeeperError> for ProxyError {
71    fn from(err: DoorkeeperError) -> Self {
72        ProxyError::Doorkeeper(err)
73    }
74}