From 098eddaeee2c0aab84e4897002b6d1c845c36ced Mon Sep 17 00:00:00 2001 From: "J. Eric Ivancich" Date: Thu, 8 Apr 2021 19:19:36 -0400 Subject: [PATCH] rgw: fix radoslist stuck loop 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 --- src/rgw/rgw_orphan.cc | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/rgw/rgw_orphan.cc b/src/rgw/rgw_orphan.cc index 377366b0da1..9316d5b5cd6 100644 --- a/src/rgw/rgw_orphan.cc +++ b/src/rgw/rgw_orphan.cc @@ -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 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 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; -- 2.39.5