From ba3951289212d49f83c764b95cd07b8fd94262b7 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 13 Jan 2014 12:42:07 -0800 Subject: [PATCH] cls_user: op to keep track of sync completion time Signed-off-by: Yehuda Sadeh --- src/cls/user/cls_user.cc | 36 +++++++++++++++++++++++++++++++++ src/cls/user/cls_user_client.cc | 9 +++++++++ src/cls/user/cls_user_client.h | 1 + src/cls/user/cls_user_ops.h | 19 +++++++++++++++++ src/rgw/rgw_rados.cc | 20 ++++++++++++++++++ src/rgw/rgw_rados.h | 1 + 6 files changed, 86 insertions(+) diff --git a/src/cls/user/cls_user.cc b/src/cls/user/cls_user.cc index 44186bc7fc65a..3b82eab4fb7cb 100644 --- a/src/cls/user/cls_user.cc +++ b/src/cls/user/cls_user.cc @@ -19,6 +19,7 @@ CLS_NAME(user) 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; @@ -181,6 +182,39 @@ static int cls_user_set_buckets_info(cls_method_context_t hctx, bufferlist *in, 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(); @@ -323,6 +357,8 @@ void __cls_init() /* 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); diff --git a/src/cls/user/cls_user_client.cc b/src/cls/user/cls_user_client.cc index 6bbe416ba8d31..a21616007e275 100644 --- a/src/cls/user/cls_user_client.cc +++ b/src/cls/user/cls_user_client.cc @@ -22,6 +22,15 @@ void cls_user_set_buckets(librados::ObjectWriteOperation& op, list& 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, diff --git a/src/cls/user/cls_user_ops.h b/src/cls/user/cls_user_ops.h index 67d3aedd91ec3..5beb2f17c4e74 100644 --- a/src/cls/user/cls_user_ops.h +++ b/src/cls/user/cls_user_ops.h @@ -131,5 +131,24 @@ struct cls_user_get_header_ret { }; 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 diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 9d45a6bfbb850..f4e7f3999339f 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -5805,6 +5805,26 @@ int RGWRados::cls_user_update_buckets(rgw_obj& obj, list& 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 l; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 65a2afd4c9cce..b80e5fa673b2b 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1446,6 +1446,7 @@ public: 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& entries); + int cls_user_complete_stats_sync(rgw_obj& obj); int cls_user_add_bucket(rgw_obj& obj, list& entries); int cls_user_remove_bucket(rgw_obj& obj, const cls_user_bucket& bucket); -- 2.39.5