From e8b36ed97ef687f93ec2937da4d19f92c11dc69a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 15 Jun 2012 17:03:47 -0700 Subject: [PATCH] cls_rbd: make snapshots inherit the head's parent When you take a snapshot, the snap gets the current parent of the head, if any. Signed-off-by: Sage Weil --- src/cls_rbd.cc | 9 +++++++++ src/test/rbd/test_cls_rbd.cc | 37 ++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/cls_rbd.cc b/src/cls_rbd.cc index 8f0099b514ea0..e72f2f6d12b9c 100644 --- a/src/cls_rbd.cc +++ b/src/cls_rbd.cc @@ -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); diff --git a/src/test/rbd/test_cls_rbd.cc b/src/test/rbd/test_cls_rbd.cc index 5fc5fee4900f5..130bf97150d09 100644 --- a/src/test/rbd/test_cls_rbd.cc +++ b/src/test/rbd/test_cls_rbd.cc @@ -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)); } -- 2.39.5