]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls/rgw: non-versioned listings skip past version suffix 62591/head
authorCasey Bodley <cbodley@redhat.com>
Tue, 11 Mar 2025 16:07:22 +0000 (12:07 -0400)
committerCasey Bodley <cbodley@redhat.com>
Mon, 31 Mar 2025 21:03:22 +0000 (17:03 -0400)
when skipping a versioned entry for a non-versioned listing, we must
advance the marker or risk infinite loops. in particular, plain entries
converted by convert_plain_entry_to_versioned() sort at the end of an
object's versions, but have an empty version id whose retry would start
back at the beginning of the object's versions

Fixes: https://tracker.ceph.com/issues/70399
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 90902ce21864cadeca87684eff0b0e1a24970384)

src/cls/rgw/cls_rgw.cc

index 665f42e8e46d672e1faf8ce40e72d8bdc0c8b803..48e55728212566f5a87ee3df8c15813ebb44c11a 100644 (file)
@@ -314,6 +314,14 @@ static void get_list_index_key(rgw_bucket_dir_entry& entry, string *index_key)
   index_key->append(entry.key.instance);
 }
 
+// Format an omap key for an object name that sorts after all versioned keys
+// generated by get_list_index_key().
+static std::string cls_rgw_after_versions(const std::string& key)
+{
+  // assert: ! key.empty()
+  return key + '\1'; // suffix "\1" sorts after suffixes like "\0v123\0iabc"
+}
+
 static void encode_obj_versioned_data_key(const cls_rgw_obj_key& key, string *index_key, bool append_delete_marker_suffix = false)
 {
   *index_key = BI_PREFIX_CHAR;
@@ -604,6 +612,13 @@ int rgw_bucket_list(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
          (!entry.is_visible() || op.start_obj.name == key.name)) {
         CLS_LOG(20, "%s: entry %s[%s] is not visible",
                __func__, key.name.c_str(), key.instance.c_str());
+
+        // advance past any versioned entries for this name
+        start_after_omap_key = cls_rgw_after_versions(key.name);
+        start_after_entry_key.set(start_after_omap_key);
+
+        kiter = keys.lower_bound(start_after_omap_key);
+        --kiter;
         continue;
       }