]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix bucket purge incomplete multipart uploads 43862/head
authorJ. Eric Ivancich <ivancich@redhat.com>
Mon, 8 Nov 2021 19:05:24 +0000 (14:05 -0500)
committerJ. Eric Ivancich <ivancich@redhat.com>
Mon, 8 Nov 2021 20:24:12 +0000 (15:24 -0500)
The marker was not working correctly as segments of the bucket index
were listed to shut down any incomplete multipart uploads. This fixes
the marker, so it's maintained properly across iterations.

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

index 10bc6559f75d1256ff414559d5e52543734a949c..eeccacb6a29952243129c8017884cb8c78173fa8 100644 (file)
@@ -288,17 +288,20 @@ int abort_multipart_upload(const DoutPrefixProvider *dpp,
   return (ret == -ENOENT) ? -ERR_NO_SUCH_UPLOAD : ret;
 }
 
-int list_bucket_multiparts(const DoutPrefixProvider *dpp, 
-                           rgw::sal::RGWRadosStore *store, RGWBucketInfo& bucket_info,
-                          const string& prefix, const string& marker,
-                          const string& delim,
+int list_bucket_multiparts(const DoutPrefixProvider* dpp,
+                          rgw::sal::RGWRadosStore* store,
+                          RGWBucketInfo& bucket_info,
+                          const std::string& prefix,
+                          std::string& marker, // in/out
+                          const std::string& delim,
                           const int& max_uploads,
-                          vector<rgw_bucket_dir_entry> *objs,
-                          map<string, bool> *common_prefixes, bool *is_truncated)
+                          std::vector<rgw_bucket_dir_entry>* objs,
+                          std::map<std::string, bool>* common_prefixes,
+                          bool* is_truncated)
 {
   RGWRados::Bucket target(store->getRados(), bucket_info);
   RGWRados::Bucket::List list_op(&target);
-  MultipartMetaFilter mp_filter;
+  MultipartMetaFilter mp_filter; // filter out all but ".meta" entries
 
   list_op.params.prefix = prefix;
   list_op.params.delim = delim;
@@ -306,12 +309,19 @@ int list_bucket_multiparts(const DoutPrefixProvider *dpp,
   list_op.params.ns = RGW_OBJ_NS_MULTIPART;
   list_op.params.filter = &mp_filter;
 
-  return(list_op.list_objects(dpp, max_uploads, objs, common_prefixes, is_truncated, null_yield));
+  int ret = list_op.list_objects(dpp, max_uploads, objs, common_prefixes, is_truncated, null_yield);
+  if (ret >= 0) {
+    marker = list_op.params.marker.name;
+  }
+  return ret;
 }
 
-int abort_bucket_multiparts(const DoutPrefixProvider *dpp, 
-                            rgw::sal::RGWRadosStore *store, CephContext *cct, 
-                            RGWBucketInfo& bucket_info, string& prefix, string& delim)
+int abort_bucket_multiparts(const DoutPrefixProvider* dpp,
+                           rgw::sal::RGWRadosStore* store,
+                           CephContext* cct,
+                           RGWBucketInfo& bucket_info,
+                           const std::string& prefix,
+                           const std::string& delim)
 {
   constexpr int max = 1000;
   int ret, num_deleted = 0;
index c58901a9fb036dafb40dbc32996857137f2e7307..9a3321542ce462efaa6e7d6c3005cfc55983a48e 100644 (file)
@@ -129,15 +129,21 @@ extern int list_multipart_parts(const DoutPrefixProvider *dpp,
 extern int abort_multipart_upload(const DoutPrefixProvider *dpp, rgw::sal::RGWRadosStore *store, CephContext *cct, RGWObjectCtx *obj_ctx,
                                 RGWBucketInfo& bucket_info, RGWMPObj& mp_obj);
 
-extern int list_bucket_multiparts(const DoutPrefixProvider *dpp, 
-                                  rgw::sal::RGWRadosStore *store, RGWBucketInfo& bucket_info,
-                                 const string& prefix,
-                                 const string& marker,
-                                 const string& delim,
+extern int list_bucket_multiparts(const DoutPrefixProvider* dpp,
+                                 rgw::sal::RGWRadosStore* store,
+                                 RGWBucketInfo& bucket_info,
+                                 const std::string& prefix,
+                                 std::string& marker, // in/out
+                                 const std::string& delim,
                                  const int& max_uploads,
-                                 vector<rgw_bucket_dir_entry> *objs,
-                                 map<string, bool> *common_prefixes, bool *is_truncated);
-
-extern int abort_bucket_multiparts(const DoutPrefixProvider *dpp, rgw::sal::RGWRadosStore *store, CephContext *cct, RGWBucketInfo& bucket_info,
-                                string& prefix, string& delim);
+                                 std::vector<rgw_bucket_dir_entry>* objs,
+                                 std::map<std::string, bool>* common_prefixes,
+                                 bool* is_truncated);
+
+extern int abort_bucket_multiparts(const DoutPrefixProvider* dpp,
+                                  rgw::sal::RGWRadosStore* store,
+                                  CephContext* cct,
+                                  RGWBucketInfo& bucket_info,
+                                  const std::string& prefix,
+                                  const std::string& delim);
 #endif