cls_handle_t h_class;
cls_method_handle_t h_user_set_buckets_info;
+cls_method_handle_t h_user_complete_stats_sync;
cls_method_handle_t h_user_remove_bucket;
cls_method_handle_t h_user_list_buckets;
cls_method_handle_t h_user_get_header;
return 0;
}
+static int cls_user_complete_stats_sync(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
+{
+ bufferlist::iterator in_iter = in->begin();
+
+ cls_user_complete_stats_sync_op op;
+ try {
+ ::decode(op, in_iter);
+ } catch (buffer::error& err) {
+ CLS_LOG(1, "ERROR: cls_user_add_op(): failed to decode op");
+ return -EINVAL;
+ }
+
+ cls_user_header header;
+ int ret = read_header(hctx, &header);
+ if (ret < 0) {
+ CLS_LOG(0, "ERROR: failed to read user info header ret=%d", ret);
+ return ret;
+ }
+
+ if (header.last_stats_sync < op.time)
+ header.last_stats_sync = op.time;
+
+ bufferlist bl;
+
+ ::encode(header, bl);
+
+ ret = cls_cxx_map_write_header(hctx, &bl);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
static int cls_user_remove_bucket(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
bufferlist::iterator in_iter = in->begin();
/* log */
cls_register_cxx_method(h_class, "set_buckets_info", CLS_METHOD_RD | CLS_METHOD_WR,
cls_user_set_buckets_info, &h_user_set_buckets_info);
+ cls_register_cxx_method(h_class, "complete_stats_sync", CLS_METHOD_RD | CLS_METHOD_WR,
+ cls_user_complete_stats_sync, &h_user_set_buckets_info);
cls_register_cxx_method(h_class, "remove_bucket", CLS_METHOD_RD | CLS_METHOD_WR, cls_user_remove_bucket, &h_user_remove_bucket);
cls_register_cxx_method(h_class, "list_buckets", CLS_METHOD_RD, cls_user_list_buckets, &h_user_list_buckets);
cls_register_cxx_method(h_class, "get_header", CLS_METHOD_RD, cls_user_get_header, &h_user_get_header);
op.exec("user", "set_buckets_info", in);
}
+void cls_user_complete_stats_sync(librados::ObjectWriteOperation& op)
+{
+ bufferlist in;
+ cls_user_complete_stats_sync_op call;
+ call.time = ceph_clock_now(NULL);
+ ::encode(call, in);
+ op.exec("user", "complete_stats_sync", in);
+}
+
void cls_user_remove_bucket(librados::ObjectWriteOperation& op, const cls_user_bucket& bucket)
{
bufferlist in;
*/
void cls_user_set_buckets(librados::ObjectWriteOperation& op, list<cls_user_bucket_entry>& entries);
+void cls_user_complete_stats_sync(librados::ObjectWriteOperation& op);
void cls_user_remove_bucket(librados::ObjectWriteOperation& op, const cls_user_bucket& bucket);
void cls_user_bucket_list(librados::ObjectReadOperation& op,
const string& in_marker, int max_entries,
};
WRITE_CLASS_ENCODER(cls_user_get_header_ret)
+struct cls_user_complete_stats_sync_op {
+ utime_t time;
+
+ cls_user_complete_stats_sync_op() {}
+
+ void encode(bufferlist& bl) const {
+ ENCODE_START(1, 1, bl);
+ ::encode(time, bl);
+ ENCODE_FINISH(bl);
+ }
+
+ void decode(bufferlist::iterator& bl) {
+ DECODE_START(1, bl);
+ ::decode(time, bl);
+ DECODE_FINISH(bl);
+ }
+};
+WRITE_CLASS_ENCODER(cls_user_complete_stats_sync_op)
+
#endif
return 0;
}
+int RGWRados::cls_user_complete_stats_sync(rgw_obj& obj)
+{
+ bufferlist bl;
+ librados::IoCtx io_ctx;
+ rgw_bucket bucket;
+ std::string oid, key;
+ get_obj_bucket_and_oid_key(obj, bucket, oid, key);
+ int r = open_bucket_data_ctx(bucket, io_ctx);
+ if (r < 0)
+ return r;
+
+ librados::ObjectWriteOperation op;
+ ::cls_user_complete_stats_sync(op);
+ r = io_ctx.operate(oid, &op);
+ if (r < 0)
+ return r;
+
+ return 0;
+}
+
int RGWRados::cls_user_add_bucket(rgw_obj& obj, const cls_user_bucket_entry& entry)
{
list<cls_user_bucket_entry> l;
string *out_marker, bool *truncated);
int cls_user_add_bucket(rgw_obj& obj, const cls_user_bucket_entry& entry);
int cls_user_update_buckets(rgw_obj& obj, list<cls_user_bucket_entry>& entries);
+ int cls_user_complete_stats_sync(rgw_obj& obj);
int cls_user_add_bucket(rgw_obj& obj, list<cls_user_bucket_entry>& entries);
int cls_user_remove_bucket(rgw_obj& obj, const cls_user_bucket& bucket);