Skip to content

Commit

Permalink
cls_rbd: Allow snapshots with the same name in different namespaces
Browse files Browse the repository at this point in the history
Signed-off-by: Victor Denisov <denisovenator@gmail.com>
  • Loading branch information
VictorDenisov committed Oct 21, 2016
1 parent 6689573 commit 7d4350b
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 5 deletions.
4 changes: 3 additions & 1 deletion src/cls/rbd/cls_rbd.cc
Expand Up @@ -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);
Expand Down
11 changes: 7 additions & 4 deletions src/test/cls_rbd/test_cls_rbd.cc
Expand Up @@ -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));

Expand All @@ -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)
Expand Down

0 comments on commit 7d4350b

Please sign in to comment.