]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw, radosgw-admin, cls/user: retrieve user stats
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 8 Jan 2014 01:29:39 +0000 (17:29 -0800)
committerYehuda Sadeh <yehuda@inktank.com>
Fri, 24 Jan 2014 18:28:48 +0000 (10:28 -0800)
add a new op to retrieve user header, new radosgw-admin command to stat
user.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/cls/Makefile.am
src/cls/user/cls_user_client.h
src/cls/user/cls_user_types.cc [new file with mode: 0644]
src/cls/user/cls_user_types.h
src/rgw/rgw_admin.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index b88b5cc33621c0e2f10c5da29fd8be9d9cf526df..22bbb3f32d4f1e8d10458e53769367cd6a94795f 100644 (file)
@@ -100,7 +100,7 @@ DENCODER_DEPS += libcls_rgw_client.la
 libcls_rbd_client_la_SOURCES = cls/rbd/cls_rbd_client.cc
 noinst_LTLIBRARIES += libcls_rbd_client.la
 
-libcls_user_client_a_SOURCES = cls/user/cls_user_client.cc
+libcls_user_client_a_SOURCES = cls/user/cls_user_client.cc cls/user/cls_user_types.cc
 noinst_LIBRARIES += libcls_user_client.a
 
 noinst_HEADERS += \
index 0f65875dbd7ab5eb2787d2aca76394881b8fbb87..661397c82b8281ee18dc4e274a210dc4c6d30b16 100644 (file)
@@ -18,5 +18,6 @@ void cls_user_bucket_list(librados::ObjectReadOperation& op,
                        const string& in_marker, int max_entries,
                        list<cls_user_bucket_entry>& entries,
                        string *out_marker, bool *truncated);
+void cls_user_get_header(librados::ObjectReadOperation& op, cls_user_header *header);
 
 #endif
diff --git a/src/cls/user/cls_user_types.cc b/src/cls/user/cls_user_types.cc
new file mode 100644 (file)
index 0000000..59f0bdc
--- /dev/null
@@ -0,0 +1,14 @@
+// -*- mode:C; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "cls/user/cls_user_types.h"
+#include "common/Formatter.h"
+
+
+void cls_user_header::dump(Formatter *f) const
+{
+  f->dump_int("total_entries", total_entries);
+  f->dump_int("total_bytes", total_bytes);
+  f->dump_int("total_bytes_rounded", total_bytes_rounded);
+}
+
index 1eddc10aadfa5efcddbd8f5622f07e03308602ff..dde508b0ab7a7b5d117679b9e085caa2b42f1792 100644 (file)
@@ -127,6 +127,8 @@ struct cls_user_header {
     ::decode(total_bytes_rounded, bl);
     DECODE_FINISH(bl);
   }
+
+  void dump(Formatter *f) const;
 };
 WRITE_CLASS_ENCODER(cls_user_header)
 
index cb6c3022396f0d8404cb8e79aa9c3156ad659be2..ac92e57cd01b3795f8044a41c3a3aa03702e5ad6 100644 (file)
@@ -187,6 +187,7 @@ enum {
   OPT_USER_SUSPEND,
   OPT_USER_ENABLE,
   OPT_USER_CHECK,
+  OPT_USER_STAT,
   OPT_SUBUSER_CREATE,
   OPT_SUBUSER_MODIFY,
   OPT_SUBUSER_RM,
@@ -300,6 +301,8 @@ static int get_cmd(const char *cmd, const char *prev_cmd, bool *need_more)
       return OPT_USER_ENABLE;
     if (strcmp(cmd, "check") == 0)
       return OPT_USER_CHECK;
+    if (strcmp(cmd, "stat") == 0)
+      return OPT_USER_STAT;
   } else if (strcmp(prev_cmd, "subuser") == 0) {
     if (strcmp(cmd, "create") == 0)
       return OPT_SUBUSER_CREATE;
@@ -1885,6 +1888,24 @@ next:
     check_bad_user_bucket_mapping(store, user_id, fix);
   }
 
+  if (opt_cmd == OPT_USER_STAT) {
+    if (user_id.empty()) {
+      cerr << "ERROR: uid not specified" << std::endl;
+      return EINVAL;
+    }
+    rgw_obj obj(store->zone.user_uid_pool, user_id);
+
+    cls_user_header header;
+    int ret = store->cls_user_get_header(obj, &header);
+    if (ret < 0) {
+      cerr << "ERROR: can't read user header: " << cpp_strerror(-ret) << std::endl;
+      return -ret;
+    }
+
+    encode_json("header", header, formatter);
+    formatter->flush(cout);
+  }
+
   if (opt_cmd == OPT_METADATA_GET) {
     int ret = store->meta_mgr->get(metadata_key, formatter);
     if (ret < 0) {
@@ -2333,5 +2354,6 @@ next:
       set_user_bucket_quota(opt_cmd, user, user_op, max_size, max_objects, have_max_size, have_max_objects);
     }
   }
+
   return 0;
 }
index 3d517f2add7e17ac4fb928695ac130c01655dc45..35fdf6dbb54fcba77625ee225d29c0a5d9bf9db6 100644 (file)
@@ -5587,12 +5587,31 @@ int RGWRados::cls_bucket_head_async(rgw_bucket& bucket, RGWGetDirHeader_CB *ctx)
   return 0;
 }
 
+int RGWRados::cls_user_get_header(rgw_obj& obj, cls_user_header *header)
+{
+  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::ObjectReadOperation op;
+  ::cls_user_get_header(op, header);
+  bufferlist ibl;
+  r = io_ctx.operate(oid, &op, &ibl);
+  if (r < 0)
+    return r;
+
+  return 0;
+}
+
 int RGWRados::cls_user_list_buckets(rgw_obj& obj,
                                     const string& in_marker, int max_entries,
                                     list<cls_user_bucket_entry>& entries,
                                     string *out_marker, bool *truncated)
 {
-  bufferlist bl;
   librados::IoCtx io_ctx;
   rgw_bucket bucket;
   std::string oid, key;
index 22e459308f1c2bdff5cfc3ff33f74df56570518e..ff5936536f038c5662ba7c157872b479b58e3595 100644 (file)
@@ -1410,6 +1410,7 @@ public:
   int bucket_rebuild_index(rgw_bucket& bucket);
   int remove_objs_from_index(rgw_bucket& bucket, list<string>& oid_list);
 
+  int cls_user_get_header(rgw_obj& obj, cls_user_header *header);
   int cls_user_list_buckets(rgw_obj& obj,
                             const string& in_marker, int max_entries,
                             list<cls_user_bucket_entry>& entries,