13 #ifndef KUDU_UTIL_STATUS_H_
14 #define KUDU_UTIL_STATUS_H_
25 #ifdef KUDU_HEADERS_USE_SHORT_STATUS_MACROS
26 #include <glog/logging.h>
29 #ifdef KUDU_HEADERS_NO_STUBS
30 #include "kudu/gutil/macros.h"
31 #include "kudu/gutil/port.h"
33 #include "kudu/client/stubs.h"
36 #include "kudu/util/kudu_export.h"
37 #include "kudu/util/slice.h"
40 #define KUDU_RETURN_NOT_OK(s) do { \
41 const ::kudu::Status& _s = (s); \
42 if (PREDICT_FALSE(!_s.ok())) return _s; \
47 #define KUDU_RETURN_NOT_OK_PREPEND(s, msg) do { \
48 const ::kudu::Status& _s = (s); \
49 if (PREDICT_FALSE(!_s.ok())) return _s.CloneAndPrepend(msg); \
55 #define KUDU_RETURN_NOT_OK_RET(to_call, to_return) do { \
56 const ::kudu::Status& s = (to_call); \
57 if (PREDICT_FALSE(!s.ok())) return (to_return); \
61 #define KUDU_RETURN_NOT_OK_EVAL(s, on_error) do { \
62 const ::kudu::Status& _s = (s); \
63 if (PREDICT_FALSE(!_s.ok())) { \
70 #define KUDU_WARN_NOT_OK(to_call, warning_prefix) do { \
71 const ::kudu::Status& _s = (to_call); \
72 if (PREDICT_FALSE(!_s.ok())) { \
73 KUDU_LOG(WARNING) << (warning_prefix) << ": " << _s.ToString(); \
78 #define KUDU_LOG_AND_RETURN(level, status) do { \
79 const ::kudu::Status& _s = (status); \
80 KUDU_LOG(level) << _s.ToString(); \
85 #define KUDU_RETURN_NOT_OK_LOG(s, level, msg) do { \
86 const ::kudu::Status& _s = (s); \
87 if (PREDICT_FALSE(!_s.ok())) { \
88 KUDU_LOG(level) << "Status: " << _s.ToString() << " " << (msg); \
95 #define KUDU_CHECK_OK_PREPEND(to_call, msg) do { \
96 const ::kudu::Status& _s = (to_call); \
97 KUDU_CHECK(_s.ok()) << (msg) << ": " << _s.ToString(); \
102 #define KUDU_CHECK_OK(s) KUDU_CHECK_OK_PREPEND(s, "Bad status")
106 #define KUDU_DCHECK_OK_PREPEND(to_call, msg) do { \
107 const ::kudu::Status& _s = (to_call); \
108 KUDU_DCHECK(_s.ok()) << (msg) << ": " << _s.ToString(); \
113 #define KUDU_DCHECK_OK(s) KUDU_DCHECK_OK_PREPEND(s, "Bad status")
119 #define KUDU_RETURN_MAIN_NOT_OK(to_call, msg, ret_code) do { \
120 DCHECK_NE(0, (ret_code)) << "non-OK return code should not be 0"; \
121 const ::kudu::Status& _s = (to_call); \
123 const ::kudu::Status& _ss = _s.CloneAndPrepend((msg)); \
124 LOG(ERROR) << _ss.ToString(); \
130 #if __cplusplus >= 201703L
138 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 13)
139 #define KUDU_ATTR_NODISCARD [[nodiscard]]
141 #define KUDU_ATTR_NODISCARD
144 #define KUDU_ATTR_NODISCARD
160 #ifdef KUDU_HEADERS_USE_SHORT_STATUS_MACROS
161 #define RETURN_NOT_OK KUDU_RETURN_NOT_OK
162 #define RETURN_NOT_OK_PREPEND KUDU_RETURN_NOT_OK_PREPEND
163 #define RETURN_NOT_OK_RET KUDU_RETURN_NOT_OK_RET
164 #define RETURN_NOT_OK_EVAL KUDU_RETURN_NOT_OK_EVAL
165 #define WARN_NOT_OK KUDU_WARN_NOT_OK
166 #define LOG_AND_RETURN KUDU_LOG_AND_RETURN
167 #define RETURN_NOT_OK_LOG KUDU_RETURN_NOT_OK_LOG
168 #define CHECK_OK_PREPEND KUDU_CHECK_OK_PREPEND
169 #define CHECK_OK KUDU_CHECK_OK
170 #define DCHECK_OK_PREPEND KUDU_DCHECK_OK_PREPEND
171 #define DCHECK_OK KUDU_DCHECK_OK
172 #define RETURN_MAIN_NOT_OK KUDU_RETURN_MAIN_NOT_OK
176 #define KUDU_CHECK CHECK
177 #define KUDU_DCHECK DCHECK
183 class KUDU_EXPORT KUDU_ATTR_NODISCARD
Status {
188 ~
Status() {
delete[] state_; }
194 Status(
const Status& s);
201 Status& operator=(
const Status& s);
203 #if __cplusplus >= 201103L
208 Status(Status&& s) noexcept;
215 Status& operator=(Status&& s) noexcept;
239 Status AndThen(F op) {
261 int16_t posix_code = -1) {
262 return Status(kNotFound, msg, msg2, posix_code);
265 int16_t posix_code = -1) {
266 return Status(kCorruption, msg, msg2, posix_code);
269 int16_t posix_code = -1) {
270 return Status(kNotSupported, msg, msg2, posix_code);
273 int16_t posix_code = -1) {
274 return Status(kInvalidArgument, msg, msg2, posix_code);
277 int16_t posix_code = -1) {
278 return Status(kIOError, msg, msg2, posix_code);
281 int16_t posix_code = -1) {
282 return Status(kAlreadyPresent, msg, msg2, posix_code);
285 int16_t posix_code = -1) {
286 return Status(kRuntimeError, msg, msg2, posix_code);
289 int16_t posix_code = -1) {
290 return Status(kNetworkError, msg, msg2, posix_code);
293 int16_t posix_code = -1) {
294 return Status(kIllegalState, msg, msg2, posix_code);
297 int16_t posix_code = -1) {
298 return Status(kNotAuthorized, msg, msg2, posix_code);
301 int16_t posix_code = -1) {
302 return Status(kAborted, msg, msg2, posix_code);
305 int16_t posix_code = -1) {
306 return Status(kRemoteError, msg, msg2, posix_code);
309 int16_t posix_code = -1) {
310 return Status(kServiceUnavailable, msg, msg2, posix_code);
313 int16_t posix_code = -1) {
314 return Status(kTimedOut, msg, msg2, posix_code);
317 int16_t posix_code = -1) {
318 return Status(kUninitialized, msg, msg2, posix_code);
321 int16_t posix_code = -1) {
322 return Status(kConfigurationError, msg, msg2, posix_code);
325 int64_t posix_code = -1) {
326 return Status(kIncomplete, msg, msg2, posix_code);
329 int64_t posix_code = -1) {
330 return Status(kEndOfFile, msg, msg2, posix_code);
333 int64_t posix_code = -1) {
334 return Status(kImmutable, msg, msg2, posix_code);
339 bool ok()
const {
return (state_ == NULL); }
400 switch (posix_code()) {
474 kInvalidArgument = 4,
483 kServiceUnavailable = 13,
486 kConfigurationError = 16,
498 COMPILE_ASSERT(
sizeof(Code) == 4, code_enum_size_is_part_of_abi);
501 return (state_ == NULL) ? kOk :
static_cast<Code
>(state_[4]);
504 Status(Code code,
const Slice& msg,
const Slice& msg2, int16_t posix_code);
505 static const char* CopyState(
const char* s);
509 state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
515 if (state_ != s.state_) {
517 state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
522 #if __cplusplus >= 201103L
528 if (state_ != s.state_) {
A wrapper around externally allocated data.
Definition: slice.h:51
A representation of an operation's outcome.
Definition: status.h:183
bool IsInvalidArgument() const
Definition: status.h:354
static Status TimedOut(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:312
bool IsRemoteError() const
Definition: status.h:375
size_t memory_footprint_including_this() const
bool IsEndOfFile() const
Definition: status.h:393
static Status Immutable(const Slice &msg, const Slice &msg2=Slice(), int64_t posix_code=-1)
Definition: status.h:332
bool IsTimedOut() const
Definition: status.h:381
bool IsUninitialized() const
Definition: status.h:384
static Status RuntimeError(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:284
static Status IOError(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:276
int16_t posix_code() const
bool IsAlreadyPresent() const
Definition: status.h:357
bool IsCorruption() const
Definition: status.h:345
size_t memory_footprint_excluding_this() const
static Status ServiceUnavailable(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:308
static Status Corruption(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:264
bool IsIOError() const
Definition: status.h:351
static Status IllegalState(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:292
bool IsAborted() const
Definition: status.h:372
static Status Aborted(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:300
std::string CodeAsString() const
static Status NotSupported(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:268
Status CloneAndAppend(const Slice &msg) const
bool IsNotFound() const
Definition: status.h:342
bool IsServiceUnavailable() const
Definition: status.h:378
bool IsConfigurationError() const
Definition: status.h:387
static Status AlreadyPresent(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:280
Status & operator=(const Status &s)
Definition: status.h:512
bool IsDiskFailure() const
Definition: status.h:399
static Status NotFound(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:260
bool IsNotSupported() const
Definition: status.h:348
static Status InvalidArgument(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:272
static Status Incomplete(const Slice &msg, const Slice &msg2=Slice(), int64_t posix_code=-1)
Definition: status.h:324
Status CloneAndPrepend(const Slice &msg) const
static Status NetworkError(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:288
static Status Uninitialized(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:316
bool IsIncomplete() const
Definition: status.h:390
bool IsNotAuthorized() const
Definition: status.h:369
static Status NotAuthorized(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:296
Status()
Create an object representing success status.
Definition: status.h:186
bool IsIllegalState() const
Definition: status.h:366
bool IsNetworkError() const
Definition: status.h:363
bool IsImmutable() const
Definition: status.h:396
static Status OK()
Definition: status.h:248
bool ok() const
Definition: status.h:339
bool IsRuntimeError() const
Definition: status.h:360
std::string ToString() const
static Status EndOfFile(const Slice &msg, const Slice &msg2=Slice(), int64_t posix_code=-1)
Definition: status.h:328
static Status ConfigurationError(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:320
static Status RemoteError(const Slice &msg, const Slice &msg2=Slice(), int16_t posix_code=-1)
Definition: status.h:304