From 6795f0267dfdc7b395026bb25e521c03a38fb2b0 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Mon, 21 Jan 2019 08:27:14 +0000 Subject: [PATCH] cls/rbd: extend parent_attach to support reattach Signed-off-by: Mykola Golub --- src/cls/rbd/cls_rbd.cc | 15 +++++++++++---- src/cls/rbd/cls_rbd_client.cc | 7 ++++--- src/cls/rbd/cls_rbd_client.h | 4 ++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index a6a767195d0c2..7c23fe10f7fe4 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -586,7 +586,8 @@ int write(cls_method_context_t hctx, const std::string& snap_key, namespace parent { -int attach(cls_method_context_t hctx, cls_rbd_parent parent) { +int attach(cls_method_context_t hctx, cls_rbd_parent parent, + bool reattach) { int r = check_exists(hctx); if (r < 0) { CLS_LOG(20, "cls_rbd::image::parent::attach: child doesn't exist"); @@ -621,7 +622,8 @@ int attach(cls_method_context_t hctx, cls_rbd_parent parent) { if (r == 0 && (on_disk_parent.head_overlap || - on_disk_parent_without_overlap != parent)) { + on_disk_parent_without_overlap != parent) && + !reattach) { CLS_LOG(20, "cls_rbd::parent::attach: existing legacy parent " "pool=%" PRIi64 ", ns=%s, id=%s, snapid=%" PRIu64 ", " "overlap=%" PRIu64, @@ -1679,7 +1681,7 @@ int set_parent(cls_method_context_t hctx, bufferlist *in, bufferlist *out) return -EINVAL; } - int r = image::parent::attach(hctx, parent); + int r = image::parent::attach(hctx, parent, false); if (r < 0) { return r; } @@ -1816,17 +1818,22 @@ int parent_overlap_get(cls_method_context_t hctx, bufferlist *in, int parent_attach(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { cls::rbd::ParentImageSpec parent_image_spec; uint64_t parent_overlap; + bool reattach = false; auto iter = in->cbegin(); try { decode(parent_image_spec, iter); decode(parent_overlap, iter); + if (!iter.end()) { + decode(reattach, iter); + } } catch (const buffer::error &err) { CLS_LOG(20, "cls_rbd::parent_attach: invalid decode"); return -EINVAL; } - int r = image::parent::attach(hctx, {parent_image_spec, parent_overlap}); + int r = image::parent::attach(hctx, {parent_image_spec, parent_overlap}, + reattach); if (r < 0) { return r; } diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index ab5305909b02e..9a3ce845cf6fe 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -445,18 +445,19 @@ int parent_overlap_get(librados::IoCtx* ioctx, const std::string &oid, void parent_attach(librados::ObjectWriteOperation* op, const cls::rbd::ParentImageSpec& parent_image_spec, - uint64_t parent_overlap) { + uint64_t parent_overlap, bool reattach) { bufferlist in_bl; encode(parent_image_spec, in_bl); encode(parent_overlap, in_bl); + encode(reattach, in_bl); op->exec("rbd", "parent_attach", in_bl); } int parent_attach(librados::IoCtx *ioctx, const std::string &oid, const cls::rbd::ParentImageSpec& parent_image_spec, - uint64_t parent_overlap) { + uint64_t parent_overlap, bool reattach) { librados::ObjectWriteOperation op; - parent_attach(&op, parent_image_spec, parent_overlap); + parent_attach(&op, parent_image_spec, parent_overlap, reattach); return ioctx->operate(oid, &op); } diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index 48125173bffa8..e1a1737336009 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -111,10 +111,10 @@ int parent_overlap_get(librados::IoCtx* ioctx, const std::string &oid, void parent_attach(librados::ObjectWriteOperation* op, const cls::rbd::ParentImageSpec& parent_image_spec, - uint64_t parent_overlap); + uint64_t parent_overlap, bool reattach); int parent_attach(librados::IoCtx *ioctx, const std::string &oid, const cls::rbd::ParentImageSpec& parent_image_spec, - uint64_t parent_overlap); + uint64_t parent_overlap, bool reattach); void parent_detach(librados::ObjectWriteOperation* op); int parent_detach(librados::IoCtx *ioctx, const std::string &oid); -- 2.39.5