]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls/rbd: store original namespace type within trash snapshot namespace
authorJason Dillaman <dillaman@redhat.com>
Tue, 6 Feb 2018 00:04:37 +0000 (19:04 -0500)
committerJason Dillaman <dillaman@redhat.com>
Tue, 6 Feb 2018 00:04:37 +0000 (19:04 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/cls/rbd/cls_rbd.cc
src/cls/rbd/cls_rbd_types.cc
src/cls/rbd/cls_rbd_types.h
src/test/librbd/operation/test_mock_SnapshotRemoveRequest.cc

index 777cdbb524f01847dba48dabf695d0d85eb77599..123f68ad3dba59f70632abf397c12ba908e240f2 100644 (file)
@@ -2055,8 +2055,10 @@ int snapshot_trash_add(cls_method_context_t hctx, bufferlist *in,
 
   if (snap.protection_status != RBD_PROTECTION_STATUS_UNPROTECTED) {
     return -EBUSY;
-  } else if (cls::rbd::get_snap_namespace_type(snap.snapshot_namespace) ==
-               cls::rbd::SNAPSHOT_NAMESPACE_TYPE_TRASH) {
+  }
+
+  auto snap_type = cls::rbd::get_snap_namespace_type(snap.snapshot_namespace);
+  if (snap_type == cls::rbd::SNAPSHOT_NAMESPACE_TYPE_TRASH) {
     return -EEXIST;
   }
 
@@ -2067,7 +2069,8 @@ int snapshot_trash_add(cls_method_context_t hctx, bufferlist *in,
     return r;
   }
 
-  snap.snapshot_namespace = cls::rbd::TrashSnapshotNamespace{snap.name};
+  snap.snapshot_namespace = cls::rbd::TrashSnapshotNamespace{snap_type,
+                                                             snap.name};
   uuid_d uuid_gen;
   uuid_gen.generate_random();
   snap.name = uuid_gen.to_string();
index d709ba80f4ec8c53ff154251e8b8d29409ab0491..301879c3a021df021c9a0cf31e82c73738552e75 100644 (file)
@@ -382,15 +382,22 @@ void GroupSnapshotNamespace::dump(Formatter *f) const {
 void TrashSnapshotNamespace::encode(bufferlist& bl) const {
   using ceph::encode;
   encode(original_name, bl);
+  encode(static_cast<uint32_t>(original_snapshot_namespace_type), bl);
 }
 
 void TrashSnapshotNamespace::decode(bufferlist::iterator& it) {
   using ceph::decode;
   decode(original_name, it);
+  uint32_t snap_type;
+  decode(snap_type, it);
+  original_snapshot_namespace_type = static_cast<SnapshotNamespaceType>(
+    snap_type);
 }
 
 void TrashSnapshotNamespace::dump(Formatter *f) const {
   f->dump_string("original_name", original_name);
+  f->dump_stream("original_snapshot_namespace")
+    << original_snapshot_namespace_type;
 }
 
 class EncodeSnapshotNamespaceVisitor : public boost::static_visitor<void> {
@@ -492,7 +499,9 @@ void SnapshotInfo::generate_test_instances(std::list<SnapshotInfo*> &o) {
   o.push_back(new SnapshotInfo(2ULL,
                                GroupSnapshotNamespace{567, "group1", "snap1"},
                                "snap1", 123, {123456, 0}, 987));
-  o.push_back(new SnapshotInfo(3ULL, TrashSnapshotNamespace{"snap1"},
+  o.push_back(new SnapshotInfo(3ULL,
+                               TrashSnapshotNamespace{
+                                 SNAPSHOT_NAMESPACE_TYPE_USER, "snap1"},
                                "12345", 123, {123456, 0}, 429));
 }
 
@@ -539,21 +548,42 @@ void SnapshotNamespace::generate_test_instances(std::list<SnapshotNamespace*> &o
   o.push_back(new SnapshotNamespace(TrashSnapshotNamespace()));
 }
 
+std::ostream& operator<<(std::ostream& os, const SnapshotNamespaceType& type) {
+  switch (type) {
+  case SNAPSHOT_NAMESPACE_TYPE_USER:
+    os << "user";
+    break;
+  case SNAPSHOT_NAMESPACE_TYPE_GROUP:
+    os << "group";
+    break;
+  case SNAPSHOT_NAMESPACE_TYPE_TRASH:
+    os << "trash";
+    break;
+  default:
+    os << "unknown";
+    break;
+  }
+  return os;
+}
+
 std::ostream& operator<<(std::ostream& os, const UserSnapshotNamespace& ns) {
-  os << "[user]";
+  os << "[" << SNAPSHOT_NAMESPACE_TYPE_USER << "]";
   return os;
 }
 
 std::ostream& operator<<(std::ostream& os, const GroupSnapshotNamespace& ns) {
-  os << "[group"
-     << " group_pool=" << ns.group_pool
-     << " group_id=" << ns.group_id
-     << " group_snapshot_id=" << ns.group_snapshot_id << "]";
+  os << "[" << SNAPSHOT_NAMESPACE_TYPE_GROUP << " "
+     << "group_pool=" << ns.group_pool << ", "
+     << "group_id=" << ns.group_id << ", "
+     << "group_snapshot_id=" << ns.group_snapshot_id << "]";
   return os;
 }
 
 std::ostream& operator<<(std::ostream& os, const TrashSnapshotNamespace& ns) {
-  os << "[trash]";
+  os << "[" << SNAPSHOT_NAMESPACE_TYPE_TRASH << " "
+     << "original_name=" << ns.original_name << ", "
+     << "original_snapshot_namespace=" << ns.original_snapshot_namespace_type
+     << "]";
   return os;
 }
 
index f34b33773c2c7f6b4e1e6b7bce030b51c2b001ca..3d61a66788646f27653002564ecab4a8d7bc6d2f 100644 (file)
@@ -328,10 +328,14 @@ struct TrashSnapshotNamespace {
     SNAPSHOT_NAMESPACE_TYPE_TRASH;
 
   std::string original_name;
+  SnapshotNamespaceType original_snapshot_namespace_type =
+    SNAPSHOT_NAMESPACE_TYPE_USER;
 
   TrashSnapshotNamespace() {}
-  TrashSnapshotNamespace(const std::string& original_name)
-    : original_name(original_name) {}
+  TrashSnapshotNamespace(SnapshotNamespaceType original_snapshot_namespace_type,
+                         const std::string& original_name)
+    : original_name(original_name),
+      original_snapshot_namespace_type(original_snapshot_namespace_type) {}
 
   void encode(bufferlist& bl) const;
   void decode(bufferlist::iterator& it);
@@ -364,6 +368,7 @@ struct UnknownSnapshotNamespace {
   }
 };
 
+std::ostream& operator<<(std::ostream& os, const SnapshotNamespaceType& type);
 std::ostream& operator<<(std::ostream& os, const UserSnapshotNamespace& ns);
 std::ostream& operator<<(std::ostream& os, const GroupSnapshotNamespace& ns);
 std::ostream& operator<<(std::ostream& os, const TrashSnapshotNamespace& ns);
index 4f86b93fec7148d1a015323b7a120fa83f943f54..3747e20d86a911b8782726bca0b7d1aaf276bacd 100644 (file)
@@ -291,7 +291,9 @@ TEST_F(TestMockOperationSnapshotRemoveRequest, SuccessTrash) {
 
   uint64_t snap_id = ictx->snap_info.rbegin()->first;
   expect_snapshot_get(mock_image_ctx,
-                      {snap_id, {cls::rbd::TrashSnapshotNamespace{"snap1"}},
+                      {snap_id,
+                       {cls::rbd::TrashSnapshotNamespace{
+                          cls::rbd::SNAPSHOT_NAMESPACE_TYPE_USER, "snap1"}},
                        "snap1", 123, {}, 0}, 0);
 
   expect_get_parent_spec(mock_image_ctx, 0);