From d3a3d5ae5859cd7f2eed307e8f942f9a9fd75f35 Mon Sep 17 00:00:00 2001 From: Dmytro Iurchenko Date: Mon, 16 Feb 2015 18:47:59 +0200 Subject: [PATCH] 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 --- src/rgw/rgw_op.cc | 12 ++++++++++-- src/rgw/rgw_op.h | 2 ++ src/rgw/rgw_rest_swift.cc | 3 +++ src/rgw/rgw_rest_swift.h | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index c6992b2df8471..26238c91215cb 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1193,12 +1193,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 1be7db7ac7046..577df8527041d 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -245,6 +245,7 @@ public: class RGWListBucket : public RGWOp { protected: + RGWBucketEnt bucket; string prefix; rgw_obj_key marker; rgw_obj_key next_marker; @@ -273,6 +274,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 b4b40940777c7..12976553b2532 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -151,12 +151,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 2374e15bd0fd2..811bf0deaea67 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 { -- 2.39.5