From a13f08d399b0c29dd8b266107966ae6c41f2d169 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Mon, 29 Apr 2019 20:57:24 +0200 Subject: [PATCH] crimson: make ObjectState mutable. Evict mutated state on error. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/pg.cc | 7 ++++++- src/crimson/osd/pg.h | 2 +- src/crimson/osd/pg_backend.cc | 2 +- src/crimson/osd/pg_backend.h | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index d3e604f89a2..d3912f1e1b6 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -969,8 +969,9 @@ seastar::future<> PG::wait_for_active() } } +// TODO: split the method accordingly to os' constness needs seastar::future<> -PG::do_osd_op(const ObjectState& os, OSDOp& osd_op, ceph::os::Transaction& txn) +PG::do_osd_op(ObjectState& os, OSDOp& osd_op, ceph::os::Transaction& txn) { // TODO: dispatch via call table? // TODO: we might want to find a way to unify both input and output @@ -994,6 +995,7 @@ PG::do_osd_op(const ObjectState& os, OSDOp& osd_op, ceph::os::Transaction& txn) // through path somehow works but this is really nasty. [[fallthrough]]; case CEPH_OSD_OP_WRITEFULL: + // XXX: os = backend->write(std::move(os), ...) instead? return backend->writefull(os, osd_op, txn); case CEPH_OSD_OP_SETALLOCHINT: return seastar::now(); @@ -1025,6 +1027,9 @@ seastar::future> PG::do_osd_ops(Ref m) reply->add_flags(CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK); return seastar::make_ready_future>(std::move(reply)); }).handle_exception_type([=](const object_not_found& dne) { + logger().debug("got object_not_found for {}", oid); + + backend->evict_object_state(oid); auto reply = make_message(m.get(), -ENOENT, get_osdmap_epoch(), 0, false); reply->set_enoent_reply_versions(info.last_update, diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index bcf6eea4d4e..12f6bd730e4 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -131,7 +131,7 @@ private: int new_acting_primary); seastar::future> do_osd_ops(Ref m); seastar::future<> do_osd_op( - const ObjectState& os, + ObjectState& os, OSDOp& op, ceph::os::Transaction& txn); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 25bac37cc38..11459db34ec 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -199,7 +199,7 @@ seastar::future PGBackend::read(const object_info_t& oi, } seastar::future<> PGBackend::writefull( - const ObjectState& os, + ObjectState& os, const OSDOp& osd_op, ceph::os::Transaction& txn) { diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 69a55be2561..003ef0151f1 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -42,7 +42,7 @@ public: uint32_t truncate_seq, uint32_t flags); seastar::future<> writefull( - const ObjectState& os, + ObjectState& os, const OSDOp& osd_op, ceph::os::Transaction& trans); seastar::future<> submit_transaction(ceph::os::Transaction&& txn); -- 2.39.5