]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
tests: verify that diff_iterate callbacks can abort diff
authorJason Dillaman <dillaman@redhat.com>
Thu, 21 May 2015 22:17:58 +0000 (18:17 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 10 Aug 2015 15:24:08 +0000 (11:24 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/librbd/test_librbd.cc

index 2252c19fe264d964bafdbaa8c0b02f20108cfd52..c491533d1c29517bb12a8c8b175c5fd2647a88e7 100644 (file)
@@ -2009,6 +2009,11 @@ int iterate_cb(uint64_t off, size_t len, int exists, void *arg)
   return 0;
 }
 
+static int iterate_error_cb(uint64_t off, size_t len, int exists, void *arg)
+{
+  return -EINVAL;
+}
+
 void scribble(librbd::Image& image, int n, int max,
               interval_set<uint64_t> *exists,
               interval_set<uint64_t> *what)
@@ -2406,6 +2411,33 @@ TYPED_TEST(DiffIterateTest, DiffIterateIgnoreParent)
   ASSERT_TRUE(two.subset_of(diff));
 }
 
+TYPED_TEST(DiffIterateTest, DiffIterateCallbackError)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, this->_rados.ioctx_create(this->m_pool_name.c_str(), ioctx));
+
+  {
+    librbd::RBD rbd;
+    librbd::Image image;
+    int order = 0;
+    std::string name = this->get_temp_image_name();
+    uint64_t size = 20 << 20;
+
+    ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+    ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+    interval_set<uint64_t> exists;
+    interval_set<uint64_t> one;
+    scribble(image, 10, 102400, &exists, &one);
+    cout << " wrote " << one << std::endl;
+
+    interval_set<uint64_t> diff;
+    ASSERT_EQ(-EINVAL, image.diff_iterate2(NULL, 0, size, true,
+                                           this->whole_object,
+                                           iterate_error_cb, NULL));
+  }
+  ioctx.close();
+}
 TEST_F(TestLibRBD, ZeroLengthWrite)
 {
   rados_ioctx_t ioctx;