From 3aeea9b7e6f49ad5fa81898fc46359895e269407 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Fri, 10 Sep 2021 16:34:10 +0800 Subject: [PATCH] crimson: exclude oid when encode/decode object_info_t to/from object store Signed-off-by: Yingxin Cheng --- src/crimson/osd/pg_backend.cc | 4 +-- .../osd/replicated_recovery_backend.cc | 7 ++--- src/osd/osd_types.h | 27 +++++++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 5f2ddfcef6a13..d4b6e3ca6a2ee 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -83,7 +83,7 @@ PGBackend::load_metadata(const hobject_t& oid) if (auto oiiter = attrs.find(OI_ATTR); oiiter != attrs.end()) { bufferlist bl = std::move(oiiter->second); ret->os = ObjectState( - object_info_t(bl), + object_info_t(bl, oid), true); } else { logger().error( @@ -151,7 +151,7 @@ PGBackend::mutate_object( // object_info_t { ceph::bufferlist osv; - encode(obc->obs.oi, osv, CEPH_FEATURES_ALL); + obc->obs.oi.encode_no_oid(osv, CEPH_FEATURES_ALL); // TODO: get_osdmap()->get_features(CEPH_ENTITY_TYPE_OSD, nullptr)); txn.setattr(coll->get_cid(), ghobject_t{obc->obs.oi.soid}, OI_ATTR, osv); } diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 6eccf8d1a11f0..19cf5d2ef27a3 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -462,7 +462,7 @@ ReplicatedRecoveryBackend::read_metadata_for_push_op( } logger().debug("read_metadata_for_push_op: {}", push_op->attrset[OI_ATTR]); object_info_t oi; - oi.decode(push_op->attrset[OI_ATTR]); + oi.decode_no_oid(push_op->attrset[OI_ATTR]); new_progress.first = false; return oi.version; }); @@ -656,7 +656,7 @@ ReplicatedRecoveryBackend::_handle_pull_response( pi.recovery_info.soid, [&pi, &recovery_waiter, &pop](auto obc) { pi.obc = obc; recovery_waiter.obc = obc; - obc->obs.oi.decode(pop.attrset.at(OI_ATTR)); + obc->obs.oi.decode_no_oid(pop.attrset.at(OI_ATTR), pop.soid); pi.recovery_info.oi = obc->obs.oi; return crimson::osd::PG::load_obc_ertr::now(); }).handle_error_interruptible(crimson::ct_error::assert_all{}); @@ -955,7 +955,8 @@ ReplicatedRecoveryBackend::prep_push_target( if (!complete || !recovery_info.object_exist) { t->remove(coll->get_cid(), target_oid); t->touch(coll->get_cid(), target_oid); - object_info_t oi(attrs.at(OI_ATTR)); + object_info_t oi; + oi.decode_no_oid(attrs.at(OI_ATTR)); t->set_alloc_hint(coll->get_cid(), target_oid, oi.expected_object_size, oi.expected_write_size, diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 43b969c9e3428..dd70cf75a8bae 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -5912,6 +5912,28 @@ struct object_info_t { auto p = std::cbegin(bl); decode(p); } + + void encode_no_oid(ceph::buffer::list& bl, uint64_t features) { + // TODO: drop soid field and remove the denc no_oid methods + auto tmp_oid = hobject_t(hobject_t::get_max()); + tmp_oid.swap(soid); + encode(bl, features); + soid = tmp_oid; + } + void decode_no_oid(ceph::buffer::list::const_iterator& bl) { + decode(bl); + ceph_assert(soid.is_max()); + } + void decode_no_oid(const ceph::buffer::list& bl) { + auto p = std::cbegin(bl); + decode_no_oid(p); + } + void decode_no_oid(const ceph::buffer::list& bl, const hobject_t& _soid) { + auto p = std::cbegin(bl); + decode_no_oid(p); + soid = _soid; + } + void dump(ceph::Formatter *f) const; static void generate_test_instances(std::list& o); @@ -5935,6 +5957,11 @@ struct object_info_t { explicit object_info_t(const ceph::buffer::list& bl) { decode(bl); } + + explicit object_info_t(const ceph::buffer::list& bl, const hobject_t& _soid) { + decode_no_oid(bl); + soid = _soid; + } }; WRITE_CLASS_ENCODER_FEATURES(object_info_t) -- 2.39.5