]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_user: op to keep track of sync completion time
authorYehuda Sadeh <yehuda@inktank.com>
Mon, 13 Jan 2014 20:42:07 +0000 (12:42 -0800)
committerYehuda Sadeh <yehuda@inktank.com>
Fri, 24 Jan 2014 18:28:52 +0000 (10:28 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/cls/user/cls_user.cc
src/cls/user/cls_user_client.cc
src/cls/user/cls_user_client.h
src/cls/user/cls_user_ops.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 44186bc7fc65aefa1f9fb9e7fb1368cf65ee68b6..3b82eab4fb7cb6929989634a3fb374bb95f435f0 100644 (file)
@@ -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);
index 6bbe416ba8d31bc8e9ffca6eccb3cec6b0dae99e..a21616007e275a7105d6a22dc4a55cfe572eb914 100644 (file)
@@ -22,6 +22,15 @@ void cls_user_set_buckets(librados::ObjectWriteOperation& op, list<cls_user_buck
   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;
index 00ef4bb1aa447a0841891270ece1344096634332..34f8278a41c2a4c60a45bc18bf5f076678237d3f 100644 (file)
@@ -20,6 +20,7 @@ public:
  */
 
 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,
index 67d3aedd91ec3866d6d43603446e952390941da7..5beb2f17c4e7428e46c5d5f7f51c080d6f497bac 100644 (file)
@@ -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
index 9d45a6bfbb8509ee4d1a74425306d3c31c0e5dd6..f4e7f3999339f2a7bab580e361e3baf38d5db41a 100644 (file)
@@ -5805,6 +5805,26 @@ int RGWRados::cls_user_update_buckets(rgw_obj& obj, list<cls_user_bucket_entry>&
   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;
index 65a2afd4c9cce174d3e33102be1eab2f6e7f2ee1..b80e5fa673b2b500ea006bfdcf16d2d50c9f3643 100644 (file)
@@ -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<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);