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}