From 37666185a8521810018f6efcdea78ee158e7f234 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 2 Jun 2011 15:24:11 -0700 Subject: [PATCH] rgw: multipart additions and fixes --- src/rgw/rgw_op.cc | 17 +++++++++++++---- src/rgw/rgw_op.h | 3 +++ src/rgw/rgw_rest_s3.cc | 5 +++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index fcc744787034a..ad1d3890c1e87 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -489,6 +489,7 @@ void RGWPutObj::execute() goto done; if (multipart) { + bl.clear(); map meta_attrs; RGWUploadPartInfo info; string p = "part."; @@ -498,6 +499,7 @@ void RGWPutObj::execute() info.size = s->obj_size; info.modified = g_clock.now(); ::encode(info, bl); + RGW_LOG(0) << "JJJ name=" << p << "bl.length()=" << bl.length() << dendl; meta_attrs[p] = bl; ret = rgwstore->put_obj_meta(s->user.user_id, s->bucket_str, multipart_meta_obj, NULL, meta_attrs, false); @@ -870,7 +872,8 @@ done: send_response(); } -static int get_multiparts_info(struct req_state *s, string& obj, map& parts) +static int get_multiparts_info(struct req_state *s, string& obj, map& parts, + RGWAccessControlPolicy& policy) { void *handle; map attrs; @@ -885,6 +888,12 @@ static int get_multiparts_info(struct req_state *s, string& obj, mapfirst; + if (name.compare(RGW_ATTR_ACL) == 0) { + bufferlist& bl = iter->second; + bufferlist::iterator bli = bl.begin(); + ::decode(policy, bli); + continue; + } if (name.compare(0, 5, "part.") != 0) continue; @@ -904,6 +913,7 @@ void RGWCompleteMultipart::execute() RGWMultiXMLParser parser; string obj = s->object_str; map obj_parts; + RGWAccessControlPolicy policy; ret = get_params(); if (ret < 0) @@ -937,7 +947,7 @@ void RGWCompleteMultipart::execute() obj.append("."); obj.append(upload_id); - ret = get_multiparts_info(s, obj, obj_parts); + ret = get_multiparts_info(s, obj, obj_parts, policy); if (ret < 0) goto done; @@ -955,8 +965,7 @@ void RGWListMultipart::execute() obj.append("."); obj.append(upload_id); - - ret = get_multiparts_info(s, obj, parts); + ret = get_multiparts_info(s, obj, parts, policy); done: send_response(); diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index e380f31899840..8f4ff3e4f837d 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -14,6 +14,7 @@ #include "rgw_common.h" #include "rgw_access.h" #include "rgw_user.h" +#include "rgw_acl.h" using namespace std; @@ -379,6 +380,7 @@ protected: map parts; int max_parts; int marker; + RGWAccessControlPolicy policy; public: RGWListMultipart() {} @@ -390,6 +392,7 @@ public: parts.clear(); max_parts = 1000; marker = 0; + policy = RGWAccessControlPolicy(); } void execute(); diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 476d2dbf981a3..0b28fc9002b7c 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -287,11 +287,13 @@ void RGWListMultipart_REST_S3::send_response() set_req_state_err(s, ret); dump_errno(s); end_header(s, "application/xml"); + if (ret == 0) { dump_start(s); s->formatter->open_obj_section("ListMultipartUploadResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\""); map::iterator iter, test_iter; int i, cur_max = 0; + iter = parts.upper_bound(marker); for (i = 0, test_iter = iter; test_iter != parts.end() && i < max_parts; ++test_iter, ++i) { cur_max = test_iter->first; @@ -305,6 +307,9 @@ void RGWListMultipart_REST_S3::send_response() s->formatter->dump_value_str("MaxParts", "%d", max_parts); s->formatter->dump_value_str("IsTruncated", "%s", (test_iter == parts.end() ? "false" : "true")); + ACLOwner& owner = policy.get_owner(); + dump_owner(s, owner.get_id(), owner.get_display_name()); + for (; iter != parts.end(); ++iter) { RGWUploadPartInfo& info = iter->second; -- 2.39.5