]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
posixdriver: add bde.flags to in bucket cache serde cycle
authorMatt Benjamin <mbenjamin@redhat.com>
Sun, 15 Feb 2026 15:21:28 +0000 (10:21 -0500)
committerDaniel Gryniewicz <dang@fprintf.net>
Fri, 29 May 2026 16:05:12 +0000 (12:05 -0400)
The upstream logic (mostly?) correctly uses bde.flags when filling
the cache for versioned objects, but cache ser(de)ialization has
been discarding that member.

This change suppresses the visible result where RGW incorrectly produces
multiple versions in non-versioned listing because none uniquely sets
FLAG_CURRENT:

mbenjamin@fedora:~/dev/rgw/s3_py/python$ s3cmd ls s3://sheik2
2026-02-14 22:44           22  s3://sheik2/ginfizz_1
2026-02-14 22:44           22  s3://sheik2/ginfizz_1
2026-02-14 22:44           22  s3://sheik2/ginfizz_1
2026-02-14 22:44           22  s3://sheik2/ginfizz_2
2026-02-14 22:44           22  s3://sheik2/ginfizz_2
2026-02-14 22:44           22  s3://sheik2/ginfizz_2

Corrected result is:

mbenjamin@fedora:~/dev/rgw/s3_py/python$ s3cmd ls s3://sheik2
2026-02-14 22:44           22  s3://sheik2/ginfizz_1
2026-02-14 22:44           22  s3://sheik2/ginfizz_2

Cached listings for versions are still incorrect in containing an
an extra entry for the "current" version in with empty instance
(from the Symlink)--the visible effect being that list-object-versions
output is incorrect (no entry is sent with IsLatest, after the
empty instance version has been filtered out).

Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/driver/posix/bucket_cache.h

index 721c4e50abba125d9e199ada3f25419dfd3463aa..47059790827d9b3e5702508017d7420b8c58655c 100644 (file)
@@ -392,12 +392,13 @@ public:
          std::string ser_data;
          zpp::bits::out out(ser_data);
          struct timespec ts{ceph::real_clock::to_timespec(bde.meta.mtime)};
-         auto errc =
-           out(bde.key.name, bde.key.instance, /* XXX bde.key.ns, */
-               bde.ver.pool, bde.ver.epoch, bde.exists,
-               bde.meta.category, bde.meta.size, ts.tv_sec, ts.tv_nsec,
-               bde.meta.owner, bde.meta.owner_display_name, bde.meta.accounted_size,
-               bde.meta.storage_class, bde.meta.appendable, bde.meta.etag);
+          auto errc =
+              out(bde.key.name, bde.key.instance, /* XXX bde.key.ns, */
+                  bde.ver.pool, bde.ver.epoch, bde.exists, bde.meta.category,
+                  bde.meta.size, ts.tv_sec, ts.tv_nsec, bde.meta.owner,
+                  bde.meta.owner_display_name, bde.meta.accounted_size,
+                  bde.meta.storage_class, bde.meta.appendable, bde.meta.etag,
+                  bde.flags);
          /*std::cout << fmt::format("fill: bde.key.name: {}", bde.key.name)
            << std::endl;*/
          if (errc.code != std::errc{0}) {
@@ -449,12 +450,13 @@ public:
        std::string ser_v{svv};
        zpp::bits::in in_v(ser_v);
        struct timespec ts;
-       errc =
-         in_v(bde.key.name, bde.key.instance, /* bde.key.ns, */
-              bde.ver.pool, bde.ver.epoch, bde.exists,
-              bde.meta.category, bde.meta.size, ts.tv_sec, ts.tv_nsec,
-              bde.meta.owner, bde.meta.owner_display_name, bde.meta.accounted_size,
-              bde.meta.storage_class, bde.meta.appendable, bde.meta.etag);
+        errc = in_v(
+            bde.key.name, bde.key.instance, /* bde.key.ns, */
+            bde.ver.pool, bde.ver.epoch, bde.exists, bde.meta.category,
+            bde.meta.size, ts.tv_sec, ts.tv_nsec, bde.meta.owner,
+            bde.meta.owner_display_name, bde.meta.accounted_size,
+            bde.meta.storage_class, bde.meta.appendable, bde.meta.etag,
+            bde.flags);
        if (errc.code != std::errc{0}) {
          abort();
        }
@@ -535,12 +537,13 @@ public:
          std::string ser_data;
          zpp::bits::out out(ser_data);
          struct timespec ts{ceph::real_clock::to_timespec(bde.meta.mtime)};
-         auto errc =
-           out(bde.key.name, bde.key.instance, /* XXX bde.key.ns, */
-               bde.ver.pool, bde.ver.epoch, bde.exists,
-               bde.meta.category, bde.meta.size, ts.tv_sec, ts.tv_nsec,
-               bde.meta.owner, bde.meta.owner_display_name, bde.meta.accounted_size,
-               bde.meta.storage_class, bde.meta.appendable, bde.meta.etag);
+          auto errc =
+              out(bde.key.name, bde.key.instance, /* XXX bde.key.ns, */
+                  bde.ver.pool, bde.ver.epoch, bde.exists, bde.meta.category,
+                  bde.meta.size, ts.tv_sec, ts.tv_nsec, bde.meta.owner,
+                  bde.meta.owner_display_name, bde.meta.accounted_size,
+                  bde.meta.storage_class, bde.meta.appendable, bde.meta.etag,
+                  bde.flags);
          if (errc.code != std::errc{0}) {
            abort();
          }
@@ -595,7 +598,8 @@ public:
               bde.ver.pool, bde.ver.epoch, bde.exists, bde.meta.category,
               bde.meta.size, ts.tv_sec, ts.tv_nsec, bde.meta.owner,
               bde.meta.owner_display_name, bde.meta.accounted_size,
-              bde.meta.storage_class, bde.meta.appendable, bde.meta.etag);
+              bde.meta.storage_class, bde.meta.appendable, bde.meta.etag,
+              bde.flags);
       if (errc.code != std::errc{0}) {
         abort();
       }