]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: Fix rbd diff for non-existent objects 2523/head
authorAdam Crume <adamcrume@gmail.com>
Thu, 18 Sep 2014 20:03:49 +0000 (13:03 -0700)
committerAdam Crume <adamcrume@gmail.com>
Thu, 18 Sep 2014 20:03:49 +0000 (13:03 -0700)
Fixes: #6926
Signed-off-by: Adam Crume <adamcrume@gmail.com>
src/librados/snap_set_diff.cc
src/test/librbd/test_librbd.cc

index 2cf7c9387456966ce7657a779598f65987817eda..5db0fb9793c7c5f55897f542a9d9e2f95ce27cfc 100644 (file)
@@ -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;
index 2f0e5d26be888bd209d492543fba0e363063162e..70dc8f599c4ac0536c95ac02f7b573071a5f4794 100644 (file)
@@ -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<diff_extent> 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;