Eventually we will want to be able to chain multiple peers together.
In order to avoid special logic for syncing non-primary snapshots from
a peer, just treat all mirror snapshots the same.
This also clears some confusion for how to handle demoted snapshots
since otherwise it would involve creating a primary-snapshot on the
non-primary image before the image was fully synced.
Finally, the copied flag was renamed to completed since we should
eventually only set this to true on primary snapshots after the
image state has been created.
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
typedef void (*rbd_update_callback_t)(void *arg);
typedef enum {
- RBD_SNAP_NAMESPACE_TYPE_USER = 0,
- RBD_SNAP_NAMESPACE_TYPE_GROUP = 1,
- RBD_SNAP_NAMESPACE_TYPE_TRASH = 2,
- RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY = 3,
- RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY = 4,
+ RBD_SNAP_NAMESPACE_TYPE_USER = 0,
+ RBD_SNAP_NAMESPACE_TYPE_GROUP = 1,
+ RBD_SNAP_NAMESPACE_TYPE_TRASH = 2,
+ RBD_SNAP_NAMESPACE_TYPE_MIRROR = 3,
} rbd_snap_namespace_type_t;
typedef struct {
char *group_snap_name;
} rbd_snap_group_namespace_t;
+typedef enum {
+ RBD_SNAP_MIRROR_STATE_PRIMARY,
+ RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED,
+ RBD_SNAP_MIRROR_STATE_NON_PRIMARY,
+ RBD_SNAP_MIRROR_STATE_NON_PRIMARY_DEMOTED
+} rbd_snap_mirror_state_t;
+
typedef struct {
- bool demoted;
+ rbd_snap_mirror_state_t state;
size_t mirror_peer_uuids_count;
char *mirror_peer_uuids;
-} rbd_snap_mirror_primary_namespace_t;
-
-typedef struct {
+ bool complete;
char *primary_mirror_uuid;
uint64_t primary_snap_id;
- bool copied;
uint64_t last_copied_object_number;
-} rbd_snap_mirror_non_primary_namespace_t;
+} rbd_snap_mirror_namespace_t;
typedef enum {
RBD_LOCK_MODE_EXCLUSIVE = 0,
uint64_t snap_id,
char* original_name,
size_t max_length);
-CEPH_RBD_API int rbd_snap_get_mirror_primary_namespace(
- rbd_image_t image, uint64_t snap_id,
- rbd_snap_mirror_primary_namespace_t *mirror_snap, size_t mirror_snap_size);
-CEPH_RBD_API int rbd_snap_mirror_primary_namespace_cleanup(
- rbd_snap_mirror_primary_namespace_t *mirror_snap, size_t mirror_snap_size);
-CEPH_RBD_API int rbd_snap_get_mirror_non_primary_namespace(
+CEPH_RBD_API int rbd_snap_get_mirror_namespace(
rbd_image_t image, uint64_t snap_id,
- rbd_snap_mirror_non_primary_namespace_t *mirror_snap,
- size_t mirror_snap_size);
-CEPH_RBD_API int rbd_snap_mirror_non_primary_namespace_cleanup(
- rbd_snap_mirror_non_primary_namespace_t *mirror_snap,
- size_t mirror_snap_size);
+ rbd_snap_mirror_namespace_t *mirror_snap, size_t mirror_snap_size);
+CEPH_RBD_API int rbd_snap_mirror_namespace_cleanup(
+ rbd_snap_mirror_namespace_t *mirror_snap, size_t mirror_snap_size);
CEPH_RBD_API int rbd_flatten(rbd_image_t image);
std::string group_snap_name;
} snap_group_namespace_t;
- typedef struct {
- bool demoted;
- std::set<std::string> mirror_peer_uuids;
- } snap_mirror_primary_namespace_t;
+ typedef rbd_snap_mirror_state_t snap_mirror_state_t;
typedef struct {
+ snap_mirror_state_t state;
+ std::set<std::string> mirror_peer_uuids;
+ bool complete;
std::string primary_mirror_uuid;
uint64_t primary_snap_id;
- bool copied;
uint64_t last_copied_object_number;
- } snap_mirror_non_primary_namespace_t;
+ } snap_mirror_namespace_t;
typedef struct {
std::string client;
snap_group_namespace_t *group_namespace,
size_t snap_group_namespace_size);
int snap_get_trash_namespace(uint64_t snap_id, std::string* original_name);
- int snap_get_mirror_primary_namespace(
- uint64_t snap_id, snap_mirror_primary_namespace_t *mirror_namespace,
- size_t snap_mirror_namespace_size);
- int snap_get_mirror_non_primary_namespace(
- uint64_t snap_id, snap_mirror_non_primary_namespace_t *mirror_namespace,
+ int snap_get_mirror_namespace(
+ uint64_t snap_id, snap_mirror_namespace_t *mirror_namespace,
size_t snap_mirror_namespace_size);
/* I/O */
#include "librbd/Operations.h"
#include "librbd/Utils.h"
#include "librbd/api/Image.h"
+#include "librbd/api/Mirror.h"
#include <boost/variant.hpp>
#include "include/Context.h"
#include "common/Cond.h"
}
};
-class GetMirrorPrimaryVisitor : public boost::static_visitor<int> {
+class GetMirrorVisitor : public boost::static_visitor<int> {
public:
- snap_mirror_primary_namespace_t *mirror_snap;
+ snap_mirror_namespace_t *mirror_snap;
+ std::string mirror_uuid;
- explicit GetMirrorPrimaryVisitor(snap_mirror_primary_namespace_t *mirror_snap)
- : mirror_snap(mirror_snap) {
+ explicit GetMirrorVisitor(snap_mirror_namespace_t *mirror_snap,
+ const std::string& mirror_uuid)
+ : mirror_snap(mirror_snap), mirror_uuid(mirror_uuid) {
}
template <typename T>
inline int operator()(
const cls::rbd::MirrorPrimarySnapshotNamespace& snap_namespace) {
- mirror_snap->demoted = snap_namespace.demoted;
+ if (snap_namespace.demoted) {
+ mirror_snap->state = RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED;
+ } else {
+ mirror_snap->state = RBD_SNAP_MIRROR_STATE_PRIMARY;
+ }
mirror_snap->mirror_peer_uuids = snap_namespace.mirror_peer_uuids;
+ mirror_snap->complete = true;
return 0;
}
-};
-
-class GetMirrorNonPrimaryVisitor : public boost::static_visitor<int> {
-public:
- snap_mirror_non_primary_namespace_t *mirror_snap;
-
- explicit GetMirrorNonPrimaryVisitor(
- snap_mirror_non_primary_namespace_t *mirror_snap)
- : mirror_snap(mirror_snap) {
- }
-
- template <typename T>
- inline int operator()(const T&) const {
- return -EINVAL;
- }
inline int operator()(
const cls::rbd::MirrorNonPrimarySnapshotNamespace& snap_namespace) {
+ mirror_snap->state = RBD_SNAP_MIRROR_STATE_NON_PRIMARY;
mirror_snap->primary_mirror_uuid = snap_namespace.primary_mirror_uuid;
mirror_snap->primary_snap_id = snap_namespace.primary_snap_id;
- mirror_snap->copied = snap_namespace.copied;
+ mirror_snap->complete = snap_namespace.copied;
mirror_snap->last_copied_object_number =
snap_namespace.last_copied_object_number;
return 0;
}
template <typename I>
-int Snapshot<I>::get_mirror_primary_namespace(
- I *ictx, uint64_t snap_id, snap_mirror_primary_namespace_t *mirror_snap) {
+int Snapshot<I>::get_mirror_namespace(
+ I *ictx, uint64_t snap_id, snap_mirror_namespace_t *mirror_snap) {
int r = ictx->state->refresh_if_required();
if (r < 0) {
return r;
return -ENOENT;
}
- auto gmv = GetMirrorPrimaryVisitor(mirror_snap);
- r = boost::apply_visitor(gmv, snap_info->snap_namespace);
+ // TODO temporary
+ std::string mirror_uuid;
+ r = Mirror<I>::uuid_get(ictx->md_ctx, &mirror_uuid);
if (r < 0) {
return r;
}
- return 0;
-}
-
-template <typename I>
-int Snapshot<I>::get_mirror_non_primary_namespace(
- I *ictx, uint64_t snap_id,
- snap_mirror_non_primary_namespace_t *mirror_snap) {
- int r = ictx->state->refresh_if_required();
- if (r < 0) {
- return r;
- }
-
- std::shared_lock image_locker{ictx->image_lock};
- auto snap_info = ictx->get_snap_info(snap_id);
- if (snap_info == nullptr) {
- return -ENOENT;
- }
-
- auto gmv = GetMirrorNonPrimaryVisitor(mirror_snap);
+ auto gmv = GetMirrorVisitor(mirror_snap, mirror_uuid);
r = boost::apply_visitor(gmv, snap_info->snap_namespace);
if (r < 0) {
return r;
static int get_trash_namespace(ImageCtxT *ictx, uint64_t snap_id,
std::string *original_name);
- static int get_mirror_primary_namespace(
+ static int get_mirror_namespace(
ImageCtxT *ictx, uint64_t snap_id,
- snap_mirror_primary_namespace_t *mirror_snap);
-
- static int get_mirror_non_primary_namespace(
- ImageCtxT *ictx, uint64_t snap_id,
- snap_mirror_non_primary_namespace_t *mirror_snap);
+ snap_mirror_namespace_t *mirror_snap);
static int get_namespace_type(ImageCtxT *ictx, uint64_t snap_id,
snap_namespace_type_t *namespace_type);
original_name);
}
- int Image::snap_get_mirror_primary_namespace(
- uint64_t snap_id, snap_mirror_primary_namespace_t *mirror_snap,
+ int Image::snap_get_mirror_namespace(
+ uint64_t snap_id, snap_mirror_namespace_t *mirror_snap,
size_t mirror_snap_size) {
ImageCtx *ictx = (ImageCtx *)ctx;
- if (mirror_snap_size != sizeof(snap_mirror_primary_namespace_t)) {
+ if (mirror_snap_size != sizeof(snap_mirror_namespace_t)) {
return -ERANGE;
}
- int r = librbd::api::Snapshot<>::get_mirror_primary_namespace(
- ictx, snap_id, mirror_snap);
- return r;
- }
-
- int Image::snap_get_mirror_non_primary_namespace(
- uint64_t snap_id, snap_mirror_non_primary_namespace_t *mirror_snap,
- size_t mirror_snap_size) {
- ImageCtx *ictx = (ImageCtx *)ctx;
-
- if (mirror_snap_size != sizeof(snap_mirror_non_primary_namespace_t)) {
- return -ERANGE;
- }
-
- int r = librbd::api::Snapshot<>::get_mirror_non_primary_namespace(
+ int r = librbd::api::Snapshot<>::get_mirror_namespace(
ictx, snap_id, mirror_snap);
return r;
}
return 0;
}
-extern "C" int rbd_snap_get_mirror_primary_namespace(
+extern "C" int rbd_snap_get_mirror_namespace(
rbd_image_t image, uint64_t snap_id,
- rbd_snap_mirror_primary_namespace_t *mirror_snap,
+ rbd_snap_mirror_namespace_t *mirror_snap,
size_t mirror_snap_size) {
librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
- if (mirror_snap_size != sizeof(rbd_snap_mirror_primary_namespace_t)) {
+ if (mirror_snap_size != sizeof(rbd_snap_mirror_namespace_t)) {
return -ERANGE;
}
- librbd::snap_mirror_primary_namespace_t mirror_namespace;
- int r = librbd::api::Snapshot<>::get_mirror_primary_namespace(
+ librbd::snap_mirror_namespace_t mirror_namespace;
+ int r = librbd::api::Snapshot<>::get_mirror_namespace(
ictx, snap_id, &mirror_namespace);
if (r < 0) {
return r;
}
- mirror_snap->demoted = mirror_namespace.demoted;
+ mirror_snap->state = mirror_namespace.state;
+ mirror_snap->primary_mirror_uuid =
+ strdup(mirror_namespace.primary_mirror_uuid.c_str());
+ mirror_snap->primary_snap_id = mirror_namespace.primary_snap_id;
mirror_snap->mirror_peer_uuids_count =
mirror_namespace.mirror_peer_uuids.size();
size_t len = 0;
strncpy(p, peer.c_str(), peer.size() + 1);
p += peer.size() + 1;
}
-
- return 0;
-}
-
-extern "C" int rbd_snap_mirror_primary_namespace_cleanup(
- rbd_snap_mirror_primary_namespace_t *mirror_snap,
- size_t mirror_snap_size) {
- if (mirror_snap_size != sizeof(rbd_snap_mirror_primary_namespace_t)) {
- return -ERANGE;
- }
-
- free(mirror_snap->mirror_peer_uuids);
- return 0;
-}
-
-extern "C" int rbd_snap_get_mirror_non_primary_namespace(
- rbd_image_t image, uint64_t snap_id,
- rbd_snap_mirror_non_primary_namespace_t *mirror_snap,
- size_t mirror_snap_size) {
- librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
-
- if (mirror_snap_size != sizeof(rbd_snap_mirror_non_primary_namespace_t)) {
- return -ERANGE;
- }
-
- librbd::snap_mirror_non_primary_namespace_t mirror_namespace;
- int r = librbd::api::Snapshot<>::get_mirror_non_primary_namespace(
- ictx, snap_id, &mirror_namespace);
- if (r < 0) {
- return r;
- }
-
- mirror_snap->primary_mirror_uuid =
- strdup(mirror_namespace.primary_mirror_uuid.c_str());
- mirror_snap->primary_snap_id = mirror_namespace.primary_snap_id;
- mirror_snap->copied = mirror_namespace.copied;
+ mirror_snap->complete = mirror_namespace.complete;
mirror_snap->last_copied_object_number =
mirror_namespace.last_copied_object_number;
return 0;
}
-extern "C" int rbd_snap_mirror_non_primary_namespace_cleanup(
- rbd_snap_mirror_non_primary_namespace_t *mirror_snap,
+extern "C" int rbd_snap_mirror_namespace_cleanup(
+ rbd_snap_mirror_namespace_t *mirror_snap,
size_t mirror_snap_size) {
- if (mirror_snap_size != sizeof(rbd_snap_mirror_non_primary_namespace_t)) {
+ if (mirror_snap_size != sizeof(rbd_snap_mirror_namespace_t)) {
return -ERANGE;
}
free(mirror_snap->primary_mirror_uuid);
+ free(mirror_snap->mirror_peer_uuids);
return 0;
}
char *group_name
char *group_snap_name
- ctypedef struct rbd_snap_mirror_primary_namespace_t:
- bint demoted
+ ctypedef enum rbd_snap_mirror_state_t:
+ _RBD_SNAP_MIRROR_STATE_PRIMARY "RBD_SNAP_MIRROR_STATE_PRIMARY"
+ _RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED "RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED"
+ _RBD_SNAP_MIRROR_STATE_NON_PRIMARY "RBD_SNAP_MIRROR_STATE_NON_PRIMARY"
+ _RBD_SNAP_MIRROR_STATE_NON_PRIMARY_DEMOTED "RBD_SNAP_MIRROR_STATE_NON_PRIMARY_DEMOTED"
+
+ ctypedef struct rbd_snap_mirror_namespace_t:
+ rbd_snap_mirror_state_t state
size_t mirror_peer_uuids_count
char *mirror_peer_uuids
-
- ctypedef struct rbd_snap_mirror_non_primary_namespace_t:
+ bint complete
char *primary_mirror_uuid
uint64_t primary_snap_id
- bint copied
uint64_t last_copied_object_number
ctypedef struct rbd_group_info_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"
- _RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY "RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY"
- _RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY "RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY"
+ _RBD_SNAP_NAMESPACE_TYPE_MIRROR "RBD_SNAP_NAMESPACE_TYPE_MIRROR"
ctypedef struct rbd_snap_spec_t:
uint64_t id
size_t snap_group_namespace_size)
int rbd_snap_get_trash_namespace(rbd_image_t image, uint64_t snap_id,
char *original_name, size_t max_length)
- int rbd_snap_get_mirror_primary_namespace(
- rbd_image_t image, uint64_t snap_id,
- rbd_snap_mirror_primary_namespace_t *mirror_ns,
- size_t snap_mirror_primary_namespace_size)
- void rbd_snap_mirror_primary_namespace_cleanup(
- rbd_snap_mirror_primary_namespace_t *mirror_ns,
- size_t snap_mirror_primary_namespace_size)
- int rbd_snap_get_mirror_non_primary_namespace(
+ int rbd_snap_get_mirror_namespace(
rbd_image_t image, uint64_t snap_id,
- rbd_snap_mirror_non_primary_namespace_t *mirror_ns,
- size_t snap_mirror_non_primary_namespace_size)
- void rbd_snap_mirror_non_primary_namespace_cleanup(
- rbd_snap_mirror_non_primary_namespace_t *mirror_ns,
- size_t snap_mirror_non_primary_namespace_size)
+ rbd_snap_mirror_namespace_t *mirror_ns,
+ size_t snap_mirror_namespace_size)
+ void rbd_snap_mirror_namespace_cleanup(
+ rbd_snap_mirror_namespace_t *mirror_ns,
+ size_t snap_mirror_namespace_size)
int rbd_flatten_with_progress(rbd_image_t image, librbd_progress_fn_t cb,
void *cbdata)
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_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY = _RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY
-RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY = _RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY
+RBD_SNAP_NAMESPACE_TYPE_MIRROR = _RBD_SNAP_NAMESPACE_TYPE_MIRROR
+
+RBD_SNAP_MIRROR_STATE_PRIMARY = _RBD_SNAP_MIRROR_STATE_PRIMARY
+RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED = _RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED
+RBD_SNAP_MIRROR_STATE_NON_PRIMARY = _RBD_SNAP_MIRROR_STATE_NON_PRIMARY
+RBD_SNAP_MIRROR_STATE_NON_PRIMARY_DEMOTED = _RBD_SNAP_MIRROR_STATE_NON_PRIMARY_DEMOTED
RBD_GROUP_IMAGE_STATE_ATTACHED = _RBD_GROUP_IMAGE_STATE_ATTACHED
RBD_GROUP_IMAGE_STATE_INCOMPLETE = _RBD_GROUP_IMAGE_STATE_INCOMPLETE
finally:
free(_name)
- def snap_get_mirror_primary_namespace(self, snap_id):
+ def snap_get_mirror_namespace(self, snap_id):
"""
- get the mirror primary namespace details.
+ get the mirror namespace details.
:param snap_id: the snapshot id of the mirror snapshot
:type key: int
:returns: dict - contains the following keys:
- * ``demoted`` (bool) - True if snapshot is in demoted state
+ * ``state`` (int) - the snapshot state
* ``mirror_peer_uuids`` (list) - mirror peer uuids
+
+ * ``complete`` (bool) - True if snapshot is complete
+
+ * ``primary_mirror_uuid`` (str) - primary mirror uuid
+
+ * ``primary_snap_id`` (int) - primary snapshot Id
+
+ * ``last_copied_object_number`` (int) - last copied object number
"""
cdef:
- rbd_snap_mirror_primary_namespace_t sn
+ rbd_snap_mirror_namespace_t sn
uint64_t _snap_id = snap_id
with nogil:
- ret = rbd_snap_get_mirror_primary_namespace(
+ ret = rbd_snap_get_mirror_namespace(
self.image, _snap_id, &sn,
- sizeof(rbd_snap_mirror_primary_namespace_t))
+ sizeof(rbd_snap_mirror_namespace_t))
if ret != 0:
- raise make_ex(ret, 'error getting snapshot mirror primary '
+ raise make_ex(ret, 'error getting snapshot mirror '
'namespace for image: %s, snap_id: %d' %
(self.name, snap_id))
uuids = []
uuids.append(uuid)
p += len(uuid) + 1
info = {
- 'demoted' : sn.demoted,
+ 'state' : sn.state,
'mirror_peer_uuids' : uuids,
- }
- rbd_snap_mirror_primary_namespace_cleanup(
- &sn, sizeof(rbd_snap_mirror_primary_namespace_t))
- return info
-
- def snap_get_mirror_non_primary_namespace(self, snap_id):
- """
- get the mirror non-primary namespace details.
- :param snap_id: the snapshot id of the mirror snapshot
- :type key: int
- :returns: dict - contains the following keys:
-
- * ``primary_mirror_uuid`` (str) - primary mirror uuid
-
- * ``primary_snap_id`` (int) - primary snapshot Id
-
- * ``copied`` (bool) - True if snapsho is copied
-
- * ``last_copied_object_number`` (int) - last copied object number
- """
- cdef:
- rbd_snap_mirror_non_primary_namespace_t sn
- uint64_t _snap_id = snap_id
- with nogil:
- ret = rbd_snap_get_mirror_non_primary_namespace(
- self.image, _snap_id, &sn,
- sizeof(rbd_snap_mirror_non_primary_namespace_t))
- if ret != 0:
- raise make_ex(ret, 'error getting snapshot mirror non-primary '
- 'namespace for image: %s, snap_id: %d' %
- (self.name, snap_id))
- info = {
+ 'complete' : sn.complete,
'primary_mirror_uuid' : decode_cstr(sn.primary_mirror_uuid),
'primary_snap_id' : sn.primary_snap_id,
- 'copied' : sn.copied,
'last_copied_object_number' : sn.last_copied_object_number,
}
- rbd_snap_mirror_non_primary_namespace_cleanup(
- &sn, sizeof(rbd_snap_mirror_non_primary_namespace_t))
+ rbd_snap_mirror_namespace_cleanup(
+ &sn, sizeof(rbd_snap_mirror_namespace_t))
return info
* ``trash`` (dict) - optional for trash namespace snapshots
- * ``mirror_primary`` (dict) - optional for mirror primary namespace snapshots
-
- * ``mirror_non_primary`` (dict) - optional for mirror non-primary namespace snapshots
+ * ``mirror`` (dict) - optional for mirror namespace snapshots
"""
cdef rbd_snap_info_t *snaps
except:
trash = None
s['trash'] = trash
- elif s['namespace'] == RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY:
- try:
- mirror = self.image.snap_get_mirror_primary_namespace(
- self.snaps[i].id)
- except:
- mirror = None
- s['mirror_primary'] = mirror
- elif s['namespace'] == RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY:
+ elif s['namespace'] == RBD_SNAP_NAMESPACE_TYPE_MIRROR:
try:
- mirror = self.image.snap_get_mirror_non_primary_namespace(
+ mirror = self.image.snap_get_mirror_namespace(
self.snaps[i].id)
except:
mirror = None
- s['mirror_non_primary'] = mirror
+ s['mirror'] = mirror
yield s
def __dealloc__(self):
librbd::snap_namespace_type_t snap_ns_type;
ASSERT_EQ(0, image.snap_get_namespace_type(snap_id, &snap_ns_type));
- ASSERT_EQ(RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY, snap_ns_type);
- librbd::snap_mirror_primary_namespace_t mirror_snap;
- ASSERT_EQ(0, image.snap_get_mirror_primary_namespace(snap_id, &mirror_snap,
- sizeof(mirror_snap)));
+ ASSERT_EQ(RBD_SNAP_NAMESPACE_TYPE_MIRROR, snap_ns_type);
+ librbd::snap_mirror_namespace_t mirror_snap;
+ ASSERT_EQ(0, image.snap_get_mirror_namespace(snap_id, &mirror_snap,
+ sizeof(mirror_snap)));
ASSERT_EQ(1U, mirror_snap.mirror_peer_uuids.size());
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer_uuid));
ASSERT_EQ(0, image.mirror_image_enable2(RBD_MIRROR_IMAGE_MODE_SNAPSHOT));
uint64_t snap_id;
ASSERT_EQ(0, image.mirror_image_create_snapshot(&snap_id));
- librbd::snap_mirror_primary_namespace_t mirror_snap;
- ASSERT_EQ(0, image.snap_get_mirror_primary_namespace(snap_id, &mirror_snap,
- sizeof(mirror_snap)));
+ librbd::snap_mirror_namespace_t mirror_snap;
+ ASSERT_EQ(0, image.snap_get_mirror_namespace(snap_id, &mirror_snap,
+ sizeof(mirror_snap)));
ASSERT_EQ(3U, mirror_snap.mirror_peer_uuids.size());
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer1_uuid));
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer2_uuid));
req->send();
ASSERT_EQ(0, cond1.wait());
- ASSERT_EQ(0, image.snap_get_mirror_primary_namespace(snap_id, &mirror_snap,
- sizeof(mirror_snap)));
+ ASSERT_EQ(0, image.snap_get_mirror_namespace(snap_id, &mirror_snap,
+ sizeof(mirror_snap)));
ASSERT_EQ(2U, mirror_snap.mirror_peer_uuids.size());
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer2_uuid));
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer3_uuid));
ASSERT_EQ(0, ns_image.mirror_image_enable2(RBD_MIRROR_IMAGE_MODE_SNAPSHOT));
uint64_t ns_snap_id;
ASSERT_EQ(0, ns_image.mirror_image_create_snapshot(&ns_snap_id));
- ASSERT_EQ(0, ns_image.snap_get_mirror_primary_namespace(
- ns_snap_id, &mirror_snap, sizeof(mirror_snap)));
+ ASSERT_EQ(0, ns_image.snap_get_mirror_namespace(ns_snap_id, &mirror_snap,
+ sizeof(mirror_snap)));
ASSERT_EQ(3U, mirror_snap.mirror_peer_uuids.size());
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer1_uuid));
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer2_uuid));
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer3_uuid));
-
+
ASSERT_EQ(0, m_rbd.mirror_peer_site_remove(m_ioctx, peer3_uuid));
- ASSERT_EQ(0, image.snap_get_mirror_primary_namespace(snap_id, &mirror_snap,
- sizeof(mirror_snap)));
+ ASSERT_EQ(0, image.snap_get_mirror_namespace(snap_id, &mirror_snap,
+ sizeof(mirror_snap)));
ASSERT_EQ(1U, mirror_snap.mirror_peer_uuids.size());
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer2_uuid));
- ASSERT_EQ(0, ns_image.snap_get_mirror_primary_namespace(
- ns_snap_id, &mirror_snap, sizeof(mirror_snap)));
+ ASSERT_EQ(0, ns_image.snap_get_mirror_namespace(ns_snap_id, &mirror_snap,
+ sizeof(mirror_snap)));
ASSERT_EQ(2U, mirror_snap.mirror_peer_uuids.size());
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer1_uuid));
ASSERT_EQ(1, mirror_snap.mirror_peer_uuids.count(peer2_uuid));
req->send();
ASSERT_EQ(0, cond2.wait());
- ASSERT_EQ(-ENOENT, image.snap_get_mirror_primary_namespace(snap_id, &mirror_snap,
- sizeof(mirror_snap)));
+ ASSERT_EQ(-ENOENT, image.snap_get_mirror_namespace(snap_id, &mirror_snap,
+ sizeof(mirror_snap)));
ictx->state->close();
ictx = nullptr;
ASSERT_EQ(0, image.close());
RBD_MIRROR_IMAGE_MODE_JOURNAL, RBD_MIRROR_IMAGE_MODE_SNAPSHOT,
RBD_LOCK_MODE_EXCLUSIVE, RBD_OPERATION_FEATURE_GROUP,
RBD_SNAP_NAMESPACE_TYPE_TRASH,
- RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY,
- RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY,
+ RBD_SNAP_NAMESPACE_TYPE_MIRROR,
RBD_IMAGE_MIGRATION_STATE_PREPARED, RBD_CONFIG_SOURCE_CONFIG,
RBD_CONFIG_SOURCE_POOL, RBD_CONFIG_SOURCE_IMAGE,
RBD_MIRROR_PEER_ATTRIBUTE_NAME_MON_HOST,
RBD_MIRROR_PEER_ATTRIBUTE_NAME_KEY,
RBD_MIRROR_PEER_DIRECTION_RX, RBD_MIRROR_PEER_DIRECTION_RX_TX,
- RBD_SNAP_REMOVE_UNPROTECT)
+ RBD_SNAP_REMOVE_UNPROTECT, RBD_SNAP_MIRROR_STATE_PRIMARY,
+ RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED)
rados = None
ioctx = None
snaps = list(self.image.list_snaps())
eq(1, len(snaps))
snap = snaps[0]
- eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY)
- eq(False, snap['mirror_primary']['demoted'])
+ eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR)
+ eq(RBD_SNAP_MIRROR_STATE_PRIMARY, snap['mirror']['state'])
info = self.image.mirror_image_get_info()
eq(True, info['primary'])
snaps = list(self.image.list_snaps())
eq(2, len(snaps))
snap = snaps[0]
- eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY)
- eq(False, snap['mirror_primary']['demoted'])
+ eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR)
+ eq(RBD_SNAP_MIRROR_STATE_PRIMARY, snap['mirror']['state'])
snap = snaps[1]
eq(snap['id'], snap_id)
- eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY)
- eq(False, snap['mirror_primary']['demoted'])
+ eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR)
+ eq(RBD_SNAP_MIRROR_STATE_PRIMARY, snap['mirror']['state'])
eq(sorted([peer1_uuid, peer2_uuid]),
- sorted(snap['mirror_primary']['mirror_peer_uuids']))
+ sorted(snap['mirror']['mirror_peer_uuids']))
- eq(RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY,
+ eq(RBD_SNAP_NAMESPACE_TYPE_MIRROR,
self.image.snap_get_namespace_type(snap_id))
- mirror_snap = self.image.snap_get_mirror_primary_namespace(snap_id)
- eq(mirror_snap, snap['mirror_primary'])
+ mirror_snap = self.image.snap_get_mirror_namespace(snap_id)
+ eq(mirror_snap, snap['mirror'])
self.image.mirror_image_demote()
snaps = list(self.image.list_snaps())
eq(3, len(snaps))
snap = snaps[0]
- eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY)
+ eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR)
snap = snaps[1]
eq(snap['id'], snap_id)
- eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY)
+ eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR)
snap = snaps[2]
- eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY)
- eq(True, snap['mirror_primary']['demoted'])
+ eq(snap['namespace'], RBD_SNAP_NAMESPACE_TYPE_MIRROR)
+ eq(RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED, snap['mirror']['state'])
eq(sorted([peer1_uuid, peer2_uuid]),
- sorted(snap['mirror_primary']['mirror_peer_uuids']))
+ sorted(snap['mirror']['mirror_peer_uuids']))
self.rbd.mirror_peer_remove(ioctx, peer1_uuid)
self.rbd.mirror_peer_remove(ioctx, peer2_uuid)
librados::IoCtx default_ns_io_ctx;
default_ns_io_ctx.dup(io_ctx);
default_ns_io_ctx.set_namespace("");
+
std::vector<librbd::mirror_peer_site_t> mirror_peers;
utils::get_mirror_peer_sites(default_ns_io_ctx, &mirror_peers);
if (r < 0) {
return false;
}
- return type != RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY;
+ return type != RBD_SNAP_NAMESPACE_TYPE_MIRROR;
}),
snaps.end());
}
if (!snaps.empty()) {
formatter->open_array_section("snapshots");
for (auto &snap : snaps) {
- librbd::snap_mirror_primary_namespace_t info;
- r = image.snap_get_mirror_primary_namespace(snap.id, &info,
- sizeof(info));
- if (r < 0) {
+ librbd::snap_mirror_namespace_t info;
+ r = image.snap_get_mirror_namespace(snap.id, &info, sizeof(info));
+ if (r < 0 ||
+ (info.state != RBD_SNAP_MIRROR_STATE_PRIMARY &&
+ info.state != RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED)) {
continue;
}
formatter->open_object_section("snapshot");
formatter->dump_unsigned("id", snap.id);
formatter->dump_string("name", snap.name);
- formatter->dump_bool("demoted", info.demoted);
+ formatter->dump_bool("demoted",
+ info.state == RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED);
formatter->open_array_section("mirror_peer_uuids");
for (auto &peer : info.mirror_peer_uuids) {
formatter->dump_string("peer_uuid", peer);
bool first_site = true;
for (auto &snap : snaps) {
- librbd::snap_mirror_primary_namespace_t info;
- r = image.snap_get_mirror_primary_namespace(snap.id, &info,
- sizeof(info));
- if (r < 0) {
+ librbd::snap_mirror_namespace_t info;
+ r = image.snap_get_mirror_namespace(snap.id, &info, sizeof(info));
+ if (r < 0 ||
+ (info.state != RBD_SNAP_MIRROR_STATE_PRIMARY &&
+ info.state != RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED)) {
continue;
}
first_site = false;
std::cout << " " << snap.id << " " << snap.name << " ("
- << (info.demoted ? "demoted " : "") << "peer_uuids:["
- << info.mirror_peer_uuids << "])";
+ << (info.state == RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED ?
+ "demoted " : "")
+ << "peer_uuids:[" << info.mirror_peer_uuids << "])";
}
std::cout << std::endl;
}
case RBD_SNAP_NAMESPACE_TYPE_TRASH:
snap_namespace_name = "trash";
break;
- case RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY:
- snap_namespace_name = "mirror_primary";
- break;
- case RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY:
- snap_namespace_name = "mirror_non_primary";
+ case RBD_SNAP_NAMESPACE_TYPE_MIRROR:
+ snap_namespace_name = "mirror";
break;
}
std::string trash_original_name;
int get_group_res = -ENOENT;
librbd::snap_group_namespace_t group_snap;
- int get_mirror_primary_res = -ENOENT;
- librbd::snap_mirror_primary_namespace_t mirror_primary_snap;
- int get_mirror_non_primary_res = -ENOENT;
- librbd::snap_mirror_non_primary_namespace_t mirror_non_primary_snap;
+ int get_mirror_res = -ENOENT;
+ librbd::snap_mirror_namespace_t mirror_snap;
+ std::string mirror_snap_state = "unknown";
if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_GROUP) {
get_group_res = image.snap_get_group_namespace(s->id, &group_snap,
sizeof(group_snap));
} else if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_TRASH) {
get_trash_res = image.snap_get_trash_namespace(
s->id, &trash_original_name);
- } else if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_MIRROR_PRIMARY) {
- get_mirror_primary_res = image.snap_get_mirror_primary_namespace(
- s->id, &mirror_primary_snap, sizeof(mirror_primary_snap));
- } else if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_MIRROR_NON_PRIMARY) {
- get_mirror_non_primary_res = image.snap_get_mirror_non_primary_namespace(
- s->id, &mirror_non_primary_snap, sizeof(mirror_non_primary_snap));
+ } else if (snap_namespace == RBD_SNAP_NAMESPACE_TYPE_MIRROR) {
+ get_mirror_res = image.snap_get_mirror_namespace(
+ s->id, &mirror_snap, sizeof(mirror_snap));
+
+ switch (mirror_snap.state) {
+ case RBD_SNAP_MIRROR_STATE_PRIMARY:
+ mirror_snap_state = "primary";
+ break;
+ case RBD_SNAP_MIRROR_STATE_NON_PRIMARY:
+ mirror_snap_state = "non-primary";
+ break;
+ case RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED:
+ case RBD_SNAP_MIRROR_STATE_NON_PRIMARY_DEMOTED:
+ mirror_snap_state = "demoted";
+ break;
+ }
}
std::string protected_str = "";
f->dump_string("group snap", group_snap.group_snap_name);
} else if (get_trash_res == 0) {
f->dump_string("original_name", trash_original_name);
- } else if (get_mirror_primary_res == 0) {
- f->dump_bool("demoted", mirror_primary_snap.demoted);
+ } else if (get_mirror_res == 0) {
+ f->dump_string("state", mirror_snap_state);
f->open_array_section("mirror_peer_uuids");
- for (auto &uuid : mirror_primary_snap.mirror_peer_uuids) {
+ for (auto &uuid : mirror_snap.mirror_peer_uuids) {
f->dump_string("peer_uuid", uuid);
}
f->close_section();
- } else if (get_mirror_non_primary_res == 0) {
- f->dump_string("primary_mirror_uuid",
- mirror_non_primary_snap.primary_mirror_uuid);
- f->dump_unsigned("primary_snap_id",
- mirror_non_primary_snap.primary_snap_id);
- f->dump_bool("copied", mirror_non_primary_snap.copied);
- f->dump_unsigned("last_copied_object_number",
- mirror_non_primary_snap.last_copied_object_number);
+ f->dump_bool("complete", mirror_snap.complete);
+ if (mirror_snap.state == RBD_SNAP_MIRROR_STATE_NON_PRIMARY ||
+ mirror_snap.state == RBD_SNAP_MIRROR_STATE_NON_PRIMARY_DEMOTED) {
+ f->dump_string("primary_mirror_uuid",
+ mirror_snap.primary_mirror_uuid);
+ f->dump_unsigned("primary_snap_id",
+ mirror_snap.primary_snap_id);
+ f->dump_unsigned("last_copied_object_number",
+ mirror_snap.last_copied_object_number);
+ }
}
f->close_section();
}
<< group_snap.group_snap_name << ")";
} else if (get_trash_res == 0) {
oss << " (" << trash_original_name << ")";
- } else if (get_mirror_primary_res == 0) {
- oss << " (" << (mirror_primary_snap.demoted ? "demoted " : "")
- << "peer_uuids:[" << mirror_primary_snap.mirror_peer_uuids
- << "])";
- } else if (get_mirror_non_primary_res == 0) {
- oss << " (" << mirror_non_primary_snap.primary_mirror_uuid << ":"
- << mirror_non_primary_snap.primary_snap_id << " ";
- if (!mirror_non_primary_snap.copied) {
- if (info.num_objs > 0) {
- auto progress = std::min<uint64_t>(
- 100, 100 * mirror_non_primary_snap.last_copied_object_number /
- info.num_objs);
- oss << progress << "%";
- } else {
- oss << "not ";
+ } else if (get_mirror_res == 0) {
+ oss << " (" << mirror_snap_state << " "
+ << "peer_uuids:[" << mirror_snap.mirror_peer_uuids << "]";
+ if (mirror_snap.state == RBD_SNAP_MIRROR_STATE_NON_PRIMARY ||
+ mirror_snap.state == RBD_SNAP_MIRROR_STATE_NON_PRIMARY_DEMOTED) {
+ oss << mirror_snap.primary_mirror_uuid << ":"
+ << mirror_snap.primary_snap_id << " ";
+ if (!mirror_snap.complete) {
+ if (info.num_objs > 0) {
+ auto progress = std::min<uint64_t>(
+ 100, 100 * mirror_snap.last_copied_object_number /
+ info.num_objs);
+ oss << progress << "% ";
+ } else {
+ oss << "not ";
+ }
}
+ oss << "copied";
}
- oss << " copied)";
+ oss << ")";
}
t << oss.str();