From dfc63168ac77b011dfc771cbd2780a941b4269e7 Mon Sep 17 00:00:00 2001 From: Victor Denisov Date: Wed, 19 Oct 2016 17:31:31 -0700 Subject: [PATCH] cls_rbd: Allow snapshots with the same name in different namespaces Signed-off-by: Victor Denisov --- src/cls/rbd/cls_rbd.cc | 4 +++- src/test/cls_rbd/test_cls_rbd.cc | 11 +++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) 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) -- 2.47.3