return backend.create(os, osd_op, txn);
}, true);
case CEPH_OSD_OP_WRITE:
- return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
- return backend.write(os, osd_op, txn);
+ return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
+ osd_op_params = osd_op_params_t();
+ return backend.write(os, osd_op, txn, *osd_op_params);
}, true);
case CEPH_OSD_OP_WRITEFULL:
- return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
- return backend.writefull(os, osd_op, txn);
+ return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
+ osd_op_params = osd_op_params_t();
+ return backend.writefull(os, osd_op, txn, *osd_op_params);
}, true);
case CEPH_OSD_OP_SETALLOCHINT:
return osd_op_errorator::now();
return crimson::ct_error::operation_not_supported::make();
}
#endif
- return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
- return backend.omap_set_vals(os, osd_op, txn);
+ return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
+ osd_op_params = osd_op_params_t();
+ return backend.omap_set_vals(os, osd_op, txn, *osd_op_params);
}, true);
// watch/notify
PG& pg;
PGBackend& backend;
Ref<MOSDOp> msg;
+ std::optional<osd_op_params_t> osd_op_params;
bool user_modify = false;
ceph::os::Transaction txn;
template <typename Func>
OpsExecuter::osd_op_errorator::future<> OpsExecuter::submit_changes(Func&& f) && {
assert(obc);
- osd_op_params_t osd_op_params(std::move(msg));
+ if (!osd_op_params) {
+ osd_op_params = osd_op_params_t();
+ }
+ osd_op_params->req = std::move(msg);
eversion_t at_version = pg.next_version();
- osd_op_params.at_version = at_version;
- osd_op_params.pg_trim_to = pg.get_pg_trim_to();
- osd_op_params.min_last_complete_ondisk = pg.get_min_last_complete_ondisk();
- osd_op_params.last_complete = pg.get_info().last_complete;
+ osd_op_params->at_version = at_version;
+ osd_op_params->pg_trim_to = pg.get_pg_trim_to();
+ osd_op_params->min_last_complete_ondisk = pg.get_min_last_complete_ondisk();
+ osd_op_params->last_complete = pg.get_info().last_complete;
if (user_modify)
- osd_op_params.user_at_version = at_version.version;
-
+ osd_op_params->user_at_version = at_version.version;
if (__builtin_expect(op_effects.empty(), true)) {
- return std::forward<Func>(f)(std::move(txn), std::move(obc), std::move(osd_op_params));
+ return std::forward<Func>(f)(std::move(txn), std::move(obc), std::move(*osd_op_params));
}
- return std::forward<Func>(f)(std::move(txn), std::move(obc), std::move(osd_op_params)).safe_then([this] {
+ return std::forward<Func>(f)(std::move(txn), std::move(obc), std::move(*osd_op_params)).safe_then([this] {
// let's do the cleaning of `op_effects` in destructor
return crimson::do_for_each(op_effects, [] (auto& op_effect) {
return op_effect->execute();
eversion_t pg_trim_to;
eversion_t min_last_complete_ondisk;
eversion_t last_complete;
- version_t user_at_version;
+ version_t user_at_version = 0;
bool user_modify = false;
+ ObjectCleanRegions clean_regions;
+ osd_op_params_t() = default;
osd_op_params_t(Ref<MOSDOp>&& req) : req(req) {}
osd_op_params_t(Ref<MOSDOp>&& req, eversion_t at_version, eversion_t pg_trim_to,
eversion_t mlcod, eversion_t lc, version_t user_at_version) :
logger().debug("{} op_returns: {}",
__func__, log_entries.back().op_returns);
}
+ log_entries.back().clean_regions = std::move(osd_op_p.clean_regions);
peering_state.append_log_with_trim_to_updated(std::move(log_entries), osd_op_p.at_version,
txn, true, false);
seastar::future<> PGBackend::write(
ObjectState& os,
const OSDOp& osd_op,
- ceph::os::Transaction& txn)
+ ceph::os::Transaction& txn,
+ osd_op_params_t& osd_op_params)
{
const ceph_osd_op& op = osd_op.op;
uint64_t offset = op.extent.offset;
if (op.extent.truncate_size != os.oi.size) {
os.oi.size = length;
// TODO: truncate_update_size_and_usage()
+ if (op.extent.truncate_size > os.oi.size) {
+ osd_op_params.clean_regions.mark_data_region_dirty(os.oi.size,
+ op.extent.truncate_size - os.oi.size);
+ } else {
+ osd_op_params.clean_regions.mark_data_region_dirty(op.extent.truncate_size,
+ os.oi.size - op.extent.truncate_size);
+ }
}
}
os.oi.truncate_seq = op.extent.truncate_seq;
offset, length, std::move(buf), op.flags);
os.oi.size = std::max(offset + length, os.oi.size);
}
+ osd_op_params.clean_regions.mark_data_region_dirty(op.extent.offset,
+ op.extent.length);
+
return seastar::now();
}
seastar::future<> PGBackend::writefull(
ObjectState& os,
const OSDOp& osd_op,
- ceph::os::Transaction& txn)
+ ceph::os::Transaction& txn,
+ osd_op_params_t& osd_op_params)
{
const ceph_osd_op& op = osd_op.op;
if (op.extent.length != osd_op.indata.length()) {
const bool existing = maybe_create_new_object(os, txn);
if (existing && op.extent.length < os.oi.size) {
txn.truncate(coll->get_cid(), ghobject_t{os.oi.soid}, op.extent.length);
+ osd_op_params.clean_regions.mark_data_region_dirty(op.extent.length,
+ os.oi.size - op.extent.length);
}
if (op.extent.length) {
txn.write(coll->get_cid(), ghobject_t{os.oi.soid}, 0, op.extent.length,
osd_op.indata, op.flags);
os.oi.size = op.extent.length;
+ osd_op_params.clean_regions.mark_data_region_dirty(0,
+ std::max((uint64_t) op.extent.length, os.oi.size));
}
return seastar::now();
}
seastar::future<> PGBackend::omap_set_vals(
ObjectState& os,
const OSDOp& osd_op,
- ceph::os::Transaction& txn)
+ ceph::os::Transaction& txn,
+ osd_op_params_t& osd_op_params)
{
maybe_create_new_object(os, txn);
//ctx->delta_stats.num_wr_kb += shift_round_up(to_set_bl.length(), 10);
os.oi.set_flag(object_info_t::FLAG_OMAP);
os.oi.clear_omap_digest();
+ osd_op_params.clean_regions.mark_omap_dirty();
return seastar::now();
}
seastar::future<> write(
ObjectState& os,
const OSDOp& osd_op,
- ceph::os::Transaction& trans);
+ ceph::os::Transaction& trans,
+ osd_op_params_t& osd_op_params);
seastar::future<> writefull(
ObjectState& os,
const OSDOp& osd_op,
- ceph::os::Transaction& trans);
+ ceph::os::Transaction& trans,
+ osd_op_params_t& osd_op_params);
seastar::future<crimson::osd::acked_peers_t> mutate_object(
std::set<pg_shard_t> pg_shards,
crimson::osd::ObjectContextRef &&obc,
seastar::future<> omap_set_vals(
ObjectState& os,
const OSDOp& osd_op,
- ceph::os::Transaction& trans);
+ ceph::os::Transaction& trans,
+ osd_op_params_t& osd_op_params);
seastar::future<ceph::bufferlist> omap_get_header(
crimson::os::CollectionRef& c,
const ghobject_t& oid);