]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/seastore: integrate and test remove/list to SeaStore 41075/head
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 29 Apr 2021 06:24:52 +0000 (14:24 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Sat, 8 May 2021 02:07:41 +0000 (10:07 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/seastore.cc
src/test/crimson/seastore/test_seastore.cc

index 3ffa0a4455b21ae2496f7840295aca501724508c..4afa5057b875a7b44a7dd4e2960c53e9865e842e 100644 (file)
@@ -114,8 +114,27 @@ SeaStore::list_objects(CollectionRef ch,
                         const ghobject_t& end,
                         uint64_t limit) const
 {
-  return seastar::make_ready_future<std::tuple<std::vector<ghobject_t>, ghobject_t>>(
-    std::make_tuple(std::vector<ghobject_t>(), end));
+  using RetType = typename OnodeManager::list_onodes_bare_ret;
+  return seastar::do_with(
+      RetType(),
+      [this, start, end, limit] (auto& ret) {
+    return repeat_eagain([this, start, end, limit, &ret] {
+      return seastar::do_with(
+          transaction_manager->create_transaction(),
+          [this, start, end, limit, &ret] (auto& t) {
+        return onode_manager->list_onodes(*t, start, end, limit
+        ).safe_then([&ret] (auto&& _ret) {
+          ret = std::move(_ret);
+        });
+      });
+    }).safe_then([&ret] {
+      return std::move(ret);
+    });
+  }).handle_error(
+    crimson::ct_error::assert_all{
+      "Invalid error in SeaStore::list_objects"
+    }
+  );
 }
 
 seastar::future<CollectionRef> SeaStore::create_new_collection(const coll_t& cid)
@@ -722,7 +741,7 @@ SeaStore::tm_ret SeaStore::_remove(
 {
   LOG_PREFIX(SeaStore::_remove);
   DEBUGT("onode={}", *ctx.transaction, *onode);
-  return tm_ertr::now();
+  return onode_manager->erase_onode(*ctx.transaction, onode);
 }
 
 SeaStore::tm_ret SeaStore::_touch(
index efc4d81561f7d79afa4d2d1b76d0dca324df5545..51995e448c95cdbc65fe97e9381117e0b9e31c78 100644 (file)
@@ -77,6 +77,34 @@ struct seastore_test_t :
     std::map<string, bufferlist> omap;
     bufferlist contents;
 
+    void touch(
+      CTransaction &t) {
+      t.touch(cid, oid);
+    }
+
+    void touch(
+      SeaStore &seastore) {
+      CTransaction t;
+      touch(t);
+      seastore.do_transaction(
+        coll,
+        std::move(t)).get0();
+    }
+
+    void remove(
+      CTransaction &t) {
+      t.remove(cid, oid);
+    }
+
+    void remove(
+      SeaStore &seastore) {
+      CTransaction t;
+      remove(t);
+      seastore.do_transaction(
+        coll,
+        std::move(t)).get0();
+    }
+
     void set_omap(
       CTransaction &t,
       const string &key,
@@ -267,6 +295,28 @@ struct seastore_test_t :
        oid,
        object_state_t{coll_name, coll, oid})).first->second;
   }
+
+  void remove_object(
+    object_state_t &sobj) {
+
+    sobj.remove(*seastore);
+    auto erased = test_objects.erase(sobj.oid);
+    ceph_assert(erased == 1);
+  }
+
+  void validate_objects() const {
+    std::vector<ghobject_t> oids;
+    for (auto& [oid, obj] : test_objects) {
+      oids.emplace_back(oid);
+    }
+    auto ret = seastore->list_objects(
+        coll,
+        ghobject_t(),
+        ghobject_t::get_max(),
+        std::numeric_limits<uint64_t>::max()).get0();
+    EXPECT_EQ(std::get<1>(ret), ghobject_t::get_max());
+    EXPECT_EQ(std::get<0>(ret), oids);
+  }
 };
 
 ghobject_t make_oid(int i) {
@@ -332,20 +382,16 @@ TEST_F(seastore_test_t, meta) {
   });
 }
 
-TEST_F(seastore_test_t, touch_stat)
+TEST_F(seastore_test_t, touch_stat_list_remove)
 {
   run_async([this] {
-    auto test = make_oid(0);
-    {
-      CTransaction t;
-      t.touch(coll_name, test);
-      do_transaction(std::move(t));
-    }
+    auto &test_obj = get_object(make_oid(0));
+    test_obj.touch(*seastore);
+    test_obj.check_size(*seastore);
+    validate_objects();
 
-    auto result = seastore->stat(
-      coll,
-      test).get0();
-    EXPECT_EQ(result.st_size, 0);
+    remove_object(test_obj);
+    validate_objects();
   });
 }