From: Victor Denisov Date: Thu, 20 Oct 2016 00:31:31 +0000 (-0700) Subject: cls_rbd: Allow snapshots with the same name in different namespaces X-Git-Tag: v11.1.0~532^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F11160%2Fhead;p=ceph.git cls_rbd: Allow snapshots with the same name in different namespaces Signed-off-by: Victor Denisov --- diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index 9cff72f885cb..1d53d4a2ab54 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -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); diff --git a/src/test/cls_rbd/test_cls_rbd.cc b/src/test/cls_rbd/test_cls_rbd.cc index 1e0e3ceb9ea5..af1d1c1deac2 100644 --- a/src/test/cls_rbd/test_cls_rbd.cc +++ b/src/test/cls_rbd/test_cls_rbd.cc @@ -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)