[Refactor-step1] Add OLAPInternalError to status (#8900)

This commit is contained in:
yiguolei
2022-04-10 00:16:43 +08:00
committed by GitHub
parent 71aedb994e
commit 1fe4ea4c7c
4 changed files with 52 additions and 10 deletions

View File

@ -49,6 +49,10 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set (COMPILER_CLANG 1)
endif ()
# Set boost/stacktrace use backtrace api to unwind
add_definitions(-DBOOST_STACKTRACE_USE_BACKTRACE)
add_definitions(-DPRINT_ALL_ERR_STATUS_STACKTRACE)
option(GLIBC_COMPATIBILITY "Enable compatibility with older glibc libraries." ON)
message(STATUS "GLIBC_COMPATIBILITY is ${GLIBC_COMPATIBILITY}")

View File

@ -31,7 +31,6 @@
//
// Implementation of InstallFailureSignalHandler().
#define BOOST_STACKTRACE_USE_BACKTRACE
#include <boost/stacktrace.hpp>
#include <glog/logging.h>
#include <gutil/macros.h>

View File

@ -10,26 +10,32 @@ namespace doris {
Status::Status(const TStatus& s) {
if (s.status_code != TStatusCode::OK) {
// It is ok to set precise code == 1 here, because we do not know the precise code
// just from thrift's TStatus
if (s.error_msgs.empty()) {
assemble_state(s.status_code, Slice(), 1, Slice());
} else {
assemble_state(s.status_code, s.error_msgs[0], 1, Slice());
}
} else {
set_ok();
_length = 0;
}
}
// TODO yiguolei, maybe should init PStatus's precise code because OLAPInternal Error may
// tranfer precise code during BRPC
Status::Status(const PStatus& s) {
TStatusCode::type code = (TStatusCode::type)s.status_code();
if (code != TStatusCode::OK) {
// It is ok to set precise code == 1 here, because we do not know the precise code
// just from thrift's TStatus
if (s.error_msgs_size() == 0) {
assemble_state(code, Slice(), 1, Slice());
} else {
assemble_state(code, s.error_msgs(0), 1, Slice());
}
} else {
set_ok();
_length = 0;
}
}
@ -152,7 +158,7 @@ Slice Status::message() const {
return Slice();
}
return Slice(_state + HEADER_LEN, _length);
return Slice(_state + HEADER_LEN, _length - HEADER_LEN);
}
Status Status::clone_and_prepend(const Slice& msg) const {
@ -169,4 +175,4 @@ Status Status::clone_and_append(const Slice& msg) const {
return Status(code(), message(), precise_code(), msg);
}
} // namespace doris
} // namespace doris

View File

@ -4,9 +4,13 @@
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <boost/stacktrace.hpp>
#include <glog/logging.h>
#include "common/compiler_util.h"
#include "common/logging.h"
#include "gen_cpp/Status_types.h" // for TStatus
@ -38,7 +42,7 @@ public:
// same as copy c'tor
Status& operator=(const Status& rhs) {
if (rhs._length) {
memcpy(_state, rhs._state, rhs._length + Status::HEADER_LEN);
memcpy(_state, rhs._state, rhs._length);
} else {
_length = 0;
}
@ -151,8 +155,18 @@ public:
return Status(TStatusCode::DATA_QUALITY_ERROR, msg, precise_code, msg2);
}
// A wrapper for OLAPStatus
// Precise code is for OLAPStatus's enum value
// All Status Error is treated as Internal Error
static Status OLAPInternalError(int16_t precise_code, const Slice& msg = Slice()) {
#ifdef PRINT_ALL_ERR_STATUS_STACKTRACE
LOG(WARNING) << "Error occurred, error code = " << precise_code << ", with message: " << msg
<< "\n" << boost::stacktrace::stacktrace();
#endif
return Status(TStatusCode::INTERNAL_ERROR, Slice(), precise_code, msg);
}
bool ok() const { return _length == 0; }
void set_ok() { _length = 0; }
bool is_cancelled() const { return code() == TStatusCode::CANCELLED; }
bool is_mem_limit_exceeded() const { return code() == TStatusCode::MEM_LIMIT_EXCEEDED; }
@ -240,8 +254,17 @@ public:
/// trailing message.
Status clone_and_append(const Slice& msg) const;
// if(!status) or if (status) will use this operator
operator bool() const { return this->ok(); }
// Used like if (res == Status::OK())
// if the state is ok, then both code and precise code is not initialized properly, so that should check ok state
// ignore error messages during comparison
bool operator == (const Status& st) { return ok() ? st.ok() : code() == st.code() && precise_code() == st.precise_code(); }
// Used like if (res != Status::OK())
bool operator != (const Status& st) { return ok() ? !st.ok() : code() != st.code() || precise_code() != st.precise_code(); }
private:
void assemble_state(TStatusCode::type code, const Slice& msg, int16_t precise_code, const Slice& msg2) {
DCHECK(code != TStatusCode::OK);
@ -262,7 +285,7 @@ private:
size = MESSAGE_LEN;
}
_length = size;
_length = size + HEADER_LEN;
_code = (char)code;
_precise_code = precise_code;
@ -294,7 +317,10 @@ private:
char _state[STATE_CAPACITY];
struct {
int64_t _length : 32; // message length
// Message length == HEADER(7 bytes) + message size
// Sometimes error message is empty, so that we could not use length==0 to indicate
// whether there is error happens
int64_t _length : 32;
int64_t _code : 8;
int64_t _precise_code : 16;
int64_t _message : 8; // save message since here
@ -302,6 +328,13 @@ private:
};
};
// Override the << operator, it is used during LOG(INFO) << "xxxx" << status;
// Add inline here to dedup many includes
inline std::ostream & operator << (std::ostream & ostr, const Status & param)
{
return ostr << param.to_string();
}
// some generally useful macros
#define RETURN_IF_ERROR(stmt) \
do { \
@ -360,4 +393,4 @@ private:
#undef WARN_UNUSED_RESULT
#endif
#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))