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(
// 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);
}
}
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;
});
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{});
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,
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<object_info_t*>& o);
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)