1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #ifndef CEPH_CLS_RBD_TYPES_H
5 #define CEPH_CLS_RBD_TYPES_H
7 #include <boost/variant.hpp>
8 #include "include/int_types.h"
9 #include "include/buffer.h"
10 #include "include/encoding.h"
11 #include "include/stringify.h"
12 #include "include/utime.h"
13 #include "msg/msg_types.h"
18 #define RBD_GROUP_REF "rbd_group_ref"
20 namespace ceph
{ class Formatter
; }
25 static const uint32_t MAX_OBJECT_MAP_OBJECT_COUNT
= 256000000;
26 static const std::string RBD_GROUP_IMAGE_KEY_PREFIX
= "image_";
29 DIRECTORY_STATE_READY
= 0,
30 DIRECTORY_STATE_ADD_DISABLED
= 1
33 inline void encode(DirectoryState state
, ceph::buffer::list
& bl
,
36 ceph::encode(static_cast<uint8_t>(state
), bl
);
39 inline void decode(DirectoryState
&state
, ceph::buffer::list::const_iterator
& it
)
42 ceph::decode(int_state
, it
);
43 state
= static_cast<DirectoryState
>(int_state
);
47 MIRROR_MODE_DISABLED
= 0,
48 MIRROR_MODE_IMAGE
= 1,
52 enum GroupImageLinkState
{
53 GROUP_IMAGE_LINK_STATE_ATTACHED
,
54 GROUP_IMAGE_LINK_STATE_INCOMPLETE
57 inline void encode(const GroupImageLinkState
&state
, ceph::buffer::list
& bl
,
61 encode(static_cast<uint8_t>(state
), bl
);
64 inline void decode(GroupImageLinkState
&state
, ceph::buffer::list::const_iterator
& it
)
68 decode(int_state
, it
);
69 state
= static_cast<GroupImageLinkState
>(int_state
);
72 enum MirrorPeerDirection
{
73 MIRROR_PEER_DIRECTION_RX
= 0,
74 MIRROR_PEER_DIRECTION_TX
= 1,
75 MIRROR_PEER_DIRECTION_RX_TX
= 2
78 std::ostream
& operator<<(std::ostream
& os
,
79 MirrorPeerDirection mirror_peer_direction
);
84 MirrorPeer(const std::string
&uuid
,
85 MirrorPeerDirection mirror_peer_direction
,
86 const std::string
& site_name
,
87 const std::string
& client_name
,
88 const std::string
& mirror_uuid
)
89 : uuid(uuid
), mirror_peer_direction(mirror_peer_direction
),
90 site_name(site_name
), client_name(client_name
),
91 mirror_uuid(mirror_uuid
) {
96 MirrorPeerDirection mirror_peer_direction
= MIRROR_PEER_DIRECTION_RX_TX
;
97 std::string site_name
;
98 std::string client_name
; // RX property
99 std::string mirror_uuid
;
102 inline bool is_valid() const {
103 switch (mirror_peer_direction
) {
104 case MIRROR_PEER_DIRECTION_TX
:
106 case MIRROR_PEER_DIRECTION_RX
:
107 case MIRROR_PEER_DIRECTION_RX_TX
:
108 if (client_name
.empty()) {
115 return (!uuid
.empty() && !site_name
.empty());
118 void encode(ceph::buffer::list
&bl
) const;
119 void decode(ceph::buffer::list::const_iterator
&it
);
120 void dump(ceph::Formatter
*f
) const;
122 static void generate_test_instances(std::list
<MirrorPeer
*> &o
);
124 bool operator==(const MirrorPeer
&rhs
) const;
125 bool operator!=(const MirrorPeer
&rhs
) const {
126 return (!(*this == rhs
));
130 std::ostream
& operator<<(std::ostream
& os
, const MirrorMode
& mirror_mode
);
131 std::ostream
& operator<<(std::ostream
& os
, const MirrorPeer
& peer
);
133 WRITE_CLASS_ENCODER(MirrorPeer
);
135 enum MirrorImageMode
{
136 MIRROR_IMAGE_MODE_JOURNAL
= 0,
137 MIRROR_IMAGE_MODE_SNAPSHOT
= 1,
140 enum MirrorImageState
{
141 MIRROR_IMAGE_STATE_DISABLING
= 0,
142 MIRROR_IMAGE_STATE_ENABLED
= 1,
143 MIRROR_IMAGE_STATE_DISABLED
= 2,
144 MIRROR_IMAGE_STATE_CREATING
= 3,
150 MirrorImage(MirrorImageMode mode
, const std::string
&global_image_id
,
151 MirrorImageState state
)
152 : mode(mode
), global_image_id(global_image_id
), state(state
) {
155 MirrorImageMode mode
= MIRROR_IMAGE_MODE_JOURNAL
;
156 std::string global_image_id
;
157 MirrorImageState state
= MIRROR_IMAGE_STATE_DISABLING
;
159 void encode(ceph::buffer::list
&bl
) const;
160 void decode(ceph::buffer::list::const_iterator
&it
);
161 void dump(ceph::Formatter
*f
) const;
163 static void generate_test_instances(std::list
<MirrorImage
*> &o
);
165 bool operator==(const MirrorImage
&rhs
) const;
166 bool operator<(const MirrorImage
&rhs
) const;
169 std::ostream
& operator<<(std::ostream
& os
, const MirrorImageMode
& mirror_mode
);
170 std::ostream
& operator<<(std::ostream
& os
, const MirrorImageState
& mirror_state
);
171 std::ostream
& operator<<(std::ostream
& os
, const MirrorImage
& mirror_image
);
173 WRITE_CLASS_ENCODER(MirrorImage
);
175 enum MirrorImageStatusState
{
176 MIRROR_IMAGE_STATUS_STATE_UNKNOWN
= 0,
177 MIRROR_IMAGE_STATUS_STATE_ERROR
= 1,
178 MIRROR_IMAGE_STATUS_STATE_SYNCING
= 2,
179 MIRROR_IMAGE_STATUS_STATE_STARTING_REPLAY
= 3,
180 MIRROR_IMAGE_STATUS_STATE_REPLAYING
= 4,
181 MIRROR_IMAGE_STATUS_STATE_STOPPING_REPLAY
= 5,
182 MIRROR_IMAGE_STATUS_STATE_STOPPED
= 6,
185 inline void encode(const MirrorImageStatusState
&state
, ceph::buffer::list
& bl
,
189 encode(static_cast<uint8_t>(state
), bl
);
192 inline void decode(MirrorImageStatusState
&state
,
193 ceph::buffer::list::const_iterator
& it
)
197 decode(int_state
, it
);
198 state
= static_cast<MirrorImageStatusState
>(int_state
);
201 std::ostream
& operator<<(std::ostream
& os
, const MirrorImageStatusState
& state
);
203 struct MirrorImageSiteStatus
{
204 static const std::string LOCAL_MIRROR_UUID
;
206 MirrorImageSiteStatus() {}
207 MirrorImageSiteStatus(const std::string
& mirror_uuid
,
208 MirrorImageStatusState state
,
209 const std::string
&description
)
210 : mirror_uuid(mirror_uuid
), state(state
), description(description
) {
213 std::string mirror_uuid
= LOCAL_MIRROR_UUID
;
214 MirrorImageStatusState state
= MIRROR_IMAGE_STATUS_STATE_UNKNOWN
;
215 std::string description
;
219 void encode_meta(uint8_t version
, ceph::buffer::list
&bl
) const;
220 void decode_meta(uint8_t version
, ceph::buffer::list::const_iterator
&it
);
222 void encode(ceph::buffer::list
&bl
) const;
223 void decode(ceph::buffer::list::const_iterator
&it
);
224 void dump(ceph::Formatter
*f
) const;
226 std::string
state_to_string() const;
228 bool operator==(const MirrorImageSiteStatus
&rhs
) const;
230 static void generate_test_instances(std::list
<MirrorImageSiteStatus
*> &o
);
232 WRITE_CLASS_ENCODER(MirrorImageSiteStatus
);
234 std::ostream
& operator<<(std::ostream
& os
, const MirrorImageSiteStatus
& status
);
236 struct MirrorImageSiteStatusOnDisk
: cls::rbd::MirrorImageSiteStatus
{
237 entity_inst_t origin
;
239 MirrorImageSiteStatusOnDisk() {
241 MirrorImageSiteStatusOnDisk(const cls::rbd::MirrorImageSiteStatus
&status
) :
242 cls::rbd::MirrorImageSiteStatus(status
) {
245 void encode_meta(ceph::buffer::list
&bl
, uint64_t features
) const;
246 void decode_meta(ceph::buffer::list::const_iterator
&it
);
248 void encode(ceph::buffer::list
&bl
, uint64_t features
) const;
249 void decode(ceph::buffer::list::const_iterator
&it
);
251 static void generate_test_instances(
252 std::list
<MirrorImageSiteStatusOnDisk
*> &o
);
254 WRITE_CLASS_ENCODER_FEATURES(MirrorImageSiteStatusOnDisk
)
256 struct MirrorImageStatus
{
257 typedef std::list
<MirrorImageSiteStatus
> MirrorImageSiteStatuses
;
259 MirrorImageStatus() {}
260 MirrorImageStatus(const MirrorImageSiteStatuses
& statuses
)
261 : mirror_image_site_statuses(statuses
) {
264 MirrorImageSiteStatuses mirror_image_site_statuses
;
266 int get_local_mirror_image_site_status(MirrorImageSiteStatus
* status
) const;
268 void encode(ceph::buffer::list
&bl
) const;
269 void decode(ceph::buffer::list::const_iterator
&it
);
270 void dump(ceph::Formatter
*f
) const;
272 bool operator==(const MirrorImageStatus
& rhs
) const;
274 static void generate_test_instances(std::list
<MirrorImageStatus
*> &o
);
276 WRITE_CLASS_ENCODER(MirrorImageStatus
);
278 std::ostream
& operator<<(std::ostream
& os
, const MirrorImageStatus
& status
);
280 struct ParentImageSpec
{
281 int64_t pool_id
= -1;
282 std::string pool_namespace
;
283 std::string image_id
;
284 snapid_t snap_id
= CEPH_NOSNAP
;
288 ParentImageSpec(int64_t pool_id
, const std::string
& pool_namespace
,
289 const std::string
& image_id
, snapid_t snap_id
)
290 : pool_id(pool_id
), pool_namespace(pool_namespace
), image_id(image_id
),
294 bool exists() const {
295 return (pool_id
>= 0 && !image_id
.empty() && snap_id
!= CEPH_NOSNAP
);
298 bool operator==(const ParentImageSpec
& rhs
) const {
299 return ((pool_id
== rhs
.pool_id
) &&
300 (pool_namespace
== rhs
.pool_namespace
) &&
301 (image_id
== rhs
.image_id
) &&
302 (snap_id
== rhs
.snap_id
));
305 bool operator!=(const ParentImageSpec
& rhs
) const {
306 return !(*this == rhs
);
309 void encode(ceph::buffer::list
&bl
) const;
310 void decode(ceph::buffer::list::const_iterator
&it
);
311 void dump(ceph::Formatter
*f
) const;
313 static void generate_test_instances(std::list
<ParentImageSpec
*> &o
);
316 WRITE_CLASS_ENCODER(ParentImageSpec
);
318 std::ostream
& operator<<(std::ostream
& os
, const ParentImageSpec
& rhs
);
320 struct ChildImageSpec
{
321 int64_t pool_id
= -1;
322 std::string pool_namespace
;
323 std::string image_id
;
326 ChildImageSpec(int64_t pool_id
, const std::string
& pool_namespace
,
327 const std::string
& image_id
)
328 : pool_id(pool_id
), pool_namespace(pool_namespace
), image_id(image_id
) {
331 void encode(ceph::buffer::list
&bl
) const;
332 void decode(ceph::buffer::list::const_iterator
&it
);
333 void dump(ceph::Formatter
*f
) const;
335 static void generate_test_instances(std::list
<ChildImageSpec
*> &o
);
337 inline bool operator==(const ChildImageSpec
& rhs
) const {
338 return (pool_id
== rhs
.pool_id
&&
339 pool_namespace
== rhs
.pool_namespace
&&
340 image_id
== rhs
.image_id
);
342 inline bool operator<(const ChildImageSpec
& rhs
) const {
343 if (pool_id
!= rhs
.pool_id
) {
344 return pool_id
< rhs
.pool_id
;
346 if (pool_namespace
!= rhs
.pool_namespace
) {
347 return pool_namespace
< rhs
.pool_namespace
;
349 return image_id
< rhs
.image_id
;
352 WRITE_CLASS_ENCODER(ChildImageSpec
);
354 std::ostream
& operator<<(std::ostream
& os
, const ChildImageSpec
& rhs
);
356 typedef std::set
<ChildImageSpec
> ChildImageSpecs
;
358 struct GroupImageSpec
{
361 GroupImageSpec(const std::string
&image_id
, int64_t pool_id
)
362 : image_id(image_id
), pool_id(pool_id
) {}
364 static int from_key(const std::string
&image_key
, GroupImageSpec
*spec
);
366 std::string image_id
;
367 int64_t pool_id
= -1;
369 void encode(ceph::buffer::list
&bl
) const;
370 void decode(ceph::buffer::list::const_iterator
&it
);
371 void dump(ceph::Formatter
*f
) const;
373 static void generate_test_instances(std::list
<GroupImageSpec
*> &o
);
375 std::string
image_key();
378 WRITE_CLASS_ENCODER(GroupImageSpec
);
380 struct GroupImageStatus
{
381 GroupImageStatus() {}
382 GroupImageStatus(const std::string
&image_id
,
384 GroupImageLinkState state
)
385 : spec(image_id
, pool_id
), state(state
) {}
387 GroupImageStatus(GroupImageSpec spec
,
388 GroupImageLinkState state
)
389 : spec(spec
), state(state
) {}
392 GroupImageLinkState state
= GROUP_IMAGE_LINK_STATE_INCOMPLETE
;
394 void encode(ceph::buffer::list
&bl
) const;
395 void decode(ceph::buffer::list::const_iterator
&it
);
396 void dump(ceph::Formatter
*f
) const;
398 static void generate_test_instances(std::list
<GroupImageStatus
*> &o
);
400 std::string
state_to_string() const;
403 WRITE_CLASS_ENCODER(GroupImageStatus
);
407 GroupSpec(const std::string
&group_id
, int64_t pool_id
)
408 : group_id(group_id
), pool_id(pool_id
) {}
410 std::string group_id
;
411 int64_t pool_id
= -1;
413 void encode(ceph::buffer::list
&bl
) const;
414 void decode(ceph::buffer::list::const_iterator
&it
);
415 void dump(ceph::Formatter
*f
) const;
416 bool is_valid() const;
418 static void generate_test_instances(std::list
<GroupSpec
*> &o
);
421 WRITE_CLASS_ENCODER(GroupSpec
);
423 enum SnapshotNamespaceType
{
424 SNAPSHOT_NAMESPACE_TYPE_USER
= 0,
425 SNAPSHOT_NAMESPACE_TYPE_GROUP
= 1,
426 SNAPSHOT_NAMESPACE_TYPE_TRASH
= 2,
427 SNAPSHOT_NAMESPACE_TYPE_MIRROR
= 3,
430 struct UserSnapshotNamespace
{
431 static const SnapshotNamespaceType SNAPSHOT_NAMESPACE_TYPE
=
432 SNAPSHOT_NAMESPACE_TYPE_USER
;
434 UserSnapshotNamespace() {}
436 void encode(ceph::buffer::list
& bl
) const {}
437 void decode(ceph::buffer::list::const_iterator
& it
) {}
439 void dump(ceph::Formatter
*f
) const {}
441 inline bool operator==(const UserSnapshotNamespace
& usn
) const {
445 inline bool operator<(const UserSnapshotNamespace
& usn
) const {
450 struct GroupSnapshotNamespace
{
451 static const SnapshotNamespaceType SNAPSHOT_NAMESPACE_TYPE
=
452 SNAPSHOT_NAMESPACE_TYPE_GROUP
;
454 GroupSnapshotNamespace() {}
456 GroupSnapshotNamespace(int64_t _group_pool
,
457 const std::string
&_group_id
,
458 const std::string
&_group_snapshot_id
)
459 : group_id(_group_id
), group_pool(_group_pool
),
460 group_snapshot_id(_group_snapshot_id
) {}
462 std::string group_id
;
463 int64_t group_pool
= 0;
464 std::string group_snapshot_id
;
466 void encode(ceph::buffer::list
& bl
) const;
467 void decode(ceph::buffer::list::const_iterator
& it
);
469 void dump(ceph::Formatter
*f
) const;
471 inline bool operator==(const GroupSnapshotNamespace
& gsn
) const {
472 return group_pool
== gsn
.group_pool
&&
473 group_id
== gsn
.group_id
&&
474 group_snapshot_id
== gsn
.group_snapshot_id
;
477 inline bool operator<(const GroupSnapshotNamespace
& gsn
) const {
478 if (group_pool
< gsn
.group_pool
) {
480 } else if (group_id
< gsn
.group_id
) {
483 return (group_snapshot_id
< gsn
.group_snapshot_id
);
489 struct TrashSnapshotNamespace
{
490 static const SnapshotNamespaceType SNAPSHOT_NAMESPACE_TYPE
=
491 SNAPSHOT_NAMESPACE_TYPE_TRASH
;
493 std::string original_name
;
494 SnapshotNamespaceType original_snapshot_namespace_type
=
495 SNAPSHOT_NAMESPACE_TYPE_USER
;
497 TrashSnapshotNamespace() {}
498 TrashSnapshotNamespace(SnapshotNamespaceType original_snapshot_namespace_type
,
499 const std::string
& original_name
)
500 : original_name(original_name
),
501 original_snapshot_namespace_type(original_snapshot_namespace_type
) {}
503 void encode(ceph::buffer::list
& bl
) const;
504 void decode(ceph::buffer::list::const_iterator
& it
);
505 void dump(ceph::Formatter
*f
) const;
507 inline bool operator==(const TrashSnapshotNamespace
& usn
) const {
510 inline bool operator<(const TrashSnapshotNamespace
& usn
) const {
515 enum MirrorSnapshotState
{
516 MIRROR_SNAPSHOT_STATE_PRIMARY
= 0,
517 MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED
= 1,
518 MIRROR_SNAPSHOT_STATE_NON_PRIMARY
= 2,
519 MIRROR_SNAPSHOT_STATE_NON_PRIMARY_DEMOTED
= 3,
522 inline void encode(const MirrorSnapshotState
&state
, ceph::buffer::list
& bl
,
523 uint64_t features
=0) {
525 encode(static_cast<uint8_t>(state
), bl
);
528 inline void decode(MirrorSnapshotState
&state
, ceph::buffer::list::const_iterator
& it
) {
531 decode(int_state
, it
);
532 state
= static_cast<MirrorSnapshotState
>(int_state
);
535 std::ostream
& operator<<(std::ostream
& os
, MirrorSnapshotState type
);
537 typedef std::map
<uint64_t, uint64_t> SnapSeqs
;
539 struct MirrorSnapshotNamespace
{
540 static const SnapshotNamespaceType SNAPSHOT_NAMESPACE_TYPE
=
541 SNAPSHOT_NAMESPACE_TYPE_MIRROR
;
543 MirrorSnapshotState state
= MIRROR_SNAPSHOT_STATE_NON_PRIMARY
;
544 bool complete
= false;
545 std::set
<std::string
> mirror_peer_uuids
;
547 std::string primary_mirror_uuid
;
549 snapid_t primary_snap_id
= CEPH_NOSNAP
;
550 snapid_t clean_since_snap_id
;
552 uint64_t last_copied_object_number
= 0;
555 MirrorSnapshotNamespace() {
557 MirrorSnapshotNamespace(MirrorSnapshotState state
,
558 const std::set
<std::string
> &mirror_peer_uuids
,
559 const std::string
& primary_mirror_uuid
,
560 snapid_t primary_snap_id
)
561 : state(state
), mirror_peer_uuids(mirror_peer_uuids
),
562 primary_mirror_uuid(primary_mirror_uuid
),
563 primary_snap_id(primary_snap_id
) {
565 MirrorSnapshotNamespace(MirrorSnapshotState state
,
566 const std::set
<std::string
> &mirror_peer_uuids
,
567 const std::string
& primary_mirror_uuid
,
568 snapid_t primary_snap_id
,
570 uint64_t last_copied_object_number
,
571 const SnapSeqs
& snap_seqs
)
572 : state(state
), complete(complete
), mirror_peer_uuids(mirror_peer_uuids
),
573 primary_mirror_uuid(primary_mirror_uuid
),
574 primary_snap_id(primary_snap_id
),
575 last_copied_object_number(last_copied_object_number
),
576 snap_seqs(snap_seqs
) {
579 inline bool is_primary() const {
580 return (state
== MIRROR_SNAPSHOT_STATE_PRIMARY
||
581 state
== MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED
);
584 inline bool is_non_primary() const {
585 return (state
== MIRROR_SNAPSHOT_STATE_NON_PRIMARY
||
586 state
== MIRROR_SNAPSHOT_STATE_NON_PRIMARY_DEMOTED
);
589 inline bool is_demoted() const {
590 return (state
== MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED
||
591 state
== MIRROR_SNAPSHOT_STATE_NON_PRIMARY_DEMOTED
);
594 inline bool is_orphan() const {
595 return (is_non_primary() &&
596 primary_mirror_uuid
.empty() &&
597 primary_snap_id
== CEPH_NOSNAP
);
600 void encode(ceph::buffer::list
& bl
) const;
601 void decode(ceph::buffer::list::const_iterator
& it
);
603 void dump(ceph::Formatter
*f
) const;
605 inline bool operator==(const MirrorSnapshotNamespace
& rhs
) const {
606 return state
== rhs
.state
&&
607 complete
== rhs
.complete
&&
608 mirror_peer_uuids
== rhs
.mirror_peer_uuids
&&
609 primary_mirror_uuid
== rhs
.primary_mirror_uuid
&&
610 primary_snap_id
== rhs
.primary_snap_id
&&
611 last_copied_object_number
== rhs
.last_copied_object_number
&&
612 snap_seqs
== rhs
.snap_seqs
;
615 inline bool operator<(const MirrorSnapshotNamespace
& rhs
) const {
616 if (state
!= rhs
.state
) {
617 return state
< rhs
.state
;
618 } else if (complete
!= rhs
.complete
) {
619 return complete
< rhs
.complete
;
620 } else if (mirror_peer_uuids
!= rhs
.mirror_peer_uuids
) {
621 return mirror_peer_uuids
< rhs
.mirror_peer_uuids
;
622 } else if (primary_mirror_uuid
!= rhs
.primary_mirror_uuid
) {
623 return primary_mirror_uuid
< rhs
.primary_mirror_uuid
;
624 } else if (primary_snap_id
!= rhs
.primary_snap_id
) {
625 return primary_snap_id
< rhs
.primary_snap_id
;
626 } else if (last_copied_object_number
!= rhs
.last_copied_object_number
) {
627 return last_copied_object_number
< rhs
.last_copied_object_number
;
629 return snap_seqs
< rhs
.snap_seqs
;
634 struct UnknownSnapshotNamespace
{
635 static const SnapshotNamespaceType SNAPSHOT_NAMESPACE_TYPE
=
636 static_cast<SnapshotNamespaceType
>(-1);
638 UnknownSnapshotNamespace() {}
640 void encode(ceph::buffer::list
& bl
) const {}
641 void decode(ceph::buffer::list::const_iterator
& it
) {}
642 void dump(ceph::Formatter
*f
) const {}
644 inline bool operator==(const UnknownSnapshotNamespace
& gsn
) const {
648 inline bool operator<(const UnknownSnapshotNamespace
& gsn
) const {
653 std::ostream
& operator<<(std::ostream
& os
, const SnapshotNamespaceType
& type
);
654 std::ostream
& operator<<(std::ostream
& os
, const UserSnapshotNamespace
& ns
);
655 std::ostream
& operator<<(std::ostream
& os
, const GroupSnapshotNamespace
& ns
);
656 std::ostream
& operator<<(std::ostream
& os
, const TrashSnapshotNamespace
& ns
);
657 std::ostream
& operator<<(std::ostream
& os
, const MirrorSnapshotNamespace
& ns
);
658 std::ostream
& operator<<(std::ostream
& os
, const UnknownSnapshotNamespace
& ns
);
660 typedef boost::variant
<UserSnapshotNamespace
,
661 GroupSnapshotNamespace
,
662 TrashSnapshotNamespace
,
663 MirrorSnapshotNamespace
,
664 UnknownSnapshotNamespace
> SnapshotNamespaceVariant
;
666 struct SnapshotNamespace
: public SnapshotNamespaceVariant
{
667 SnapshotNamespace() {
670 template <typename T
>
671 SnapshotNamespace(T
&& t
) : SnapshotNamespaceVariant(std::forward
<T
>(t
)) {
674 void encode(ceph::buffer::list
& bl
) const;
675 void decode(ceph::buffer::list::const_iterator
& it
);
676 void dump(ceph::Formatter
*f
) const;
678 static void generate_test_instances(std::list
<SnapshotNamespace
*> &o
);
680 inline bool operator==(const SnapshotNamespaceVariant
& sn
) const {
681 return static_cast<const SnapshotNamespaceVariant
&>(*this) == sn
;
683 inline bool operator<(const SnapshotNamespaceVariant
& sn
) const {
684 return static_cast<const SnapshotNamespaceVariant
&>(*this) < sn
;
686 inline bool operator!=(const SnapshotNamespaceVariant
& sn
) const {
687 return !(*this == sn
);
690 WRITE_CLASS_ENCODER(SnapshotNamespace
);
692 SnapshotNamespaceType
get_snap_namespace_type(
693 const SnapshotNamespace
& snapshot_namespace
);
695 struct SnapshotInfo
{
696 snapid_t id
= CEPH_NOSNAP
;
697 cls::rbd::SnapshotNamespace snapshot_namespace
= {UserSnapshotNamespace
{}};
699 uint64_t image_size
= 0;
701 uint32_t child_count
= 0;
705 SnapshotInfo(snapid_t id
,
706 const cls::rbd::SnapshotNamespace
& snapshot_namespace
,
707 const std::string
& name
, uint64_t image_size
,
708 const utime_t
& timestamp
, uint32_t child_count
)
709 : id(id
), snapshot_namespace(snapshot_namespace
),
710 name(name
), image_size(image_size
), timestamp(timestamp
),
711 child_count(child_count
) {
714 void encode(ceph::buffer::list
& bl
) const;
715 void decode(ceph::buffer::list::const_iterator
& it
);
716 void dump(ceph::Formatter
*f
) const;
718 static void generate_test_instances(std::list
<SnapshotInfo
*> &o
);
720 WRITE_CLASS_ENCODER(SnapshotInfo
);
722 enum GroupSnapshotState
{
723 GROUP_SNAPSHOT_STATE_INCOMPLETE
= 0,
724 GROUP_SNAPSHOT_STATE_COMPLETE
= 1,
727 inline void encode(const GroupSnapshotState
&state
, ceph::buffer::list
& bl
, uint64_t features
=0)
730 encode(static_cast<uint8_t>(state
), bl
);
733 inline void decode(GroupSnapshotState
&state
, ceph::buffer::list::const_iterator
& it
)
737 decode(int_state
, it
);
738 state
= static_cast<GroupSnapshotState
>(int_state
);
741 struct ImageSnapshotSpec
{
743 std::string image_id
;
746 ImageSnapshotSpec() {}
747 ImageSnapshotSpec(int64_t _pool
,
748 std::string _image_id
,
749 snapid_t _snap_id
) : pool(_pool
),
753 void encode(ceph::buffer::list
& bl
) const;
754 void decode(ceph::buffer::list::const_iterator
& it
);
756 void dump(ceph::Formatter
*f
) const;
758 static void generate_test_instances(std::list
<ImageSnapshotSpec
*> &o
);
760 WRITE_CLASS_ENCODER(ImageSnapshotSpec
);
762 struct GroupSnapshot
{
765 GroupSnapshotState state
= GROUP_SNAPSHOT_STATE_INCOMPLETE
;
768 GroupSnapshot(std::string _id
,
770 GroupSnapshotState _state
) : id(_id
),
774 std::vector
<ImageSnapshotSpec
> snaps
;
776 void encode(ceph::buffer::list
& bl
) const;
777 void decode(ceph::buffer::list::const_iterator
& it
);
778 void dump(ceph::Formatter
*f
) const;
780 static void generate_test_instances(std::list
<GroupSnapshot
*> &o
);
782 WRITE_CLASS_ENCODER(GroupSnapshot
);
783 enum TrashImageSource
{
784 TRASH_IMAGE_SOURCE_USER
= 0,
785 TRASH_IMAGE_SOURCE_MIRRORING
= 1,
786 TRASH_IMAGE_SOURCE_MIGRATION
= 2,
787 TRASH_IMAGE_SOURCE_REMOVING
= 3,
788 TRASH_IMAGE_SOURCE_USER_PARENT
= 4,
791 inline std::ostream
& operator<<(std::ostream
& os
,
792 const TrashImageSource
& source
) {
794 case TRASH_IMAGE_SOURCE_USER
:
797 case TRASH_IMAGE_SOURCE_MIRRORING
:
800 case TRASH_IMAGE_SOURCE_MIGRATION
:
803 case TRASH_IMAGE_SOURCE_REMOVING
:
807 os
<< "unknown (" << static_cast<uint32_t>(source
) << ")";
813 inline void encode(const TrashImageSource
&source
, ceph::buffer::list
& bl
,
817 encode(static_cast<uint8_t>(source
), bl
);
820 inline void decode(TrashImageSource
&source
, ceph::buffer::list::const_iterator
& it
)
824 decode(int_source
, it
);
825 source
= static_cast<TrashImageSource
>(int_source
);
828 enum TrashImageState
{
829 TRASH_IMAGE_STATE_NORMAL
= 0,
830 TRASH_IMAGE_STATE_MOVING
= 1,
831 TRASH_IMAGE_STATE_REMOVING
= 2,
832 TRASH_IMAGE_STATE_RESTORING
= 3
835 inline void encode(const TrashImageState
&state
, ceph::buffer::list
&bl
)
838 encode(static_cast<uint8_t>(state
), bl
);
841 inline void decode(TrashImageState
&state
, ceph::buffer::list::const_iterator
&it
)
845 decode(int_state
, it
);
846 state
= static_cast<TrashImageState
>(int_state
);
849 struct TrashImageSpec
{
850 TrashImageSource source
= TRASH_IMAGE_SOURCE_USER
;
852 utime_t deletion_time
; // time of deletion
853 utime_t deferment_end_time
;
854 TrashImageState state
= TRASH_IMAGE_STATE_NORMAL
;
857 TrashImageSpec(TrashImageSource source
, const std::string
&name
,
858 const utime_t
& deletion_time
,
859 const utime_t
& deferment_end_time
)
860 : source(source
), name(name
), deletion_time(deletion_time
),
861 deferment_end_time(deferment_end_time
) {
864 void encode(ceph::buffer::list
&bl
) const;
865 void decode(ceph::buffer::list::const_iterator
& it
);
866 void dump(ceph::Formatter
*f
) const;
868 inline bool operator==(const TrashImageSpec
& rhs
) const {
869 return (source
== rhs
.source
&&
871 deletion_time
== rhs
.deletion_time
&&
872 deferment_end_time
== rhs
.deferment_end_time
);
875 WRITE_CLASS_ENCODER(TrashImageSpec
);
877 struct MirrorImageMap
{
881 MirrorImageMap(const std::string
&instance_id
, utime_t mapped_time
,
882 const ceph::buffer::list
&data
)
883 : instance_id(instance_id
),
884 mapped_time(mapped_time
),
888 std::string instance_id
;
890 ceph::buffer::list data
;
892 void encode(ceph::buffer::list
&bl
) const;
893 void decode(ceph::buffer::list::const_iterator
&it
);
894 void dump(ceph::Formatter
*f
) const;
896 static void generate_test_instances(std::list
<MirrorImageMap
*> &o
);
898 bool operator==(const MirrorImageMap
&rhs
) const;
899 bool operator<(const MirrorImageMap
&rhs
) const;
902 std::ostream
& operator<<(std::ostream
& os
, const MirrorImageMap
&image_map
);
904 WRITE_CLASS_ENCODER(MirrorImageMap
);
906 enum MigrationHeaderType
{
907 MIGRATION_HEADER_TYPE_SRC
= 1,
908 MIGRATION_HEADER_TYPE_DST
= 2,
911 inline void encode(const MigrationHeaderType
&type
, ceph::buffer::list
& bl
) {
913 encode(static_cast<uint8_t>(type
), bl
);
916 inline void decode(MigrationHeaderType
&type
, ceph::buffer::list::const_iterator
& it
) {
919 decode(int_type
, it
);
920 type
= static_cast<MigrationHeaderType
>(int_type
);
923 enum MigrationState
{
924 MIGRATION_STATE_ERROR
= 0,
925 MIGRATION_STATE_PREPARING
= 1,
926 MIGRATION_STATE_PREPARED
= 2,
927 MIGRATION_STATE_EXECUTING
= 3,
928 MIGRATION_STATE_EXECUTED
= 4,
929 MIGRATION_STATE_ABORTING
= 5,
932 inline void encode(const MigrationState
&state
, ceph::buffer::list
& bl
) {
934 encode(static_cast<uint8_t>(state
), bl
);
937 inline void decode(MigrationState
&state
, ceph::buffer::list::const_iterator
& it
) {
940 decode(int_state
, it
);
941 state
= static_cast<MigrationState
>(int_state
);
944 std::ostream
& operator<<(std::ostream
& os
,
945 const MigrationState
& migration_state
);
947 struct MigrationSpec
{
948 MigrationHeaderType header_type
= MIGRATION_HEADER_TYPE_SRC
;
949 int64_t pool_id
= -1;
950 std::string pool_namespace
;
951 std::string image_name
;
952 std::string image_id
;
953 std::string source_spec
;
954 std::map
<uint64_t, uint64_t> snap_seqs
;
955 uint64_t overlap
= 0;
956 bool flatten
= false;
957 bool mirroring
= false;
958 MirrorImageMode mirror_image_mode
= MIRROR_IMAGE_MODE_JOURNAL
;
959 MigrationState state
= MIGRATION_STATE_ERROR
;
960 std::string state_description
;
964 MigrationSpec(MigrationHeaderType header_type
, int64_t pool_id
,
965 const std::string
& pool_namespace
,
966 const std::string
& image_name
, const std::string
&image_id
,
967 const std::string
& source_spec
,
968 const std::map
<uint64_t, uint64_t> &snap_seqs
, uint64_t overlap
,
969 bool mirroring
, MirrorImageMode mirror_image_mode
, bool flatten
,
970 MigrationState state
, const std::string
&state_description
)
971 : header_type(header_type
), pool_id(pool_id
),
972 pool_namespace(pool_namespace
), image_name(image_name
),
973 image_id(image_id
), source_spec(source_spec
), snap_seqs(snap_seqs
),
974 overlap(overlap
), flatten(flatten
), mirroring(mirroring
),
975 mirror_image_mode(mirror_image_mode
), state(state
),
976 state_description(state_description
) {
979 void encode(ceph::buffer::list
&bl
) const;
980 void decode(ceph::buffer::list::const_iterator
& it
);
981 void dump(ceph::Formatter
*f
) const;
983 static void generate_test_instances(std::list
<MigrationSpec
*> &o
);
985 inline bool operator==(const MigrationSpec
& ms
) const {
986 return header_type
== ms
.header_type
&& pool_id
== ms
.pool_id
&&
987 pool_namespace
== ms
.pool_namespace
&& image_name
== ms
.image_name
&&
988 image_id
== ms
.image_id
&& source_spec
== ms
.source_spec
&&
989 snap_seqs
== ms
.snap_seqs
&& overlap
== ms
.overlap
&&
990 flatten
== ms
.flatten
&& mirroring
== ms
.mirroring
&&
991 mirror_image_mode
== ms
.mirror_image_mode
&& state
== ms
.state
&&
992 state_description
== ms
.state_description
;
996 std::ostream
& operator<<(std::ostream
& os
, const MigrationSpec
& migration_spec
);
998 WRITE_CLASS_ENCODER(MigrationSpec
);
1000 enum AssertSnapcSeqState
{
1001 ASSERT_SNAPC_SEQ_GT_SNAPSET_SEQ
= 0,
1002 ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ
= 1,
1005 inline void encode(const AssertSnapcSeqState
&state
, ceph::buffer::list
& bl
) {
1007 encode(static_cast<uint8_t>(state
), bl
);
1010 inline void decode(AssertSnapcSeqState
&state
, ceph::buffer::list::const_iterator
& it
) {
1013 decode(int_state
, it
);
1014 state
= static_cast<AssertSnapcSeqState
>(int_state
);
1017 std::ostream
& operator<<(std::ostream
& os
, const AssertSnapcSeqState
& state
);
1019 void sanitize_entity_inst(entity_inst_t
* entity_inst
);
1024 #endif // CEPH_CLS_RBD_TYPES_H