From: Jason Dillaman Date: Tue, 10 Apr 2018 20:30:46 +0000 (-0400) Subject: test/librados_test_stub: new object handler hook for deletions X-Git-Tag: v13.1.0~244^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a795a43696212c5f673c3764694b04abdbe258f2;p=ceph.git test/librados_test_stub: new object handler hook for deletions Signed-off-by: Jason Dillaman --- diff --git a/src/test/librados_test_stub/MockTestMemCluster.h b/src/test/librados_test_stub/MockTestMemCluster.h index 0cf2a7bc629..68e639c4b82 100644 --- a/src/test/librados_test_stub/MockTestMemCluster.h +++ b/src/test/librados_test_stub/MockTestMemCluster.h @@ -14,16 +14,13 @@ namespace librados { class TestRadosClient; -class MockTestMemCluster : public TestCluster { +class MockTestMemCluster : public TestMemCluster { public: TestRadosClient *create_rados_client(CephContext *cct) override { return new ::testing::NiceMock( - cct, &m_mem_cluster); + cct, this); } -private: - TestMemCluster m_mem_cluster; - }; } // namespace librados diff --git a/src/test/librados_test_stub/TestCluster.h b/src/test/librados_test_stub/TestCluster.h index a931f4b8fc0..b20d58bba5e 100644 --- a/src/test/librados_test_stub/TestCluster.h +++ b/src/test/librados_test_stub/TestCluster.h @@ -15,11 +15,22 @@ class TestWatchNotify; class TestCluster { public: + struct ObjectHandler { + virtual ~ObjectHandler() {} + + virtual void handle_removed(TestRadosClient* test_rados_client) = 0; + }; + virtual ~TestCluster() { } virtual TestRadosClient *create_rados_client(CephContext *cct) = 0; + virtual int register_object_handler(int64_t pool_id, const std::string& o, + ObjectHandler* object_handler) = 0; + virtual void unregister_object_handler(int64_t pool_id, const std::string& o, + ObjectHandler* object_handler) = 0; + TestWatchNotify *get_watch_notify() { return &m_watch_notify; } diff --git a/src/test/librados_test_stub/TestMemCluster.cc b/src/test/librados_test_stub/TestMemCluster.cc index ef416adbd2d..4b1efcdb57f 100644 --- a/src/test/librados_test_stub/TestMemCluster.cc +++ b/src/test/librados_test_stub/TestMemCluster.cc @@ -37,6 +37,48 @@ TestRadosClient *TestMemCluster::create_rados_client(CephContext *cct) { return new TestMemRadosClient(cct, this); } +int TestMemCluster::register_object_handler(int64_t pool_id, + const std::string& o, + ObjectHandler* object_handler) { + Mutex::Locker locker(m_lock); + auto pool = get_pool(m_lock, pool_id); + if (pool == nullptr) { + return -ENOENT; + } + + RWLock::WLocker pool_locker(pool->file_lock); + auto file_it = pool->files.find(o); + if (file_it == pool->files.end()) { + return -ENOENT; + } + + auto& object_handlers = pool->file_handlers[o]; + auto it = object_handlers.find(object_handler); + assert(it == object_handlers.end()); + + object_handlers.insert(object_handler); + return 0; +} + +void TestMemCluster::unregister_object_handler(int64_t pool_id, + const std::string& o, + ObjectHandler* object_handler) { + Mutex::Locker locker(m_lock); + auto pool = get_pool(m_lock, pool_id); + if (pool == nullptr) { + return; + } + + RWLock::WLocker pool_locker(pool->file_lock); + auto handlers_it = pool->file_handlers.find(o); + if (handlers_it == pool->file_handlers.end()) { + return; + } + + auto& object_handlers = handlers_it->second; + object_handlers.erase(object_handler); +} + int TestMemCluster::pool_create(const std::string &pool_name) { Mutex::Locker locker(m_lock); if (m_pools.find(pool_name) != m_pools.end()) { @@ -96,6 +138,11 @@ int TestMemCluster::pool_reverse_lookup(int64_t id, std::string *name) { TestMemCluster::Pool *TestMemCluster::get_pool(int64_t pool_id) { Mutex::Locker locker(m_lock); + return get_pool(m_lock, pool_id); +} + +TestMemCluster::Pool *TestMemCluster::get_pool(const Mutex& lock, + int64_t pool_id) { for (auto &pool_pair : m_pools) { if (pool_pair.second->pool_id == pool_id) { return pool_pair.second; diff --git a/src/test/librados_test_stub/TestMemCluster.h b/src/test/librados_test_stub/TestMemCluster.h index f256b5b724f..a285a24cc5c 100644 --- a/src/test/librados_test_stub/TestMemCluster.h +++ b/src/test/librados_test_stub/TestMemCluster.h @@ -27,6 +27,8 @@ public: typedef std::map FileTMaps; typedef std::map XAttrs; typedef std::map FileXAttrs; + typedef std::set ObjectHandlers; + typedef std::map FileHandlers; struct File { File(); @@ -61,6 +63,7 @@ public: FileOMaps file_omaps; FileTMaps file_tmaps; FileXAttrs file_xattrs; + FileHandlers file_handlers; }; TestMemCluster(); @@ -68,6 +71,11 @@ public: TestRadosClient *create_rados_client(CephContext *cct) override; + int register_object_handler(int64_t pool_id, const std::string& o, + ObjectHandler* object_handler) override; + void unregister_object_handler(int64_t pool_id, const std::string& o, + ObjectHandler* object_handler) override; + int pool_create(const std::string &pool_name); int pool_delete(const std::string &pool_name); int pool_get_base_tier(int64_t pool_id, int64_t* base_tier); @@ -105,6 +113,8 @@ private: Cond m_transaction_cond; std::set m_transactions; + Pool *get_pool(const Mutex& lock, int64_t pool_id); + }; } // namespace librados diff --git a/src/test/librados_test_stub/TestMemIoCtxImpl.cc b/src/test/librados_test_stub/TestMemIoCtxImpl.cc index ca2d2cd3108..528383d8f04 100644 --- a/src/test/librados_test_stub/TestMemIoCtxImpl.cc +++ b/src/test/librados_test_stub/TestMemIoCtxImpl.cc @@ -325,11 +325,24 @@ int TestMemIoCtxImpl::remove(const std::string& oid, const SnapContext &snapc) { } file = get_file(oid, true, snapc); - RWLock::WLocker l2(file->lock); - file->exists = false; + { + RWLock::WLocker l2(file->lock); + file->exists = false; + } TestMemCluster::Files::iterator it = m_pool->files.find(oid); assert(it != m_pool->files.end()); + + if (*it->second.rbegin() == file) { + TestMemCluster::ObjectHandlers object_handlers; + std::swap(object_handlers, m_pool->file_handlers[oid]); + m_pool->file_handlers.erase(oid); + + for (auto object_handler : object_handlers) { + object_handler->handle_removed(m_client); + } + } + if (it->second.size() == 1) { m_pool->files.erase(it); m_pool->file_omaps.erase(oid);