From 9962452d790e941f48d4ffeac3aa5bfcf2ead6f2 Mon Sep 17 00:00:00 2001 From: Matt Benjamin Date: Sun, 15 Feb 2026 10:21:28 -0500 Subject: [PATCH] posixdriver: add bde.flags to in bucket cache serde cycle 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 --- src/rgw/driver/posix/bucket_cache.h | 42 ++++++++++++++++------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/rgw/driver/posix/bucket_cache.h b/src/rgw/driver/posix/bucket_cache.h index 359238e5a36..bb853854a15 100644 --- a/src/rgw/driver/posix/bucket_cache.h +++ b/src/rgw/driver/posix/bucket_cache.h @@ -371,12 +371,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}) { @@ -428,12 +429,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(); } @@ -511,12 +513,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(); } @@ -571,7 +574,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(); } -- 2.47.3