[enhancement](status) Fix Status related macros to enable RVO or move ctor (#11753)

This commit is contained in:
plat1ko
2022-08-16 14:40:35 +08:00
committed by GitHub
parent 3e10be4ba7
commit fecfdd78bf
2 changed files with 23 additions and 28 deletions

View File

@ -39,33 +39,28 @@ public:
Initializer init; // Used to init the error_states array
Status::Status(const TStatus& s) {
if (s.status_code != TStatusCode::OK) {
_code = 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
_code = s.status_code;
_precise_code = 1;
if (!s.error_msgs.empty()) {
_err_msg = s.error_msgs[0];
}
} else {
_code = 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) {
_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
_code = code;
_precise_code = 1;
if (s.error_msgs_size() > 0) {
_err_msg = s.error_msgs(0);
}
} else {
_code = 0;
}
}
@ -113,7 +108,7 @@ void Status::to_protobuf(PStatus* s) const {
}
}
std::string Status::code_as_string() const {
const char* Status::code_as_string() const {
switch (code()) {
case TStatusCode::OK:
return "OK";
@ -172,10 +167,10 @@ std::string Status::code_as_string() const {
case TStatusCode::DATA_QUALITY_ERROR:
return "Data quality error";
default: {
return fmt::format("Unknown code({})", code());
return "Unknown code";
}
}
return std::string();
return "Unknown code";
}
std::string Status::to_string() const {
@ -212,7 +207,7 @@ std::string Status::to_json() const {
writer.StartObject();
// status
writer.Key("status");
writer.String(code_as_string().c_str());
writer.String(code_as_string());
// msg
writer.Key("msg");
if (ok()) {

View File

@ -241,7 +241,7 @@ enum ErrorCode {
class Status {
public:
Status() : _code(0) {}
Status() : _code(TStatusCode::OK), _precise_code(0) {}
// copy c'tor makes copy of error detail so Status can be returned by value
Status(const Status& rhs) = default;
@ -393,7 +393,7 @@ public:
static Status ConstructErrorStatus(int16_t precise_code);
bool ok() const { return _code == 0; }
bool ok() const { return _code == TStatusCode::OK; }
bool is_cancelled() const { return code() == TStatusCode::CANCELLED; }
bool is_mem_limit_exceeded() const { return code() == TStatusCode::MEM_LIMIT_EXCEEDED; }
@ -448,7 +448,7 @@ public:
/// @return A string representation of the status code, without the message
/// text or sub code information.
std::string code_as_string() const;
const char* code_as_string() const;
TStatusCode::type code() const {
return ok() ? TStatusCode::OK : static_cast<TStatusCode::type>(_code);
@ -490,7 +490,7 @@ public:
}
private:
int8_t _code;
TStatusCode::type _code;
int16_t _precise_code;
std::string _err_msg;
};
@ -502,18 +502,18 @@ inline std::ostream& operator<<(std::ostream& ostr, const Status& param) {
}
// some generally useful macros
#define RETURN_IF_ERROR(stmt) \
do { \
const Status& _status_ = (stmt); \
if (UNLIKELY(!_status_.ok())) { \
return _status_; \
} \
#define RETURN_IF_ERROR(stmt) \
do { \
Status _status_ = (stmt); \
if (UNLIKELY(!_status_.ok())) { \
return _status_; \
} \
} while (false)
// End _get_next_span after last call to get_next method
#define RETURN_IF_ERROR_AND_CHECK_SPAN(stmt, get_next_span, done) \
do { \
const auto& _status_ = (stmt); \
Status _status_ = (stmt); \
auto _span = (get_next_span); \
if (UNLIKELY(_span && (!_status_.ok() || done))) { \
_span->End(); \
@ -533,7 +533,7 @@ inline std::ostream& operator<<(std::ostream& ostr, const Status& param) {
#define EXIT_IF_ERROR(stmt) \
do { \
const Status& _status_ = (stmt); \
Status _status_ = (stmt); \
if (UNLIKELY(!_status_.ok())) { \
LOG(ERROR) << _status_.get_error_msg(); \
exit(1); \
@ -543,7 +543,7 @@ inline std::ostream& operator<<(std::ostream& ostr, const Status& param) {
/// @brief Emit a warning if @c to_call returns a bad status.
#define WARN_IF_ERROR(to_call, warning_prefix) \
do { \
const Status& _s = (to_call); \
Status _s = (to_call); \
if (UNLIKELY(!_s.ok())) { \
LOG(WARNING) << (warning_prefix) << ": " << _s.to_string(); \
} \
@ -551,7 +551,7 @@ inline std::ostream& operator<<(std::ostream& ostr, const Status& param) {
#define RETURN_WITH_WARN_IF_ERROR(stmt, ret_code, warning_prefix) \
do { \
const Status& _s = (stmt); \
Status _s = (stmt); \
if (UNLIKELY(!_s.ok())) { \
LOG(WARNING) << (warning_prefix) << ", error: " << _s.to_string(); \
return ret_code; \
@ -560,7 +560,7 @@ inline std::ostream& operator<<(std::ostream& ostr, const Status& param) {
#define RETURN_NOT_OK_STATUS_WITH_WARN(stmt, warning_prefix) \
do { \
const Status& _s = (stmt); \
Status _s = (stmt); \
if (UNLIKELY(!_s.ok())) { \
LOG(WARNING) << (warning_prefix) << ", error: " << _s.to_string(); \
return _s; \