]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: multipart additions and fixes
authorYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 2 Jun 2011 22:24:11 +0000 (15:24 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 2 Jun 2011 22:24:11 +0000 (15:24 -0700)
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest_s3.cc

index fcc744787034a0de9c71283d73fcbe62b9377491..ad1d3890c1e876ff00eb5aca1f3cd583554f15f7 100644 (file)
@@ -489,6 +489,7 @@ void RGWPutObj::execute()
       goto done;
 
     if (multipart) {
+      bl.clear();
       map<string, bufferlist> 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<uint32_t, RGWUploadPartInfo>& parts)
+static int get_multiparts_info(struct req_state *s, string& obj, map<uint32_t, RGWUploadPartInfo>& parts,
+                               RGWAccessControlPolicy& policy)
 {
   void *handle;
   map<string, bufferlist> attrs;
@@ -885,6 +888,12 @@ static int get_multiparts_info(struct req_state *s, string& obj, map<uint32_t, R
 
   for (iter = attrs.begin(); iter != attrs.end(); ++iter) {
     string name = iter->first;
+    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<uint32_t, RGWUploadPartInfo> 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();
index e380f318998403ebc0508fe324e6d70f45925190..8f4ff3e4f837d07d93f9342bfe2ccf6505d03094 100644 (file)
@@ -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<uint32_t, RGWUploadPartInfo> 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();
 
index 476d2dbf981a3dfdf7ff4e2814c50d0180ba389e..0b28fc9002b7c1fe1b2c006b3e5f94db52fc034b 100644 (file)
@@ -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<uint32_t, RGWUploadPartInfo>::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;