Skip to content

Commit c6552eb

Browse files
committed
crimson/osd/pg: Seperate mutate_object from submit_transaction
instead of mutating the object in each transaction being submitted, only mutate obc for user triggered transactions. This way, PG::submit_transaction internal users would not mutate obc (e.g SnapTrimObjSubEvent) Fixes: https://tracker.ceph.com/issues/67675 Signed-off-by: Xuehan Xu <[email protected]>
1 parent fbfeb28 commit c6552eb

File tree

3 files changed

+44
-32
lines changed

3 files changed

+44
-32
lines changed

src/crimson/osd/pg.cc

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,45 @@ std::ostream& operator<<(std::ostream& os, const PG& pg)
849849
return os;
850850
}
851851

852+
void PG::mutate_object(
853+
ObjectContextRef& obc,
854+
ceph::os::Transaction& txn,
855+
osd_op_params_t& osd_op_p)
856+
{
857+
if (obc->obs.exists) {
858+
obc->obs.oi.prior_version = obc->obs.oi.version;
859+
obc->obs.oi.version = osd_op_p.at_version;
860+
if (osd_op_p.user_modify)
861+
obc->obs.oi.user_version = osd_op_p.at_version.version;
862+
obc->obs.oi.last_reqid = osd_op_p.req_id;
863+
obc->obs.oi.mtime = osd_op_p.mtime;
864+
obc->obs.oi.local_mtime = ceph_clock_now();
865+
866+
// object_info_t
867+
{
868+
ceph::bufferlist osv;
869+
obc->obs.oi.encode_no_oid(osv, CEPH_FEATURES_ALL);
870+
// TODO: get_osdmap()->get_features(CEPH_ENTITY_TYPE_OSD, nullptr));
871+
txn.setattr(coll_ref->get_cid(), ghobject_t{obc->obs.oi.soid}, OI_ATTR, osv);
872+
}
873+
874+
// snapset
875+
if (obc->obs.oi.soid.snap == CEPH_NOSNAP) {
876+
logger().debug("final snapset {} in {}",
877+
obc->ssc->snapset, obc->obs.oi.soid);
878+
ceph::bufferlist bss;
879+
encode(obc->ssc->snapset, bss);
880+
txn.setattr(coll_ref->get_cid(), ghobject_t{obc->obs.oi.soid}, SS_ATTR, bss);
881+
obc->ssc->exists = true;
882+
} else {
883+
logger().debug("no snapset (this is a clone)");
884+
}
885+
} else {
886+
// reset cached ObjectState without enforcing eviction
887+
obc->obs.oi = object_info_t(obc->obs.oi.soid);
888+
}
889+
}
890+
852891
std::tuple<PG::interruptible_future<>,
853892
PG::interruptible_future<>>
854893
PG::submit_transaction(
@@ -981,6 +1020,7 @@ PG::do_osd_ops_execute(
9811020
logger().debug(
9821021
"do_osd_ops_execute: object {} submitting txn",
9831022
obc->get_oid());
1023+
mutate_object(obc, txn, osd_op_p);
9841024
return submit_transaction(
9851025
std::move(obc),
9861026
std::move(txn),

src/crimson/osd/pg.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,10 @@ class PG : public boost::intrusive_ref_counter<
848848
friend class SnapTrimObjSubEvent;
849849
private:
850850

851+
void mutate_object(
852+
ObjectContextRef& obc,
853+
ceph::os::Transaction& txn,
854+
osd_op_params_t& osd_op_p);
851855
bool can_discard_replica_op(const Message& m, epoch_t m_map_epoch) const;
852856
bool can_discard_op(const MOSDOp& m) const;
853857
void context_registry_on_change();

src/crimson/osd/pg_backend.cc

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -162,38 +162,6 @@ PGBackend::mutate_object(
162162
std::vector<pg_log_entry_t>&& log_entries)
163163
{
164164
logger().trace("mutate_object: num_ops={}", txn.get_num_ops());
165-
if (obc->obs.exists) {
166-
obc->obs.oi.prior_version = obc->obs.oi.version;
167-
obc->obs.oi.version = osd_op_p.at_version;
168-
if (osd_op_p.user_modify)
169-
obc->obs.oi.user_version = osd_op_p.at_version.version;
170-
obc->obs.oi.last_reqid = osd_op_p.req_id;
171-
obc->obs.oi.mtime = osd_op_p.mtime;
172-
obc->obs.oi.local_mtime = ceph_clock_now();
173-
174-
// object_info_t
175-
{
176-
ceph::bufferlist osv;
177-
obc->obs.oi.encode_no_oid(osv, CEPH_FEATURES_ALL);
178-
// TODO: get_osdmap()->get_features(CEPH_ENTITY_TYPE_OSD, nullptr));
179-
txn.setattr(coll->get_cid(), ghobject_t{obc->obs.oi.soid}, OI_ATTR, osv);
180-
}
181-
182-
// snapset
183-
if (obc->obs.oi.soid.snap == CEPH_NOSNAP) {
184-
logger().debug("final snapset {} in {}",
185-
obc->ssc->snapset, obc->obs.oi.soid);
186-
ceph::bufferlist bss;
187-
encode(obc->ssc->snapset, bss);
188-
txn.setattr(coll->get_cid(), ghobject_t{obc->obs.oi.soid}, SS_ATTR, bss);
189-
obc->ssc->exists = true;
190-
} else {
191-
logger().debug("no snapset (this is a clone)");
192-
}
193-
} else {
194-
// reset cached ObjectState without enforcing eviction
195-
obc->obs.oi = object_info_t(obc->obs.oi.soid);
196-
}
197165
return _submit_transaction(
198166
std::move(pg_shards), obc->obs.oi.soid, std::move(txn),
199167
std::move(osd_op_p), min_epoch, map_epoch, std::move(log_entries));

0 commit comments

Comments
 (0)