f->dump_string("group_snapshot_id", group_snapshot_id);
}
+void TrashSnapshotNamespace::encode(bufferlist& bl) const {
+ using ceph::encode;
+ encode(original_name, bl);
+}
+
+void TrashSnapshotNamespace::decode(bufferlist::iterator& it) {
+ using ceph::decode;
+ decode(original_name, it);
+}
+
+void TrashSnapshotNamespace::dump(Formatter *f) const {
+ f->dump_string("original_name", original_name);
+}
+
class EncodeSnapshotNamespaceVisitor : public boost::static_visitor<void> {
public:
explicit EncodeSnapshotNamespaceVisitor(bufferlist &bl) : m_bl(bl) {
o.push_back(new SnapshotInfo(2ULL,
GroupSnapshotNamespace{567, "group1", "snap1"},
"snap1", 123, {123456, 0}));
+ o.push_back(new SnapshotInfo(3ULL, TrashSnapshotNamespace{"snap1"},
+ "12345", 123, {123456, 0}));
}
void SnapshotNamespace::encode(bufferlist& bl) const {
case cls::rbd::SNAPSHOT_NAMESPACE_TYPE_GROUP:
*this = GroupSnapshotNamespace();
break;
+ case cls::rbd::SNAPSHOT_NAMESPACE_TYPE_TRASH:
+ *this = TrashSnapshotNamespace();
+ break;
default:
*this = UnknownSnapshotNamespace();
break;
}
void SnapshotNamespace::dump(Formatter *f) const {
- boost::apply_visitor(DumpSnapshotNamespaceVisitor(f, "snapshot_namespace_type"), *this);
+ boost::apply_visitor(
+ DumpSnapshotNamespaceVisitor(f, "snapshot_namespace_type"), *this);
}
void SnapshotNamespace::generate_test_instances(std::list<SnapshotNamespace*> &o) {
o.push_back(new SnapshotNamespace(UserSnapshotNamespace()));
- o.push_back(new SnapshotNamespace(GroupSnapshotNamespace(0, "10152ae8944a", "2118643c9732")));
- o.push_back(new SnapshotNamespace(GroupSnapshotNamespace(5, "1018643c9869", "33352be8933c")));
+ o.push_back(new SnapshotNamespace(GroupSnapshotNamespace(0, "10152ae8944a",
+ "2118643c9732")));
+ o.push_back(new SnapshotNamespace(GroupSnapshotNamespace(5, "1018643c9869",
+ "33352be8933c")));
+ o.push_back(new SnapshotNamespace(TrashSnapshotNamespace()));
}
std::ostream& operator<<(std::ostream& os, const UserSnapshotNamespace& ns) {
return os;
}
+std::ostream& operator<<(std::ostream& os, const TrashSnapshotNamespace& ns) {
+ os << "[trash]";
+ return os;
+}
+
std::ostream& operator<<(std::ostream& os, const UnknownSnapshotNamespace& ns) {
os << "[unknown]";
return os;
WRITE_CLASS_ENCODER(GroupSpec);
enum SnapshotNamespaceType {
- SNAPSHOT_NAMESPACE_TYPE_USER = 0,
- SNAPSHOT_NAMESPACE_TYPE_GROUP = 1
+ SNAPSHOT_NAMESPACE_TYPE_USER = 0,
+ SNAPSHOT_NAMESPACE_TYPE_GROUP = 1,
+ SNAPSHOT_NAMESPACE_TYPE_TRASH = 2
};
struct UserSnapshotNamespace {
inline bool operator<(const UserSnapshotNamespace& usn) const {
return false;
}
-
};
-std::ostream& operator<<(std::ostream& os, const UserSnapshotNamespace& ns);
-
struct GroupSnapshotNamespace {
static const SnapshotNamespaceType SNAPSHOT_NAMESPACE_TYPE =
SNAPSHOT_NAMESPACE_TYPE_GROUP;
}
return false;
}
-
};
-std::ostream& operator<<(std::ostream& os, const GroupSnapshotNamespace& ns);
+struct TrashSnapshotNamespace {
+ static const SnapshotNamespaceType SNAPSHOT_NAMESPACE_TYPE =
+ SNAPSHOT_NAMESPACE_TYPE_TRASH;
+
+ std::string original_name;
+
+ TrashSnapshotNamespace() {}
+ TrashSnapshotNamespace(const std::string& original_name)
+ : original_name(original_name) {}
+
+ void encode(bufferlist& bl) const;
+ void decode(bufferlist::iterator& it);
+ void dump(Formatter *f) const;
+
+ inline bool operator==(const TrashSnapshotNamespace& usn) const {
+ return true;
+ }
+ inline bool operator<(const TrashSnapshotNamespace& usn) const {
+ return false;
+ }
+};
struct UnknownSnapshotNamespace {
static const SnapshotNamespaceType SNAPSHOT_NAMESPACE_TYPE =
void encode(bufferlist& bl) const {}
void decode(bufferlist::iterator& it) {}
void dump(Formatter *f) const {}
+
inline bool operator==(const UnknownSnapshotNamespace& gsn) const {
return true;
}
}
};
+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);
std::ostream& operator<<(std::ostream& os, const UnknownSnapshotNamespace& ns);
typedef boost::variant<UserSnapshotNamespace,
GroupSnapshotNamespace,
+ TrashSnapshotNamespace,
UnknownSnapshotNamespace> SnapshotNamespaceVariant;
struct SnapshotNamespace : public SnapshotNamespaceVariant {
-
SnapshotNamespace() {
}
} rbd_group_snap_info_t;
typedef enum {
- RBD_SNAP_NAMESPACE_TYPE_USER = 0,
- RBD_SNAP_NAMESPACE_TYPE_GROUP = 1
+ RBD_SNAP_NAMESPACE_TYPE_USER = 0,
+ RBD_SNAP_NAMESPACE_TYPE_GROUP = 1,
+ RBD_SNAP_NAMESPACE_TYPE_TRASH = 2
} rbd_snap_namespace_type_t;
typedef struct {
ctypedef enum rbd_snap_namespace_type_t:
_RBD_SNAP_NAMESPACE_TYPE_USER "RBD_SNAP_NAMESPACE_TYPE_USER"
_RBD_SNAP_NAMESPACE_TYPE_GROUP "RBD_SNAP_NAMESPACE_TYPE_GROUP"
+ _RBD_SNAP_NAMESPACE_TYPE_TRASH "RBD_SNAP_NAMESPACE_TYPE_TRASH"
ctypedef enum rbd_lock_mode_t:
_RBD_LOCK_MODE_EXCLUSIVE "RBD_LOCK_MODE_EXCLUSIVE"
RBD_SNAP_NAMESPACE_TYPE_USER = _RBD_SNAP_NAMESPACE_TYPE_USER
RBD_SNAP_NAMESPACE_TYPE_GROUP = _RBD_SNAP_NAMESPACE_TYPE_GROUP
+RBD_SNAP_NAMESPACE_TYPE_TRASH = _RBD_SNAP_NAMESPACE_TYPE_TRASH
RBD_GROUP_IMAGE_STATE_ATTACHED = _RBD_GROUP_IMAGE_STATE_ATTACHED
RBD_GROUP_IMAGE_STATE_INCOMPLETE = _RBD_GROUP_IMAGE_STATE_INCOMPLETE