@@ -854,6 +854,45 @@ std::ostream& operator<<(std::ostream& os, const PG& pg)
854854 return os;
855855}
856856
857+ void PG::mutate_object (
858+ ObjectContextRef& obc,
859+ ceph::os::Transaction& txn,
860+ osd_op_params_t & osd_op_p)
861+ {
862+ if (obc->obs .exists ) {
863+ obc->obs .oi .prior_version = obc->obs .oi .version ;
864+ obc->obs .oi .version = osd_op_p.at_version ;
865+ if (osd_op_p.user_modify )
866+ obc->obs .oi .user_version = osd_op_p.at_version .version ;
867+ obc->obs .oi .last_reqid = osd_op_p.req_id ;
868+ obc->obs .oi .mtime = osd_op_p.mtime ;
869+ obc->obs .oi .local_mtime = ceph_clock_now ();
870+
871+ // object_info_t
872+ {
873+ ceph::bufferlist osv;
874+ obc->obs .oi .encode_no_oid (osv, CEPH_FEATURES_ALL);
875+ // TODO: get_osdmap()->get_features(CEPH_ENTITY_TYPE_OSD, nullptr));
876+ txn.setattr (coll_ref->get_cid (), ghobject_t {obc->obs .oi .soid }, OI_ATTR, osv);
877+ }
878+
879+ // snapset
880+ if (obc->obs .oi .soid .snap == CEPH_NOSNAP) {
881+ logger ().debug (" final snapset {} in {}" ,
882+ obc->ssc ->snapset , obc->obs .oi .soid );
883+ ceph::bufferlist bss;
884+ encode (obc->ssc ->snapset , bss);
885+ txn.setattr (coll_ref->get_cid (), ghobject_t {obc->obs .oi .soid }, SS_ATTR, bss);
886+ obc->ssc ->exists = true ;
887+ } else {
888+ logger ().debug (" no snapset (this is a clone)" );
889+ }
890+ } else {
891+ // reset cached ObjectState without enforcing eviction
892+ obc->obs .oi = object_info_t (obc->obs .oi .soid );
893+ }
894+ }
895+
857896std::tuple<PG::interruptible_future<>,
858897 PG::interruptible_future<>>
859898PG::submit_transaction (
@@ -877,9 +916,9 @@ PG::submit_transaction(
877916 ceph_assert (log_entries.rbegin ()->version >= projected_last_update);
878917 projected_last_update = log_entries.rbegin ()->version ;
879918
880- auto [submitted, all_completed] = backend->mutate_object (
919+ auto [submitted, all_completed] = backend->submit_transaction (
881920 peering_state.get_acting_recovery_backfill (),
882- std::move ( obc) ,
921+ obc-> obs . oi . soid ,
883922 std::move (txn),
884923 std::move (osd_op_p),
885924 peering_state.get_last_peering_reset (),
@@ -986,6 +1025,7 @@ PG::do_osd_ops_execute(
9861025 logger ().debug (
9871026 " do_osd_ops_execute: object {} submitting txn" ,
9881027 obc->get_oid ());
1028+ mutate_object (obc, txn, osd_op_p);
9891029 return submit_transaction (
9901030 std::move (obc),
9911031 std::move (txn),
0 commit comments