From: J. Eric Ivancich Date: Thu, 8 Apr 2021 23:19:36 +0000 (-0400) Subject: rgw: fix radoslist stuck loop X-Git-Tag: v14.2.22~22^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cce57adc8e60b77e09d7a8bc8c2bfeed66dc07c9;p=ceph.git 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 (cherry picked from commit 098eddaeee2c0aab84e4897002b6d1c845c36ced) Conflicts: src/rgw/rgw_orphan.cc: back out Zipper 10 updates --- diff --git a/src/rgw/rgw_orphan.cc b/src/rgw/rgw_orphan.cc index 832076b7f058..ae5770134d8d 100644 --- a/src/rgw/rgw_orphan.cc +++ b/src/rgw/rgw_orphan.cc @@ -1459,7 +1459,7 @@ int RGWRadosList::do_incomplete_multipart( &is_listing_truncated); if (ret == -ENOENT) { // could bucket have been removed while this is running? - ldout(store->ctx(), 20) << "RGWRadosList::" << __func__ << + ldout(store->ctx(), 5) << "RGWRadosList::" << __func__ << ": WARNING: call to list_objects of multipart namespace got ENOENT; " "assuming bucket removal race" << dendl; break; @@ -1486,22 +1486,27 @@ int RGWRadosList::do_incomplete_multipart( } // 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(store, bucket_info, 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; + ldout(store->ctx(), 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; } @@ -1512,10 +1517,10 @@ int RGWRadosList::do_incomplete_multipart( ++obj_it) { const rgw_raw_obj& loc = obj_it.get_location().get_raw_obj(store); std::cout << loc.oid << std::endl; - } - } - } - } while (is_parts_truncated); + } // for (auto obj_it + } // for (auto& p + } while (is_parts_truncated); + } // for (const auto& upload } // if objs not empty } while (is_listing_truncated);