From: Radoslaw Zarzynski Date: Thu, 5 Mar 2015 12:27:34 +0000 (+0100) Subject: rgw: add support for reading metadata on Swift account. X-Git-Tag: v9.0.3~179^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f2cc53086c414dfd232d96a5e3aa53a5557b263d;p=ceph.git rgw: add support for reading metadata on Swift account. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index fa8f219904f..4611357b0ee 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -993,8 +993,16 @@ void RGWListBuckets::execute() uint64_t max_buckets = s->cct->_conf->rgw_list_buckets_max_chunk; ret = get_params(); - if (ret < 0) + if (ret < 0) { goto send_end; + } + + if (supports_account_metadata()) { + ret = rgw_get_user_attrs_by_uid(store, s->user.user_id, attrs); + if (ret < 0) { + goto send_end; + } + } do { RGWUserBuckets buckets; diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index e5c1fde009a..5c5a445757e 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -191,6 +191,7 @@ protected: uint64_t buckets_objcount; uint64_t buckets_size; uint64_t buckets_size_rounded; + map attrs; public: RGWListBuckets() : ret(0), sent_data(false) { @@ -211,6 +212,7 @@ public: virtual void send_response() {} virtual bool should_get_stats() { return false; } + virtual bool supports_account_metadata() { return false; } virtual const string name() { return "list_buckets"; } virtual RGWOpType get_type() { return RGW_OP_LIST_BUCKETS; } @@ -235,7 +237,7 @@ public: } int verify_permission(); - void execute(); + virtual void execute(); virtual void send_response() = 0; virtual const string name() { return "stat_account"; } diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index b48fcb74fe4..847dd85cd94 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -45,8 +45,12 @@ int RGWListBuckets_ObjStore_SWIFT::get_params() return 0; } -static void dump_account_metadata(struct req_state *s, uint32_t buckets_count, - uint64_t buckets_object_count, uint64_t buckets_size, uint64_t buckets_size_rounded) +static void dump_account_metadata(struct req_state * const s, + const uint32_t buckets_count, + const uint64_t buckets_object_count, + const uint64_t buckets_size, + const uint64_t buckets_size_rounded, + map& attrs) { char buf[32]; utime_t now = ceph_clock_now(g_ceph_context); @@ -61,6 +65,18 @@ static void dump_account_metadata(struct req_state *s, uint32_t buckets_count, s->cio->print("X-Account-Bytes-Used: %s\r\n", buf); snprintf(buf, sizeof(buf), "%lld", (long long)buckets_size_rounded); s->cio->print("X-Account-Bytes-Used-Actual: %s\r\n", buf); + + // Dump user-defined metadata items + const size_t PREFIX_LEN = sizeof(RGW_ATTR_META_PREFIX) - 1; + map::iterator iter; + for (iter = attrs.lower_bound(RGW_ATTR_META_PREFIX); iter != attrs.end(); ++iter) { + const char *name = iter->first.c_str(); + if (strncmp(name, RGW_ATTR_META_PREFIX, PREFIX_LEN) == 0) { + s->cio->print("X-Account-Meta-%s: %s\r\n", name + PREFIX_LEN, iter->second.c_str()); + } else { + break; + } + } } void RGWListBuckets_ObjStore_SWIFT::send_response_begin(bool has_buckets) @@ -72,7 +88,7 @@ void RGWListBuckets_ObjStore_SWIFT::send_response_begin(bool has_buckets) set_req_state_err(s, ret); } /* Adding account stats in the header to keep align with Swift API */ - dump_account_metadata(s, buckets_count, buckets_objcount, buckets_size, buckets_size_rounded); + dump_account_metadata(s, buckets_count, buckets_objcount, buckets_size, buckets_size_rounded, attrs); dump_errno(s); end_header(s, NULL); @@ -285,11 +301,18 @@ static void dump_container_metadata(struct req_state *s, RGWBucketEnt& bucket) } } +void RGWStatAccount_ObjStore_SWIFT::execute() +{ + RGWStatAccount_ObjStore::execute(); + + ret = rgw_get_user_attrs_by_uid(store, s->user.user_id, attrs); +} + void RGWStatAccount_ObjStore_SWIFT::send_response() { if (ret >= 0) { ret = STATUS_NO_CONTENT; - dump_account_metadata(s, buckets_count, buckets_objcount, buckets_size, buckets_size_rounded); + dump_account_metadata(s, buckets_count, buckets_objcount, buckets_size, buckets_size_rounded, attrs); } set_req_state_err(s, ret); diff --git a/src/rgw/rgw_rest_swift.h b/src/rgw/rgw_rest_swift.h index 811bf0deaea..bf9dfcdc4ea 100644 --- a/src/rgw/rgw_rest_swift.h +++ b/src/rgw/rgw_rest_swift.h @@ -28,6 +28,7 @@ public: void send_response_end(); bool should_get_stats() { return need_stats; } + bool supports_account_metadata() { return true; } }; class RGWListBucket_ObjStore_SWIFT : public RGWListBucket_ObjStore { @@ -44,11 +45,13 @@ public: }; class RGWStatAccount_ObjStore_SWIFT : public RGWStatAccount_ObjStore { + map attrs; public: RGWStatAccount_ObjStore_SWIFT() { } ~RGWStatAccount_ObjStore_SWIFT() {} + void execute(); void send_response(); };