]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: extend multipart list parts response
authorYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 2 Jun 2011 20:33:49 +0000 (13:33 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Thu, 2 Jun 2011 20:33:49 +0000 (13:33 -0700)
src/rgw/rgw_op.h
src/rgw/rgw_rest.cc
src/rgw/rgw_rest_s3.cc

index c6510055f608a2f65251037768729c0edb343fa5..e380f318998403ebc0508fe324e6d70f45925190 100644 (file)
@@ -377,6 +377,8 @@ protected:
   int ret;
   string upload_id;
   map<uint32_t, RGWUploadPartInfo> parts;
+  int max_parts;
+  int marker;
 
 public:
   RGWListMultipart() {}
@@ -385,6 +387,9 @@ public:
     RGWOp::init(s);
     ret = 0;
     upload_id = "";
+    parts.clear();
+    max_parts = 1000;
+    marker = 0;
   }
   void execute();
 
index a7af81322ad7d28de025073c86b152f0a8498245..23a2c50dca90db6e7792e3d0839c12356c334816 100644 (file)
@@ -316,12 +316,17 @@ int RGWCompleteMultipart_REST::get_params()
 int RGWListMultipart_REST::get_params()
 {
   upload_id = s->args.get("uploadId");
-RGW_LOG(0) << "upload_id=" << upload_id << dendl;
 
   if (upload_id.empty()) {
     ret = -ENOTSUP;
   }
-RGW_LOG(0) << "upload_id=" << upload_id << dendl;
+  string str = s->args.get("part-number-marker");
+  if (!str.empty())
+    marker = atoi(str.c_str());
+  
+  str = s->args.get("max-parts");
+  if (!str.empty())
+    max_parts = atoi(str.c_str());
 
   return ret;
 }
index 9a1aaaced229f477a2cf6b3876cdd36c57c2b9fe..b4fcce4e4d77ea6cc90f2b723b2e450496be7d20 100644 (file)
@@ -270,10 +270,12 @@ void RGWCompleteMultipart_REST_S3::send_response()
   if (ret == 0) { 
     dump_start(s);
     s->formatter->open_obj_section("CompleteMultipartUploadResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"");
-    // s->formatter->dump_value_str("Location" ...
+    const char *gateway_dns_name = FCGX_GetParam("RGW_DNS_NAME", s->fcgx->envp);
+    if (gateway_dns_name)
+      s->formatter->dump_value_str("Location", "%s.%s", s->bucket, gateway_dns_name);
     s->formatter->dump_value_str("Bucket", s->bucket);
     s->formatter->dump_value_str("Key", s->object);
-    s->formatter->dump_value_str("ETag", upload_id.c_str());
+    s->formatter->dump_value_str("ETag", etag.c_str());
     s->formatter->close_section("CompleteMultipartUploadResult");
     s->formatter->flush();
   }
@@ -288,8 +290,21 @@ void RGWListMultipart_REST_S3::send_response()
   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;
-    for (iter = parts.begin(); iter != parts.end(); ++iter) {
+    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;
+    }
+    s->formatter->dump_value_str("Bucket", s->bucket);
+    s->formatter->dump_value_str("Key", s->object);
+    s->formatter->dump_value_str("UploadId", upload_id.c_str());
+    s->formatter->dump_value_str("StorageClass", "STANDARD");
+    s->formatter->dump_value_str("PartNumberMarker", "%d", marker);
+    s->formatter->dump_value_str("NextPartNumberMarker", "%d", cur_max + 1);
+    s->formatter->dump_value_str("MaxParts", "%d", max_parts);
+    s->formatter->dump_value_str("IsTruncated", "%s", (test_iter == parts.end() ? "false" : "true"));
+    for (; iter != parts.end(); ++iter) {
       RGWUploadPartInfo& info = iter->second;
       s->formatter->open_obj_section("Part");
       s->formatter->dump_value_int("PartNumber", "%u", info.num);
@@ -297,10 +312,6 @@ void RGWListMultipart_REST_S3::send_response()
       s->formatter->dump_value_int("Size", "%llu", info.size);
       s->formatter->close_section("Part");
     }
-    // s->formatter->dump_value_str("Location" ...
-    // s->formatter->dump_value_str("Bucket", s->bucket);
-    // s->formatter->dump_value_str("Key", s->object);
-    // s->formatter->dump_value_str("ETag", upload_id.c_str());
     s->formatter->close_section("ListMultipartUploadResult");
     s->formatter->flush();
   }
@@ -311,7 +322,6 @@ RGWOp *RGWHandler_REST_S3::get_retrieve_obj_op(struct req_state *s, bool get_dat
   if (is_acl_op(s)) {
     return &get_acls_op;
   }
-
   if (s->object) {
     get_obj_op.set_get_data(get_data);
     return &get_obj_op;
@@ -328,7 +338,6 @@ RGWOp *RGWHandler_REST_S3::get_retrieve_op(struct req_state *s, bool get_data)
     if (is_acl_op(s)) {
       return &get_acls_op;
     } else if (s->args.exists("uploadId")) {
-RGW_LOG(0) << __FILE__ << ":" << __LINE__ << dendl;
       return &list_multipart;
     }
     return get_retrieve_obj_op(s, get_data);