From 7c5ec1d12b44b91cfd147da9f7f0833cd72aef4b Mon Sep 17 00:00:00 2001 From: Orit Wasserman Date: Thu, 6 Apr 2017 21:58:37 +0300 Subject: [PATCH] rgw: add cls _bucket_resharding_set and cls_bucket_resharding_clear Signed-off-by: Orit Wasserman --- src/cls/rgw/cls_rgw.cc | 62 +++++++++++++++++++++++++++++++++++ src/cls/rgw/cls_rgw_client.cc | 21 ++++++++++++ src/cls/rgw/cls_rgw_client.h | 6 ++++ src/cls/rgw/cls_rgw_ops.cc | 25 ++++++++++++++ src/cls/rgw/cls_rgw_ops.h | 38 +++++++++++++++++++++ src/cls/rgw/cls_rgw_types.cc | 16 +++++++++ src/cls/rgw/cls_rgw_types.h | 26 +++++++++++++++ src/test/encoding/types.h | 3 ++ 8 files changed, 197 insertions(+) diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index 0f2fcd1da5a08..846a0ac494f85 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -3614,6 +3614,66 @@ static int rgw_reshard_remove(cls_method_context_t hctx, bufferlist *in, bufferl return ret; } +const string resharding_attr = "resharding"; + +static int cls_rgw_set_bucket_resharding(cls_method_context_t hctx, bufferlist *in, bufferlist *out) +{ + cls_rgw_set_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_set_bucket_resharding: failed to decode entry\n"); + return -EINVAL; + } + + bufferlist bl; + ::encode(true, bl); + int ret = cls_cxx_setxattr(hctx, resharding_attr.c_str(), &bl); + if (ret < 0) { + CLS_LOG(0, "ERROR: %s(): cls_cxx_setxattr (attr=%s) returned %d", __func__, resharding_attr.c_str(), ret); + return ret; + } + + ret = cls_cxx_write(hctx, 0, op.entry.data.length(), &op.entry.data); + if (ret < 0) { + CLS_LOG(0, "ERROR: %s(): cls_cxx_write returned %d", __func__, ret); + return ret; + } + + return 0; +} + +static int cls_rgw_clear_bucket_resharding(cls_method_context_t hctx, bufferlist *in, bufferlist *out) +{ + cls_rgw_set_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; + ::encode(false, bl); + int ret = cls_cxx_setxattr(hctx, resharding_attr.c_str(), &bl); + if (ret < 0) { + CLS_LOG(0, "ERROR: %s(): cls_cxx_setxattr (attr=%s) returned %d", __func__, resharding_attr.c_str(), ret); + return ret; + } + + ret = cls_cxx_write(hctx, 0, op.entry.data.length(), &op.entry.data); + if (ret < 0) { + CLS_LOG(0, "ERROR: %s(): cls_cxx_write returned %d", __func__, ret); + return ret; + } + + return 0; +} + CLS_INIT(rgw) { @@ -3659,6 +3719,8 @@ CLS_INIT(rgw) cls_method_handle_t h_rgw_reshard_get; cls_method_handle_t h_rgw_reshard_get_head; 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_register(RGW_CLASS, &h_class); diff --git a/src/cls/rgw/cls_rgw_client.cc b/src/cls/rgw/cls_rgw_client.cc index 3173cacdd7c32..81165b5aa9174 100644 --- a/src/cls/rgw/cls_rgw_client.cc +++ b/src/cls/rgw/cls_rgw_client.cc @@ -866,3 +866,24 @@ void cls_rgw_reshard_remove(librados::ObjectWriteOperation& op, const cls_rgw_re ::encode(call, in); op.exec("rgw", "reshard_remove", in); } + +int cls_rgw_set_bucket_resharding(librados::IoCtx& io_ctx, const string& oid, + const cls_rgw_bucket_instance_entry& entry) +{ + bufferlist in, out; + struct cls_rgw_set_bucket_resharding_op call; + call.entry = entry; + ::encode(call, in); + return io_ctx.exec(oid, "rgw", "set_bucket_resharding", in, out); +} + +int cls_rgw_clear_bucket_resharding(librados::IoCtx& io_ctx, const string& oid, + const cls_rgw_bucket_instance_entry& entry) +{ + bufferlist in, out; + struct cls_rgw_clear_bucket_resharding_op call; + call.entry = entry; + ::encode(call, in); + return io_ctx.exec(oid, "rgw", "clear_bucket_resharding", in, out); +} + diff --git a/src/cls/rgw/cls_rgw_client.h b/src/cls/rgw/cls_rgw_client.h index 497f5df91951a..63097a4f2c4d4 100644 --- a/src/cls/rgw/cls_rgw_client.h +++ b/src/cls/rgw/cls_rgw_client.h @@ -501,4 +501,10 @@ int cls_rgw_reshard_get(librados::IoCtx& io_ctx, const string& oid, cls_rgw_resh int cls_rgw_reshard_get_head(librados::IoCtx& io_ctx, const string& oid, cls_rgw_reshard_entry& entry); void cls_rgw_reshard_remove(librados::ObjectWriteOperation& op, const cls_rgw_reshard_entry& entry); +/* resharding attribute */ +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); + #endif diff --git a/src/cls/rgw/cls_rgw_ops.cc b/src/cls/rgw/cls_rgw_ops.cc index 1c547e04a503f..81c9af9c05b1a 100644 --- a/src/cls/rgw/cls_rgw_ops.cc +++ b/src/cls/rgw/cls_rgw_ops.cc @@ -514,5 +514,30 @@ void cls_rgw_reshard_remove_op::dump(Formatter *f) const } +void cls_rgw_set_bucket_resharding_op::generate_test_instances( + list& ls) +{ + ls.push_back(new cls_rgw_set_bucket_resharding_op); + ls.push_back(new cls_rgw_set_bucket_resharding_op); +} + +void cls_rgw_set_bucket_resharding_op::dump(Formatter *f) const +{ + ::encode_json("entry", entry, f); +} + +void cls_rgw_clear_bucket_resharding_op::generate_test_instances( + list& ls) +{ + ls.push_back(new cls_rgw_clear_bucket_resharding_op); + ls.push_back(new cls_rgw_clear_bucket_resharding_op); +} + +void cls_rgw_clear_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 7a034a1ae3e3c..178dc9d86df80 100644 --- a/src/cls/rgw/cls_rgw_ops.h +++ b/src/cls/rgw/cls_rgw_ops.h @@ -1320,4 +1320,42 @@ struct cls_rgw_reshard_remove_op { }; WRITE_CLASS_ENCODER(cls_rgw_reshard_remove_op) +struct cls_rgw_set_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_set_bucket_resharding_op) + +struct cls_rgw_clear_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_clear_bucket_resharding_op) + #endif /* CEPH_CLS_RGW_OPS_H */ diff --git a/src/cls/rgw/cls_rgw_types.cc b/src/cls/rgw/cls_rgw_types.cc index 5be8b1e326e18..a1c3524406b9d 100644 --- a/src/cls/rgw/cls_rgw_types.cc +++ b/src/cls/rgw/cls_rgw_types.cc @@ -592,3 +592,19 @@ void cls_rgw_reshard_entry::generate_test_instances(list ls.back()->old_num_shards = 8; ls.back()->new_num_shards = 64; } + +void cls_rgw_bucket_instance_entry::dump(Formatter *f) const +{ + encode_json("data", data, f); + encode_json("resharding", resharding, f); + encode_json("new_bucket_instance_id", new_bucket_instance_id, f); + +} + +void cls_rgw_bucket_instance_entry::generate_test_instances(list& ls) +{ + ls.push_back(new cls_rgw_bucket_instance_entry); + ls.push_back(new cls_rgw_bucket_instance_entry); + ls.back()->resharding = true; + ls.back()->new_bucket_instance_id = "new_instance_id"; +} diff --git a/src/cls/rgw/cls_rgw_types.h b/src/cls/rgw/cls_rgw_types.h index 3df336ec99d43..090b5ec6228e5 100644 --- a/src/cls/rgw/cls_rgw_types.h +++ b/src/cls/rgw/cls_rgw_types.h @@ -1044,4 +1044,30 @@ struct cls_rgw_reshard_entry }; WRITE_CLASS_ENCODER(cls_rgw_reshard_entry) +struct cls_rgw_bucket_instance_entry { + bool resharding; + string new_bucket_instance_id; + bufferlist data; + + void encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + ::encode(resharding, bl); + ::encode(new_bucket_instance_id, bl); + ::encode(data, bl); + ENCODE_FINISH(bl); + } + + void decode(bufferlist::iterator& bl) { + DECODE_START(1, bl); + ::decode(resharding, bl); + ::decode(new_bucket_instance_id, bl); + ::decode(data, bl); + DECODE_FINISH(bl); + } + + void dump(Formatter *f) const; + static void generate_test_instances(list& o); +}; +WRITE_CLASS_ENCODER(cls_rgw_bucket_instance_entry) + #endif diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index c39deff889d44..773a07c2cceba 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -344,10 +344,13 @@ TYPE(cls_rgw_reshard_get_ret) TYPE(cls_rgw_reshard_get_head_op) TYPE(cls_rgw_reshard_get_head_ret) TYPE(cls_rgw_reshard_remove_op) +TYPE(cls_rgw_set_bucket_resharding_op) +TYPE(cls_rgw_clear_bucket_resharding_op) #include "cls/rgw/cls_rgw_client.h" TYPE(rgw_bi_log_entry) TYPE(cls_rgw_reshard_entry) +TYPE(cls_rgw_bucket_instance_entry) #include "cls/user/cls_user_types.h" TYPE(cls_user_bucket) -- 2.39.5