From 987b6c13137a1b3301d528d1aa8ced922a3590a4 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Sun, 22 Oct 2017 03:29:08 -0400 Subject: [PATCH] msg: add seastar messenger error code framework Signed-off-by: Casey Bodley --- src/CMakeLists.txt | 1 + src/crimson/CMakeLists.txt | 1 + src/crimson/net/CMakeLists.txt | 7 +++ src/crimson/net/Errors.cc | 91 ++++++++++++++++++++++++++++++++++ src/crimson/net/Errors.h | 49 ++++++++++++++++++ src/crimson/net/Fwd.h | 1 + 6 files changed, 150 insertions(+) create mode 100644 src/crimson/CMakeLists.txt create mode 100644 src/crimson/net/CMakeLists.txt create mode 100644 src/crimson/net/Errors.cc create mode 100644 src/crimson/net/Errors.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b372759b775..b15c64be394 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -391,6 +391,7 @@ include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/src/googletest/googletest/includ if(WITH_SEASTAR) set(SEASTAR_ENABLE_TESTS OFF CACHE BOOL "disable seastar testing") add_subdirectory(seastar) + add_subdirectory(crimson) endif() set(xio_common_srcs) diff --git a/src/crimson/CMakeLists.txt b/src/crimson/CMakeLists.txt new file mode 100644 index 00000000000..e5162eff419 --- /dev/null +++ b/src/crimson/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(net) diff --git a/src/crimson/net/CMakeLists.txt b/src/crimson/net/CMakeLists.txt new file mode 100644 index 00000000000..a7f3c7162e7 --- /dev/null +++ b/src/crimson/net/CMakeLists.txt @@ -0,0 +1,7 @@ +set(crimson_net_srcs + Errors.cc) +add_library(crimson_net_objs OBJECT ${crimson_net_srcs}) +target_compile_definitions(crimson_net_objs + PUBLIC $) +target_include_directories(crimson_net_objs + PUBLIC $) diff --git a/src/crimson/net/Errors.cc b/src/crimson/net/Errors.cc new file mode 100644 index 00000000000..1ac6fe8c483 --- /dev/null +++ b/src/crimson/net/Errors.cc @@ -0,0 +1,91 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2017 Red Hat, Inc + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#include "Errors.h" + +namespace ceph::net { + +const std::error_category& net_category() +{ + struct category : public std::error_category { + const char* name() const noexcept override { + return "ceph::net"; + } + + std::string message(int ev) const override { + switch (static_cast(ev)) { + case error::connection_aborted: + return "connection aborted"; + case error::connection_refused: + return "connection refused"; + case error::connection_reset: + return "connection reset"; + default: + return "unknown"; + } + } + + // unfortunately, seastar throws connection errors with the system category, + // rather than the generic category that would match their counterparts + // in std::errc. we add our own errors for them, so we can match either + std::error_condition default_error_condition(int ev) const noexcept override { + switch (static_cast(ev)) { + case error::connection_aborted: + return std::errc::connection_aborted; + case error::connection_refused: + return std::errc::connection_refused; + case error::connection_reset: + return std::errc::connection_reset; + default: + return std::error_condition(ev, *this); + } + } + + bool equivalent(int code, const std::error_condition& cond) const noexcept override { + switch (static_cast(code)) { + case error::connection_aborted: + return cond == std::errc::connection_aborted + || cond == std::error_condition(ECONNABORTED, std::system_category()); + case error::connection_refused: + return cond == std::errc::connection_refused + || cond == std::error_condition(ECONNREFUSED, std::system_category()); + case error::connection_reset: + return cond == std::errc::connection_reset + || cond == std::error_condition(ECONNRESET, std::system_category()); + default: + return false; + } + } + + bool equivalent(const std::error_code& code, int cond) const noexcept override { + switch (static_cast(cond)) { + case error::connection_aborted: + return code == std::errc::connection_aborted + || code == std::error_code(ECONNABORTED, std::system_category()); + case error::connection_refused: + return code == std::errc::connection_refused + || code == std::error_code(ECONNREFUSED, std::system_category()); + case error::connection_reset: + return code == std::errc::connection_reset + || code == std::error_code(ECONNRESET, std::system_category()); + default: + return false; + } + } + }; + static category instance; + return instance; +} + +} // namespace ceph::net diff --git a/src/crimson/net/Errors.h b/src/crimson/net/Errors.h new file mode 100644 index 00000000000..e02e6cdd78d --- /dev/null +++ b/src/crimson/net/Errors.h @@ -0,0 +1,49 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2017 Red Hat, Inc + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#pragma once + +#include + +namespace ceph::net { + +/// net error codes +enum class error { + connection_aborted, + connection_refused, + connection_reset, +}; + +/// net error category +const std::error_category& net_category(); + +inline std::error_code make_error_code(error e) +{ + return {static_cast(e), net_category()}; +} + +inline std::error_condition make_error_condition(error e) +{ + return {static_cast(e), net_category()}; +} + +} // namespace ceph::net + +namespace std { + +/// enables implicit conversion to std::error_condition +template <> +struct is_error_condition_enum : public true_type {}; + +} // namespace std diff --git a/src/crimson/net/Fwd.h b/src/crimson/net/Fwd.h index 44f4c76a381..c928bdebaf0 100644 --- a/src/crimson/net/Fwd.h +++ b/src/crimson/net/Fwd.h @@ -16,6 +16,7 @@ #include +#include "Errors.h" #include "msg/msg_types.h" class Message; -- 2.39.5