cls/rbd: extend parent_attach to support reattach

Signed-off-by: Mykola Golub <mgolub@suse.com>
This commit is contained in:
Mykola Golub 2019-01-21 08:27:14 +00:00
parent e2ed984d51
commit 6795f0267d
3 changed files with 17 additions and 9 deletions

View File

@ -586,7 +586,8 @@ int write(cls_method_context_t hctx, const std::string& snap_key,
namespace parent { 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); int r = check_exists(hctx);
if (r < 0) { if (r < 0) {
CLS_LOG(20, "cls_rbd::image::parent::attach: child doesn't exist"); 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 && if (r == 0 &&
(on_disk_parent.head_overlap || (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 " CLS_LOG(20, "cls_rbd::parent::attach: existing legacy parent "
"pool=%" PRIi64 ", ns=%s, id=%s, snapid=%" PRIu64 ", " "pool=%" PRIi64 ", ns=%s, id=%s, snapid=%" PRIu64 ", "
"overlap=%" PRIu64, "overlap=%" PRIu64,
@ -1679,7 +1681,7 @@ int set_parent(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
return -EINVAL; return -EINVAL;
} }
int r = image::parent::attach(hctx, parent); int r = image::parent::attach(hctx, parent, false);
if (r < 0) { if (r < 0) {
return r; 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) { int parent_attach(cls_method_context_t hctx, bufferlist *in, bufferlist *out) {
cls::rbd::ParentImageSpec parent_image_spec; cls::rbd::ParentImageSpec parent_image_spec;
uint64_t parent_overlap; uint64_t parent_overlap;
bool reattach = false;
auto iter = in->cbegin(); auto iter = in->cbegin();
try { try {
decode(parent_image_spec, iter); decode(parent_image_spec, iter);
decode(parent_overlap, iter); decode(parent_overlap, iter);
if (!iter.end()) {
decode(reattach, iter);
}
} catch (const buffer::error &err) { } catch (const buffer::error &err) {
CLS_LOG(20, "cls_rbd::parent_attach: invalid decode"); CLS_LOG(20, "cls_rbd::parent_attach: invalid decode");
return -EINVAL; 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) { if (r < 0) {
return r; return r;
} }

View File

@ -445,18 +445,19 @@ int parent_overlap_get(librados::IoCtx* ioctx, const std::string &oid,
void parent_attach(librados::ObjectWriteOperation* op, void parent_attach(librados::ObjectWriteOperation* op,
const cls::rbd::ParentImageSpec& parent_image_spec, const cls::rbd::ParentImageSpec& parent_image_spec,
uint64_t parent_overlap) { uint64_t parent_overlap, bool reattach) {
bufferlist in_bl; bufferlist in_bl;
encode(parent_image_spec, in_bl); encode(parent_image_spec, in_bl);
encode(parent_overlap, in_bl); encode(parent_overlap, in_bl);
encode(reattach, in_bl);
op->exec("rbd", "parent_attach", in_bl); op->exec("rbd", "parent_attach", in_bl);
} }
int parent_attach(librados::IoCtx *ioctx, const std::string &oid, int parent_attach(librados::IoCtx *ioctx, const std::string &oid,
const cls::rbd::ParentImageSpec& parent_image_spec, const cls::rbd::ParentImageSpec& parent_image_spec,
uint64_t parent_overlap) { uint64_t parent_overlap, bool reattach) {
librados::ObjectWriteOperation op; 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); return ioctx->operate(oid, &op);
} }

View File

@ -111,10 +111,10 @@ int parent_overlap_get(librados::IoCtx* ioctx, const std::string &oid,
void parent_attach(librados::ObjectWriteOperation* op, void parent_attach(librados::ObjectWriteOperation* op,
const cls::rbd::ParentImageSpec& parent_image_spec, 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, int parent_attach(librados::IoCtx *ioctx, const std::string &oid,
const cls::rbd::ParentImageSpec& parent_image_spec, const cls::rbd::ParentImageSpec& parent_image_spec,
uint64_t parent_overlap); uint64_t parent_overlap, bool reattach);
void parent_detach(librados::ObjectWriteOperation* op); void parent_detach(librados::ObjectWriteOperation* op);
int parent_detach(librados::IoCtx *ioctx, const std::string &oid); int parent_detach(librados::IoCtx *ioctx, const std::string &oid);