/root/doris/be/src/common/status.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2011 The LevelDB Authors. All rights reserved. |
2 | | // Use of this source code is governed by a BSD-style license that can be |
3 | | // found in the LICENSE file. See the AUTHORS file for names of contributors. |
4 | | |
5 | | #include "common/status.h" |
6 | | |
7 | | #include <gen_cpp/Status_types.h> |
8 | | #include <gen_cpp/types.pb.h> // for PStatus |
9 | | #include <rapidjson/encodings.h> |
10 | | #include <rapidjson/prettywriter.h> |
11 | | #include <rapidjson/stringbuffer.h> |
12 | | |
13 | | #include <algorithm> |
14 | | #include <new> |
15 | | #include <vector> |
16 | | |
17 | | #include "service/backend_options.h" |
18 | | |
19 | | namespace doris { |
20 | | namespace ErrorCode { |
21 | | |
22 | | ErrorCodeState error_states[MAX_ERROR_CODE_DEFINE_NUM]; |
23 | | ErrorCodeInitializer error_code_init(10); |
24 | | } // namespace ErrorCode |
25 | | |
26 | 0 | void Status::to_thrift(TStatus* s) const { |
27 | 0 | s->error_msgs.clear(); |
28 | 0 | if (ok()) { |
29 | 0 | s->status_code = TStatusCode::OK; |
30 | 0 | return; |
31 | 0 | } |
32 | | // Currently, there are many error codes, not defined in thrift and need pass to FE. |
33 | | // DCHECK(_code > 0) |
34 | | // << "The error code has to > 0 because TStatusCode need it > 0, it's actual value is " |
35 | | // << _code; |
36 | 0 | s->status_code = (int16_t)_code > 0 ? (TStatusCode::type)_code : TStatusCode::INTERNAL_ERROR; |
37 | |
|
38 | 0 | if (_code == ErrorCode::VERSION_ALREADY_MERGED) { |
39 | 0 | s->status_code = TStatusCode::OLAP_ERR_VERSION_ALREADY_MERGED; |
40 | 0 | } else if (_code == ErrorCode::TABLE_NOT_FOUND) { |
41 | 0 | s->status_code = TStatusCode::TABLET_MISSING; |
42 | 0 | } |
43 | |
|
44 | 0 | s->error_msgs.push_back(fmt::format("({})[{}]{}", BackendOptions::get_localhost(), |
45 | 0 | code_as_string(), _err_msg ? _err_msg->_msg : "")); |
46 | 0 | s->__isset.error_msgs = true; |
47 | 0 | } |
48 | | |
49 | 0 | TStatus Status::to_thrift() const { |
50 | 0 | TStatus s; |
51 | 0 | to_thrift(&s); |
52 | 0 | return s; |
53 | 0 | } |
54 | | |
55 | 66 | void Status::to_protobuf(PStatus* s) const { |
56 | 66 | s->clear_error_msgs(); |
57 | 66 | s->set_status_code((int)_code); |
58 | 66 | if (!ok()) { |
59 | 32 | s->add_error_msgs(fmt::format("({})[{}]{}", BackendOptions::get_localhost(), |
60 | 32 | code_as_string(), _err_msg ? _err_msg->_msg : "")); |
61 | 32 | } |
62 | 66 | } |
63 | | |
64 | 1 | Status& Status::prepend(std::string_view msg) { |
65 | 1 | if (!ok()) { |
66 | 1 | if (_err_msg == nullptr) { |
67 | 0 | _err_msg = std::make_unique<ErrMsg>(); |
68 | 0 | } |
69 | 1 | _err_msg->_msg = std::string(msg) + _err_msg->_msg; |
70 | 1 | } |
71 | 1 | return *this; |
72 | 1 | } |
73 | | |
74 | 0 | Status& Status::append(std::string_view msg) { |
75 | 0 | if (!ok()) { |
76 | 0 | if (_err_msg == nullptr) { |
77 | 0 | _err_msg = std::make_unique<ErrMsg>(); |
78 | 0 | } |
79 | 0 | _err_msg->_msg.append(msg); |
80 | 0 | } |
81 | 0 | return *this; |
82 | 0 | } |
83 | | |
84 | 112 | std::string Status::to_json() const { |
85 | 112 | rapidjson::StringBuffer s; |
86 | 112 | rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(s); |
87 | 112 | writer.StartObject(); |
88 | | // status |
89 | 112 | writer.Key("status"); |
90 | 112 | writer.String(code_as_string().c_str()); |
91 | | // msg |
92 | 112 | writer.Key("msg"); |
93 | 112 | ok() ? writer.String("OK") : writer.String(_err_msg ? _err_msg->_msg.c_str() : ""); |
94 | 112 | writer.EndObject(); |
95 | 112 | return s.GetString(); |
96 | 112 | } |
97 | | |
98 | | } // namespace doris |