]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: make snapshots inherit the head's parent
authorSage Weil <sage@inktank.com>
Sat, 16 Jun 2012 00:03:47 +0000 (17:03 -0700)
committerSage Weil <sage@inktank.com>
Tue, 19 Jun 2012 22:08:17 +0000 (15:08 -0700)
When you take a snapshot, the snap gets the current parent of the head, if
any.

Signed-off-by: Sage Weil <sage@inktank.com>
src/cls_rbd.cc
src/test/rbd/test_cls_rbd.cc

index 8f0099b514ea0dde633be89ff4819600cbe887e9..e72f2f6d12b9c1d11d13eba863946ce5ea9fcfbc 100644 (file)
@@ -1051,6 +1051,15 @@ int snapshot_add(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
       last_read = vals.rbegin()->first;
   } while (r == RBD_MAX_KEYS_READ);
 
+  // snapshot inherits parent, if any
+  cls_rbd_parent parent;
+  r = read_key(hctx, "parent", &parent);
+  if (r < 0 && r != -ENOENT)
+    return r;
+  if (r == 0) {
+    snap_meta.parent = parent;
+  }
+
   bufferlist snap_metabl, snap_seqbl;
   ::encode(snap_meta, snap_metabl);
   ::encode(snap_meta.id, snap_seqbl);
index 5fc5fee4900f527a522879bc0086a621baad8e28..130bf97150d09de1246ece5577b51b5a2bc9426e 100644 (file)
@@ -316,6 +316,43 @@ TEST(cls_rbd, parents)
   ASSERT_EQ(-ENOENT, remove_parent(&ioctx, "foo"));
   ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", CEPH_NOSNAP, &pool, &parent, &snapid, &size));
 
+  // snapshots
+  ASSERT_EQ(0, set_parent(&ioctx, "foo", 1, "parent", 3, 10<<20));
+  ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 10, "snap1"));
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(pool, 1);
+  ASSERT_EQ(parent, "parent");
+  ASSERT_EQ(snapid, snapid_t(3));
+  ASSERT_EQ(size, 10ull<<20);
+
+  ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
+  ASSERT_EQ(0, set_parent(&ioctx, "foo", 4, "parent2", 6, 5<<20));
+  ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 11, "snap2"));
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(pool, 1);
+  ASSERT_EQ(parent, "parent");
+  ASSERT_EQ(snapid, snapid_t(3));
+  ASSERT_EQ(size, 10ull<<20);
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", 11, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(pool, 4);
+  ASSERT_EQ(parent, "parent2");
+  ASSERT_EQ(snapid, snapid_t(6));
+  ASSERT_EQ(size, 5ull<<20);
+
+  ASSERT_EQ(0, remove_parent(&ioctx, "foo"));
+  ASSERT_EQ(0, snapshot_add(&ioctx, "foo", 12, "snap3"));
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", 10, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(pool, 1);
+  ASSERT_EQ(parent, "parent");
+  ASSERT_EQ(snapid, snapid_t(3));
+  ASSERT_EQ(size, 10ull<<20);
+  ASSERT_EQ(0, get_parent(&ioctx, "foo", 11, &pool, &parent, &snapid, &size));
+  ASSERT_EQ(pool, 4);
+  ASSERT_EQ(parent, "parent2");
+  ASSERT_EQ(snapid, snapid_t(6));
+  ASSERT_EQ(size, 5ull<<20);
+  ASSERT_EQ(-ENOENT, get_parent(&ioctx, "foo", 12, &pool, &parent, &snapid, &size));
+
   ioctx.close();
   ASSERT_EQ(0, destroy_one_pool_pp(pool_name, rados));
 }