]> git.proxmox.com Git - ceph.git/blob - ceph/src/osdc/error_code.cc
import quincy beta 17.1.0
[ceph.git] / ceph / src / osdc / error_code.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2019 Red Hat <contact@redhat.com>
7 * Author: Adam C. Emerson <aemerson@redhat.com>
8 *
9 * This is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License version 2.1, as published by the Free Software
12 * Foundation. See file COPYING.
13 *
14 */
15
16 #include <string>
17
18 #include "common/error_code.h"
19 #include "error_code.h"
20
21 namespace bs = boost::system;
22
23 #pragma GCC diagnostic push
24 #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
25 #pragma clang diagnostic push
26 #pragma clang diagnostic ignored "-Wnon-virtual-dtor"
27 class osdc_error_category : public ceph::converting_category {
28 public:
29 osdc_error_category(){}
30 const char* name() const noexcept override;
31 const char* message(int ev, char*, std::size_t) const noexcept override;
32 std::string message(int ev) const override;
33 bs::error_condition default_error_condition(int ev) const noexcept
34 override;
35 bool equivalent(int ev, const bs::error_condition& c) const
36 noexcept override;
37 using ceph::converting_category::equivalent;
38 int from_code(int ev) const noexcept override;
39 };
40 #pragma GCC diagnostic pop
41 #pragma clang diagnostic pop
42
43 const char* osdc_error_category::name() const noexcept {
44 return "osdc";
45 }
46
47 const char* osdc_error_category::message(int ev, char*,
48 std::size_t) const noexcept {
49 if (ev == 0)
50 return "No error";
51
52 switch (static_cast<osdc_errc>(ev)) {
53 case osdc_errc::pool_dne:
54 return "Pool does not exist";
55
56 case osdc_errc::pool_exists:
57 return "Pool already exists";
58
59 case osdc_errc::precondition_violated:
60 return "Precondition for operation not satisfied";
61
62 case osdc_errc::not_supported:
63 return "Operation not supported";
64
65 case osdc_errc::snapshot_exists:
66 return "Snapshot already exists";
67
68 case osdc_errc::snapshot_dne:
69 return "Snapshot does not exist";
70
71 case osdc_errc::timed_out:
72 return "Operation timed out";
73
74 case osdc_errc::pool_eio:
75 return "Pool EIO flag set";
76 }
77
78 return "Unknown error";
79 }
80
81 std::string osdc_error_category::message(int ev) const {
82 return message(ev, nullptr, 0);
83 }
84
85 bs::error_condition
86 osdc_error_category::default_error_condition(int ev) const noexcept {
87 switch (static_cast<osdc_errc>(ev)) {
88 case osdc_errc::pool_dne:
89 return ceph::errc::does_not_exist;
90 case osdc_errc::pool_exists:
91 return ceph::errc::exists;
92 case osdc_errc::precondition_violated:
93 return bs::errc::invalid_argument;
94 case osdc_errc::not_supported:
95 return bs::errc::operation_not_supported;
96 case osdc_errc::snapshot_exists:
97 return ceph::errc::exists;
98 case osdc_errc::snapshot_dne:
99 return ceph::errc::does_not_exist;
100 case osdc_errc::timed_out:
101 return bs::errc::timed_out;
102 case osdc_errc::pool_eio:
103 return bs::errc::io_error;
104 }
105
106 return { ev, *this };
107 }
108
109 bool osdc_error_category::equivalent(int ev,
110 const bs::error_condition& c) const noexcept {
111 if (static_cast<osdc_errc>(ev) == osdc_errc::pool_dne) {
112 if (c == bs::errc::no_such_file_or_directory) {
113 return true;
114 }
115 if (c == ceph::errc::not_in_map) {
116 return true;
117 }
118 }
119 if (static_cast<osdc_errc>(ev) == osdc_errc::pool_exists) {
120 if (c == bs::errc::file_exists) {
121 return true;
122 }
123 }
124 if (static_cast<osdc_errc>(ev) == osdc_errc::snapshot_exists) {
125 if (c == bs::errc::file_exists) {
126 return true;
127 }
128 }
129 if (static_cast<osdc_errc>(ev) == osdc_errc::snapshot_dne) {
130 if (c == bs::errc::no_such_file_or_directory) {
131 return true;
132 }
133 if (c == ceph::errc::not_in_map) {
134 return true;
135 }
136 }
137
138 return default_error_condition(ev) == c;
139 }
140
141 int osdc_error_category::from_code(int ev) const noexcept {
142 switch (static_cast<osdc_errc>(ev)) {
143 case osdc_errc::pool_dne:
144 return -ENOENT;
145 case osdc_errc::pool_exists:
146 return -EEXIST;
147 case osdc_errc::precondition_violated:
148 return -EINVAL;
149 case osdc_errc::not_supported:
150 return -EOPNOTSUPP;
151 case osdc_errc::snapshot_exists:
152 return -EEXIST;
153 case osdc_errc::snapshot_dne:
154 return -ENOENT;
155 case osdc_errc::timed_out:
156 return -ETIMEDOUT;
157 case osdc_errc::pool_eio:
158 return -EIO;
159 }
160 return -EDOM;
161 }
162
163 const bs::error_category& osdc_category() noexcept {
164 static const osdc_error_category c;
165 return c;
166 }