]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: rbd-mirroring: Support image mirroring state retrieval in librbd
authorRicardo Dias <rdias@suse.com>
Thu, 10 Mar 2016 13:39:12 +0000 (13:39 +0000)
committerRicardo Dias <rdias@suse.com>
Mon, 14 Mar 2016 17:56:38 +0000 (17:56 +0000)
Signed-off-by: Ricardo Dias <rdias@suse.com>
src/include/rbd/librbd.h
src/include/rbd/librbd.hpp
src/librbd/internal.cc
src/librbd/internal.h
src/librbd/librbd.cc

index 09ac2aa1904db7f9a22e4d8f3a2a7910af4b3d50..961d303c3db3d113611d2f0ee68979e43df95253 100644 (file)
@@ -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
 }
index d16fd444b36495cf9bef42327065cd039e7bd0ba..b54ff5a0d0fa5522de8f9577aa3dd95a953ffca2 100644 (file)
@@ -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;
index b282d1df493fc224fb1acea41e2df7a91a03a630..14027a8d83a6be15e25d2b647a30fc76611d5a94 100644 (file)
@@ -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<rbd_mirror_image_state_t>(mirror_image_internal.state);
+    }
+
+    return 0;
+  }
+
   int mirror_mode_get(IoCtx& io_ctx, rbd_mirror_mode_t *mirror_mode) {
     CephContext *cct = reinterpret_cast<CephContext *>(io_ctx.cct());
     ldout(cct, 20) << __func__ << dendl;
index 6a3a5bc37aac91efff59c8ab5d0e7f9919a863e8..d5e74dfe77b710557cbd862bb5d3103eb56d9d50 100644 (file)
@@ -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
index f118488e787a62e53562cc7fb1b4fa2c99b15293..e21aff302250dcb5b6ab8eddd05b84186fdb941d 100644 (file)
@@ -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;