blob: 50bcdffeee6f8838a587be561e5f69f67f4ce978 [file] [log] [blame]
//
//
// Copyright 2021 the gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
#ifndef GRPC_CORE_LIB_GPRPP_STATUS_HELPER_H
#define GRPC_CORE_LIB_GPRPP_STATUS_HELPER_H
#include <grpc/support/port_platform.h>
#include "absl/status/status.h"
#include "absl/time/time.h"
#include "src/core/lib/gprpp/debug_location.h"
extern "C" {
struct google_rpc_Status;
struct upb_arena;
}
namespace grpc_core {
/// This enum should have the same value of grpc_error_ints
// TODO(veblush): Use camel-case names once migration to absl::Status is done.
enum class StatusIntProperty {
/// 'errno' from the operating system
kErrorNo,
/// __LINE__ from the call site creating the error
kFileLine,
/// stream identifier: for errors that are associated with an individual
/// wire stream
kStreamId,
/// grpc status code representing this error
// TODO(veblush): Remove this after grpc_error is replaced with absl::Status
kRpcStatus,
/// offset into some binary blob (usually represented by
/// RAW_BYTES) where the error occurred
kOffset,
/// context sensitive index associated with the error
kIndex,
/// context sensitive size associated with the error
kSize,
/// http2 error code associated with the error (see the HTTP2 RFC)
kHttp2Error,
/// TSI status code associated with the error
kTsiCode,
/// WSAGetLastError() reported when this error occurred
kWsaError,
/// File descriptor associated with this error
kFd,
/// HTTP status (i.e. 404)
kHttpStatus,
/// chttp2: did the error occur while a write was in progress
kOccurredDuringWrite,
/// channel connectivity state associated with the error
ChannelConnectivityState,
/// LB policy drop
kLbPolicyDrop,
};
/// This enum should have the same value of grpc_error_strs
// TODO(veblush): Use camel-case names once migration to absl::Status is done.
enum class StatusStrProperty {
/// top-level textual description of this error
kDescription,
/// source file in which this error occurred
kFile,
/// operating system description of this error
kOsError,
/// syscall that generated this error
kSyscall,
/// peer that we were trying to communicate when this error occurred
kTargetAddress,
/// grpc status message associated with this error
kGrpcMessage,
/// hex dump (or similar) with the data that generated this error
kRawBytes,
/// tsi error string associated with this error
kTsiError,
/// filename that we were trying to read/write when this error occurred
kFilename,
/// key associated with the error
kKey,
/// value associated with the error
kValue,
};
/// This enum should have the same value of grpc_error_times
enum class StatusTimeProperty {
/// timestamp of error creation
kCreated,
};
/// Creates a status with given additional information
absl::Status StatusCreate(
absl::StatusCode code, absl::string_view msg, const DebugLocation& location,
std::initializer_list<absl::Status> children) GRPC_MUST_USE_RESULT;
/// Sets the int property to the status
void StatusSetInt(absl::Status* status, StatusIntProperty key, intptr_t value);
/// Gets the int property from the status
absl::optional<intptr_t> StatusGetInt(
const absl::Status& status, StatusIntProperty key) GRPC_MUST_USE_RESULT;
/// Sets the str property to the status
void StatusSetStr(absl::Status* status, StatusStrProperty key,
absl::string_view value);
/// Gets the str property from the status
absl::optional<std::string> StatusGetStr(
const absl::Status& status, StatusStrProperty key) GRPC_MUST_USE_RESULT;
/// Sets the time property to the status
void StatusSetTime(absl::Status* status, StatusTimeProperty key,
absl::Time time);
/// Gets the time property from the status
absl::optional<absl::Time> StatusGetTime(
const absl::Status& status, StatusTimeProperty key) GRPC_MUST_USE_RESULT;
/// Adds a child status to status
void StatusAddChild(absl::Status* status, absl::Status child);
/// Returns all children status from a status
std::vector<absl::Status> StatusGetChildren(absl::Status status)
GRPC_MUST_USE_RESULT;
/// Returns a string representation from status
/// Error status will be like
/// STATUS[:MESSAGE] [{PAYLOADS[, children:[CHILDREN-STATUS-LISTS]]}]
/// e.g.
/// CANCELLATION:SampleMessage {errno:'2021', line:'54', children:[ABORTED]}
std::string StatusToString(const absl::Status& status) GRPC_MUST_USE_RESULT;
namespace internal {
/// Builds a upb message, google_rpc_Status from a status
/// This is for internal implementation & test only
google_rpc_Status* StatusToProto(absl::Status status,
upb_arena* arena) GRPC_MUST_USE_RESULT;
/// Builds a status from a upb message, google_rpc_Status
/// This is for internal implementation & test only
absl::Status StatusFromProto(google_rpc_Status* msg) GRPC_MUST_USE_RESULT;
/// The same value of grpc_core::internal::StatusAllocPtr(absl::OkStatus())
static constexpr uintptr_t kOkStatusPtr = 0;
/// Returns ptr where the given status is copied into.
/// This ptr can be used to get Status later and should be freed by
/// StatusFreePtr. This shouldn't be used except migration purpose.
uintptr_t StatusAllocPtr(absl::Status s);
/// Frees the allocated status at ptr.
/// This shouldn't be used except migration purpose.
void StatusFreePtr(uintptr_t ptr);
/// Get the status from ptr.
/// This shouldn't be used except migration purpose.
absl::Status StatusGetFromPtr(uintptr_t ptr);
} // namespace internal
} // namespace grpc_core
#endif // GRPC_CORE_LIB_GPRPP_STATUS_HELPER_H