]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix radoslist stuck loop
authorJ. Eric Ivancich <ivancich@redhat.com>
Thu, 8 Apr 2021 23:19:36 +0000 (19:19 -0400)
committerJ. Eric Ivancich <ivancich@redhat.com>
Fri, 9 Apr 2021 19:28:01 +0000 (15:28 -0400)
When an incomplete multipart upload has in excess of 1000 parts,
looping over those parts was not handled property causing an infinite
loop. The paging/marker is now handled correctly.

Signed-off-by: J. Eric Ivancich <ivancich@redhat.com>
src/rgw/rgw_orphan.cc

index 377366b0da1ae2464f60f1354cad5ca964c12b33..9316d5b5cd6147937a2a2372c4cc988b68f7e5a2 100644 (file)
@@ -1464,7 +1464,7 @@ int RGWRadosList::do_incomplete_multipart(const DoutPrefixProvider *dpp,
     ret = bucket->list(dpp, params, max_uploads, results, null_yield);
     if (ret == -ENOENT) {
       // could bucket have been removed while this is running?
-      ldpp_dout(dpp, 20) << "RGWRadosList::" << __func__ <<
+      ldpp_dout(dpp, 5) << "RGWRadosList::" << __func__ <<
        ": WARNING: call to list_objects of multipart namespace got ENOENT; "
        "assuming bucket removal race" << dendl;
       break;
@@ -1491,22 +1491,27 @@ int RGWRadosList::do_incomplete_multipart(const DoutPrefixProvider *dpp,
       }
 
       // now process the uploads vector
-      int parts_marker = 0;
-      bool is_parts_truncated = false;
-      do {
-       map<uint32_t, RGWUploadPartInfo> parts;
+      for (const auto& upload : uploads) {
+       const RGWMPObj& mp = upload.mp;
+       int parts_marker = 0;
+       bool is_parts_truncated = false;
 
-       for (const auto& upload : uploads) {
-         const RGWMPObj& mp = upload.mp;
+       do { // while (is_parts_truncated);
+         std::map<uint32_t, RGWUploadPartInfo> parts;
          ret = list_multipart_parts(bucket, store->ctx(),
                                     mp.get_upload_id(), mp.get_meta(),
-                                    max_parts,
-                                    parts_marker, parts, NULL, &is_parts_truncated);
+                                    max_parts, parts_marker,
+                                    parts, &parts_marker,
+                                    &is_parts_truncated);
          if (ret == -ENOENT) {
-           continue;
+           ldpp_dout(dpp, 5) <<  "RGWRadosList::" << __func__ <<
+             ": WARNING: list_multipart_parts returned ret=-ENOENT "
+             "for " << mp.get_upload_id() << ", moving on" << dendl;
+           break;
          } else if (ret < 0) {
            lderr(store->ctx()) << "RGWRadosList::" << __func__ <<
-             ": ERROR: list_multipart_parts returned ret=" << ret << dendl;
+             ": ERROR: list_multipart_parts returned ret=" << ret <<
+             dendl;
            return ret;
          }
 
@@ -1518,11 +1523,11 @@ int RGWRadosList::do_incomplete_multipart(const DoutPrefixProvider *dpp,
              const rgw_raw_obj& loc =
                obj_it.get_location().get_raw_obj(store);
              std::cout << loc.oid << std::endl;
-           }
-         }
-       }
-      } while (is_parts_truncated);
-    } // if results.objs not empty
+           } // for (auto obj_it
+         } // for (auto& p
+       } while (is_parts_truncated);
+      } // for (const auto& upload
+    } // if objs not empty
   } while (results.is_truncated);
 
   return 0;