From e3763c2ae96669c0e1c888e4db47dc589d6cfb53 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 24 Sep 2019 19:35:00 +0200 Subject: [PATCH] crimson/osd: apply errorator along the get_object_state() path. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/pg.cc | 29 +++++++++++++++++++---------- src/crimson/osd/pg_backend.cc | 14 +++++++------- src/crimson/osd/pg_backend.h | 3 ++- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 4404e01596547..8df8bc63f747b 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -437,7 +437,7 @@ seastar::future> PG::do_osd_ops(Ref m) { const auto oid = m->get_snapid() == CEPH_SNAPDIR ? m->get_hobj().get_head() : m->get_hobj(); - return backend->get_object_state(oid).then([this, m](auto os) mutable { + return backend->get_object_state(oid).safe_then([this, m](auto os) mutable { return crimson::do_with(OpsExecuter{std::move(os), *this/* as const& */, m}, [this, m] (auto& ox) { return crimson::do_for_each(m->ops, [this, &ox](OSDOp& osd_op) { @@ -455,16 +455,25 @@ seastar::future> PG::do_osd_ops(Ref m) } }); }, OpsExecuter::osd_op_errorator::pass_further{}); - }).safe_then([m,this] { - auto reply = make_message(m.get(), 0, get_osdmap_epoch(), - 0, false); - reply->add_flags(CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK); + }); + }).safe_then([m,this] { + auto reply = make_message(m.get(), 0, get_osdmap_epoch(), + 0, false); + reply->add_flags(CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK); + return seastar::make_ready_future>(std::move(reply)); + }, OpsExecuter::osd_op_errorator::all_same_way([=,&oid] (const std::error_code& e) { + assert(e.value() > 0); + logger().debug("got statical error code while handling object {}: {} ({})", + oid, e.value(), e.message()); + return backend->evict_object_state(oid).then([=] { + auto reply = make_message( + m.get(), -e.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>(std::move(reply)); - }, OpsExecuter::osd_op_errorator::all_same_way([] (const std::error_code& err) { - assert(err.value() > 0); - throw crimson::osd::make_error(err.value()); - })); - }).handle_exception_type([=,&oid](const crimson::osd::error& e) { + }); + })).handle_exception_type([=,&oid](const crimson::osd::error& e) { + // we need this handler because throwing path which aren't errorated yet. logger().debug("got ceph::osd::error while handling object {}: {} ({})", oid, e.code(), e.what()); return backend->evict_object_state(oid).then([=] { diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 35b0bfad72e7b..e1b2cd788ba14 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -59,7 +59,7 @@ PGBackend::PGBackend(shard_id_t shard, store{store} {} -seastar::future +PGBackend::get_os_errorator::future PGBackend::get_object_state(const hobject_t& oid) { // want the head? @@ -77,8 +77,8 @@ PGBackend::get_object_state(const hobject_t& oid) auto clone = std::upper_bound(begin(ss->clones), end(ss->clones), oid.snap); if (clone == end(ss->clones)) { - return seastar::make_exception_future( - crimson::osd::object_not_found{}); + return get_os_errorator::make_plain_exception_future( + crimson::ct_error::enoent::make()); } // clone auto soid = oid; @@ -88,16 +88,16 @@ PGBackend::get_object_state(const hobject_t& oid) assert(clone_snap != end(ss->clone_snaps)); if (clone_snap->second.empty()) { logger().trace("find_object: {}@[] -- DNE", soid); - return seastar::make_exception_future( - crimson::osd::object_not_found{}); + return get_os_errorator::make_plain_exception_future( + crimson::ct_error::enoent::make()); } auto first = clone_snap->second.back(); auto last = clone_snap->second.front(); if (first > soid.snap) { logger().trace("find_object: {}@[{},{}] -- DNE", soid, first, last); - return seastar::make_exception_future( - crimson::osd::object_not_found{}); + return get_os_errorator::make_plain_exception_future( + crimson::ct_error::enoent::make()); } logger().trace("find_object: {}@[{},{}] -- HIT", soid, first, last); diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index adc0faf5485e6..46902111f16b5 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -44,7 +44,8 @@ public: crimson::osd::ShardServices& shard_services, const ec_profile_t& ec_profile); using cached_os_t = boost::local_shared_ptr; - seastar::future get_object_state(const hobject_t& oid); + using get_os_errorator = crimson::errorator; + get_os_errorator::future get_object_state(const hobject_t& oid); seastar::future<> evict_object_state(const hobject_t& oid); using read_errorator = ll_read_errorator::extend< -- 2.39.5