Skip to content

Commit 48b5266

Browse files
authored
Merge pull request ceph#59407 from xxhdx1985126/wip-67675
crimson/osd/pg: only mutate obc for user triggerred transactions Reviewed-by: Matan Breizman <[email protected]> Reviewed-by: Samuel Just <[email protected]>
2 parents 54e8f23 + 272f72b commit 48b5266

File tree

9 files changed

+75
-86
lines changed

9 files changed

+75
-86
lines changed

src/crimson/osd/ec_backend.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ ECBackend::_read(const hobject_t& hoid,
2424
}
2525

2626
ECBackend::rep_op_fut_t
27-
ECBackend::_submit_transaction(std::set<pg_shard_t>&& pg_shards,
28-
const hobject_t& hoid,
29-
ceph::os::Transaction&& txn,
30-
osd_op_params_t&& osd_op_p,
31-
epoch_t min_epoch, epoch_t max_epoch,
32-
std::vector<pg_log_entry_t>&& log_entries)
27+
ECBackend::submit_transaction(const std::set<pg_shard_t> &pg_shards,
28+
const hobject_t& hoid,
29+
ceph::os::Transaction&& txn,
30+
osd_op_params_t&& osd_op_p,
31+
epoch_t min_epoch, epoch_t max_epoch,
32+
std::vector<pg_log_entry_t>&& log_entries)
3333
{
3434
// todo
3535
return {seastar::now(),

src/crimson/osd/ec_backend.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ class ECBackend : public PGBackend
2626
ll_read_ierrorator::future<ceph::bufferlist>
2727
_read(const hobject_t& hoid, uint64_t off, uint64_t len, uint32_t flags) override;
2828
rep_op_fut_t
29-
_submit_transaction(std::set<pg_shard_t>&& pg_shards,
30-
const hobject_t& hoid,
31-
ceph::os::Transaction&& txn,
32-
osd_op_params_t&& req,
33-
epoch_t min_epoch, epoch_t max_epoch,
34-
std::vector<pg_log_entry_t>&& log_entries) final;
29+
submit_transaction(const std::set<pg_shard_t> &pg_shards,
30+
const hobject_t& hoid,
31+
ceph::os::Transaction&& txn,
32+
osd_op_params_t&& req,
33+
epoch_t min_epoch, epoch_t max_epoch,
34+
std::vector<pg_log_entry_t>&& log_entries) final;
3535
CollectionRef coll;
3636
seastar::future<> request_committed(const osd_reqid_t& reqid,
3737
const eversion_t& version) final {

src/crimson/osd/osd_operations/snaptrim_event.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ SnapTrimObjSubEvent::adjust_snaps(
255255
obc->obs.oi.prior_version = obc->obs.oi.version;
256256
obc->obs.oi.version = osd_op_p.at_version;
257257
ceph::bufferlist bl;
258-
encode(obc->obs.oi,
258+
obc->obs.oi.encode_no_oid(
259259
bl,
260260
pg->get_osdmap()->get_features(CEPH_ENTITY_TYPE_OSD, nullptr));
261261
txn.setattr(

src/crimson/osd/pg.cc

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
857896
std::tuple<PG::interruptible_future<>,
858897
PG::interruptible_future<>>
859898
PG::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),

src/crimson/osd/pg.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,10 @@ class PG : public boost::intrusive_ref_counter<
863863
friend class SnapTrimObjSubEvent;
864864
private:
865865

866+
void mutate_object(
867+
ObjectContextRef& obc,
868+
ceph::os::Transaction& txn,
869+
osd_op_params_t& osd_op_p);
866870
bool can_discard_replica_op(const Message& m, epoch_t m_map_epoch) const;
867871
bool can_discard_op(const MOSDOp& m) const;
868872
void context_registry_on_change();

src/crimson/osd/pg_backend.cc

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -152,54 +152,6 @@ PGBackend::load_metadata(const hobject_t& oid)
152152
}));
153153
}
154154

155-
PGBackend::rep_op_fut_t
156-
PGBackend::mutate_object(
157-
std::set<pg_shard_t> pg_shards,
158-
crimson::osd::ObjectContextRef &&obc,
159-
ceph::os::Transaction&& txn,
160-
osd_op_params_t&& osd_op_p,
161-
epoch_t min_epoch,
162-
epoch_t map_epoch,
163-
std::vector<pg_log_entry_t>&& log_entries)
164-
{
165-
logger().trace("mutate_object: num_ops={}", txn.get_num_ops());
166-
if (obc->obs.exists) {
167-
obc->obs.oi.prior_version = obc->obs.oi.version;
168-
obc->obs.oi.version = osd_op_p.at_version;
169-
if (osd_op_p.user_modify)
170-
obc->obs.oi.user_version = osd_op_p.at_version.version;
171-
obc->obs.oi.last_reqid = osd_op_p.req_id;
172-
obc->obs.oi.mtime = osd_op_p.mtime;
173-
obc->obs.oi.local_mtime = ceph_clock_now();
174-
175-
// object_info_t
176-
{
177-
ceph::bufferlist osv;
178-
obc->obs.oi.encode_no_oid(osv, CEPH_FEATURES_ALL);
179-
// TODO: get_osdmap()->get_features(CEPH_ENTITY_TYPE_OSD, nullptr));
180-
txn.setattr(coll->get_cid(), ghobject_t{obc->obs.oi.soid}, OI_ATTR, osv);
181-
}
182-
183-
// snapset
184-
if (obc->obs.oi.soid.snap == CEPH_NOSNAP) {
185-
logger().debug("final snapset {} in {}",
186-
obc->ssc->snapset, obc->obs.oi.soid);
187-
ceph::bufferlist bss;
188-
encode(obc->ssc->snapset, bss);
189-
txn.setattr(coll->get_cid(), ghobject_t{obc->obs.oi.soid}, SS_ATTR, bss);
190-
obc->ssc->exists = true;
191-
} else {
192-
logger().debug("no snapset (this is a clone)");
193-
}
194-
} else {
195-
// reset cached ObjectState without enforcing eviction
196-
obc->obs.oi = object_info_t(obc->obs.oi.soid);
197-
}
198-
return _submit_transaction(
199-
std::move(pg_shards), obc->obs.oi.soid, std::move(txn),
200-
std::move(osd_op_p), min_epoch, map_epoch, std::move(log_entries));
201-
}
202-
203155
static inline bool _read_verify_data(
204156
const object_info_t& oi,
205157
const ceph::bufferlist& data)

src/crimson/osd/pg_backend.h

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,6 @@ class PGBackend
220220
ceph::os::Transaction& trans,
221221
osd_op_params_t& osd_op_params,
222222
object_stat_sum_t& delta_stats);
223-
rep_op_fut_t mutate_object(
224-
std::set<pg_shard_t> pg_shards,
225-
crimson::osd::ObjectContextRef &&obc,
226-
ceph::os::Transaction&& txn,
227-
osd_op_params_t&& osd_op_p,
228-
epoch_t min_epoch,
229-
epoch_t map_epoch,
230-
std::vector<pg_log_entry_t>&& log_entries);
231223

