From: Adam Crume Date: Thu, 18 Sep 2014 20:03:49 +0000 (-0700) Subject: rbd: Fix rbd diff for non-existent objects X-Git-Tag: v0.88~140^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F2523%2Fhead;p=ceph.git rbd: Fix rbd diff for non-existent objects Fixes: #6926 Signed-off-by: Adam Crume --- diff --git a/src/librados/snap_set_diff.cc b/src/librados/snap_set_diff.cc index 2cf7c9387456..5db0fb9793c7 100644 --- a/src/librados/snap_set_diff.cc +++ b/src/librados/snap_set_diff.cc @@ -68,8 +68,8 @@ void calc_snap_set_diff(CephContext *cct, const librados::snap_set_t& snap_set, if (end < a) { ldout(cct, 20) << " past end " << end << ", end object does not exist" << dendl; *end_exists = false; + diff->clear(); if (start_size) { - diff->clear(); diff->insert(0, start_size); } break; diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index 2f0e5d26be88..70dc8f599c4a 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -1773,6 +1773,58 @@ TEST(LibRBD, DiffIterateStress) ASSERT_EQ(0, destroy_one_pool_pp(pool_name, rados)); } +TEST(LibRBD, DiffIterateRegression6926) +{ + librados::Rados rados; + librados::IoCtx ioctx; + string pool_name = get_temp_pool_name(); + + ASSERT_EQ("", create_one_pool_pp(pool_name, rados)); + ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx)); + + int seed = getpid(); + cout << "seed " << seed << std::endl; + srand(seed); + + { + librbd::RBD rbd; + librbd::Image image; + int order = 0; + const char *name = "testimg"; + uint64_t size = 20 << 20; + + ASSERT_EQ(0, create_image_pp(rbd, ioctx, name, size, &order)); + ASSERT_EQ(0, rbd.open(ioctx, image, name, NULL)); + + vector extents; + ceph::bufferlist bl; + + ASSERT_EQ(0, image.diff_iterate(NULL, 0, size, + vector_iterate_cb, (void *) &extents)); + ASSERT_EQ(0u, extents.size()); + + ASSERT_EQ(0, image.snap_create("snap1")); + char data[256]; + memset(data, 1, sizeof(data)); + bl.append(data, 256); + ASSERT_EQ(256, image.write(0, 256, bl)); + + extents.clear(); + ASSERT_EQ(0, image.diff_iterate(NULL, 0, size, + vector_iterate_cb, (void *) &extents)); + ASSERT_EQ(1u, extents.size()); + ASSERT_EQ(diff_extent(0, 256, true), extents[0]); + + ASSERT_EQ(0, image.snap_set("snap1")); + extents.clear(); + ASSERT_EQ(0, image.diff_iterate(NULL, 0, size, + vector_iterate_cb, (void *) &extents)); + ASSERT_EQ(0, extents.size()); + } + ioctx.close(); + ASSERT_EQ(0, destroy_one_pool_pp(pool_name, rados)); +} + TEST(LibRBD, ZeroLengthWrite) { rados_t cluster;