From ee796ade4803e529109f7ce52bccf1120a57e712 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 13 May 2019 19:45:05 +0800 Subject: [PATCH] crimson/osd: add preliminary delete support Signed-off-by: Kefu Chai --- src/crimson/os/cyan_store.cc | 23 +++++++++++++++++++++++ src/crimson/os/cyan_store.h | 1 + src/crimson/osd/pg.cc | 2 ++ src/crimson/osd/pg_backend.cc | 14 ++++++++++++++ src/crimson/osd/pg_backend.h | 3 +++ 5 files changed, 43 insertions(+) diff --git a/src/crimson/os/cyan_store.cc b/src/crimson/os/cyan_store.cc index 41e4ddfa24c..2486c535214 100644 --- a/src/crimson/os/cyan_store.cc +++ b/src/crimson/os/cyan_store.cc @@ -242,6 +242,12 @@ seastar::future<> CyanStore::do_transaction(CollectionRef ch, switch (op->op) { case Transaction::OP_NOP: break; + case Transaction::OP_REMOVE: + { + coll_t cid = i.get_cid(op->cid); + ghobject_t oid = i.get_oid(op->oid); + r = _remove(cid, oid); + } case Transaction::OP_TOUCH: { coll_t cid = i.get_cid(op->cid); @@ -298,6 +304,23 @@ seastar::future<> CyanStore::do_transaction(CollectionRef ch, return seastar::now(); } +int CyanStore::_remove(const coll_t& cid, const ghobject_t& oid) +{ + logger().debug("{} cid={} oid={}", + __func__, cid, oid); + auto c = open_collection(cid); + if (!c) + return -ENOENT; + + auto i = c->object_hash.find(oid); + if (i == c->object_hash.end()) + return -ENOENT; + used_bytes -= i->second->get_size(); + c->object_hash.erase(i); + c->object_map.erase(oid); + return 0; +} + int CyanStore::_touch(const coll_t& cid, const ghobject_t& oid) { logger().debug("{} cid={} oid={}", diff --git a/src/crimson/os/cyan_store.h b/src/crimson/os/cyan_store.h index 4f34f6b1292..8b895f952f2 100644 --- a/src/crimson/os/cyan_store.h +++ b/src/crimson/os/cyan_store.h @@ -96,6 +96,7 @@ public: uuid_d get_fsid() const; private: + int _remove(const coll_t& cid, const ghobject_t& oid); int _touch(const coll_t& cid, const ghobject_t& oid); int _write(const coll_t& cid, const ghobject_t& oid, uint64_t offset, size_t len, const bufferlist& bl, diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index c260e3e0fdf..82775219fd7 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -1006,6 +1006,8 @@ PG::do_osd_op(ObjectState& os, OSDOp& osd_op, ceph::os::Transaction& txn) osd_op.outdata = std::move(bl); return seastar::now(); }); + case CEPH_OSD_OP_DELETE: + return backend->remove(os, txn); default: throw std::runtime_error( fmt::format("op '{}' not supported", ceph_osd_op_name(op.op))); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 639efd4e305..b7a3cad8629 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -275,6 +275,20 @@ seastar::future<> PGBackend::writefull( return seastar::now(); } +seastar::future<> PGBackend::remove(ObjectState& os, + ceph::os::Transaction& txn) +{ + // todo: snapset + txn.remove(coll->cid, ghobject_t{os.oi.soid, ghobject_t::NO_GEN, shard}); + os.oi.size = 0; + os.oi.new_object(); + // todo: update watchers + if (os.oi.is_whiteout()) { + os.oi.clear_flag(object_info_t::FLAG_WHITEOUT); + } + return seastar::now(); +} + seastar::future, hobject_t> PGBackend::list_objects(const hobject_t& start, uint64_t limit) { diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 103558e414c..5edafeb2068 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -41,6 +41,9 @@ public: size_t truncate_size, uint32_t truncate_seq, uint32_t flags); + seastar::future<> remove( + ObjectState& os, + ceph::os::Transaction& txn); seastar::future<> writefull( ObjectState& os, const OSDOp& osd_op, -- 2.39.5