232224
/**
233225
* list_objects
@@ -418,6 +410,13 @@ class PGBackend
418410
ceph::os::Transaction& trans,
419411
osd_op_params_t& osd_op_params,
420412
object_stat_sum_t& delta_stats);
413+
virtual rep_op_fut_t
414+
submit_transaction(const std::set<pg_shard_t> &pg_shards,
415+
const hobject_t& hoid,
416+
ceph::os::Transaction&& txn,
417+
osd_op_params_t&& osd_op_p,
418+
epoch_t min_epoch, epoch_t max_epoch,
419+
std::vector<pg_log_entry_t>&& log_entries) = 0;
421420

422421
virtual void got_rep_op_reply(const MOSDRepOpReply&) {}
423422
virtual seastar::future<> stop() = 0;
@@ -475,13 +474,6 @@ class PGBackend
475474
object_stat_sum_t& delta_stats,
476475
object_info_t& oi,
477476
uint64_t truncate_size);
478-
virtual rep_op_fut_t
479-
_submit_transaction(std::set<pg_shard_t>&& pg_shards,
480-
const hobject_t& hoid,
481-
ceph::os::Transaction&& txn,
482-
osd_op_params_t&& osd_op_p,
483-
epoch_t min_epoch, epoch_t max_epoch,
484-
std::vector<pg_log_entry_t>&& log_entries) = 0;
485477
friend class ReplicatedRecoveryBackend;
486478
friend class ::crimson::osd::PG;
487479

src/crimson/osd/replicated_backend.cc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ ReplicatedBackend::_read(const hobject_t& hoid,
3636
}
3737

3838
ReplicatedBackend::rep_op_fut_t
39-
ReplicatedBackend::_submit_transaction(std::set<pg_shard_t>&& pg_shards,
40-
const hobject_t& hoid,
41-
ceph::os::Transaction&& txn,
42-
osd_op_params_t&& osd_op_p,
43-
epoch_t min_epoch, epoch_t map_epoch,
44-
std::vector<pg_log_entry_t>&& log_entries)
39+
ReplicatedBackend::submit_transaction(const std::set<pg_shard_t>& pg_shards,
40+
const hobject_t& hoid,
41+
ceph::os::Transaction&& txn,
42+
osd_op_params_t&& osd_op_p,
43+
epoch_t min_epoch, epoch_t map_epoch,
44+
std::vector<pg_log_entry_t>&& log_entries)
4545
{
46-
LOG_PREFIX(ReplicatedBackend::_submit_transaction);
46+
LOG_PREFIX(ReplicatedBackend::submit_transaction);
4747
DEBUGDPP("object {}", dpp, hoid);
4848

4949
const ceph_tid_t tid = shard_services.get_tid();

src/crimson/osd/replicated_backend.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ class ReplicatedBackend : public PGBackend
3232
ll_read_ierrorator::future<ceph::bufferlist>
3333
_read(const hobject_t& hoid, uint64_t off,
3434
uint64_t len, uint32_t flags) override;
35-
rep_op_fut_t _submit_transaction(std::set<pg_shard_t>&& pg_shards,
35+
rep_op_fut_t submit_transaction(
36+
const std::set<pg_shard_t> &pg_shards,
3637
const hobject_t& hoid,
3738
ceph::os::Transaction&& txn,
3839
osd_op_params_t&& osd_op_p,

0 commit comments

Comments
 (0)