From: Jason Dillaman Date: Thu, 21 May 2015 22:17:58 +0000 (-0400) Subject: tests: verify that diff_iterate callbacks can abort diff X-Git-Tag: v9.1.0~370^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=404cab311f215d59ffae298402534625d718ec51;p=ceph.git tests: verify that diff_iterate callbacks can abort diff Signed-off-by: Jason Dillaman --- diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index 2252c19fe264..c491533d1c29 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -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 *exists, interval_set *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 exists; + interval_set one; + scribble(image, 10, 102400, &exists, &one); + cout << " wrote " << one << std::endl; + + interval_set 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;