From ded8bd9c5785fc14b8c6a702ad1a1fb543ccd925 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Thu, 29 Apr 2021 14:24:52 +0800 Subject: [PATCH] crimson/seastore: integrate and test remove/list to SeaStore Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/seastore.cc | 25 +++++++- src/test/crimson/seastore/test_seastore.cc | 68 ++++++++++++++++++---- 2 files changed, 79 insertions(+), 14 deletions(-) diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 3ffa0a4455b21..4afa5057b875a 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -114,8 +114,27 @@ SeaStore::list_objects(CollectionRef ch, const ghobject_t& end, uint64_t limit) const { - return seastar::make_ready_future, ghobject_t>>( - std::make_tuple(std::vector(), 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 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( diff --git a/src/test/crimson/seastore/test_seastore.cc b/src/test/crimson/seastore/test_seastore.cc index efc4d81561f7d..51995e448c95c 100644 --- a/src/test/crimson/seastore/test_seastore.cc +++ b/src/test/crimson/seastore/test_seastore.cc @@ -77,6 +77,34 @@ struct seastore_test_t : std::map 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 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::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(); }); } -- 2.39.5