From: Jason Dillaman Date: Tue, 15 Mar 2016 18:35:58 +0000 (-0400) Subject: librbd: expose image mirroring primary/secondary status X-Git-Tag: v10.1.0~70^2~6 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=c8aa8428168caecc1bcd70372838e53cfe69f4d0;p=ceph-ci.git librbd: expose image mirroring primary/secondary status Signed-off-by: Jason Dillaman --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 72cf78cbe60..49ed98e9d7d 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -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 } diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index 86c3e95b2ea..f328c424a24 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -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; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 3f92cb10066..0dd1fd33ac2 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -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(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; } diff --git a/src/librbd/internal.h b/src/librbd/internal.h index de7ab9a9637..b92e57274b8 100644 --- a/src/librbd/internal.h +++ b/src/librbd/internal.h @@ -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 diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 88a3f172a59..0cc3f952165 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -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; }