]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix bug where bucket listing end marker not always set correctly 34993/head
authorJ. Eric Ivancich <ivancich@redhat.com>
Tue, 10 Mar 2020 17:47:43 +0000 (13:47 -0400)
committerNathan Cutler <ncutler@suse.com>
Mon, 11 May 2020 15:55:30 +0000 (17:55 +0200)
Due to using std::move a second time, often
RGWRados::cls_bucket_list_ordered would not set its end marker
correctly. This affected the behavior of
RGWRados::Bucket::List::list_objects_ordered, and might have caused it
return fewer elements than it may have otherwise.

Signed-off-by: J. Eric Ivancich <ivancich@redhat.com>
(cherry picked from commit 76043e00851be0b131448a7a2ab4fed2c22426fe)

src/rgw/rgw_rados.cc

index 3f6c32c8d48673f5075ae84fcde2f2b5f88532d6..2132bad98f7768e060414afb17679d66b7bcb8b9 100644 (file)
@@ -8344,7 +8344,7 @@ int RGWRados::cls_bucket_list_ordered(RGWBucketInfo& bucket_info,
     // into results_trackers vector
     tracker_idx = candidates.begin()->second;
     auto& tracker = results_trackers.at(tracker_idx);
-    last_entry_visited = &tracker.dir_entry();
+
     const string& name = tracker.entry_name();
     rgw_bucket_dir_entry& dirent = tracker.dir_entry();
 
@@ -8377,10 +8377,12 @@ int RGWRados::cls_bucket_list_ordered(RGWBucketInfo& bucket_info,
       ldout(cct, 10) << "RGWRados::" << __func__ << ": got " <<
        dirent.key.name << "[" << dirent.key.instance << "]" << dendl;
       m[name] = std::move(dirent);
+      last_entry_visited = &(m[name]);
       ++count;
     } else {
       ldout(cct, 10) << "RGWRados::" << __func__ << ": skipping " <<
        dirent.key.name << "[" << dirent.key.instance << "]" << dendl;
+      last_entry_visited = &tracker.dir_entry();
     }
 
     // refresh the candidates map
@@ -8432,8 +8434,7 @@ int RGWRados::cls_bucket_list_ordered(RGWBucketInfo& bucket_info,
   }
 
   if (last_entry_visited != nullptr && last_entry) {
-    // since we'll not need this any more, might as well move it...
-    *last_entry = std::move(last_entry_visited->key);
+    *last_entry = last_entry_visited->key;
     ldout(cct, 20) << "RGWRados::" << __func__ <<
       ": returning, last_entry=" << *last_entry << dendl;
   } else {