cls_method_handle_t h_rgw_bucket_list;
cls_method_handle_t h_rgw_bucket_check_index;
cls_method_handle_t h_rgw_bucket_rebuild_index;
+cls_method_handle_t h_rgw_bucket_update_stats;
cls_method_handle_t h_rgw_bucket_prepare_op;
cls_method_handle_t h_rgw_bucket_complete_op;
cls_method_handle_t h_rgw_bucket_link_olh;
return write_bucket_header(hctx, &calc_header);
}
+int rgw_bucket_update_stats(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
+{
+ // decode request
+ rgw_cls_bucket_update_stats_op op;
+ auto iter = in->begin();
+ try {
+ ::decode(op, iter);
+ } catch (buffer::error& err) {
+ CLS_LOG(1, "ERROR: %s(): failed to decode request\n", __func__);
+ return -EINVAL;
+ }
+
+ struct rgw_bucket_dir_header header;
+ int rc = read_bucket_header(hctx, &header);
+ if (rc < 0) {
+ CLS_LOG(1, "ERROR: %s(): failed to read header\n", __func__);
+ return rc;
+ }
+
+ for (auto& s : op.stats) {
+ auto& dest = header.stats[s.first];
+ if (op.absolute) {
+ dest = s.second;
+ } else {
+ dest.total_size += s.second.total_size;
+ dest.total_size_rounded += s.second.total_size_rounded;
+ dest.num_entries += s.second.num_entries;
+ }
+ }
+
+ return write_bucket_header(hctx, &header);
+}
int rgw_bucket_init_index(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
cls_register_cxx_method(h_class, "bucket_list", CLS_METHOD_RD, rgw_bucket_list, &h_rgw_bucket_list);
cls_register_cxx_method(h_class, "bucket_check_index", CLS_METHOD_RD, rgw_bucket_check_index, &h_rgw_bucket_check_index);
cls_register_cxx_method(h_class, "bucket_rebuild_index", CLS_METHOD_RD | CLS_METHOD_WR, rgw_bucket_rebuild_index, &h_rgw_bucket_rebuild_index);
+ cls_register_cxx_method(h_class, "bucket_update_stats", CLS_METHOD_RD | CLS_METHOD_WR, rgw_bucket_update_stats, &h_rgw_bucket_update_stats);
cls_register_cxx_method(h_class, "bucket_prepare_op", CLS_METHOD_RD | CLS_METHOD_WR, rgw_bucket_prepare_op, &h_rgw_bucket_prepare_op);
cls_register_cxx_method(h_class, "bucket_complete_op", CLS_METHOD_RD | CLS_METHOD_WR, rgw_bucket_complete_op, &h_rgw_bucket_complete_op);
cls_register_cxx_method(h_class, "bucket_link_olh", CLS_METHOD_RD | CLS_METHOD_WR, rgw_bucket_link_olh, &h_rgw_bucket_link_olh);
return issue_bucket_set_tag_timeout_op(io_ctx, oid, tag_timeout, &manager);
}
+void cls_rgw_bucket_update_stats(librados::ObjectWriteOperation& o, bool absolute,
+ const map<uint8_t, rgw_bucket_category_stats>& stats)
+{
+ struct rgw_cls_bucket_update_stats_op call;
+ call.absolute = absolute;
+ call.stats = stats;
+ bufferlist in;
+ ::encode(call, in);
+ o.exec("rgw", "bucket_update_stats", in);
+}
+
void cls_rgw_bucket_prepare_op(ObjectWriteOperation& o, RGWModifyOp op, string& tag,
const cls_rgw_obj_key& key, const string& locator, bool log_op,
uint16_t bilog_flags)
CLSRGWConcurrentIO(ioc, _bucket_objs, _max_aio), tag_timeout(_tag_timeout) {}
};
+void cls_rgw_bucket_update_stats(librados::ObjectWriteOperation& o, bool absolute,
+ map<uint8_t, rgw_bucket_category_stats>& stats);
+
void cls_rgw_bucket_prepare_op(librados::ObjectWriteOperation& o, RGWModifyOp op, string& tag,
const cls_rgw_obj_key& key, const string& locator, bool log_op,
uint16_t bilog_op);
::encode_json("calculated_header", calculated_header, f);
}
+void rgw_cls_bucket_update_stats_op::generate_test_instances(list<rgw_cls_bucket_update_stats_op*>& o)
+{
+ rgw_cls_bucket_update_stats_op *r = new rgw_cls_bucket_update_stats_op;
+ r->absolute = true;
+ rgw_bucket_category_stats& s = r->stats[0];
+ s.total_size = 1;
+ s.total_size_rounded = 4096;
+ s.num_entries = 1;
+ o.push_back(r);
+
+ o.push_back(new rgw_cls_bucket_update_stats_op);
+}
+
+void rgw_cls_bucket_update_stats_op::dump(Formatter *f) const
+{
+ ::encode_json("absolute", absolute, f);
+ map<int, rgw_bucket_category_stats> s;
+ for (auto& entry : stats) {
+ s[(int)entry.first] = entry.second;
+ }
+ ::encode_json("stats", s, f);
+}
+
void cls_rgw_bi_log_list_op::dump(Formatter *f) const
{
f->dump_string("marker", marker);
};
WRITE_CLASS_ENCODER(rgw_cls_check_index_ret)
+struct rgw_cls_bucket_update_stats_op
+{
+ bool absolute{false};
+ map<uint8_t, rgw_bucket_category_stats> stats;
+
+ rgw_cls_bucket_update_stats_op() {}
+
+ void encode(bufferlist &bl) const {
+ ENCODE_START(1, 1, bl);
+ ::encode(absolute, bl);
+ ::encode(stats, bl);
+ ENCODE_FINISH(bl);
+ }
+ void decode(bufferlist::iterator &bl) {
+ DECODE_START(1, bl);
+ ::decode(absolute, bl);
+ ::decode(stats, bl);
+ DECODE_FINISH(bl);
+ }
+ void dump(Formatter *f) const;
+ static void generate_test_instances(list<rgw_cls_bucket_update_stats_op *>& o);
+};
+WRITE_CLASS_ENCODER(rgw_cls_bucket_update_stats_op)
+
struct rgw_cls_obj_remove_op {
list<string> keep_attr_prefixes;