]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: expose image mirroring primary/secondary status
authorJason Dillaman <dillaman@redhat.com>
Tue, 15 Mar 2016 18:35:58 +0000 (14:35 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 16 Mar 2016 00:14:45 +0000 (20:14 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/include/rbd/librbd.h
src/include/rbd/librbd.hpp
src/librbd/internal.cc
src/librbd/internal.h
src/librbd/librbd.cc

index 72cf78cbe6088ba1ea322fcd4bc6be0900c88bc5..49ed98e9d7d85aaaf349c5b04ff9899b211136bb 100644 (file)
@@ -110,7 +110,8 @@ typedef enum {
 typedef struct {
   char *global_id;
   rbd_mirror_image_state_t state;
-} rbd_mirror_image_t;
+  bool primary;
+} rbd_mirror_image_info_t;
 
 CEPH_RBD_API void rbd_version(int *major, int *minor, int *extra);
 
@@ -603,8 +604,9 @@ CEPH_RBD_API int rbd_mirror_image_disable(rbd_image_t image, bool force);
 CEPH_RBD_API int rbd_mirror_image_promote(rbd_image_t image, bool force);
 CEPH_RBD_API int rbd_mirror_image_demote(rbd_image_t image);
 CEPH_RBD_API int rbd_mirror_image_resync(rbd_image_t image);
-CEPH_RBD_API int rbd_mirror_image_get(rbd_image_t image,
-    rbd_mirror_image_t *mirror_image);
+CEPH_RBD_API int rbd_mirror_image_get_info(rbd_image_t image,
+                                           rbd_mirror_image_info_t *mirror_image_info,
+                                           size_t info_size);
 
 #ifdef __cplusplus
 }
index 86c3e95b2ea11c6f19d9557e72106c3c050e6f68..f328c424a24a0509af37a37b8e18e8e0a2be4e69 100644 (file)
@@ -57,7 +57,8 @@ namespace librbd {
   typedef struct {
     std::string global_id;
     mirror_image_state_t state;
-  } mirror_image_t;
+    bool primary;
+  } mirror_image_info_t;
 
   typedef rbd_image_info_t image_info_t;
 
@@ -334,7 +335,8 @@ public:
   int mirror_image_promote(bool force);
   int mirror_image_demote();
   int mirror_image_resync();
-  int mirror_image_get(mirror_image_t *mirror_image);
+  int mirror_image_get_info(mirror_image_info_t *mirror_image_info,
+                            size_t info_size);
 
 private:
   friend class RBD;
index 3f92cb10066d672d19110875dc1807c489e3767c..0dd1fd33ac24965f445e431eef22fd4f847198e0 100644 (file)
@@ -2502,9 +2502,13 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
     return -EOPNOTSUPP;
   }
 
-  int mirror_image_get(ImageCtx *ictx, mirror_image_t *mirror_image) {
+  int mirror_image_get_info(ImageCtx *ictx, mirror_image_info_t *mirror_image_info,
+                            size_t info_size) {
     CephContext *cct = ictx->cct;
-    ldout(cct, 20) << "mirror_image_get " << ictx << dendl;
+    ldout(cct, 20) << __func__ << ": ictx=" << ictx << dendl;
+    if (info_size < sizeof(mirror_image_info_t)) {
+      return -ERANGE;
+    }
 
     cls::rbd::MirrorImage mirror_image_internal;
     int r = cls_client::mirror_image_get(&ictx->md_ctx, ictx->id,
@@ -2515,14 +2519,21 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
       return r;
     }
 
-    mirror_image->global_id = mirror_image_internal.global_image_id;
+    mirror_image_info->global_id = mirror_image_internal.global_image_id;
     if (r == -ENOENT) {
-      mirror_image->state = RBD_MIRROR_IMAGE_DISABLED;
+      mirror_image_info->state = RBD_MIRROR_IMAGE_DISABLED;
     } else {
-      mirror_image->state =
+      mirror_image_info->state =
         static_cast<rbd_mirror_image_state_t>(mirror_image_internal.state);
     }
 
+    r = Journal<>::is_tag_owner(ictx, &mirror_image_info->primary);
+    if (r < 0) {
+      lderr(cct) << "failed to check tag ownership: "
+                 << cpp_strerror(r) << dendl;
+      return r;
+    }
+
     return 0;
   }
 
index de7ab9a96370fbcff5885840c7fe6aa2927f56b3..b92e57274b80a9c3dbc315a04fdbed13852ab25b 100644 (file)
@@ -188,7 +188,8 @@ namespace librbd {
   int mirror_image_promote(ImageCtx *ictx, bool force);
   int mirror_image_demote(ImageCtx *ictx);
   int mirror_image_resync(ImageCtx *ictx);
-  int mirror_image_get(ImageCtx *ictx, mirror_image_t *mirror_image);
+  int mirror_image_get_info(ImageCtx *ictx, mirror_image_info_t *mirror_image_info,
+                            size_t info_size);
 }
 
 #endif
index 88a3f172a59cad1e3af2f376c276900b6040ce65..0cc3f9521650171e86c2eb51a45989a744f304df 100644 (file)
@@ -1252,9 +1252,10 @@ namespace librbd {
     return librbd::mirror_image_resync(ictx);
   }
 
-  int Image::mirror_image_get(mirror_image_t *mirror_image) {
+  int Image::mirror_image_get_info(mirror_image_info_t *mirror_image_info,
+                                   size_t info_size) {
     ImageCtx *ictx = (ImageCtx *)ctx;
-    return librbd::mirror_image_get(ictx, mirror_image);
+    return librbd::mirror_image_get_info(ictx, mirror_image_info, info_size);
   }
 
 } // namespace librbd
@@ -2614,19 +2615,22 @@ extern "C" int rbd_mirror_image_resync(rbd_image_t image)
   return librbd::mirror_image_resync(ictx);
 }
 
-extern "C" int rbd_mirror_image_get(rbd_image_t image,
-    rbd_mirror_image_t *mirror_image)
+extern "C" int rbd_mirror_image_get_info(rbd_image_t image,
+                                         rbd_mirror_image_info_t *mirror_image_info,
+                                         size_t info_size)
 {
   librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
 
-  librbd::mirror_image_t cpp_mirror_image;
-  int r = librbd::mirror_image_get(ictx, &cpp_mirror_image);
+  librbd::mirror_image_info_t cpp_mirror_image;
+  int r = librbd::mirror_image_get_info(ictx, &cpp_mirror_image,
+                                        sizeof(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;
+  mirror_image_info->global_id = strdup(cpp_mirror_image.global_id.c_str());
+  mirror_image_info->state = cpp_mirror_image.state;
+  mirror_image_info->primary = cpp_mirror_image.primary;
   return 0;
 }