return 0;
}
-/* gain bi_entry based on reshard log */
-static int rgw_bi_get_vals_op(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
-{
- // decode request
- rgw_cls_bi_get_vals_op op;
- auto bl_iter = in->cbegin();
- try {
- decode(op, bl_iter);
- } catch (ceph::buffer::error& err) {
- CLS_LOG(0, "ERROR: %s: failed to decode request", __func__);
- return -EINVAL;
- }
-
- map<string, bufferlist> keys;
- int ret = cls_cxx_map_get_vals_by_keys(hctx, op.log_entries_wanted, &keys);
- if (ret < 0) {
- return ret;
- }
-
- rgw_cls_bi_list_ret op_ret;
- std::map<string, bufferlist>::iterator iter;
- for (iter = keys.begin(); iter != keys.end(); ++iter) {
-
- rgw_cls_bi_entry entry;
- entry.idx = iter->first;
- entry.type = bi_type(iter->first);
- entry.data = iter->second;
-
- auto biter = entry.data.cbegin();
-
- switch (entry.type) {
- case BIIndexType::Plain:
- case BIIndexType::Instance: {
- rgw_bucket_dir_entry e;
- try {
- decode(e, biter);
- } catch (ceph::buffer::error& err) {
- CLS_LOG(0, "ERROR: %s: failed to decode buffer", __func__);
- return -EIO;
- }
- break;
- }
- case BIIndexType::OLH: {
- rgw_bucket_olh_entry e;
- try {
- decode(e, biter);
- } catch (ceph::buffer::error& err) {
- CLS_LOG(0, "ERROR: %s: failed to decode buffer (size=%d)", __func__, entry.data.length());
- return -EIO;
- }
- break;
- }
- default:
- CLS_LOG(0, "%s: invalid entry type: %d", __func__, int(entry.type));
- return -EINVAL;
- }
- CLS_LOG(20, "%s: entry.idx=%s", __func__, escape_str(entry.idx).c_str());
-
- op_ret.entries.push_back(entry);
- }
-
- encode(op_ret, *out);
-
- return 0;
-}
-
static int rgw_bi_put_op(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
CLS_LOG(10, "entered %s", __func__);
cls_method_handle_t h_rgw_obj_check_attrs_prefix;
cls_method_handle_t h_rgw_obj_check_mtime;
cls_method_handle_t h_rgw_bi_get_op;
- cls_method_handle_t h_rgw_bi_get_vals_op;
cls_method_handle_t h_rgw_bi_put_op;
cls_method_handle_t h_rgw_bi_put_entries_op;
cls_method_handle_t h_rgw_bi_list_op;
cls_register_cxx_method(h_class, RGW_OBJ_CHECK_MTIME, CLS_METHOD_RD, rgw_obj_check_mtime, &h_rgw_obj_check_mtime);
cls_register_cxx_method(h_class, RGW_BI_GET, CLS_METHOD_RD, rgw_bi_get_op, &h_rgw_bi_get_op);
- cls_register_cxx_method(h_class, RGW_BI_GET_VALS, CLS_METHOD_RD, rgw_bi_get_vals_op, &h_rgw_bi_get_vals_op);
cls_register_cxx_method(h_class, RGW_BI_PUT, CLS_METHOD_RD | CLS_METHOD_WR, rgw_bi_put_op, &h_rgw_bi_put_op);
cls_register_cxx_method(h_class, RGW_BI_PUT_ENTRIES, CLS_METHOD_RD | CLS_METHOD_WR, rgw_bi_put_entries, &h_rgw_bi_put_entries_op);
cls_register_cxx_method(h_class, RGW_BI_LIST, CLS_METHOD_RD, rgw_bi_list_op, &h_rgw_bi_list_op);
return 0;
}
-int cls_rgw_bi_get_vals(librados::IoCtx& io_ctx, const std::string oid,
- std::set<std::string>& log_entries_wanted,
- std::list<rgw_cls_bi_entry> *entries)
-{
- bufferlist in, out;
- struct rgw_cls_bi_get_vals_op call;
- call.log_entries_wanted = std::move(log_entries_wanted);
- encode(call, in);
- int r = io_ctx.exec(oid, RGW_CLASS, RGW_BI_GET_VALS, in, out);
- if (r < 0)
- return r;
-
- struct rgw_cls_bi_list_ret op_ret;
- auto iter = out.cbegin();
- try {
- decode(op_ret, iter);
- } catch (ceph::buffer::error& err) {
- return -EIO;
- }
-
- if (entries)
- entries->swap(op_ret.entries);
-
- return 0;
-}
-
int cls_rgw_bi_put(librados::IoCtx& io_ctx, const string oid, const rgw_cls_bi_entry& entry)
{
bufferlist in, out;
int cls_rgw_bi_get(librados::IoCtx& io_ctx, const std::string oid,
BIIndexType index_type, const cls_rgw_obj_key& key,
rgw_cls_bi_entry *entry);
-int cls_rgw_bi_get_vals(librados::IoCtx& io_ctx, const std::string oid,
- std::set<std::string>& log_entries_wanted,
- std::list<rgw_cls_bi_entry> *entries);
int cls_rgw_bi_put(librados::IoCtx& io_ctx, const std::string oid, const rgw_cls_bi_entry& entry);
void cls_rgw_bi_put(librados::ObjectWriteOperation& op, const std::string oid, const rgw_cls_bi_entry& entry);
// Write the given array of index entries and update bucket stats accordingly.