]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
test/librbd: add break_lock test
authorMykola Golub <mgolub@mirantis.com>
Fri, 6 Jan 2017 11:17:56 +0000 (13:17 +0200)
committerMykola Golub <mgolub@mirantis.com>
Mon, 9 Jan 2017 16:25:57 +0000 (18:25 +0200)
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
src/test/librbd/test_librbd.cc

index 0b2e0b2128117bd99ab0c697ba63b27339e5970a..8f5676d8901e3a2284ca22584074563aad2ecdf2 100644 (file)
@@ -183,6 +183,12 @@ public:
     ASSERT_NE("", m_pool_name = create_pool());
   }
 
+  bool is_librados_test_stub() {
+    std::string fsid;
+    EXPECT_EQ(0, _rados.cluster_fsid(&fsid));
+    return fsid == "00000000-1111-2222-3333-444444444444";
+  }
+
   void validate_object_map(rbd_image_t image, bool *passed) {
     uint64_t flags;
     ASSERT_EQ(0, rbd_get_flags(image, &flags));
@@ -5030,6 +5036,59 @@ TEST_F(TestLibRBD, ExclusiveLock)
   rados_ioctx_destroy(ioctx);
 }
 
+TEST_F(TestLibRBD, BreakLock)
+{
+  REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
+  REQUIRE(!is_librados_test_stub());
+
+  static char buf[10];
+
+  rados_t blacklist_cluster;
+  ASSERT_EQ("", connect_cluster(&blacklist_cluster));
+
+  rados_ioctx_t ioctx, blacklist_ioctx;
+  ASSERT_EQ(0, rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx));
+  ASSERT_EQ(0, rados_ioctx_create(blacklist_cluster, m_pool_name.c_str(),
+                                  &blacklist_ioctx));
+
+  std::string name = get_temp_image_name();
+  uint64_t size = 2 << 20;
+  int order = 0;
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+
+  rbd_image_t image, blacklist_image;
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
+  ASSERT_EQ(0, rbd_open(blacklist_ioctx, name.c_str(), &blacklist_image, NULL));
+
+  ASSERT_EQ(0, rbd_metadata_set(image, "rbd_blacklist_on_break_lock", "true"));
+  ASSERT_EQ(0, rbd_lock_acquire(blacklist_image, RBD_LOCK_MODE_EXCLUSIVE));
+
+  rbd_lock_mode_t lock_mode;
+  char *lock_owners[1];
+  size_t max_lock_owners = 1;
+  ASSERT_EQ(0, rbd_lock_get_owners(image, &lock_mode, lock_owners,
+                                   &max_lock_owners));
+  ASSERT_EQ(RBD_LOCK_MODE_EXCLUSIVE, lock_mode);
+  ASSERT_STRNE("", lock_owners[0]);
+  ASSERT_EQ(1U, max_lock_owners);
+
+  ASSERT_EQ(0, rbd_lock_break(image, RBD_LOCK_MODE_EXCLUSIVE, lock_owners[0]));
+  ASSERT_EQ(0, rbd_lock_acquire(image, RBD_LOCK_MODE_EXCLUSIVE));
+  EXPECT_EQ(0, rados_wait_for_latest_osdmap(blacklist_cluster));
+
+  ASSERT_EQ((ssize_t)sizeof(buf), rbd_write(image, 0, sizeof(buf), buf));
+  ASSERT_EQ(-EBLACKLISTED, rbd_write(blacklist_image, 0, sizeof(buf), buf));
+
+  ASSERT_EQ(0, rbd_close(image));
+  ASSERT_EQ(0, rbd_close(blacklist_image));
+
+  rbd_lock_get_owners_cleanup(lock_owners, max_lock_owners);
+
+  rados_ioctx_destroy(ioctx);
+  rados_ioctx_destroy(blacklist_ioctx);
+  rados_shutdown(blacklist_cluster);
+}
+
 TEST_F(TestLibRBD, DiscardAfterWrite)
 {
   CephContext* cct = reinterpret_cast<CephContext*>(_rados.cct());