From b78ebb36758e8831aefa956ecf6a8c8d5d0c7de3 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Thu, 10 Oct 2019 16:14:46 +0100 Subject: [PATCH] cls/rbd: async methods for mirror_peer_list Signed-off-by: Mykola Golub --- src/cls/rbd/cls_rbd_client.cc | 33 ++++++++++++++++++++++++--------- src/cls/rbd/cls_rbd_client.h | 3 +++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index 678df7c03bb..514acefeeca 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -1810,22 +1810,37 @@ int mirror_mode_set(librados::IoCtx *ioctx, return 0; } +void mirror_peer_list_start(librados::ObjectReadOperation *op) { + bufferlist bl; + op->exec("rbd", "mirror_peer_list", bl); +} + +int mirror_peer_list_finish(bufferlist::const_iterator *it, + std::vector *peers) { + peers->clear(); + try { + decode(*peers, *it); + } catch (const buffer::error &err) { + return -EBADMSG; + } + return 0; +} + int mirror_peer_list(librados::IoCtx *ioctx, std::vector *peers) { - bufferlist in_bl; + librados::ObjectReadOperation op; + mirror_peer_list_start(&op); + bufferlist out_bl; - int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_peer_list", in_bl, - out_bl); + int r = ioctx->operate(RBD_MIRRORING, &op, &out_bl); if (r < 0) { return r; } - peers->clear(); - try { - auto bl_it = out_bl.cbegin(); - decode(*peers, bl_it); - } catch (const buffer::error &err) { - return -EBADMSG; + auto it = out_bl.cbegin(); + r = mirror_peer_list_finish(&it, peers); + if (r < 0) { + return r; } return 0; } diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index 85459206260..5ff683737e1 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -388,6 +388,9 @@ int mirror_peer_ping(librados::IoCtx *ioctx, void mirror_peer_ping(librados::ObjectWriteOperation *op, const std::string& site_name, const std::string& fsid); +void mirror_peer_list_start(librados::ObjectReadOperation *op); +int mirror_peer_list_finish(bufferlist::const_iterator *it, + std::vector *peers); int mirror_peer_list(librados::IoCtx *ioctx, std::vector *peers); int mirror_peer_add(librados::IoCtx *ioctx,