From 384a80c9a9eb9be63a2e2572f6cb15305159120d Mon Sep 17 00:00:00 2001 From: Abhishek Lekshmanan Date: Tue, 5 Mar 2019 13:37:00 +0100 Subject: [PATCH] cls rgw: implement a method to get a single LC entry Signed-off-by: Abhishek Lekshmanan (cherry picked from commit 64c5d6f880cf6d4d7a93cf4961f14f067d275736) --- src/cls/rgw/cls_rgw.cc | 25 ++++++++++++++++++++++ src/cls/rgw/cls_rgw_client.cc | 23 ++++++++++++++++++++ src/cls/rgw/cls_rgw_client.h | 1 + src/cls/rgw/cls_rgw_const.h | 1 + src/cls/rgw/cls_rgw_ops.h | 40 +++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+) diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index 122a72525afd5..f81ca2ced3e23 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -3497,6 +3497,29 @@ static int rgw_cls_gc_remove(cls_method_context_t hctx, bufferlist *in, bufferli return gc_remove(hctx, op.tags); } +static int rgw_cls_lc_get_entry(cls_method_context_t hctx, bufferlist *in, bufferlist *out) +{ + auto in_iter = in->cbegin(); + + cls_rgw_lc_get_entry_op op; + try { + decode(op, in_iter); + } catch (buffer::error& err) { + CLS_LOG(1, "ERROR: rgw_cls_lc_set_entry(): failed to decode entry\n"); + return -EINVAL; + } + + rgw_lc_entry_t lc_entry; + int ret = read_omap_entry(hctx, op.marker, &lc_entry); + if (ret < 0) + return ret; + + cls_rgw_lc_get_entry_ret op_ret(std::move(lc_entry)); + encode(op_ret, *out); + return 0; +} + + static int rgw_cls_lc_set_entry(cls_method_context_t hctx, bufferlist *in, bufferlist *out) { auto in_iter = in->cbegin(); @@ -3904,6 +3927,7 @@ CLS_INIT(rgw) cls_method_handle_t h_rgw_gc_set_entry; cls_method_handle_t h_rgw_gc_list; cls_method_handle_t h_rgw_gc_remove; + cls_method_handle_t h_rgw_lc_get_entry; cls_method_handle_t h_rgw_lc_set_entry; cls_method_handle_t h_rgw_lc_rm_entry; cls_method_handle_t h_rgw_lc_get_next_entry; @@ -3966,6 +3990,7 @@ CLS_INIT(rgw) cls_register_cxx_method(h_class, RGW_GC_REMOVE, CLS_METHOD_RD | CLS_METHOD_WR, rgw_cls_gc_remove, &h_rgw_gc_remove); /* lifecycle bucket list */ + cls_register_cxx_method(h_class, RGW_LC_GET_ENTRY, CLS_METHOD_RD, rgw_cls_lc_get_entry, &h_rgw_lc_get_entry); cls_register_cxx_method(h_class, RGW_LC_SET_ENTRY, CLS_METHOD_RD | CLS_METHOD_WR, rgw_cls_lc_set_entry, &h_rgw_lc_set_entry); cls_register_cxx_method(h_class, RGW_LC_RM_ENTRY, CLS_METHOD_RD | CLS_METHOD_WR, rgw_cls_lc_rm_entry, &h_rgw_lc_rm_entry); cls_register_cxx_method(h_class, RGW_LC_GET_NEXT_ENTRY, CLS_METHOD_RD, rgw_cls_lc_get_next_entry, &h_rgw_lc_get_next_entry); diff --git a/src/cls/rgw/cls_rgw_client.cc b/src/cls/rgw/cls_rgw_client.cc index c5fde8cf298a9..1f25068f9f3cc 100644 --- a/src/cls/rgw/cls_rgw_client.cc +++ b/src/cls/rgw/cls_rgw_client.cc @@ -816,6 +816,29 @@ int cls_rgw_lc_set_entry(IoCtx& io_ctx, const string& oid, const pair& entry); int cls_rgw_lc_rm_entry(librados::IoCtx& io_ctx, const string& oid, const pair& entry); int cls_rgw_lc_set_entry(librados::IoCtx& io_ctx, const string& oid, const pair& entry); +int cls_rgw_lc_get_entry(librados::IoCtx& io_ctx, const string& oid, const std::string& marker, rgw_lc_entry_t& entry); int cls_rgw_lc_list(librados::IoCtx& io_ctx, const string& oid, const string& marker, uint32_t max_entries, diff --git a/src/cls/rgw/cls_rgw_const.h b/src/cls/rgw/cls_rgw_const.h index 1d920abff8d0e..fc3537ea880c2 100644 --- a/src/cls/rgw/cls_rgw_const.h +++ b/src/cls/rgw/cls_rgw_const.h @@ -52,6 +52,7 @@ #define RGW_GC_REMOVE "gc_remove" /* lifecycle bucket list */ +#define RGW_LC_GET_ENTRY "lc_get_entry" #define RGW_LC_SET_ENTRY "lc_set_entry" #define RGW_LC_RM_ENTRY "lc_rm_entry" #define RGW_LC_GET_NEXT_ENTRY "lc_get_next_entry" diff --git a/src/cls/rgw/cls_rgw_ops.h b/src/cls/rgw/cls_rgw_ops.h index 30e82a9e20f85..86f08bcf6770a 100644 --- a/src/cls/rgw/cls_rgw_ops.h +++ b/src/cls/rgw/cls_rgw_ops.h @@ -1031,6 +1031,46 @@ struct cls_rgw_lc_get_next_entry_ret { }; WRITE_CLASS_ENCODER(cls_rgw_lc_get_next_entry_ret) +struct cls_rgw_lc_get_entry_op { + string marker; + cls_rgw_lc_get_entry_op() {} + cls_rgw_lc_get_entry_op(const std::string& _marker) : marker(_marker) {} + + void encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + encode(marker, bl); + ENCODE_FINISH(bl); + } + + void decode(bufferlist::const_iterator& bl) { + DECODE_START(1, bl); + decode(marker, bl); + DECODE_FINISH(bl); + } +}; +WRITE_CLASS_ENCODER(cls_rgw_lc_get_entry_op) + +struct cls_rgw_lc_get_entry_ret { + rgw_lc_entry_t entry; + cls_rgw_lc_get_entry_ret() {} + cls_rgw_lc_get_entry_ret(rgw_lc_entry_t&& _entry) : entry(std::move(_entry)) {} + + void encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + encode(entry, bl); + ENCODE_FINISH(bl); + } + + void decode(bufferlist::const_iterator& bl) { + DECODE_START(1, bl); + decode(entry, bl); + DECODE_FINISH(bl); + } + +}; +WRITE_CLASS_ENCODER(cls_rgw_lc_get_entry_ret) + + struct cls_rgw_lc_rm_entry_op { rgw_lc_entry_t entry; cls_rgw_lc_rm_entry_op() {} -- 2.39.5