]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: Allow snapshots with the same name in different namespaces 11160/head
authorVictor Denisov <denisovenator@gmail.com>
Thu, 20 Oct 2016 00:31:31 +0000 (17:31 -0700)
committerVictor Denisov <denisovenator@gmail.com>
Sat, 22 Oct 2016 03:53:24 +0000 (20:53 -0700)
Signed-off-by: Victor Denisov <denisovenator@gmail.com>
src/cls/rbd/cls_rbd.cc
src/test/cls_rbd/test_cls_rbd.cc

index 9cff72f885cb3560037426fb3636636b832b0c9c..1d53d4a2ab548029e33d0c9564078d38e214360b 100644 (file)
@@ -1678,7 +1678,9 @@ int snapshot_add(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
                (unsigned long long)snap_id.val);
        return -EIO;
       }
-      if (snap_meta.name == old_meta.name || snap_meta.id == old_meta.id) {
+      if ((snap_meta.name == old_meta.name &&
+           snap_meta.snapshot_namespace == old_meta.snapshot_namespace) ||
+         snap_meta.id == old_meta.id) {
        CLS_LOG(20, "snap_name %s or snap_id %llu matches existing snap %s %llu",
                snap_meta.name.c_str(), (unsigned long long)snap_meta.id.val,
                old_meta.name.c_str(), (unsigned long long)old_meta.id.val);
index 1e0e3ceb9ea549321af4b5333b513b7dbfa82465..af1d1c1deac221cfd60551f521fff432622ba681 100644 (file)
@@ -949,6 +949,7 @@ TEST_F(TestClsRbd, snapshots)
 TEST_F(TestClsRbd, snapshots_namespaces)
 {
   cls::rbd::SnapshotNamespace groupSnapNamespace = cls::rbd::GroupSnapshotNamespace(5, "1018643c9869", 3);
+  cls::rbd::SnapshotNamespace userSnapNamespace = cls::rbd::UserSnapshotNamespace();
   librados::IoCtx ioctx;
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), ioctx));
 
@@ -969,16 +970,18 @@ TEST_F(TestClsRbd, snapshots_namespaces)
   ASSERT_EQ(0, snapshot_add(&ioctx, oid, 0, "snap1"));
 
   librados::ObjectWriteOperation op;
-  ::librbd::cls_client::snapshot_add(&op, 0, "snap1", groupSnapNamespace);
+  ::librbd::cls_client::snapshot_add(&op, 1, "snap1", groupSnapNamespace);
   int r = ioctx.operate(oid, &op);
   ASSERT_EQ(0, r);
 
   ASSERT_EQ(0, get_snapcontext(&ioctx, oid, &snapc));
-  ASSERT_EQ(1u, snapc.snaps.size());
-  ASSERT_EQ(0u, snapc.snaps[0]);
-  ASSERT_EQ(0u, snapc.seq);
+  ASSERT_EQ(2u, snapc.snaps.size());
+  ASSERT_EQ(1u, snapc.snaps[0]);
+  ASSERT_EQ(0u, snapc.snaps[1]);
+  ASSERT_EQ(1u, snapc.seq);
   ASSERT_EQ(0, snap_namespace_list(&ioctx, oid, snapc.snaps, &snap_namespaces));
   ASSERT_EQ(groupSnapNamespace, snap_namespaces[0]);
+  ASSERT_EQ(userSnapNamespace, snap_namespaces[1]);
 }
 
 TEST_F(TestClsRbd, snapid_race)