]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
test/librados_test_stub: new object handler hook for deletions
authorJason Dillaman <dillaman@redhat.com>
Tue, 10 Apr 2018 20:30:46 +0000 (16:30 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 12 Apr 2018 20:04:07 +0000 (16:04 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/librados_test_stub/MockTestMemCluster.h
src/test/librados_test_stub/TestCluster.h
src/test/librados_test_stub/TestMemCluster.cc
src/test/librados_test_stub/TestMemCluster.h
src/test/librados_test_stub/TestMemIoCtxImpl.cc

index 0cf2a7bc629cc41cb2ea75adbb220b48e50b1ee7..68e639c4b82a68b9fd7b11a60a1e7c75bfbf2965 100644 (file)
@@ -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<librados::MockTestMemRadosClient>(
-      cct, &m_mem_cluster);
+      cct, this);
   }
 
-private:
-  TestMemCluster m_mem_cluster;
-
 };
 
 } // namespace librados
index a931f4b8fc0ffb6f9149471fb265b398a8d5e65c..b20d58bba5ed0dd9d380e0c980597b58876746f6 100644 (file)
@@ -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;
   }
index ef416adbd2dbbc74c3588c704580f923430a1ef6..4b1efcdb57f8d4577f35a68651324ab19cf93d23 100644 (file)
@@ -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;
index f256b5b724fdd68f5a7cdd086bbeb4f07c142375..a285a24cc5c283012f382d2198b6fb5183d63e56 100644 (file)
@@ -27,6 +27,8 @@ public:
   typedef std::map<std::string, bufferlist> FileTMaps;
   typedef std::map<std::string, bufferlist> XAttrs;
   typedef std::map<std::string, XAttrs> FileXAttrs;
+  typedef std::set<ObjectHandler*> ObjectHandlers;
+  typedef std::map<std::string, ObjectHandlers> 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<std::string> m_transactions;
 
+  Pool *get_pool(const Mutex& lock, int64_t pool_id);
+
 };
 
 } // namespace librados
index ca2d2cd3108f09c5b6b1a79a2754e854d6047f95..528383d8f04c738a55015d520f8bdcf9184d56dc 100644 (file)
@@ -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);