From: Dmytro Iurchenko Date: Mon, 16 Feb 2015 16:47:59 +0000 (+0200) Subject: rgw: Swift API. Complement the response to "show container details" X-Git-Tag: v0.94.2~27^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F4577%2Fhead;p=ceph.git rgw: Swift API. Complement the response to "show container details" OpenStack Object Storage API v1 states that X-Container-Object-Count, X-Container-Bytes-Used and user-defined metadata headers should be included in a response. Fixes: #10666 Backport: hammer Reported-by: Ahmad Faheem Reviewed-by: Yehuda Sadeh Signed-off-by: Dmytro Iurchenko (cherry picked from commit d3a3d5ae5859cd7f2eed307e8f942f9a9fd75f35) --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 3ec8dbae0826..b6c69ea2abf0 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1191,12 +1191,20 @@ void RGWListBucket::pre_exec() void RGWListBucket::execute() { - string no_ns; - ret = get_params(); if (ret < 0) return; + if (need_container_stats()) { + map m; + m[s->bucket.name] = RGWBucketEnt(); + m.begin()->second.bucket = s->bucket; + ret = store->update_containers_stats(m); + if (ret > 0) { + bucket = m.begin()->second; + } + } + RGWRados::Bucket target(store, s->bucket); RGWRados::Bucket::List list_op(&target); diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index a009ec38e807..4aaeae717444 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -237,6 +237,7 @@ public: class RGWListBucket : public RGWOp { protected: + RGWBucketEnt bucket; string prefix; rgw_obj_key marker; rgw_obj_key next_marker; @@ -265,6 +266,7 @@ public: virtual const string name() { return "list_bucket"; } virtual RGWOpType get_type() { return RGW_OP_LIST_BUCKET; } virtual uint32_t op_mask() { return RGW_OP_TYPE_READ; } + virtual bool need_container_stats() { return false; } }; class RGWGetBucketLogging : public RGWOp { diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index c0aef74fe56d..b03ab4f8647b 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -131,12 +131,15 @@ int RGWListBucket_ObjStore_SWIFT::get_params() return 0; } +static void dump_container_metadata(struct req_state *, RGWBucketEnt&); + void RGWListBucket_ObjStore_SWIFT::send_response() { vector::iterator iter = objs.begin(); map::iterator pref_iter = common_prefixes.begin(); dump_start(s); + dump_container_metadata(s, bucket); s->formatter->open_array_section_with_attrs("container", FormatterAttrs("name", s->bucket.name.c_str(), NULL)); diff --git a/src/rgw/rgw_rest_swift.h b/src/rgw/rgw_rest_swift.h index 2374e15bd0fd..811bf0deaea6 100644 --- a/src/rgw/rgw_rest_swift.h +++ b/src/rgw/rgw_rest_swift.h @@ -40,6 +40,7 @@ public: int get_params(); void send_response(); + bool need_container_stats() { return true; } }; class RGWStatAccount_ObjStore_SWIFT : public RGWStatAccount_ObjStore {