From 2d23898b27d10412ed5b56b35d23eb901a2c1b51 Mon Sep 17 00:00:00 2001 From: Orit Wasserman Date: Fri, 14 Apr 2017 14:35:54 +0300 Subject: [PATCH] rgw: add cls_rgw_get_resharding Signed-off-by: Orit Wasserman --- src/cls/rgw/cls_rgw.cc | 35 ++++++++++++++++++++++++++++++ src/cls/rgw/cls_rgw_client.cc | 23 ++++++++++++++++++++ src/cls/rgw/cls_rgw_client.h | 2 ++ src/cls/rgw/cls_rgw_ops.cc | 13 ++++++++++++ src/cls/rgw/cls_rgw_ops.h | 40 +++++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+) diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index c27f7b29567..6149f688cf7 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -3674,6 +3674,38 @@ static int rgw_clear_bucket_resharding(cls_method_context_t hctx, bufferlist *in return 0; } +static int rgw_get_bucket_resharding(cls_method_context_t hctx, bufferlist *in, bufferlist *out) +{ + cls_rgw_get_bucket_resharding_op op; + + bufferlist::iterator in_iter = in->begin(); + try { + ::decode(op, in_iter); + } catch (buffer::error& err) { + CLS_LOG(1, "ERROR: cls_rgw_clear_bucket_resharding: failed to decode entry\n"); + return -EINVAL; + } + + bufferlist bl; + int ret = cls_cxx_getxattr(hctx, resharding_attr.c_str(), &bl); + if (ret < 0) { + CLS_LOG(0, "ERROR: %s(): cls_cxx_getxattr (attr=%s) returned %d", __func__, resharding_attr.c_str(), ret); + return ret; + } + + cls_rgw_get_bucket_resharding_ret op_ret; + try { + ::decode(op_ret.resharding, bl); + } catch (buffer::error& err) { + CLS_LOG(1, "ERROR: cls_rgw_get_bucket_resharding: failed to decode entry\n"); + return -EINVAL; + } + + ::encode(op_ret, *out); + + return 0; +} + CLS_INIT(rgw) { CLS_LOG(1, "Loaded rgw class!"); @@ -3720,6 +3752,7 @@ CLS_INIT(rgw) cls_method_handle_t h_rgw_reshard_remove; cls_method_handle_t h_rgw_set_bucket_resharding; cls_method_handle_t h_rgw_clear_bucket_resharding; + cls_method_handle_t h_rgw_get_bucket_resharding; cls_register(RGW_CLASS, &h_class); @@ -3779,6 +3812,8 @@ CLS_INIT(rgw) rgw_set_bucket_resharding, &h_rgw_set_bucket_resharding); cls_register_cxx_method(h_class, "clear_bucket_resharding", CLS_METHOD_RD | CLS_METHOD_WR, rgw_clear_bucket_resharding, &h_rgw_clear_bucket_resharding); + cls_register_cxx_method(h_class, "get_bucket_resharding", CLS_METHOD_RD , + rgw_get_bucket_resharding, &h_rgw_get_bucket_resharding); return; } diff --git a/src/cls/rgw/cls_rgw_client.cc b/src/cls/rgw/cls_rgw_client.cc index 81165b5aa91..5fb997448fa 100644 --- a/src/cls/rgw/cls_rgw_client.cc +++ b/src/cls/rgw/cls_rgw_client.cc @@ -887,3 +887,26 @@ int cls_rgw_clear_bucket_resharding(librados::IoCtx& io_ctx, const string& oid, return io_ctx.exec(oid, "rgw", "clear_bucket_resharding", in, out); } +int cls_rgw_get_bucket_resharding(librados::IoCtx& io_ctx, const string& oid, + const cls_rgw_bucket_instance_entry& entry, bool& resharding) +{ + bufferlist in, out; + struct cls_rgw_get_bucket_resharding_op call; + call.entry = entry; + ::encode(call, in); + int r= io_ctx.exec(oid, "rgw", "get_bucket_resharding", in, out); + if (r < 0) + return r; + + struct cls_rgw_get_bucket_resharding_ret op_ret; + bufferlist::iterator iter = out.begin(); + try { + ::decode(op_ret, iter); + } catch (buffer::error& err) { + return -EIO; + } + + resharding = op_ret.resharding; + + return 0; +} diff --git a/src/cls/rgw/cls_rgw_client.h b/src/cls/rgw/cls_rgw_client.h index 63097a4f2c4..46340ca32d4 100644 --- a/src/cls/rgw/cls_rgw_client.h +++ b/src/cls/rgw/cls_rgw_client.h @@ -506,5 +506,7 @@ int cls_rgw_set_bucket_resharding(librados::IoCtx& io_ctx, const string& oid, const cls_rgw_bucket_instance_entry& entry); int cls_rgw_clear_bucket_resharding(librados::IoCtx& io_ctx, const string& oid, const cls_rgw_bucket_instance_entry& entry); +int cls_rgw_get_bucket_resharding(librados::IoCtx& io_ctx, const string& oid, + const cls_rgw_bucket_instance_entry& entry, bool& resharding); #endif diff --git a/src/cls/rgw/cls_rgw_ops.cc b/src/cls/rgw/cls_rgw_ops.cc index 81c9af9c05b..8cc72464bbc 100644 --- a/src/cls/rgw/cls_rgw_ops.cc +++ b/src/cls/rgw/cls_rgw_ops.cc @@ -538,6 +538,19 @@ void cls_rgw_clear_bucket_resharding_op::dump(Formatter *f) const ::encode_json("entry", entry, f); } +void cls_rgw_get_bucket_resharding_op::generate_test_instances( + list& ls) +{ + ls.push_back(new cls_rgw_get_bucket_resharding_op); + ls.push_back(new cls_rgw_get_bucket_resharding_op); +} + +void cls_rgw_get_bucket_resharding_op::dump(Formatter *f) const +{ + ::encode_json("entry", entry, f); +} + + diff --git a/src/cls/rgw/cls_rgw_ops.h b/src/cls/rgw/cls_rgw_ops.h index 178dc9d86df..f7663562472 100644 --- a/src/cls/rgw/cls_rgw_ops.h +++ b/src/cls/rgw/cls_rgw_ops.h @@ -1358,4 +1358,44 @@ struct cls_rgw_clear_bucket_resharding_op { }; WRITE_CLASS_ENCODER(cls_rgw_clear_bucket_resharding_op) +struct cls_rgw_get_bucket_resharding_op { + cls_rgw_bucket_instance_entry entry; + + void encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + ::encode(entry, bl); + ENCODE_FINISH(bl); + } + + void decode(bufferlist::iterator& bl) { + DECODE_START(1, bl); + ::decode(entry, bl); + DECODE_FINISH(bl); + } + + static void generate_test_instances(list& o); + void dump(Formatter *f) const; +}; +WRITE_CLASS_ENCODER(cls_rgw_get_bucket_resharding_op) + +struct cls_rgw_get_bucket_resharding_ret { + bool resharding; + + void encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + ::encode(resharding, bl); + ENCODE_FINISH(bl); + } + + void decode(bufferlist::iterator& bl) { + DECODE_START(1, bl); + ::decode(resharding, bl); + DECODE_FINISH(bl); + } + + static void generate_test_instances(list& o); + void dump(Formatter *f) const; +}; +WRITE_CLASS_ENCODER(cls_rgw_get_bucket_resharding_ret) + #endif /* CEPH_CLS_RGW_OPS_H */