]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: improve response code handling for Bulk Delete API.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Sun, 25 Oct 2015 14:38:21 +0000 (15:38 +0100)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Tue, 8 Dec 2015 16:57:24 +0000 (17:57 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_rest_swift.cc

index 96afdea86c87b09295dcff062fb6496b89b276c2..223060c15713a785da70087879c49fa751a277be 100644 (file)
@@ -982,22 +982,49 @@ void RGWBulkDelete_ObjStore_SWIFT::send_response()
 
   s->formatter->open_object_section("delete");
 
-  s->formatter->dump_int("Number Deleted", deleter->get_num_deleted());
-  s->formatter->dump_int("Number Not Found", deleter->get_num_unfound());
-  s->formatter->dump_string("Response Body", "");
-  s->formatter->dump_string("Response Status", "200 OK");
-  s->formatter->open_array_section("Errors");
-  for (const auto fail_desc : deleter->get_failures()) {
+  const auto num_deleted = deleter->get_num_deleted();
+  const auto num_unfound = deleter->get_num_unfound();
+  const auto& failures = deleter->get_failures();
+
+  string resp_status;
+  string resp_body;
+
+  if (!failures.empty()) {
+    int reason = ERR_INVALID_REQUEST;
+    for (const auto fail_desc : failures) {
+      if (-ENOENT != fail_desc.err && -EACCES != fail_desc.err) {
+        reason = fail_desc.err;
+      }
+    }
+
     rgw_err err;
-    set_req_state_err(err, fail_desc.err, s->prot_flags);
-    string status;
-    dump_errno(err, status);
+    set_req_state_err(err, reason, s->prot_flags);
+    dump_errno(err, resp_status);
+  } else if (0 == num_deleted && 0 == num_unfound) {
+    /* 400 Bad Request */
+    dump_errno(400, resp_status);
+    resp_body = "Invalid bulk delete.";
+  } else {
+    /* 200 OK */
+    dump_errno(200, resp_status);
+  }
+
+  s->formatter->dump_int("Number Deleted", num_deleted);
+  s->formatter->dump_int("Number Not Found", num_unfound);
+  s->formatter->dump_string("Response Body", resp_body);
+  s->formatter->dump_string("Response Status", resp_status);
+  s->formatter->open_array_section("Errors");
+  for (const auto fail_desc : failures) {
+    s->formatter->open_array_section("object");
 
     stringstream ss_name;
     ss_name << fail_desc.path;
-
-    s->formatter->open_array_section("object");
     s->formatter->dump_string("Name", ss_name.str());
+
+    rgw_err err;
+    set_req_state_err(err, fail_desc.err, s->prot_flags);
+    string status;
+    dump_errno(err, status);
     s->formatter->dump_string("Status", status);
     s->formatter->close_section();
   }