return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
return backend.omap_remove_range(os, osd_op, txn, delta_stats);
}, true);
+ case CEPH_OSD_OP_OMAPRMKEYS:
+ /** TODO: Implement supports_omap()
+ if (!pg.get_pool().info.supports_omap()) {
+ return crimson::ct_error::operation_not_supported::make();
+ }*/
+ return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
+ return backend.omap_remove_key(os, osd_op, txn);
+ }, true);
case CEPH_OSD_OP_OMAPCLEAR:
return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
return backend.omap_clear(os, osd_op, txn, *osd_op_params, delta_stats);
return seastar::now();
}
+PGBackend::interruptible_future<> PGBackend::omap_remove_key(
+ ObjectState& os,
+ const OSDOp& osd_op,
+ ceph::os::Transaction& txn)
+{
+ ceph::bufferlist to_rm_bl;
+ try {
+ auto p = osd_op.indata.cbegin();
+ decode_str_set_to_bl(p, &to_rm_bl);
+ } catch (buffer::error& e) {
+ throw crimson::osd::invalid_argument{};
+ }
+ txn.omap_rmkeys(coll->get_cid(), ghobject_t{os.oi.soid}, to_rm_bl);
+ // TODO:
+ // ctx->clean_regions.mark_omap_dirty();
+ // ctx->delta_stats.num_wr++;
+ os.oi.clear_omap_digest();
+ return seastar::now();
+}
+
PGBackend::omap_clear_iertr::future<>
PGBackend::omap_clear(
ObjectState& os,
const OSDOp& osd_op,
ceph::os::Transaction& trans,
object_stat_sum_t& delta_stats);
+ interruptible_future<> omap_remove_key(
+ ObjectState& os,
+ const OSDOp& osd_op,
+ ceph::os::Transaction& trans);
using omap_clear_ertr = crimson::errorator<crimson::ct_error::enoent>;
using omap_clear_iertr =
::crimson::interruptible::interruptible_errorator<