From a3a90bd0b71aedcb1a8d8ff2d706bc4c1619c7d8 Mon Sep 17 00:00:00 2001 From: Ricardo Dias Date: Thu, 10 Mar 2016 13:39:12 +0000 Subject: [PATCH] rbd: rbd-mirroring: Support image mirroring state retrieval in librbd Signed-off-by: Ricardo Dias --- src/include/rbd/librbd.h | 13 +++++++++++++ src/include/rbd/librbd.hpp | 8 ++++++++ src/librbd/internal.cc | 24 ++++++++++++++++++++++++ src/librbd/internal.h | 1 + src/librbd/librbd.cc | 22 ++++++++++++++++++++++ 5 files changed, 68 insertions(+) diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 09ac2aa1904db..961d303c3db3d 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -101,6 +101,17 @@ typedef struct { char *client_name; } rbd_mirror_peer_t; +typedef enum { + RBD_MIRROR_IMAGE_DISABLING = 0, + RBD_MIRROR_IMAGE_ENABLED = 1, + RBD_MIRROR_IMAGE_DISABLED = 2 +} rbd_mirror_image_state_t; + +typedef struct { + char *global_id; + rbd_mirror_image_state_t state; +} rbd_mirror_image_t; + CEPH_RBD_API void rbd_version(int *major, int *minor, int *extra); /* image options */ @@ -589,6 +600,8 @@ CEPH_RBD_API int rbd_metadata_list(rbd_image_t image, const char *start, uint64_ CEPH_RBD_API int rbd_mirror_image_enable(rbd_image_t image); CEPH_RBD_API int rbd_mirror_image_disable(rbd_image_t image, bool force); +CEPH_RBD_API int rbd_mirror_image_get(rbd_image_t image, + rbd_mirror_image_t *mirror_image); #ifdef __cplusplus } diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index d16fd444b3649..b54ff5a0d0fa5 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -52,6 +52,13 @@ namespace librbd { std::string client_name; } mirror_peer_t; + typedef rbd_mirror_image_state_t mirror_image_state_t; + + typedef struct { + std::string global_id; + mirror_image_state_t state; + } mirror_image_t; + typedef rbd_image_info_t image_info_t; class CEPH_RBD_API ProgressContext @@ -323,6 +330,7 @@ public: int mirror_image_enable(); int mirror_image_disable(bool force); + int mirror_image_get(mirror_image_t *mirror_image); private: friend class RBD; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index b282d1df493fc..14027a8d83a6b 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2483,6 +2483,30 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { return 0; } + int mirror_image_get(ImageCtx *ictx, mirror_image_t *mirror_image) { + CephContext *cct = ictx->cct; + ldout(cct, 20) << "mirror_image_get " << ictx << dendl; + + cls::rbd::MirrorImage mirror_image_internal; + int r = cls_client::mirror_image_get(&ictx->md_ctx, ictx->id, + &mirror_image_internal); + if (r < 0 && r != -ENOENT) { + lderr(cct) << "failed to retrieve mirroring state: " << cpp_strerror(r) + << dendl; + return r; + } + + mirror_image->global_id = mirror_image_internal.global_image_id; + if (r == -ENOENT) { + mirror_image->state = RBD_MIRROR_IMAGE_DISABLED; + } else { + mirror_image->state = + static_cast(mirror_image_internal.state); + } + + return 0; + } + int mirror_mode_get(IoCtx& io_ctx, rbd_mirror_mode_t *mirror_mode) { CephContext *cct = reinterpret_cast(io_ctx.cct()); ldout(cct, 20) << __func__ << dendl; diff --git a/src/librbd/internal.h b/src/librbd/internal.h index 6a3a5bc37aac9..d5e74dfe77b71 100644 --- a/src/librbd/internal.h +++ b/src/librbd/internal.h @@ -185,6 +185,7 @@ namespace librbd { int mirror_image_enable(ImageCtx *ictx); int mirror_image_disable(ImageCtx *ictx, bool force); + int mirror_image_get(ImageCtx *ictx, mirror_image_t *mirror_image); } #endif diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index f118488e787a6..e21aff302250d 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -1236,6 +1236,11 @@ namespace librbd { return librbd::mirror_image_disable(ictx, force); } + int Image::mirror_image_get(mirror_image_t *mirror_image) { + ImageCtx *ictx = (ImageCtx *)ctx; + return librbd::mirror_image_get(ictx, mirror_image); + } + } // namespace librbd extern "C" void rbd_version(int *major, int *minor, int *extra) @@ -2575,6 +2580,23 @@ extern "C" int rbd_mirror_image_disable(rbd_image_t image, bool force) return librbd::mirror_image_disable(ictx, force); } +extern "C" int rbd_mirror_image_get(rbd_image_t image, + rbd_mirror_image_t *mirror_image) +{ + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + + librbd::mirror_image_t cpp_mirror_image; + int r = librbd::mirror_image_get(ictx, &cpp_mirror_image); + if (r < 0) { + return r; + } + + mirror_image->global_id = strdup(cpp_mirror_image.global_id.c_str()); + mirror_image->state = cpp_mirror_image.state; + + return 0; +} + extern "C" int rbd_aio_is_complete(rbd_completion_t c) { librbd::RBD::AioCompletion *comp = (librbd::RBD::AioCompletion *)c; -- 2.39.5