#pragma once
#include <exception>
+#include <system_error>
-class object_not_found : public std::exception {
+class crimson_error : private std::system_error {
+public:
+ crimson_error(const std::errc ec)
+ : system_error(std::make_error_code(ec)) {
+ }
+
+ using system_error::code;
+ using system_error::what;
+
+private:
+ crimson_error(const int ret) noexcept
+ : system_error(ret, std::system_category()) {
+ }
+};
+
+
+struct object_not_found : public crimson_error {
+ object_not_found() : crimson_error(std::errc::no_such_file_or_directory) {}
};
-class object_corrupted : public std::exception {
+struct object_corrupted : public crimson_error {
+ object_corrupted() : crimson_error(std::errc::illegal_byte_sequence) {}
};
-class invalid_argument : public std::exception {
+struct invalid_argument : public crimson_error {
+ invalid_argument() : crimson_error(std::errc::invalid_argument) {}
};
+
0, false);
reply->add_flags(CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK);
return seastar::make_ready_future<Ref<MOSDOpReply>>(std::move(reply));
- }).handle_exception_type([=](const object_not_found& dne) {
- logger().debug("got object_not_found for {}", oid);
+ }).handle_exception_type([=](const crimson_error& ce) {
+ logger().debug("got crimson_error while handling object {}: {} ({})",
+ oid, ce.code(), ce.what());
backend->evict_object_state(oid);
- auto reply = make_message<MOSDOpReply>(m.get(), -ENOENT, get_osdmap_epoch(),
- 0, false);
+ auto reply = make_message<MOSDOpReply>(
+ m.get(), -ce.code().value(), get_osdmap_epoch(), 0, false);
reply->set_enoent_reply_versions(peering_state.get_info().last_update,
peering_state.get_info().last_user_version);
return seastar::make_ready_future<Ref<MOSDOpReply>>(std::move(reply));