forked from tikv/client-rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patherrors.rs
More file actions
165 lines (155 loc) · 6.34 KB
/
errors.rs
File metadata and controls
165 lines (155 loc) · 6.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// Copyright 2018 TiKV Project Authors. Licensed under Apache-2.0.
use std::result;
use thiserror::Error;
use crate::proto::kvrpcpb;
use crate::region::RegionVerId;
use crate::BoundRange;
/// Protobuf-generated region-level error returned by TiKV.
///
/// This type is generated from TiKV's protobuf definitions and may change in a
/// future release even if the wire format is compatible.
#[doc(inline)]
pub use crate::proto::errorpb::Error as ProtoRegionError;
/// Protobuf-generated per-key error returned by TiKV.
///
/// This type is generated from TiKV's protobuf definitions and may change in a
/// future release even if the wire format is compatible.
#[doc(inline)]
pub use crate::proto::kvrpcpb::KeyError as ProtoKeyError;
/// An error originating from the TiKV client or dependencies.
#[derive(Debug, Error)]
#[allow(clippy::large_enum_variant)]
pub enum Error {
/// Feature is not implemented.
#[error("Unimplemented feature")]
Unimplemented,
/// Duplicate key insertion happens.
#[error("Duplicate key insertion")]
DuplicateKeyInsertion,
/// Failed to resolve a lock
#[error("Failed to resolve lock")]
ResolveLockError(Vec<kvrpcpb::LockInfo>),
/// Will raise this error when using a pessimistic txn only operation on an optimistic txn
#[error("Invalid operation for this type of transaction")]
InvalidTransactionType,
/// It's not allowed to perform operations in a transaction after it has been committed or rolled back.
#[error("Cannot read or write data after any attempt to commit or roll back the transaction")]
OperationAfterCommitError,
/// We tried to use 1pc for a transaction, but it didn't work. Probably should have used 2pc.
#[error("1PC transaction could not be committed.")]
OnePcFailure,
/// An operation requires a primary key, but the transaction was empty.
#[error("transaction has no primary key")]
NoPrimaryKey,
/// For raw client, operation is not supported in atomic/non-atomic mode.
#[error(
"The operation is not supported in current mode, please consider using RawClient with or without atomic mode"
)]
UnsupportedMode,
#[error("There is no current_regions in the EpochNotMatch error")]
NoCurrentRegions,
#[error("The specified entry is not found in the region cache")]
EntryNotFoundInRegionCache,
/// Wraps a `std::io::Error`.
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
/// Wraps a `std::io::Error`.
#[error("tokio channel error: {0}")]
Channel(#[from] tokio::sync::oneshot::error::RecvError),
/// Wraps a `grpcio::Error`.
#[error("gRPC error: {0}")]
Grpc(#[from] tonic::transport::Error),
/// Wraps a `reqwest::Error`.
/// Wraps a `grpcio::Error`.
#[error("gRPC api error: {0}")]
GrpcAPI(#[from] tonic::Status),
/// Wraps a `grpcio::Error`.
#[error("url error: {0}")]
Url(#[from] tonic::codegen::http::uri::InvalidUri),
/// Represents that a futures oneshot channel was cancelled.
#[error("A futures oneshot channel was canceled. {0}")]
Canceled(#[from] futures::channel::oneshot::Canceled),
/// Errors caused by changes of region information
#[error("Region error: {0:?}")]
RegionError(Box<ProtoRegionError>),
/// Whether the transaction is committed or not is undetermined
#[error("Whether the transaction is committed or not is undetermined")]
UndeterminedError(Box<Error>),
/// Wraps a per-key error returned by TiKV.
#[error("{0:?}")]
KeyError(Box<ProtoKeyError>),
/// Multiple errors generated from the ExtractError plan.
#[error("Multiple errors: {0:?}")]
ExtractedErrors(Vec<Error>),
/// Multiple key errors
#[error("Multiple key errors: {0:?}")]
MultipleKeyErrors(Vec<Error>),
/// Invalid ColumnFamily
#[error("Unsupported column family {}", _0)]
ColumnFamilyError(String),
/// Can't join tokio tasks
#[error("Failed to join tokio tasks")]
JoinError(#[from] tokio::task::JoinError),
/// No region is found for the given key.
#[error("Region is not found for key: {:?}", key)]
RegionForKeyNotFound { key: Vec<u8> },
#[error("Region is not found for range: {:?}", range)]
RegionForRangeNotFound { range: BoundRange },
/// No region is found for the given id. note: distinguish it with the RegionNotFound error in errorpb.
#[error("Region {} is not found in the response", region_id)]
RegionNotFoundInResponse { region_id: u64 },
/// No leader is found for the given id.
#[error("Leader of region {} is not found", region.id)]
LeaderNotFound { region: RegionVerId },
/// Scan limit exceeds the maximum
#[error("Limit {} exceeds max scan limit {}", limit, max_limit)]
MaxScanLimitExceeded { limit: u32, max_limit: u32 },
#[error("Invalid Semver string: {0:?}")]
InvalidSemver(#[from] semver::Error),
/// A string error returned by TiKV server
#[error("Kv error. {}", message)]
KvError { message: String },
#[error("{}", message)]
InternalError { message: String },
#[error("{0}")]
StringError(String),
#[error("PessimisticLock error: {:?}", inner)]
PessimisticLockError {
inner: Box<Error>,
success_keys: Vec<Vec<u8>>,
},
#[error("Keyspace not found: {0}")]
KeyspaceNotFound(String),
#[error("Transaction not found error: {:?}", _0)]
TxnNotFound(kvrpcpb::TxnNotFound),
/// Attempted to create or use the sync client (including calling its methods) from within a Tokio async runtime context
#[error(
"Nested Tokio runtime detected: cannot use SyncTransactionClient from within an async context. \
Use the async TransactionClient instead, or create and use SyncTransactionClient outside of any Tokio runtime.{0}"
)]
NestedRuntimeError(String),
}
impl From<ProtoRegionError> for Error {
fn from(e: ProtoRegionError) -> Error {
Error::RegionError(Box::new(e))
}
}
impl From<ProtoKeyError> for Error {
fn from(e: ProtoKeyError) -> Error {
Error::KeyError(Box::new(e))
}
}
/// A result holding an [`Error`](enum@Error).
pub type Result<T> = result::Result<T, Error>;
#[doc(hidden)]
#[macro_export]
macro_rules! internal_err {
($e:expr) => ({
$crate::Error::InternalError {
message: format!("[{}:{}]: {}", file!(), line!(), $e)
}
});
($f:tt, $($arg:expr),+) => ({
internal_err!(format!($f, $($arg),+))
});
}