]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: add preliminary delete support
authorKefu Chai <kchai@redhat.com>
Mon, 13 May 2019 11:45:05 +0000 (19:45 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 13 May 2019 16:02:19 +0000 (00:02 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/os/cyan_store.cc
src/crimson/os/cyan_store.h
src/crimson/osd/pg.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 41e4ddfa24cadd95bdfd64647ac740fb4bbcf33b..2486c53521464b1e61215b94494ad93d8904108b 100644 (file)
@@ -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={}",
index 4f34f6b1292c315d0cb9b62f8873ab3b124927b6..8b895f952f201cbc82b573a8e88fc2649cd35a0c 100644 (file)
@@ -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,
index c260e3e0fdf59218cd9ff5bb648cd215ba22e9fb..82775219fd717c2e5b8d34d9f1073c00c5ba4bf8 100644 (file)
@@ -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)));
index 639efd4e30526a8bc86e200b6b7bb6fa093ccf21..b7a3cad862983e9b7069de6a54bed8ae9b171ded 100644 (file)
@@ -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<std::vector<hobject_t>, hobject_t>
 PGBackend::list_objects(const hobject_t& start, uint64_t limit)
 {
index 103558e414cbce1850750b759a58b39e335c0e00..5edafeb2068fb2ad97fab16498fff41e08e0435b 100644 (file)
@@ -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,