return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
return backend.omap_set_header(os, osd_op, txn);
}, true);
+ case CEPH_OSD_OP_OMAPRMKEYRANGE:
+#if 0
+ if (!pg.get_pool().info.supports_omap()) {
+ return crimson::ct_error::operation_not_supported::make();
+ }
+#endif
+ return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
+ return backend.omap_remove_range(os, osd_op, txn);
+ }, true);
// watch/notify
case CEPH_OSD_OP_WATCH:
txn.omap_setheader(coll->get_cid(), ghobject_t{os.oi.soid}, osd_op.indata);
//TODO:
//ctx->clean_regions.mark_omap_dirty();
- //ctx->delta_stats.num_wr++;
+ //ctx->delta_stats.num_wr++;
os.oi.set_flag(object_info_t::FLAG_OMAP);
os.oi.clear_omap_digest();
return seastar::now();
}
+seastar::future<> PGBackend::omap_remove_range(
+ ObjectState& os,
+ const OSDOp& osd_op,
+ ceph::os::Transaction& txn)
+{
+ std::string key_begin, key_end;
+ try {
+ auto p = osd_op.indata.cbegin();
+ decode(key_begin, p);
+ decode(key_end, p);
+ } catch (buffer::error& e) {
+ throw crimson::osd::invalid_argument{};
+ }
+ txn.omap_rmkeyrange(coll->get_cid(), ghobject_t{os.oi.soid}, key_begin, key_end);
+ //TODO:
+ //ctx->delta_stats.num_wr++;
+ os.oi.clear_omap_digest();
+ return seastar::now();
+}
+
seastar::future<struct stat> PGBackend::stat(
CollectionRef c,
const ghobject_t& oid) const
ObjectState& os,
const OSDOp& osd_op,
ceph::os::Transaction& trans);
+ seastar::future<> omap_remove_range(
+ ObjectState& os,
+ const OSDOp& osd_op,
+ ceph::os::Transaction& trans);
virtual void got_rep_op_reply(const MOSDRepOpReply&) {}
virtual seastar::future<> stop() = 0;