<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Ceph Blog</title>
  <link href="https://ceph.io/en/news/blog/feed.xml" rel="self" />
  <link href="https://ceph.io/en/news/blog/" />
  <updated>2026-07-14T00:00:00Z</updated>
  <id>https://ceph.io/en/news/blog/</id>
  <entry>
    <title>v19.2.5 Squid released</title>
    <link href="https://ceph.io/en/news/blog/2026/v19-2-5-squid-released/" />
    <updated>2026-07-14T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/v19-2-5-squid-released/</id>
    <author>
      <name>Yuri Weinstein</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="release" />
      <category term="squid" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/v19-2-5-squid-released/">&lt;p&gt;This is the fifth backport release in the Squid series.
We recommend all users update to this release.&lt;/p&gt;
&lt;h2 id=&quot;notable-changes&quot;&gt;Notable Changes &lt;a class=&quot;link-anchor&quot; href=&quot;#notable-changes&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&quot;mds-(metadata-server)&quot;&gt;MDS (Metadata Server) &lt;a class=&quot;link-anchor&quot; href=&quot;#mds-(metadata-server)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a segmentation fault relating to MDSContext completion and request queuing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;osd-(object-storage-daemon)&quot;&gt;OSD (Object Storage Daemon) &lt;a class=&quot;link-anchor&quot; href=&quot;#osd-(object-storage-daemon)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Rollback &amp;amp; Vector Fixes: Corrected rollback logic for partial write object information (OI) and optimized Erasure Coding (EC) by ensuring Twiddle creates a full-sized vector.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rgw-(rados-gateway)&quot;&gt;RGW (RADOS Gateway) &lt;a class=&quot;link-anchor&quot; href=&quot;#rgw-(rados-gateway)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;TLS 1.3 Ciphersuites: Introduced the ssl_ciphersuites configuration option for the Beast front-end to support TLS 1.3 cipher customizations.&lt;/li&gt;
&lt;li&gt;S3 PutObject ACLs Fix: Fixed a bug where PutObject requests were erroneously rejected under BlockPublicAcls due to an incorrect comparison return value from canned_acl.compare().&lt;/li&gt;
&lt;li&gt;Multisite Sync Robustness: Resolved an infinite loop scenario in RGWBucketFullSyncCR when a source bucket was deleted mid-sync by introducing a mechanism to clear stateful data in reused bucket_list_result objects.&lt;/li&gt;
&lt;li&gt;SNS Policy Evaluation: Updated ListTopics to use the account root ARN for policy evaluation when invoked by a non-root account user, preventing unexpected implicit denies from identity-based policies.&lt;/li&gt;
&lt;li&gt;Presigned URLs: Fixed an internal server error occurring during the authentication process of presigned URLs.&lt;/li&gt;
&lt;li&gt;Prerequest Hook: Restructured the order of execution so that the prerequest hook now runs after the authorization process has completed.&lt;/li&gt;
&lt;li&gt;Object Tagging: Added handling for plain-text object tags during execution of RGWObjTags::decode().&lt;/li&gt;
&lt;li&gt;Beast Frontend Stability: Applied a strand executor to the Beast timeout timer to avoid concurrent socket access and potential race conditions.&lt;/li&gt;
&lt;li&gt;Bucket Statistics: Added a fix for bucket stats execution when the underlying bucket index does not exist.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;changelog&quot;&gt;Changelog &lt;a class=&quot;link-anchor&quot; href=&quot;#changelog&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[Stretch Mode] mon: restrict changing mon election strategy post stretch mode (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65458&quot;&gt;pr#65458&lt;/a&gt;, Kamoltat Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check if &lt;code&gt;HTTP&#92;_X&#92;_AMZ&#92;_COPY&#92;_SOURCE&lt;/code&gt; header is empty (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66028&quot;&gt;pr#66028&lt;/a&gt;, Suyash Dongre)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix multifs auth caps check (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65359&quot;&gt;pr#65359&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd/migration/QCOWFormat: avoid use-after-free in execute_request() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68187&quot;&gt;pr#68187&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: avoid losing sparseness in read_parent() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68462&quot;&gt;pr#68462&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: add ref counting to LogSegment (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68443&quot;&gt;pr#68443&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: use SimpleLock::WAIT_ALL for wait mask (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68320&quot;&gt;pr#68320&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/snap_schedule: restrict retention period multipliers set (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67267&quot;&gt;pr#67267&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: don&#39;t delete user-created pool in &amp;quot;volume create&amp;quot; command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63068&quot;&gt;pr#63068&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/volumes: allow disabling async job thread (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62433&quot;&gt;pr#62433&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: ensure that all modules have started before advertising active mgr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68248&quot;&gt;pr#68248&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/AuthMonitor: add osd w cap for superuser client (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68318&quot;&gt;pr#68318&lt;/a&gt;, Venky Shankar, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: introduce allocator lookup policy (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66840&quot;&gt;pr#66840&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr/volumes: fix typo in casesensitive vxattr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63023&quot;&gt;pr#63023&lt;/a&gt;, Patrick Donnelly, Xavi Hernandez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;python-common/cryptotools: stop using the removed X509Req API (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69752&quot;&gt;pr#69752&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/multisite: switch to boto3 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68919&quot;&gt;pr#68919&lt;/a&gt;, Shilpa Jagannath)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/radosgw_admin: replace boto2 with boto3 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68849&quot;&gt;pr#68849&lt;/a&gt;, Adam C. Emerson, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw/upgrade: symlinks are explicit about distro versions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68058&quot;&gt;pr#68058&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: remove ragweed from verify subsuite (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69114&quot;&gt;pr#69114&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: Revive crypt kmip (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68372&quot;&gt;pr#68372&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/rados: temporarily disable ceph-post-file test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68611&quot;&gt;pr#68611&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/keystone: restart mariadb for rocky and alma linux too (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67543&quot;&gt;pr#67543&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/keystone: upgrade keystone to 2025&lt;span&gt;&lt;/span&gt;.2 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67756&quot;&gt;pr#67756&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rbd: drop racy assert in test_tasks_recovery() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68189&quot;&gt;pr#68189&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: allow multiple mgr sessions during eviction test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68321&quot;&gt;pr#68321&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: fix setting rbd_sparse_read_threshold_bytes in test_migration_clone() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68616&quot;&gt;pr#68616&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Remove cephadm e2e tests from teuthology (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68819&quot;&gt;pr#68819&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: resolve py3&lt;span&gt;&lt;/span&gt;.12 regression for random&lt;span&gt;&lt;/span&gt;.sample (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68319&quot;&gt;pr#68319&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/auth: fix internal server error for presigned urls (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69049&quot;&gt;pr#69049&lt;/a&gt;, Tobias Urdin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/beast: add ssl_ciphersuites option for tls 1&lt;span&gt;&lt;/span&gt;.3 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69179&quot;&gt;pr#69179&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/beast: use strand executor for timeout timer to prevent concurrent socket access (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68507&quot;&gt;pr#68507&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW/multisite: fix bucket-full-sync infinite loop caused by stale bucket_list_result reuse (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67921&quot;&gt;pr#67921&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/s3: fix PutObject&#39;s canned_acl comparisons for BlockPublicAcls (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69481&quot;&gt;pr#69481&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/sns: ListTopics uses account root arn for policy evaluation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69274&quot;&gt;pr#69274&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: &lt;code&gt;account rm --purge-data&lt;/code&gt; can delete users/roles/groups/oidcs too (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68060&quot;&gt;pr#68060&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW: Change prerequest hook to run after authorization process (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67711&quot;&gt;pr#67711&lt;/a&gt;, Emin Sunacoglu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix &#39;bucket stats&#39; when bucket index doesn&#39;t exist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68504&quot;&gt;pr#68504&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW: handle plain-text object tags in RGWObjTags::decode() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67926&quot;&gt;pr#67926&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: read_obj_policy() consults s3:prefix when deciding between 403/404 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68652&quot;&gt;pr#68652&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;suites/rados/cephadm: add still running warning to the ignore list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62532&quot;&gt;pr#62532&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rgw: remove depracated boto dependency (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68470&quot;&gt;pr#68470&lt;/a&gt;, Yuval Lifshitz)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Recover the Ceph Monitor Store Using OSDs</title>
    <link href="https://ceph.io/en/news/blog/2026/mon-recovery-from-osds/" />
    <updated>2026-07-04T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/mon-recovery-from-osds/</id>
    <author>
      <name>Eugen Block, crossposted by Anthony D&#39;Atri</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="mon" />
      <category term="recovery" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/mon-recovery-from-osds/">&lt;h2 id=&quot;introduction&quot;&gt;Introduction &lt;a class=&quot;link-anchor&quot; href=&quot;#introduction&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A few weeks ago I helped a Ceph user to recover his broken cluster (see &lt;a href=&quot;https://lists.ceph.io/hyperkitty/list/ceph-users@ceph.io/thread/4Q6JK65M72MHUWUHVRITQKXNLQTKDH6I/&quot;&gt;this thread&lt;/a&gt;).
Basically, after his Monitors stopped working he re-deployed a new cluster with the
same Ceph FSID and attached the existing OSDs to the re-deployed hosts. But it’s not
that easy to re-activate those OSDs because the new Monitors don’t have the old osdmap,
hence they don’t know anything about the existing OSDs. So how did we fix that?&lt;/p&gt;
&lt;p&gt;This scenario can be considered a total Monitor store failure. There’s a &lt;a href=&quot;https://docs.ceph.com/en/latest/rados/troubleshooting/troubleshooting-mon/#recovery-using-osds&quot;&gt;documented procedure&lt;/a&gt;
in the upstream docs, unfortunately it’s written for non-cephadm clusters and doesn’t contain many details about subsequent steps.
When Ceph daemons run within containers there are more things to consider.
So I decided to write this blog post and add some more details to the procedure,
targeting mainly clusters managed by &lt;a href=&quot;https://docs.ceph.com/en/latest/cephadm/&quot;&gt;cephadm&lt;/a&gt;.
But the recovery procedure doesn’t
specifically require cephadm-specific commands, so it can be considered as a
general guideline how to recover from a Monitor store loss, just with some extra
details about cephadm deployments.&lt;/p&gt;
&lt;p&gt;This procedure only works for non-encrypted OSDs. If you are using dmcrypt (LUKS) OSDs,
make sure you have a backup of the keys, otherwise your data is lost forever! But
there is some development, a user in Slack pointed me to &lt;a href=&quot;https://github.com/ceph/ceph/pull/68978&quot;&gt;this PR&lt;/a&gt;
which adds a backup mechanism for Monitors, probably available in the upcoming Umbrella
release. Note that the PR also contains this statement:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Monitor backups complement, but do not replace, the existing Monitor recovery procedures&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The procedure covered by said docs is already written in script form, so I used that
as a template and extended it for cephadm usage and included some very basic logging.
It collects the osdmaps from all OSDs and contains the necessary considerations regarding
containers. I decided to automate only the osdmap collection, not all required steps
of the store rebuild procedure (e. g. Monitor store rebuild, client auth, etc.) because
the result of the collection process &lt;em&gt;must&lt;/em&gt; be inspected carefully before proceeding.
Here’s the script I used on one of my lab clusters to collect the osdmaps:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

: &amp;lt;&amp;lt;&#39;END&#39;
This script does:
1. Login to each OSD host
2. Create a temporary mon-store in /tmp after cleaning it up 
3. Create a temporary mon-store directory within each OSD&#39;s
   filesystem (which is then mapped into the cephadm shell) after cleaning it up
4. Collect the osdmaps from each OSD and sync it to each host&#39;s temporary mon-store  
5. Sync each host&#39;s temporary mon-store to the central mon-store
END

# List of all OSD hosts
hosts=&amp;quot;squid1 squid2 squid3&amp;quot;

# Ensure this user has passwordless sudo on all OSD hosts (if not root)
# It&#39;s also easier if the user has passwordless login, e.g. via ssh public key
user=&amp;quot;root&amp;quot;

# Cluster FSID
ceph_fsid=&amp;quot;df500e26-1930-11f1-a79f-fa163e65a168&amp;quot;

# Logging directories
ms_central=&amp;quot;/tmp/mon-store-central&amp;quot;
log_central=&amp;quot;/tmp/central-osd-logs&amp;quot;
logdir=&amp;quot;/tmp/logdir&amp;quot;
ms_collected=&amp;quot;/tmp/mon-store-collected&amp;quot;

# Ensure all OSDs are stopped before proceeding

rm -rf $ms_central
rm -rf $log_central
mkdir -p $log_central

for host in $hosts; do
ssh $user@$host &amp;lt;&amp;lt;EOF
logdir=&amp;quot;/tmp/logdir&amp;quot;
ms_collected=&amp;quot;/tmp/mon-store-collected&amp;quot;
ceph_fsid=&amp;quot;df500e26-1930-11f1-a79f-fa163e65a168&amp;quot;
osd_dir=&amp;quot;/var/lib/ceph/&#92;$ceph_fsid&amp;quot;
rm -rf &#92;$ms_collected
rm -rf &#92;$logdir
mkdir -p &#92;$logdir
echo -e &amp;quot;&#92;nHost: &#92;$(hostname -s)&amp;quot;

for osd in &#92;$(cephadm ceph-volume lvm list --format json 2&amp;gt;/dev/null | jq -r &#39;.[].[].tags | .&amp;quot;ceph.osd_id&amp;quot;&#39;); do
echo -e &amp;quot;&#92;nProcessing osd.&#92;$osd ...&amp;quot;
rm -rf &#92;$osd_dir/osd.&#92;$osd/mon-store-collect
mkdir -p &#92;$osd_dir/osd.&#92;$osd/mon-store-collect

cephadm shell --name osd.&#92;$osd -- ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-&#92;$osd --no-mon-config --op update-mon-db --mon-store-path /var/lib/ceph/osd/ceph-&#92;$osd/mon-store-collect 2&amp;gt; &amp;gt;(tee &#92;$logdir/osd.&#92;$osd.&#92;$(hostname -s).log | grep -vEi &amp;quot;quay|infer|using|creating&amp;quot;)

rsync -qaz &#92;$osd_dir/osd.&#92;$osd/mon-store-collect/. &#92;$ms_collected
done
EOF
rsync -qaz -e ssh $user@$host:$ms_collected/. $ms_central
rsync -qav -e ssh $user@$host:$logdir/. $log_central
done

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If not all osdmaps are collected successfully, the rebuilt Monitor store will be
incomplete and some OSDs won’t be able to join the cluster. There are many more
potential obstacles before the OSDs can be activated, so it’s &lt;em&gt;critical&lt;/em&gt; to review
the logs from each host after the osdmap collection script has finished (in
case of errors) and then continue step by step.&lt;/p&gt;
&lt;h2 id=&quot;collect-the-osdmaps&quot;&gt;Collect the osdmaps &lt;a class=&quot;link-anchor&quot; href=&quot;#collect-the-osdmaps&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are a couple of assumptions made in the script, you will need to adapt those
according to your requirements. For example, the list of hosts, the Ceph FSID, and the
user who logs in to each host. All OSDs should be stopped if there are still running
processes, otherwise the &lt;code&gt;ceph-objectstore-tool&lt;/code&gt; will fail during collection.
I recommend to stop all daemons (&lt;code&gt;mgr&lt;/code&gt;, &lt;code&gt;MDS&lt;/code&gt;, &lt;code&gt;ceph-exporter&lt;/code&gt;, etc.) before starting
the recovery, otherwise you might get stuck with a stale Manager.&lt;/p&gt;
&lt;p&gt;The procedure has been tested on two different Squid lab clusters, one on 19.2.3,
the other one on 19.2.4. Here’s an example of the script output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host: squid1

Processing osd.1 ...
osd.1   : 0 osdmaps trimmed, 226 osdmaps added.

Processing osd.2 ...
osd.2   : 0 osdmaps trimmed, 228 osdmaps added.

Processing osd.0 ...
osd.0   : 0 osdmaps trimmed, 223 osdmaps added.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ceph-fsid&quot;&gt;Ceph FSID &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-fsid&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Depending on how much data is actually lost, there are several ways to retrieve
the Ceph FSID (to keep the output brief, I use $FSID instead of the actual UUID):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ceph.conf&lt;/code&gt;: If there’s any &lt;code&gt;ceph.conf&lt;/code&gt; left on any host (clients also have a &lt;code&gt;ceph.conf&lt;/code&gt;)
it will contain the FSID. Alternatively, since every daemon also has a copy of
&lt;code&gt;ceph.conf&lt;/code&gt;, check any daemon config file in &lt;code&gt;/var/lib/ceph/$FSID/osd.X/config&lt;/code&gt; if
the filesystem is intact. Note that hosts that have been used for prior cluster
incarnations may have multiple directories under &lt;code&gt;/var/lib/ceph&lt;/code&gt;, so be sure to
use only the latest and greatest.&lt;/li&gt;
&lt;li&gt;LV tags: On any OSD host run the command and look for the tag &lt;code&gt;ceph.cluster_fsid=$FSID&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    lvs -o tags
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ceph-volume: On any OSD host run the command:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    cephadm ceph-volume lvm list | grep &amp;quot;cluster fsid&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only run &amp;quot;bare&amp;quot; &lt;code&gt;ceph-volume&lt;/code&gt; commands if your cluster is not managed
by cephadm! Otherwise you’ll most likely end up with more chaos!&lt;/p&gt;
&lt;h2 id=&quot;osd-fsid&quot;&gt;OSD FSID &lt;a class=&quot;link-anchor&quot; href=&quot;#osd-fsid&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In some failure scenarios you might need the FSID of each OSD to rebuild an OSD’s
directory structure. To collect those, you can also use ceph-volume or LV tags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LV tags: On any OSD host run the command and look for the tag &lt;code&gt;ceph.osd_fsid=$FSID&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    lvs -o tags
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;ceph-volume: On any OSD host run the command:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    cephadm ceph-volume lvm list | grep &amp;quot;osd fsid&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only run “bare” ceph-volume commands if your cluster is not managed by cephadm!
Otherwise you’ll most likely end up with more chaos!&lt;/p&gt;
&lt;h2 id=&quot;ssh-user&quot;&gt;SSH user &lt;a class=&quot;link-anchor&quot; href=&quot;#ssh-user&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The easiest way is to have a user that can log in to each host without a password and
has (passwordless) &lt;code&gt;sudo&lt;/code&gt; permissions to execute the necessary commands. Depending
on your Ceph deployment, you may log in as the &lt;code&gt;cephadm&lt;/code&gt; user which usually has
the mentioned permissions. Often the &lt;code&gt;root&lt;/code&gt; user is configured as the cephadm
user, as it is in my lab cluster in which I tested this procedure.&lt;/p&gt;
&lt;h2 id=&quot;rebuild-the-monitor-store&quot;&gt;Rebuild the Monitor store &lt;a class=&quot;link-anchor&quot; href=&quot;#rebuild-the-monitor-store&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Assuming the collection of osdmaps was successful and no errors were logged,
you can now rebuild the store. The hostname of the first Monitor host in this
example is &lt;code&gt;squid1&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Create a backup of the current store (just in case)
root@squid1:~# rsync -a /var/lib/ceph/$FSID/mon.squid1/store.db/ /root/mon-store-backup/

# Ensure all daemons are stopped!

# Remove current mon-store
root@squid1:~# rm -rf /var/lib/ceph/$FSID/mon.squid1/store.db/

# Copy collected store.db from your management
# node (where you ran the collection script) to the first monitor&#39;s store.db
root@squid1:~# rsync -av -e ssh /tmp/mon-store-collected/store.db/ root@squid1:/var/lib/ceph/$FSID/mon.squid1/store.db/

# Rebuild mon-store
root@squid1:~# cephadm shell --name mon.squid1 -- ceph-monstore-tool /var/lib/ceph/mon/ceph-squid1/ rebuild  -- --keyring /etc/ceph/ceph.keyring --mon-ids squid1 squid2 squid3
...
epoch 0
fsid df500e26-1930-11f1-a79f-fa163e65a168
last_changed 2026-06-27T12:18:38.557560+0000
created 2026-06-27T12:18:38.557560+0000
min_mon_release 0 (unknown)
election_strategy: 1
0: [v2:192.168.124.107:3300/0,v1:192.168.124.107:6789/0] mon.squid2
1: [v2:192.168.124.222:3300/0,v1:192.168.124.222:6789/0] mon.squid3
2: [v2:192.168.124.230:3300/0,v1:192.168.124.230:6789/0] mon.squid1

### Note: you need to specify all monitors in the correct order (as mentioned in the docs)!

# Change ownership 
root@squid1:~# chown -R 167.167 /var/lib/ceph/$FSID/mon.squid1/store.db/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;start-the-monitors&quot;&gt;Start the Monitors &lt;a class=&quot;link-anchor&quot; href=&quot;#start-the-monitors&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If all above steps were successful, you can try to start the first Monitor,
either via &lt;code&gt;systemd&lt;/code&gt; or &lt;code&gt;cephadm&lt;/code&gt; or &lt;code&gt;podman&lt;/code&gt;/&lt;code&gt;docker&lt;/code&gt; This also depends on
the actual deployment situation. One of these commands should work:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# systemctl start ceph-$FSID@mon.squid1.service 

root@squid1:~# cephadm unit start --name mon.squid1

root@squid1:~# podman start ... / docker start ...

# Now check the monitor log to see if it starts successfully
root@squid1:~# journalctl -fu start ceph-$FSID@mon.squid1.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the first Monitor starts, copy the contents of its &lt;code&gt;store.db&lt;/code&gt; directory
to the other Monitor daemon directories, ensure the correct ownership, and
try to start them as well. Inspect their logs if something goes wrong, and
if it does it must be fixed before continuing. You can also simply repeat
the &lt;code&gt;rsync&lt;/code&gt; and rebuild steps to recreate the Monitor stores for the remaining
Monitors.&lt;/p&gt;
&lt;p&gt;If the Monitors start you should be able to see a Ceph status
now (&lt;code&gt;ceph -s&lt;/code&gt;). The Ceph status should now contain the OSDs in the output (just an excerpt):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ceph -s
cluster:
id: df500e26-1930-11f1-a79f-fa163e65a168
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
no active mgr
services:
mon: 3 daemons, quorum squid2,squid3,squid1 (age 57s)
mgr: no daemons active
osd: 6 osds: 1 up (since 52m), 6 in (since 54m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We now see that the Monitors are aware of six OSDs (which is
correct for my lab cluster), but the &lt;code&gt;pool&lt;/code&gt;, &lt;code&gt;objects&lt;/code&gt; and &lt;code&gt;usage&lt;/code&gt; output
is not correct since the OSDs are not up yet and haven’t been able to report
to the Monitors and Managers.&lt;/p&gt;
&lt;h2 id=&quot;before-starting-osds&quot;&gt;Before starting OSDs &lt;a class=&quot;link-anchor&quot; href=&quot;#before-starting-osds&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are additional steps required before you can activate the OSDs. For example,
all custom configuration option settings (&lt;code&gt;ceph config dump&lt;/code&gt;) are gone,
auth entries are missing, the &lt;code&gt;container_image&lt;/code&gt; config value has been reset,
and the orchestrator doesn’t work yet: it must be re-enabled first.
Not all of these steps have to be performed necessarily before activating
the OSDs, but some of them are crucial and others can make life easier when
activating the OSDs.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Disable auth_allow_insecure_global_id_reclaim (to clear the warning)
root@squid1:~# ceph config set mon auth_allow_insecure_global_id_reclaim false

# Recreate and import at least one mgr auth keyring to enable the orchestrator
root@squid1:~# cat mgr.squid1.tkgxvc.keyring
[mgr.squid1.tkgxvc]
key = AQDjJhtqCOWnFRAA4/QHkFo2tnWFG8m37kM5HQ==
caps mds = allow *
caps mon = profile mgr
caps osd = allow *

root@squid1:~# ceph auth import -i mgr.squid1.tkgxvc.keyring

# Recreate and import all OSDs keyrings
# If present, use key from /var/lib/ceph/$FSID/osd.$id/keyring to recreate an OSD keyring
root@squid1:~# cat osd.0.keyring
[osd.0]
key = AQBzGxtqPUu8EBAAC0BqZMcfRJb5ZuGtXFgBCA==
caps mgr = allow profile osd
caps mon = allow profile osd
caps osd = allow *

# Check ceph auth for completeness
root@quid1:~# ceph auth ls

# Start at least one manager daemon to be able to manage the cluster again
root@squid1:~# systemctl start ceph-$FSID@mgr.squid1.tkgxvc.service

# Set the public network(s), otherwise OSDs will refuse to start
root@squid1:~# ceph config set global public_network 192.168.124.0/24

# Enable cephadm module
root@squid1:~# ceph mgr module enable cephadm

# Set orchestrator backend
root@squid1:~# ceph orch set backend cephadm

# Recreate cephadm user/keyring
root@squid1:~# ceph cephadm generate-key

# Get new public key
root@squid1:~# ceph cephadm get-pub-key

# Add new public key to each host&#39;s authorized_keys (usually of the root user)

# Re-add hosts to the orchestrator
root@squid1:~# ceph orch host add squid1 192.168.124.230
root@squid1:~# ceph orch host add squid2 192.168.124.107
root@squid1:~# ceph orch host add squid3 192.168.124.222

# Add labels if necessary

# Configure container_image (choose the correct version for your cluster)
root@squid1:~# ceph config set global container_image quay.io/ceph/ceph:v19.2.4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you don’t change the &lt;code&gt;container_image&lt;/code&gt;, some daemons most likely will be deployed
using the hard-coded default:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker.io/ceph/daemon-base:latest-master-devel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not changing that image could lead to issues when redeploying other daemons such as MDSes.&lt;/p&gt;
&lt;h2 id=&quot;activate-the-osds&quot;&gt;Activate the OSDs &lt;a class=&quot;link-anchor&quot; href=&quot;#activate-the-osds&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There’s a wrapper for cephadm to &lt;a href=&quot;https://docs.ceph.com/en/latest/cephadm/services/osd/#activate-existing-osds&quot;&gt;activate existing OSDs&lt;/a&gt;.
It covers a slightly different scenario: when an OSD host fails due to a broken
operating system, its OSDs can be re-activated after reinstalling the operating
system. In that case, after all prerequisites are met, you can simply run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ceph cephadm osd activate &amp;lt;host&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chances are high that this approach won’t work in a scenario like we’re facing
here: total Monitor store loss. So a more manual workaround like the following
might be required.&lt;/p&gt;
&lt;p&gt;Now assuming that the previously described steps worked and errors were fixed,
we can try to start OSDs. Check the contents of the OSD directories first and
see if the most important files are present:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# ls -l /var/lib/ceph/$FSID/osd.0/
total 68
lrwxrwxrwx 1 167 167 93 Jun 19 14:56 block -&amp;gt; /dev/ceph-3d3a6efd-02d7-4abf-ae23-17bc239feb1e/osd-block-8012c0dc-cb7b-4179-908c-df0a94a4227b
-rw-r--r-- 1 167 167 37 Jun 19 14:56 ceph_fsid
-rw------- 1 167 167 181 Jun 19 14:58 config
-rw-r--r-- 1 167 167 37 Jun 19 14:56 fsid
-rw------- 1 167 167 142 Jun 19 14:58 keyring
-rw------- 1 167 167 1875 Jun 19 14:33 unit.poststop
-rw------- 1 167 167 3457 Jun 19 14:33 unit.run
-rw-r--r-- 1 167 167 2 Jun 19 14:56 whoami
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without these files the OSDs will most likely refuse to start. Now let’s give it a try:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# systemd
root@squid1:~# systemctl start ceph-$FSID@osd.0.service

or via

# cephadm
root@squid1:~# cephadm unit start --name osd.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alternatively, if the orchestrator works (you could try to
deploy &lt;code&gt;node-exporter&lt;/code&gt; or other daemons to confirm), you
can also just redeploy an OSD:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# ceph orch daemon redeploy osd.X
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will recreate missing files in the OSD’s directory and hopefully start the OSD successfully.&lt;/p&gt;
&lt;p&gt;Inspect the OSD logs after starting them and look out for error messages if they fail to start:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# journalctl -fu ceph-$FSID@osd.X.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you enabled &lt;code&gt;log_to_file&lt;/code&gt; you can follow the log file like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@squid1:~# tail -F /var/log/ceph/$FSID/ceph-osd.X.log
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next steps &lt;a class=&quot;link-anchor&quot; href=&quot;#next-steps&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let’s assume that we could successfully start the OSDs and recovery is progressing,
and we need to access the data now. For RBD pools there’s (probably) not much you
need to do: as soon as clients can access the OSDs again, they should be able to
map/attach/access the RBD images.&lt;/p&gt;
&lt;p&gt;For CephFS it’s a different story. Since the MDS maps are lost as well, all
file systems will have to be recreated, including the MDS daemons.
The &lt;a href=&quot;https://docs.ceph.com/en/latest/cephfs/recover-fs-after-mon-store-loss/&quot;&gt;Ceph docs&lt;/a&gt;
cover this part. Read the instructions very carefully! The required commands are:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# ceph fs new &amp;lt;fs_name&amp;gt; &amp;lt;metadata_pool&amp;gt; &amp;lt;data_pool&amp;gt; --force --recover
root@squid1:~# ceph fs set &amp;lt;fs_name&amp;gt; joinable true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since there are no existing MDS daemons yet, you’ll need to deploy them either via &lt;code&gt;.yaml&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# ceph orch apply -i mds.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or directly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# ceph orch apply mds &amp;lt;fs_name&amp;gt; --placement=&amp;quot;label:mds&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://docs.ceph.com/en/latest/cephadm/services/mds/&quot;&gt;the docs&lt;/a&gt;
for more information on MDS deployment.&lt;/p&gt;
&lt;p&gt;I won’t go into more details, as this post is long enough as it is. But
you’ll need to deploy required daemons for all services you had
running before the crash. So you’ll have to recreate your &lt;code&gt;yaml&lt;/code&gt;
files for all the services like RGW, Monitoring, NVMe-oF, etc.
The existing service specs in a recovered cluster look like this
(when no services have been managed yet):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@squid1:~# ceph orch ls
NAME  PORTS  RUNNING  REFRESHED  AGE  PLACEMENT     
mgr              2/0  9m ago     -    &amp;lt;unmanaged&amp;gt;   
mon              1/0  9m ago     -    &amp;lt;unmanaged&amp;gt;   
osd                0  9m ago     -    &amp;lt;unmanaged&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’ll need to update those as well to match your actual cluster configuration.
I recommend to regularly back up your cluster configuration, auth keyrings, service
specs and so on, so you don’t have to recreate everything from scratch in such a
failure scenario. Commands to capture the most crucial information include the below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ceph status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ceph orch ls --export&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ceph config dump&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ceph osd crush dump&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ceph report&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One strategy is to emplace a cron job that emails the output files as attachments;
another is to store them as S3 objects, say in another Ceph cluster. Be sure that
you keep a prudent number of revisions, so that a cluster mishap does not overwrite
your good data with bad.&lt;/p&gt;
&lt;p&gt;After the recovery has been completed, the cluster status looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;squid1:~ # ceph -s
 cluster:
   id:     df500e26-1930-11f1-a79f-fa163e65a168
   health: HEALTH_OK
 
 services:
   mon: 3 daemons, quorum squid2,squid3,squid1 (age 80m)
   mgr: squid3.fepqsu(active, since 62m), standbys: squid1.pcgzhi
   mds: 2/2 daemons up, 3 standby
   osd: 6 osds: 6 up (since 65m), 6 in (since 65m)
 
 data:
   volumes: 2/2 healthy
   pools:   7 pools, 385 pgs
   objects: 49 objects, 4.3 MiB
   usage:   421 MiB used, 60 GiB / 60 GiB avail
   pgs:     385 active+clean
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;potential-obstacles&quot;&gt;Potential obstacles &lt;a class=&quot;link-anchor&quot; href=&quot;#potential-obstacles&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are things that can go wrong while trying to re-activate the OSDs.
This is not an exhaustive list, but it can help in specific scenarios.&lt;/p&gt;
&lt;h3 id=&quot;missing-osd-path-contents&quot;&gt;Missing OSD path contents &lt;a class=&quot;link-anchor&quot; href=&quot;#missing-osd-path-contents&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As mentioned above, the contents of the OSD directories must be present
and matching. If OSDs don’t start, the logs might point to permission
issues, missing files (unit.poststop, type, and so on), a broken symbolic
link to the OSD block device, or other failures.&lt;/p&gt;
&lt;h3 id=&quot;ceph-dashboard&quot;&gt;Ceph Dashboard &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-dashboard&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Most likely you’ll have to enable the &lt;a href=&quot;https://docs.ceph.com/en/latest/mgr/dashboard/#enabling&quot;&gt;dashboard&lt;/a&gt;
again since all configurations are gone:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# ceph mgr module enable dashboard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After that, you’ll have to recreate users, roles etc., whatever you had configured before.&lt;/p&gt;
&lt;h3 id=&quot;packages&quot;&gt;Packages &lt;a class=&quot;link-anchor&quot; href=&quot;#packages&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of the issues during OSD activation in this case was the presence of the &lt;code&gt;ceph-osd&lt;/code&gt;
package on at least one of the hosts. It’s known to be problematic to have that
package present on a cephadm-managed cluster. So make sure that the &lt;code&gt;ceph-osd&lt;/code&gt; package
is absent from all cephadm-managed hosts. Basically, on a cephadm-managed cluster node you
only need the &lt;code&gt;cephadm&lt;/code&gt; package: the orchestrator uses a binary stored at /var/lib/ceph/$FSID/cephadm.{some_digest}
to remotely execute commands. For comfort reasons the &lt;code&gt;ceph-common&lt;/code&gt; package is also useful.
Other YUM/DNF/APT packages including &lt;code&gt;ceph-mon&lt;/code&gt;, &lt;code&gt;ceph-mgr&lt;/code&gt;, etc. are not required and should
also be absent.&lt;/p&gt;
&lt;h3 id=&quot;ceph-volume&quot;&gt;ceph-volume &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-volume&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As I already pointed out before, don’t use the bare ceph-volume commands to try and fix things
when OSDs are managed by the orchestrator. I recommend to remove the ceph-volume package as
well, if present. Attempts to fix the OSDs made things worse and caused more chaos, leaving
more things to clean up.&lt;/p&gt;
&lt;h3 id=&quot;container-images&quot;&gt;Container images &lt;a class=&quot;link-anchor&quot; href=&quot;#container-images&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As mentioned above, there’s a hard-coded default
image (&lt;code&gt;docker.io/ceph/daemon-base:latest-master-devel&lt;/code&gt;) which can make life harder.
Make sure to configure the correct Ceph &lt;code&gt;container_image&lt;/code&gt; as well as those for other
daemons, including &lt;code&gt;nvmeof&lt;/code&gt;, &lt;code&gt;grafana&lt;/code&gt;, &lt;code&gt;prometheus&lt;/code&gt;, &lt;code&gt;node_exporter&lt;/code&gt;, etc.):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;root@squid1:~# ceph config ls | grep container_image
container_image
mgr/cephadm/container_image_alertmanager
mgr/cephadm/container_image_base
mgr/cephadm/container_image_elasticsearch
mgr/cephadm/container_image_grafana
mgr/cephadm/container_image_haproxy
mgr/cephadm/container_image_jaeger_agent
mgr/cephadm/container_image_jaeger_collector
mgr/cephadm/container_image_jaeger_query
mgr/cephadm/container_image_keepalived
mgr/cephadm/container_image_loki
mgr/cephadm/container_image_node_exporter
mgr/cephadm/container_image_nvmeof
mgr/cephadm/container_image_prometheus
mgr/cephadm/container_image_promtail
mgr/cephadm/container_image_samba
mgr/cephadm/container_image_snmp_gateway
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Disclaimer: The procedure above was tested in two lab environments in order
to write this blog post, but the individual steps were executed in a real
cluster. It worked for me/us but it might not work for you. If anything
goes wrong it’s not my fault, but yours. And it’s yours to fix it!&lt;/p&gt;
&lt;p&gt;If you have suggestions how to improve the procedure or feedback in case you had to use it, I’d appreciate a comment!&lt;/p&gt;
&lt;p&gt;PS: Note that the best way to avoid losing cluster data due to an unrecoverable Monitor
store is to not lose the Monitor store in the first place. The abovementioned backup
procedure can help, as will ensuring that every production cluster runs five Monitor
daemons. While three is a valid number of Monitors to run, five has much greater
resilience. Ensure that your Monitors are spread across failure domains (e.g. hosts
or racks) and that no more than two can be placed in any one failure domain.&lt;/p&gt;
&lt;p&gt;This article has been crossposted from &lt;a href=&quot;https://heiterbiswolkig.blogs.nde.ag/2026/06/28/cephadm-recover-mon-store-using-osds/&quot;&gt;https://heiterbiswolkig.blogs.nde.ag/2026/06/28/cephadm-recover-mon-store-using-osds/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Reclaim Ceph Capacity Through CephFS Transcoding</title>
    <link href="https://ceph.io/en/news/blog/2026/cephfs-transcoding-ftw/" />
    <updated>2026-07-01T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/cephfs-transcoding-ftw/</id>
    <author>
      <name>Anthony D&#39;Atri</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="cephfs" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/cephfs-transcoding-ftw/">&lt;h2 id=&quot;data-expands-to-fill-available-storage-(and-beyond)!&quot;&gt;Data expands to fill available storage (and beyond)! &lt;a class=&quot;link-anchor&quot; href=&quot;#data-expands-to-fill-available-storage-(and-beyond)!&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It used to be that enterprise storage meant 6RU rackmount Fujitsu
2351 Eagles, each holding a mind-boggling 380 MiB of data: enough
for a whole company!&lt;/p&gt;
&lt;p&gt;Today that 380 MiB can&#39;t even hold a 4k pickleball video.
Enterprises, educational instutitions, and really just about anyone these
days demand storage capacities that &lt;em&gt;start&lt;/em&gt; on the order of hundreds
of tebibytes and rapidly grow to pebibytes.&lt;/p&gt;
&lt;p&gt;As this article is written in the spring of 2026, the memory market, which
includes DRAM, SSDs, and legacy HDDs, has experienced a dramatic escalation
of pricing. It is not uncommon to be quoted a price four times what the
same hardware cost a year ago, and there are signs that it is going to
get worse before it gets better.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What&#39;s a poor ammonite to do??&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Cephers find themselves between the Charybdis of quotes approaching
Disaster Area&#39;s hypermathematics and the Scylla of hungry users armed with
torches and git forks.&lt;/p&gt;
&lt;p&gt;Git forks, pitchforks. Get it? Sigh. Tough room. Anyway...&lt;/p&gt;
&lt;p&gt;Short of nuking the site from orbit, how do we make everyone happy, or at worst
mildly discontented?&lt;/p&gt;
&lt;p&gt;Efficiency!&lt;/p&gt;
&lt;h2 id=&quot;cephfs&quot;&gt;CephFS &lt;a class=&quot;link-anchor&quot; href=&quot;#cephfs&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;CephFS is a popular, highly available and scalable software-defined POSIX-style
distributed filesystem that can easily store tens of pebibytes of precious data.
Or, alternately, cat videos.&lt;/p&gt;
&lt;p&gt;Ceph deployments often begin small, with replicated pools for perceived performance
needs. As the cluster grows to more nodes and more data, it may become feasible
and desirable to switch to Erasure Coding (EC) to make more efficient use of
raw capacity.&lt;/p&gt;
&lt;p&gt;An EC pool thus can require substantially less raw storage for a given amount of
user data, or store gobs more user data on a given amount of raw capacity&lt;/p&gt;
&lt;p&gt;This &lt;a href=&quot;https://docs.ceph.com/en/latest/rados/operations/erasure-code/#id2&quot;&gt;EC overhead&lt;/a&gt;
table presents efficiency (space amplification) factors for a spectrum of EC profiles.
Replicated pools usually maintain three copies of data, so for comparison they manifest
an overhead factor of 3.0. EC 4+2 or 6+3 presents a factor of just 1.5, with some tradeoffs,
including some space amplification for the very smallest files.&lt;/p&gt;
&lt;p&gt;The use of EC has traditionally been limited to workloads
with modest write performance requirements. With SSDs, however, many workloads
are actually compatible with the tradeoffs of EC. Moreover, the Ceph Tentacle
release delivered the highly anticipated &lt;a href=&quot;https://ceph.io/en/news/blog/2025/tentacle-fastec-performance-updates/&quot;&gt;Fast EC&lt;/a&gt;
which brings EC pool performance much closer to parity with that of replicated pools,
enabling its use for workloads that previously demanded replication.&lt;/p&gt;
&lt;p&gt;Cephers often think that once data is written to a RADOS pool, the data protection
strategy is carved in stone unless one manually and disruptively moves data to
a different pool. RGW Lifecycle policies however offer a way to transition Ceph
Object Storage data between storageclasses and pools transparently, but we&#39;re to talk
about the draft ^H^H^H erm .. CephFS&lt;/p&gt;
&lt;p&gt;CephFS file systems / volumes typically provision one RADOS pool for metadata (&lt;code&gt;foo.meta&lt;/code&gt;) and one
for data (&lt;code&gt;foo.data&lt;/code&gt;). One can however attach multiple pools to a CephFS volume, which
may live on different media (HDD, mainstream NVMe SSD, coarse-IU QLC SSD) and/or employ
different data protection strategies (Replica 3, EC 4+2, EC 8+3, EC etc). When one
chooses to use EC to hold CephFS data, it&#39;s a good idea to provision at least two
data pools: the first (default) data pool holds inode backtraces and HEAD objects. When
there are no other data pools, the first data pool also holds file data.&lt;/p&gt;
&lt;p&gt;When one or more additional (and often EC) data pools are added to a CephFS volume, inode backtraces
and HEAD objects are still placed in the first / default data pool. But how do we
place bulk file data?&lt;/p&gt;
&lt;p&gt;One of the more obscure but very, very useful features of CephFS is the ability to
set &lt;a href=&quot;https://docs.ceph.com/en/latest/cephfs/file-layouts/&quot;&gt;file layouts&lt;/a&gt;. These are
somewhat akin to RGW / S3 &lt;em&gt;storage classes&lt;/em&gt; in that they can be applied to CephFS
volume (sub)directories or individual files to gate data placement. Which is
downright smurfy, but when one has pebibyates of data on replicated or expensive
storage and wishes to transparently migrate it to the new data pool(s), what to
do? Setting the layout on a directory, even the top level directory of a volume,
directs &lt;em&gt;new&lt;/em&gt; files to the desired pool, but existing files must be copied to
new files in order to change their placement. Doing this with a recursive &lt;code&gt;cp&lt;/code&gt;,
&lt;code&gt;tar&lt;/code&gt;, or &lt;code&gt;cpio&lt;/code&gt; command can be a lot of work, especially if one does not have
sufficient capacity to temporarily store an entire second copy of data. Moreover,
we need to consider symlinks, which are stored only in the &lt;code&gt;.meta&lt;/code&gt; pool, files
with multiple hard links, files that are currently being written, and files
that may be read or written &lt;em&gt;while&lt;/em&gt; copying.&lt;/p&gt;
&lt;h2 id=&quot;the-solution&quot;&gt;The solution &lt;a class=&quot;link-anchor&quot; href=&quot;#the-solution&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Recently as a Ceph Ambassador I crossed paths with a community member storing
breathtaking amounts of data, and adding more every day. All of this CephFS data had
been traditionally stored on mainstream TLC SSDs in replica 3 pools, because
these are the defaults for performance.&lt;/p&gt;
&lt;p&gt;Quotes for capacity expansion turned out to be dramatically higher than budgeted,
and they were in a bind.&lt;/p&gt;
&lt;p&gt;I helped them discover that while their MDS estate is very busy, at the RADOS level
their datalake is read-mostly, with modest to moderate client read workload. They do
need the reads to be fast, but write speed is of lesser concern. This is a classic
workload for EC, and for QLC (or QLC-class) SSDs. I helped them identify additional
QLC-class SSD options, and proposed a converstion of the CephFS datalake to EC
to reclaim ... well they don&#39;t want to disclose numbers, but let&#39;s say a many zeros
of existing raw capacity to defray and defer spending until such a time that the
NAND market cools down.&lt;/p&gt;
&lt;p&gt;Enter this ultimate answer to EC, CephFS, and everything:
a &lt;a href=&quot;https://www.reddit.com/r/ceph/comments/1l1ey87/cephfs_layoutpool_migration_script/&quot;&gt;transcoder script&lt;/a&gt;
posted by Reddit user &lt;code&gt;marcan42&lt;/code&gt;. This script is a terrific inspiration, but
bears a number of shortcomings. I worked with the community member to enhance the
script: my fork can be found &lt;a href=&quot;https://github.com/anthonyeleven/vcephfs_transcoder&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In a nutshell, the script walks a CephFS volume or subdirectory thereof, processing
files by creating a copy with the new file layout then atomically renaming the copy
over the original. This strategy means that clients can continue to access data without
risk of disruption, corruption, or divergence. Care is taken to avoid symlinks
and to properly handle files with multiple hard links.&lt;/p&gt;
&lt;p&gt;By working on one file at a time, we avoid the need for enough
unused capacity for a second if temporary copy of a directory tree or even
entire volume. Because if we had that kinda space, we mostly wouldn&#39;t be
having this conversation. Mostly. This approach also helps avoid divergence and
reduce or eliminate the need for laborious cleanup in the event of a network
or client host outage.&lt;/p&gt;
&lt;p&gt;Painstaking care is taken to detect files that change while being processed so that they
are not diverged, corrupted or deleted. Options are present to constrain the files
that are transcoded:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To a specific subtree of a volume&lt;/li&gt;
&lt;li&gt;To files that are not multiply hardlinked, out of an abundance of caution&lt;/li&gt;
&lt;li&gt;To files older and/or newer than a specified number of days, especially when
older files are much less likely to be changed or deleted during processing&lt;/li&gt;
&lt;li&gt;To files above a specified minimum size.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The script by default processes four files in parallel; this number may be adjusted
on the command line to trade off network and client impact against elapsed time.&lt;/p&gt;
&lt;p&gt;When using EC, the very smallest files
can actually consume &lt;em&gt;more&lt;/em&gt; raw capacity than replication. The FastEC improvements
in the Ceph Tentacle release reduce but do not eliminate this concern. In releases
before Tentacle, RADOS always writes complete stripes.
When using conventional media, and with OSDs created on releases newer than
Octopus, the default value of &lt;code&gt;bluestore_min_alloc_size&lt;/code&gt; is 4KiB. Say we&#39;re using
an EC 8+3 data pool and a user creates a 1 byte file. A full-stripe write will
allocate &lt;code&gt;11 * 4 = 44KiB&lt;/code&gt; of raw storage. For a single file this is negligible,
but with millions or billions of files this &lt;em&gt;space amplification&lt;/em&gt; adds up.&lt;/p&gt;
&lt;p&gt;This &lt;a href=&quot;https://www.spinics.net/lists/dev-ceph/msg00795.html&quot;&gt;fantastic resource&lt;/a&gt; from
Mark Nelson quantifies and visualizes this space amplification dynamic, which in
the Octopus / Pacific area lead Ceph developers to enable lowering the
default &lt;code&gt;bluestore_min_alloc_size&lt;/code&gt;. Today, however, coarse-IU QLC SSDs are
an increasingly compelling alternative to both conventional TLC SSDs and HDDs.
They offer cost effectiveness and fantastic density: as of March 2026,
U.2 SKUs with the incredible capacity of 245 tebibytes are entering the market.&lt;/p&gt;
&lt;p&gt;These however do best when &lt;code&gt;bluestore_min_alloc_size&lt;/code&gt; is matched to the IU,
which is usually 16 KiB, but for older drives may be as high as 64 KiB. For
conventional media and popular EC profiles a minimum size of, say, 500 KiB
may be specified to avoid space amplification. For many deployments, much
larger files may render a bit of space amp for tiny files more or less moot,
but the option is there so that individuals may choose what&#39;s right for
their file demographics.&lt;/p&gt;
&lt;p&gt;It is said that a picture is worth 1024 words, so here&#39;s another obigatory
contextually appropriate AI-generated octopus:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/Gemini_Generated_Image_e484jee484jee484.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Oh, you want hard data. ABOUT THE TOPIC. Fine. Be like that.&lt;/p&gt;
&lt;p&gt;This first graph shows the raw capacity used by the original
Replica 3 data pool of a real-world CephFS volume in green, and the
capacity used by the new EC 6+3 pool in blue. The barely-visible
red line depicts the obligatory &lt;code&gt;.meta&lt;/code&gt; pool. (Ignore the dots,
they are Prometheus scraping artifact). One can see readily that as the
amount of data consumed by the first pool decreases the amount consumed
by the new pool rises -- but at very roughly half the rate. This is
expected when transcoding from Replica 3 (space amp 3.0) to EC 6+3 (space
amp 1.5). The spans where the lines flatten out somewhat correspond to
expanses of files that were too new, too small, symlinks, or multiply linked.
The script can handle multiply-linked files, but with as many as 7000 (!)
links to some files, those are skipped for the initial runs.&lt;/p&gt;
&lt;p&gt;This transcoder run specified:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;15 threads&lt;/li&gt;
&lt;li&gt;Minimum 500 KiB file size&lt;/li&gt;
&lt;li&gt;Minimum 1 day file age&lt;/li&gt;
&lt;li&gt;Skipping multiply-linked files&lt;/li&gt;
&lt;li&gt;A 6+3 EC policy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With these options, files were processed at 5-15 TiB per hour.
Your mileage may vary.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/scratch.pools.better.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This second graph shows the sum of the series in the above graph, more
simply visualizing the aggregate savings in underlying raw capacity.
Here we can see that the subject volume consumed roughly 330 TiB
before transcoding, but only 185 TiB after, reclaiming 44% of raw
capacity. The 7% deviation from the theoretical ideal is the
cumulative effect of files too small, too new, or too multiply linked
for transcoding.&lt;/p&gt;
&lt;p&gt;The beauty of this approach is that the script is &lt;em&gt;idempotent&lt;/em&gt;. One may
run it again with different, or even the same parameters to pick up
files as they pass the minimum age cut-off, or with a smaller threshold.
The community member that inspired this post is not yet running Tentacle;
once they have upgraded and enabled EC optimizations on their pools, they
plan another pass over the data with a smaller threshold.&lt;/p&gt;
&lt;p&gt;One does not need to re-run the transcoder to pick up newly-created files,
as the process leaves the default layout for the directory (which may
be the volume&#39;s root) set to the new pool. It is possible, with repeated
runs, to arrange arbitrary subdirectory trees to use one layout (pool) or
another, with inheritance and overriding. It is even possible to migrate
desired subsets of data &lt;em&gt;back&lt;/em&gt; to the default pool, or to another pool
on different media. The script is written in a way that it does not
reprocess files if they are already set to the target layout, ensuring
idempotence.&lt;/p&gt;
&lt;p&gt;This process does entail the creation of an additional RADOS pool for each
CephFS volume transcoded, so be sure to account for that in your manual or
autoscaler PG strategy. While not widely known, Ceph currently has a hard
limit of 256 CRUSH rules per cluster. The transcoding setup script takes
care of creating new EC profiles and CRUSH rules only as necessary,
re-using them for additional CephFS volumes with the same profile.
When executing, take care to manage &lt;code&gt;pg_num&lt;/code&gt; on both old and new
pools, via the PG autoscaler or other means.  As data is moved off
the old pool, the PG budget it was allocated can be reduced, and PGs
added to the new pool.&lt;/p&gt;
&lt;p&gt;As a rule of thumb, a PG / shard should hold no more than
roughly one hundred thousand RADOS objects, or 200 TiB. Remember that
the old pool may still hold many RADOS objects, but not much data
volume, so avoid the temptation to reduce &lt;code&gt;pg_num&lt;/code&gt; too low. The
little-used &lt;code&gt;rados df&lt;/code&gt; command can help gauge what&#39;s right. Also
remember that EC PGs are sharded, so in the above example, each EC 6+3
shard is only 16% the size of the previous replica 3 PGs, so don&#39;t
overdo &lt;code&gt;pg_num&lt;/code&gt; on a new EC pool. Depending on the EC profile,
the sufficient value for the new pool may be 25% or so of the original
replicated pool&#39;s value.&lt;/p&gt;
&lt;p&gt;The setup script that manages pools and layout xattrs now has an option
to create a new pool with a specified number of PGs. It&#39;s best to get
this at least vaguely right up front, when PG creation is fast and painless
on an empty pool. Splitting or merging PGs later when the pool holds
tebibytes or pebibytes of data is much slower and more impactful.&lt;/p&gt;
&lt;p&gt;When migrating between two EC profiles, use your judgement.&lt;/p&gt;
&lt;p&gt;To-do: filter on filename regexes.&lt;/p&gt;
&lt;p&gt;This has not been tested on CephFS subvolumes, nor has it been
tested transcoding back to a replicated volume. This analysis and
code are presented as-is with the goal of delivering value to the Ceph
community. No warranty or support should be inferred. It is free,
and worth every penny.&lt;/p&gt;
&lt;p&gt;Do not taunt the script or stare into it with remaining eye.&lt;/p&gt;
&lt;p&gt;Suggestions or improvements are welcome, on a best-effort basis.&lt;/p&gt;
&lt;p&gt;The upcoming Umbrella release is expected to introduce &lt;a href=&quot;https://docs.ceph.com/en/latest/dev/pool-migration-design/&quot;&gt;transparent
pool migration&lt;/a&gt;
at the RADOS layer. This ability will be very useful and may one
day obviate the script discussed here, though one should approach
its use carefully after thorough testing. The need for compatible
clients will, notably, limit the ability of many CephFS deployments to use
that new approach until compatible kernels make it into your Linux
distribution(s) in use. The file-layout based approach we&#39;ve explored
here works until the new transparent migration can be rolled out.&lt;/p&gt;
&lt;h2 id=&quot;about-the-author%2C-anthony-d&#39;atri&quot;&gt;About the author, Anthony D&#39;Atri &lt;a class=&quot;link-anchor&quot; href=&quot;#about-the-author%2C-anthony-d&#39;atri&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ceph at scale since 2014&lt;/li&gt;
&lt;li&gt;(Successfully since 2017)&lt;/li&gt;
&lt;li&gt;Ceph Ambassador&lt;/li&gt;
&lt;li&gt;Ceph Documentation Lead&lt;/li&gt;
&lt;li&gt;Author: &lt;em&gt;Learning Ceph, Second Edition&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;QLC fanboy&lt;/li&gt;
&lt;li&gt;Ceph is quite graphically a part of me&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ceph Q2 2026 Newsletter</title>
    <link href="https://ceph.io/en/news/blog/2026/q2-ceph-newsletter/" />
    <updated>2026-06-25T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/q2-ceph-newsletter/</id>
    <author>
      <name>Anthony Middleton</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="community" />
      <category term="governance" />
      <category term="ceph events" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/q2-ceph-newsletter/">&lt;p&gt;During the second quarter, the Ceph Foundation focused on strengthening collaboration across the project, expanding community programs, supporting documentation efforts, and investing in regional events. This edition highlights recent governance discussions, community elections, new contributor resources, Ceph Days events, and opportunities for community members to get involved. If you have an idea for a Ceph-related event, outreach effort, or project, we encourage you to submit a &lt;a href=&quot;https://form.asana.com/?k=7aCHVRhp0x1Ga1nOCXlckQ&amp;d=9283783873717&quot;&gt;funding request&lt;/a&gt; and work with the Foundation to help bring it to life.&lt;/p&gt;
&lt;h2 id=&quot;in-this-issue&quot;&gt;In This Issue &lt;a class=&quot;link-anchor&quot; href=&quot;#in-this-issue&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#board-and-csc-alignment-on-community-priorities&quot;&gt;Board and CSC Alignment on Community Priorities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2026-csc-election-recap&quot;&gt;2026 CSC Election Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#meet-the-new-ceph-technical-writer&quot;&gt;Meet the New Ceph Technical Writer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ceph-days-continue-to-grow&quot;&gt;Ceph Days Continue to Grow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#latest-ceph-releases&quot;&gt;Latest Ceph Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#community-committees-more-ways-to-contribute&quot;&gt;Community Committees and New Ways to Contribute&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;board-and-csc-alignment-on-community-priorities&quot;&gt;Board and CSC Alignment on Community Priorities &lt;a class=&quot;link-anchor&quot; href=&quot;#board-and-csc-alignment-on-community-priorities&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Ceph Governing Board and Community Steering Committee (CSC) met this quarter to discuss the long-term health of the project, governance, documentation, community growth, and Foundation-supported initiatives.&lt;/p&gt;
&lt;p&gt;The discussion reaffirmed the distinct roles of each organization within the Ceph ecosystem. The CSC continues to provide technical governance for the project, while the Ceph Foundation focuses on community growth, events, outreach, and funding. The Linux Foundation provides operational, legal, and financial support that enables both groups to operate effectively.&lt;/p&gt;
&lt;p&gt;A significant area of focus was improving coordination between technical priorities and Foundation-supported programs. Current documentation initiatives include improvements to the documentation backport process, development of a new OSD operations guide, clarification of package and container documentation, and the removal of outdated content.&lt;/p&gt;
&lt;p&gt;The Board and CSC also discussed the future of community events and the importance of establishing clear goals and success metrics for Foundation-funded programs. Both groups reaffirmed their commitment to supporting collaboration between users, developers, operators, and organizations across the Ceph ecosystem.&lt;/p&gt;
&lt;h3 id=&quot;key-takeaways&quot;&gt;Key Takeaways &lt;a class=&quot;link-anchor&quot; href=&quot;#key-takeaways&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Continued alignment between the Board and CSC on project priorities.&lt;/li&gt;
&lt;li&gt;Improved coordination around documentation and community outreach efforts.&lt;/li&gt;
&lt;li&gt;Ongoing work to define success metrics for Foundation-funded programs and events.&lt;/li&gt;
&lt;li&gt;Shared commitment to strengthening collaboration across the community.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;2026-csc-election-recap&quot;&gt;2026 CSC Election Recap &lt;a class=&quot;link-anchor&quot; href=&quot;#2026-csc-election-recap&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This year&#39;s CSC election introduced several improvements, including ranked-choice voting and candidate statements, helping create a more transparent and participatory election process.&lt;/p&gt;
&lt;p&gt;The election also highlighted opportunities to improve ballot communication and voter outreach in future cycles. Lessons learned from this year&#39;s process will help strengthen future elections and improve the overall voter experience.&lt;/p&gt;
&lt;h3 id=&quot;2026-csc-co-chairs&quot;&gt;2026 CSC Co-Chairs &lt;a class=&quot;link-anchor&quot; href=&quot;#2026-csc-co-chairs&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Patrick Donnelly&lt;/li&gt;
&lt;li&gt;Neha Ojha&lt;/li&gt;
&lt;li&gt;Dan van der Ster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to all candidates who participated and to every community member who cast a ballot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pad.ceph.com/p/CSC_Election_April_2026&quot;&gt;Read the full election recap for additional details&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;meet-the-new-ceph-technical-writer&quot;&gt;Meet the New Ceph Technical Writer &lt;a class=&quot;link-anchor&quot; href=&quot;#meet-the-new-ceph-technical-writer&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Earlier this year, the Foundation announced its search for a Technical Writer to help improve the quality and accessibility of Ceph documentation. Following the interview process, the hiring committee selected Emmanuel Ameh for the role.&lt;/p&gt;
&lt;p&gt;Emmanuel will work closely with contributors across the community to improve documentation, reduce onboarding friction for new users, and help make Ceph documentation easier to navigate and maintain.&lt;/p&gt;
&lt;p&gt;If you are interested in joining the Ceph Tech Writing committee, please contact Emmanuel at &lt;a href=&quot;mailto:eameh@contractor.linuxfoundation.org&quot;&gt;eameh@contractor.linuxfoundation.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Read Emmanuel&#39;s introduction on the Ceph &lt;a href=&quot;https://ceph.io/en/news/blog/2026/from-laminated-pages-to-petabytes/&quot;&gt;introduction blog&lt;/a&gt; to learn more about his background and goals for the role.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;ceph-days-continue-to-grow&quot;&gt;Ceph Days Continue to Grow &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-days-continue-to-grow&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Community events remain one of the most effective ways for Ceph users and contributors to connect, share experiences, and learn from one another.&lt;/p&gt;
&lt;p&gt;During the second quarter, the community gathered for two Ceph Days events:&lt;/p&gt;
&lt;h3 id=&quot;ceph-days-seattle-2026&quot;&gt;Ceph Days Seattle 2026 &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-days-seattle-2026&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; May 28, 2026&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sponsors:&lt;/strong&gt; OSNexus and CLYSO&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attendance:&lt;/strong&gt; 30 community members&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;John Shubeck, a Senior Storage Technical Specialist for IBM Object Storage, shared a detailed recap of the recent Ceph Days event in a new &lt;a href=&quot;https://ceph.io/en/news/blog/2026/cd-seattle-cloud-blog/&quot;&gt;blog post&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;ceph-days-london-2026&quot;&gt;Ceph Days London 2026 &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-days-london-2026&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; June 17, 2026&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lead Sponsor:&lt;/strong&gt; IBM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attendance:&lt;/strong&gt; 120&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are a few of the photos of the thriving &lt;a href=&quot;https://drive.google.com/drive/folders/1qKCSZyephZp42BBqaxw-mQ1iuGnUW6sO?usp=sharing&quot;&gt;Ceph community in London&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;These events featured technical presentations, real-world deployment stories, community networking, and discussions about the future of Ceph.&lt;/p&gt;
&lt;p&gt;The Foundation continues to focus on supporting regional events, meetups, and community-led initiatives that help expand Ceph&#39;s reach and introduce new users to the project.&lt;/p&gt;
&lt;p&gt;Check the upcoming and tentative Ceph Days events for the rest of 2026.&lt;/p&gt;
&lt;h3 id=&quot;ceph%2C-openinfra%2C-and-kcd-days-korea&quot;&gt;Ceph, OpenInfra, and KCD Days Korea &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph%2C-openinfra%2C-and-kcd-days-korea&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lead Sponsors:&lt;/strong&gt; Cloud Native Computing Foundation and OpenInfra&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; Q3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL:&lt;/strong&gt; TBD&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ceph-days-zurich-2026&quot;&gt;Ceph Days Zurich 2026 &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-days-zurich-2026&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lead Sponsor:&lt;/strong&gt; CLYSO&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; Oct 14, 2026&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL:&lt;/strong&gt; &lt;a href=&quot;https://ceph.io/en/community/events/2026/ceph-days-zurich/&quot;&gt;https://ceph.io/en/community/events/2026/ceph-days-zurich/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ceph-days-new-york&quot;&gt;Ceph Days New York &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-days-new-york&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lead Sponsor:&lt;/strong&gt; Bloombreg&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; Q3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL:&lt;/strong&gt; TBD&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ceph-days-chicago&quot;&gt;Ceph Days Chicago &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-days-chicago&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lead Sponsor:&lt;/strong&gt; CLYSO, IBM, and OSNexus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date:&lt;/strong&gt; Q4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL:&lt;/strong&gt; TBD&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;get-involved&quot;&gt;Get Involved &lt;a class=&quot;link-anchor&quot; href=&quot;#get-involved&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Interested in organizing a meetup, hosting a Ceph Day, speaking at an event, or promoting Ceph in your region? Community participation is what makes these events successful.&lt;/p&gt;
&lt;p&gt;If you need support for a Ceph event, meetup, travel, or community campaign, submit a &lt;a href=&quot;https://form.asana.com/?k=7aCHVRhp0x1Ga1nOCXlckQ&amp;d=9283783873717&quot;&gt;funding request&lt;/a&gt; to the Ceph Foundation. Requests are reviewed by the Governing Board and Linux Foundation staff and considered based on available budget and community impact.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;latest-ceph-releases&quot;&gt;Latest Ceph Releases &lt;a class=&quot;link-anchor&quot; href=&quot;#latest-ceph-releases&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The community published maintenance releases for both the Squid and Tentacle release series during the quarter.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ceph.io/en/news/blog/2026/v19-2-4-squid-released/&quot;&gt;v19.2.4 Squid Released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ceph.io/en/news/blog/2026/v20-2-1-tentacle-released/&quot;&gt;v20.2.1 Tentacle Released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ceph.io/en/news/blog/2026/v20-2-2-tentacle-released/&quot;&gt;v20.2.2 Tentacle Released&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you to the many contributors, maintainers, testers, and reviewers who continue to support Ceph releases.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;community-committees%3A-more-ways-to-contribute&quot;&gt;Community Committees: More Ways to Contribute &lt;a class=&quot;link-anchor&quot; href=&quot;#community-committees%3A-more-ways-to-contribute&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Community committees are coming soon. These committee will provide opportunities for contributors to help shape the future of Ceph beyond code contributions alone. Whether your interests include events, documentation, outreach, onboarding, or community programs, there are many ways to participate.&lt;/p&gt;
&lt;p&gt;Committee participation will be shared through our &lt;a href=&quot;https://ceph.io/en/community/connect/&quot;&gt;social channel and mailing list&lt;/a&gt;. Watch upcoming community communications for additional opportunities to join working groups and contribute to Foundation-led initiatives.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>v20.2.2 Tentacle released</title>
    <link href="https://ceph.io/en/news/blog/2026/v20-2-2-tentacle-released/" />
    <updated>2026-06-16T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/v20-2-2-tentacle-released/</id>
    <author>
      <name>Yuri Weinstein, Patrick Donnelly</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="release" />
      <category term="tentacle" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/v20-2-2-tentacle-released/">&lt;p&gt;This is the second minor release in the Tentacle series.
We recommend that all users update to this release.&lt;/p&gt;
&lt;h2 id=&quot;release-date&quot;&gt;Release Date &lt;a class=&quot;link-anchor&quot; href=&quot;#release-date&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;June 16, 2026&lt;/p&gt;
&lt;h2 id=&quot;notable-changes&quot;&gt;Notable Changes &lt;a class=&quot;link-anchor&quot; href=&quot;#notable-changes&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Rocky 10 package-based installs are now supported starting with v20.2.2. Please see the &lt;a href=&quot;https://docs.ceph.com/en/latest/start/os-recommendations/#platforms&quot;&gt;supported platforms&lt;/a&gt; for current and planned support in Ceph.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;mds-(metadata-server)&quot;&gt;MDS (Metadata Server) &lt;a class=&quot;link-anchor&quot; href=&quot;#mds-(metadata-server)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Segmentation fault fixed due to incorrect queueing of request retries.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;osd-(object-storage-daemon)&quot;&gt;OSD (Object Storage Daemon) &lt;a class=&quot;link-anchor&quot; href=&quot;#osd-(object-storage-daemon)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PGLog Missed List: Fixed a bug to ensure the correct version is attached to the missing list when ignoring log entries.&lt;/li&gt;
&lt;li&gt;Data Integrity Asserts: Added assertions to explicitly catch potential corruption in the OSD missing list.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rgw-(rados-gateway)&quot;&gt;RGW (RADOS Gateway) &lt;a class=&quot;link-anchor&quot; href=&quot;#rgw-(rados-gateway)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lifecycle Management: Fixed lifecycle transition issues affecting encrypted multipart objects.&lt;/li&gt;
&lt;li&gt;REST &amp;amp; Query Handling: RESTArgs::get_string() now properly URL-decodes incoming query parameters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rados-%2F-librados-%2F-neorados&quot;&gt;RADOS / librados / neorados &lt;a class=&quot;link-anchor&quot; href=&quot;#rados-%2F-librados-%2F-neorados&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Linger Operations: Rewrote safety checks to eliminate use-after-free vulnerabilities and LingerOp memory leaks when an unwatch operation returns ENOTCONN. Replaced the flawed is_valid_watch() check with a safe linger_by_cookie() lookup which safely manages LingerOp references using intrusive_ptr. Ensured librados linger callbacks hold a persistent reference to LingerOp to protect against races with simultaneous linger_cancel() requests. Configured librados::IoCtxImpl::aio_unwatch() to asynchronously deliver ENOTCONN to AioCompletion instead of returning the error directly.&lt;/li&gt;
&lt;li&gt;Watch/Notify: Fixed neorados notification queue bounds enforcement so that an overflow marker is only appended on the first message exceeding capacity, rather than duplicating it on every subsequent message. Prevented double-cleanup triggers in watch/notify operations when incoming errors arrive after maybe_cleanup() runs. Fixed a bug where notify would lose original error values by ensuring it no longer attempts to decode empty responses. Enhanced io_context shutdown procedures to clear handlers and route cleanly through linger_cancel to avoid use-after-free states.&lt;/li&gt;
&lt;li&gt;Async Utilities: Fixed an issue regarding the improper removal of objects from the async service list.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dashboard&quot;&gt;Dashboard &lt;a class=&quot;link-anchor&quot; href=&quot;#dashboard&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NVMeoF Revamp: Complete UI overhaul with DHCHAP controller key support, namespace encryption, and secure listeners configuration.&lt;/li&gt;
&lt;li&gt;Pools &amp;amp; RGW: Added stretch cluster validation for pools, fixed RGW restart/stop issues, storage class restrictions, sync policy fixes, and MSR EC Profile support.&lt;/li&gt;
&lt;li&gt;NFS: Toggle visibility for CephFS snapshots, fixed export creation and path value consistency issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ceph-volume&quot;&gt;ceph-volume &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-volume&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Inventory Scanning: Enhanced inventory discovery logic to automatically skip RAM disk devices (/dev/ram*).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;external-block-device-(extblkdev)&quot;&gt;External Block Device (extblkdev) &lt;a class=&quot;link-anchor&quot; href=&quot;#external-block-device-(extblkdev)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Plugin Stability: Fixed an assertion failure in the FCM plugin when encountering multivolume devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;changelog&quot;&gt;Changelog &lt;a class=&quot;link-anchor&quot; href=&quot;#changelog&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;(tentacle) ceph-volume: backport PRs 67047 and 67240 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67343&quot;&gt;pr#67343&lt;/a&gt;, Guillaume Abrioux, Parfait Detchenou)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[tentacle] bluestore, extblkdev: Now plugins can raise health warnings (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68663&quot;&gt;pr#68663&lt;/a&gt;, Adam Kupczyk, Igor Fedotov, Martin Ohmacht)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Backporting PRs 67236 and 67419 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67533&quot;&gt;pr#67533&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beacon diff + Stretched cluster (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68347&quot;&gt;pr#68347&lt;/a&gt;, Leonid Chernin, Samuel Just)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: include LVM mapper devices in get_devices() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67989&quot;&gt;pr#67989&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: skip /dev/ram* devices in inventory (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68552&quot;&gt;pr#68552&lt;/a&gt;, Ujjawal Anand)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: skip mkfs discard for LVM NVMe OSDs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68286&quot;&gt;pr#68286&lt;/a&gt;, Ujjawal Anand)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: skip redundant NVMe mkfs discards (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67341&quot;&gt;pr#67341&lt;/a&gt;, Ujjawal Anand)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: skip virtual cdrom devices in inventory (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68108&quot;&gt;pr#68108&lt;/a&gt;, Ujjawal Anand)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph&lt;span&gt;&lt;/span&gt;.spec&lt;span&gt;&lt;/span&gt;.in: replace golang github prometheus with promtool binary path (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68420&quot;&gt;pr#68420&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph_mon: Fix shutdown order to destroy Monitor before closing mon store (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68399&quot;&gt;pr#68399&lt;/a&gt;, Prashant D)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephadm: wait for latest osd map after ceph-volume before OSD deploy (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68379&quot;&gt;pr#68379&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs: MDCache request cleanup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66469&quot;&gt;pr#66469&lt;/a&gt;, Abhishek Lekshmanan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check if &lt;code&gt;HTTP&#92;_X&#92;_AMZ&#92;_COPY&#92;_SOURCE&lt;/code&gt; header is empty (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66027&quot;&gt;pr#66027&lt;/a&gt;, Suyash Dongre)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: adjust &lt;code&gt;Fb&lt;/code&gt; cap ref count check during synchronous fsync() (&lt;a href=&quot;http://tracker.ceph.com/issues/73624&quot;&gt;issue#73624&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/65913&quot;&gt;pr#65913&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: crash caused by invalid iterator in _readdir_cache_cb (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65957&quot;&gt;pr#65957&lt;/a&gt;, Zhansong Gao)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;container/build&lt;span&gt;&lt;/span&gt;.sh: add &#39;rocky-10&#39; suffix if necessary (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67895&quot;&gt;pr#67895&lt;/a&gt;, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;container/build&lt;span&gt;&lt;/span&gt;.sh: FROM_IMAGE=rockylinux-10 default for &amp;gt;=tentacle backports (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67960&quot;&gt;pr#67960&lt;/a&gt;, Matan Breizman, David Galloway, John Mulligan, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian: package mgr/smb in ceph-mgr-modules-core (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67510&quot;&gt;pr#67510&lt;/a&gt;, Roland Sommer)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian: remove invoke-rc&lt;span&gt;&lt;/span&gt;.d calls from postrm scripts (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67354&quot;&gt;pr#67354&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian: remove stale distutils override from py3dist-overrides (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68276&quot;&gt;pr#68276&lt;/a&gt;, Thomas Lamprecht, Max R. Carrara, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Batch backport for start/hardware-recommendations&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67907&quot;&gt;pr#67907&lt;/a&gt;, Anthony D&#39;Atri, Marc Methot, Pierre Riteau, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;extblkdev: Fix FCM plugin asserting on multivolume devices (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68877&quot;&gt;pr#68877&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;found duplicate series for the match group {fs_id=&amp;quot;-1&amp;quot;} (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68369&quot;&gt;pr#68369&lt;/a&gt;, bst2002git)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implement Admin REST APIs for Setting Account Quota (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66905&quot;&gt;pr#66905&lt;/a&gt;, Nicholas Liu, Jiffin Tony Thottan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kv/RocksDB: Add instrumentation to BinnedLRUCache (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67349&quot;&gt;pr#67349&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;libcephsqlite: ensure atexit handlers are registered after openssl (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68263&quot;&gt;pr#68263&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd/cache/pwl: WriteLogOperationSet::cell can be garbage (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67705&quot;&gt;pr#67705&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd/migration/QCOWFormat: avoid use-after-free in execute_request() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68188&quot;&gt;pr#68188&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd/mirror: detect trashed snapshots in UnlinkPeerRequest (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67583&quot;&gt;pr#67583&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: avoid losing sparseness in read_parent() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68463&quot;&gt;pr#68463&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: don&#39;t complete ImageUpdateWatchers::shut_down() prematurely (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67581&quot;&gt;pr#67581&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: rbd_aio_write_with_crc32c (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68038&quot;&gt;pr#68038&lt;/a&gt;, Alexander Indenbaum)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: add ref counting to LogSegment (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68439&quot;&gt;pr#68439&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: add retry request to MDSRank wait queue rather via finisher (&lt;a href=&quot;http://tracker.ceph.com/issues/76031&quot;&gt;issue#76031&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/68905&quot;&gt;pr#68905&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: scrub pins more inodes than the mds_cache_memory_limit (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67808&quot;&gt;pr#67808&lt;/a&gt;, Md Mahamudur Rahaman Sajib)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: use SimpleLock::WAIT_ALL for wait mask (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68313&quot;&gt;pr#68313&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: Add KMIP server support for NVMeoF gateway (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68086&quot;&gt;pr#68086&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: add rbd_with_crc32c parameter to nvmeof service spec (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66933&quot;&gt;pr#66933&lt;/a&gt;, Alexander Indenbaum)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: fix mgmt-gateway startup on IPv6 VIP (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68387&quot;&gt;pr#68387&lt;/a&gt;, Kobi Ginon)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: include cluster FSID in root CA Common Name (CN) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64692&quot;&gt;pr#64692&lt;/a&gt;, Redouane Kachach, Kushal Deb)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: serialize OSD class before returning for OSD rm status (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69226&quot;&gt;pr#69226&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/DaemonServer: Implement ok-to-upgrade command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66948&quot;&gt;pr#66948&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/DaemonServer: Limit search for OSDs to upgrade within the crush bucket (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68350&quot;&gt;pr#68350&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Add bottom padding for dashboard screens (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68523&quot;&gt;pr#68523&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : add stretch cluster validation for pools form (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68476&quot;&gt;pr#68476&lt;/a&gt;, Afreen Misbah, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Fix RGW restart/stop issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68554&quot;&gt;pr#68554&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : fix-non-versioning-bucket-issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68520&quot;&gt;pr#68520&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Fixes EC profile used pool empty (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68730&quot;&gt;pr#68730&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Restrict create storage class with existing name (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68475&quot;&gt;pr#68475&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: [RGW-NFS]: User level export creation via UI fails with 500 - Internal Server Error (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67013&quot;&gt;pr#67013&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: [snap-visibility]Edit Client config option remains stuck in loading when nfs user is configured (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68542&quot;&gt;pr#68542&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: [storage-class]: Deleting local storage class from UI does not remove its entry from zone (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67949&quot;&gt;pr#67949&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add DHCHAP controller key to NVME host commands (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67600&quot;&gt;pr#67600&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add helper text to bucket form &amp;gt; policy and other spacing fixes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67871&quot;&gt;pr#67871&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add location to gateway info command in NVMeoF CLI (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68345&quot;&gt;pr#68345&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add namespace encryption support to NVMeoF CLI (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68339&quot;&gt;pr#68339&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add nvmeof_top_cli service (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67566&quot;&gt;pr#67566&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add option to edit zone with keys/ (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68317&quot;&gt;pr#68317&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add option to set motd via api (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68678&quot;&gt;pr#68678&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add overview page (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67840&quot;&gt;pr#67840&lt;/a&gt;, Afreen Misbah, Devika Babrekar, Aashish Sharma, Abhishek Desai, Naman Munet, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add port and secure-listeners to subsystem add NVMeoF CLI command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68370&quot;&gt;pr#68370&lt;/a&gt;, Vallari Agrawal, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add restore events in notification screen (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67912&quot;&gt;pr#67912&lt;/a&gt;, pujashahu, pujaoshahu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add secure and verify-host-name to &amp;quot;listener add&amp;quot; on NVMeoF CLI (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67799&quot;&gt;pr#67799&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Adding rados ns option into add_ns_req (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67470&quot;&gt;pr#67470&lt;/a&gt;, gadi-didi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Allow empty port value when adding a listener in NVMEoF CLI (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68766&quot;&gt;pr#68766&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Batch backport nvmeof revamp (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67839&quot;&gt;pr#67839&lt;/a&gt;, Afreen Misbah, Nizamudeen A, Sagar Gopale, pujaoshahu, Puja Shahu, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Bump lodash (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68695&quot;&gt;pr#68695&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: bump nvmeof submodule to 1&lt;span&gt;&lt;/span&gt;.6&lt;span&gt;&lt;/span&gt;.5 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67326&quot;&gt;pr#67326&lt;/a&gt;, Vallari Agrawal, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: carbonize-osd-flags-modal (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68133&quot;&gt;pr#68133&lt;/a&gt;, Afreen Misbah, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Difference in &amp;quot;path&amp;quot; value observed when rgw user level export created via dashboard vs cli (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68583&quot;&gt;pr#68583&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix subvolume group corruption from smb share form (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68103&quot;&gt;pr#68103&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Fix tags in subvolume list and subvolume groups list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68382&quot;&gt;pr#68382&lt;/a&gt;, pujaoshahu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Making &#39;ISA&#39; as default plugin for EC profiles created through dashboard (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68373&quot;&gt;pr#68373&lt;/a&gt;, Devika Babrekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: mgr/dashboard: Carbonize Realm Name and Token block in Multi-site Replication Wizard (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68546&quot;&gt;pr#68546&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Misleading warning when no eligible devices are available for OSD creation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67637&quot;&gt;pr#67637&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: nfs export creation fails with obj deserialization (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67564&quot;&gt;pr#67564&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: NFS: Toggle visibility of CephFS snapshots (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67636&quot;&gt;pr#67636&lt;/a&gt;, Afreen Misbah, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Option to select archive option while Import Multi-site Token (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68513&quot;&gt;pr#68513&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: remove sync_from entry when sync_from_all is true (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68536&quot;&gt;pr#68536&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Rename Alert breadcrumb to Alert Rules (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68238&quot;&gt;pr#68238&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: sync policy created for a bucket in Object &amp;gt;&amp;gt; Multi-site &amp;gt;&amp;gt; Sync-policy, is not reflecting under bucket&#39;s replication (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68512&quot;&gt;pr#68512&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard:Adding MSR EC Profile via dashboard (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68349&quot;&gt;pr#68349&lt;/a&gt;, Devika Babrekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/smb: fix error handling for fundamental resource parsing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65861&quot;&gt;pr#65861&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/test_orchestrator: fixing daemon_action method signature (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69231&quot;&gt;pr#69231&lt;/a&gt;, Redouane Kachach)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: add config to load modules in main interpreter instead of subinterpreter (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67515&quot;&gt;pr#67515&lt;/a&gt;, Nitzan Mordhai, Nitzan Mordechai, Samuel Just)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: ensure that all modules have started before advertising active mgr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67850&quot;&gt;pr#67850&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: fix continous smb MgrDBNotReady (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68598&quot;&gt;pr#68598&lt;/a&gt;, Pedro Gonzalez Gomez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: fix PyObject* refcounting in TTLCache and cleanup logic (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66482&quot;&gt;pr#66482&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: guard close_section calls in get_perf_schema_python (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69436&quot;&gt;pr#69436&lt;/a&gt;, Lumir Sliva)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: isolated CherryPy to prevent global state sharing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67465&quot;&gt;pr#67465&lt;/a&gt;, Nizamudeen A, Anmol Babu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon [stretch-mode]: Allow a max bucket weight diff threshold (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67790&quot;&gt;pr#67790&lt;/a&gt;, Kamoltat Sirivadhna, Kamoltat (Junior) Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/AuthMonitor: add osd w cap for superuser client (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68314&quot;&gt;pr#68314&lt;/a&gt;, Venky Shankar, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: Fix application overview to show Raw used (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68794&quot;&gt;pr#68794&lt;/a&gt;, Ankush Behl)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mr/dashboard: remove rgw_servers filter from radosgw-sync-overview grafana dashboard (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68604&quot;&gt;pr#68604&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;neorados: Fix Neorados CephContext leak (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67513&quot;&gt;pr#67513&lt;/a&gt;, Adam C. Emerson)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;neorados: specify alignments for aligned_storage (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67512&quot;&gt;pr#67512&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;neorados: Various Fixes to Watch/Notify (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68776&quot;&gt;pr#68776&lt;/a&gt;, Adam C. Emerson, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;node-proxy: major refactor and various fixes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67418&quot;&gt;pr#67418&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nvmeof: Change the NVMEOF image version to 1&lt;span&gt;&lt;/span&gt;.6 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68415&quot;&gt;pr#68415&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nvmeofgw: fix issue of delete all gws from the pool/group (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67942&quot;&gt;pr#67942&lt;/a&gt;, Leonid Chernin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;orch/cephadm: fix osd&lt;span&gt;&lt;/span&gt;.default creation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68121&quot;&gt;pr#68121&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: track compression&#92;_*blob_size* parameters for online update (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67888&quot;&gt;pr#67888&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore:fix bluestore_volume_selection_reserved_factor usage (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66837&quot;&gt;pr#66837&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: support an operator-abort command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67031&quot;&gt;pr#67031&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: add pg-upmap-primary to clean_pg_upmaps (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67407&quot;&gt;pr#67407&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Allow multiple objects with same version in missing list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69450&quot;&gt;pr#69450&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Avoid assertion on empty object read when reading multiple objects (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68714&quot;&gt;pr#68714&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Avoid pwlc spanning intervals (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68708&quot;&gt;pr#68708&lt;/a&gt;, Bill Scales)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Change rmissing map key from version_t to eversion_t (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68716&quot;&gt;pr#68716&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Deleting PG should discard pwlc (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68709&quot;&gt;pr#68709&lt;/a&gt;, Bill Scales)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: FastEC: always update pwlc epoch when activating (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68710&quot;&gt;pr#68710&lt;/a&gt;, Bill Scales)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Fix bug when calculating min_peer_features (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69159&quot;&gt;pr#69159&lt;/a&gt;, Bill Scales)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Fix incorrect rollback logic for partial write OI (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68715&quot;&gt;pr#68715&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: PGLog Attach correct version to missing list when ignoring log entries (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68718&quot;&gt;pr#68718&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Twiddle should create a full sized vector for optimized EC (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68717&quot;&gt;pr#68717&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr: call new _ceph_exit for killpoints (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68518&quot;&gt;pr#68518&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr: update modules to use independent CLICommand subtypes with distinct COMMAND attributes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67511&quot;&gt;pr#67511&lt;/a&gt;, Kefu Chai, Samuel Just)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephadm: derive container image from cephadm release (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68328&quot;&gt;pr#68328&lt;/a&gt;, Lumir Sliva)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: lua to respect missing kernel in yaml (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67293&quot;&gt;pr#67293&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: treat &amp;quot;implicit declaration of function&amp;quot; for blogbench workunit for newer gcc version (&lt;a href=&quot;http://tracker.ceph.com/issues/75380&quot;&gt;issue#75380&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/68820&quot;&gt;pr#68820&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/distros: add rocky 10&lt;span&gt;&lt;/span&gt;.0 as supported distro/container host (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68569&quot;&gt;pr#68569&lt;/a&gt;, Patrick Donnelly, Casey Bodley, Adam King, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/radosgw_admin: replace boto2 with boto3 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68739&quot;&gt;pr#68739&lt;/a&gt;, Adam C. Emerson, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw/multisite: remove duplicate test_suspended_delete_marker_incremental_sync (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68846&quot;&gt;pr#68846&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw/upgrade: symlinks are explicit about distro versions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68057&quot;&gt;pr#68057&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: Revive crypt kmip (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68371&quot;&gt;pr#68371&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/fs: fix extraneous distro links (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69251&quot;&gt;pr#69251&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/upgrade: ignore osd in unknown state (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69307&quot;&gt;pr#69307&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/upgrade: ignore undersized PG during stress splits (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69310&quot;&gt;pr#69310&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/upgrade: update upgrade paths and exclude rocky10 from non-supported distros (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68660&quot;&gt;pr#68660&lt;/a&gt;, Yaarit Hatuka, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites: remove centos restriction from valgrind yaml (&lt;a href=&quot;http://tracker.ceph.com/issues/18126&quot;&gt;issue#18126&lt;/a&gt;, &lt;a href=&quot;http://tracker.ceph.com/issues/20360&quot;&gt;issue#20360&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/67519&quot;&gt;pr#67519&lt;/a&gt;, Samuel Just)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites: use tagged version of reef (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68357&quot;&gt;pr#68357&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/backfill_toofull&lt;span&gt;&lt;/span&gt;.py: Fix assert failures with &amp;amp; without compression (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68118&quot;&gt;pr#68118&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/keystone: upgrade keystone to 2025&lt;span&gt;&lt;/span&gt;.2 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67757&quot;&gt;pr#67757&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/quiescer: remove racy assertion (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68510&quot;&gt;pr#68510&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks: capture CommandCrashedError when running nvme list cmd (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69232&quot;&gt;pr#69232&lt;/a&gt;, Redouane Kachach)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks: make rbd_mirror_thrash inherit from ThrasherGreenlet (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67795&quot;&gt;pr#67795&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks: update egrep to &#39;grep -E&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67518&quot;&gt;pr#67518&lt;/a&gt;, Nitzan Mordechai, Samuel Just)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/ceph-helpers-root: Add Rocky support for install packages (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67507&quot;&gt;pr#67507&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rbd: drop racy assert in test_tasks_recovery() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68190&quot;&gt;pr#68190&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits: Add updated kernel archive URL (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68169&quot;&gt;pr#68169&lt;/a&gt;, Brad Hubbard)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: add &#39;refresh&#39; config to cephadm&lt;span&gt;&lt;/span&gt;.wait_for_service (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67038&quot;&gt;pr#67038&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: add MDS_INSUFFICIENT_STANDBY to ignorelist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69036&quot;&gt;pr#69036&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Add nvmeof upgrade from v20&lt;span&gt;&lt;/span&gt;.2&lt;span&gt;&lt;/span&gt;.0 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68149&quot;&gt;pr#68149&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: allow multiple mgr sessions during eviction test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68316&quot;&gt;pr#68316&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: cephfs suite changes for rocky (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68374&quot;&gt;pr#68374&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Fix coredumps caused by udisks (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67526&quot;&gt;pr#67526&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Fix nvmeof &#39;errors during thrashing&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68148&quot;&gt;pr#68148&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: fix setting rbd_sparse_read_threshold_bytes in test_migration_clone() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68617&quot;&gt;pr#68617&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: fix TypeError in delay (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67617&quot;&gt;pr#67617&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: fixing cephadm mgmt-gateway test to remove openssl dependency (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67820&quot;&gt;pr#67820&lt;/a&gt;, Redouane Kachach)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore cephadm failed daemon warnings during thrashing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69309&quot;&gt;pr#69309&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore POOL_FULL for rbd tests exercising full pools (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69304&quot;&gt;pr#69304&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: install nvme-cli only if distro remains rocky10 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/69252&quot;&gt;pr#69252&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: krbd_rxbounce&lt;span&gt;&lt;/span&gt;.sh: do more reads to generate more errors (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67455&quot;&gt;pr#67455&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Leak_StillReachable RocksDB error_handler (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68524&quot;&gt;pr#68524&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: rbd_mirror_fsx_compare&lt;span&gt;&lt;/span&gt;.sh doesn&#39;t error out as expected (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67797&quot;&gt;pr#67797&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Remove cephadm e2e tests from teuthology (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68818&quot;&gt;pr#68818&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: resolve py3&lt;span&gt;&lt;/span&gt;.12 regression for random&lt;span&gt;&lt;/span&gt;.sample (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68315&quot;&gt;pr#68315&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: suppress false positive delete map mismatch errors (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68431&quot;&gt;pr#68431&lt;/a&gt;, Casey Bodley, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: suppress MismatchedFree operator delete RocksDB (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67508&quot;&gt;pr#67508&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/beast: use strand executor for timeout timer to prevent concurrent socket access (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68506&quot;&gt;pr#68506&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/lc: Do not delete DM if its at end of pagination list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67573&quot;&gt;pr#67573&lt;/a&gt;, kchheda3)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/multisite: check the local bucket&#39;s versioning status when replicating deletion from remote (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66168&quot;&gt;pr#66168&lt;/a&gt;, Jane Zhu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW/multisite: fix bucket-full-sync infinite loop caused by stale bucket_list_result reuse (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67923&quot;&gt;pr#67923&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW/Multisite: fix uninitialized LatencyMonitor causing spurious &amp;quot;OSD cluster is overloaded&amp;quot; warning (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68803&quot;&gt;pr#68803&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/s3: Always include x-amz-content-sha256 header in AWS v4 signatures (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66358&quot;&gt;pr#66358&lt;/a&gt;, Shilpa Jagannath, Matthew N. Heler)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/tests: add os-specific java 1&lt;span&gt;&lt;/span&gt;.7 install commands to keycloak task (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67982&quot;&gt;pr#67982&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/website: preserve nameservers for future use in dnsmasq (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67061&quot;&gt;pr#67061&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/zone: remove duplicated startup logic in RGWSI_Zone (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66300&quot;&gt;pr#66300&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: bucket logging fixes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66769&quot;&gt;pr#66769&lt;/a&gt;, Nithya Balachandran, N Balachandran, Yuval Lifshitz, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW: Change prerequest hook to run after authorization process (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68594&quot;&gt;pr#68594&lt;/a&gt;, Emin Sunacoglu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: discard olh&#92;_ attributes when copying object from a versioning-suspended bucket to a versioning-disabled bucket (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65557&quot;&gt;pr#65557&lt;/a&gt;, Jane Zhu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix &#39;bucket stats&#39; when bucket index doesn&#39;t exist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68505&quot;&gt;pr#68505&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix lifecycle transition of encrypted multipart objects (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68826&quot;&gt;pr#68826&lt;/a&gt;, Marcus Watts)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: handle plain-text object tags in RGWObjTags::decode() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67927&quot;&gt;pr#67927&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: java s3-tests change setting of JAVA_HOME (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68226&quot;&gt;pr#68226&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: read_obj_policy() consults s3:prefix when deciding between 403/404 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68651&quot;&gt;pr#68651&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW: remove custom copy constructor for RGWObjectCtx and enforce no copy/move (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67440&quot;&gt;pr#67440&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/ceph-volume: fast device unavailable as error (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67916&quot;&gt;pr#67916&lt;/a&gt;, Timothy Q Nguyen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rgw/kafka: fix kafka relase to more recent one (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67993&quot;&gt;pr#67993&lt;/a&gt;, Yuval Lifshitz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rgw/lua: ignore hours for zero mtime (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67468&quot;&gt;pr#67468&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rgw/notification: do not use netstat in the code (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68142&quot;&gt;pr#68142&lt;/a&gt;, Yuval Lifshitz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rgw/notification: fix the cloudevents package version (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68704&quot;&gt;pr#68704&lt;/a&gt;, Yuval Lifshitz, Adam C. Emerson)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rgw: remove depracated boto dependency (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68344&quot;&gt;pr#68344&lt;/a&gt;, Yuval Lifshitz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test: use json_extract instead of awkward json_tree (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67321&quot;&gt;pr#67321&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This change introduces the shared memory communication (SMC-D) for the cluster network (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68254&quot;&gt;pr#68254&lt;/a&gt;, Aliaksei Makarau)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tools/ceph-kvstore-tool: fix crash on db close (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68406&quot;&gt;pr#68406&lt;/a&gt;, Igor Fedotov, Max Kellermann)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;upgrade suites update for Rocky10 and missing centos (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68733&quot;&gt;pr#68733&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ceph Days Seattle 2026 - Cloud Transition to Tape</title>
    <link href="https://ceph.io/en/news/blog/2026/cd-seattle-cloud-blog/" />
    <updated>2026-06-15T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/cd-seattle-cloud-blog/</id>
    <author>
      <name>John Shubeck</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="object storage" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/cd-seattle-cloud-blog/">&lt;p&gt;I&#39;m John Shubeck, an information technology professional with over 44 years of industry experience spanning
both the customer and technology provider experience. I&#39;m currently serving as a Senior Storage Technical
Specialist for IBM Object Storage platforms across all market segments in the Americas.&lt;/p&gt;
&lt;p&gt;On Thursday, May 28th, 30 members, myself included, of the Ceph faithful descended on the SURF business
incubator in downtown Seattle for &amp;quot;Ceph Days Seattle 2026&amp;quot;. Following the traditional Ceph Days agenda,
the Seattle program consisted of a series of &amp;quot;Ceph Talks&amp;quot; designed to introduce new ideas and share
lessons learned.&lt;/p&gt;
&lt;p&gt;Ceph Days are community-driven events designed to bring together Ceph users, developers, architects,
administrators, and anyone interested in open-source storage. Held throughout the year in locations around
the world, these one-day gatherings offer a unique opportunity to learn from real-world deployments, explore
new technologies, connect with peers, and contribute to discussions that help shape the future of Ceph.&lt;/p&gt;
&lt;h2 id=&quot;did-you-know%3F&quot;&gt;Did you know? &lt;a class=&quot;link-anchor&quot; href=&quot;#did-you-know%3F&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ceph is a software-defined, hardware-independent storage solution that provides block, file, and object storage on a single unified platform.&lt;/li&gt;
&lt;li&gt;Ceph is championed by developers, administrators, users, IT leaders, and Fortune 500 enterprise customers. It is a living, vibrant, and active group that has adopted Ceph in its IT operations.&lt;/li&gt;
&lt;li&gt;The Ceph project and community are supported by a Foundation (&lt;a href=&quot;https://ceph.io/en/foundation/&quot;&gt;https://ceph.io/en/foundation/&lt;/a&gt;) comprising organizations, stakeholders, and industry leaders who collaborate to coordinate investment, development, and community activities for Ceph.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the setting, plot, and characters stated above, we turn to today&#39;s topic. A key activity of the Ceph
community is a series of &amp;quot;Ceph Days&amp;quot; conferences. A Ceph Day is a full-day meetup where participants learn,
network, make new acquaintances, and share ideas on how to enhance the value of Ceph. Sometimes IBM participates
by providing the venue, a guest speaker or two, or the all-important refreshments. At the same time, make no
mistake, Ceph Days are organized by the Ceph community, for the community, to support the community.&lt;/p&gt;
&lt;p&gt;Here is where I came in. For the first time, I had the honor of being selected to present one of my favorite topics,
Ceph Cloud Transitions. And to raise the stakes even further, Ceph Cloud Transition to S3-enabled TAPE! During my 45
minutes on stage, I covered the theory of cloud transitioners and showed a LIVE demonstration of a Ceph cloud transition
to IBM Deep Archive. In this demonstration, I proved that static, unused, and potentially outdated object storage content
can be tiered off to tape. In the end, the demonstration posed a radical concept: an object store without artificial
boundaries and virtually limitless!&lt;/p&gt;
&lt;p&gt;If you would like to see a 10-minute lightning round video of the demonstration, click here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=SVQwkjFF.uWU&quot;&gt;https://www.youtube.com/watch?v=SVQwkjFF.uWU&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I look forward to the Ceph Days Seattle 2026 presentations and other Ceph Talk videos in the near future, which will be posted to:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/@Cephstorage&quot;&gt;https://www.youtube.com/@Cephstorage&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Feel free to connect with me on LinkedIn:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://linkedin.com/jshubeck&quot;&gt;https://linkedin.com/jshubeck&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and on YouTube:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://youtube.com/@johnshubeck2026&quot;&gt;https://youtube.com/@johnshubeck2026&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved &lt;a class=&quot;link-anchor&quot; href=&quot;#get-involved&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If my experience sounds like something you&#39;d like to try, I encourage you to attend a Ceph Day, join a community meeting, or
share your own experiences through a Ceph Tech Talk. The Ceph community welcomes users, developers, and storage enthusiasts
of all experience levels. To learn about upcoming events, meetups, and ways to get involved, visit the Ceph Community page
at &lt;a href=&quot;https://ceph.io/community&quot;&gt;https://ceph.io/community&lt;/a&gt;. I hope to see you at a future Ceph Days event.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>For whom the door-bell tolls</title>
    <link href="https://ceph.io/en/news/blog/2026/for-whom-the-door-bell-tolls/" />
    <updated>2026-06-11T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/for-whom-the-door-bell-tolls/</id>
    <author>
      <name>Kyle Bader</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="rados-nkv" />
      <category term="ai" />
      <category term="gpu-initated" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/for-whom-the-door-bell-tolls/">&lt;h1&gt;For whom the door-bell tolls&lt;/h1&gt;
&lt;p&gt;In a &lt;a href=&quot;https://ceph.io/en/news/blog/2025/vllm-kv-caching/&quot;&gt;previous post&lt;/a&gt; we extolled the benefits of KV caching, a technique to save the KV states from the prefill step of LLM-based inference to reduce time to first token (TTFT) and skip redundant computation. I co-presented this with Tushar Gohad at &lt;a href=&quot;https://youtu.be/axCO66f7fYA?si=VRWDSmk95nkRCdc3&quot;&gt;Cephalocon&lt;/a&gt;. Since then I&#39;ve been thinking a lot about how to improve the state of the art. Really move the needle. We&#39;ve made strides in a lot of areas in Ceph, especially the work going into &lt;a href=&quot;https://youtu.be/ll_T7Wphz7A?si=U_myBa2uPT5j3_C3&quot;&gt;Fast EC&lt;/a&gt; — if you don&#39;t know what I&#39;m talking about you should check it out, it promises huge benefits to a large category of workloads. That&#39;s not what we&#39;re here for today, though.&lt;/p&gt;
&lt;p&gt;Last year there was one paper that stuck in my mind, which is fairly remarkable because I read on the order of 130. That paper was &lt;a href=&quot;https://arxiv.org/pdf/2203.04910&quot;&gt;GPU-Initiated On-Demand High-Throughput Storage Access in the BaM System Architecture&lt;/a&gt;. I struggled with this. It describes a system where a CPU loads a kernel into the GPU that allows the GPU to serve as an NVMe initiator. The struggle was rooted in the fact that block just felt like the wrong interface for KV caching. If you use block, then you need a lookup table that maps the hash of the sequences representing a cache block to a particular &lt;code&gt;(device, offset, length)&lt;/code&gt; tuple. It begs for a content-addressable approach with no centralized lookup or coordination. On the other hand, what was described in the paper was just flat-out more electrically efficient. I couldn&#39;t have my cake and eat it too.&lt;/p&gt;
&lt;h2 id=&quot;the-idea%3A-rados%2C-spoken-as-nvme-key-value&quot;&gt;The idea: RADOS, spoken as NVMe key-value &lt;a class=&quot;link-anchor&quot; href=&quot;#the-idea%3A-rados%2C-spoken-as-nvme-key-value&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In 2025 we also saw the first ratified version of the &lt;a href=&quot;https://nvmexpress.org/specification/key-value-command-set-specification/&quot;&gt;NVMe key-value command set specification&lt;/a&gt;. We already have a Ceph implementation of NVMe/TCP that leverages SPDK, and it seemed like we could add support fairly easily for the key-value command set.&lt;/p&gt;
&lt;p&gt;For those who don&#39;t know the internal mechanics of Ceph, the native API operates against RADOS objects. RADOS is richer than most object stores: it supports reads and writes to arbitrary offsets, deletes, key-value storage (OMAP), watch/notify notifications, and a class system to execute code against objects (&lt;code&gt;cls&lt;/code&gt;). How could we find an intersection between the full power of RADOS and GPU-initiated storage?&lt;/p&gt;
&lt;p&gt;What I came up with is exposing RADOS via NVMe key-value commands:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;NVMe-oF concept&lt;/th&gt;
&lt;th&gt;RADOS concept&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subsystem&lt;/td&gt;
&lt;td&gt;Pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespace&lt;/td&gt;
&lt;td&gt;Namespace (in pool)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key (1–16 bytes)&lt;/td&gt;
&lt;td&gt;Object name (oid)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;Object data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The other fun idea — hold onto this one, it comes back — was a vendor-specific command extension to allow the execution of classes against objects. The classic example is thumbnailing an image, but it could be something more interesting, like extracting an embedding. Computational-storage stuff, executed where the data is at rest instead of dragging it across the network to be executed on some other host. We probably don&#39;t want random applications running any class against any object, though, so let&#39;s have an out-of-band gRPC server that provides a control interface to allowlist particular classes to specific namespaces, and map those allowed classes to opcodes.&lt;/p&gt;
&lt;h2 id=&quot;building-rados-nkv-(overnight%2C-by-agents)&quot;&gt;Building rados-nkv (overnight, by agents) &lt;a class=&quot;link-anchor&quot; href=&quot;#building-rados-nkv-(overnight%2C-by-agents)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It was the afternoon of June 4. I had the start of a plan and the NVMe key-value specification, and it was time to &lt;code&gt;/grill-me-with-docs&lt;/code&gt;. After some Q&amp;amp;A with my agentic pals, I decomposed the work into a task DAG, with an adversarial review task paired to each coding task — sub-agents with bounded contexts, arguing with other sub-agents for better quality, a coordinator agent running the merge queue and dispatching work as it unblocked. I set the whole thing on a loop, then went to walk the dog and peek in on the agentic factory from my phone. There&#39;s a pleasing recursion here: I was building infrastructure for AI workloads &lt;em&gt;using&lt;/em&gt; AI workloads.&lt;/p&gt;
&lt;p&gt;The first agent made a surprising find: NVIDIA had recently &lt;a href=&quot;https://github.com/spdk/spdk/commit/93cf1ebc57cea99caba6c68f30354f93dce90ffd&quot;&gt;added an NVMe KV client to SPDK&lt;/a&gt;. That undoubtedly made things easier — we had a reference client to work against. I was tapped out, time for me to sleep, while the factory whirs.&lt;/p&gt;
&lt;p&gt;The next morning I grabbed my coffee and checked in to see what sort of breakfast had been prepared. I have to say, the dish was perfectly plated, and the flavor was like a breakfast burrito from a San Diego taqueria. On this day &lt;a href=&quot;https://review.spdk.io/c/spdk/spdk/+/28851&quot;&gt;&lt;strong&gt;rados-nkv&lt;/strong&gt;&lt;/a&gt; was born — a complete SPDK controller exporting a RADOS-backed NVMe key-value namespace over &lt;a href=&quot;https://github.com/nutanix/libvfio-user&quot;&gt;vfio-user&lt;/a&gt;. Tested end-to-end. Logically, it looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/rados-nkv-loopback.svg&quot; alt=&quot;The rados-nkv control path: a KV host app issues Store/Retrieve/Delete/Exist over a vfio-user loopback to SPDK&#39;s nvmf_tgt; the NVMf KV target decodes the key and applies read-only/Exec gates; the rados-nkv kvdev maps key → object via async librados; RADOS stores one object per KV pair, with pool=subsystem and namespace=tenant.&quot;&gt;
&lt;em&gt;The KV control path, proven over a vfio-user loopback — no VM, no network. Key → object, one RADOS object per KV pair, tenancy carried by the RADOS namespace.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&#39;ll need some things to talk to this newfangled key-value namespace, of course. The first order of business is a &lt;a href=&quot;https://github.com/ai-dynamo/nixl/pull/1717&quot;&gt;rados-nkv NIXL plugin&lt;/a&gt;, since NIXL is used by both &lt;a href=&quot;https://github.com/llm-d/llm-d-kv-cache&quot;&gt;llm-d-kv-cache&lt;/a&gt; and &lt;a href=&quot;https://github.com/lmcache/lmcache&quot;&gt;LMCache&lt;/a&gt; to offload KV-cache blocks from vLLM over the kv-connector interface. For bonus points, we&#39;ll whip up &lt;a href=&quot;https://github.com/mmgaggle/rados-nkv-weights&quot;&gt;rados-nkv-weights&lt;/a&gt; to let vLLM stream model weights from rados-nkv.&lt;/p&gt;
&lt;h2 id=&quot;a-flashback-to-bam&quot;&gt;A flashback to BaM &lt;a class=&quot;link-anchor&quot; href=&quot;#a-flashback-to-bam&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Around this time a colleague asked me if I was going to SNIA&#39;s SDC, which triggered me to scan the sessions on the docket. Serendipitously, I saw &lt;a href=&quot;https://www.linkedin.com/in/stephen-bates-8791263/&quot;&gt;Stephen Bates&lt;/a&gt;&#39;s abstract: &lt;strong&gt;GPU-Initiated NVMe: Cutting the CPU Out of the Accelerator-to-Storage Data Path.&lt;/strong&gt; This gave me an immediate flashback to the BaM paper. The rados-nkv prototype was working, and as-is it would be a big improvement for AI workloads — but what if we could realize &lt;em&gt;GPU-initiated&lt;/em&gt; IO to it? DMA-buf changes are &lt;a href=&quot;https://lists.freedesktop.org/archives/dri-devel/2025-October/529924.html&quot;&gt;landing in the Linux kernel&lt;/a&gt; that might just open up a viable path.&lt;/p&gt;
&lt;p&gt;I pinged Stephen on LinkedIn, who indicated that ROCm XIO was the droid I was looking for.&lt;/p&gt;
&lt;p&gt;Up to this point my mad science had been conducted from the meek confines of a cloud VM. I&#39;d need a physical machine with a real AMD GPU.&lt;/p&gt;
&lt;h2 id=&quot;a-monetary-value-on-cached-tokens&quot;&gt;A monetary value on cached tokens &lt;a class=&quot;link-anchor&quot; href=&quot;#a-monetary-value-on-cached-tokens&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;d been eyeballing Strix Halo Mini PCs as a development machine for x86 builds of Ceph, that would also let me experiment with vLLM. This dovetails into another idea I&#39;d been spitballing with the llm-d folks: adding &lt;a href=&quot;https://github.com/mmgaggle/vllm/tree/feat/prompt-cache-params&quot;&gt;explicit caching to the serving API&lt;/a&gt; and wiring it into the &lt;a href=&quot;https://docs.vllm.ai/en/stable/api/vllm/distributed/kv_transfer/kv_connector/&quot;&gt;kv-connector&lt;/a&gt;. The idea is simple — everyone gets automatic prefix caching, and agentic harnesses can &lt;em&gt;explicitly&lt;/em&gt; request caching of prefixes associated with system prompts and other repeated context, with an optional TTL.&lt;/p&gt;
&lt;p&gt;Doing so provides a mechanism to associate a monetary value with cached token-hours, whether for internal chargeback or as an additional service offering for model- or token-as-a-service providers. You need controls like this — or some sort of tenant-partitioned cache — to stop enterprising engineers and their agents from setting up a &lt;code&gt;/loop&lt;/code&gt; that keeps their prefixes hot and pushes out the contexts of less Machiavellian engineers. If that&#39;s not a good enough reason for you, maybe the fact that &lt;a href=&quot;https://ai.google.dev/gemini-api/docs/pricing#gemini-3.5-flash&quot;&gt;Google&lt;/a&gt; and &lt;a href=&quot;https://platform.claude.com/docs/en/about-claude/pricing#model-pricing&quot;&gt;Anthropic&lt;/a&gt; do it is.&lt;/p&gt;
&lt;p&gt;Anyway, I started to wonder: could I pass the iGPU from a Strix Halo box into a QEMU guest? I stumbled on a &lt;a href=&quot;https://github.com/Uhh-IDontKnow/Proxmox_AMD_AI_Max_395_Radeon_8060s_GPU_Passthrough/&quot;&gt;guide by a Proxmox user&lt;/a&gt; that suggested it just might work. I cajoled my wife into authorizing a trip to Microcenter to pick up a Strix Halo Mini PC.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/strix-halo-box.jpg&quot; alt=&quot;The MINISFORUM MS-S1 MAX AI box — AMD Ryzen AI, up to 128 GB LPDDR5X.&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;setup%2C-and-a-deliberately-boring-first-target&quot;&gt;Setup, and a deliberately boring first target &lt;a class=&quot;link-anchor&quot; href=&quot;#setup%2C-and-a-deliberately-boring-first-target&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Had to rummage around for a USB stick to boot from, only to find two paltry 512 MB ones. I resorted to cannibalizing my GoPro&#39;s microSD card. Fedora 44 was the weapon of choice, since I needed a kernel with all the recent dma-buf goodies. Imaged. After a brief side quest benchmarking Kimi-Linear-48B-A3B-Instruct with a Q6_K quant using llama.cpp — and pointing Claude Code at the Anthropic-compatible messages API for funsies — it was time to get back to business.&lt;/p&gt;
&lt;p&gt;First up: take a rados-nkv device and pass it to a guest via vfio-user. Working. Next: pass the iGPU into the guest. There are several tricks. The main one is that the host cannot touch any of the associated PCIe devices, so you blacklist the kernel modules that interact with the iGPU. You also extract the AMD driver and vBIOS ROM files to pass as PCIe devices to the guest. I set up a &amp;quot;no GPU&amp;quot; boot option as a fallback, because the moment the kernel loads with no video driver, you&#39;ve got a headless node. Rebooted the host, connected remotely, and configured GPU passthrough with vfio-pci. I now had a guest with both a rados-nkv namespace and an 8060S GPU.&lt;/p&gt;
&lt;p&gt;As much as I wanted to go straight for the prize — GPU-initiated IO to a &lt;em&gt;key-value&lt;/em&gt; namespace — it was wiser to start boring: pass a conventional NVMe &lt;strong&gt;block&lt;/strong&gt; namespace backed by RBD. GPU-initiated IO to a block namespace is already a known quantity, so it makes the perfect dress rehearsal: if it breaks, the bug is in my plumbing, not in anything novel.&lt;/p&gt;
&lt;h2 id=&quot;how-rocm-xio-drives-a-queue-pair&quot;&gt;How ROCm XIO drives a queue pair &lt;a class=&quot;link-anchor&quot; href=&quot;#how-rocm-xio-drives-a-queue-pair&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ROCm/rocm-xio&quot;&gt;ROCm XIO&lt;/a&gt; is the piece that lets GPU code drive an NVMe queue pair. Its &lt;code&gt;nvme-ep&lt;/code&gt; (&amp;quot;endpoint&amp;quot;) runs a &lt;code&gt;__device__&lt;/code&gt; kernel that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Writes an NVMe Submission Queue Entry (SQE) — a 64-byte command — into the SQ.&lt;/li&gt;
&lt;li&gt;Rings the SQ-tail doorbell to tell the controller &amp;quot;go.&amp;quot;&lt;/li&gt;
&lt;li&gt;Spins on the Completion Queue, watching the phase bit flip.&lt;/li&gt;
&lt;li&gt;Rings the CQ-head doorbell to acknowledge the completion.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A companion kernel module (&lt;code&gt;/dev/rocm-xio&lt;/code&gt;) handles the privileged glue: pinning queue memory, intercepting the kernel NVMe driver&#39;s admin commands to inject the right physical addresses, and exporting GPU VRAM buffers for peer-to-peer DMA. Long term the upstream NVMe Linux driver might be updated to accommodate userspace requests for IO queues, sparing this interception dance — but that&#39;s a discussion for another day. Crucially, the queues, doorbells, and data buffers can each live in host RAM or GPU VRAM, selected by a 4-bit &lt;code&gt;--memory-mode&lt;/code&gt; mask:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;bit&lt;/th&gt;
&lt;th&gt;&lt;code&gt;0x1&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;0x2&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;0x4&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;0x8&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;structure&lt;/td&gt;
&lt;td&gt;SQ&lt;/td&gt;
&lt;td&gt;CQ&lt;/td&gt;
&lt;td&gt;doorbell&lt;/td&gt;
&lt;td&gt;data buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Mode &lt;code&gt;0x0&lt;/code&gt; = everything in host RAM. Mode &lt;code&gt;0x8&lt;/code&gt; = flip just the data buffer into VRAM, so the payload P2P-DMAs straight into GPU memory. Mode &lt;code&gt;0x8&lt;/code&gt; is the whole point; mode &lt;code&gt;0x0&lt;/code&gt; is the &amp;quot;make it work first&amp;quot; baseline.&lt;/p&gt;
&lt;p&gt;On the host, SPDK&#39;s &lt;code&gt;nvmf_tgt&lt;/code&gt; presents an emulated NVMe controller over the vfio-user protocol: a Unix socket that speaks the VFIO device model. QEMU connects with a &lt;code&gt;vfio-user-pci&lt;/code&gt; device, and the guest sees a perfectly ordinary &lt;code&gt;/dev/nvme0&lt;/code&gt;. The clever bit — which becomes central later — is that SPDK advertises the NVMe doorbell registers (BAR0 offset &lt;code&gt;0x1000&lt;/code&gt;+) as a sparse-mmap&#39;d shared page by default. The client mmaps it; doorbell writes land in shared memory; SPDK&#39;s poll loop reads the new tail value. No socket round-trip per doorbell.&lt;/p&gt;
&lt;h2 id=&quot;the-spell-fizzles&quot;&gt;The spell fizzles &lt;a class=&quot;link-anchor&quot; href=&quot;#the-spell-fizzles&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Excitement builds. It&#39;s time to summon GPU-initiated IO. The spell is cast. Fizzle.&lt;/p&gt;
&lt;p&gt;Turns out the GPU and the QEMU-emulated doorbell live in alternate dimensions: the GPU needs to peer-write to a &lt;em&gt;physical&lt;/em&gt; BAR, and our NVMe device is stranded in the world of software-defined wonder. I needed a portal — a bridge between these two dimensions. A light bulb went off in my head. Or a doorbell rang. Something of the sort.&lt;/p&gt;
&lt;p&gt;There was another SDC session Stephen had on the agenda:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This talk presents a different approach: a standalone userspace server that emulates a complete PCIe RDMA NIC via the VFIO-user protocol. Built on Nutanix&#39;s open-source libvfio-user library, the server exposes PCI BARs to an unmodified QEMU/KVM guest, which loads a companion kernel driver and a custom rdma-core provider. Applications in the guest see a standard InfiniBand device and use ordinary libibverbs calls — &lt;code&gt;ibv_post_send&lt;/code&gt;, &lt;code&gt;ibv_poll_cq&lt;/code&gt;, perftest, iperf3 — with no guest-side awareness that the device is emulated.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After some sleuthing, a &lt;a href=&quot;https://github.com/sbates130272/qemu&quot;&gt;QEMU branch Stephen had created&lt;/a&gt; was discovered, and in it was something wonderful: &lt;code&gt;pcie-mmio-bridge&lt;/code&gt; support. The power to bind physical hardware to the software-defined world was in my hand, and I was ready to abuse the heck out of it. Rolled it into a binary, and it was game time. The moment of truth. Fizzle.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NVMe CQ poll timeout after 10000000 polls (cq_head=0 expected_phase=1)
:0:rocdevice.cpp :3587: Queue aborting with error :
HSA_STATUS_ERROR_EXCEPTION code: 0x1016 rocm-xio ERROR: nvme-ep:
gpuKernel sync failed for queue 8 (719)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The GPU built its command, rang the doorbell, and then spun forever waiting for a completion that never came. The &lt;code&gt;0x1016&lt;/code&gt; GPU exception is a symptom: it&#39;s the &lt;code&gt;__builtin_trap()&lt;/code&gt; the kernel hits after the CQ-poll loop gives up. The real question is why no completion was ever posted.&lt;/p&gt;
&lt;p&gt;I had a half-dozen plausible theories: wrong memory mode, a doorbell-stride mismatch, &lt;code&gt;hipHostRegister&lt;/code&gt;-of-MMIO not routing GPU writes correctly on an integrated GPU, SPDK not being P2P-capable into VRAM, CQ-phase logic, the SMU being flaky. Most of them were wrong. All of them were expensive to test. Brutal, even.&lt;/p&gt;
&lt;p&gt;On this APU, the GPU&#39;s SMU (System Management Unit) is platform-owned. Passing the iGPU through and then having a guest fault on it leaves the SMU in a state the next guest cannot re-initialize:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;amdgpu: PSP create ring failed!
amdgpu: hw_init of IP block &amp;lt;psp&amp;gt; failed -22
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only a full host reboot clears it. And — the part that really hurts — even a &lt;em&gt;successful&lt;/em&gt; run dirties the SMU on guest teardown. So the budget was literally &lt;strong&gt;one GPU shot per host reboot.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-bug-hunt%3A-prove%2C-don&#39;t-try&quot;&gt;The bug hunt: prove, don&#39;t try &lt;a class=&quot;link-anchor&quot; href=&quot;#the-bug-hunt%3A-prove%2C-don&#39;t-try&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Guess-and-check was not an option. With a one-shot-per-reboot budget, the methodology had to change from &amp;quot;try things&amp;quot; to &amp;quot;&lt;em&gt;prove&lt;/em&gt; things.&amp;quot;&lt;/p&gt;
&lt;h3 id=&quot;step-1-%E2%80%94-trace-all-three-codebases-at-the-source-level&quot;&gt;Step 1 — Trace all three codebases at the source level &lt;a class=&quot;link-anchor&quot; href=&quot;#step-1-%E2%80%94-trace-all-three-codebases-at-the-source-level&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Before touching the GPU again, we read the actual code on all three sides of the completion path and confirmed it was correct &lt;em&gt;by construction&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QEMU bridge:&lt;/strong&gt; forwards via &lt;code&gt;address_space_write&lt;/code&gt; to &lt;code&gt;pci_get_bar_addr(target, bar) + offset&lt;/code&gt; — model-agnostic, reaches any BAR including a vfio-user one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SPDK &lt;code&gt;lib/nvmf/vfio_user.c&lt;/code&gt;:&lt;/strong&gt; doorbells at &lt;code&gt;0x1000&lt;/code&gt;+ are sparse-mmap&#39;d; the poller reads &lt;code&gt;*sq_dbl_tailp&lt;/code&gt; from that shared page every tick; &lt;code&gt;post_completion&lt;/code&gt; writes the CQE to guest memory and flips the phase bit with &lt;strong&gt;no interrupt required&lt;/strong&gt; (a polling client sees it). Offsets matched: SQ tail at &lt;code&gt;0x1000 + 2·qid·4&lt;/code&gt;, exactly what rocm-xio computes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conclusion: on paper, the entire path works. So the bug was dynamic, not structural.&lt;/p&gt;
&lt;h3 id=&quot;step-2-%E2%80%94-a-reboot-free%2C-gpu-free-isolation-test&quot;&gt;Step 2 — A reboot-free, GPU-free isolation test &lt;a class=&quot;link-anchor&quot; href=&quot;#step-2-%E2%80%94-a-reboot-free%2C-gpu-free-isolation-test&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here&#39;s the trick that broke the problem open. The GPU and the bridge↔SPDK plumbing are &lt;strong&gt;separable.&lt;/strong&gt; So we wrote a tiny CPU program (&lt;code&gt;cpu_bridge_probe&lt;/code&gt;) that maps the bridge&#39;s shadow ring and drives it &lt;em&gt;from the CPU&lt;/em&gt; — no GPU, no passthrough, no reboot. It issued the same ring commands the GPU would, and read NVMe controller registers back through the bridge:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[1] READ NVMe VS   (BAR0 0x08) -&amp;gt; COMPLETE value=0x20000 (NVMe 2.0)
[2] READ NVMe CAP  (BAR0 0x00) -&amp;gt; COMPLETE value=0x80000201e0100ff
[3] READ NVMe CSTS (BAR0 0x1c) -&amp;gt; COMPLETE value=0x1 (RDY=1)
[4] WRITE SQ doorbell (0x1008) -&amp;gt; COMPLETE
VERDICT: bridge&amp;lt;-&amp;gt;SPDK round-trip WORKS from CPU
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those &lt;code&gt;VS&lt;/code&gt;/&lt;code&gt;CAP&lt;/code&gt;/&lt;code&gt;CSTS&lt;/code&gt; reads come from SPDK&#39;s &lt;em&gt;non&lt;/em&gt;-mmap&#39;d register region, so they did a full vfio-user socket round-trip to the controller and back. &lt;strong&gt;The bridge, vfio-user-pci, and SPDK were proven flawless — from the CPU.&lt;/strong&gt; Which meant the bug was specifically in the &lt;em&gt;GPU&#39;s&lt;/em&gt; interaction with the shadow ring. We had cut the problem in half without spending a single GPU boot.&lt;/p&gt;
&lt;h3 id=&quot;step-3-%E2%80%94-instrument%2C-don&#39;t-guess&quot;&gt;Step 3 — Instrument, don&#39;t guess &lt;a class=&quot;link-anchor&quot; href=&quot;#step-3-%E2%80%94-instrument%2C-don&#39;t-guess&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The QEMU bridge already had trace events. We enabled &lt;code&gt;pci_mmio_bridge*&lt;/code&gt; tracing and took &lt;em&gt;one&lt;/em&gt; instrumented GPU shot. The trace was damning — and surprising:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;338 × pci_mmio_bridge_invalid_command command=0
  1 × pci_mmio_bridge_poll_processed   processed 338 commands
  0 × pci_mmio_bridge_write
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The bridge processed &lt;strong&gt;338 zeroed commands in a single poll&lt;/strong&gt; — and, critically, this happened &lt;strong&gt;even on a boot where amdgpu failed to initialize and the GPU kernel never ran.&lt;/strong&gt; That single observation exonerated the GPU entirely. The garbage wasn&#39;t coming from the GPU at all. Something else was writing a bogus &lt;code&gt;producer_idx&lt;/code&gt; over an all-zero command region.&lt;/p&gt;
&lt;h3 id=&quot;bug-%231-%E2%80%94-a-guest-physical-address-collision&quot;&gt;Bug #1 — a guest-physical address collision &lt;a class=&quot;link-anchor&quot; href=&quot;#bug-%231-%E2%80%94-a-guest-physical-address-collision&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The shadow ring lived at &lt;code&gt;shadow-gpa = 0x80000000&lt;/code&gt;. The guest console told the whole story:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pci_bus 0000:00: root bus resource [mem 0x80000000-0xdfffffff window]
pci 0000:00:01.0: [1234:1111] class 0x030000 BAR 0 [mem 0x80000000-0x80ffffff pref]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;0000:00:01.0&lt;/code&gt; is the QEMU &lt;strong&gt;standard VGA framebuffer&lt;/strong&gt; (the boot display). With 2 GB of guest RAM, the 32-bit PCI MMIO window &lt;em&gt;starts&lt;/em&gt; at &lt;code&gt;0x80000000&lt;/code&gt; — and the VGA&#39;s 16 MB framebuffer BAR landed &lt;strong&gt;exactly on top of the shadow ring.&lt;/strong&gt; The bridge was faithfully polling the VGA framebuffer and interpreting pixels as ring metadata. Every GPU doorbell write was also vanishing into the framebuffer. The GPU-free CPU test had worked only because &lt;em&gt;its&lt;/em&gt; device layout left &lt;code&gt;0x80000000&lt;/code&gt; clear.&lt;/p&gt;
&lt;p&gt;The fix: move &lt;code&gt;shadow-gpa&lt;/code&gt; out of the PCI window entirely, into the free gap above 4 GB:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;- shadow-gpa=0x80000000
+ shadow-gpa=0x100000000   # above 2GB RAM, above the 32-bit PCI window,
                           # below the 64-bit PCI window (0x380000000000)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We validated this &lt;strong&gt;reboot-free&lt;/strong&gt; with the CPU probe at the new address: clean ring (&lt;code&gt;producer=0&lt;/code&gt;, no garbage), all reads round-tripping. None of the GPU-coherence theories had been right. It was an address-space overlap.&lt;/p&gt;
&lt;h3 id=&quot;bug-%232-%E2%80%94-1024-%3E-256&quot;&gt;Bug #2 — 1024 &amp;gt; 256 &lt;a class=&quot;link-anchor&quot; href=&quot;#bug-%232-%E2%80%94-1024-%3E-256&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With the collision gone, the next GPU shot produced the first &lt;em&gt;clean&lt;/em&gt; doorbell:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pci_mmio_bridge_write BDF=0x0028 BAR=0 offset=0x1040 value=0x1 size=4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A real, valid SQ-tail doorbell for queue 8 (&lt;code&gt;0x1000 + 2·8·4 = 0x1040&lt;/code&gt;), forwarded perfectly to the NVMe BAR. The GPU→shadow→bridge→SPDK path was &lt;em&gt;working.&lt;/em&gt; But still no completion — and now SPDK&#39;s log said exactly why:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;handle_create_io_q: *ERROR*: invalid I/O queue size 1024
handle_create_io_q: *ERROR*: invalid I/O queue size 1024
handle_del_io_q:    *ERROR*: I/O sqid:8 does not exist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Recall &lt;code&gt;CAP = 0x80000201e0100ff&lt;/code&gt; from the CPU probe. The low 16 bits — &lt;strong&gt;MQES, Maximum Queue Entries Supported&lt;/strong&gt; — are &lt;code&gt;0x00ff = 255&lt;/code&gt;, i.e. a max queue size of 256. But &lt;code&gt;rocm-xio&lt;/code&gt; hard-codes &lt;strong&gt;1024-entry&lt;/strong&gt; queues. SPDK rejected both &lt;code&gt;CREATE_IO_CQ&lt;/code&gt; and &lt;code&gt;CREATE_IO_SQ&lt;/code&gt;, so &lt;strong&gt;queue 8 never existed&lt;/strong&gt; — and the GPU&#39;s perfectly-delivered doorbell rang for a queue that wasn&#39;t there.&lt;/p&gt;
&lt;p&gt;The fix (SPDK-side, no GPU rebuild): raise the controller&#39;s advertised queue depth.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvmf_create_transport -t VFIOUSER -q 1024 -m 16
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Again validated &lt;strong&gt;reboot-free&lt;/strong&gt; with the CPU probe — &lt;code&gt;CAP&lt;/code&gt; went &lt;code&gt;...0100ff&lt;/code&gt; → &lt;code&gt;...0103ff&lt;/code&gt;, MQES &lt;code&gt;255 → 1023&lt;/code&gt;. The controller would now accept 1024-entry queues.&lt;/p&gt;
&lt;p&gt;Two bugs. A framebuffer overlap and a queue-size ceiling. &lt;em&gt;Neither&lt;/em&gt; was CQ handling, memory mode, &lt;code&gt;hipHostRegister&lt;/code&gt;, SMU, or GPU coherence — every exotic theory we&#39;d been afraid of was wrong.&lt;/p&gt;
&lt;h2 id=&quot;the-payoff%3A-gpu-initiated-reads%2C-from-rados%2C-into-vram&quot;&gt;The payoff: GPU-initiated reads, from RADOS, into VRAM &lt;a class=&quot;link-anchor&quot; href=&quot;#the-payoff%3A-gpu-initiated-reads%2C-from-rados%2C-into-vram&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;first-gpu-initiated-read&quot;&gt;First GPU-initiated read &lt;a class=&quot;link-anchor&quot; href=&quot;#first-gpu-initiated-read&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With both fixes, the next boot:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;=== *** FIRST GPU-INITIATED NVMe READ *** ===
Iterations: 50
Test completed successfully!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the bridge trace showed a &lt;em&gt;fully GPU-driven queue pair&lt;/em&gt; — SQ-tail doorbells at &lt;code&gt;0x1040&lt;/code&gt; and CQ-head doorbells at &lt;code&gt;0x1044&lt;/code&gt;, counts marching up as the GPU submitted reads and reaped completions on its own.&lt;/p&gt;
&lt;h3 id=&quot;now-from-rados&quot;&gt;Now from RADOS &lt;a class=&quot;link-anchor&quot; href=&quot;#now-from-rados&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Swap the Malloc backend for &lt;code&gt;bdev_rbd&lt;/code&gt; pointed at &lt;code&gt;rbd/gpuimg&lt;/code&gt;, and the RADOS counters prove the bytes came from Ceph:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RD_OPS 65 → 249     RD 49 KiB → 2.1 MiB     (during the GPU run)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The gfx1151 iGPU drove NVMe block reads from &lt;code&gt;__device__&lt;/code&gt; code → the bridge → SPDK → &lt;code&gt;librbd&lt;/code&gt; → a RADOS OSD. &lt;strong&gt;A GPU reading from a distributed storage cluster, no guest CPU in the datapath.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;latency%3A-stop-being-the-bottleneck&quot;&gt;Latency: stop being the bottleneck &lt;a class=&quot;link-anchor&quot; href=&quot;#latency%3A-stop-being-the-bottleneck&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The first runs clocked ~987 µs/IO — suspiciously close to the bridge&#39;s &lt;strong&gt;1 ms&lt;/strong&gt; poll interval. Dropping &lt;code&gt;poll-interval-ns&lt;/code&gt; from &lt;code&gt;1000000&lt;/code&gt; → &lt;code&gt;10000&lt;/code&gt; (10 µs):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mode 0:  Min 105 µs · Avg 210 µs · Max 367 µs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The bridge is no longer the limiter; the storage is. That&#39;s exactly where you want to be.&lt;/p&gt;
&lt;h3 id=&quot;mode-8%3A-the-payload-lands-in-vram&quot;&gt;Mode 8: the payload lands in VRAM &lt;a class=&quot;link-anchor&quot; href=&quot;#mode-8%3A-the-payload-lands-in-vram&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The finale of the dress rehearsal. Flip the data buffer into GPU memory (&lt;code&gt;--memory-mode 8&lt;/code&gt;) and the kernel log shows the peer-to-peer path lighting up:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rocm-xio: Passthrough NVMe — using P2PDMA IOVA
rocm-xio: ✅ P2PDMA address: 0x6e00000 (size: 2097152)
rocm-xio: Registered buffer ... (P2PDMA attachment kept alive)
Iterations: 50   Average: 136.24 us   Test completed successfully!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;rocm-xio&lt;/code&gt; allocated the read buffer in &lt;strong&gt;GPU device memory&lt;/strong&gt;, exported it via &lt;strong&gt;P2PDMA&lt;/strong&gt; to a guest-physical IOVA that SPDK can reach through its vfio-user DMA map, injected that as the read command&#39;s PRP, and &lt;strong&gt;SPDK DMA&#39;d the RADOS payload directly into GPU memory&lt;/strong&gt; — no host bounce. It was even &lt;em&gt;faster&lt;/em&gt; than mode 0 (136 µs), partly because there&#39;s no host copy and partly because the RBD object was warm.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/gpu-init-block-flow.svg&quot; alt=&quot;The block GPU-init data flow: a gfx1151 device kernel builds an SQE, rings the doorbell into a guest-RAM shadow ring; the pci-mmio-bridge QEMU device forwards the MMIO to the NVMe BAR via address_space_write; SPDK&#39;s vfio-user NVMe controller model drives bdev_rbd over librbd to a RADOS OSD; the completion and phase bit are posted back to the GPU-polled CQ.&quot;&gt;
&lt;em&gt;The block-first proof — note the backend is &lt;code&gt;bdev_rbd&lt;/code&gt;/&lt;code&gt;librbd&lt;/code&gt; against an RBD image, &lt;strong&gt;not&lt;/strong&gt; rados-nkv. This is the dress rehearsal, not the headline.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Block done. Now for the thing the post is named for.&lt;/p&gt;
&lt;h2 id=&quot;gpu-initiated-io-to-the-kv-namespace&quot;&gt;GPU-initiated IO to the KV namespace &lt;a class=&quot;link-anchor&quot; href=&quot;#gpu-initiated-io-to-the-kv-namespace&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The RBD run was always the warm-up. GPU-initiated IO to a &lt;em&gt;block&lt;/em&gt; namespace is, as the BaM paper showed, already a known quantity — and block is the very interface this whole project argues is wrong for KV cache. The actual summit was getting that same GPU-initiated, CPU-free, payload-into-VRAM path to terminate at a &lt;strong&gt;key-value&lt;/strong&gt; namespace backed by RADOS objects: content-addressed, no &lt;code&gt;(device, offset, length)&lt;/code&gt; lookup table, no coordinator.&lt;/p&gt;
&lt;p&gt;That meant &lt;a href=&quot;https://github.com/ROCm/rocm-xio/pull/177&quot;&gt;teaching ROCm XIO a new dialect&lt;/a&gt;. Its &lt;code&gt;nvme-ep&lt;/code&gt; kernel knew how to build exactly one kind of SQE — a block read: opcode &lt;code&gt;0x02&lt;/code&gt;, an LBA, a length. A KV Retrieve is a different 64-byte command: the key travels &lt;em&gt;in the command itself&lt;/em&gt;, and the value buffer is described by the usual PRP/SGL the GPU already knows how to point at VRAM. So the kernel-side work was to stop emitting block opcodes and start emitting key-value ones.&lt;/p&gt;
&lt;p&gt;Concretely, the new &lt;code&gt;kvSqeSetup()&lt;/code&gt; packs a KV Retrieve into the 64-byte SQE like this. The opcode is &lt;code&gt;0x01&lt;/code&gt; for Store / &lt;code&gt;0x02&lt;/code&gt; for Retrieve — numerically the same as block write/read; the controller routes it as key-value not because of a distinct opcode space but because the namespace&#39;s Command Set Identifier is &lt;strong&gt;Key Value (&lt;code&gt;0x1&lt;/code&gt;)&lt;/strong&gt;. The key — up to 16 bytes — rides &lt;em&gt;inline in the command&lt;/em&gt;: bytes 0–7 in CDW2/CDW3 and bytes 8–15 in CDW14/CDW15, with the key length in CDW11&lt;code&gt;[7:0]&lt;/code&gt; and the requested value size in CDW10. The value buffer is described by the ordinary data pointer (PRP1/PRP2 in the DPTR) — the &lt;em&gt;exact same field&lt;/em&gt; a block read uses for its destination. That last part is the whole reuse dividend: the VRAM dma-buf the GPU already knows how to aim a block read at is described identically for a KV Retrieve, so the existing &lt;code&gt;calculatePrps()&lt;/code&gt; path that resolves a VRAM &lt;strong&gt;P2PDMA&lt;/strong&gt; IOVA under &lt;code&gt;--memory-mode 8&lt;/code&gt; needs no changes at all. The only genuinely new kernel-side code is the SQE field-packing; everything about &lt;em&gt;where the value lands&lt;/em&gt; is shared with the block path. (The true stored length comes back in the completion&#39;s DW0 — a field we&#39;ll have a small war story about in a moment.)&lt;/p&gt;
&lt;p&gt;On the &lt;em&gt;target&lt;/em&gt; side, almost nothing changed — which is the whole reward for having proven the plumbing generic. The doorbell → shadow ring → &lt;code&gt;pci-mmio-bridge&lt;/code&gt; → vfio-user → SPDK path is interface-agnostic; it forwards MMIO and posts completions without caring whether the command is a block read or a KV Retrieve. We simply put the &lt;strong&gt;rados-nkv kvdev&lt;/strong&gt; behind the NVMe controller model instead of &lt;code&gt;bdev_rbd&lt;/code&gt;. Now a Retrieve SQE the GPU rings becomes a &lt;code&gt;kvdev_rados&lt;/code&gt; lookup → &lt;code&gt;librados&lt;/code&gt; → a RADOS object named by the key.&lt;/p&gt;
&lt;h3 id=&quot;first-gpu-initiated-kv-retrieve&quot;&gt;First GPU-initiated KV Retrieve &lt;a class=&quot;link-anchor&quot; href=&quot;#first-gpu-initiated-kv-retrieve&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;✅ GPU-initiated NVMe-KV → Ceph/RADOS — proven end-to-end

The one post-reboot shot landed first try (staging everything before the launch was the trick):

host:  GPU bd:00.0  Kernel driver in use: vfio-pci   (kernel 6.19.10)
guest: rocm-xio nvme-ep --kv-op store --memory-mode 8 --pci-mmio-bridge
        Detected PCI MMIO bridge at 0000:00:08.0
        Model: AMD Radeon Graphics
        NVMe /dev/nvme0 (PCI 0000:02:00.0) VID=0x4e58 -&amp;gt; PASSTHROUGH
        Test completed successfully!
Ceph:  rados ls kvpool/gpukv   -&amp;gt; 6770756b65793031   (= hex &amp;quot;gpukey01&amp;quot;)
        rados stat              -&amp;gt; kvpool/6770756b65793031  size 4096

Chain: GPU __device__ code → doorbell MMIO → QEMU pci-mmio-bridge → SPDK vfio-user NVMe-KV → kvdev_rados → librados → a RADOS object in Ceph.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The bytes are real, not a zero-filled placeholder. Seed the GPU&#39;s value buffer with a known LFSR pattern (&lt;code&gt;--lfsr-seed 0xC0FFEE&lt;/code&gt;) on the Store, and that exact pattern shows up as the RADOS object&#39;s data:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rados -p kvpool -N gpukv get $(printf gpukey01 | xxd -p) - | xxd | head -3
00000000: 543c f4ed 6793 fd9e 806b 6a17 7cc9 44e9  T&amp;lt;..g....kj.|.D.
00000010: 6b50 02fb e02b 1108 314d ca9a 30a8 f2e9  kP...+..1M..0...
00000020: 3de4 43e4 1340 1515 6b05 d5c1 4a86 ef61  =.C..@..k...J..a
# sha256 = ea1b6431…  (not the all-zeros hash) — the value the GPU stored, by key.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the finale for real. With &lt;code&gt;--memory-mode 8&lt;/code&gt;, the value the GPU asked for by key — fetched from a RADOS object by SPDK — P2P-DMAs straight into GPU memory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;guest: rocm-xio nvme-ep --kv-op retrieve --key gpukey01 --memory-mode 8 --pci-mmio-bridge
        NVMe /dev/nvme0 (PCI 0000:02:00.0) VID=0x4e58 -&amp;gt; PASSTHROUGH
        KV retrieve OK: returned value length = 4096 bytes
        Iterations: 50   Average: 140.21 µs/IO      (bridge poll-interval-ns = 10000)
kernel: rocm-xio: Passthrough NVMe (0000:02:00.0) — using P2PDMA IOVA
        rocm-xio: ✅ P2PDMA address: 0x11c200000 (size: 2097152)
        rocm-xio: Registered buffer ... (P2PDMA attachment kept alive)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That &lt;strong&gt;140 µs/IO&lt;/strong&gt; is the same story as the block dress rehearsal, one interface up. Run with the bridge&#39;s default 1 ms poll, the KV Retrieve sits at ~991 µs — poll-bound, exactly as block did. Drop &lt;code&gt;poll-interval-ns&lt;/code&gt; to 10 µs and it collapses to &lt;strong&gt;140 µs&lt;/strong&gt;, landing right on top of the block path&#39;s 136 µs: at that point we&#39;re past the bridge and into the real RADOS read latency. The bridge is not the limiter; the cluster is — which is precisely where you want to be, and it&#39;s the &lt;em&gt;same&lt;/em&gt; floor whether the command is a block read or a KV Retrieve.&lt;/p&gt;
&lt;p&gt;That&#39;s the thing the whole post was named for, the doorbell finally tolling for the right interface:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A GPU, from &lt;code&gt;__device__&lt;/code&gt; code, issues an NVMe key-value Retrieve; the value — sourced from a RADOS object in a distributed Ceph cluster — lands directly in GPU memory.&lt;/strong&gt; No guest CPU in the datapath. No block-to-object lookup table. Content-addressed all the way down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let me be precise about what&#39;s new. GPU-initiated storage over the &lt;strong&gt;key-value&lt;/strong&gt; command set isn&#39;t conjured from nothing. On the CPU side, &lt;a href=&quot;https://arxiv.org/html/2411.06980v1&quot;&gt;xNVMe&lt;/a&gt; has long unified NVMe IO across command sets — key-value included — and its maintainers explicitly name efficient GPU storage access as the road ahead, though that part is still aspiration, not shipped code. The KV-over-vfio-user plumbing has a lineage too: Simon Lund&#39;s &lt;a href=&quot;https://github.com/safl/vfio-user-kvssd&quot;&gt;vfio-user-kvssd&lt;/a&gt; emulates an NVMe KV SSD behind the very same vfio-user interface rados-nkv speaks. And GPU-initiated KV &lt;em&gt;cache&lt;/em&gt; tiering already exists — in proprietary silicon: &lt;a href=&quot;https://www.blocksandfiles.com/ai-ml/2024/10/02/pliops-xdp-lightningai-is-a-memory-tier-for-gpu-compute/1615486&quot;&gt;Pliops XDP LightningAI&lt;/a&gt; issues GPU-initiated key-value requests with the CPU out of the data path, and NVIDIA&#39;s &lt;a href=&quot;https://www.nvidia.com/en-us/data-center/ai-storage/cmx/&quot;&gt;CMX / DOCA Memos&lt;/a&gt; fronts a KV-cache context tier with key-value APIs on BlueField.&lt;/p&gt;
&lt;p&gt;What I haven&#39;t seen before is this exact stack: a GPU-initiated NVMe &lt;strong&gt;key-value&lt;/strong&gt; command driven from an &lt;strong&gt;AMD&lt;/strong&gt; GPU — as far as I know, a first — landing not in a local KV SSD or a proprietary appliance but in a RADOS object in a distributed Ceph cluster, on entirely &lt;strong&gt;open-source software-defined storage&lt;/strong&gt;, with no bespoke DPU or ASIC in the path. And it matters because key-value is the interface KV cache actually wants. The hash of a token sequence &lt;em&gt;is&lt;/em&gt; the key; two GPUs computing the same prefix arrive at the same RADOS object with zero coordination, no central map to consult or keep coherent.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/gpu-init-kv-flow.svg&quot; alt=&quot;The KV GPU-init data flow — identical to the block path up to the controller, then rados-nkv kvdev → librados → RADOS object instead of bdev_rbd.&quot;&gt;
&lt;em&gt;Same GPU-initiated path, KV all the way down: the value is addressed by key and the backend is rados-nkv → librados → a RADOS object.&lt;/em&gt;&lt;/p&gt;
&lt;!-- ───────────────── NEW SECTION (added post-draft; keep or cut) ───────────────── --&gt;
&lt;h3 id=&quot;wavefront-multi-key-%E2%80%94-and-a-torn-read-(bug-%233)&quot;&gt;Wavefront multi-key — and a torn read (Bug #3) &lt;a class=&quot;link-anchor&quot; href=&quot;#wavefront-multi-key-%E2%80%94-and-a-torn-read-(bug-%233)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A single Retrieve per doorbell is leaving the GPU on the table. ROCm XIO has a &lt;em&gt;wavefront&lt;/em&gt; KV path: threads &lt;code&gt;1..B&lt;/code&gt; of a workgroup each pack one key&#39;s SQE into its own slot, and thread 0 rings the doorbell &lt;strong&gt;once&lt;/strong&gt; for the whole batch, then reaps &lt;code&gt;B&lt;/code&gt; completions. Point it at a manifest of keys:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rocm-xio nvme-ep --kv-op store --keys shard0 shard1 shard2 shard3 &#92;
    --batch-size 4 --value-size 4096 --data-buffer-size 16384 --pci-mmio-bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Four keys, one ring — and four RADOS objects appear with the &lt;em&gt;same&lt;/em&gt; mtime, the fingerprint of a single batched submission:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;shard0 -&amp;gt; kvpool/736861726430  size 4096   (all four at the same mtime)
shard1 -&amp;gt; kvpool/736861726431  size 4096
shard2 -&amp;gt; kvpool/736861726432  size 4096
shard3 -&amp;gt; kvpool/736861726433  size 4096
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The matching batched Retrieve, though, surfaced a real bug — and a satisfying one, because it was the kind we&#39;d spent the whole post learning to hunt. The first key in every batch came back with a value length of &lt;strong&gt;zero&lt;/strong&gt;, while the rest were correct:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KV retrieve OK: key_idx=0 returned value length = 0 bytes     ← wrong
KV retrieve OK: key_idx=1 returned value length = 4096 bytes
KV retrieve OK: key_idx=2 returned value length = 4096 bytes
KV retrieve OK: key_idx=3 returned value length = 4096 bytes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reading the completion path: &lt;code&gt;cqeRead&lt;/code&gt; copies the 16-byte CQE low dword first, and the &lt;strong&gt;phase bit lives in the &lt;em&gt;last&lt;/em&gt; dword&lt;/strong&gt;. The poll loop spins on a single &lt;code&gt;cqeRead&lt;/code&gt; until the phase flips — but a &lt;em&gt;single&lt;/em&gt; read can capture a stale &lt;code&gt;cdw0&lt;/code&gt; (the value length, still zero) &lt;em&gt;together with&lt;/em&gt; the freshly-flipped phase bit. A torn read. It only ever bit &lt;code&gt;key_idx=0&lt;/code&gt; because that&#39;s the completion whose poll races the controller&#39;s write most tightly; by the time the loop reaches slots 1–3 the writes have long since landed. The fix is a one-liner of memory ordering — once the phase flip is observed, fence and re-read before trusting &lt;code&gt;cdw0&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;  if (NVME_CQE_STATUS_PHASE(cqe_new.status) == expected_phase) {
+   // The phase bit is the CQE&#39;s last dword, but cqeRead copies cdw0 first —
+   // one read can capture a stale cdw0 (0) with the freshly-flipped phase.
+   // Fence + re-read so DW0 (the KV value length) is coherent before use.
+   __threadfence_system();
+   cqe_new = nvme_ep::cqeRead(cqe_entry);
    break;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because &lt;code&gt;xio-tester&lt;/code&gt; is plain userspace HIP, this was a &lt;em&gt;live&lt;/em&gt; fix: edit, rebuild in the guest, re-run — no host reboot, the precious GPU session preserved. After the rebuild, all four slots (and the single-key path) report the true &lt;code&gt;4096&lt;/code&gt;. Same lesson as Bugs #1 and #2, one layer down: read the source, and the &amp;quot;weird&amp;quot; symptom has an unexciting, specific cause.&lt;/p&gt;
&lt;!-- ─────────────────────────── end NEW SECTION ─────────────────────────── --&gt;
&lt;h2 id=&quot;lessons&quot;&gt;Lessons &lt;a class=&quot;link-anchor&quot; href=&quot;#lessons&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A few things generalized well beyond this specific stack:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bisect across process/hardware boundaries, not just code.&lt;/strong&gt; The single most valuable move was the CPU-driven shadow-ring probe. It cut the search space in half &lt;em&gt;and cost zero GPU boots&lt;/em&gt; — in an environment where each GPU boot was the scarcest resource we had.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validate fixes with the cheap path before spending the expensive one.&lt;/strong&gt; Both fixes (the GPA relocation and the MQES bump) were &lt;em&gt;confirmed reboot-free&lt;/em&gt; with the CPU probe before we committed a precious GPU boot to them. We never &amp;quot;tried&amp;quot; a fix on the GPU — by the time it ran there, we already knew it worked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read the source of every layer before theorizing.&lt;/strong&gt; Tracing QEMU, SPDK, and rocm-xio at the line level proved the path was correct by construction, which reframed the hunt from &amp;quot;what&#39;s broken in the design&amp;quot; to &amp;quot;what&#39;s different at runtime.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instrument over guess.&lt;/strong&gt; One QEMU trace flag turned &amp;quot;0x1016, no idea&amp;quot; into &amp;quot;338 zeroed commands from a source that isn&#39;t the GPU&amp;quot; — and that single data point killed five theories at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The exotic explanation is usually wrong.&lt;/strong&gt; We spent real worry on integrated-GPU P2P semantics, &lt;code&gt;hipHostRegister&lt;/code&gt;-of-MMIO, SMU flakiness, and CQ-phase races. The actual bugs were a framebuffer at the wrong address, a number that was 4× too big, and a torn 16-byte read.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;doing-the-math&quot;&gt;Doing the math &lt;a class=&quot;link-anchor&quot; href=&quot;#doing-the-math&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The ROCm XIO kernel drives a &lt;strong&gt;single 1024-entry submission queue&lt;/strong&gt; (&lt;code&gt;--num-queues 1 --queue-length 1024&lt;/code&gt;) — rowdy, but this is serious AI business, and serious AI business needs to do lots of IO. That 1024-entry ceiling is exactly what the MQES &lt;code&gt;255 → 1023&lt;/code&gt; fix in Bug #2 unlocked, and the wavefront path rings a batch of up to &lt;code&gt;queue_length − 1&lt;/code&gt; SQEs per doorbell, so the &amp;quot;one ring submits the whole batch&amp;quot; claim below is literal.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1024 SQEs × 256 tokens per block = 262,144 tokens&lt;/code&gt;. That&#39;s &lt;strong&gt;2.7× the 96k median&lt;/strong&gt; agentic context reported by SemiAnalysis:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We pulled data from 432k real coding-agent requests, and the median one isn&#39;t 32k, isn&#39;t 64k, but &lt;strong&gt;96k input tokens&lt;/strong&gt; — more than the entire text of &lt;em&gt;The Great Gatsby&lt;/em&gt; shoved into the model before you&#39;ve even typed your question.
— &lt;a href=&quot;https://x.com/SemiAnalysis_/status/2057869518295249373&quot;&gt;SemiAnalysis&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The 256-token block isn&#39;t an arbitrary chunk, either: it&#39;s the granularity LMCache and llm-d-kv-cache already aggregate vLLM&#39;s 16-token paged blocks into before handing them across the kv-connector. We content-address at the unit the ecosystem already speaks. If you take a model like IBM Granite 4.0 30B, a 256-token block works out to about 32MB (128K per token).&lt;/p&gt;
&lt;p&gt;So a single SQ-tail doorbell ring submits the whole batch — meaning we can request an entire &lt;strong&gt;262k-token prefix with one ring of the submission doorbell.&lt;/strong&gt; SPDK dispatches the work across its async reactors, which drive &lt;code&gt;librados&lt;/code&gt; asynchronously to RADOS, and P2P-DMAs each value into a VRAM-backed dma-buf.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=17HRV8k1YMw&quot;&gt;Ride the lightning&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what&#39;s-next&quot;&gt;What&#39;s next &lt;a class=&quot;link-anchor&quot; href=&quot;#what&#39;s-next&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The KV Retrieve path is the foundation; there&#39;s a lot stacked on top of it. The &lt;code&gt;cls&lt;/code&gt; allowlist — execute-where-the-data-rests via the gRPC-controlled opcode map — turns this from a place to put bytes into a place to &lt;em&gt;run code next to&lt;/em&gt; them. &lt;code&gt;rados-nkv-weights&lt;/code&gt; lets vLLM stream model weights over the same namespace. And there are three deployment shapes worth their own post: co-resident on the hypervisor (what you saw here, useful today on commodity TCP/IP RADOS), on a DPU like BlueField-4 (provided it exposes a hardware doorbell abstraction to the host), and storage-host-side across an RDMA fabric (IB / RoCEv2 / Ultra Ethernet) with a GDS-class NIC. That&#39;s the next mountain. And to make any of this reproducible, there&#39;s work underway on a recipe that stitches the pieces together — SPDK with rados-nkv, ROCm XIO, the patched QEMU, and the guest plumbing — so you won&#39;t have to reassemble the factory from scratch.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A note on scope: everything above is a functional prototype. The latencies are single-box, warm-cache figures meant to show the bridge is no longer the bottleneck — not a benchmark. Real throughput/TTFT numbers, and the non-&lt;code&gt;--no-huge&lt;/code&gt; hugepage-backed configuration you&#39;d actually measure on, are coming.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Have questions?&lt;/strong&gt; Catch the Ceph Tech Talk on &lt;strong&gt;July 8th&lt;/strong&gt;. Can&#39;t make it? Reach out — &lt;code&gt;kbader@ibm.com&lt;/code&gt;, or &lt;code&gt;@kbader&lt;/code&gt; on Ceph Slack &lt;code&gt;#gpu-initiated&lt;/code&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Managing Multiple Lua Scripts with Ceph Object Storage</title>
    <link href="https://ceph.io/en/news/blog/2026/rgw-multiple-scripts/" />
    <updated>2026-06-10T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/rgw-multiple-scripts/</id>
    <author>
      <name>Kirby Chin</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="rgw" />
      <category term="s3" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/rgw-multiple-scripts/">&lt;p&gt;Since the Pacific release, Lua scripting in Ceph&#39;s RADOS Gateway (RGW) has provided users the ability to interpolate a single script to upload operations per request context and tenant. This way of working might be completely fine for a storage deployment with limited scripting customizations. However, script management becomes increasingly difficult as more than one team wants to get involved in managing the Lua script within the same context and tenant.&lt;/p&gt;
&lt;p&gt;For this reason, we&#39;ve released a new feature in RGW allowing you to manage more than one Lua script at a time. In this blog, we&#39;ll go over a couple of examples to walk you through how this feature can help your team to reduce runtime errors and lower developer friction when managing Lua scripts in RGW. To begin, we will create a script to enforce a bucket security control and then add another script to demonstrate the new feature.&lt;/p&gt;
&lt;h2 id=&quot;script-1%3A-bucket-security&quot;&gt;Script 1: Bucket security &lt;a class=&quot;link-anchor&quot; href=&quot;#script-1%3A-bucket-security&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&#39;s suppose we are part of a security team and want to mitigate the risk of ransomware threats happening on our storage platform. One possible way to achieve this is to implement a Write Once, Read Many (WORM) strategy to add an object lock onto any newly created bucket. By using an object lock, we can add a constraint to write objects to disk only once, ensuring that an infected client cannot delete or override objects at a later time.&lt;/p&gt;
&lt;p&gt;To set our WORM strategy, we can create a Lua script in the &lt;code&gt;prerequest&lt;/code&gt; context that aborts when a &lt;code&gt;create_bucket&lt;/code&gt; operation is made without the write-once (object lock) requirement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;objectlock.lua&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;-- enforcing object lock on bucket creation

if Request.RGWOp == &amp;quot;create_bucket&amp;quot; and
  Request.HTTP.Metadata[&amp;quot;x-amz-bucket-object-lock-enabled&amp;quot;] ~= &amp;quot;true&amp;quot; then
  RGWDebugLog(&amp;quot;object lock is missing on bucket: &amp;quot; .. Request.Bucket.Name)
  Request.Response.Message = &amp;quot;Bucket must have object lock enabled&amp;quot;
  return RGW_ABORT_REQUEST
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can create a new &lt;code&gt;objectlock.lua&lt;/code&gt; file with the contents above and run the CLI commands below to upload the script to RGW.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Add the &lt;code&gt;objectlock.lua&lt;/code&gt; script to the &lt;code&gt;preRequest&lt;/code&gt; context:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ radosgw-admin script put --infile=./objectlock.lua --context=prerequest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;End Result:&lt;/strong&gt;
You&#39;ll know if this worked correctly if the &lt;code&gt;aws s3 mb&lt;/code&gt; (make bucket) command below has failed.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ aws s3 mb --endpoint-url http://127.0.0.1:8000 &#92;
  s3://fish1 &#92;
  --debug
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Error:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Bucket must have object lock enabled
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead, you&#39;ll need to use the &lt;code&gt;aws s3api create-bucket&lt;/code&gt; command, which includes the &lt;code&gt;--object-lock-enabled-for-bucket&lt;/code&gt; flag to set the write-once capability.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ aws s3api create-bucket --endpoint-url http://127.0.0.1:8000 &#92;
  --bucket fish2 &#92;
  --object-lock-enabled-for-bucket
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once the script is uploaded, it&#39;s stored as a Ceph S3 object, so you will get the same benefits of data consistency and availability as you would get with any other object in the platform.&lt;/p&gt;
&lt;p&gt;To delete the script, use &lt;code&gt;radosgw-admin script rm --context={context}&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;script-2%3A-cost-optimization&quot;&gt;Script 2: Cost optimization &lt;a class=&quot;link-anchor&quot; href=&quot;#script-2%3A-cost-optimization&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&#39;s say that our engineering team now wants to implement object &lt;a href=&quot;https://ceph.io/en/news/blog/2024/auto-tiering-ceph-object-storage-part-2/&quot;&gt;auto-tiering&lt;/a&gt; to manage storage efficiently. Specifically, the team wants to classify objects with a &lt;code&gt;StorageClass&lt;/code&gt; attribute, one of &lt;code&gt;STANDARD&lt;/code&gt; (&amp;lt;16KB), &lt;code&gt;STANDARD_IA&lt;/code&gt; (&amp;gt;=16KB and &amp;lt;1MB) or &lt;code&gt;ONE_ZONE_IA&lt;/code&gt; (&amp;gt;1MB) to provide them with a heuristic on where to store the data in a cost effective manner. Although we are using AWS Storage Class names here, please avoid using &lt;code&gt;GLACIER&lt;/code&gt; with Ceph&#39;s RGW because some clients/SDKs expect specific behavior that is not currently supported.&lt;/p&gt;
&lt;p&gt;Similar to the first script, the engineering team wants to run their new script in the &lt;code&gt;prerequest&lt;/code&gt; context before the object request starts. However, whereas the earlier example targets the &lt;code&gt;create_bucket&lt;/code&gt; operation, the latter focuses exclusively on the &lt;code&gt;put_obj&lt;/code&gt; operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;autotier.lua&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-- Lua script to auto-tier S3 object PUT requests

-- exit script quickly if it is not a PUT request
if Request == nil or Request.RGWOp ~= &amp;quot;put_obj&amp;quot;
then
  return
end

-- apply StorageClass only if user hasn&#39;t already assigned a storage-class
if Request.HTTP.StorageClass == nil or Request.HTTP.StorageClass == &#39;&#39; then
  if Request.ContentLength &amp;lt; 16384 then
    Request.HTTP.StorageClass = &amp;quot;STANDARD&amp;quot;
  elseif Request.ContentLength &amp;lt; 1048576 then
    Request.HTTP.StorageClass = &amp;quot;STANDARD_IA&amp;quot;
  else
    Request.HTTP.StorageClass = &amp;quot;ONE_ZONE_IA&amp;quot;
  end
  RGWDebugLog(&amp;quot;applied &#39;&amp;quot; .. Request.HTTP.StorageClass .. &amp;quot;&#39; to object &#39;&amp;quot; .. Request.Object.Name .. &amp;quot;&#39;&amp;quot;)
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can create the &lt;code&gt;autotier.lua&lt;/code&gt; file from the contents above, but you might quickly notice a new issue.&lt;/p&gt;
&lt;p&gt;If we were to combine both scripts together, the engineering team&#39;s Lua script returns early if the request is not a &lt;code&gt;put_obj&lt;/code&gt; operation. This means script order matters: if the engineering team&#39;s script runs first our initial script may never execute.&lt;/p&gt;
&lt;p&gt;To avoid this merge conflict scenario and as mentioned earlier, we can use the multiple Lua script support in RGW by setting the &lt;code&gt;--script-name&lt;/code&gt; parameter to add more than one script to the same request context.&lt;/p&gt;
&lt;h3 id=&quot;adding-more-than-one-lua-script-to-the-same-context&quot;&gt;Adding more than one Lua script to the same context &lt;a class=&quot;link-anchor&quot; href=&quot;#adding-more-than-one-lua-script-to-the-same-context&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Since it&#39;s important that both teams be able to run their own scripts in the &lt;code&gt;prerequest&lt;/code&gt; context, you can add more than one script without affecting others by using the &lt;code&gt;script put&lt;/code&gt; command with the &lt;code&gt;--script-name&lt;/code&gt; flag.&lt;/p&gt;
&lt;p&gt;For example, try adding both scripts with the following commands below:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin script put --infile=./objectlock.lua --script-name=worm-policy --context=prerequest
$ radosgw-admin script put --infile=./autotier.lua --script-name=smart-tiering --context=prerequest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One important caveat to remember when using multiple Lua scripts is that they have completely separate local scopes during execution. This means that a global variable in one script cannot be accessed in another script regardless of the context.&lt;/p&gt;
&lt;p&gt;Apart from this, the Lua scripts will run sequentially and in lexicographical order, which follows the same ordering to how the scripts are listed in the admin command output below. The only exception to this is &lt;code&gt;--script-name=default&lt;/code&gt; which is reserved for the unnamed script and will always be run first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;List all uploaded scripts with the &lt;code&gt;script list&lt;/code&gt; command:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ radosgw-admin script list --context=prerequest
smart-tiering
worm-policy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do note that if you haven&#39;t deleted the unnamed &lt;code&gt;objectlock.lua&lt;/code&gt; script yet from the earlier example, you might get an extra &lt;code&gt;default&lt;/code&gt; script included in the script list output.&lt;/p&gt;
&lt;p&gt;Finally, to delete a named script, use &lt;code&gt;radosgw-admin script rm --context={context} --script-name={script-name}&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping Up &lt;a class=&quot;link-anchor&quot; href=&quot;#wrapping-up&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This was a brief look at the new multiple Lua scripting support in RGW to show how you can manage more than one script in the same context across teams in an independent way. For more information about this feature, you can find the complete reference in The Ceph Documentation on &lt;a href=&quot;https://docs.ceph.com/en/latest/radosgw/lua-scripting/&quot;&gt;Lua Scripting&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>v19.2.4 Squid released</title>
    <link href="https://ceph.io/en/news/blog/2026/v19-2-4-squid-released/" />
    <updated>2026-06-01T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/v19-2-4-squid-released/</id>
    <author>
      <name>Yuri Weinstein</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="release" />
      <category term="squid" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/v19-2-4-squid-released/">&lt;p&gt;This is the fourth backport release in the Squid series.
We recommend all users update to this release.&lt;/p&gt;
&lt;h2 id=&quot;notable-changes&quot;&gt;Notable Changes &lt;a class=&quot;link-anchor&quot; href=&quot;#notable-changes&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&quot;osd-%2F-bluestore&quot;&gt;OSD / BlueStore &lt;a class=&quot;link-anchor&quot; href=&quot;#osd-%2F-bluestore&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;BlueFS: Increased the default WAL volume size to 1GB to prevent ENOSPC failures.&lt;/li&gt;
&lt;li&gt;Volume Selection: Fixed the usage of bluestore_volume_selection_reserved_factor and updated row naming conventions in RocksDBBlueFSVolumeSelector.&lt;/li&gt;
&lt;li&gt;Health: Added a time_added field to mon_info_t to prevent freshly added monitors from incorrectly triggering a MON_DOWN health status.&lt;/li&gt;
&lt;li&gt;Tooling: Updated monmaptool to correctly respect set features when adding addresses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rados-%2F-manager-(mgr)&quot;&gt;RADOS / Manager (mgr) &lt;a class=&quot;link-anchor&quot; href=&quot;#rados-%2F-manager-(mgr)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RADOS pybind: Fixed a parameter reversal bug in WriteOp.zero() where offset and length were swapped when calling the underlying C API.&lt;/li&gt;
&lt;li&gt;Daemon Health: Modified the manager to clear health metrics for down or out OSDs instead of removing them entirely from the daemon state.&lt;/li&gt;
&lt;li&gt;Autoscaler: Updated pg_autoscale_mode logic to accurately reflect the no_autoscale flag in both standard and JSON command outputs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;rados-gateway-(rgw)&quot;&gt;RADOS Gateway (RGW) &lt;a class=&quot;link-anchor&quot; href=&quot;#rados-gateway-(rgw)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Notifications: Resolved a reserved_size drift in the 2pc_queue causing ENOSPC errors and fixed a leak where overhead was not properly decremented during commit/abort.&lt;/li&gt;
&lt;li&gt;Multipart Uploads: Fixed an issue where tags could not be retrieved from objects created via multipart uploads.&lt;/li&gt;
&lt;li&gt;Kafka Integration: Updated the internal Kafka version support to 3.9.2.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cephfs-%2F-mds&quot;&gt;CephFS / MDS &lt;a class=&quot;link-anchor&quot; href=&quot;#cephfs-%2F-mds&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fragments: Simplified fragment printing and corrected frag_t endianness conversion for network and storage consistency.&lt;/li&gt;
&lt;li&gt;FUSE Client: Updated the FUSE client to clarify that fallocate disk space reservation is only supported with specific flags like FALLOC_FL_KEEP_SIZE.&lt;/li&gt;
&lt;li&gt;Metadata: Updated the MDS to dump frag_t as an object and included sysinfo in the status command output for better diagnostics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dashboard&quot;&gt;Dashboard &lt;a class=&quot;link-anchor&quot; href=&quot;#dashboard&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Services: Fixed a bug where changing MDS placement to a label incorrectly triggered the creation of an entirely new MDS service.&lt;/li&gt;
&lt;li&gt;Access Control: Fixed role-based access control permissions and added missing types to the mgr-module list.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;librbd-%26-rbd-mirror&quot;&gt;librbd &amp;amp; rbd-mirror &lt;a class=&quot;link-anchor&quot; href=&quot;#librbd-%26-rbd-mirror&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RBD: Introduced a new &lt;code&gt;RBD_LOCK_MODE_EXCLUSIVE_TRANSIENT&lt;/code&gt; policy for &lt;code&gt;rbd_lock_acquire()&lt;/code&gt;. This is a low-level interface intended to allow a peer to grab exclusive lock manually for short periods of time with other peers pausing their activity and waiting for the lock to be released rather than instantly aborting I/O and returning an error. It&#39;s possible to switch from &lt;code&gt;RBD_LOCK_MODE_EXCLUSIVE&lt;/code&gt; to &lt;code&gt;RBD_LOCK_MODE_EXCLUSIVE_TRANSIENT&lt;/code&gt; policy and vice versa even if the lock is already held.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;changelog&quot;&gt;Changelog &lt;a class=&quot;link-anchor&quot; href=&quot;#changelog&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;auth: msgr2 can return incorrect allowed_modes through AuthBadMethodFrame (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65335&quot;&gt;pr#65335&lt;/a&gt;, Miki Patel)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;backport build-with-container patches from main (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65186&quot;&gt;pr#65186&lt;/a&gt;, John Mulligan, Dan Mick, Zack Cerza)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;backports variants improvements and Dockerfile&lt;span&gt;&lt;/span&gt;.build changes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66011&quot;&gt;pr#66011&lt;/a&gt;, John Mulligan, Zack Cerza)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;blk/kernel: improve DiscardThread life cycle (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65214&quot;&gt;pr#65214&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bluestore/BlueFS: fix bytes_written_slow counter with aio_write (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66354&quot;&gt;pr#66354&lt;/a&gt;, chungfengz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build-with-container: add argument groups to organize options (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65629&quot;&gt;pr#65629&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build-with-container: build image variants (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65945&quot;&gt;pr#65945&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-fuse: Improve fuse mount usage message (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61274&quot;&gt;pr#61274&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: drop udevadm subprocess calls (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65302&quot;&gt;pr#65302&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: fix UdevData initialisation from empty /run/udev/data/* file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65924&quot;&gt;pr#65924&lt;/a&gt;, Matteo Paramatti)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: use udev data instead of LVM subprocess in get_devices() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65922&quot;&gt;pr#65922&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephadm: add ability to continue on failure when applying multiple specs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64082&quot;&gt;pr#64082&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephadm: rgw: allow specifying the ssl_certificate by filepath (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64084&quot;&gt;pr#64084&lt;/a&gt;, Alexander Hussein-Kershaw)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephadm: stop sidecar systemd units when restarting main units (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62593&quot;&gt;pr#62593&lt;/a&gt;, Adam King, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CephContext: acquire _fork_watchers_lock in notify_post_fork() (&lt;a href=&quot;http://tracker.ceph.com/issues/63494&quot;&gt;issue#63494&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/62051&quot;&gt;pr#62051&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-journal-tool: fix segfault during &#39;journal import&#39; from invalid dump file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62115&quot;&gt;pr#62115&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-journal-tool: Journal trimming issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65602&quot;&gt;pr#65602&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-shell: add option to remove xattr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62391&quot;&gt;pr#62391&lt;/a&gt;, Neeraj Pratap Singh)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-top: exception when terminal size greater than PAD_WIDTH (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61774&quot;&gt;pr#61774&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs: fix monclient not subscribed monmap/config (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66471&quot;&gt;pr#66471&lt;/a&gt;, Shaohui Wang)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs: MDCache request cleanup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66472&quot;&gt;pr#66472&lt;/a&gt;, Abhishek Lekshmanan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs_mirror: &#39;ceph fs snapshot mirror ls&#39; command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60177&quot;&gt;pr#60177&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: account for mixed quotas in statfs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66473&quot;&gt;pr#66473&lt;/a&gt;, Christopher Hoffman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: cephfs user-space client fixes (&lt;a href=&quot;http://tracker.ceph.com/issues/70726&quot;&gt;issue#70726&lt;/a&gt;, &lt;a href=&quot;http://tracker.ceph.com/issues/71510&quot;&gt;issue#71510&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/64090&quot;&gt;pr#64090&lt;/a&gt;, Venky Shankar, Adam Emerson, Kotresh HR, Shachar Sharon)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: fix unmount hang after lookups (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65289&quot;&gt;pr#65289&lt;/a&gt;, Dhairya Parmar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: Handle empty pathnames for &lt;code&gt;ceph&#92;_chownat()&lt;/code&gt; and &lt;code&gt;ceph&#92;_statxat()&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61166&quot;&gt;pr#61166&lt;/a&gt;, Anoop C S)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: ll_walk will process absolute paths as relative (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62499&quot;&gt;pr#62499&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: prohibit unprivileged users from setting sgid/suid bits (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66039&quot;&gt;pr#66039&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: use path supplied in statfs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65133&quot;&gt;pr#65133&lt;/a&gt;, Christopher Hoffman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cmake: remove _FORTIFY_SOURCE define (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65659&quot;&gt;pr#65659&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common/ceph_context: use std::atomic&amp;lt;std::shared_ptr&lt;T&gt;&amp;gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66185&quot;&gt;pr#66185&lt;/a&gt;, Kefu Chai, Max Kellermann)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common/frag: properly convert frag_t to net/store endianness (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66541&quot;&gt;pr#66541&lt;/a&gt;, Patrick Donnelly, Max Kellermann)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common/options: fix typo in description (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64217&quot;&gt;pr#64217&lt;/a&gt;, Lorenz Bausch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common: Allow PerfCounters to return a provided service ID (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65588&quot;&gt;pr#65588&lt;/a&gt;, Adam C. Emerson)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common: drop stack singleton object of temp messenger for foreground ceph daemons (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66897&quot;&gt;pr#66897&lt;/a&gt;, dongdong tao)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;deb/cephadm: add explicit --home for cephadm user (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64605&quot;&gt;pr#64605&lt;/a&gt;, Casey Bodley, Shawn Edwards)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;deb/mgr: remove deprecated distutils from ceph-mgr&lt;span&gt;&lt;/span&gt;.requires (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64456&quot;&gt;pr#64456&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;deb: use glob match to support systemd unit dir changes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64013&quot;&gt;pr#64013&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian/control: add iproute2 to build dependencies (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66739&quot;&gt;pr#66739&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian: radosgw: add media-types packages as alternative for mime-support (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63725&quot;&gt;pr#63725&lt;/a&gt;, Thomas Lamprecht)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm: remove sections that do not not apply to Squid in rgw&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66970&quot;&gt;pr#66970&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: add a note about estimated replay completion time (&lt;a href=&quot;http://tracker.ceph.com/issues/71629&quot;&gt;issue#71629&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/65057&quot;&gt;pr#65057&lt;/a&gt;, Venky Shankar, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit ceph-dokan&lt;span&gt;&lt;/span&gt;.rst (1 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64735&quot;&gt;pr#64735&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit ceph-dokan&lt;span&gt;&lt;/span&gt;.rst (2 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64759&quot;&gt;pr#64759&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit ceph-dokan&lt;span&gt;&lt;/span&gt;.rst (3 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64785&quot;&gt;pr#64785&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit disaster-recovery&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64644&quot;&gt;pr#64644&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit disaster-recovery&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64608&quot;&gt;pr#64608&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65379&quot;&gt;pr#65379&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65087&quot;&gt;pr#65087&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65125&quot;&gt;pr#65125&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65122&quot;&gt;pr#65122&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65093&quot;&gt;pr#65093&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65090&quot;&gt;pr#65090&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65077&quot;&gt;pr#65077&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65096&quot;&gt;pr#65096&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65046&quot;&gt;pr#65046&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65043&quot;&gt;pr#65043&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65040&quot;&gt;pr#65040&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65036&quot;&gt;pr#65036&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65025&quot;&gt;pr#65025&lt;/a&gt;, Zac Dover, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64903&quot;&gt;pr#64903&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64900&quot;&gt;pr#64900&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64878&quot;&gt;pr#64878&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64871&quot;&gt;pr#64871&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64852&quot;&gt;pr#64852&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (Slow MDS) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65202&quot;&gt;pr#65202&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: Improve mount-using-fuse&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64472&quot;&gt;pr#64472&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: Update quota&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65082&quot;&gt;pr#65082&lt;/a&gt;, Jannis Speer, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/config: Document how to use :confval: directive for config op… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64166&quot;&gt;pr#64166&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/crimson: Update docs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65311&quot;&gt;pr#65311&lt;/a&gt;, Matan Breizman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/release-process&lt;span&gt;&lt;/span&gt;.rst: document new Jenkins job for containers (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62612&quot;&gt;pr#62612&lt;/a&gt;, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev:update blkin&lt;span&gt;&lt;/span&gt;.rst doc for lttng trace (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65211&quot;&gt;pr#65211&lt;/a&gt;, lizhipeng)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/man/8: Improve mount&lt;span&gt;&lt;/span&gt;.ceph&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65183&quot;&gt;pr#65183&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr/crash&lt;span&gt;&lt;/span&gt;.rst: remove outdated module enabling instructions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64284&quot;&gt;pr#64284&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63809&quot;&gt;pr#63809&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64343&quot;&gt;pr#64343&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/configuration: Mention show-with-defaults and ceph-conf (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65206&quot;&gt;pr#65206&lt;/a&gt;, Niklas Hambüchen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/configuration: Small improvements in ceph-conf&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64287&quot;&gt;pr#64287&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Improve health-checks&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65238&quot;&gt;pr#65238&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/ops: add caps restore command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64321&quot;&gt;pr#64321&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/ops: edit cache-tiering&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64496&quot;&gt;pr#64496&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: document section absent in release &amp;lt; T (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64867&quot;&gt;pr#64867&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: remove clonedata command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64393&quot;&gt;pr#64393&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: repair short underline (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65137&quot;&gt;pr#65137&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw/s3: Document delete-if-unmodified-since (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64315&quot;&gt;pr#64315&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: add rgw_enable_lc_threads &amp;amp; rgw_enable_gc_threads (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64338&quot;&gt;pr#64338&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: edit &amp;quot;Lifecycle Settings&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64547&quot;&gt;pr#64547&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: edit config-ref&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64647&quot;&gt;pr#64647&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: edit metrics&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63812&quot;&gt;pr#63812&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Improve rgw-cache&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64475&quot;&gt;pr#64475&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: remove cloud-restore from squid (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65639&quot;&gt;pr#65639&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rbd/rbd-config-ref: add clone settings section (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66174&quot;&gt;pr#66174&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/src/common/options: mgr&lt;span&gt;&lt;/span&gt;.yaml&lt;span&gt;&lt;/span&gt;.in edit (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63764&quot;&gt;pr#63764&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: add note admonitions in two files (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64492&quot;&gt;pr#64492&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Clarify the status of MS Windows client support (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64481&quot;&gt;pr#64481&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: do not depend on typed-ast (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64399&quot;&gt;pr#64399&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Document ceph-mgr module configuration options (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64396&quot;&gt;pr#64396&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: fetch releases from main branch (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67001&quot;&gt;pr#67001&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fix links to mClock config reference (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64752&quot;&gt;pr#64752&lt;/a&gt;, Pierre Riteau)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fix unterminated inline literal in ceph-conf&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64170&quot;&gt;pr#64170&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fixed a spelling error (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64147&quot;&gt;pr#64147&lt;/a&gt;, &lt;a href=&quot;http://Instelligence.io&quot;&gt;Instelligence.io&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fixes a typo in balancer operations (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65550&quot;&gt;pr#65550&lt;/a&gt;, Tyler Brekke)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Pin pip to &amp;lt;25&lt;span&gt;&lt;/span&gt;.3 for RTD as a workaround for pybind in admin/doc-read-the-docs&lt;span&gt;&lt;/span&gt;.txt (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66117&quot;&gt;pr#66117&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Remove sphinxcontrib-seqdiag Python package from RTD builds (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67501&quot;&gt;pr#67501&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: update mgr modules notify_types (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64530&quot;&gt;pr#64530&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;github: pin GH Actions to SHA-1 commit (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65758&quot;&gt;pr#65758&lt;/a&gt;, Ernesto Puerta)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handle failures in metric parsing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65228&quot;&gt;pr#65228&lt;/a&gt;, Anmol Babu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HealthMonitor: Add topology-aware netsplit detection and warning (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63024&quot;&gt;pr#63024&lt;/a&gt;, Kamoltat Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install-deps&lt;span&gt;&lt;/span&gt;.sh: install proper compiler version on Debian/Ubuntu (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66013&quot;&gt;pr#66013&lt;/a&gt;, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install-deps: Replace apt-mirror (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66668&quot;&gt;pr#66668&lt;/a&gt;, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd/cache/pwl: WriteLogOperationSet::cell can be garbage (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67704&quot;&gt;pr#67704&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd/mirror: detect trashed snapshots in UnlinkPeerRequest (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67582&quot;&gt;pr#67582&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: don&#39;t complete ImageUpdateWatchers::shut_down() prematurely (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67580&quot;&gt;pr#67580&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: fix ExclusiveLock::accept_request() when !is_state_locked() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66627&quot;&gt;pr#66627&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: images aren&#39;t closed in group_snap&#92;_*_by_record() on error (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64621&quot;&gt;pr#64621&lt;/a&gt;, Miki Patel)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: introduce RBD_LOCK_MODE_EXCLUSIVE_TRANSIENT (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67278&quot;&gt;pr#67278&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds,client: correct last_issue struct fields and consistently send last_issue in cap messages (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61300&quot;&gt;pr#61300&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds/MDSDaemon: unlock &lt;code&gt;mds&#92;_lock&lt;/code&gt; while shutting down Beacon and others (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64886&quot;&gt;pr#64886&lt;/a&gt;, Max Kellermann)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: add MDS asok command for dumping stray directories (&lt;a href=&quot;http://tracker.ceph.com/issues/56442&quot;&gt;issue#56442&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/62517&quot;&gt;pr#62517&lt;/a&gt;, Igor Golikov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: add more debug logs and log events (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65279&quot;&gt;pr#65279&lt;/a&gt;, Xiubo Li)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: check for snapshots on parent snaprealms (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63019&quot;&gt;pr#63019&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: do not schedule quiesce for non-head imported inodes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61857&quot;&gt;pr#61857&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: dump export_ephemeral_random_pin as double (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65162&quot;&gt;pr#65162&lt;/a&gt;, Enrico Bocchi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: dump next_snap when checking dentry corruption (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61977&quot;&gt;pr#61977&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: fix heap-use-after-free in C_Flush_Journal (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65141&quot;&gt;pr#65141&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: Fix invalid access of mdr-&amp;gt;dn[0]&lt;span&gt;&lt;/span&gt;.back() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61451&quot;&gt;pr#61451&lt;/a&gt;, Anoop C S)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: fix snapdiff result fragmentation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65363&quot;&gt;pr#65363&lt;/a&gt;, Igor Fedotov, Md Mahamudur Rahaman Sajib)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: include auth credential in session dump (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65267&quot;&gt;pr#65267&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: nudge log for unstable locks after early reply (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64539&quot;&gt;pr#64539&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: session in the importing state cannot be cleared if an export subtree task is interrupted while the state of importer is acking (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62055&quot;&gt;pr#62055&lt;/a&gt;, Zhansong Gao)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: skip charmap handler check for MDS requests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64954&quot;&gt;pr#64954&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;memory lock issues causing hangs during connection shutdown (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65785&quot;&gt;pr#65785&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/alerts: enforce ssl context to SMTP_SSL (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66141&quot;&gt;pr#66141&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: add &amp;quot;allow_set_io_flusher_fail = true;&amp;quot; to ganesha conf (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60360&quot;&gt;pr#60360&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: allow disabling rgw_run_sync_thread through spec (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61350&quot;&gt;pr#61350&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: fix typo with vrrp_interfaces in keepalive setup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61902&quot;&gt;pr#61902&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: mgr orchestrator module raise exception if there is trailing tab in yaml file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64086&quot;&gt;pr#64086&lt;/a&gt;, Shweta Bhosale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: open ceph-exporter when firewalld is enabled (&lt;a href=&quot;https://github.com/ceph/ceph/pull/59932&quot;&gt;pr#59932&lt;/a&gt;, Redouane Kachach)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: update grafana conf for disconnected environment (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66210&quot;&gt;pr#66210&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: Use a persistent volume to store Loki DB (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66024&quot;&gt;pr#66024&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/DaemonServer: fixed mistype for mgr_osd_messages (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63344&quot;&gt;pr#63344&lt;/a&gt;, Konstantin Shalygin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/DaemonState: Minimise time we hold the DaemonStateIndex lock (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65462&quot;&gt;pr#65462&lt;/a&gt;, Brad Hubbard)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Fixed mirrored image usage info bar (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65492&quot;&gt;pr#65492&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Fixed usage bar for secondary site in rbd mirroing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65928&quot;&gt;pr#65928&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: 72409 : Fixed parsing error in grafana for host overall performance iframe (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64884&quot;&gt;pr#64884&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add &lt;span&gt;&lt;/span&gt;.nvmrc so ci can pick the node version (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64665&quot;&gt;pr#64665&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: allow deletion of non-default zone and zonegroup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66212&quot;&gt;pr#66212&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Blank entry for Storage Capacity in dashboard under Cluster &amp;gt; Expand Cluster &amp;gt; Review (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65706&quot;&gt;pr#65706&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Changing placement of a mds to label - creates a new mds-service, mds&lt;span&gt;&lt;/span&gt;.label (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66884&quot;&gt;pr#66884&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Dashboard nfs export editor rejects ipv6 addresses (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65242&quot;&gt;pr#65242&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix access control permissions for roles (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62454&quot;&gt;pr#62454&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix bucket replication disable (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64776&quot;&gt;pr#64776&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix health popover not showing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66145&quot;&gt;pr#66145&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Fix inline markup warning in API documentation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64269&quot;&gt;pr#64269&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix nvmeof mtls (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65167&quot;&gt;pr#65167&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix zone update API forcing STANDARD storage class (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65620&quot;&gt;pr#65620&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Fixed incorrect snapshot scheduled date for rbd block in GUI (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64880&quot;&gt;pr#64880&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: service creation fails if service name is same as service type (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66480&quot;&gt;pr#66480&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: update teuth_ref hash in api test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66707&quot;&gt;pr#66707&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: use system packages when running tox (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64613&quot;&gt;pr#64613&lt;/a&gt;, Nizamudeen A, Paulo E. Castro)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/Mgr&lt;span&gt;&lt;/span&gt;.cc: clear daemon health metrics instead of removing down/out osd from daemon state (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67527&quot;&gt;pr#67527&lt;/a&gt;, Cory Snyder)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/nfs: make sure sectype is a list when parsed (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63115&quot;&gt;pr#63115&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/nfs: scrape nfs monitoring endpoint (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64081&quot;&gt;pr#64081&lt;/a&gt;, avanthakkar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/orchestrator: allow passing group to apply/add nvmeof commands (&lt;a href=&quot;https://github.com/ceph/ceph/pull/59880&quot;&gt;pr#59880&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/orchestrator: fix nvmeof group parameter for backward compatibility (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67623&quot;&gt;pr#67623&lt;/a&gt;, Kefu Chai, Alexander Indenbaum)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/snap_schedule: correctly fetch mds_max_snaps_per_dir from mds (&lt;a href=&quot;https://github.com/ceph/ceph/pull/59647&quot;&gt;pr#59647&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/telemetry: add stretch cluster data (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66389&quot;&gt;pr#66389&lt;/a&gt;, Naveen Naidu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: add command to get snapshot path (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62918&quot;&gt;pr#62918&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: include group name in subvolume&#39;s pool namespace name (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64205&quot;&gt;pr#64205&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: keep and show clone source info (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64652&quot;&gt;pr#64652&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: make &amp;quot;snapshot getpath&amp;quot; cmd work with v1 and legacy (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63222&quot;&gt;pr#63222&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: avoid explicit dropping of ref (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65006&quot;&gt;pr#65006&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon,cephfs: require confirmation when changing max_mds on unhealthy cluster (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60398&quot;&gt;pr#60398&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/HealthMonitor: avoid MON_DOWN for freshly added Monitor (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67324&quot;&gt;pr#67324&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/MgrMonitor: add a space before &amp;quot;is already disabled&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64686&quot;&gt;pr#64686&lt;/a&gt;, Zehua Qi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/MonMap: Dump addr in backward compatible format (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68323&quot;&gt;pr#68323&lt;/a&gt;, Anoop C S)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/OSDMonitor: call no_reply() on ignored osd alive (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64509&quot;&gt;pr#64509&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon: Track and process pending pings after election (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62924&quot;&gt;pr#62924&lt;/a&gt;, Kamoltat Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monc: synchronize tick() of MonClient with shutdown() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66915&quot;&gt;pr#66915&lt;/a&gt;, Radoslaw Zarzynski)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitor: Enhance historic ops command output and error handling (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64842&quot;&gt;pr#64842&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: add user-agent headers to the urllib (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65475&quot;&gt;pr#65475&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix &amp;quot;In&amp;quot; OSDs in Cluster-Advanced grafana panel&lt;span&gt;&lt;/span&gt;. Also change units from decbytes to bytes wherever used in the panel (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65671&quot;&gt;pr#65671&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix CephPgImbalance alert rule expression (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66829&quot;&gt;pr#66829&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix MTU Mismatch alert rule and expr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65709&quot;&gt;pr#65709&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix rgw_servers filtering in rgw sync overview grafana (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66990&quot;&gt;pr#66990&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: make cluster matcher backward compatible for pre-7&lt;span&gt;&lt;/span&gt;.1 metrics (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66985&quot;&gt;pr#66985&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: upgrade grafana version to 12&lt;span&gt;&lt;/span&gt;.3&lt;span&gt;&lt;/span&gt;.1 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66964&quot;&gt;pr#66964&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;msg/async: Encode message once features are set (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65624&quot;&gt;pr#65624&lt;/a&gt;, Aishwarya Mathuria)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;msg: drain stack before stopping processors to avoid shutdown hang (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64924&quot;&gt;pr#64924&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: compact patch to fix extent map resharding (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66518&quot;&gt;pr#66518&lt;/a&gt;, Igor Fedotov, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: Disable invoking unittest_deferred (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66357&quot;&gt;pr#66357&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: Fix default base size for histogram (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67398&quot;&gt;pr#67398&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: In BlueFS::truncate accept wierd alloc_unit (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63753&quot;&gt;pr#63753&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore:fix bluestore_volume_selection_reserved_factor usage (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66838&quot;&gt;pr#66838&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/PrimaryLogPG: encode an empty data_bl for empty sparse reads (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67356&quot;&gt;pr#67356&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: avoid using moved-from auth_n_errs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66247&quot;&gt;pr#66247&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: do not limit operator-initiated repairs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64915&quot;&gt;pr#64915&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: do not reduce min chunk on preemption (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66236&quot;&gt;pr#66236&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Access/Modify epoch maps under mutex in OSDSuperblock class (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64732&quot;&gt;pr#64732&lt;/a&gt;, Mohit Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: add clear_shards_repaired command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60567&quot;&gt;pr#60567&lt;/a&gt;, Daniel Radjenovic)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: stop scrub_purged_snaps() from ignoring osd_beacon_report_interval (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65584&quot;&gt;pr#65584&lt;/a&gt;, Radoslaw Zarzynski)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSDMonitor: Make sure pcm is initialised (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63804&quot;&gt;pr#63804&lt;/a&gt;, Brad Hubbard)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr/dashboard: Use teuthology&#39;s actual requirements (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65417&quot;&gt;pr#65417&lt;/a&gt;, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr: Fix missing empty lines in mgr_module&lt;span&gt;&lt;/span&gt;.py (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64266&quot;&gt;pr#64266&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr: pin cheroot version in requirements-required&lt;span&gt;&lt;/span&gt;.txt (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65636&quot;&gt;pr#65636&lt;/a&gt;, Nizamudeen A, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/rados: fix the incorrect order of offset,length in WriteOp&lt;span&gt;&lt;/span&gt;.zero (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61894&quot;&gt;pr#61894&lt;/a&gt;, Wang Chao)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephadm: stop cephadm mgr module during cleanup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61905&quot;&gt;pr#61905&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: ignore warning that pg is stuck peering for upgrade jobs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65449&quot;&gt;pr#65449&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: ignore when specific OSD is reported down during upgrade (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60391&quot;&gt;pr#60391&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: override testing kernel with -k option (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61301&quot;&gt;pr#61301&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: randomize configs in &lt;code&gt;fs:thrash:workloads&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60839&quot;&gt;pr#60839&lt;/a&gt;, Venky Shankar, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: update ignorelist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61417&quot;&gt;pr#61417&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rbd/iscsi: ignore MON_DOWN warning in logs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64597&quot;&gt;pr#64597&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: bucket notifications use pynose (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67450&quot;&gt;pr#67450&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: remove hadoop-s3a subsuite (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64668&quot;&gt;pr#64668&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/standalone/scrub: fix &amp;quot;scrubbed in 0ms&amp;quot; in osd-scrub-test&lt;span&gt;&lt;/span&gt;.sh (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64455&quot;&gt;pr#64455&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/standalone: fix/improve bluefs tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67884&quot;&gt;pr#67884&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/krbd: use a standard fixed-1 cluster in unmap subsuite (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64919&quot;&gt;pr#64919&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/upgrade: add &amp;quot;Replacing daemon mds&amp;quot; to ignorelist (&lt;a href=&quot;http://tracker.ceph.com/issues/71615&quot;&gt;issue#71615&lt;/a&gt;, &lt;a href=&quot;http://tracker.ceph.com/issues/50279&quot;&gt;issue#50279&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/65298&quot;&gt;pr#65298&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/backfill_toofull&lt;span&gt;&lt;/span&gt;.py: Fix assert failures with &amp;amp; without compression (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68119&quot;&gt;pr#68119&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/ceph_manager: population must be a sequence (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64747&quot;&gt;pr#64747&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/cephfs/mount: use &#39;ip route&#39; instead &#39;route&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63130&quot;&gt;pr#63130&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/mgr: test_module_selftest set influx hostname to avoid warnings (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67800&quot;&gt;pr#67800&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/rbd_mirror_thrash: don&#39;t use random&lt;span&gt;&lt;/span&gt;.randrange() on floats (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67162&quot;&gt;pr#67162&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/thrashosds-health: whitelist PG_BACKFILL_FULL (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66973&quot;&gt;pr#66973&lt;/a&gt;, Naveen Naidu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/workunit: fix no module named &#39;pipes&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66251&quot;&gt;pr#66251&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks: generalize stuck pg ignorelist entry (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64420&quot;&gt;pr#64420&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks: make rbd_mirror_thrash inherit from ThrasherGreenlet (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67794&quot;&gt;pr#67794&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tests: added 19&lt;span&gt;&lt;/span&gt;.2&lt;span&gt;&lt;/span&gt;.3 to the mix (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65244&quot;&gt;pr#65244&lt;/a&gt;, Yuri Weinstein)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tests: added initial test for &lt;code&gt;client-upgrade-squid-tentacle&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64897&quot;&gt;pr#64897&lt;/a&gt;, Yuri Weinstein)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/valgrind&lt;span&gt;&lt;/span&gt;.supp: make gcm_cipher_internal suppression more resilient (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67280&quot;&gt;pr#67280&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/cephtool: add extra privileges to cephtool script (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63026&quot;&gt;pr#63026&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/fs/misc: remove data pool cleanup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63018&quot;&gt;pr#63018&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rbd: adapt rbd_mirror&lt;span&gt;&lt;/span&gt;.sh for trial nodes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67151&quot;&gt;pr#67151&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rbd: reduce randomized sleeps in live import tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67153&quot;&gt;pr#67153&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rgw: drop netstat usage (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67185&quot;&gt;pr#67185&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: add missing &lt;span&gt;&lt;/span&gt;.qa links (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67497&quot;&gt;pr#67497&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: correct daemon for warning conf (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61304&quot;&gt;pr#61304&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Disable OSD benchmark from running for tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67066&quot;&gt;pr#67066&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: do not fail cephfs QA tests for slow bluestore ops (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61302&quot;&gt;pr#61302&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: do read checks with non-empty file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61858&quot;&gt;pr#61858&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: don&#39;t assume that /dev/sda or /dev/vda is present in unmap&lt;span&gt;&lt;/span&gt;.t (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67076&quot;&gt;pr#67076&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: fix multi-fs tests in test_mds_metrics&lt;span&gt;&lt;/span&gt;.py (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64336&quot;&gt;pr#64336&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore cluster warning (evicting unresponsive &lt;span&gt;&lt;/span&gt;.&lt;span&gt;&lt;/span&gt;.&lt;span&gt;&lt;/span&gt;.) with tasks/mgr-osd-full (&lt;a href=&quot;http://tracker.ceph.com/issues/73278&quot;&gt;issue#73278&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/66126&quot;&gt;pr#66126&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore pg availability/degraded warnings (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61303&quot;&gt;pr#61303&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore variant of down fs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62091&quot;&gt;pr#62091&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore warnings variations (&lt;a href=&quot;https://github.com/ceph/ceph/pull/59617&quot;&gt;pr#59617&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: increase the wait time to prevent check_counter failing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64449&quot;&gt;pr#64449&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: krbd_blkroset&lt;span&gt;&lt;/span&gt;.t: eliminate a race in the open_count test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67074&quot;&gt;pr#67074&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: krbd_rxbounce&lt;span&gt;&lt;/span&gt;.sh: do more reads to generate more errors (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67454&quot;&gt;pr#67454&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: make test_progress atomically capture OSD marked in/out events (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67761&quot;&gt;pr#67761&lt;/a&gt;, Kamoltat (Junior) Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: multiple fixes in test_mirroring&lt;span&gt;&lt;/span&gt;.py (&lt;a href=&quot;https://github.com/ceph/ceph/pull/59829&quot;&gt;pr#59829&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: rbd_mirror_fsx_compare&lt;span&gt;&lt;/span&gt;.sh doesn&#39;t error out as expected (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67796&quot;&gt;pr#67796&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: relocate subvol creation overrides and test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/59922&quot;&gt;pr#59922&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: some test set &lt;code&gt;refuse&#92;_client&#92;_session&lt;/code&gt;, so the cluster log is expected (&lt;a href=&quot;http://tracker.ceph.com/issues/66639&quot;&gt;issue#66639&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/59688&quot;&gt;pr#59688&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: suppress OpenSSL valgrind leaks (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65661&quot;&gt;pr#65661&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: use a larger timeout for kernel_untar_build workunit (&lt;a href=&quot;http://tracker.ceph.com/issues/68855&quot;&gt;issue#68855&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/65280&quot;&gt;pr#65280&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: add cluster fsid to remote meta cache key (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66296&quot;&gt;pr#66296&lt;/a&gt;, Mykola Golub)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: allow incomplete demote snapshot to sync after rbd-mirror daemon restart (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66165&quot;&gt;pr#66165&lt;/a&gt;, VinayBhaskar-V)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: prevent image deletion if remote image is not primary (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64739&quot;&gt;pr#64739&lt;/a&gt;, VinayBhaskar-V)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recent pipeline backports (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65249&quot;&gt;pr#65249&lt;/a&gt;, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Revert &amp;quot;doc: mgr/dashboard: add OAuth2 SSO documentation&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66797&quot;&gt;pr#66797&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Revert &amp;quot;pybind/mgr: Hack around the &#39;ImportError: PyO3 modules may on… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65959&quot;&gt;pr#65959&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw-test: fix bug kafka unexpected keyword argument &#39;expected_sizes&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66033&quot;&gt;pr#66033&lt;/a&gt;, Hoai-Thu Vuong)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/account: bucket acls are not completely migrated once the user is migrated to an account (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65665&quot;&gt;pr#65665&lt;/a&gt;, kchheda3)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/admin: Add max-entries and marker to bucket list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65486&quot;&gt;pr#65486&lt;/a&gt;, Tobias Urdin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/lc: LCOpAction_CurrentExpiration checks mtime for delete markers (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65966&quot;&gt;pr#65966&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/lc: stop using merge_and_store_attrs in remove_bucket_config (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64741&quot;&gt;pr#64741&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/notification: Prevent reserved_size leak by decrementing overhead on commit/abort (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67575&quot;&gt;pr#67575&lt;/a&gt;, Krunal Chheda, kchheda3)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/s3: remove &#39;aws-chunked&#39; from Content-Encoding response (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65219&quot;&gt;pr#65219&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: add metric when send message with kafka and ampq (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65903&quot;&gt;pr#65903&lt;/a&gt;, Hoai-Thu Vuong)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: allow specifying ssl certificate for radosgw-admin operations (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64357&quot;&gt;pr#64357&lt;/a&gt;, Mark Kogan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: beast add ssl hot-reload (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66289&quot;&gt;pr#66289&lt;/a&gt;, Anthony D&#39;Atri, Yuval Lifshitz, Henry Richter)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: check all JWKS for STS (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64936&quot;&gt;pr#64936&lt;/a&gt;, Alex Wojno)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: discard olh&#92;_ attributes when copying object from a versioning-suspended bucket to a versioning-disabled bucket (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65556&quot;&gt;pr#65556&lt;/a&gt;, Jane Zhu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: don&#39;t use merge_and_store_attrs() when recreating a bucket (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64387&quot;&gt;pr#64387&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix &#39;bucket rm --bypass-gc&#39; for copied objects (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66003&quot;&gt;pr#66003&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix &lt;code&gt;radosgw-admin object unlink &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66152&quot;&gt;pr#66152&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix empty storage class on display of multipart uploads (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64313&quot;&gt;pr#64313&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix v2 topics radosgw-admin output in test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64485&quot;&gt;pr#64485&lt;/a&gt;, Yuval Lifshitz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: java s3-tests change setting of JAVA_HOME (&lt;a href=&quot;https://github.com/ceph/ceph/pull/68227&quot;&gt;pr#68227&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: make keystone work without admin token(service ac requirement) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64202&quot;&gt;pr#64202&lt;/a&gt;, Deepika Upadhyay)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW: multi object delete op; skip olh update for all deletes but the last one (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65500&quot;&gt;pr#65500&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: trigger resharding of versioned buckets sooner (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63567&quot;&gt;pr#63567&lt;/a&gt;, J. Eric Ivancich, Casey Bodley, Mykola Golub)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: update keystone repo stable branch to 2024&lt;span&gt;&lt;/span&gt;.2 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66242&quot;&gt;pr#66242&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW:fix obj by multipart upload cant get tag (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66335&quot;&gt;pr#66335&lt;/a&gt;, Raja Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rocky 9/10 support backports (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64780&quot;&gt;pr#64780&lt;/a&gt;, Zack Cerza, John Mulligan, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run-make-check&lt;span&gt;&lt;/span&gt;.sh: handle sudo and command that may not run in container (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65838&quot;&gt;pr#65838&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/ceph_osd, osd: Implement running benchmark during OSD creation - Phase 1 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65523&quot;&gt;pr#65523&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/common: add guidance for mon_warn_pg_not_scrubbed (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62551&quot;&gt;pr#62551&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/pybind/mgr/pg_autoscaler/module&lt;span&gt;&lt;/span&gt;.py: fix &#39;pg_autoscale_mode&#39; output (&lt;a href=&quot;https://github.com/ceph/ceph/pull/59443&quot;&gt;pr#59443&lt;/a&gt;, Kamoltat)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;suites/rados/cephadm: typo in ignore list for still running message (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65444&quot;&gt;pr#65444&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sync build-with-container patches from main (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65844&quot;&gt;pr#65844&lt;/a&gt;, John Mulligan, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tasks/cbt_performance: Tolerate exceptions during performance data up… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66104&quot;&gt;pr#66104&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tasks/cephfs/mount: use 192&lt;span&gt;&lt;/span&gt;.168&lt;span&gt;&lt;/span&gt;.144&lt;span&gt;&lt;/span&gt;.0&lt;span&gt;&lt;/span&gt;.0/20 for brxnet (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63133&quot;&gt;pr#63133&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test-rgw-multisite: create default realm in multisite test script (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65273&quot;&gt;pr#65273&lt;/a&gt;, Shilpa Jagannath)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/common: unittest_fault_injector omits unit-main target (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63981&quot;&gt;pr#63981&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/encoding/readable: Add backward incompat checks (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67392&quot;&gt;pr#67392&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/libcephfs: copy DT_NEEDED entries from input libraries (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63720&quot;&gt;pr#63720&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rbd: remove unit tests about cache tiering (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64589&quot;&gt;pr#64589&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rgw/kafka: fix kafka relase to more recent one (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67994&quot;&gt;pr#67994&lt;/a&gt;, Yuval Lifshitz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test: disable known flaky tests in run-rbd-unit-tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67558&quot;&gt;pr#67558&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test: use json_extract instead of awkward json_tree (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67322&quot;&gt;pr#67322&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The compilation of ISAL compress in the current code depends on the macro HAVE_NASM_X64_AVX2&lt;span&gt;&lt;/span&gt;. However, the macro HAVE_NASM_X64_AVX2 has been removed, resulting in the compression not using ISAL even if the compressor_zlib_isal parameter is set to true (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64815&quot;&gt;pr#64815&lt;/a&gt;, Yao guotao)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tools: handle get-attr as read-only ops in ceph_objectstore_tool (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66538&quot;&gt;pr#66538&lt;/a&gt;, Jaya Prakash)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tools: respect set features when adding addresses (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62061&quot;&gt;pr#62061&lt;/a&gt;, Radosław Zarzyński)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wip trackers 50371 67352 67489 69639 squid (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62472&quot;&gt;pr#62472&lt;/a&gt;, Brad Hubbard, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>From Laminated Pages to Petabytes: Why I&#39;m Joining the Ceph Foundation</title>
    <link href="https://ceph.io/en/news/blog/2026/from-laminated-pages-to-petabytes/" />
    <updated>2026-05-06T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/from-laminated-pages-to-petabytes/</id>
    <author>
      <name>Emmanuel Ameh</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="community" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/from-laminated-pages-to-petabytes/">&lt;p&gt;Hello, Ceph Community! I&#39;m Emmanuel Ameh, and I&#39;m thrilled to be joining as your new Technical Writer. My path into technical writing started during a university internship at a manufacturing plant, where I was handed a problem that, looking back, shaped how I think about documentation to this day. The first piece of documentation I wrote was a one-page troubleshooting guide. It was a simple list of common production-line issues and their fixes, taped to a workstation. But it worked. Operators stopped escalating the same problems, uptime held steady, and that single laminated page did the job of a dozen phone calls.&lt;/p&gt;
&lt;p&gt;I think about that page a lot. It wasn&#39;t elegant. It wasn&#39;t comprehensive. It didn&#39;t win any awards. But it sat exactly where the people who needed it could find it, and it told them exactly what to do. That, to me, is what good documentation looks like, whether it&#39;s protecting a production line or a petabyte-scale storage cluster.&lt;/p&gt;
&lt;p&gt;That experience taught me my core philosophy: good documentation isn&#39;t measured by how thorough it looks. It&#39;s measured by what it lets people &lt;em&gt;do&lt;/em&gt;. A doc that keeps a cluster running is worth more than a hundred pages nobody reads.&lt;/p&gt;
&lt;p&gt;That belief is what brings me to the Ceph community today.&lt;/p&gt;
&lt;h2 id=&quot;my-approach%3A-test-driven-documentation&quot;&gt;My Approach: Test-Driven Documentation &lt;a class=&quot;link-anchor&quot; href=&quot;#my-approach%3A-test-driven-documentation&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My background is in enterprise software and developer advocacy, where I&#39;ve focused on making complex systems feel approachable. I treat usability as seriously as technical accuracy. To me, a &amp;quot;perfectly correct&amp;quot; doc that a user can&#39;t follow is a broken feature.&lt;/p&gt;
&lt;p&gt;I advocate for test-driven documentation. In practice, this means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Validation:&lt;/strong&gt; Running every command and workflow in a clean environment to ensure it actually works. If a tutorial says &amp;quot;run this, and you&#39;ll see X,&amp;quot; then somewhere, on a fresh install, I should be able to run it and see X. If I can&#39;t, neither can the reader.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Friction Logging:&lt;/strong&gt; Identifying the exact moment a newcomer gets stuck and smoothing that path. The most valuable feedback I can get is &amp;quot;I gave up here, and this is why.&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modular Architecture:&lt;/strong&gt; Organizing information so you find the &amp;quot;how-to&amp;quot; immediately, with the &amp;quot;why-it-works&amp;quot; just a click away. Operators in the middle of an incident shouldn&#39;t have to read three pages of theory to recover a degraded cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This matters more for a project like Ceph than for most. When documentation fails for a CRUD app, someone files a support ticket. When documentation fails for a storage system, data is at stake.&lt;/p&gt;
&lt;h2 id=&quot;why-ceph%3F&quot;&gt;Why Ceph? &lt;a class=&quot;link-anchor&quot; href=&quot;#why-ceph%3F&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ceph sits at an incredible intersection where small configuration decisions can have large operational consequences. Ceph is a deeply technical infrastructure that many people depend on. Research labs, cloud providers, hospitals, universities, and enterprises all run on Ceph, and most of their users have no idea. That&#39;s the kind of project I want to work on. Software that is so reliable it becomes invisible.&lt;/p&gt;
&lt;p&gt;I&#39;m also drawn to the Ceph project because it operates in the territory where documentation matters most. Distributed systems are hard. The mental model required to understand placement groups, CRUSH maps, and OSD recovery isn&#39;t something you absorb in an afternoon. The key difference between a confident operator and a terrified one is whether the documentation addressed their specific needs.&lt;/p&gt;
&lt;p&gt;I&#39;ll be honest. Like any mature project, Ceph has a &amp;quot;gravity&amp;quot; of knowledge that can feel intimidating. My goal is to do the translation work: taking the nuanced engineering expertise living in maintainers&#39; heads and shaping it into guidance that someone two time zones away can act on at 2 a.m. when an OSD is degraded.&lt;/p&gt;
&lt;h2 id=&quot;what-i&#39;m-focused-on&quot;&gt;What I&#39;m Focused On &lt;a class=&quot;link-anchor&quot; href=&quot;#what-i&#39;m-focused-on&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In my first few months, I&#39;ll be doing more listening than writing. Specifically, I want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Work through the documentation issue backlog.&lt;/strong&gt; There are a significant number of open documentation issues, and many of them represent real friction that real users have already flagged. Steadily closing them out is one of the highest-leverage things I can do early on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identify the &amp;quot;fall-off cliffs&amp;quot;&lt;/strong&gt; where readers commonly give up, get confused, or start guessing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Talk to contributors and operators&lt;/strong&gt; about what&#39;s missing, what&#39;s outdated, and what they wish existed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build a roadmap&lt;/strong&gt; for documentation improvements that&#39;s transparent, prioritized, and grounded in real user needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You won&#39;t see me rewriting things for the sake of rewriting them. Where the docs already work well, I&#39;ll leave them alone. Where they don&#39;t, I&#39;d rather fix the right problem slowly than the wrong one quickly.&lt;/p&gt;
&lt;h2 id=&quot;how-you-can-help-me&quot;&gt;How You Can Help Me &lt;a class=&quot;link-anchor&quot; href=&quot;#how-you-can-help-me&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Good documentation is a collaborative effort. To help me hit the ground running, I&#39;m looking for three things from you:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Share the &amp;quot;Why&amp;quot;:&lt;/strong&gt; When reviewing a doc change, the reasoning behind a design decision is often more valuable than the decision itself. If you&#39;ve ever explained a feature in a Slack thread or a mailing list reply, that explanation is gold to me.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Highlight the Friction:&lt;/strong&gt; Tell me where the docs let you down. If you had to dive into the source code because a section was confusing, that is where I need to spend my time. The same applies to sections you skip, doubt, or wish were present.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Give Blunt Feedback:&lt;/strong&gt; I&#39;d much rather get a &amp;quot;this is wrong/missing context&amp;quot; review than a polite one. Push back on my drafts. The faster I learn what doesn&#39;t work, the faster the docs get better for everyone.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In return, here&#39;s what you can expect from me. I&#39;ll show my work. I&#39;ll explain my reasoning. I&#39;ll ask questions before making big changes. And I&#39;ll treat the docs the same way I&#39;d want code I depend on to be treated: with care, with tests, and with a clear changelog.&lt;/p&gt;
&lt;h2 id=&quot;let&#39;s-connect&quot;&gt;Let&#39;s Connect &lt;a class=&quot;link-anchor&quot; href=&quot;#let&#39;s-connect&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;m not just here to write; I&#39;m here to learn this project deeply alongside you. Whether you&#39;re spinning up your first cluster or operating at petabyte scale, I want to make sure the documentation supports you. Great infrastructure only reaches its potential when people can actually use it. My job is to close that gap, and I&#39;m looking forward to doing that with the Ceph community.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Find me on Slack/IRC:&lt;/strong&gt; &lt;code&gt;@eameh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flag an issue:&lt;/strong&gt; Tag me in any documentation PRs or issues on GitHub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Send me your war stories:&lt;/strong&gt; If you&#39;ve ever fought the docs and won, I want to know how you did it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I joined the Ceph Foundation because I believe that great infrastructure deserves great documentation, and that the second is what lets the first reach the people who need it. I&#39;m looking forward to building that with you.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>v20.2.1 Tentacle released</title>
    <link href="https://ceph.io/en/news/blog/2026/v20-2-1-tentacle-released/" />
    <updated>2026-04-06T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/v20-2-1-tentacle-released/</id>
    <author>
      <name>Yuri Weinstein</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="release" />
      <category term="reef" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/v20-2-1-tentacle-released/">&lt;p&gt;This is the first minor release in the Tentacle series.
We recommend that all users update to this release.&lt;/p&gt;
&lt;h2 id=&quot;release-date&quot;&gt;Release Date &lt;a class=&quot;link-anchor&quot; href=&quot;#release-date&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;April 06, 2026&lt;/p&gt;
&lt;h2 id=&quot;notable-changes&quot;&gt;Notable Changes &lt;a class=&quot;link-anchor&quot; href=&quot;#notable-changes&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&quot;osd-%2F-bluestore&quot;&gt;OSD / BlueStore &lt;a class=&quot;link-anchor&quot; href=&quot;#osd-%2F-bluestore&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;EC Recovery: Fixed a length calculation bug in erase_after_ro_offset() that caused empty shards to retain data, leading to shard_size &amp;gt;= tobj_size assertion failures when recovering small objects in EC pools.&lt;/li&gt;
&lt;li&gt;BlueFS Volume Selector: Updated the BlueFS volume selector to properly account for file size changes when recovering the WAL in envelope mode.&lt;/li&gt;
&lt;li&gt;BlueFS: Fixed a bug where stat() missed the actual file size update after indexing WAL envelope files.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;monitor-(mon)&quot;&gt;Monitor (mon) &lt;a class=&quot;link-anchor&quot; href=&quot;#monitor-(mon)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fast EC Restrictions: Denied the ability to enable EC optimizations (&amp;quot;fast EC&amp;quot;) for non-4K-aligned chunk sizes. Unaligned chunk sizes handled by fast EC perform poorly and suffer from bugs, so attempts to force this configuration are now rejected.&lt;/li&gt;
&lt;li&gt;Peering: Ensured ceph pg repeer proposes a correctly sized pg temp, as optimized EC cannot cope with mismatched sizes.&lt;/li&gt;
&lt;li&gt;NVMeoF Gateway: Added a new nvme-gw listeners command to display all existing listeners (including auto-listeners) inside a pool/group.&lt;/li&gt;
&lt;li&gt;NVMeoF Failover: Overhauled the NVMeoF Gateway fast-failover logic. Beacon timeouts are now evaluated within prepare_beacon to support shorter intervals, and the mechanism for detecting monitor slowness was improved.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;librbd-%26-rbd-mirror&quot;&gt;librbd &amp;amp; rbd-mirror &lt;a class=&quot;link-anchor&quot; href=&quot;#librbd-%26-rbd-mirror&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RBD: Introduced a new &lt;code&gt;RBD_LOCK_MODE_EXCLUSIVE_TRANSIENT&lt;/code&gt; policy for &lt;code&gt;rbd_lock_acquire()&lt;/code&gt;. This is a low-level interface intended to allow a peer to grab exclusive lock manually for short periods of time with other peers pausing their activity and waiting for the lock to be released rather than instantly aborting I/O and returning an error. It&#39;s possible to switch from &lt;code&gt;RBD_LOCK_MODE_EXCLUSIVE&lt;/code&gt; to &lt;code&gt;RBD_LOCK_MODE_EXCLUSIVE_TRANSIENT&lt;/code&gt; policy and vice versa even if the lock is already held.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ceph-object-gateway-(rgw)&quot;&gt;Ceph Object Gateway (RGW) &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-object-gateway-(rgw)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Multi-Part Operations: Fixed conditional validation handling in MultiWrite, Delete, and MultiDelete workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;mgr%2Fdashboard&quot;&gt;mgr/dashboard &lt;a class=&quot;link-anchor&quot; href=&quot;#mgr%2Fdashboard&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;UI Navigation: Redesigned the main landing page; the &amp;quot;Dashboard&amp;quot; navigation item was renamed to &amp;quot;Overview&amp;quot; and uses a new carbonized productive card layout.&lt;/li&gt;
&lt;li&gt;NVMeoF Management: Added the nvmeof get_subsystems CLI command, fixed JSON output indentation for NVMeoF CLI commands, and reverted the server_addr API parameter back to traddr for consistency.&lt;/li&gt;
&lt;li&gt;Hosts View: Fixed a bug causing the IP addresses of hosts to be hidden on the Hosts page due to an issue with fact merging.&lt;/li&gt;
&lt;li&gt;Forms &amp;amp; Modals: Standardized forms onto the Carbon Design System, including the pools form, service form, multi-site realm token export modal, delete zone modal, and password change forms.&lt;/li&gt;
&lt;li&gt;Form Validation: Generalized form error handling and validations using a new cdValidate directive.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;mgr%2Fcephadm&quot;&gt;mgr/cephadm &lt;a class=&quot;link-anchor&quot; href=&quot;#mgr%2Fcephadm&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Monitoring Stack: Bumped the default container image versions for the monitoring stack: Prometheus to v3.6.0, Node-exporter to v1.9.1, Alertmanager to v0.28.1, and Grafana to v12.2.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;security-changes&quot;&gt;Security Changes &lt;a class=&quot;link-anchor&quot; href=&quot;#security-changes&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Monitoring Stack Images: Updated Prometheus, Alertmanager, and Grafana container image versions, picking up upstream security and stability fixes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;configuration-changes&quot;&gt;Configuration Changes &lt;a class=&quot;link-anchor&quot; href=&quot;#configuration-changes&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;bluefs_check_volume_selector_on_mount&lt;/code&gt;: The previous bluefs_check_volume_selector_on_umount debug setting was renamed and repurposed. It now checks for volume selector inconsistencies on both mount and unmount phases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;mon_nvmeofgw_beacon_grace&lt;/code&gt;: The default grace period before marking a gateway as failed has been reduced from 10 seconds to 7 seconds for faster failover.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nvmeof_mon_client_tick_period&lt;/code&gt;: The default beacon tick interval has been lowered from 2 seconds to 1 second.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;changelog&quot;&gt;Changelog &lt;a class=&quot;link-anchor&quot; href=&quot;#changelog&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[rgw][tentacle] backport of cloud-restore related PRs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65830&quot;&gt;pr#65830&lt;/a&gt;, Soumya Koduri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add normalization and casesensitive options to the subvolume group creation command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65564&quot;&gt;pr#65564&lt;/a&gt;, Venky Shankar, Xavi Hernandez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;auth: msgr2 can return incorrect allowed_modes through AuthBadMethodFrame (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65336&quot;&gt;pr#65336&lt;/a&gt;, Miki Patel)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;backports variants improvements and Dockerfile&lt;span&gt;&lt;/span&gt;.build changes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66010&quot;&gt;pr#66010&lt;/a&gt;, John Mulligan, Zack Cerza)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beacon diff (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66958&quot;&gt;pr#66958&lt;/a&gt;, Leonid Chernin, Samuel Just)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;blk/kernel: bring &amp;quot;bdev_async_discard&amp;quot; config parameter back (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65609&quot;&gt;pr#65609&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;blk/kernel: improve DiscardThread life cycle (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65213&quot;&gt;pr#65213&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bluestore/BlueFS: fix bytes_written_slow counter with aio_write (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66355&quot;&gt;pr#66355&lt;/a&gt;, chungfengz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build-with-container: add argument groups to organize options (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65628&quot;&gt;pr#65628&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build-with-container: build image variants (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65946&quot;&gt;pr#65946&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-mixin: Update monitoring mixin (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65692&quot;&gt;pr#65692&lt;/a&gt;, Aashish Sharma, SuperQ, Ankush Behl)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: fix UdevData initialisation from empty /run/udev/data/* file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65923&quot;&gt;pr#65923&lt;/a&gt;, Matteo Paramatti)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: lvm&lt;span&gt;&lt;/span&gt;.Lvm&lt;span&gt;&lt;/span&gt;.setup_metadata_devices refactor (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65925&quot;&gt;pr#65925&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: support additional dmcrypt params (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65544&quot;&gt;pr#65544&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: use udev data instead of LVM subprocess in get_devices() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65921&quot;&gt;pr#65921&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph_release, doc/dev: update tentacle as stable release (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65988&quot;&gt;pr#65988&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephadm, debian/rules: Use system packages for cephadm bundled dependencies (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66256&quot;&gt;pr#66256&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephadm: fix building rpm-sourced cephadm zippapp on el10 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65292&quot;&gt;pr#65292&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephadm: set default image for tentacle release (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65719&quot;&gt;pr#65719&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephadm: support custom distros by falling back to ID_LIKE (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65696&quot;&gt;pr#65696&lt;/a&gt;, bachmanity1)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-journal-tool: Journal trimming issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65601&quot;&gt;pr#65601&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: fix async/sync I/O stalling due to buffer list exceeding INT_MAX (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65256&quot;&gt;pr#65256&lt;/a&gt;, Dhairya Parmar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: fix dump_mds_requests to valid json format (&lt;a href=&quot;http://tracker.ceph.com/issues/73639&quot;&gt;issue#73639&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/66156&quot;&gt;pr#66156&lt;/a&gt;, haoyixing)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: fix unmount hang after lookups (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65254&quot;&gt;pr#65254&lt;/a&gt;, Dhairya Parmar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: use path supplied in statfs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65132&quot;&gt;pr#65132&lt;/a&gt;, Christopher Hoffman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common/frag: properly convert frag_t to net/store endianness (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66540&quot;&gt;pr#66540&lt;/a&gt;, Patrick Donnelly, Max Kellermann)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common: Allow PerfCounters to return a provided service ID (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65587&quot;&gt;pr#65587&lt;/a&gt;, Adam C. Emerson)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian/control: add iproute2 to build dependencies (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66737&quot;&gt;pr#66737&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian/control: Add libxsimd-dev build dependency for vendored Arrow (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66248&quot;&gt;pr#66248&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian/control: record python3-packaging dependency for ceph-volume (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66590&quot;&gt;pr#66590&lt;/a&gt;, Thomas Lamprecht, Max R. Carrara)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: fix docs for pause_purging and pause_cloning (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66452&quot;&gt;pr#66452&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr/smb: document the &#39;provider&#39; option for smb share (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65617&quot;&gt;pr#65617&lt;/a&gt;, Sachin Prabhu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: change all intra-docs links to use ref (1 of 6) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67043&quot;&gt;pr#67043&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: change all intra-docs links to use ref (2 of 6) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67084&quot;&gt;pr#67084&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Cosmetic improvements and ref links in account&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67064&quot;&gt;pr#67064&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rbd/rbd-config-ref: add clone settings section (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66175&quot;&gt;pr#66175&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: add Tentacle to os recommendations (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66464&quot;&gt;pr#66464&lt;/a&gt;, Casey Bodley, Joseph Mundackal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: fetch releases from main branch (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67002&quot;&gt;pr#67002&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Pin pip to &amp;lt;25&lt;span&gt;&lt;/span&gt;.3 for RTD as a workaround for pybind in admin/doc-read-the-docs&lt;span&gt;&lt;/span&gt;.txt (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66106&quot;&gt;pr#66106&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Remove sphinxcontrib-seqdiag Python package from RTD builds (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67296&quot;&gt;pr#67296&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Update dashboard pending release notes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65984&quot;&gt;pr#65984&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;encode: Fix bad use of DENC_DUMP_PRE (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66565&quot;&gt;pr#66565&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fast failover (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67150&quot;&gt;pr#67150&lt;/a&gt;, leonidc, Leonid Chernin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix multifs auth caps check (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65358&quot;&gt;pr#65358&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Form retains old data when switching from edit to create (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65654&quot;&gt;pr#65654&lt;/a&gt;, pujashahu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generalize error handling for angular forms (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66904&quot;&gt;pr#66904&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;github: pin GH Actions to SHA-1 commit (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65761&quot;&gt;pr#65761&lt;/a&gt;, Ernesto Puerta)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install-deps&lt;span&gt;&lt;/span&gt;.sh: install proper compiler version on Debian/Ubuntu (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66015&quot;&gt;pr#66015&lt;/a&gt;, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install-deps: Replace apt-mirror (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66672&quot;&gt;pr#66672&lt;/a&gt;, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;libcephfs: New feature - add ceph_setlk and ceph_getlk functions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65258&quot;&gt;pr#65258&lt;/a&gt;, Giorgos Kappes)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: fix ExclusiveLock::accept_request() when !is_state_locked() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66628&quot;&gt;pr#66628&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: introduce RBD_LOCK_MODE_EXCLUSIVE_TRANSIENT (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67279&quot;&gt;pr#67279&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds/FSMap: fix join_fscid being incorrectly reset for active MDS during filesystem removal (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65777&quot;&gt;pr#65777&lt;/a&gt;, ethanwu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds/MDSDaemon: unlock &lt;code&gt;mds&#92;_lock&lt;/code&gt; while shutting down Beacon and others (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64885&quot;&gt;pr#64885&lt;/a&gt;, Max Kellermann)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: dump export_ephemeral_random_pin as double (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65163&quot;&gt;pr#65163&lt;/a&gt;, Enrico Bocchi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: fix rank 0 marked damaged if stopping fails after Elid flush (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65778&quot;&gt;pr#65778&lt;/a&gt;, ethanwu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: Fix readdir when osd is full (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65346&quot;&gt;pr#65346&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: fix snapdiff result fragmentation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65362&quot;&gt;pr#65362&lt;/a&gt;, Igor Fedotov, Md Mahamudur Rahaman Sajib)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: include auth credential in session dump (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65255&quot;&gt;pr#65255&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: Return ceph&lt;span&gt;&lt;/span&gt;.dir&lt;span&gt;&lt;/span&gt;.subvolume vxattr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65779&quot;&gt;pr#65779&lt;/a&gt;, Edwin Rodriguez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: skip charmap handler check for MDS requests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64953&quot;&gt;pr#64953&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: wrong snap check for directory with parent snaps (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65259&quot;&gt;pr#65259&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/alerts: enforce ssl context to SMTP_SSL (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66140&quot;&gt;pr#66140&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: Add some new fields to the cephadm NVMEoF spec file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66987&quot;&gt;pr#66987&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: bump monitoring stack versions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65895&quot;&gt;pr#65895&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: Change the default of max hosts per namespace in NVMEoF to 16 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66819&quot;&gt;pr#66819&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: don&#39;t mark nvmeof daemons without pool and group in name as stray (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65594&quot;&gt;pr#65594&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: update grafana conf for disconnected environment (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66209&quot;&gt;pr#66209&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: Use a persistent volume to store Loki DB (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66023&quot;&gt;pr#66023&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/DaemonServer: fixed mistype for mgr_osd_messages (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63345&quot;&gt;pr#63345&lt;/a&gt;, Konstantin Shalygin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/DaemonState: Minimise time we hold the DaemonStateIndex lock (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65464&quot;&gt;pr#65464&lt;/a&gt;, Brad Hubbard)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dasboard : Carbonize pools form (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66789&quot;&gt;pr#66789&lt;/a&gt;, Abhishek Desai, Ankit Kumar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard :  Fixed labels issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66603&quot;&gt;pr#66603&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Carbonize -&amp;gt; Report an issue modal (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66048&quot;&gt;pr#66048&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : fix - about model tooltip issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66276&quot;&gt;pr#66276&lt;/a&gt;, Devika Babrekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : fix - CephFS Authorize Modal Update issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66419&quot;&gt;pr#66419&lt;/a&gt;, Devika Babrekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : fix css for carbon input fields (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65490&quot;&gt;pr#65490&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Fix secure-monitoring-stack creds issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65943&quot;&gt;pr#65943&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Fixed mirrored image usage info bar (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65491&quot;&gt;pr#65491&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Fixed usage bar for secondary site in rbd mirroing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65927&quot;&gt;pr#65927&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Fixed warning icon colour issue with carbon colour (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66271&quot;&gt;pr#66271&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Hide suppressed  alert on landing page (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65737&quot;&gt;pr#65737&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Remove subalerts details for multiple subalerts (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66295&quot;&gt;pr#66295&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard : Skip calls until secure_monitoring_stack is enabled (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65673&quot;&gt;pr#65673&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: --no-group-append default value to False, aligned with old cli&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65678&quot;&gt;pr#65678&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add Archive zone configuration to the Dashboard (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67131&quot;&gt;pr#67131&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add customizations to table-actions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65956&quot;&gt;pr#65956&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add full page tearsheet component (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66892&quot;&gt;pr#66892&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add generic wizard component (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66893&quot;&gt;pr#66893&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add get_subsystem nvme command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66941&quot;&gt;pr#66941&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add indentation to the json output of nvmeof cli commands (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66940&quot;&gt;pr#66940&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add multiple ceph users deletion (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65658&quot;&gt;pr#65658&lt;/a&gt;, Pedro Gonzalez Gomez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add nsid param to ns add command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65677&quot;&gt;pr#65677&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add nsid param to ns list command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65749&quot;&gt;pr#65749&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add overview page and change &#39;Dashboard&#39; to &#39;Overview&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67118&quot;&gt;pr#67118&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add productive card component (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67147&quot;&gt;pr#67147&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add text-label-list component (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66312&quot;&gt;pr#66312&lt;/a&gt;, Pedro Gonzalez Gomez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Adding QAT Compression dropdown on RGW Service form (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66642&quot;&gt;pr#66642&lt;/a&gt;, Devika Babrekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: allow deletion of non-default zone and zonegroup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66211&quot;&gt;pr#66211&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Allow FQDN in Connect Cluster form -&amp;gt; Cluster API URL (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65622&quot;&gt;pr#65622&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Blank entry for Storage Capacity in dashboard under Cluster &amp;gt; Expand Cluster &amp;gt; Review (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65705&quot;&gt;pr#65705&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: bump validator package to address vulnerability (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66227&quot;&gt;pr#66227&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Carbonize - Multisite Zone (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67117&quot;&gt;pr#67117&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Carbonize Administration module &amp;gt; Create Realm/Zone group/zone (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66986&quot;&gt;pr#66986&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Carbonize multisite sync policy forms (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66302&quot;&gt;pr#66302&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: carbonize service form (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66978&quot;&gt;pr#66978&lt;/a&gt;, Pedro Gonzalez Gomez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Carbonize the Change Password Form (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66401&quot;&gt;pr#66401&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: carbonize-delete-zone-modal (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67100&quot;&gt;pr#67100&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: carbonize-delete-zonegroup-modal (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67014&quot;&gt;pr#67014&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: carbonized-multisite-export-realm-token-modal (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66649&quot;&gt;pr#66649&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: change the default max namespace from 4096 to None in subsystem add command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65951&quot;&gt;pr#65951&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Edit user via UI throwing multiple server errors (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66081&quot;&gt;pr#66081&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: empty-data-message (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66902&quot;&gt;pr#66902&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fetch all namespaces in a gateway group (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67140&quot;&gt;pr#67140&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix command alias help message (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65750&quot;&gt;pr#65750&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix dashboard freeze on missing smb permissions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65873&quot;&gt;pr#65873&lt;/a&gt;, Pedro Gonzalez Gomez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix data mismatch in Advance section in Tiering (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65672&quot;&gt;pr#65672&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Fix display of IP address in host page (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67146&quot;&gt;pr#67146&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix icon alignment in navigation header (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66091&quot;&gt;pr#66091&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix misaligned text links on login page (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66052&quot;&gt;pr#66052&lt;/a&gt;, prik73, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix missing schedule interval in rbd API (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65560&quot;&gt;pr#65560&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix multi-cluster route reload logic (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66504&quot;&gt;pr#66504&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix multisite wizard realm configuration mode (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66017&quot;&gt;pr#66017&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix None force param handling in ns add_host so it won&#39;t raise exceptions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65679&quot;&gt;pr#65679&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix ns add and resize commands help (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66939&quot;&gt;pr#66939&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix oauth2-service creation UI error (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66139&quot;&gt;pr#66139&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix prometheus API error when not configured (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65856&quot;&gt;pr#65856&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix rbd form mirroring toggle (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65874&quot;&gt;pr#65874&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix RBD mirror schedule inheritance in pool and image APIs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67107&quot;&gt;pr#67107&lt;/a&gt;, Imran Imtiaz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix smb button and table column (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65657&quot;&gt;pr#65657&lt;/a&gt;, Pedro Gonzalez Gomez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Fix table width expansion on manager module dropdown selection #74089 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66647&quot;&gt;pr#66647&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix the separation between CLI and API only commands (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65781&quot;&gt;pr#65781&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Fix timestamps in APIs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66029&quot;&gt;pr#66029&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix total capacity value in dashboard (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65647&quot;&gt;pr#65647&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix typo in error when gw does not exist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66956&quot;&gt;pr#66956&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix zone update API forcing STANDARD storage class (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65619&quot;&gt;pr#65619&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fixes for quick-bootstrap script (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67040&quot;&gt;pr#67040&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: FS - Attach Command showing undefined for MountData (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65675&quot;&gt;pr#65675&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Group similar alerts (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65493&quot;&gt;pr#65493&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Handle pool creation in tiering local storage class creation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65680&quot;&gt;pr#65680&lt;/a&gt;, Dnyaneshwari, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Maintain sentence case consistency in side nav bar titles (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66050&quot;&gt;pr#66050&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: ns list now support not passing nqn param (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65897&quot;&gt;pr#65897&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: raise exception if both size and rbd_image_size are being passed in ns add (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65816&quot;&gt;pr#65816&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: rbd consistency group and snapshot APIs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66935&quot;&gt;pr#66935&lt;/a&gt;, Imran Imtiaz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Remove illegible texts from the dashboard (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66306&quot;&gt;pr#66306&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: remove not needed &#39;cli_version&#39; field from gw info com… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66942&quot;&gt;pr#66942&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Remove the time dropdown from grafana iframe (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65853&quot;&gt;pr#65853&lt;/a&gt;, Abhishek Desai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: removes nx folder (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67003&quot;&gt;pr#67003&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: rename &#39;Zone Group&#39; labels to &#39;Zonegroup&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66790&quot;&gt;pr#66790&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Rename Alerts tab to All Alerts (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66532&quot;&gt;pr#66532&lt;/a&gt;, Sagar Gopale)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Rename side-nav panel items (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65846&quot;&gt;pr#65846&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: replace bootstrap badges with carbon tags (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66350&quot;&gt;pr#66350&lt;/a&gt;, pujaoshahu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: replace usage or progress bar with carbon meter chart (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66934&quot;&gt;pr#66934&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: rgw accounts form group mode disable option is not working (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66351&quot;&gt;pr#66351&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: server side table rendering improvements (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65828&quot;&gt;pr#65828&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: service creation fails if service name is same as sevice type (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66481&quot;&gt;pr#66481&lt;/a&gt;, Naman Munet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Set max subsystem count to 512 rather than 4096 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66284&quot;&gt;pr#66284&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: support gw get_stats and listener info (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65896&quot;&gt;pr#65896&lt;/a&gt;, Tomer Haskalovitch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Tiering form - Placement Target in Advanced Section (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65653&quot;&gt;pr#65653&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: update teuth_ref hash in api test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66706&quot;&gt;pr#66706&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard:[NFS] add Subvolume Groups and Subvolumes in &amp;quot;Edit NFS Export form&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65650&quot;&gt;pr#65650&lt;/a&gt;, Dnyaneshwari Talwekar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/prometheus: Handle empty/invalid JSON from orch get-security-config (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65906&quot;&gt;pr#65906&lt;/a&gt;, Sunnatillo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/telemetry: add &#39;ec_optimizations&#39; flag to &#39;basic_pool_flags&#39; collection (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65969&quot;&gt;pr#65969&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: handling the failed non-atomic operation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65728&quot;&gt;pr#65728&lt;/a&gt;, Neeraj Pratap Singh)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: keep and show clone source info (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64650&quot;&gt;pr#64650&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/volumes: Keep mon caps if auth key has remaining mds/osd caps (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65262&quot;&gt;pr#65262&lt;/a&gt;, Enrico Bocchi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/volumes: remove unnecessary log error lines from earmark handling (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66991&quot;&gt;pr#66991&lt;/a&gt;, Avan Thakkar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: avoid explicit dropping of ref (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65005&quot;&gt;pr#65005&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr:python: avoid pyo3 errors by running certain cryptographic functions in a child process (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66794&quot;&gt;pr#66794&lt;/a&gt;, Nizamudeen A, John Mulligan, Paulo E. Castro)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/FSCommands: avoid unreachable code triggering compiler warning (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65261&quot;&gt;pr#65261&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/MgrMonitor: add a space before &amp;quot;is already disabled&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64687&quot;&gt;pr#64687&lt;/a&gt;, Zehua Qi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/OSDMonitor&lt;span&gt;&lt;/span&gt;.cc: optionally display availability status in json (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65794&quot;&gt;pr#65794&lt;/a&gt;, Shraddha Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon: Add command &amp;quot;nvme-gw listeners&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66584&quot;&gt;pr#66584&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon: ceph pg repeer should propose a correctly sized pg temp (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66324&quot;&gt;pr#66324&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon: Deny EC optimizations (fast EC) for non-4k-aligned chunk-sizes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67319&quot;&gt;pr#67319&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monc: synchronize tick() of MonClient with shutdown() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66916&quot;&gt;pr#66916&lt;/a&gt;, Radoslaw Zarzynski)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix &amp;quot;In&amp;quot; OSDs in Cluster-Advanced grafana panel&lt;span&gt;&lt;/span&gt;. Also change units from decbytes to bytes wherever used in the panel (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65670&quot;&gt;pr#65670&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix &amp;quot;Total gateway&amp;quot; and &amp;quot;Ceph Health NVMeoF WARNING&amp;quot; grafana graphs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66225&quot;&gt;pr#66225&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix CephPgImbalance alert rule expression (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66828&quot;&gt;pr#66828&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: Fix Filesystem grafana dashboard units (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66018&quot;&gt;pr#66018&lt;/a&gt;, Ankush Behl)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix MTU Mismatch alert rule and expr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65708&quot;&gt;pr#65708&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix rgw_servers filtering in rgw sync overview grafana (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66989&quot;&gt;pr#66989&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: Fixes for smb overview (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66019&quot;&gt;pr#66019&lt;/a&gt;, Ankush Behl)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: make cluster matcher backward compatible for pre-reef metrics (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66984&quot;&gt;pr#66984&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: update NVMeoFTooManyNamespaces to 4096 ns (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67039&quot;&gt;pr#67039&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: upgrade grafana version to 12&lt;span&gt;&lt;/span&gt;.3&lt;span&gt;&lt;/span&gt;.1 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66963&quot;&gt;pr#66963&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nvmeof: refactor beacon timer for exact frequency timing with drift correction (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66536&quot;&gt;pr#66536&lt;/a&gt;, Alexander Indenbaum)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Objecter: respect higher epoch subscription in tick (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66972&quot;&gt;pr#66972&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: cumulative patch to fix extent map resharding and around (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65964&quot;&gt;pr#65964&lt;/a&gt;, Igor Fedotov, Adam Kupczyk, Jaya Prakash)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: fix vselector update after enveloped WAL recovery (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67333&quot;&gt;pr#67333&lt;/a&gt;, Igor Fedotov, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: introduce device type specific allocation policy (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66839&quot;&gt;pr#66839&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/ECUtil: Fix erase_after_ro_offset length calculation and add tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66825&quot;&gt;pr#66825&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/PeeringState: re-evaluate full OSDs while waiting for recovery re… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65701&quot;&gt;pr#65701&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: do not reduce min chunk on preemption (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66214&quot;&gt;pr#66214&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: fix blocked scrub accounting (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66220&quot;&gt;pr#66220&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: new/modified perf counters for scrub preemption (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66234&quot;&gt;pr#66234&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Do not remove objects with divergent logs if only partial writes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66725&quot;&gt;pr#66725&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Fix fast EC truncate to whole stripe (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66543&quot;&gt;pr#66543&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Fix for num_bytes mismatch occurring from snapshot workloads with partial writes in fast_ec (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67137&quot;&gt;pr#67137&lt;/a&gt;, Jon Bailey)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Fix memory leak of ECDummyOp (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66977&quot;&gt;pr#66977&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Fix stats mismatch cluster error seen during scrubbing occasionally (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65793&quot;&gt;pr#65793&lt;/a&gt;, Jon Bailey)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: Relax missing entry assert for partial writes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65860&quot;&gt;pr#65860&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: stop scrub_purged_snaps() from ignoring osd_beacon_report_interval (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65478&quot;&gt;pr#65478&lt;/a&gt;, Radoslaw Zarzynski)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pickup object corpus 20&lt;span&gt;&lt;/span&gt;.2&lt;span&gt;&lt;/span&gt;.0 380 gdbcbbd3f281 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66592&quot;&gt;pr#66592&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;prometheus: Add Cephadm orch ps output metric to prometheus (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66760&quot;&gt;pr#66760&lt;/a&gt;, Ankush Behl)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr/dashboard: dashboard/requirements-lint&lt;span&gt;&lt;/span&gt;.txt: re-pin rsscheck (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66877&quot;&gt;pr#66877&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr/pg_autoscaler: Introduce dynamic threshold to improve scal… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66871&quot;&gt;pr#66871&lt;/a&gt;, Prashant D)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr: pin cheroot version in requirements-required&lt;span&gt;&lt;/span&gt;.txt (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65635&quot;&gt;pr#65635&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/rados: Add list_lockers() and break_lock() to Rados Python interface (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65098&quot;&gt;pr#65098&lt;/a&gt;, Gil Bregman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/multisite: switch to boto3 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67318&quot;&gt;pr#67318&lt;/a&gt;, Shilpa Jagannath, Adam C. Emerson)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: bucket notifications use pynose (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67449&quot;&gt;pr#67449&lt;/a&gt;, Casey Bodley, Adam C. Emerson)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/standalone/availability&lt;span&gt;&lt;/span&gt;.sh: retry after feature is turned on (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67226&quot;&gt;pr#67226&lt;/a&gt;, Shraddha Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/nvmeof: add upgrade sub-suite (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65583&quot;&gt;pr#65583&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/rados/thrash-old-clients: Add OSD warnings to ignore list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65369&quot;&gt;pr#65369&lt;/a&gt;, Naveen Naidu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/rbd/valgrind: don&#39;t hardcode os_type in memcheck&lt;span&gt;&lt;/span&gt;.yaml (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66196&quot;&gt;pr#66196&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/upgrade: add &amp;quot;Replacing daemon mds&amp;quot; to ignorelist (&lt;a href=&quot;http://tracker.ceph.com/issues/71615&quot;&gt;issue#71615&lt;/a&gt;, &lt;a href=&quot;http://tracker.ceph.com/issues/50279&quot;&gt;issue#50279&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/64888&quot;&gt;pr#64888&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites: wait longer before stopping OSDs with valgrind (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63716&quot;&gt;pr#63716&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/ceph_manager: population must be a sequence (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64746&quot;&gt;pr#64746&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/qemu: rocky 10 enablement (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67283&quot;&gt;pr#67283&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/rbd_mirror_thrash: don&#39;t use random&lt;span&gt;&lt;/span&gt;.randrange() on floats (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67163&quot;&gt;pr#67163&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/workunit: fix no module named &#39;pipes&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66250&quot;&gt;pr#66250&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tests: added inital draft for tentacle-p2p (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67765&quot;&gt;pr#67765&lt;/a&gt;, Patrick Donnelly, Yuri Weinstein)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tests: added messages to the whitelist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65645&quot;&gt;pr#65645&lt;/a&gt;, Laura Flores, Yuri Weinstein)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tests: wait for module to be available for connection (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67196&quot;&gt;pr#67196&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/valgrind&lt;span&gt;&lt;/span&gt;.supp: make gcm_cipher_internal suppression more resilient (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67281&quot;&gt;pr#67281&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/nvmeof/basic_tests: use nvme-cli 2&lt;span&gt;&lt;/span&gt;.13 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67285&quot;&gt;pr#67285&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rados: remove cache tier test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65540&quot;&gt;pr#65540&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rbd: adapt rbd_mirror&lt;span&gt;&lt;/span&gt;.sh for trial nodes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67152&quot;&gt;pr#67152&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rbd: reduce randomized sleeps in live import tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67154&quot;&gt;pr#67154&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rbd: use the same qemu-iotests version throughout (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67282&quot;&gt;pr#67282&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/rgw: drop netstat usage (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67184&quot;&gt;pr#67184&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits: add Rocky Linux support to librados tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67091&quot;&gt;pr#67091&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Disable OSD benchmark from running for tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67068&quot;&gt;pr#67068&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: don&#39;t assume that /dev/sda or /dev/vda is present in unmap&lt;span&gt;&lt;/span&gt;.t (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67077&quot;&gt;pr#67077&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Fix test_with_health_warn_with_2_active_MDSs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65260&quot;&gt;pr#65260&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore cluster warning (evicting unresponsive &lt;span&gt;&lt;/span&gt;.&lt;span&gt;&lt;/span&gt;.&lt;span&gt;&lt;/span&gt;.) with tasks/mgr-osd-full (&lt;a href=&quot;http://tracker.ceph.com/issues/73278&quot;&gt;issue#73278&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/66125&quot;&gt;pr#66125&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Improve scalability test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66224&quot;&gt;pr#66224&lt;/a&gt;, Vallari Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: krbd_blkroset&lt;span&gt;&lt;/span&gt;.t: eliminate a race in the open_count test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67075&quot;&gt;pr#67075&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Run RADOS suites with ec optimizations on and off (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65471&quot;&gt;pr#65471&lt;/a&gt;, Jamie Pryde)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: suppress OpenSSL valgrind leaks (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65660&quot;&gt;pr#65660&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: add cluster fsid to remote meta cache key (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66297&quot;&gt;pr#66297&lt;/a&gt;, Mykola Golub)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: allow incomplete demote snapshot to sync after rbd-mirror daemon restart (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66164&quot;&gt;pr#66164&lt;/a&gt;, VinayBhaskar-V)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Relax scrub of shard sizes for upgraded EC pools (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66021&quot;&gt;pr#66021&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Revert &amp;quot;Merge pull request #66958 from Hezko/wip-74413-tentacle&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67750&quot;&gt;pr#67750&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Revert &amp;quot;PrimeryLogPG: don&#39;t accept ops with mixed balance_reads and rwordered flags&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66611&quot;&gt;pr#66611&lt;/a&gt;, Radoslaw Zarzynski)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW | fix conditional Delete, MultiDelete and Put (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65949&quot;&gt;pr#65949&lt;/a&gt;, Ali Masarwa)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW | fix conditional MultiWrite (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67425&quot;&gt;pr#67425&lt;/a&gt;, Ali Masarwa)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/account: bucket acls are not completely migrated once the user is migrated to an account (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65666&quot;&gt;pr#65666&lt;/a&gt;, kchheda3)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/admin: Add max-entries and marker to bucket list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65485&quot;&gt;pr#65485&lt;/a&gt;, Tobias Urdin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/lc: LCOpAction_CurrentExpiration checks mtime for delete markers (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65965&quot;&gt;pr#65965&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/tentacle: clean up &lt;span&gt;&lt;/span&gt;.rgw_op&lt;span&gt;&lt;/span&gt;.cc&lt;span&gt;&lt;/span&gt;.swn file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66161&quot;&gt;pr#66161&lt;/a&gt;, Soumya Koduri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: add metric when send message with kafka and ampq (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65904&quot;&gt;pr#65904&lt;/a&gt;, Hoai-Thu Vuong)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix &#39;bucket rm --bypass-gc&#39; for copied objects (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66004&quot;&gt;pr#66004&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix &lt;code&gt;radosgw-admin object unlink &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66151&quot;&gt;pr#66151&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RGW: multi object delete op; skip olh update for all deletes but the last one (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65488&quot;&gt;pr#65488&lt;/a&gt;, Oguzhan Ozmen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: update keystone repo stable branch to 2024&lt;span&gt;&lt;/span&gt;.2 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66241&quot;&gt;pr#66241&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rpm: default to gcc-toolset-13, not just for crimson (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65752&quot;&gt;pr#65752&lt;/a&gt;, John Mulligan, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;scripts/build/ceph&lt;span&gt;&lt;/span&gt;.spec&lt;span&gt;&lt;/span&gt;.in: fix rhel version checks (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66865&quot;&gt;pr#66865&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/ceph_osd, osd: Implement running benchmark during OSD creation - Phase 1 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65522&quot;&gt;pr#65522&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src: Move the decision to build the ISA plugin to the top level make file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67894&quot;&gt;pr#67894&lt;/a&gt;, Alex Ainscow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sync build-with-container patches from main (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65843&quot;&gt;pr#65843&lt;/a&gt;, John Mulligan, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;systemd services: fix installing ceph-volume@ (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66861&quot;&gt;pr#66861&lt;/a&gt;, Thomas Lamprecht)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tasks/cbt_performance: Tolerate exceptions during performance data up… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66102&quot;&gt;pr#66102&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/ceph_assert&lt;span&gt;&lt;/span&gt;.cc: Disable core files (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66334&quot;&gt;pr#66334&lt;/a&gt;, Bob Ham)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/neorados: Catch timeouts in Poll test (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65605&quot;&gt;pr#65605&lt;/a&gt;, Adam C. Emerson)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test: disable known flaky tests in run-rbd-unit-tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67559&quot;&gt;pr#67559&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tools: handle get-attr as read-only ops in ceph_objectstore_tool (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66537&quot;&gt;pr#66537&lt;/a&gt;, Jaya Prakash)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Ceph Q1 2026 Newsletter</title>
    <link href="https://ceph.io/en/news/blog/2026/Q1-community-newsletter/" />
    <updated>2026-03-31T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/Q1-community-newsletter/</id>
    <author>
      <name>Anthony Middleton</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="community" />
      <category term="governance" />
      <category term="ceph events" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/Q1-community-newsletter/">&lt;p&gt;During this quarter, the Ceph Foundation focused on strengthening its structure by establishing new governance charters, event strategies, and financial plans. To enhance transparency as our community evolves, this newsletter offers a look behind the scenes at these foundational details. Our aim is to update Ceph Community members on the latest developments within the Foundation and to clarify how they can contribute to our ongoing growth. There are several ways to get involved with the foundation. If you have a concept for a Ceph-related project, we encourage you to take the first step toward bringing your idea to the next level and &lt;a href=&quot;https://form.asana.com/?k=7aCHVRhp0x1Ga1nOCXlckQ&amp;amp;d=9283783873717&quot;&gt;submit a funding request&lt;/a&gt; whenever you are ready. Feedback and suggestions will be offered along your journey with Ceph.&lt;/p&gt;
&lt;h2 id=&quot;in-this-issue&quot;&gt;In this issue &lt;a class=&quot;link-anchor&quot; href=&quot;#in-this-issue&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CSC and Ceph Foundation Board Meeting&lt;/li&gt;
&lt;li&gt;Ceph Foundation Charters Approved&lt;/li&gt;
&lt;li&gt;Ceph Governing Board Hiring a Technical Writer&lt;/li&gt;
&lt;li&gt;OVHcloud Spending Update&lt;/li&gt;
&lt;li&gt;Ceph Tech Talks Are Back (Monthly Schedule)&lt;/li&gt;
&lt;li&gt;Upcoming Ceph Days Events&lt;/li&gt;
&lt;li&gt;Ceph Community Slack Upgraded to Pro&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;csc-and-ceph-foundation-board-meeting&quot;&gt;CSC and Ceph Foundation Board Meeting &lt;a class=&quot;link-anchor&quot; href=&quot;#csc-and-ceph-foundation-board-meeting&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Ceph Foundation Board recently hosted the Ceph Steering Committee (CSC) for a collaborative discussion on the current state of the Ceph project and how both sides can work together to support the Ceph community.&lt;/p&gt;
&lt;p&gt;These quarterly meetings are designed to foster communication between the two committees working to build Ceph for the benefit of its users and contributors. The Ceph Board&#39;s goal is to help provide greater context to the CSC as they make decisions and to support their missions, thereby bridging the communication gap. The meeting&#39;s agenda is available &lt;a href=&quot;https://pad.ceph.com/p/foundation-board-csc-meeting&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;key-discussion-areas&quot;&gt;Key discussion areas &lt;a class=&quot;link-anchor&quot; href=&quot;#key-discussion-areas&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Operational complexity&lt;/li&gt;
&lt;li&gt;Friction in contributing and getting reviews&lt;/li&gt;
&lt;li&gt;Fragmented communication&lt;/li&gt;
&lt;li&gt;Unclear strategy in some areas&lt;/li&gt;
&lt;li&gt;Unclear ownership across parts of the ecosystem&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;major-takeaways&quot;&gt;Major takeaways &lt;a class=&quot;link-anchor&quot; href=&quot;#major-takeaways&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The Board will continue to work on closing the gap between developer experience and real-world operator needs, with help from the CSC around failure handling and upgrades.&lt;/li&gt;
&lt;li&gt;Both committees agreed that contributor experience remains a key challenge, with CI complexity and limited reviewer bandwidth identified as the biggest sources of friction, not the contribution process itself.&lt;/li&gt;
&lt;li&gt;The Board and the CSC recognize that perception matters. After hearing feedback that Ceph feels “unwelcoming,” this concern is being addressed and will guide improvements in onboarding and engagement.&lt;/li&gt;
&lt;li&gt;The Ceph Foundation will keep focusing on areas like performance and efficiency. There&#39;s an opportunity to improve how project-wide priorities are communicated, helping to align contributors and ecosystem partners.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;action-items&quot;&gt;Action Items &lt;a class=&quot;link-anchor&quot; href=&quot;#action-items&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ceph Community Manager: Document best practices for large contributions requiring early community engagement&lt;/li&gt;
&lt;li&gt;Ceph Community Manager: Improve discoverability of contributor guidelines and ambassador resources&lt;/li&gt;
&lt;li&gt;CSC: Prepare Q2 response on project priorities, pain points, and foundation delegation opportunities&lt;/li&gt;
&lt;li&gt;Ceph Community Manager: Share contributor feedback data with CSC for deeper analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;road-to-fully-onboarding-into-the-linux-foundation%3A-charters-approved&quot;&gt;Road to Fully Onboarding into the Linux Foundation: Charters Approved &lt;a class=&quot;link-anchor&quot; href=&quot;#road-to-fully-onboarding-into-the-linux-foundation%3A-charters-approved&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ceph now has a clearly defined governance model that separates technical decision-making from funding and community growth, making it easier to understand how decisions are made and how to get involved. This task began in September 2025, when the Ceph Foundation initiated its transition into The Linux Foundation, marking a significant step toward strengthening the long-term sustainability and neutrality of the Ceph project.&lt;/p&gt;
&lt;p&gt;The outcome of this work was the formal approval of two foundational governance frameworks. The Ceph Foundation Charter was established to define how the Foundation raises, allocates, and manages resources in support of the project, while also creating a clear and transparent structure for decision-making, community outreach, and ecosystem development. At its core, the Charter exists to ensure that Ceph operates as a vendor-neutral, community-driven project with sustainable funding and broad industry participation.&lt;/p&gt;
&lt;p&gt;In parallel, the Ceph Technical Charter was approved by the Ceph Steering Committee (CSC), reinforcing the independence of the project’s technical governance and clarifying how technical decisions are made in alignment with the needs of the community.&lt;/p&gt;
&lt;p&gt;Together, these milestones establish a balanced governance model: the Foundation focuses on funding, outreach, and ecosystem growth, while the technical community retains authority over the project’s technical direction and innovation.&lt;/p&gt;
&lt;p&gt;The third and final step of this process, which is currently in the works, involves transferring the Ceph trademark to the Linux Foundation after completing steps one and two.&lt;/p&gt;
&lt;p&gt;Review the Foundation Charter: &lt;a href=&quot;https://cdn.platform.linuxfoundation.org/agreements/cephfoundation.pdf&quot;&gt;https://cdn.platform.linuxfoundation.org/agreements/cephfoundation.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Review the Ceph Technical Charter:&lt;br&gt;
&lt;a href=&quot;https://github.com/ceph/ceph/blob/main/doc/technical-charter.rst&quot;&gt;https://github.com/ceph/ceph/blob/main/doc/technical-charter.rst&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;opportunity%3A-technical-writer-role-open&quot;&gt;Opportunity: Technical Writer Role Open &lt;a class=&quot;link-anchor&quot; href=&quot;#opportunity%3A-technical-writer-role-open&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ceph is investing directly in better documentation, making it easier for new users to adopt and experienced operators to scale, and helping those interested in contributing to Ceph get onboarded for development. The Ceph Technical Committee is actively interviewing a &lt;strong&gt;Technical Writer&lt;/strong&gt; to help improve the quality and accessibility of Ceph documentation.&lt;/p&gt;
&lt;h3 id=&quot;about-the-role&quot;&gt;About the role &lt;a class=&quot;link-anchor&quot; href=&quot;#about-the-role&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Focus on clarity, consistency, and usability of technical content&lt;/li&gt;
&lt;li&gt;Collaborate with developers and contributors across the community&lt;/li&gt;
&lt;li&gt;Help lower the barrier to entry for new users and operators&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-to-get-involved&quot;&gt;How to get involved &lt;a class=&quot;link-anchor&quot; href=&quot;#how-to-get-involved&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Review docs and flag gaps&lt;/li&gt;
&lt;li&gt;Suggest onboarding pain points&lt;/li&gt;
&lt;li&gt;Participate in doc sprints&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;ovhcloud-spending-update&quot;&gt;OVHcloud Spending Update &lt;a class=&quot;link-anchor&quot; href=&quot;#ovhcloud-spending-update&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Ceph Governing Board, with Mark Nelson (Clyso) and Patrick Donnelly (IBM), is working to reduce infrastructure costs. Reports from Mark and Joachim Kraftmayer (Clyso) on OVHcloud show potential for lower monthly hosting expenses. Negotiations with OVHcloud could yield savings, which would be reinvested to boost the Foundation&#39;s support for community programs, events, and infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;current-overview&quot;&gt;Current overview &lt;a class=&quot;link-anchor&quot; href=&quot;#current-overview&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Monthly costs over the past year have ranged between &lt;strong&gt;$5K–$10K USD&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Spending peaked around August and has since been reduced to approximately &lt;strong&gt;$7K/month&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Costs remain higher than earlier in the year, prompting further review&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;key-cost-drivers&quot;&gt;Key cost drivers &lt;a class=&quot;link-anchor&quot; href=&quot;#key-cost-drivers&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A significant portion of expenses comes from storage&lt;/li&gt;
&lt;li&gt;Four 10TB volumes (supporting Chacra nodes), along with associated snapshots, accounted for &lt;strong&gt;over half of total monthly costs (~$4K USD&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;recent-actions&quot;&gt;Recent actions &lt;a class=&quot;link-anchor&quot; href=&quot;#recent-actions&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Unused snapshots and resources have been removed by David Galloway (IBM)&lt;/li&gt;
&lt;li&gt;Ongoing collaboration with OVHcloud to identify additional optimization opportunities&lt;/li&gt;
&lt;li&gt;Further cost savings are expected as usage is refined&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what%E2%80%99s-next&quot;&gt;What’s next &lt;a class=&quot;link-anchor&quot; href=&quot;#what%E2%80%99s-next&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Continued monitoring and cost optimization efforts&lt;/li&gt;
&lt;li&gt;Improved visibility into infrastructure usage and spending&lt;/li&gt;
&lt;li&gt;Updates will be shared in the next newsletter and monthly reports as new efficiencies are realized&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;ceph-tech-talks-are-back&quot;&gt;Ceph Tech Talks Are Back &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-tech-talks-are-back&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ceph.io/en/community/tech-talks/&quot;&gt;Ceph Tech Talks&lt;/a&gt; have officially returned, giving the community a consistent way to learn directly from contributors and share real-world experience. Together, we have discussed the &lt;a href=&quot;https://youtu.be/6ovdJ79AqbM?si=an65PKQI9RyryzTf&quot;&gt;Running Teuthology Outside of the Sepia lab&lt;/a&gt; and &lt;a href=&quot;https://youtu.be/PqniV0qzq68?si=MTxdnp3xq35-QtVv&quot;&gt;How to Get Involved with the Ceph Ambassador Program&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Attend the Tech Talk on April 22, 2026, at 12 pm EST/9 am PDT. Our topic will be, &lt;strong&gt;MAAS as a Backend: Provisioning Infrastructure for Teuthology Suites.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Follow the &lt;a href=&quot;https://ceph.io/en/community/meetups/&quot;&gt;Ceph Community Calendar&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h3 id=&quot;what-to-expect&quot;&gt;What to expect &lt;a class=&quot;link-anchor&quot; href=&quot;#what-to-expect&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Deep dives into real-world Ceph use cases and features&lt;/li&gt;
&lt;li&gt;Presentations led by community members and contributors&lt;/li&gt;
&lt;li&gt;A wide variety of topics for users and developers&lt;/li&gt;
&lt;li&gt;Interactive sessions with opportunities for Q&amp;amp;A&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;get-involved&quot;&gt;Get involved &lt;a class=&quot;link-anchor&quot; href=&quot;#get-involved&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Attend upcoming sessions to stay current&lt;/li&gt;
&lt;li&gt;Submit a proposal to present your work &lt;a href=&quot;https://airtable.com/apphc2dbSP8GuCdor/pagKnGCFWqHvgdCrm/form&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;upcoming-ceph-events-and-the-state-of-cephalocon&quot;&gt;Upcoming Ceph Events and the State of Cephalocon &lt;a class=&quot;link-anchor&quot; href=&quot;#upcoming-ceph-events-and-the-state-of-cephalocon&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Ceph Foundation is evolving its approach to events in order to better serve the global community.&lt;/p&gt;
&lt;p&gt;Instead of focusing all of our resources on a single large event like Cephalocon, the Foundation is now emphasizing &lt;strong&gt;local and regional engagement&lt;/strong&gt; to expand Ceph’s reach into nearby communities and projects. This shift was prompted by new guidelines regarding spending within the foundation. These current fiduciary guidelines still require &lt;strong&gt;broader community support and sponsorship participation&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what%E2%80%99s-changing&quot;&gt;What’s changing &lt;a class=&quot;link-anchor&quot; href=&quot;#what%E2%80%99s-changing&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Increased focus on &lt;a href=&quot;https://ceph.io/en/community/events/&quot;&gt;Ceph Days&lt;/a&gt;, meetups, &lt;a href=&quot;https://events.linuxfoundation.org/&quot;&gt;data-driven conferences&lt;/a&gt;, and community-led events&lt;/li&gt;
&lt;li&gt;Strategic investment in opportunities that introduce Ceph to new audiences&lt;/li&gt;
&lt;li&gt;A shift toward distributed, community-driven engagement&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;important-note-on-future-large-events&quot;&gt;Important note on future large events &lt;a class=&quot;link-anchor&quot; href=&quot;#important-note-on-future-large-events&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The Foundation remains open to hosting large-scale events like Cephalocon&lt;/li&gt;
&lt;li&gt;This ensures alignment with the Foundation’s financial responsibilities while enabling sustainable growth&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-to-get-involved-1&quot;&gt;How to get involved &lt;a class=&quot;link-anchor&quot; href=&quot;#how-to-get-involved-1&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;As part of the Foundation’s financial stewardship under the Linux Foundation, large-scale events require broader community sponsorship and participation&lt;/li&gt;
&lt;li&gt;Organize or support a Ceph event in your region&lt;/li&gt;
&lt;li&gt;Partner with related open source or data infrastructure communities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;need-support%3F&quot;&gt;Need support? &lt;a class=&quot;link-anchor&quot; href=&quot;#need-support%3F&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Community members can submit &lt;a href=&quot;https://form.asana.com/?k=7aCHVRhp0x1Ga1nOCXlckQ&amp;amp;d=9283783873717&quot;&gt;funding requests&lt;/a&gt; to attend or organize events, as well as to support Ceph-related activities&lt;/li&gt;
&lt;li&gt;Requests are reviewed by the Board (approval is not guaranteed)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;upcoming-ceph-days-%E2%80%93-march-2026&quot;&gt;Upcoming Ceph Days – March 2026 &lt;a class=&quot;link-anchor&quot; href=&quot;#upcoming-ceph-days-%E2%80%93-march-2026&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ceph Days continues to grow as the primary way the community connects locally. There were two community-driven events that happened this March:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ceph Days India&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sponsors: IBM and Clyso&lt;/li&gt;
&lt;li&gt;Attendees: 192&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ceph Days Raleigh&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sponsor: IBM&lt;/li&gt;
&lt;li&gt;Attendees: 78&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;why-attend&quot;&gt;Why attend &lt;a class=&quot;link-anchor&quot; href=&quot;#why-attend&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Connect with other Ceph users and contributors&lt;/li&gt;
&lt;li&gt;Learn from real-world deployments and technical sessions&lt;/li&gt;
&lt;li&gt;Grow your local Ceph network&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;get-involved-1&quot;&gt;Get involved &lt;a class=&quot;link-anchor&quot; href=&quot;#get-involved-1&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Share your ideas for a Ceph Days: &lt;a href=&quot;https://pad.ceph.com/p/ceph-days-2026&quot;&gt;https://pad.ceph.com/p/ceph-days-2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Help organize or promote events in your region&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;ceph-community-slack-upgraded-to-pro&quot;&gt;Ceph Community Slack Upgraded to Pro &lt;a class=&quot;link-anchor&quot; href=&quot;#ceph-community-slack-upgraded-to-pro&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The community can now access Slack messages from the last 90 days! The &lt;a href=&quot;https://join.slack.com/t/ceph-storage/shared_invite/zt-3jlvf8f6e-45tyKGpqkkfcC9feAUpgfQ&quot;&gt;Ceph Community Slack&lt;/a&gt; workspace has been upgraded to Slack Pro, courtesy of the Linux Foundation, as part of negotiations requested by the Ceph Board.&lt;/p&gt;
&lt;h3 id=&quot;what-this-means&quot;&gt;What this means &lt;a class=&quot;link-anchor&quot; href=&quot;#what-this-means&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No more losing conversations!&lt;/li&gt;
&lt;li&gt;There is no additional cost to the Ceph community&lt;/li&gt;
&lt;li&gt;A more robust platform for collaboration and communication&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;why-it-matters&quot;&gt;Why it matters &lt;a class=&quot;link-anchor&quot; href=&quot;#why-it-matters&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Supports better knowledge sharing across contributors and users&lt;/li&gt;
&lt;li&gt;Improves accessibility of past discussions and technical insights&lt;/li&gt;
&lt;li&gt;Strengthens real-time collaboration within the community&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;get-involved-2&quot;&gt;Get involved &lt;a class=&quot;link-anchor&quot; href=&quot;#get-involved-2&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Become a moderator for the Ceph Slack workspace&lt;/li&gt;
&lt;li&gt;Email &lt;a href=&quot;amiddleton@linuxfoundation.org&quot;&gt;amiddleton@linuxfoundation.org&lt;/a&gt; for more information&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>v18.2.8 Reef released</title>
    <link href="https://ceph.io/en/news/blog/2026/v18-2-8-reef-released/" />
    <updated>2026-03-20T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/v18-2-8-reef-released/</id>
    <author>
      <name>Yuri Weinstein</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="release" />
      <category term="reef" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/v18-2-8-reef-released/">&lt;p&gt;This is the eighth, and expected to be last, backport release in the Reef series. We recommend that all users update to this release.&lt;/p&gt;
&lt;h2 id=&quot;release-date&quot;&gt;Release Date &lt;a class=&quot;link-anchor&quot; href=&quot;#release-date&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;March 20, 2026&lt;/p&gt;
&lt;h2 id=&quot;known-issues&quot;&gt;Known Issues &lt;a class=&quot;link-anchor&quot; href=&quot;#known-issues&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;During QA for v18.2.8, it was found that there was a bug for upgrades from
Pacific to Reef. Pacific OSDs (and other Ceph daemons) were still using a
deprecated connection feature bit that was adopted to indicate a Reef OSD.
This can cause a OSD_UPGRADE_FINISHED warning before all OSDs are actually
upgraded to Reef. There are no known issues associated with Pacific and Reef
OSDs interoperating where Pacific OSDs are &amp;quot;advertising&amp;quot; Reef compatibility;
however, out of an abundance of caution, we no longer recommend upgrading
from Pacific to Reef directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;security-fixes&quot;&gt;Security Fixes &lt;a class=&quot;link-anchor&quot; href=&quot;#security-fixes&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CephFS Client: A fix was merged to prohibit unprivileged users from modifying
the sgid or suid bits on a file. Previously, unprivileged users were
inadvertently permitted to set these bits if they were the sole bits being
modified.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mgr Alerts: The SMTP SSL context was enforced in the mgr/alerts module to
resolve a security vulnerability (GHSA-xj9f-7g59-m4jx).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;notable-changes&quot;&gt;Notable Changes &lt;a class=&quot;link-anchor&quot; href=&quot;#notable-changes&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RGW (RADOS Gateway):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue where bucket rm --bypass-gc was mistakenly removing head objects instead of tail objects, potentially causing data inconsistencies.&lt;/li&gt;
&lt;li&gt;Fixed rgw-restore-bucket-index to handle objects with leading hyphens and to process versioned buckets correctly.&lt;/li&gt;
&lt;li&gt;Addressed an issue in the msg/async protocol that caused memory locks and hangs during connection shutdown.&lt;/li&gt;
&lt;li&gt;RGW STS: Made JWKS URL verification configurable for AWS compliance via the rgw_enable_jwks_url_verification configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CephFS / MDS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevented the MDS from stalling (up to 5 seconds) during rename/stat workloads by forcing the log to nudge for unstable locks after early replies.&lt;/li&gt;
&lt;li&gt;Fixed cephfs-journal-tool so it no longer incorrectly resets the journal trim position during disaster recovery, which was causing stale journal objects to linger forever in the metadata pool.&lt;/li&gt;
&lt;li&gt;Fixed a bug where ll_walk incorrectly processed absolute paths as relative paths.&lt;/li&gt;
&lt;li&gt;Prevented the ceph fs volume create command from accidentally deleting user-created pools if the command aborted during cleanup.&lt;/li&gt;
&lt;li&gt;MDS Batched Operations: Added a new mds_allow_batched_ops configuration option (default: true) to control whether the MDS can batch lookup or getattr RPCs.&lt;/li&gt;
&lt;li&gt;CephFS Subvolumes: Added the ceph fs subvolume snapshot getpath command to allow users to retrieve the absolute path of a snapshot of a subvolume.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BlueStore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug where the bytes_written_slow performance counter incorrectly reported 0 when using aio_write.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;changelog&quot;&gt;Changelog &lt;a class=&quot;link-anchor&quot; href=&quot;#changelog&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;.github: Fix RTD build retrigger (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63616&quot;&gt;pr#63616&lt;/a&gt;, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;rgw&gt; Ensure the ETag format is consistent with AWS S3 API (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62608&quot;&gt;pr#62608&lt;/a&gt;, Casey Bodley, liubingrun)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[reef] os/bluestore: fix _extend_log seq advance (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61653&quot;&gt;pr#61653&lt;/a&gt;, Pere Diaz Bou)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[reef] RGW backports (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63031&quot;&gt;pr#63031&lt;/a&gt;, Soumya Koduri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[reef] rgw/dbstore: Update bucket attrs as part of put_info() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64488&quot;&gt;pr#64488&lt;/a&gt;, Soumya Koduri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;auth: msgr2 can return incorrect allowed_modes through AuthBadMethodFrame (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65334&quot;&gt;pr#65334&lt;/a&gt;, Miki Patel)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;backport build-with-container patches from main (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65188&quot;&gt;pr#65188&lt;/a&gt;, John Mulligan, Dan Mick, Zack Cerza)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Backport the hybrid_btree2 allocator and prereqs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62539&quot;&gt;pr#62539&lt;/a&gt;, Igor Fedotov, Jrchyang Yu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;backports variants improvements and Dockerfile&lt;span&gt;&lt;/span&gt;.build changes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66012&quot;&gt;pr#66012&lt;/a&gt;, John Mulligan, Zack Cerza)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;blk/kernel: improve DiscardThread life cycle (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65216&quot;&gt;pr#65216&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;blk/KernelDevice: Introduce a cap on the number of pending discards (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62220&quot;&gt;pr#62220&lt;/a&gt;, Joshua Baergen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;blk/kerneldevice: notify_all only required when discard_drain wait for condition (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62152&quot;&gt;pr#62152&lt;/a&gt;, Yite Gu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;blk/kerneldevice: some fix for device discard (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62481&quot;&gt;pr#62481&lt;/a&gt;, Igor Fedotov, Yite Gu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bluestore/BlueFS: fix bytes_written_slow counter with aio_write (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66353&quot;&gt;pr#66353&lt;/a&gt;, chungfengz)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build backports (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65066&quot;&gt;pr#65066&lt;/a&gt;, John Mulligan, Zack Cerza)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build-with-container: add argument groups to organize options (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65630&quot;&gt;pr#65630&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build-with-container: build image variants (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65944&quot;&gt;pr#65944&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;build-with-container: two small fixes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62339&quot;&gt;pr#62339&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-fuse: Improve fuse mount usage message (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61275&quot;&gt;pr#61275&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: allow zapping partitions on multipath devices (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62178&quot;&gt;pr#62178&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: do not convert LVs&#39;s symlink to real path (&lt;a href=&quot;https://github.com/ceph/ceph/pull/59989&quot;&gt;pr#59989&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph-volume: fix regex usage in &lt;code&gt;set&#92;_dmcrypt&#92;_no&#92;_workqueue&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62791&quot;&gt;pr#62791&lt;/a&gt;, Guillaume Abrioux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph&lt;span&gt;&lt;/span&gt;.spec&lt;span&gt;&lt;/span&gt;.in: add man/rgw-gap-list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63999&quot;&gt;pr#63999&lt;/a&gt;, Matan Breizman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ceph&lt;span&gt;&lt;/span&gt;.spec&lt;span&gt;&lt;/span&gt;.in: Remove rgw-restore-bucket-index&lt;span&gt;&lt;/span&gt;.8* from packaging (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64130&quot;&gt;pr#64130&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs,mon: fs rename must require FS to be offline and refuse_client_session to be set (&lt;a href=&quot;http://tracker.ceph.com/issues/66088&quot;&gt;issue#66088&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/61410&quot;&gt;pr#61410&lt;/a&gt;, Rishabh Dave, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-journal-tool: fix segfault during &#39;journal import&#39; from invalid dump file (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62114&quot;&gt;pr#62114&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-journal-tool: Journal trimming issue (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65603&quot;&gt;pr#65603&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-shell: add option to remove xattr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62409&quot;&gt;pr#62409&lt;/a&gt;, Neeraj Pratap Singh)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-top, qa: Remove unnecessary global statements in tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62606&quot;&gt;pr#62606&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs-top: exception when terminal size greater than PAD_WIDTH (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61773&quot;&gt;pr#61773&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cephfs: session tracker accounts for killing sessions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65253&quot;&gt;pr#65253&lt;/a&gt;, Abhishek Lekshmanan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: fix d_reclen for readdir (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61519&quot;&gt;pr#61519&lt;/a&gt;, Xavi Hernandez)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: fixed a bug that read operation hung (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60695&quot;&gt;pr#60695&lt;/a&gt;, Tod Chen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: Handle empty pathnames for &lt;code&gt;ceph&#92;_chownat()&lt;/code&gt; and &lt;code&gt;ceph&#92;_statxat()&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61165&quot;&gt;pr#61165&lt;/a&gt;, Anoop C S)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: ll_walk will process absolute paths as relative (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62500&quot;&gt;pr#62500&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: prohibit unprivileged users from setting sgid/suid bits (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66040&quot;&gt;pr#66040&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;client: return EOPNOTSUPP for fallocate with mode 0 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60657&quot;&gt;pr#60657&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cls/rbd: write image mirror status if state is CREATING (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63236&quot;&gt;pr#63236&lt;/a&gt;, N Balachandran)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cls/rgw: non-versioned listings skip past version suffix (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62591&quot;&gt;pr#62591&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common/options: fix the description of osd_max_scrubs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62378&quot;&gt;pr#62378&lt;/a&gt;, Satoru Takeuchi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common/options: fix typo in description (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64218&quot;&gt;pr#64218&lt;/a&gt;, Lorenz Bausch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;common/pick_address: Add IPv6 support to is_addr_in_subnet (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62814&quot;&gt;pr#62814&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;container: small container image improvements (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62345&quot;&gt;pr#62345&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;crush: use std::vector instead of variable length arrays (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62014&quot;&gt;pr#62014&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian/control: add iproute2 to build dependencies (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66738&quot;&gt;pr#66738&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;debian: package mgr/rgw in ceph-mgr-modules-core (&lt;a href=&quot;https://github.com/ceph/ceph/pull/57874&quot;&gt;pr#57874&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/architecture: remove sentence (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61615&quot;&gt;pr#61615&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm/services: Add mention of --zap for OSD removal (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62444&quot;&gt;pr#62444&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm/services: Correct indentation in osd&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62428&quot;&gt;pr#62428&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm/services: Fix formatting in osd&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62811&quot;&gt;pr#62811&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm/services: improve rgw&lt;span&gt;&lt;/span&gt;.rst and snmp-gateway&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62695&quot;&gt;pr#62695&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm: Add admonition re restarting an OSD service (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62797&quot;&gt;pr#62797&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm: Add PG autoscaler advice to upgrade&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62380&quot;&gt;pr#62380&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm: clarify &amp;quot;Monitoring OSD State&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61665&quot;&gt;pr#61665&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm: Correct formatting in upgrade&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63148&quot;&gt;pr#63148&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm: correct markup in rgw&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63074&quot;&gt;pr#63074&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm: improve &amp;quot;Maintenance Mode&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63496&quot;&gt;pr#63496&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephadm: s/confg/config/ (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62645&quot;&gt;pr#62645&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: add a note about estimated replay completion time (&lt;a href=&quot;http://tracker.ceph.com/issues/71629&quot;&gt;issue#71629&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/65058&quot;&gt;pr#65058&lt;/a&gt;, Venky Shankar, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: correct ill-formatted command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63502&quot;&gt;pr#63502&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: correct reference structure in fs-volumes&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63545&quot;&gt;pr#63545&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: Cosmetic changes and small fixes in cephfs-mirroring&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63468&quot;&gt;pr#63468&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: document first-damage&lt;span&gt;&lt;/span&gt;.py (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63978&quot;&gt;pr#63978&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit ceph-dokan&lt;span&gt;&lt;/span&gt;.rst (1 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64736&quot;&gt;pr#64736&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit ceph-dokan&lt;span&gt;&lt;/span&gt;.rst (2 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64760&quot;&gt;pr#64760&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit ceph-dokan&lt;span&gt;&lt;/span&gt;.rst (3 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64786&quot;&gt;pr#64786&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit disaster-recovery&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64645&quot;&gt;pr#64645&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit disaster-recovery&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64609&quot;&gt;pr#64609&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65380&quot;&gt;pr#65380&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65094&quot;&gt;pr#65094&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65091&quot;&gt;pr#65091&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65126&quot;&gt;pr#65126&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65123&quot;&gt;pr#65123&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65097&quot;&gt;pr#65097&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65078&quot;&gt;pr#65078&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65088&quot;&gt;pr#65088&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65047&quot;&gt;pr#65047&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65044&quot;&gt;pr#65044&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65041&quot;&gt;pr#65041&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65037&quot;&gt;pr#65037&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65026&quot;&gt;pr#65026&lt;/a&gt;, Zac Dover, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64904&quot;&gt;pr#64904&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64901&quot;&gt;pr#64901&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64879&quot;&gt;pr#64879&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64872&quot;&gt;pr#64872&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64853&quot;&gt;pr#64853&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: edit troubleshooting&lt;span&gt;&lt;/span&gt;.rst (Slow MDS) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65201&quot;&gt;pr#65201&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: Improve mount-using-fuse&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64473&quot;&gt;pr#64473&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: link section for pausing async threads in section for (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62875&quot;&gt;pr#62875&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: Update deprecation notice in experimental-features&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63949&quot;&gt;pr#63949&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/cephfs: Update quota&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65083&quot;&gt;pr#65083&lt;/a&gt;, Jannis Speer, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/cephfs-mirroring: edit file 1 of x (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63299&quot;&gt;pr#63299&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/cephfs-mirroring: edit file 2 of x (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63274&quot;&gt;pr#63274&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/cephfs-mirroring: edit file 3 of x (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63548&quot;&gt;pr#63548&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/cephfs-mirroring: edit file 4 of x (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63661&quot;&gt;pr#63661&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/config: Document how to use :confval: directive for config op… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64167&quot;&gt;pr#64167&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/release-process&lt;span&gt;&lt;/span&gt;.rst: document new Jenkins job for containers (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62613&quot;&gt;pr#62613&lt;/a&gt;, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev/release-process&lt;span&gt;&lt;/span&gt;.rst: release builds cannot build containers (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61818&quot;&gt;pr#61818&lt;/a&gt;, Dan Mick, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev: Debuggging with gdb (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63994&quot;&gt;pr#63994&lt;/a&gt;, Matan Breizman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev: update link to backporter manual (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63991&quot;&gt;pr#63991&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/dev:update blkin&lt;span&gt;&lt;/span&gt;.rst doc for lttng trace (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65212&quot;&gt;pr#65212&lt;/a&gt;, lizhipeng)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/glossary: s/OMAP/omap/ (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63738&quot;&gt;pr#63738&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/man/8: Improve mount&lt;span&gt;&lt;/span&gt;.ceph&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65184&quot;&gt;pr#65184&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr/ceph_api: edit index&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63198&quot;&gt;pr#63198&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr/crash&lt;span&gt;&lt;/span&gt;.rst: remove outdated module enabling instructions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64285&quot;&gt;pr#64285&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr/dashboard_plugins: edit feature_toggles&lt;span&gt;&lt;/span&gt;.inc&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63705&quot;&gt;pr#63705&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit administrator&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63208&quot;&gt;pr#63208&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit alerts&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63201&quot;&gt;pr#63201&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit cli_api (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63744&quot;&gt;pr#63744&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit cli_api&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63690&quot;&gt;pr#63690&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit crash&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63539&quot;&gt;pr#63539&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit dashboard&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63316&quot;&gt;pr#63316&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit debug&lt;span&gt;&lt;/span&gt;.inc&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63394&quot;&gt;pr#63394&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit diskpredictor&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63424&quot;&gt;pr#63424&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit feature_toggles&lt;span&gt;&lt;/span&gt;.inc&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63397&quot;&gt;pr#63397&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit hello&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63508&quot;&gt;pr#63508&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit influx&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63455&quot;&gt;pr#63455&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit insights&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63511&quot;&gt;pr#63511&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit iostat&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63681&quot;&gt;pr#63681&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit iostat&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63514&quot;&gt;pr#63514&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit localpool&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63670&quot;&gt;pr#63670&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit localpool&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63551&quot;&gt;pr#63551&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit mds_autoscaler&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63493&quot;&gt;pr#63493&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit modules&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63667&quot;&gt;pr#63667&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit modules&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63578&quot;&gt;pr#63578&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit motd&lt;span&gt;&lt;/span&gt;.inc&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63403&quot;&gt;pr#63403&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit nfs&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63664&quot;&gt;pr#63664&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit nfs&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63581&quot;&gt;pr#63581&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit orchestrator&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63584&quot;&gt;pr#63584&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit progress&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63658&quot;&gt;pr#63658&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit progress&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63587&quot;&gt;pr#63587&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit prometheus&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63590&quot;&gt;pr#63590&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit rgw&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63593&quot;&gt;pr#63593&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telegraf&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63612&quot;&gt;pr#63612&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry (1 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63769&quot;&gt;pr#63769&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry (2 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63772&quot;&gt;pr#63772&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry (3 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63775&quot;&gt;pr#63775&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry (4 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63778&quot;&gt;pr#63778&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64344&quot;&gt;pr#64344&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63810&quot;&gt;pr#63810&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63906&quot;&gt;pr#63906&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63865&quot;&gt;pr#63865&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63693&quot;&gt;pr#63693&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: edit telemetry&lt;span&gt;&lt;/span&gt;.rst (lines 300-400) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63868&quot;&gt;pr#63868&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: Improve prometheus&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62931&quot;&gt;pr#62931&lt;/a&gt;, Zac Dover, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/mgr: Small improvements in rgw&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63626&quot;&gt;pr#63626&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/monitoring: correct list formatting (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63542&quot;&gt;pr#63542&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/configuration/bluestore-config-ref: Fix lowcase typo (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62261&quot;&gt;pr#62261&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/configuration/bluestore-config-ref: Fix lowercase typos (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62291&quot;&gt;pr#62291&lt;/a&gt;, Dan van der Ster)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/configuration: Correct admonition in ceph-conf&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62621&quot;&gt;pr#62621&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/configuration: Improve ceph-conf&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63943&quot;&gt;pr#63943&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/configuration: Mention show-with-defaults and ceph-conf (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65207&quot;&gt;pr#65207&lt;/a&gt;, Niklas Hambüchen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/configuration: Small improvements in ceph-conf&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64288&quot;&gt;pr#64288&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations/stretch-mode: Improve doc (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61654&quot;&gt;pr#61654&lt;/a&gt;, Kamoltat Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Actually mention &lt;code&gt;upmap&#92;_max&#92;_deviation&lt;/code&gt; setting … (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64119&quot;&gt;pr#64119&lt;/a&gt;, Niklas Hambüchen)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: add kernel client procedure to read balancer documentation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65440&quot;&gt;pr#65440&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Add settings advice to balancer&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63536&quot;&gt;pr#63536&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Additional improvements to placement-groups&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63650&quot;&gt;pr#63650&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Address suggestions for stretch-mode&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63850&quot;&gt;pr#63850&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: edit cache-tiering&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63696&quot;&gt;pr#63696&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Improve erasure-code&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62574&quot;&gt;pr#62574&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Improve health-checks&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65239&quot;&gt;pr#65239&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Improve placement-groups&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63647&quot;&gt;pr#63647&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/operations: Improve stretch-mode&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63816&quot;&gt;pr#63816&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/ops: add caps restore command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64322&quot;&gt;pr#64322&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/ops: edit cache-tiering&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64497&quot;&gt;pr#64497&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados/ops: edit cache-tiering&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63831&quot;&gt;pr#63831&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: document section absent in release &amp;lt; T (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64868&quot;&gt;pr#64868&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: edit balancer&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63684&quot;&gt;pr#63684&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: edit ops/user-management&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63893&quot;&gt;pr#63893&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: enhance &amp;quot;pools&lt;span&gt;&lt;/span&gt;.rst&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63862&quot;&gt;pr#63862&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: improve markup in cache-tiering&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63505&quot;&gt;pr#63505&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: remove clonedata command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64394&quot;&gt;pr#64394&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: repair short underline (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65138&quot;&gt;pr#65138&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: s/enpty/empty/ in pgcalc doc (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63499&quot;&gt;pr#63499&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rados: Update mClock doc on steps to override OSD IOPS capacity config (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63072&quot;&gt;pr#63072&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw /notifications: fix topic details (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62405&quot;&gt;pr#62405&lt;/a&gt;, Laimis Juzeliunas)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw/admin&lt;span&gt;&lt;/span&gt;.rst: explain bucket and uid flags for bucket quota (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64022&quot;&gt;pr#64022&lt;/a&gt;, Hyun Jin Kim)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw/cloud-transition: fix details (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62835&quot;&gt;pr#62835&lt;/a&gt;, Laimis Juzeliunas)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw/s3: Document delete-if-unmodified-since (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64316&quot;&gt;pr#64316&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: add &amp;quot;persistent_topic_size&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64140&quot;&gt;pr#64140&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: add rgw_enable_lc_threads &amp;amp; rgw_enable_gc_threads (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64339&quot;&gt;pr#64339&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Cosmetic and formatting improvements in vault&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63230&quot;&gt;pr#63230&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Cosmetic improvements in cloud-transition&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63449&quot;&gt;pr#63449&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Cosmetic improvements in dynamicresharding&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64059&quot;&gt;pr#64059&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: edit &amp;quot;Lifecycle Settings&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64548&quot;&gt;pr#64548&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: edit cloud-transition (1 of x) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64025&quot;&gt;pr#64025&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: edit config-ref&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64648&quot;&gt;pr#64648&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: edit metrics&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63813&quot;&gt;pr#63813&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: edit sentence in metrics&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63701&quot;&gt;pr#63701&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Fix RST syntax rendeded as text in oidc&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62990&quot;&gt;pr#62990&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: improve &amp;quot;pubsub_push_pending&amp;quot; info (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64114&quot;&gt;pr#64114&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Improve and more consistent formatting (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62910&quot;&gt;pr#62910&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Improve cloud-restore and cloud-transition (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62667&quot;&gt;pr#62667&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Improve formatting in layout&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63000&quot;&gt;pr#63000&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Improve layout&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62450&quot;&gt;pr#62450&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Improve rgw-cache&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64476&quot;&gt;pr#64476&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Promptify CLI commands and fix formatting in layout&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63916&quot;&gt;pr#63916&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Promptify CLI, cosmetic fixes (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62857&quot;&gt;pr#62857&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: remove &amp;quot;pubsub_event_lost&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64127&quot;&gt;pr#64127&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: remove &amp;quot;pubsub_event_triggered&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64156&quot;&gt;pr#64156&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: remove cloud-restore from reef (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65638&quot;&gt;pr#65638&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: update aws specification link (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64096&quot;&gt;pr#64096&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/radosgw: Use ref for hyperlinking to multisite (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63312&quot;&gt;pr#63312&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rbd/rbd-config-ref: add clone settings section (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66173&quot;&gt;pr#66173&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rbd: add mirroring troubleshooting info (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63847&quot;&gt;pr#63847&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rgw: add man documentation for the rgw-gap-list tool (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63997&quot;&gt;pr#63997&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rgw: clarify path-style vs virtual-hosted-style access (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61987&quot;&gt;pr#61987&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rgw: document Admin and System Users (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62882&quot;&gt;pr#62882&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rgw: remove metrics&lt;span&gt;&lt;/span&gt;.rst which did not apply to reef (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66320&quot;&gt;pr#66320&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/rgw: use &#39;confval&#39; directive to render sts config options (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63442&quot;&gt;pr#63442&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/src/common/options: mgr&lt;span&gt;&lt;/span&gt;.yaml&lt;span&gt;&lt;/span&gt;.in edit (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63765&quot;&gt;pr#63765&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/src: edit osd&lt;span&gt;&lt;/span&gt;.yaml&lt;span&gt;&lt;/span&gt;.in (osd_deep_scrub_interval_cv) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63956&quot;&gt;pr#63956&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/start: edit documenting-ceph&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63653&quot;&gt;pr#63653&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc/start: edit documenting-ceph&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63708&quot;&gt;pr#63708&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: add note admonitions in two files (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64493&quot;&gt;pr#64493&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Clarify the status of MS Windows client support (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64482&quot;&gt;pr#64482&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: do not depend on typed-ast (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64400&quot;&gt;pr#64400&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Document ceph-mgr module configuration options (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64397&quot;&gt;pr#64397&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: fix formatting in cephfs_mirror dev doc (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63251&quot;&gt;pr#63251&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fix links to mClock config reference (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64798&quot;&gt;pr#64798&lt;/a&gt;, Pierre Riteau)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fix missing blank line Sphinx warnings (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63338&quot;&gt;pr#63338&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fix unterminated inline literal in ceph-conf&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64171&quot;&gt;pr#64171&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fixed a spelling error (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64148&quot;&gt;pr#64148&lt;/a&gt;, &lt;a href=&quot;http://Instelligence.io&quot;&gt;Instelligence.io&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Fixes a typo in balancer operations (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65740&quot;&gt;pr#65740&lt;/a&gt;, Tyler Brekke)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: mgr/dashboard: add OAuth2 SSO documentation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64034&quot;&gt;pr#64034&lt;/a&gt;, Pedro Gonzalez Gomez, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Pin pip to &amp;lt;25&lt;span&gt;&lt;/span&gt;.3 for RTD as a workaround for pybind in admin/doc-read-the-docs&lt;span&gt;&lt;/span&gt;.txt (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66118&quot;&gt;pr#66118&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Remove sphinxcontrib-seqdiag Python package from RTD builds (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67528&quot;&gt;pr#67528&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Revert &amp;quot;doc/radosgw: add &amp;quot;persistent_topic_size&amp;quot;&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64179&quot;&gt;pr#64179&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Revert &amp;quot;doc: mgr/dashboard: add OAuth2 SSO documentation&amp;quot; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66796&quot;&gt;pr#66796&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: Revert doc/cephadm: correct markup in rgw&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66971&quot;&gt;pr#66971&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: src/pybind/mgr/dashboard: edit HACKING&lt;span&gt;&lt;/span&gt;.rst (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63697&quot;&gt;pr#63697&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: update cephfs-journal-tool docs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63109&quot;&gt;pr#63109&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doc: update mgr modules notify_types (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64531&quot;&gt;pr#64531&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fix: the RGW crash caused by special characters (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64052&quot;&gt;pr#64052&lt;/a&gt;, mertsunacoglu, Emin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;github: pin GH Actions to SHA-1 commit (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65759&quot;&gt;pr#65759&lt;/a&gt;, Ernesto Puerta)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handle failures in metric parsing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65595&quot;&gt;pr#65595&lt;/a&gt;, Anmol Babu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install-deps&lt;span&gt;&lt;/span&gt;.sh: install proper compiler version on Debian/Ubuntu (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66014&quot;&gt;pr#66014&lt;/a&gt;, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install-deps: Replace apt-mirror (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66669&quot;&gt;pr#66669&lt;/a&gt;, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd/cache/pwl: fix memory leak in SyncPoint persist context cleanup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64093&quot;&gt;pr#64093&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd/migration/QCOWFormat: don&#39;t complete read_clusters() inline (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64195&quot;&gt;pr#64195&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: disallow &amp;quot;rbd trash mv&amp;quot; if image is in a group (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62967&quot;&gt;pr#62967&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: images aren&#39;t closed in group_snap&#92;_*_by_record() on error (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64620&quot;&gt;pr#64620&lt;/a&gt;, Miki Patel)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;librbd: respect rbd_default_snapshot_quiesce_mode in group_snap_create() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62962&quot;&gt;pr#62962&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LogMonitor: set no_reply for forward MLog commands (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62212&quot;&gt;pr#62212&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds/Beacon: wake up the thread in shutdown() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61513&quot;&gt;pr#61513&lt;/a&gt;, Max Kellermann)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: add an asok command to dump export states (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61512&quot;&gt;pr#61512&lt;/a&gt;, Zhansong Gao)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: add more debug logs and log events (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61518&quot;&gt;pr#61518&lt;/a&gt;, Xiubo Li)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: do not process client metrics message with fast dispatch (&lt;a href=&quot;http://tracker.ceph.com/issues/68865&quot;&gt;issue#68865&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/61339&quot;&gt;pr#61339&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: drop client metrics during recovery (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61299&quot;&gt;pr#61299&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: dump next_snap when checking dentry corruption (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61978&quot;&gt;pr#61978&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: Fix invalid access of mdr-&amp;gt;dn[0]&lt;span&gt;&lt;/span&gt;.back() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61516&quot;&gt;pr#61516&lt;/a&gt;, Anoop C S)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: Fix invalid access of mdr-&amp;gt;dn[0]&lt;span&gt;&lt;/span&gt;.back() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61450&quot;&gt;pr#61450&lt;/a&gt;, Anoop C S)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: Fix readdir when osd is full (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65348&quot;&gt;pr#65348&lt;/a&gt;, Kotresh HR)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: fix snapdiff result fragmentation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65364&quot;&gt;pr#65364&lt;/a&gt;, Igor Fedotov, Md Mahamudur Rahaman Sajib)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: nudge log for unstable locks after early reply (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64540&quot;&gt;pr#64540&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: prevent duplicate wrlock acquisition for a single request (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61839&quot;&gt;pr#61839&lt;/a&gt;, Xiubo Li, Sunnatillo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: session in the importing state cannot be cleared if an export subtree task is interrupted while the state of importer is acking (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61514&quot;&gt;pr#61514&lt;/a&gt;, Zhansong Gao)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mds: use SimpleLock::WAIT_ALL for wait mask (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67495&quot;&gt;pr#67495&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;memory lock issues causing hangs during connection shutdown (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65786&quot;&gt;pr#65786&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/alerts: enforce ssl context to SMTP_SSL (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66142&quot;&gt;pr#66142&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/cephadm: Fix unfound progress events (&lt;a href=&quot;https://github.com/ceph/ceph/pull/58450&quot;&gt;pr#58450&lt;/a&gt;, Prashant D)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/DaemonState: Minimise time we hold the DaemonStateIndex lock (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65463&quot;&gt;pr#65463&lt;/a&gt;, Brad Hubbard)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: adapt service creation form to support nvmeof creation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63304&quot;&gt;pr#63304&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add &lt;span&gt;&lt;/span&gt;.nvmrc so ci can pick the node version (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64666&quot;&gt;pr#64666&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Add ceph_daemon filter to rgw overview grafana panel queries (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62268&quot;&gt;pr#62268&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: add prometheus read permission to cluster_mgr role (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62651&quot;&gt;pr#62651&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Dashboard not showing Object/Overview correctly (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62664&quot;&gt;pr#62664&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix access control permissions for roles (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62455&quot;&gt;pr#62455&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Fix empty ceph version in GET api/hosts (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62730&quot;&gt;pr#62730&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: Fix inline markup warning in API documentation (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64270&quot;&gt;pr#64270&lt;/a&gt;, Kefu Chai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix make check tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63186&quot;&gt;pr#63186&lt;/a&gt;, Afreen Misbah)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: fix zone update API forcing STANDARD storage class (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65621&quot;&gt;pr#65621&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: show non default realm sync status in rgw overview page (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65002&quot;&gt;pr#65002&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/dashboard: use system packages when running tox (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64612&quot;&gt;pr#64612&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/nfs: validate path when modifying cephfs export (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62278&quot;&gt;pr#62278&lt;/a&gt;, Dhairya Parmar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/rbd_support: always parse interval and start_time in Schedules::remove() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62964&quot;&gt;pr#62964&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/snap_schedule: fix typo in error message during retention add (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65295&quot;&gt;pr#65295&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/snap_schedule: handle volume delete (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61187&quot;&gt;pr#61187&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: add command to get snapshot path (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62917&quot;&gt;pr#62917&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: don&#39;t delete user-created pool in &amp;quot;volume create&amp;quot; command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63069&quot;&gt;pr#63069&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/vol: print proper message when subvolume metadata filename is too long (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62050&quot;&gt;pr#62050&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/volumes: allow disabling async job threads (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62436&quot;&gt;pr#62436&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/volumes: fix dangling symlink in clone index (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62109&quot;&gt;pr#62109&lt;/a&gt;, Neeraj Pratap Singh)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/volumes: Keep mon caps if auth key has remaining mds/osd caps (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65297&quot;&gt;pr#65297&lt;/a&gt;, Enrico Bocchi)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr/volumes: periodically check for async work (&lt;a href=&quot;http://tracker.ceph.com/issues/61867&quot;&gt;issue#61867&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/61230&quot;&gt;pr#61230&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: add status command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62505&quot;&gt;pr#62505&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: allow disabling always-on modules (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60563&quot;&gt;pr#60563&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mgr: process map before notifying clients (&lt;a href=&quot;https://github.com/ceph/ceph/pull/57065&quot;&gt;pr#57065&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon [stretch mode]: support disable_stretch_mode &amp;amp; qa/workunits/mon: ensure election strategy is &amp;quot;connectivity&amp;quot; for stretch mode (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60630&quot;&gt;pr#60630&lt;/a&gt;, Laura Flores, Kamoltat Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/AuthMonitor: provide command to rotate the key for a user credential (&lt;a href=&quot;https://github.com/ceph/ceph/pull/58236&quot;&gt;pr#58236&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon/test_mon_osdmap_prune: Use first_pinned instead of first_committed (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63343&quot;&gt;pr#63343&lt;/a&gt;, Aishwarya Mathuria)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mon: Track and process pending pings after election (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62925&quot;&gt;pr#62925&lt;/a&gt;, Kamoltat Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitor: Enhance historic ops command output and error handling (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64843&quot;&gt;pr#64843&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: add user-agent headers to the urllib (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65473&quot;&gt;pr#65473&lt;/a&gt;, Nizamudeen A)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;monitoring: fix MTU Mismatch alert rule and expr (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65710&quot;&gt;pr#65710&lt;/a&gt;, Aashish Sharma)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;objclass: deprecate cls_cxx_gather (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60195&quot;&gt;pr#60195&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: Disable invoking unittest_deferred (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66359&quot;&gt;pr#66359&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: do cache locally compressor engines ever used (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62145&quot;&gt;pr#62145&lt;/a&gt;, Igor Fedotov, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: fix bdev expansion and more (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62216&quot;&gt;pr#62216&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: Fix ExtentDecoderPartial::_consume_new_blob (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62054&quot;&gt;pr#62054&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: Fix race in BlueFS truncate / remove (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62840&quot;&gt;pr#62840&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: In BlueFS::truncate accept wierd alloc_unit (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66056&quot;&gt;pr#66056&lt;/a&gt;, Adam Kupczyk)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;os/bluestore: make BlueFS an exclusive selector for volume reserved (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62721&quot;&gt;pr#62721&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scheduler/OpSchedulerItem: Fix calculation of recovery latency counters (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62801&quot;&gt;pr#62801&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: allow longer waits for replicas to respond (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63940&quot;&gt;pr#63940&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd/scrub: discard repair_oinfo_oid() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62569&quot;&gt;pr#62569&lt;/a&gt;, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: add clear_shards_repaired command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60566&quot;&gt;pr#60566&lt;/a&gt;, Daniel Radjenovic)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: don&#39;t send stale hb msgr&#39;s addresses in MOSDBoot (&lt;a href=&quot;https://github.com/ceph/ceph/pull/56520&quot;&gt;pr#56520&lt;/a&gt;, Radosław Zarzyński)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd: fix osd mclock queue item leak (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62364&quot;&gt;pr#62364&lt;/a&gt;, Samuel Just)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSD: Split osd_recovery_sleep into settings applied to degraded or clean PGs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62399&quot;&gt;pr#62399&lt;/a&gt;, Md Mahamudur Rahaman Sajib)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;osd_types: Restore new_object marking for delete missing entries (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63152&quot;&gt;pr#63152&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSDMonitor: exclude destroyed OSDs from &amp;quot;ceph node ls&amp;quot; output (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62326&quot;&gt;pr#62326&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSDMonitor: Make sure pcm is initialised (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63805&quot;&gt;pr#63805&lt;/a&gt;, Brad Hubbard)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PendingReleaseNotes; doc/rados/operations: document &amp;quot;rm-pg-upmap-primary-{all}&amp;quot; commands (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62468&quot;&gt;pr#62468&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PGMap: remove pool max_avail scale factor (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61320&quot;&gt;pr#61320&lt;/a&gt;, Michael J. Kidd)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr/dashboard: Use teuthology&#39;s actual requirements (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65418&quot;&gt;pr#65418&lt;/a&gt;, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr: attempt to fix mypy importing from python-common (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63313&quot;&gt;pr#63313&lt;/a&gt;, John Mulligan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr: Fix missing empty lines in mgr_module&lt;span&gt;&lt;/span&gt;.py (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64267&quot;&gt;pr#64267&lt;/a&gt;, Ville Ojamo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pybind/mgr: pin cheroot version in requirements-required&lt;span&gt;&lt;/span&gt;.txt (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65637&quot;&gt;pr#65637&lt;/a&gt;, Nizamudeen A, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: ignore warning that pg is stuck peering for upgrade jobs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65448&quot;&gt;pr#65448&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: randomize configs in &lt;code&gt;fs:thrash:workloads&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61341&quot;&gt;pr#61341&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: switch to ubuntu 22&lt;span&gt;&lt;/span&gt;.04 for stock kernel testing (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62492&quot;&gt;pr#62492&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/cephfs: update ignorelist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61383&quot;&gt;pr#61383&lt;/a&gt;, Rishabh Dave)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/multisite: add extra checkpoints in datalog_autotrim testcase (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61508&quot;&gt;pr#61508&lt;/a&gt;, Shilpa Jagannath)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rbd/iscsi: ignore MON_DOWN warning in logs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64596&quot;&gt;pr#64596&lt;/a&gt;, Adam King)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: bump maven version in hadoop task to resolve 404 Not Found (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63927&quot;&gt;pr#63927&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: fix perl tests missing Amazon::S3 module (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64281&quot;&gt;pr#64281&lt;/a&gt;, Mark Kogan)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: remove hadoop-s3a subsuite (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64669&quot;&gt;pr#64669&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/rgw: run verify tests with garbage collection disabled (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62953&quot;&gt;pr#62953&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/krbd: use a standard fixed-1 cluster in unmap subsuite (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64918&quot;&gt;pr#64918&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites/orch/cephadm: add PG_DEGRADED to ignorelist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63055&quot;&gt;pr#63055&lt;/a&gt;, Shraddha Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/suites: wait longer before stopping OSDs with valgrind (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63717&quot;&gt;pr#63717&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/ceph_manager: population must be a sequence (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64748&quot;&gt;pr#64748&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/cephfs/mount: use &#39;ip route&#39; instead &#39;route&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63129&quot;&gt;pr#63129&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tasks/workunit: fix no module named &#39;pipes&#39; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66252&quot;&gt;pr#66252&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/tests: added initial test for &lt;code&gt;client-upgrade-reef-tentacle&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64761&quot;&gt;pr#64761&lt;/a&gt;, Yuri Weinstein)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa/workunits/fs/misc: remove data pool cleanup (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63017&quot;&gt;pr#63017&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: add missing &lt;span&gt;&lt;/span&gt;.qa links (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67529&quot;&gt;pr#67529&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: Disable OSD benchmark from running for tests (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67067&quot;&gt;pr#67067&lt;/a&gt;, Sridhar Seshasayee)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: enable debug mds/client for fs/nfs suite (&lt;a href=&quot;http://tracker.ceph.com/issues/63482&quot;&gt;issue#63482&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/65251&quot;&gt;pr#65251&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: fix multi-fs tests in test_mds_metrics&lt;span&gt;&lt;/span&gt;.py (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64340&quot;&gt;pr#64340&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: fix test_cephfs_mirror_stats failure (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62116&quot;&gt;pr#62116&lt;/a&gt;, Jos Collin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore pg availability/degraded warnings (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61297&quot;&gt;pr#61297&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: ignore variant of down fs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62092&quot;&gt;pr#62092&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: increase the http&lt;span&gt;&lt;/span&gt;.maxRequestBuffer to 100MB and enable the git debug logs (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61279&quot;&gt;pr#61279&lt;/a&gt;, Xiubo Li)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: suppress OpenSSL valgrind leaks (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65663&quot;&gt;pr#65663&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qa: use a larger timeout for kernel_untar_build workunit (&lt;a href=&quot;http://tracker.ceph.com/issues/68855&quot;&gt;issue#68855&lt;/a&gt;, &lt;a href=&quot;https://github.com/ceph/ceph/pull/61340&quot;&gt;pr#61340&lt;/a&gt;, Venky Shankar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rados/test_crash&lt;span&gt;&lt;/span&gt;.sh: add PG_DEGRADED to ignorelist (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62396&quot;&gt;pr#62396&lt;/a&gt;, Shraddha Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: add cluster fsid to remote meta cache key (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66272&quot;&gt;pr#66272&lt;/a&gt;, Mykola Golub)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: allow incomplete demote snapshot to sync after rbd-mirror daemon restart (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66163&quot;&gt;pr#66163&lt;/a&gt;, VinayBhaskar-V)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: prevent image deletion if remote image is not primary (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64738&quot;&gt;pr#64738&lt;/a&gt;, VinayBhaskar-V)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd-mirror: release lock before calling m_async_op_tracker&lt;span&gt;&lt;/span&gt;.finish_op() (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64091&quot;&gt;pr#64091&lt;/a&gt;, VinayBhaskar-V)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rbd: display mirror state creating (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62939&quot;&gt;pr#62939&lt;/a&gt;, N Balachandran)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recent pipeline backports (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65250&quot;&gt;pr#65250&lt;/a&gt;, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;resolve pacific/quincy upgrade failures (&lt;a href=&quot;https://github.com/ceph/ceph/pull/67657&quot;&gt;pr#67657&lt;/a&gt;, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/iam: add policy evaluation for Arn-based Conditions (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62434&quot;&gt;pr#62434&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/rados: enable object deletion at rados pool quota (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62094&quot;&gt;pr#62094&lt;/a&gt;, Casey Bodley, Samuel Just)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw/sts: Implementation of validating JWT using modulus and exponent (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63053&quot;&gt;pr#63053&lt;/a&gt;, Pritha Srivastava)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw:  Try  to handle unwatch errors sensibly (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62403&quot;&gt;pr#62403&lt;/a&gt;, Adam C. Emerson)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: add force option to &lt;code&gt;radosgw-admin object rm &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64311&quot;&gt;pr#64311&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: add missing last_modified field to swift API (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61553&quot;&gt;pr#61553&lt;/a&gt;, Andrei Ivashchenko)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: allow bucket notification send message to kafka with multiple br… (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61825&quot;&gt;pr#61825&lt;/a&gt;, Hoai-Thu Vuong)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: bring rgw-restore-bucket-index up to current version (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64514&quot;&gt;pr#64514&lt;/a&gt;, J. Eric Ivancich, Michael J. Kidd)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: Changed discard buffer size (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63711&quot;&gt;pr#63711&lt;/a&gt;, Artem Vasilev)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: check all JWKS for STS (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64937&quot;&gt;pr#64937&lt;/a&gt;, Alex Wojno)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: correctly set worker thread names (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63095&quot;&gt;pr#63095&lt;/a&gt;, Milind Changire)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: don&#39;t use merge_and_store_attrs() when recreating a bucket (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64411&quot;&gt;pr#64411&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix &#39;bucket rm --bypass-gc&#39; for copied objects (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66002&quot;&gt;pr#66002&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix bug with rgw-gap-list (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62723&quot;&gt;pr#62723&lt;/a&gt;, J. Eric Ivancich, Michael J. Kidd)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix empty storage class on display of multipart uploads (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64312&quot;&gt;pr#64312&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: fix to correctly store updated attrs in backend store after erasing an attr/attrs for delete ops on a bucket (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61996&quot;&gt;pr#61996&lt;/a&gt;, Pritha Srivastava, Wei Wang)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: Head/GetObject support partNumber (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62544&quot;&gt;pr#62544&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: keep the tails when copying object to itself (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62656&quot;&gt;pr#62656&lt;/a&gt;, Jane Zhu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: make incomplete multipart upload part of bucket check efficient (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64464&quot;&gt;pr#64464&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: make keystone work without admin token(service ac requirement) (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64200&quot;&gt;pr#64200&lt;/a&gt;, Deepika Upadhyay)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: make rgw-restore-bucket-index more robust (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64622&quot;&gt;pr#64622&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: optimize bucket listing to skip past regions of namespaced entries (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62234&quot;&gt;pr#62234&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: prevent crash in &lt;code&gt;radosgw-admin bucket object shard &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;.&lt;/code&gt; (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62885&quot;&gt;pr#62885&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: PutObjectLockConfiguration can enable object lock on existing buckets (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62063&quot;&gt;pr#62063&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: radoslist improvements primarily to better support gap list tool (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62418&quot;&gt;pr#62418&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: trigger resharding of versioned buckets sooner (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63598&quot;&gt;pr#63598&lt;/a&gt;, J. Eric Ivancich)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rgw: update keystone repo stable branch to 2024&lt;span&gt;&lt;/span&gt;.2 (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66243&quot;&gt;pr#66243&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rocky 9/10 support backports (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64658&quot;&gt;pr#64658&lt;/a&gt;, Zack Cerza, John Mulligan, David Galloway, Alexander Indenbaum)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run-make-check&lt;span&gt;&lt;/span&gt;.sh backports (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65837&quot;&gt;pr#65837&lt;/a&gt;, John Mulligan, luo rixin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run-make&lt;span&gt;&lt;/span&gt;.sh: Typo in argument addition (&lt;a href=&quot;https://github.com/ceph/ceph/pull/66690&quot;&gt;pr#66690&lt;/a&gt;, David Galloway)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;scrub: use a generic interface for scheduling timer based events (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63558&quot;&gt;pr#63558&lt;/a&gt;, Samuel Just, Ronen Friedman)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/common/options: Clarify scope of scrub intervals in osd&lt;span&gt;&lt;/span&gt;.yaml&lt;span&gt;&lt;/span&gt;.in (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63490&quot;&gt;pr#63490&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/common: add guidance for deep-scrubbing ratio warning (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62503&quot;&gt;pr#62503&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/common: add guidance for mon_warn_pg_not_scrubbed (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62552&quot;&gt;pr#62552&lt;/a&gt;, Zac Dover)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src/mon/OSDMonitor&lt;span&gt;&lt;/span&gt;.cc: [Stretch Mode] WRN non-existent CRUSH location assigned to MON (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62040&quot;&gt;pr#62040&lt;/a&gt;, Kamoltat Sirivadhna)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;src: modernize sample&lt;span&gt;&lt;/span&gt;.ceph&lt;span&gt;&lt;/span&gt;.conf (&lt;a href=&quot;https://github.com/ceph/ceph/pull/61642&quot;&gt;pr#61642&lt;/a&gt;, Anthony D&#39;Atri)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;suites/rados: cache tier deprecated, no need to keep the tests for it (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62210&quot;&gt;pr#62210&lt;/a&gt;, Nitzan Mordechai)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sync build-with-container patches from main (&lt;a href=&quot;https://github.com/ceph/ceph/pull/65845&quot;&gt;pr#65845&lt;/a&gt;, John Mulligan, Dan Mick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tasks/cephfs/mount: use 192&lt;span&gt;&lt;/span&gt;.168&lt;span&gt;&lt;/span&gt;.144&lt;span&gt;&lt;/span&gt;.0&lt;span&gt;&lt;/span&gt;.0/20 for brxnet (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63134&quot;&gt;pr#63134&lt;/a&gt;, Kyr Shatskyy)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/common: unittest_fault_injector omits unit-main target (&lt;a href=&quot;https://github.com/ceph/ceph/pull/63979&quot;&gt;pr#63979&lt;/a&gt;, Casey Bodley)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/librbd/test_notify&lt;span&gt;&lt;/span&gt;.py: conditionally ignore some errors (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62688&quot;&gt;pr#62688&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/librbd/test_notify&lt;span&gt;&lt;/span&gt;.py: force line-buffered output (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62751&quot;&gt;pr#62751&lt;/a&gt;, Ilya Dryomov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;test/rbd: remove unit tests about cache tiering (&lt;a href=&quot;https://github.com/ceph/ceph/pull/64588&quot;&gt;pr#64588&lt;/a&gt;, Laura Flores)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TEST_backfill_grow fails after finding &amp;quot;num_bytes mismatch&amp;quot; in osd log (&lt;a href=&quot;https://github.com/ceph/ceph/pull/60901&quot;&gt;pr#60901&lt;/a&gt;, Mohit Agrawal)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tools/ceph-objectstore-tool: tricks to tolerate disk errors for &amp;quot;pg export&amp;quot; command (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62122&quot;&gt;pr#62122&lt;/a&gt;, Igor Fedotov)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wip trackers 50371 67352 67489 69639 reef (&lt;a href=&quot;https://github.com/ceph/ceph/pull/62473&quot;&gt;pr#62473&lt;/a&gt;, Brad Hubbard, Patrick Donnelly)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Assessing the performance of the CLAY Erasure Code Plugin</title>
    <link href="https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part4/" />
    <updated>2026-02-11T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part4/</id>
    <author>
      <name>Jake Squelch (IBM)</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="benchmarks" />
      <category term="performance" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part4/">&lt;p&gt;CBT Performance Benchmarking - Part 4. What can we say about CLAY?&lt;/p&gt;
&lt;h2 id=&quot;outline-of-the-blog-series&quot;&gt;&lt;a id=&quot;outline&quot;&gt;&lt;/a&gt;Outline of the Blog Series &lt;a class=&quot;link-anchor&quot; href=&quot;#outline-of-the-blog-series&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part1/&quot;&gt;&lt;strong&gt;Part 1&lt;/strong&gt;&lt;/a&gt; - How to start a Ceph cluster for a performance benchmark with CBT&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part2/&quot;&gt;&lt;strong&gt;Part 2&lt;/strong&gt;&lt;/a&gt; - Defining YAML contents&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part3/&quot;&gt;&lt;strong&gt;Part 3&lt;/strong&gt;&lt;/a&gt; - How to start a CBT performance benchmark&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 4&lt;/strong&gt; - Assessing the performance of the CLAY erasure code plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Contents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#client&quot;&gt;Client IO results for CLAY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#down&quot;&gt;Client IO with an OSD down&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#good&quot;&gt;What is CLAY good at?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#probs&quot;&gt;Problems with using CLAY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#read&quot;&gt;How does CLAY read data from the drive?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#broke&quot;&gt;CLAY is broken in tentacle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#summary&quot;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;client-io-results-for-clay&quot;&gt;&lt;a id=&quot;client&quot;&gt;&lt;/a&gt;Client IO results for CLAY &lt;a class=&quot;link-anchor&quot; href=&quot;#client-io-results-for-clay&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As a refresher lets quickly look back on the &lt;strong&gt;client IO&lt;/strong&gt; results of &lt;strong&gt;CLAY&lt;/strong&gt; compared to &lt;strong&gt;JErasure&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;If we look back to &lt;strong&gt;Step 3&lt;/strong&gt; in &lt;a href=&quot;https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part3/&quot;&gt;&lt;strong&gt;Part 3&lt;/strong&gt;&lt;/a&gt; of the blog &lt;code&gt;(Generating a comparison report)&lt;/code&gt;, we saw that &lt;strong&gt;reads&lt;/strong&gt; had practically identical curves between CLAY &amp;amp; JErasure for both &lt;strong&gt;4K random reads&lt;/strong&gt; and &lt;strong&gt;1024K sequential reads&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;However, when we compared &lt;strong&gt;writes&lt;/strong&gt; we saw that the performance hit to CLAY was substantially larger, particularly for higher bandwidths. The &lt;strong&gt;1024k Sequential Writes&lt;/strong&gt; diagram represents this:&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Click to see Part 3 diagrams&lt;/summary&gt;
&lt;p&gt;&lt;img src=&quot;images/part_3_diag.jpg&quot; alt=&quot;alt text&quot; title=&quot;part 3 reference&quot;&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;strong&gt;So why was this?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is because of CLAY&#39;s &lt;strong&gt;encoding process&lt;/strong&gt;, it is significantly more complex. While JErasure performs a single encoding pass, CLAY uses three phases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;50% of data is encoded using &lt;strong&gt;PRT&lt;/strong&gt; (Product Recovery Transform), 50% of the data is copied to form an intermediate set of buffers&lt;/li&gt;
&lt;li&gt;All the intermediate data is encoded using &lt;strong&gt;RS&lt;/strong&gt; (Reed-Solomon) to form a second set of intermediate buffers&lt;/li&gt;
&lt;li&gt;50% of the result is encoded using &lt;strong&gt;PFT&lt;/strong&gt; (Parity Fractional Transform), 50% of the data is copied to form the output buffers&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Essentially, CLAY performs &lt;strong&gt;2x&lt;/strong&gt; the encoding plus an &lt;strong&gt;additional&lt;/strong&gt; memcpy (memory copy) compared to JErasure&#39;s 1x encoding. This overhead therefore directly translates to &lt;strong&gt;lower write throughput&lt;/strong&gt; for CLAY, as shown by the diagrams above. The performance impact increases for larger IO sizes because more data is being encoded.&lt;/p&gt;
&lt;p&gt;Referenced the following: &lt;a href=&quot;https://people.iith.ac.in/mynav/pdfs/talks/Clay_Fast18.pdf&quot;&gt;&#39;Clay Codes: Moulding MDS Codes to Yield an MSR Code&#39;&lt;/a&gt; above for information on CLAY&#39;s encoding process.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;client-io-with-an-osd-down&quot;&gt;&lt;a id=&quot;down&quot;&gt;&lt;/a&gt;Client IO with an OSD down &lt;a class=&quot;link-anchor&quot; href=&quot;#client-io-with-an-osd-down&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;details&gt;
&lt;summary&gt;Click to see Part 3 diagram&lt;/summary&gt;
&lt;p&gt;&lt;img src=&quot;images/part_3_down_ref.png&quot; alt=&quot;alt text&quot; title=&quot;part 3 reference with OSD down&quot;&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;We then moved onto &lt;strong&gt;Step 4&lt;/strong&gt; in &lt;a href=&quot;https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part3/&quot;&gt;&lt;strong&gt;Part 3&lt;/strong&gt;&lt;/a&gt; of the blog &lt;code&gt;(Running a test with an OSD down)&lt;/code&gt;, and we saw that performance had got even worse for CLAY here. The curves are no longer near identical for the reads (as shown by the above diagram). CLAY is clearly performing worse in this scenario, which we did not initially expect.&lt;/p&gt;
&lt;p&gt;This latency increase is due to the specific implementation of CLAY within Ceph. For &lt;strong&gt;degraded&lt;/strong&gt; read IOs (when a client requests data from a missing shard), the system is configured to read and decode all the data to reconstruct the missing information. Just as the &lt;strong&gt;encode&lt;/strong&gt; process (for write IOs) has a higher overheads when using CLAY, the &lt;strong&gt;decode&lt;/strong&gt; process (for degraded read IOs) has similarly higher overheads. This is an implementation choice - when recovering objects (see next section) CLAY uses a more efficient method for recovering the data. This method could also have been used for degraded reads.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;what-is-clay-good-at%3F&quot;&gt;&lt;a id=&quot;good&quot;&gt;&lt;/a&gt;What is CLAY good at? &lt;a class=&quot;link-anchor&quot; href=&quot;#what-is-clay-good-at%3F&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now you may be thinking, if CLAY is slower for writes and degraded reads, why use it? The answer is for &lt;strong&gt;Network Bandwidth Optimisations&lt;/strong&gt; during recovery processes like &lt;strong&gt;backfill&lt;/strong&gt; and &lt;strong&gt;recovery&lt;/strong&gt; that use the erasure code to reconstruct and repair the missing parts of objects.&lt;/p&gt;
&lt;p&gt;While JErasure requires &lt;strong&gt;k&lt;/strong&gt; (data shards) to reconstruct &lt;strong&gt;one&lt;/strong&gt; missing shard, CLAY uses coupled layers to reconstruct data using a significantly smaller amount of data from the remaining shards. In a standard 4+2 setup, JErasure would need to pull 100% of the data from the other 4 shards to rebuild the 5th.&lt;/p&gt;
&lt;p&gt;This is what it would look like if we were to use JErasure and simulate a recovery of data when shard 0 is missing:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/jerasure1a.jpg&quot; alt=&quot;alt text&quot; title=&quot;jerasure eg&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we will compare this to how CLAY would recover data if shard 0 was missing. &lt;code&gt;CLAY reduces this traffic by approximately 50%&lt;/code&gt; as you can see in the below example:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/clay1b.jpg&quot; alt=&quot;alt text&quot; title=&quot;clay eg&quot;&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s important to note that the above configuration has a chosen non-default stripe unit of &lt;strong&gt;32K&lt;/strong&gt; which, with a 4+2 CLAY code, results in a sub chunk size of &lt;strong&gt;4K&lt;/strong&gt; and matches both the &lt;strong&gt;NVMe block size&lt;/strong&gt; and the &lt;strong&gt;Bluestore allocation unit&lt;/strong&gt;. See the Ceph documentation &lt;a href=&quot;https://docs.ceph.com/en/latest/rados/operations/erasure-code-clay/&quot;&gt;here&lt;/a&gt; for how to calculate the sub chunk size for your configuration.&lt;/p&gt;
&lt;p&gt;We can see that with the CLAY example above &lt;strong&gt;more&lt;/strong&gt; data shards are read, however overall &lt;strong&gt;less&lt;/strong&gt; data is read. We can therefore see that for our configuration, CLAY will be more efficient in recovering data when a shard is missing.&lt;/p&gt;
&lt;p&gt;With this erasure code profile CLAY will always read &lt;strong&gt;50%&lt;/strong&gt; of each other shard to recover a missing shard, however the subchunks that are read will vary depending on which shard is missing. The next diagram shows which subchunks will be read for each missing shard:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/clay2.jpg&quot; alt=&quot;alt text&quot; title=&quot;clay 2eg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: While the diagram shows a 50% saving in network traffic, this comes at the &lt;code&gt;cost of IOPS&lt;/code&gt;. We can see how shards 4 and 5 must perform &lt;strong&gt;four&lt;/strong&gt; individual reads per stripe to gather those specific sub-chunks, so we can see here how it can be dependant on which shard is missing.&lt;/p&gt;
&lt;p&gt;In summary CLAY reads much less data than JErasure during recovery/backfill saving approximately &lt;strong&gt;50%&lt;/strong&gt; network bandwidth which in systems that are limited by the network should improve the performance of recovery.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;problems-with-using-clay&quot;&gt;&lt;a id=&quot;probs&quot;&gt;&lt;/a&gt;Problems with using CLAY &lt;a class=&quot;link-anchor&quot; href=&quot;#problems-with-using-clay&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Choosing your stripe unit is critical:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If stripe unit is 4K:&lt;/strong&gt; Sub-chunks become tiny (512 bytes) and reads of less than 4K are &lt;code&gt;rounded up&lt;/code&gt; to 4K.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This leads to &lt;strong&gt;extra&lt;/strong&gt; data reads because the NVMe block size is 4K. This means that recovery reads &lt;strong&gt;1x to 4x&lt;/strong&gt; the amount of data from drives but transmits &lt;strong&gt;50% less&lt;/strong&gt; data across the network, there is still many more &lt;strong&gt;IOPs&lt;/strong&gt; and &lt;strong&gt;CPU usage&lt;/strong&gt; in this scenario.&lt;/p&gt;
&lt;p&gt;Let&#39;s break this down a step further using examples of shards 0, 1 and 2 missing. Here we can see in blue the desired amount of data that we want to read, however the orange is the actual amount of data that is read due to these allignment issues.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/helper.jpg&quot; alt=&quot;alt text&quot; title=&quot;helper eg&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If stripe unit is 32K:&lt;/strong&gt; This fixes the fragmentation issue that we see above (sub-chunks align better with 4K drive blocks), but introduces some classic and fast EC problems:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a classic EC pool, any overwrite requires reading the &lt;strong&gt;entire&lt;/strong&gt; stripe, even if you only changed &lt;strong&gt;one&lt;/strong&gt; byte. At 32K, small writes become incredibly expensive because of the &lt;code&gt;Read-Modify-Write&lt;/code&gt; overhead. In classic EC objects are padded to a multiple of the stripe width, so a larger stripe unit &lt;strong&gt;increases&lt;/strong&gt; wasted capacity. In fast EC objects are not padded but a larger stripe unit still results in &lt;strong&gt;more&lt;/strong&gt; coding parity data and &lt;strong&gt;less&lt;/strong&gt; storage efficiency. So there are still negatives to bare in mind if you are to pick a stripe unit of 32K.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-does-clay-read-data-from-the-drive%3F&quot;&gt;&lt;a id=&quot;read&quot;&gt;&lt;/a&gt;How does CLAY read data from the drive? &lt;a class=&quot;link-anchor&quot; href=&quot;#how-does-clay-read-data-from-the-drive%3F&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;fragmented-reads&quot;&gt;Fragmented Reads &lt;a class=&quot;link-anchor&quot; href=&quot;#fragmented-reads&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As shown above, CLAY issues &lt;strong&gt;fragmented reads&lt;/strong&gt;. If the stripe unit gets smaller, for example &lt;strong&gt;4K&lt;/strong&gt;, the sub-chunk size drops to &lt;strong&gt;512 bytes&lt;/strong&gt;. This is because NVMe and HDD drives have a minimum block size of &lt;strong&gt;4K&lt;/strong&gt;, therefore any 512 byte read is &lt;strong&gt;rounded up&lt;/strong&gt; to this minimum of 4K. This can result in CLAY reading the same 4K block multiple times to extract different 512 byte sub-chunks, and discarding the rest of the data. This therefore wastes &lt;strong&gt;CPU&lt;/strong&gt; and &lt;strong&gt;drive IOPs&lt;/strong&gt;, so if either of these are your performance bottlenecks this is not a good scenario.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Squid&lt;/strong&gt; recovery also always tries to read &lt;strong&gt;2MB&lt;/strong&gt; from each stripe and expects the read to be truncated if the object is smaller than &lt;code&gt;2MB * number of stripes&lt;/code&gt;. With CLAY this results in a lot of small reads being issued beyond the end of the object. While these as quickly fail and do not stop CLAY recovering the data, this does waste &lt;strong&gt;additional CPU resources&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Referring to the same &lt;a href=&quot;https://people.iith.ac.in/mynav/pdfs/talks/Clay_Fast18.pdf&quot;&gt;paper&lt;/a&gt; as before: Results have been shown that encoding data can take up to &lt;strong&gt;70%&lt;/strong&gt; longer in terms of CPU usage, if your cluster &lt;strong&gt;isn&#39;t&lt;/strong&gt; CPU limited then you won&#39;t notice this. These results also showed dramatic savings in &lt;strong&gt;backfill&lt;/strong&gt; and &lt;strong&gt;recovery&lt;/strong&gt; time - but they were done on a system that was network limited and used much wider erasure codes (26 node cluster) than most people would typically use.&lt;/p&gt;
&lt;p&gt;There is scope to improve the implementation of CLAY - currently the reads are issued &lt;strong&gt;serially&lt;/strong&gt;, which will add a lot of latency to the recovery. A more efficient approach would be to issue a single read in &lt;strong&gt;parallel&lt;/strong&gt; using &lt;code&gt;readv&lt;/code&gt; or to read the entire stripe into memory once, then transmit the required data for the network. The latter would be the better method. This would trade &lt;strong&gt;drive bandwidth&lt;/strong&gt; for a considerable saving in &lt;strong&gt;CPU utilisation&lt;/strong&gt; and &lt;strong&gt;drive IOPs&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;more-in-depth%3A&quot;&gt;More in depth: &lt;a class=&quot;link-anchor&quot; href=&quot;#more-in-depth%3A&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We went over the 3 phases of how CLAY encodes data earlier. Decoding is also done in 3 phases, but on half the quantity of data:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;25% of the data is decoded using &lt;strong&gt;PRT&lt;/strong&gt;, 25% of the data is copied to form an intermediate set of buffers&lt;/li&gt;
&lt;li&gt;All (50%) of the intermediate data is decoded using &lt;strong&gt;RS&lt;/strong&gt; to form a 2nd set of intermediate buffers&lt;/li&gt;
&lt;li&gt;25% of the data is decoded using &lt;strong&gt;PFT&lt;/strong&gt;, 25% of the data is copied to form the output data&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Therefore, CLAY has an additional &lt;strong&gt;0.5x memcpy&lt;/strong&gt; of the data and the &lt;strong&gt;same&lt;/strong&gt; decoding costs, as JErasure. Hence there is slightly more overhead for CLAY (memcpy&#39;s + slight inefficiencies from performing several smaller decodes rather than one large decode). CLAY requires less data to perform the recovery so we can save on &lt;strong&gt;network bandwidth&lt;/strong&gt; (and if implemented correctly, &lt;strong&gt;drive bandwidth&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;To round off:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CLAY has &lt;strong&gt;higher&lt;/strong&gt; encoding costs and the &lt;strong&gt;same&lt;/strong&gt; decoding cost&lt;/li&gt;
&lt;li&gt;CLAY has some memcpy&#39;s that JErasure does not have&lt;/li&gt;
&lt;li&gt;CLAY has multiple encode/decode steps and there will be some small overheads/inefficiencies - for example, encoding 12K of data in 3 batches of 4K (CLAY) versus encoding 12K of data in 1 batch (JErasure)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;clay-is-broken-in-tentacle&quot;&gt;&lt;a id=&quot;broke&quot;&gt;&lt;/a&gt;CLAY is broken in Tentacle &lt;a class=&quot;link-anchor&quot; href=&quot;#clay-is-broken-in-tentacle&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When performing benchmarking on the Tentacle release, a significant issue was discovered: The recovery benefit was &lt;strong&gt;non-existent&lt;/strong&gt; for Tentacle.&lt;/p&gt;
&lt;p&gt;In the tests, recovery in Tentacle transmitted the &lt;strong&gt;full&lt;/strong&gt; amount of data, behaving like standard JErasure but with a &lt;strong&gt;higher&lt;/strong&gt; CPU overhead of CLAY. This isn&#39;t the case for Squid however, which is what was used for the updated performance benchmarking used throughout this blog.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;summary&quot;&gt;&lt;a id=&quot;summary&quot;&gt;&lt;/a&gt;Summary &lt;a class=&quot;link-anchor&quot; href=&quot;#summary&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;CLAY is a fascinating project and definitely has potential, but for the average user, remains niche.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&#39;d recommend CLAY if:&lt;/strong&gt; Your cluster is strictly &lt;strong&gt;Network Bottlenecked&lt;/strong&gt; and you use wide erasure codes (eg 20+ nodes) where the 50% saving is a very considerable amount.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&#39;d recommend you avoid CLAY if:&lt;/strong&gt; You are &lt;strong&gt;CPU&lt;/strong&gt; or &lt;strong&gt;IOPs&lt;/strong&gt; limited, or if you primarily use HDDs, as the fragmented serial reads will cripple recovery performance.&lt;/p&gt;
&lt;p&gt;For most production environments, the simplicity and predictable performance of JErasure remains the better choice I believe.&lt;/p&gt;
&lt;p&gt;Please note that there is a plan to end support for CLAY from the V release. Please see &lt;a href=&quot;https://ceph.io/en/news/blog/2025/ending-support-for-ec-plugins/&quot;&gt;here&lt;/a&gt; for more details.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&quot;https://ceph.io/en/community/connect/&quot;&gt;Link to connect with Ceph on slack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Contact us in the &lt;strong&gt;#cbt&lt;/strong&gt; channel in the Ceph on slack workspace above!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#outline&quot;&gt;Link to previous parts of the blog series&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>RGW Bucket Resharding Without Pausing</title>
    <link href="https://ceph.io/en/news/blog/2026/rgw-improved-resharding/" />
    <updated>2026-02-01T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/rgw-improved-resharding/</id>
    <author>
      <name>Daniel Alexander Parkes, Anthony D&#39;Atri</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="rgw" />
      <category term="s3" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/rgw-improved-resharding/">&lt;h2 id=&quot;introduction%3A-the-foundation-of-scalable-object-storage&quot;&gt;Introduction: The Foundation of Scalable Object Storage &lt;a class=&quot;link-anchor&quot; href=&quot;#introduction%3A-the-foundation-of-scalable-object-storage&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the modern data landscape, object storage has evolved from a simple file
repository into the foundational layer for AI/ML pipelines, data lakehouses,
real-time analytics, and massive-scale archival systems. At the heart of this
evolution is a deceptively simple
question: &lt;strong&gt;How do you efficiently locate and access billions of objects stored in a single bucket?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The answer lies in one of Ceph&#39;s most critical performance
mechanisms: &lt;strong&gt;bucket index sharding&lt;/strong&gt;. This architectural
pattern divides a bucket&#39;s index into multiple parallel structures, enabling
concurrent operations across thousands of objects while maintaining the
consistency and reliability that enterprise workloads demand.&lt;/p&gt;
&lt;p&gt;But there&#39;s always been a catch. As workloads grow and evolve, buckets need
to be resharded. Historically, when the buckets to be resharded had a vast
number of objects, this operation came with a painful trade-off: blocking
client writes from seconds to minutes, with a chance of causing application
disruptions, 504 Gateway errors, and operational headaches.&lt;/p&gt;
&lt;p&gt;With Ceph Tentacle, we&#39;re eliminating this trade-off. The new near-zero
impact bucket resharding architecture transforms what was once a
maintenance window event into a seamless background operation
that your applications will never notice.&lt;/p&gt;
&lt;p&gt;Note: As of 2026/02/05, the functionality described in this article is expected
in an upcoming Tentacle update.&lt;/p&gt;
&lt;h3 id=&quot;executive-summary&quot;&gt;Executive Summary &lt;a class=&quot;link-anchor&quot; href=&quot;#executive-summary&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Challenge&lt;/strong&gt;: In Ceph Squid, resharding a 20-million-object bucket blocked
writes for 4+ minutes, returning 504 errors. Even larger buckets (500M objects)
required 94 minutes of complete write unavailability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Ceph Tentacle&#39;s two-phase architecture moves the heavy lifting to a non-blocking background phase, eliminating the impact on clients IO.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Results&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/24e09a3f-0c15-4b5d-8ec4-c37508617d7a.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;(note: in this graphic 8.1 refers to Squid and 9.0 to Tentacle)&lt;/p&gt;
&lt;p&gt;In this deep dive, we&#39;ll explore:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Why bucket sharding is essential for modern workloads&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The challenges of resharding in Ceph Squid and earlier versions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The enhanced two-phase architecture in Ceph Tentacle&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Before/after performance comparison from production testing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The future of bucket indexing with in-order sharding&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;the-scalability-enabler%3A-understanding-bucket-index-sharding&quot;&gt;The Scalability Enabler: Understanding Bucket Index Sharding &lt;a class=&quot;link-anchor&quot; href=&quot;#the-scalability-enabler%3A-understanding-bucket-index-sharding&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;the-bucket-index-and-omaps&quot;&gt;The Bucket Index and omaps &lt;a class=&quot;link-anchor&quot; href=&quot;#the-bucket-index-and-omaps&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In Ceph&#39;s Object Gateway(RGW), the ability to list bucket contents is fundamental
to object storage operations. The Object Gateway(RGW) implements this using a
dedicated structure called the bucket index, which maintains an inventory of
all objects in a bucket. This index is stored using a special RADOS feature
called the Object Map (omap) - essentially a key-value store associated with a
RADOS object, physically residing in the RocksDB database on each OSD&#39;s DB partition.&lt;/p&gt;
&lt;p&gt;Without sharding, a bucket&#39;s entire index is stored in a single RADOS object.
While elegant in its simplicity, this creates a fundamental performance problem:&lt;/p&gt;
&lt;p&gt;The Single-Index Bottleneck: Since only one operation can modify this index at
a time, you&#39;re looking at complete serialization. Write operations must queue
and wait their turn to update the index. As your bucket grows to millions of
objects with thousands of concurrent write operations, this serialization
becomes a severe bottleneck.&lt;/p&gt;
&lt;p&gt;Think of it like a busy airport with only one runway. No matter how many planes
are waiting to land, only one can touch down at a time.&lt;/p&gt;
&lt;h3 id=&quot;sharding%3A-parallelism-through-distribution&quot;&gt;Sharding: Parallelism Through Distribution &lt;a class=&quot;link-anchor&quot; href=&quot;#sharding%3A-parallelism-through-distribution&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Bucket index sharding&lt;/strong&gt; solves this bottleneck by dividing the index into
multiple parts (shards), with each shard stored as a separate RADOS object
within the &lt;code&gt;.rgw.buckets.index&lt;/code&gt; pool. When an object is written, the Ceph
Object Gateway (RGW) calculates a hash of the object&#39;s name to determine
which shard should receive the index update. This enables multiple operations
to run concurrently across multiple Placement Groups (PGs), distributing
requests among the the OSDs that host the index pool.&lt;/p&gt;
&lt;p&gt;Returning to our airport analogy: you now have multiple runways, each handling
different aircraft simultaneously. The more runways (shards) you have, the more
parallel operations you can support.&lt;/p&gt;
&lt;p&gt;The sharding mechanism uses the &lt;code&gt;rgw_max_objs_per_shard&lt;/code&gt; tunable (default:
100,000 objects per shard) to determine optimal distribution.&lt;/p&gt;
&lt;p&gt;We recommend maintaining no more than 102,400 objects per shard for optimal performance.&lt;/p&gt;
&lt;h3 id=&quot;why-single-bucket-scale-is-mission-critical-in-modern-object-workloads&quot;&gt;Why Single-Bucket Scale is Mission-Critical in Modern Object Workloads &lt;a class=&quot;link-anchor&quot; href=&quot;#why-single-bucket-scale-is-mission-critical-in-modern-object-workloads&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here&#39;s where bucket sharding becomes even more critical: modern analytics
architectures are converging on single-bucket designs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Data Lakehouse Pattern&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apache Iceberg, Apache Hudi, and Delta Lake (the table formats revolutionizing
data architecture) organize petabytes of data within a single bucket using
hierarchical prefixes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;s3://analytics-lakehouse/
├── warehouse/
│   ├── sales_db/
│   │   └── transactions/
│   │       ├── data/
│   │       │   ├── year=2025/month=11/
│   │       │   │   ├── 00045-23-a1b2c3d4.parquet
│   │       │   │   └── 00046-24-e5f6g7h8.parquet
│   │       │   └── year=2025/month=10/
│   │       └── metadata/
│   │           ├── v1.metadata.json
│   │           ├── v2.metadata.json
│   │           └── snap-1234567890.avro
│   └── customer_db/
│       └── profiles/
├── staging/
└── archive/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The implication?&lt;/strong&gt; Modern data platforms need buckets that can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Scale to billions of objects distributed across thousands of prefixes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handle mixed workloads: batch ETL, interactive queries, real-time streaming&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adapt dynamically to growth and contraction without downtime&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maintain sub-second listing performance across massive object counts&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is precisely where seamless resharding becomes absolutely critical.&lt;/p&gt;
&lt;h2 id=&quot;the-challenge%3A-resharding-in-ceph-squid-and-earlier&quot;&gt;The Challenge: Resharding in Ceph Squid and Earlier &lt;a class=&quot;link-anchor&quot; href=&quot;#the-challenge%3A-resharding-in-ceph-squid-and-earlier&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Understanding the improvements in Ceph Tentacle requires understanding the challenges of the previous approach.&lt;/p&gt;
&lt;h3 id=&quot;the-blocking-resharding-process&quot;&gt;The Blocking Resharding Process &lt;a class=&quot;link-anchor&quot; href=&quot;#the-blocking-resharding-process&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In Ceph Squid and earlier versions, bucket resharding followed this process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Resharding operation initiates (manually or via dynamic resharding)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All client write operations are blocked to the bucket&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Index entries are copied from source shards to destination shards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Applications receive 504 Gateway Timeout errors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Operations teams monitor progress&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In buckets with small object counts, resharding is almost unnoticeable, but as
object counts grow, the write pause can last from minutes to hours, depending
on bucket size. Read operations continued, but write unavailability required
careful planning for production workloads.&lt;/p&gt;
&lt;h3 id=&quot;the-operational-impact&quot;&gt;The Operational Impact &lt;a class=&quot;link-anchor&quot; href=&quot;#the-operational-impact&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This blocking behavior created several operational constraints:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maintenance Windows&lt;/strong&gt;: Resharding typically requires scheduling during off-peak
hours with advance notification to application teams.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Capacity Planning Tradeoffs&lt;/strong&gt;: Teams set high initial shard counts based on
pre-sharding usage estimates for the bucket, but these are hard to calculate up front.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Resharding Concerns&lt;/strong&gt;: Automatic reshards could trigger during peak
business hours, potentially causing disruptions. Some organizations disabled dynamic resharding entirely and managed sharding manually.&lt;/p&gt;
&lt;p&gt;Ceph Tentacle addresses these challenges with a fundamentally different approach.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1768993012078/46db01ac-dc0c-46e0-a36c-d1f99096f874.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-solution%3A-non-pausing-resharding-in-ceph-tentacle&quot;&gt;The Solution: Non-Pausing Resharding in Ceph Tentacle &lt;a class=&quot;link-anchor&quot; href=&quot;#the-solution%3A-non-pausing-resharding-in-ceph-tentacle&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now let&#39;s explore what changes in Ceph Tentacle - and why it&#39;s transformational.&lt;/p&gt;
&lt;h3 id=&quot;reshard-two-phase-architecture&quot;&gt;Reshard Two-Phase Architecture &lt;a class=&quot;link-anchor&quot; href=&quot;#reshard-two-phase-architecture&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;f0a0b81b-5779-474e-8920-8ede4da5d1a4.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Ceph Object Gateway(RGW) engineering team fundamentally redesigned the resharding
process from the ground up. Instead of blocking all writes while copying index entries,
Ceph Tentacle introduces an intelligent two-phase incremental approach that keeps your
applications running:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 1: Log Record Phase (Non-Blocking)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;During this phase, which comprises the bulk of the resharding operation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Client writes continue normally&lt;/strong&gt; - no blocking whatsoever&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Index operations are logged&lt;/strong&gt; to source shards alongside regular write operations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Background migration begins&lt;/strong&gt; - existing index entries start copying to destination shards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change tracking&lt;/strong&gt; - a sophisticated logging mechanism captures all modifications&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Phase 2: Progress Phase (Minimal Pause, zero client impact)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Only after the bulk of entries have been migrated does Phase 2 begin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Brief write pause&lt;/strong&gt; - With zero client impact (milliseconds to low seconds)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Log synchronization&lt;/strong&gt; - recent changes recorded during Phase 1 are applied to destination shards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conflict resolution&lt;/strong&gt; - entries modified during migration are reconciled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bucket stats recalculation&lt;/strong&gt; - metadata is updated to reflect the new shard layout&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cutover&lt;/strong&gt; - bucket switches to the new index layout&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Normal operations resume&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Key Innovation:&lt;/strong&gt; By recording changes as lightweight logs during Phase 1,
the system only needs to synchronize recent modifications during the brief Phase
2 pause. The bulk of the work - migrating millions of existing entries - happens
entirely in the background while your applications continue writing uninterrupted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backward Compatibility:&lt;/strong&gt; Ceph Tentacle&#39;s resharding maintains compatibility
as a superset of the previous implementation. If some OSD nodes haven&#39;t yet
upgraded, resharding safely fails rather than risking data loss, and the
system checks version compatibility before proceeding.&lt;/p&gt;
&lt;h3 id=&quot;what-this-means-for-your-operations&quot;&gt;What This Means For Your Operations &lt;a class=&quot;link-anchor&quot; href=&quot;#what-this-means-for-your-operations&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The practical implications extend far beyond eliminating 504 errors:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Eliminate Maintenance Windows.&lt;/strong&gt; No more scheduling resharding operations for 2 AM on Sunday. Trigger reshards during peak business hours if needed - your applications won&#39;t notice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Enable True Dynamic Scaling&lt;/strong&gt;&lt;br&gt;
Dynamic bucket resharding can now be fully trusted. The automation you&#39;ve wanted - automatic scaling up and down with minimal client interruption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Production Confidence.&lt;/strong&gt; Deploy resharding changes without coordination, without warning application teams, without anxiety. It just works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Faster Response to Demand.&lt;/strong&gt; Workload explodes? Trigger an immediate upshard. No more waiting for a maintenance window.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Simplified Operations.&lt;/strong&gt; One less thing requiring complex runbooks, escalation procedures, and off-hours coordination. Focus on value-add activities instead.&lt;/p&gt;
&lt;h2 id=&quot;performance-comparison%3A-before-and-after&quot;&gt;Performance Comparison: Before and After &lt;a class=&quot;link-anchor&quot; href=&quot;#performance-comparison%3A-before-and-after&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To validate the architectural improvements, we conducted extensive testing
comparing Ceph Squid and Tentacle under identical conditions. The results
demonstrate the transformational impact of near-zero impact resharding resharding.&lt;/p&gt;
&lt;h3 id=&quot;test-scenario%3A-small-scale-bucket-with-20-million-objects&quot;&gt;Test Scenario: Small-Scale Bucket with 20 Million Objects &lt;a class=&quot;link-anchor&quot; href=&quot;#test-scenario%3A-small-scale-bucket-with-20-million-objects&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Environment&lt;/strong&gt;: Single-site deployment using &lt;code&gt;s3cmd&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bucket size&lt;/strong&gt;: ~20 million objects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resharding operation&lt;/strong&gt;: Manual upshard (401 → 10,001 shards for 8.1, 307 → 10,001 for 9.0)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test action&lt;/strong&gt;: Upload a 300MB object during active reshard&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;9093c5b6-e337-45ce-bc3c-027b9490d5a6.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Impact:&lt;/strong&gt; Uploads that previously required 4+ minutes due to complete blocking
now complete in 17 seconds for 300MB objects, with zero errors. That&#39;s a 93% reduction
in client-perceived latency - or more accurately, the elimination of the problem entirely.&lt;/p&gt;
&lt;p&gt;From an application perspective, resharding is now completely transparent. Your
applications continue serving requests without any indication that a major
infrastructure operation is happening beneath them.&lt;/p&gt;
&lt;h3 id=&quot;test-scenario%3A-medium-scale-bucket-with-500-million-objects&quot;&gt;Test Scenario: Medium-Scale Bucket with 500 Million Objects &lt;a class=&quot;link-anchor&quot; href=&quot;#test-scenario%3A-medium-scale-bucket-with-500-million-objects&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For larger buckets, the improvements are even more dramatic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test Methodology Note&lt;/strong&gt;: This test was deliberately conducted as a stress
scenario to evaluate behavior under extreme conditions. The cluster was pushed
to near-saturation with concurrent large-object uploads during resharding
operations. This aggressive test configuration amplifies resharding times
significantly beyond typical production scenarios, allowing us to validate
the improvements under worst-case conditions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Environment&lt;/strong&gt;: Single-site deployment using s3cmd&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test&lt;/strong&gt;: Upload 300MB and 1GB objects during downshard operation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resharding operation&lt;/strong&gt;: Downshard from 10,001 → 1,999 shards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Load&lt;/strong&gt;: Concurrent large uploads pushing cluster toward capacity limits&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Results:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/3460f4e3-7fd6-4b8b-9300-aad79fea10da.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Impact:&lt;/strong&gt; While typical production resharding in Ceph Squid would
complete faster than the 94 minutes shown here, this stress test reveals
critical behavior differences. Under load, Ceph Squid&#39;s blocking architecture
creates cascading issues - the longer the reshard takes, the longer
applications are blocked, potentially triggering timeouts and retry
storms. Ceph Tentacle&#39;s non-blocking architecture eliminates this
entire failure mode. Whether resharding takes 10 minutes or 90 minutes,
applications continue operating normally.&lt;/p&gt;
&lt;h3 id=&quot;at-a-glance%3A-the-transformation&quot;&gt;At a Glance: The Transformation &lt;a class=&quot;link-anchor&quot; href=&quot;#at-a-glance%3A-the-transformation&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Aspect&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ceph Squid&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ceph Tentacle&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Client Impact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complete write blocking&lt;/td&gt;
&lt;td&gt;Zero write blocking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;504 Gateway errors&lt;/td&gt;
&lt;td&gt;No errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;20M Object Upshard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4m23s blocked&lt;/td&gt;
&lt;td&gt;17s upload (no pause)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;500M Object Downshard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;94 minutes blocked&lt;/td&gt;
&lt;td&gt;5-17s uploads (no pause)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance Window&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dynamic Resharding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Often disabled&lt;/td&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;looking-forward%3A-the-future-of-bucket-indexing&quot;&gt;Looking Forward: The Future of Bucket Indexing &lt;a class=&quot;link-anchor&quot; href=&quot;#looking-forward%3A-the-future-of-bucket-indexing&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The near-zero-impact bucket resharding feature in Ceph Tentacle is
transformational, but it&#39;s part of a broader evolution in how Ceph
handles bucket indexing at scale.&lt;/p&gt;
&lt;h3 id=&quot;in-order-sharding%3A-the-next-frontier&quot;&gt;In-Order Sharding: The Next Frontier &lt;a class=&quot;link-anchor&quot; href=&quot;#in-order-sharding%3A-the-next-frontier&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Currently, RGW&#39;s hashed sharding optimizes for write distribution but presents
challenges for alphabetical listing operations. To fulfill a paginated list
request, RGW must perform a &amp;quot;scatter-gather&amp;quot; operation: querying every shard
and sorting the combined results. For buckets with thousands of shards, this
becomes a bottleneck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In-order sharding&lt;/strong&gt; (ordered bucket listing) is in active development and will revolutionize listing performance:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Change&lt;/strong&gt;: Instead of using a hash function, objects will be placed into shards based on lexicographical name ordering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Impact&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;List requests can target specific shard ranges instead of querying all shards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Paginated listing becomes dramatically faster (query 1-2 shards instead of thousands).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prefix-based queries (critical for data lakehouses) become highly efficient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Iterating through object keys becomes significantly more performant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why This Matters for Data Lakehouses:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apache Iceberg, Hudi, and Delta Lake all rely heavily on prefix-based object discovery:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;s3://lakehouse/warehouse/sales_db/transactions/data/year=2025/month=11/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With in-order sharding, a query for this prefix would hit only the specific
shards containing objects in that lexicographical range - not all 10,000 shards in the bucket.&lt;/p&gt;
&lt;p&gt;Combined with non-pausing resharding, Ceph is building toward virtually unlimited,
performant scalability within a single bucket - exactly what modern data platforms demand.&lt;/p&gt;
&lt;p&gt;For a detailed slide deck on the topic, check out
&lt;a href=&quot;https://cephalocon2025.sched.com/speaker/ivancich&quot;&gt;Eric&lt;/a&gt; Ivancich&#39;s excellent Cephalocon talk:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=H-CRhw3XLGw&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://static.sched.com/hosted_files/cephalocon2025/80/Cephalocon%202025%20Ivancich.pdf?_gl=1*153a8oy*_gcl_au*MTgwNzY1MDQ2MC4xNzU4MjA2ODAy*FPAU*MTgwNzY1MDQ2MC4xNzU4MjA2ODAy&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion%3A-a-new-era-of-operational-excellence&quot;&gt;Conclusion: A New Era of Operational Excellence &lt;a class=&quot;link-anchor&quot; href=&quot;#conclusion%3A-a-new-era-of-operational-excellence&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ceph Tentacle&#39;s near-zero impact bucket resharding represents a
fundamental shift in production object storage operations,
eliminating one of the most significant pain points in large-scale deployments.&lt;/p&gt;
&lt;p&gt;As Ceph continues evolving with features like in-order sharding, the vision
becomes clear: &lt;strong&gt;single-bucket architectures that scale infinitely without operational complexity&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For data lakehouse architects building on Apache Iceberg, for AI/ML engineers
managing billions of training artifacts, and for enterprise architects demanding
the highest availability without operational friction, Ceph Tentacle
delivers the operational maturity that production workloads require.&lt;/p&gt;
&lt;p&gt;*All test configurations were performed on HDD production-equivalent hardware.
Results may vary based on hardware specifications, network topology, and workload
characteristics. Consult the official documentation for detailed configuration guidance and best practices.&lt;/p&gt;
&lt;p&gt;We would like to thank IBM for the time to author these articles.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Mastering IAM in Ceph: Multi-Tenancy, Access Control, and Why ACLs Must Die</title>
    <link href="https://ceph.io/en/news/blog/2026/mastering-iam/" />
    <updated>2026-01-24T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2026/mastering-iam/</id>
    <author>
      <name>Daniel Alexander Parkes, Anthony D&#39;Atri</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="rgw" />
      <category term="s3" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2026/mastering-iam/">&lt;h2 id=&quot;introduction&quot;&gt;Introduction &lt;a class=&quot;link-anchor&quot; href=&quot;#introduction&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1767549864482/5e07de10-5b83-4de3-a013-fd9c3f77427a.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;introduction%3A-when-security-theater-becomes-a-real-disaster&quot;&gt;Introduction: When Security Theater Becomes a Real Disaster &lt;a class=&quot;link-anchor&quot; href=&quot;#introduction%3A-when-security-theater-becomes-a-real-disaster&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In March 2017, a misconfigured S3 bucket at Verizon exposed the personal
information of 14 million customers. The root cause wasn&#39;t a sophisticated
attack; it was a simple oversight in access permissions. The bucket was
set to be publicly accessible due to S3 permission misconfiguration, and no one
noticed because ACLs were managed separately from the company&#39;s centralized IAM
policies. The security team had implemented careful, identity-based access controls,
but a resource-level ACL silently bypassed them by granting access to &amp;quot;All Users.&amp;quot;&lt;/p&gt;
&lt;p&gt;This scenario repeats constantly across the industry: ACLs creating invisible
access paths that security teams don&#39;t know exist, buckets accidentally exposed
to the public internet, and contractors uploading data that the bucket owner
cannot reliably read or administer, while still consuming capacity.&lt;/p&gt;
&lt;p&gt;Between 2017 and 2019, major companies exposed hundreds of millions of records
via misconfigured S3 permissions (ACLs and/or bucket policies):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verizon (2017)&lt;/strong&gt;: &lt;a href=&quot;https://www.techtarget.com/searchsecurity/news/450422709/Misconfigured-AWS-S3-bucket-exposes-millions-of-Verizon-customers-data&quot;&gt;14 million customers&lt;/a&gt; - An AWS S3 bucket configured for public access exposed names, addresses, account PINs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Facebook (2019)&lt;/strong&gt;: &lt;a href=&quot;https://www.upguard.com/breaches/facebook-user-data-leak&quot;&gt;540 million records&lt;/a&gt; - Third-party apps stored user data in publicly accessible S3 buckets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Instagram (2019)&lt;/strong&gt;: &lt;a href=&quot;https://www.cpomagazine.com/cyber-security/instagram-breach-exposes-personal-data-of-49-million-users/&quot;&gt;49 million records&lt;/a&gt; - Marketing firm left influencer database unprotected in AWS S3&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The AWS response was clear: &lt;a href=&quot;https://aws.amazon.com/about-aws/whats-new/2023/04/amazon-s3-security-best-practices-buckets-default/&quot;&gt;since April 2023&lt;/a&gt;,
&lt;strong&gt;all new S3 buckets default to &amp;quot;ACLs disabled&amp;quot;&lt;/strong&gt; (BucketOwnerEnforced) and &lt;strong&gt;Block Public Access enabled&lt;/strong&gt;.
AWS strongly recommends disabling ACLs on existing buckets and migrating to a pure
policy-based model with IAM Accounts architecture.&lt;/p&gt;
&lt;p&gt;If you&#39;re running the Ceph Object Gateway (RGW), you have access to the same IAM
Accounts model introduced in Ceph Squid 19.2.0. This post explains why ACLs must
be disabled immediately and how to implement modern, secure access control with IAM policies.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do This First (Quick Security Wins)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before reading further, take these two actions on all production buckets:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable Block Public Access&lt;/strong&gt; - Prevents public exposure via ACLs or bucket policies&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deny ACL operations&lt;/strong&gt; - Add explicit deny for &lt;code&gt;s3:PutObjectAcl&lt;/code&gt; and &lt;code&gt;s3:PutBucketAcl&lt;/code&gt; as defense-in-depth&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These changes prevent the attack patterns described in this post. Continue reading to understand why and how.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;why-acls-failed%3F&quot;&gt;Why ACLs Failed? &lt;a class=&quot;link-anchor&quot; href=&quot;#why-acls-failed%3F&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Access Control Lists (ACLs) were S3&#39;s original permission system. They failed
for several critical reasons that made them fundamentally unsafe for production use.&lt;/p&gt;
&lt;h3 id=&quot;public-access-disasters&quot;&gt;Public Access Disasters &lt;a class=&quot;link-anchor&quot; href=&quot;#public-access-disasters&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The most dangerous ACL failure was a silent public exposure. A single misconfigured
ACL could grant the entire internet access to your data, and your security team would
never know because ACLs weren&#39;t visible in centralized IAM policies.&lt;/p&gt;
&lt;p&gt;How it happened:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ export RGW_ENDPOINT=&amp;quot;https://rgw.example.com&amp;quot;

# Developer accidentally makes object public during testing
$ aws --profile developer --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api put-object-acl &#92;
  --bucket bucketacl &#92;
  --key hosts &#92;
  --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers
$ aws --profile developer --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api get-object-acl &#92;
  --bucket bucketacl &#92; 
  --key hosts
{
    &amp;quot;Owner&amp;quot;: {
        &amp;quot;DisplayName&amp;quot;: &amp;quot;developer&amp;quot;,
        &amp;quot;ID&amp;quot;: &amp;quot;developer&amp;quot;
    },
    &amp;quot;Grants&amp;quot;: [
        {
            &amp;quot;Grantee&amp;quot;: {
                &amp;quot;Type&amp;quot;: &amp;quot;Group&amp;quot;,
                &amp;quot;URI&amp;quot;: &amp;quot;http://acs.amazonaws.com/groups/global/AllUsers&amp;quot;
            },
            &amp;quot;Permission&amp;quot;: &amp;quot;READ&amp;quot;
        }
    ]
}

# Security team checks IAM policies - looks fine (against the same RGW endpoint)

$ aws --profile account-root --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; iam get-user-policy &#92;
  --user-name developer &#92;
  --policy-name S3Access

# ✓ Least privilege, no issues detected

# Meanwhile, the object is public to anyone who can reach the RGW endpoint:

$ curl &amp;quot;$RGW_ENDPOINT/bucketacl/hosts&amp;quot; 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.2XX.0.X   ceph01 

# Full access, no authentication required
# The same risk exists at bucket scope; a public bucket ACL enables unauthenticated listing
# which can leak keys and metadata

$ aws --profile developer --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api put-bucket-acl &#92;
--bucket bucketacl --acl public-read

# Unauthenticated Access to list bucket contents

$ curl -s &amp;quot;$RGW_ENDPOINT/bucketacl&amp;quot; | xmllint --format -
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;ListBucketResult xmlns=&amp;quot;http://s3.amazonaws.com/doc/2006-03-01/&amp;quot;&amp;gt;
  &amp;lt;Name&amp;gt;bucketacl&amp;lt;/Name&amp;gt;
 ...
  &amp;lt;Contents&amp;gt;
    &amp;lt;Key&amp;gt;hosts&amp;lt;/Key&amp;gt;
    &amp;lt;LastModified&amp;gt;2025-12-31T08:58:21.346Z&amp;lt;/LastModified&amp;gt;
    &amp;lt;ETag&amp;gt;&amp;quot;71ae31ad9b6e7fda9cb5a8628b2e152a&amp;quot;&amp;lt;/ETag&amp;gt;
    &amp;lt;Size&amp;gt;415&amp;lt;/Size&amp;gt;
    &amp;lt;StorageClass&amp;gt;STANDARD&amp;lt;/StorageClass&amp;gt;
    &amp;lt;Owner&amp;gt;
      &amp;lt;ID&amp;gt;developer&amp;lt;/ID&amp;gt;
      &amp;lt;DisplayName&amp;gt;developer&amp;lt;/DisplayName&amp;gt;
 ...
&amp;lt;/ListBucketResult&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Why was it catastrophic&lt;/strong&gt;?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Decentralized control&lt;/strong&gt;: ACLs could be set per-bucket and per-object, creating millions of potential exposure points&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No visibility&lt;/strong&gt;: ACLs didn&#39;t appear in the IAM console - security teams had no way to audit them centrally&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Silent bypasses&lt;/strong&gt;: Even perfect IAM policies couldn&#39;t prevent an ACL from granting public access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Object-level chaos&lt;/strong&gt;: With millions of objects, each having its own ACL, comprehensive auditing was impossible&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Real-world impact&lt;/strong&gt;: The three breaches in our introduction (Verizon, Facebook, Instagram) all involved publicly
accessible S3 data caused by permission misconfiguration (ACLs, bucket policies, or both), combined with weak central
visibility and auditing; exactly the problems that policy-based access control solves.&lt;/p&gt;
&lt;h3 id=&quot;the-object-ownership-problem&quot;&gt;The Object Ownership Problem &lt;a class=&quot;link-anchor&quot; href=&quot;#the-object-ownership-problem&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Beyond public access, ACLs created an ownership nightmare. When external accounts uploaded objects to your bucket, they owned those objects, not you.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Contractor uploads data to your bucket
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3 cp sensitive.pdf s3://company-bucket/contractor-data/ --profile contractor
upload: ./sensitive.pdf to s3://company-bucket/contractor-data/sensitive.pdf

# Who owns this object?
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api get-object-acl &#92;
  --bucket company-bucket &#92;
  --key contractor-data/sensitive.pdf &#92;
  --profile contractor
{
    &amp;quot;Owner&amp;quot;: {
        &amp;quot;DisplayName&amp;quot;: &amp;quot;Contractor Account&amp;quot;,
        &amp;quot;ID&amp;quot;: &amp;quot;contractor&amp;quot;  ← Contractor owns it, not you!
    }
}

# You (bucket owner) can&#39;t READ the object
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3 cp &#92;
  s3://company-bucket/contractor-data/sensitive.pdf &#92;
  ./test.pdf --profile company-admin
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

# You can&#39;t even GET the ACL to see permissions
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api get-object-acl &#92;
  --bucket company-bucket --key contractor-data/sensitive.pdf &#92;
  --profile company-admin
fatal error: An error occurred (AccessDenied) when calling the GetObjectAcl operation: Access Denied


# You can&#39;t MODIFY the ACL
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api put-object-acl &#92;
  --bucket company-bucket --key contractor-data/sensitive.pdf &#92;
  --acl private --profile company-admin
fatal error: An error occurred (AccessDenied) when calling the PutObjectAcl operation: Access Denied
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For on-premises Ceph deployments, while there&#39;s no per-GB billing surprise,
the &lt;strong&gt;operational and compliance problems are identical&lt;/strong&gt;: you can&#39;t read,
audit, or manage data in your own infrastructure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In Ceph RGW, bucket owners CAN delete objects they don&#39;t own. However, they
still can&#39;t read, view ACLs, or manage those objects, creating operational
blind spots and compliance risks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;the-authenticated-read-trap-(over-sharing-inside-the-cluster)&quot;&gt;The authenticated-read trap (over-sharing inside the cluster) &lt;a class=&quot;link-anchor&quot; href=&quot;#the-authenticated-read-trap-(over-sharing-inside-the-cluster)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ACLs include grants that &lt;em&gt;appear&lt;/em&gt; safer than &amp;quot;public&amp;quot; but remain dangerously broad.
In S3, &lt;code&gt;authenticated-read&lt;/code&gt; grants read access to the &lt;code&gt;AuthenticatedUsers&lt;/code&gt; group;
in Ceph RGW terms, that can translate to &amp;quot;any identity that can authenticate to
this RGW endpoint/cluster,&amp;quot; not &amp;quot;only my team.&amp;quot; On a shared on-premises
platform (multiple accounts, tenants, service accounts, CI users, integrations),
this can lead to accidental cross-team or cross-tenant data exposure.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Finance team uploads &amp;quot;internal&amp;quot; data with authenticated-read
# (thinking it&#39;s safer than public)
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3 cp finance-report.pdf &#92;
  s3://company-bucket/finance-report.pdf &#92;
  --acl authenticated-read --profile finance-team
 upload: ./finance-report.pdf to s3://company-bucket/finance-report.pdf

# Check the ACL - looks reasonable?
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api get-object-acl &#92;
  --bucket company-bucket &#92;
  --key finance-report.pdf --profile finance-team
{
    &amp;quot;Owner&amp;quot;: {
        &amp;quot;DisplayName&amp;quot;: &amp;quot;Finance Team&amp;quot;,
        &amp;quot;ID&amp;quot;: &amp;quot;finance-team&amp;quot;
    },
    &amp;quot;Grants&amp;quot;: [
        {
            &amp;quot;Grantee&amp;quot;: {
                &amp;quot;Type&amp;quot;: &amp;quot;Group&amp;quot;,
                &amp;quot;URI&amp;quot;: &amp;quot;http://acs.amazonaws.com/groups/global/AuthenticatedUsers&amp;quot;
            },
            &amp;quot;Permission&amp;quot;: &amp;quot;READ&amp;quot;  ← ANY authenticated user on the cluster!
        }
    ]
}

# DevOps team (completely different department) can read it!
$ aws --profile devops --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3 cp &#92;
  s3://company-bucket/finance-report.pdf ./leaked.pdf
download: s3://company-bucket/finance-report.pdf to ./leaked.pdf

# Contractor user (or any other authenticated user) can also access it
$ aws --profile contractor --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3 cp &#92;
  s3://company-bucket/finance-report.pdf ./contractor-copy.pdf
download: s3://company-bucket/finance-report.pdf to ./contractor-copy.pdf

# Anonymous users are still blocked
$ aws s3 cp s3://company-bucket/finance-report.pdf ./anon.pdf &#92;
  --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; --no-sign-request
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;public-write-is-an-integrity-disaster%2C-not-just-a-leak&quot;&gt;Public write is an integrity disaster, not just a leak &lt;a class=&quot;link-anchor&quot; href=&quot;#public-write-is-an-integrity-disaster%2C-not-just-a-leak&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ACL errors are not solely about &amp;quot;read&amp;quot; exposure. With bucket ACLs, &lt;code&gt;public-read-write&lt;/code&gt;
(or broad write grants) can enable untrusted PUT requests to a bucket. That turns into
an integrity incident: poisoned datasets, overwritten &amp;quot;golden&amp;quot; artifacts, malware
hosting, or backup tampering. Even on-prem &amp;quot;internal-only&amp;quot; does not save you; it
just changes the attacker&#39;s vector, but the threat still exists.&lt;/p&gt;
&lt;h3 id=&quot;write_acp-is-the-%22permission-to-rewrite-permissions.%22&quot;&gt;WRITE_ACP is the &amp;quot;permission to rewrite permissions.&amp;quot; &lt;a class=&quot;link-anchor&quot; href=&quot;#write_acp-is-the-%22permission-to-rewrite-permissions.%22&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ACLs don’t just control data-plane actions; they can delegate control-plane authority
over the ACL itself. In Ceph RGW S3 semantics, &lt;code&gt;WRITE_ACP&lt;/code&gt; the permission that allows
changing a bucket&#39;s ACL (required &lt;code&gt;WRITE_ACP&lt;/code&gt; for &lt;code&gt;PUT Bucket ACL&lt;/code&gt;). If the wrong
principal has it, they can escalate later by granting broader access (including
public exposure), and this delegation is distributed across buckets and objects.
This is a governance anti-pattern because the system contains a hidden &amp;quot;permission to change permissions.&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Step 1: Bucket owner grants contractor WRITE + WRITE_ACP
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api put-bucket-acl &#92;
  --bucket company-bucket &#92;
  --grant-write id=contractor &#92;
  --grant-write-acp id=contractor &#92;
  --profile developer

# Verify the ACL
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api get-bucket-acl &#92;
  --bucket company-bucket --profile developer
{
    &amp;quot;Owner&amp;quot;: {
        &amp;quot;DisplayName&amp;quot;: &amp;quot;developer&amp;quot;,
        &amp;quot;ID&amp;quot;: &amp;quot;developer&amp;quot;
    },
    &amp;quot;Grants&amp;quot;: [
        {
            &amp;quot;Grantee&amp;quot;: {
                &amp;quot;DisplayName&amp;quot;: &amp;quot;Contractor Account&amp;quot;,
                &amp;quot;ID&amp;quot;: &amp;quot;contractor&amp;quot;,
                &amp;quot;Type&amp;quot;: &amp;quot;CanonicalUser&amp;quot;
            },
            &amp;quot;Permission&amp;quot;: &amp;quot;WRITE&amp;quot;
        },
        {
            &amp;quot;Grantee&amp;quot;: {
                &amp;quot;DisplayName&amp;quot;: &amp;quot;Contractor Account&amp;quot;,
                &amp;quot;ID&amp;quot;: &amp;quot;contractor&amp;quot;,
                &amp;quot;Type&amp;quot;: &amp;quot;CanonicalUser&amp;quot;
            },
            &amp;quot;Permission&amp;quot;: &amp;quot;WRITE_ACP&amp;quot;  ← Contractor can modify ACLs!
        },
        {
            &amp;quot;Grantee&amp;quot;: {
                &amp;quot;DisplayName&amp;quot;: &amp;quot;developer&amp;quot;,
                &amp;quot;ID&amp;quot;: &amp;quot;developer&amp;quot;,
                &amp;quot;Type&amp;quot;: &amp;quot;CanonicalUser&amp;quot;
            },
            &amp;quot;Permission&amp;quot;: &amp;quot;FULL_CONTROL&amp;quot;
        }
    ]
}

# Step 2: Contractor abuses WRITE_ACP to make bucket PUBLIC
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api put-bucket-acl &#92;
  --bucket company-bucket &#92;
  --acl public-read --profile contractor
# Success! Contractor just made the bucket public

# Step 3: Verify the escalation
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3api get-bucket-acl &#92;
  --bucket company-bucket --profile developer
{
    &amp;quot;Owner&amp;quot;: {
        &amp;quot;DisplayName&amp;quot;: &amp;quot;developer&amp;quot;,
        &amp;quot;ID&amp;quot;: &amp;quot;developer&amp;quot;
    },
    &amp;quot;Grants&amp;quot;: [
        {
            &amp;quot;Grantee&amp;quot;: {
                &amp;quot;Type&amp;quot;: &amp;quot;Group&amp;quot;,
                &amp;quot;URI&amp;quot;: &amp;quot;http://acs.amazonaws.com/groups/global/AllUsers&amp;quot;
            },
            &amp;quot;Permission&amp;quot;: &amp;quot;READ&amp;quot;  ← NOW PUBLIC! Anyone can list contents
        },
        {
            &amp;quot;Grantee&amp;quot;: {
                &amp;quot;DisplayName&amp;quot;: &amp;quot;developer&amp;quot;,
                &amp;quot;ID&amp;quot;: &amp;quot;developer&amp;quot;,
                &amp;quot;Type&amp;quot;: &amp;quot;CanonicalUser&amp;quot;
            },
            &amp;quot;Permission&amp;quot;: &amp;quot;FULL_CONTROL&amp;quot;
        }
    ]
}

# Step 4: Anonymous users can now list the bucket
$ aws s3 ls s3://company-bucket/ &#92;
  --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; --no-sign-request
2025-12-31 05:00:00         27 finance-report.pdf
# Public exposure complete
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;the-solution%3A-stop-using-acls-immediately&quot;&gt;The Solution: Stop using ACLs immediately &lt;a class=&quot;link-anchor&quot; href=&quot;#the-solution%3A-stop-using-acls-immediately&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;AWS and the Ceph Object Gateway (RGW) provide controls to disable ACLs
entirely. This should be your first action on any production bucket.&lt;/p&gt;
&lt;h3 id=&quot;step-1%3A-block-public-access&quot;&gt;Step 1: Block Public Access &lt;a class=&quot;link-anchor&quot; href=&quot;#step-1%3A-block-public-access&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Enforce public access blocks to prevent bucket ACLs from granting public access.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ceph AWS CLI Configuration Note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;All &lt;code&gt;aws&lt;/code&gt; CLI commands in this guide assume your AWS CLI profile is configured: See the &lt;a href=&quot;https://docs.ceph.com/en/latest/radosgw/s3/commons/#aws-cli-setup&quot;&gt;Ceph documentation on AWS CLI configuration&lt;/a&gt; and &lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html&quot;&gt;AWS CLI endpoint configuration&lt;/a&gt; for details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bucket-level (Granularity per individual bucket):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Anon access is enabled on bucket from previous example

$ aws s3 ls s3://company-bucket/ &#92;
  --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; --no-sign-request
                           PRE contractor-data/
2025-12-31 07:13:55         26 finance-report.pdf

# We use public-access-block on our bucket

$ aws s3api put-public-access-block &#92;
  --bucket company-bucket &#92;
  --public-access-block-configuration &#92;
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true &#92;
  --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; &#92;
  --profile developer

# Public access has been removed from the bucket,
# a non-authorized request fails after the put-public-access-block

$ aws s3 ls s3://company-bucket/ --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; --no-sign-request
fatal error: An error occurred (AccessDenied) when&#92;
  calling the ListObjectsV2 operation: Access Denied
# Some AWS CLI versions surface certain error responses
# poorly; if you see a Python exception, re-run with
# --debug to confirm the underlying HTTP 403/AccessDenied.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What each setting does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BlockPublicAcls&lt;/strong&gt;: Prevents new public ACLs from being applied (redundant if BucketOwnerEnforced, but adds defense in depth)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IgnorePublicAcls&lt;/strong&gt;: Ignores existing public ACLs (treats them as private)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BlockPublicPolicy&lt;/strong&gt;: Prevents bucket policies that grant public access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RestrictPublicBuckets&lt;/strong&gt;: Blocks public access to buckets even if policies exist&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;step-2%3A-deny-acl-operations-via-iam-policy&quot;&gt;Step 2: Deny ACL Operations via IAM Policy &lt;a class=&quot;link-anchor&quot; href=&quot;#step-2%3A-deny-acl-operations-via-iam-policy&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As the root account administrator, you should establish a security baseline that
prevents ACL usage &lt;strong&gt;by default&lt;/strong&gt; for all users and groups. This way, even if a
developer tries to use ACLs in the future, they&#39;ll get an immediate &lt;code&gt;Access Denied&lt;/code&gt;
error, preventing accidents before they happen.&lt;/p&gt;
&lt;p&gt;The governance pattern creates a standard &amp;quot;DenyACLs&amp;quot; policy that you attach to every
new user or group you create. This establishes ACL blocking as your organization&#39;s security baseline.&lt;/p&gt;
&lt;p&gt;Create the standard policy:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cat &amp;gt; deny-acl-operations.json &amp;lt;&amp;lt;&#39;EOF&#39;
{
  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
  &amp;quot;Statement&amp;quot;: [
    {
      &amp;quot;Sid&amp;quot;: &amp;quot;DenyACLOperations&amp;quot;,
      &amp;quot;Effect&amp;quot;: &amp;quot;Deny&amp;quot;,
      &amp;quot;Action&amp;quot;: [
        &amp;quot;s3:PutObjectAcl&amp;quot;,
        &amp;quot;s3:PutObjectVersionAcl&amp;quot;,
        &amp;quot;s3:PutBucketAcl&amp;quot;
      ],
      &amp;quot;Resource&amp;quot;: [
        &amp;quot;arn:aws:s3:::*&amp;quot;,
        &amp;quot;arn:aws:s3:::*/*&amp;quot;
      ]
    }
  ]
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is an example of how to apply the policy to new users as you create them:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Create a new developer
$ aws iam create-user --user-name alice
{
    &amp;quot;User&amp;quot;: {
        &amp;quot;Path&amp;quot;: &amp;quot;/&amp;quot;,
        &amp;quot;UserName&amp;quot;: &amp;quot;alice&amp;quot;,
        &amp;quot;UserId&amp;quot;: &amp;quot;4abb3a59-7991-4644-8863-347b02adc48f&amp;quot;,
        &amp;quot;Arn&amp;quot;: &amp;quot;arn:aws:iam::RGW89761398048153XXX:user/alice&amp;quot;,
        &amp;quot;CreateDate&amp;quot;: &amp;quot;2025-01-03T15:44:06.920034Z&amp;quot;
    }
}
$ aws iam create-access-key --user-name alice

# Immediately apply the ACL deny policy (before giving any other permissions)
$ aws iam put-user-policy &#92;
  --user-name alice &#92;
  --policy-name DenyACLs &#92;
  --policy-document file://deny-acl-operations.json

# Now grant the user their actual S3 permissions
$ aws iam attach-user-policy --user-name alice --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If Alice later tries to configure ACLs on any bucket, she will get &lt;code&gt;Access Denied&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Create a bucket as Alice, upload an Object and try to apply a public ACL on the Object
$ aws --profile alice --endpoint-url=&amp;quot;$RGW_ENDPOINT&amp;quot; &#92;
  s3 mb s3://alicebucket
$ aws --profile alice --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; &#92;
  s3 cp finance-report.pdf s3://alicebucket
$ aws --profile alice --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; &#92;
  s3api put-object-acl --bucket alicebucket --key &#92;
  finance-report.pdf --acl public-read
#  Error: Access Denied
fatal error: An error occurred (AccessDenied) when calling the PutObjectAcl operation: Access Denied
# Some AWS CLI versions surface certain error responses poorly; if you see a Python exception, re-run with --debug to confirm the underlying HTTP 403/AccessDenied.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;%22wait%2C-how-do-i-share-data-now%3F%22&quot;&gt;&amp;quot;Wait, How Do I Share Data Now?&amp;quot; &lt;a class=&quot;link-anchor&quot; href=&quot;#%22wait%2C-how-do-i-share-data-now%3F%22&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With ACLs disabled, you might be wondering: How do I grant cross-account access
to share my datasets?&lt;/p&gt;
&lt;p&gt;Previously, you might have used ACLs to grant a contractor account read access
to specific objects or allowed a partner account to upload files. With ACLs gone,
how do you securely share data between accounts?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two modern approaches exist&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;How It Works&lt;/th&gt;
&lt;th&gt;Access Pattern&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bucket policies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resource owner adds bucket policy; requesting account adds identity policy&lt;/td&gt;
&lt;td&gt;Direct, always-on access&lt;/td&gt;
&lt;td&gt;Static, permanent sharing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM Role assumption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resource owner creates an assumable role; requesting account assumes it&lt;/td&gt;
&lt;td&gt;Temporary session (1-12h)&lt;/td&gt;
&lt;td&gt;Dynamic, auditable access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;We&#39;ll focus on IAM role assumption&lt;/strong&gt; because it provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Temporary credentials&lt;/strong&gt; that auto-expire (vs. permanent keys)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Detailed audit trails&lt;/strong&gt; showing who assumed what role and when (vs. static access logs)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Instant revocation&lt;/strong&gt; by deleting the role (vs. updating multiple policies)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Least privilege&lt;/strong&gt; with time-bound access (vs. always-on permissions)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is also AWS&#39;s recommended pattern and follows zero-trust principles. Let&#39;s see how.&lt;/p&gt;
&lt;h2 id=&quot;iam-accounts%3A-the-modern-solution&quot;&gt;IAM Accounts: The Modern Solution &lt;a class=&quot;link-anchor&quot; href=&quot;#iam-accounts%3A-the-modern-solution&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Ceph Object Gateway (RGW) implements AWS-compatible IAM Accounts, introduced in
Squid/19.2.0. This provides proper multi-tenancy with policy-based access control instead of ACLs.&lt;/p&gt;
&lt;h3 id=&quot;what-is-an-iam-account%3F&quot;&gt;What is an IAM Account? &lt;a class=&quot;link-anchor&quot; href=&quot;#what-is-an-iam-account%3F&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An &lt;strong&gt;IAM Account&lt;/strong&gt; provides isolation for identities and access control:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;Account: finance-team (ID: RGW12345678901234567)
├── Users &amp;amp; Groups (isolated per account)
├── Roles (isolated per account)  
├── Policies (fine-grained permissions)
└── S3 Buckets (owned by account)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;S3 bucket &lt;strong&gt;names&lt;/strong&gt; are globally unique across ALL accounts in a flat namespace
(just like AWS S3). If Finance creates a bucket called &lt;code&gt;financial-reports&lt;/code&gt; no
other account can use that name. However, bucket ownership and access control
are account-specific, only Finance can manage their &lt;code&gt;financial-reports&lt;/code&gt; bucket.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ceph accounts can optionally belong to a tenant for namespace isolation. Within
a tenant, bucket names are unique to that tenant; they are not globally unique across all tenants.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Key distinction:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account Root User&lt;/strong&gt;: Emergency admin access only, created with &lt;code&gt;--account-root&lt;/code&gt; flag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IAM Users&lt;/strong&gt;: Day-to-day access, follows the least privilege principle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For this post, we&#39;ll assume you have two accounts already set up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Finance Account&lt;/strong&gt; (ID: &lt;code&gt;RGW00893359550361292&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevOps Account&lt;/strong&gt; (ID: &lt;code&gt;RGW89761398048153888&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;For a complete guide on creating IAM Accounts, users, and basic configuration,
see our previous post: &lt;a href=&quot;https://ceph.io/en/news/blog/2025/enhancing-ceph-multitenancy-with-iam-accounts/&quot;&gt;Enhancing Ceph Multitenancy with IAM Accounts&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;cross-account-sharing%3A-the-modern-way&quot;&gt;Cross-Account Sharing: The Modern Way &lt;a class=&quot;link-anchor&quot; href=&quot;#cross-account-sharing%3A-the-modern-way&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Finance needs to give DevOps read-only access to backup data for
disaster recovery testing. Previously, this might have been done with ACLs. Now, we use cross-account role assumption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DevOps can read backups, but cannot modify or delete them&lt;/li&gt;
&lt;li&gt;Access uses temporary credentials (not long-term keys)&lt;/li&gt;
&lt;li&gt;Finance can revoke access instantly&lt;/li&gt;
&lt;li&gt;Fully auditable (who accessed what, when)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How It Works &lt;a class=&quot;link-anchor&quot; href=&quot;#how-it-works&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The key insight: Create a role in the Finance account (same account as the bucket).
When DevOps assumes this role, they temporarily &amp;quot;become&amp;quot; a Finance account principal with Finance credentials.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1765907670163/8b060b2d-6f10-4761-82b7-75717606b121.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is the same STS pattern we covered in our &lt;a href=&quot;https://ceph.io/en/news/blog/2025/rgw-modernizing-sts/&quot;&gt;previous post on temporary credentials&lt;/a&gt;,
but now applied to cross-account access.&lt;/p&gt;
&lt;h3 id=&quot;implementation&quot;&gt;Implementation &lt;a class=&quot;link-anchor&quot; href=&quot;#implementation&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;1.-finance-creates-a-cross-account-role-for-the-devops-team&quot;&gt;1. Finance Creates a Cross-Account Role for the Devops Team &lt;a class=&quot;link-anchor&quot; href=&quot;#1.-finance-creates-a-cross-account-role-for-the-devops-team&quot;&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Finance creates a role called &lt;code&gt;devops-backup-reader&lt;/code&gt; in their account with two policies:&lt;/p&gt;
&lt;p&gt;The Trust Policy (who can assume this role):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cat &amp;gt; trust-policy.json &amp;lt;&amp;lt;&#39;EOF&#39;
{
  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
  &amp;quot;Statement&amp;quot;: [{
    &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
    &amp;quot;Principal&amp;quot;: {
      &amp;quot;AWS&amp;quot;: &amp;quot;arn:aws:iam::RGW89761398048153888:user/dave-backup-ops&amp;quot;
    },
    &amp;quot;Action&amp;quot;: &amp;quot;sts:AssumeRole&amp;quot;
  }]
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This says: &lt;em&gt;&lt;strong&gt;&amp;quot;DevOps account user ‘dave’ can assume this role.&amp;quot;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can use in the trust policy the &lt;code&gt;RGWXXXX:root&lt;/code&gt; formatting for the Principal.
This gives access to all users in the devops account to assume the role. Then we
could configure in the devops account to allow users from a specific IAM group to
be able to assume the finance &lt;code&gt;devops-backup-reader&lt;/code&gt; role.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And the Permission Policy (what the role can do):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cat &amp;gt; role-permissions.json &amp;lt;&amp;lt;&#39;EOF&#39;
{
  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
  &amp;quot;Statement&amp;quot;: [{
    &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
    &amp;quot;Action&amp;quot;: [&amp;quot;s3:GetObject&amp;quot;, &amp;quot;s3:ListBucket&amp;quot;],
    &amp;quot;Resource&amp;quot;: [
      &amp;quot;arn:aws:s3:::finance-backups&amp;quot;,
      &amp;quot;arn:aws:s3:::finance-backups/*&amp;quot;
    ]
  }]
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This says: &lt;strong&gt;&amp;quot;&lt;em&gt;This role can list &amp;amp; read the finance-backups bucket.&lt;/em&gt;&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once we have the policy files created, we can go ahead and create the IAM role &lt;code&gt;devops-backup-reader&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws --profile finance-admin s3 mb s3://finance-backups 
$ aws iam create-role &#92;
  --profile finance-admin &#92;
  --role-name devops-backup-reader &#92;
  --assume-role-policy-document file://trust-policy.json

$ aws iam put-role-policy &#92;
  --profile finance-admin &#92;
  --role-name devops-backup-reader &#92;
  --policy-name ReadBackups &#92;
  --policy-document file://role-permissions.json
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;2.-devops-user-accesses-the-finance-account-dataset&quot;&gt;2. DevOps User Accesses the Finance Account Dataset &lt;a class=&quot;link-anchor&quot; href=&quot;#2.-devops-user-accesses-the-finance-account-dataset&quot;&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Dave from the DevOps team assumes the role and gets temporary Finance credentials:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Assume Finance role
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; sts assume-role &#92;
  --profile dave-backup-ops &#92;
  --role-arn &amp;quot;arn:aws:iam::RGW00893359550361292:role/devops-backup-reader&amp;quot; &#92;
  --role-session-name david-devops-backup-finance &#92;
  --region default

{
    &amp;quot;Credentials&amp;quot;: {
        &amp;quot;AccessKeyId&amp;quot;: &amp;quot;ASIA****************&amp;quot;,
        &amp;quot;SecretAccessKey&amp;quot;: &amp;quot;REDACTED&amp;quot;,
        &amp;quot;SessionToken&amp;quot;: &amp;quot;REDACTED&amp;quot;,
        &amp;quot;Expiration&amp;quot;: &amp;quot;2025-0X-15TXX:00:00Z&amp;quot;
    }
}

# Use temporary credentials
$ export AWS_ACCESS_KEY_ID=ASIA****************
$ export AWS_SECRET_ACCESS_KEY=REDACTED
$ export AWS_SESSION_TOKEN=REDACTED

# Access Finance backups (using Finance account credentials!)
$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3 ls s3://finance-backups/
2025-01-14 02:00:00  daily-backup-2025-01-14.tar.gz

$ aws --endpoint-url &amp;quot;$RGW_ENDPOINT&amp;quot; s3 cp s3://finance-backups/daily-backup-2025-01-14.tar.gz .
download: s3://finance-backups/daily-backup-2025-01-14.tar.gz to ./daily-backup-2025-01-14.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;why-this-works-(and-why-no-bucket-policy-is-needed)&quot;&gt;Why This Works (And Why No Bucket Policy Is Needed) &lt;a class=&quot;link-anchor&quot; href=&quot;#why-this-works-(and-why-no-bucket-policy-is-needed)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The role &lt;code&gt;devops-backup-reader&lt;/code&gt; is in the Finance account (same account as the
bucket). When Dave assumes this role, he receives temporary Finance account
credentials. From the bucket&#39;s perspective, this is same-account access:
only the role&#39;s policy is required; no bucket policy is needed.&lt;/p&gt;
&lt;p&gt;The cross-account part: Only the AssumeRole action crosses accounts. The actual
bucket access is the same account (role and bucket), both in Finance.&lt;/p&gt;
&lt;h3 id=&quot;security-benefits-of-this-approach&quot;&gt;Security Benefits of This Approach &lt;a class=&quot;link-anchor&quot; href=&quot;#security-benefits-of-this-approach&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Temporary credentials&lt;/strong&gt;: Expire after 1 hour (configurable up to 12 hours)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No shared secrets&lt;/strong&gt;: DevOps never sees Finance&#39;s long-term keys&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instant revocation&lt;/strong&gt;: Finance deletes the role → all access stops immediately&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit trail&lt;/strong&gt;: Logs show role name, session name, and requesting account&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Least privilege&lt;/strong&gt;: Role has only read permissions, nothing more&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better than ACLs&lt;/strong&gt;: Centralized control, no object-level chaos&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-the-audit-logs-show&quot;&gt;What the Audit Logs Show &lt;a class=&quot;link-anchor&quot; href=&quot;#what-the-audit-logs-show&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Ceph Object Gateway (RGW) audit logs capture the
complete cross-account access pattern. Here&#39;s what you will see:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Ensure RGW audit logging is enabled. See the &lt;a href=&quot;https://docs.ceph.com/en/latest/radosgw/config-ref/#bucket-and-object-audit-logging&quot;&gt;Ceph documentation on bucket and object audit logging&lt;/a&gt; (OPS logs) for configuration details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Example audit log extract when DevOps assumes the Finance role:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;$ tail -f /var/log/ceph/ops-log-ceph-client.rgw.default.ceph02.fvqogr.log | jq .
{
...
  &amp;quot;time&amp;quot;: &amp;quot;2025-01-04T17:34:07.711570Z&amp;quot;,
  &amp;quot;time_local&amp;quot;: &amp;quot;2025-01-04T17:34:07.711570+0000&amp;quot;,
  &amp;quot;remote_addr&amp;quot;: &amp;quot;10.251.0.21&amp;quot;,
  &amp;quot;user&amp;quot;: &amp;quot;98b5e284-bd74-4a54-922e-cf1ee1d460c2&amp;quot;,
  &amp;quot;operation&amp;quot;: &amp;quot;assume_role&amp;quot;,
  &amp;quot;uri&amp;quot;: &amp;quot;POST / HTTP/1.1&amp;quot;,
  &amp;quot;http_status&amp;quot;: &amp;quot;200&amp;quot;,
  &amp;quot;bytes_sent&amp;quot;: 999,
  &amp;quot;user_agent&amp;quot;: &amp;quot;aws-cli/1.38.34 md/Botocore#1.37.34 ua/2.1 os/linux#5.14.0-496.el9.x86_64 md/arch#x86_64 lang/python#3.9.19 md/pyimpl#CPython m/N cfg/retry-mode#legacy botocore/1.37.34&amp;quot;,
  &amp;quot;referrer&amp;quot;: &amp;quot;&amp;quot;,
  &amp;quot;trans_id&amp;quot;: &amp;quot;tx000001bb92497c13eba06-00695aa48f-494246-default&amp;quot;,
  &amp;quot;access_key_id&amp;quot;: &amp;quot;MPUWRVKZFH9XXXXXXX&amp;quot;,
  &amp;quot;temp_url&amp;quot;: false
}

# We can then get any specific details on this user
$ radosgw-admin user info --access-key=MPUWRVKZFH9XXXXXXX
{
    &amp;quot;user_id&amp;quot;: &amp;quot;98b5e284-bd74-4a54-922e-cf1ee1d460c2&amp;quot;,
    &amp;quot;display_name&amp;quot;: &amp;quot;dave-backup-ops&amp;quot;,
    &amp;quot;email&amp;quot;: &amp;quot;&amp;quot;,
    &amp;quot;suspended&amp;quot;: 0,
    &amp;quot;max_buckets&amp;quot;: 1000,
    ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example audit log extract when Dave from the DevOps Account accesses the Finance bucket:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;bucket&amp;quot;: &amp;quot;finance-backups&amp;quot;,
  &amp;quot;object&amp;quot;: &amp;quot;daily-backup-2025-01-14.tar.gz&amp;quot;,
  &amp;quot;time&amp;quot;: &amp;quot;2026-01-04T17:42:35.956711Z&amp;quot;,
  &amp;quot;time_local&amp;quot;: &amp;quot;2026-01-04T17:42:35.956711+0000&amp;quot;,
  &amp;quot;remote_addr&amp;quot;: &amp;quot;10.251.0.21&amp;quot;,
  &amp;quot;object_owner&amp;quot;: &amp;quot;RGW00893359550361292&amp;quot;,
  &amp;quot;user&amp;quot;: &amp;quot;98b5e284-bd74-4a54-922e-cf1ee1d460c2&amp;quot;,
  &amp;quot;operation&amp;quot;: &amp;quot;get_obj&amp;quot;,
  &amp;quot;uri&amp;quot;: &amp;quot;GET /finance-backups/daily-backup-2025-01-14.tar.gz HTTP/1.1&amp;quot;,
  &amp;quot;http_status&amp;quot;: &amp;quot;200&amp;quot;,
  &amp;quot;bytes_sent&amp;quot;: 26,
  &amp;quot;bytes_received&amp;quot;: 0,
  &amp;quot;object_size&amp;quot;: 26,
  &amp;quot;total_time&amp;quot;: 3,
  &amp;quot;user_agent&amp;quot;: &amp;quot;aws-cli/1.38.34 md/Botocore#1.37.34 ua/2.1 os/linux#5.14.0-496.el9.x86_64 md/arch#x86_64 lang/python#3.9.19 md/pyimpl#CPython m/N cfg/retry-mode#legacy botocore/1.37.34&amp;quot;,
  &amp;quot;trans_id&amp;quot;: &amp;quot;tx00000a13eeac4ce551ce2-00695aa68b-494246-default&amp;quot;,
  &amp;quot;authentication_type&amp;quot;: &amp;quot;STS&amp;quot;,
  &amp;quot;sts_info&amp;quot;: {
    &amp;quot;role_name&amp;quot;: &amp;quot;$devops-backup-reader&amp;quot;,
    &amp;quot;role_session&amp;quot;: &amp;quot;david-devops-backup-finance&amp;quot;
  },
  &amp;quot;temp_url&amp;quot;: false
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this tells you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Who&lt;/strong&gt;: Dave from DevOps (identified by role session name and the user uid)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When&lt;/strong&gt;: &lt;code&gt;2026-01-04T17:42:35.956711Z&lt;/code&gt; (exact UTC timestamp)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What&lt;/strong&gt;: Downloaded &lt;code&gt;daily-backup-2025-01-14.tar.gz&lt;/code&gt; from &lt;code&gt;finance-backups&lt;/code&gt; bucket&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How&lt;/strong&gt;: Via STS temporary credentials (&lt;code&gt;authentication_type: &amp;quot;STS&amp;quot;&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;Assumed role: &lt;code&gt;devops-backup-reader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Session: &lt;code&gt;david-devops-backup-finance&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From where&lt;/strong&gt;: IP address &lt;code&gt;10.251.0.21&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bucket owner&lt;/strong&gt;: Finance account &lt;code&gt;RGW00893359550361292&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Status&lt;/strong&gt;: Success (&lt;code&gt;http_status: 200&lt;/code&gt;, 26 bytes transferred)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Key security insights from this log:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Authentication type is explicitly marked as &amp;quot;STS&amp;quot;&lt;/strong&gt; - You can easily filter all temporary credential access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User who assumed the role is identified&lt;/strong&gt; - (&lt;code&gt;98b5e284-bd74-4a54-922e-cf1ee1d460c2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Role name is captured&lt;/strong&gt; - You know which role was used (&lt;code&gt;devops-backup-reader&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session name is captured&lt;/strong&gt; - You can trace back to who initiated the session (Dave via &lt;code&gt;david-devops-backup-finance&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Object owner is logged&lt;/strong&gt; - Confirms the bucket belongs to the Finance account, not the accessor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full HTTP details&lt;/strong&gt; - User agent shows it was AWS CLI, complete with version&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Compared to ACLs: With ACLs, you had no audit trail showing who from which
account accessed what. The logs only showed &amp;quot;someone accessed the object&amp;quot;
with no attribution to the originating account or session context.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Comparison of IAM Roles Versus ACLs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ACLs: Decentralized, object-level, permanent, no audit trail of cross-account access&lt;/li&gt;
&lt;li&gt;IAM Roles: Centralized, temporary, revocable, full audit trail with account attribution&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;understanding-policy-evaluation&quot;&gt;Understanding Policy Evaluation &lt;a class=&quot;link-anchor&quot; href=&quot;#understanding-policy-evaluation&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To use IAM effectively, you need to understand how permissions are evaluated.&lt;/p&gt;
&lt;h3 id=&quot;the-basic-rule&quot;&gt;The Basic Rule &lt;a class=&quot;link-anchor&quot; href=&quot;#the-basic-rule&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When a user requests access to an S3 resource, it follows the following workflow,
taking into account that any &lt;code&gt;DENY&lt;/code&gt; always wins over &lt;code&gt;ALLOW&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1765908590713/83e2782a-fffe-4b8b-a03c-8017778ba232.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Explicit &lt;code&gt;DENY&lt;/code&gt; always wins, even if there are multiple &lt;code&gt;ALLOW&lt;/code&gt; statements.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;same-account-vs-cross-account&quot;&gt;Same-Account vs Cross-Account &lt;a class=&quot;link-anchor&quot; href=&quot;#same-account-vs-cross-account&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Same-Account Access&lt;/strong&gt; (user and bucket in the same account):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permission needed in either the bucket policy or the identity policy&lt;/li&gt;
&lt;li&gt;One &lt;code&gt;ALLOW&lt;/code&gt; is sufficient&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cross-Account Access&lt;/strong&gt; (using role assumption):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permission needed for AssumeRole (on both sides - trust policy + identity policy)&lt;/li&gt;
&lt;li&gt;Role&#39;s identity policy grants bucket access (same-account from bucket&#39;s perspective)&lt;/li&gt;
&lt;li&gt;No bucket policy needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-security-roadmap%3A-enterprise-s3-security-coming-to-ceph&quot;&gt;The Security Roadmap: Enterprise S3 Security Coming to Ceph &lt;a class=&quot;link-anchor&quot; href=&quot;#the-security-roadmap%3A-enterprise-s3-security-coming-to-ceph&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Ceph community is making a significant investment in enterprise S3 security.
Several critical features are under active development to bring Ceph RGW to full
feature parity with AWS S3&#39;s modern security model. Here&#39;s what&#39;s coming and why it matters.&lt;/p&gt;
&lt;h3 id=&quot;bucketownerenforced%3A-disabling-acls-(coming-in-a-tentacle-update)&quot;&gt;BucketOwnerEnforced: Disabling ACLs (Coming in a Tentacle update) &lt;a class=&quot;link-anchor&quot; href=&quot;#bucketownerenforced%3A-disabling-acls-(coming-in-a-tentacle-update)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Status: Merged into Ceph v20.3.0 (Tentacle) (&lt;a href=&quot;https://tracker.ceph.com/issues/63323&quot;&gt;Issue #63323)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What it does: The &lt;code&gt;PutBucketOwnershipControls&lt;/code&gt; API with &lt;code&gt;BucketOwnerEnforced&lt;/code&gt;
setting disables ACLs entirely and forces all objects to be owned by the bucket
owner regardless of who uploaded them.&lt;/p&gt;
&lt;p&gt;The problem it solves:&lt;/p&gt;
&lt;p&gt;Before (with ACLs):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contractor uploads → contractor owns object → you, as the owner of the bucket, can&#39;t delete it&lt;/li&gt;
&lt;li&gt;Developer sets ACL to public → bucket exposed to the internet&lt;/li&gt;
&lt;li&gt;Objects disappear from inventory (owned by other accounts)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After (BucketOwnerEnforced):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Anyone uploads → you own the object → you control it completely&lt;/li&gt;
&lt;li&gt;ACLs are ignored → impossible to make the bucket public accidentally via ACLs&lt;/li&gt;
&lt;li&gt;All objects visible in your inventory reports&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How it will work:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Enable BucketOwnerEnforced on a bucket
$ aws s3api put-bucket-ownership-controls &#92;
  --bucket company-data &#92;
  --ownership-controls &#39;Rules=[{ObjectOwnership=BucketOwnerEnforced}]&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Once enabled, any requests that include ACL headers (e.g., &lt;code&gt;--acl public-read&lt;/code&gt;) will
fail. Applications must be audited before enabling this feature on their buckets
because if the application &lt;strong&gt;is using ACLs&lt;/strong&gt; in their workflow the application
requests using the ACL headers will start failing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;s3control-api-block-public-access-(coming-soon)&quot;&gt;S3Control API Block Public Access (Coming Soon) &lt;a class=&quot;link-anchor&quot; href=&quot;#s3control-api-block-public-access-(coming-soon)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Status: Active development, &lt;a href=&quot;https://github.com/ceph/ceph/pull/64293&quot;&gt;PR #64293&lt;/a&gt; under review&lt;/p&gt;
&lt;p&gt;You&#39;ve disabled ACLs in your Finance account. You&#39;ve enabled Block Public Access.
Your security team is confident the Finance buckets are locked down. Then someone
in the Marketing account creates a new IAM user, spins up a bucket, and accidentally
makes it public during a website deployment test. Your Finance settings didn&#39;t apply
to Marketing&#39;s account because each account manages its own configuration independently.&lt;/p&gt;
&lt;p&gt;This is where account-level controls become critical. While individual buckets can
have their own Block Public Access settings, managing hundreds or thousands of
buckets individually is error-prone. The S3Control API allows you to set
account-level defaults that apply automatically to all buckets in that
account, both existing and any new bucket created in the future.&lt;/p&gt;
&lt;p&gt;Account-level enforcement prevents all public access:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Block all public access for entire account
$ aws s3control put-public-access-block &#92;
  --account-id RGW11111111111111111 &#92;
  --public-access-block-configuration &#92;
    BlockPublicAcls=true,&#92;
    IgnorePublicAcls=true,&#92;
    BlockPublicPolicy=true,&#92;
    RestrictPublicBuckets=true
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Once the account administrator sets this policy using S3Control, regular account
users cannot override it. If a user later tries to disable Block Public Access
on a specific bucket, make a bucket public via ACL, or add a public bucket policy,
all those attempts will fail with &amp;quot;Access Denied.&amp;quot; The account-level setting takes
precedence and cannot be bypassed by bucket-level operations. This creates a
secure-by-default environment in which enabling public access using ACLs at
the bucket-level is impossible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What each setting will do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BlockPublicAcls&lt;/strong&gt;: Prevents new public ACLs from being applied to buckets/objects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IgnorePublicAcls&lt;/strong&gt;: Ignores existing public ACLs (treats them as private)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BlockPublicPolicy&lt;/strong&gt;: Prevents bucket policies that grant public access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RestrictPublicBuckets&lt;/strong&gt;: Blocks public access even if policies exist&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Account-level Block Public Access is enforced by the account administrator on
regular users within that account, but the account administrator themselves
can still modify or disable it. For enforcement from a &lt;strong&gt;higher authority&lt;/strong&gt;,
you need organization-level controls. See the next section on Organizational
Units and SCPs, which enable Ceph/RGW cluster administrators to enforce
immutable policies across all accounts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;organizational-units-and-service-control-policies-(future)&quot;&gt;Organizational Units and Service Control Policies (Future) &lt;a class=&quot;link-anchor&quot; href=&quot;#organizational-units-and-service-control-policies-(future)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Roadmap item for future Ceph releases&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it will do&lt;/strong&gt;: Enable cluster administrators to enforce immutable security
policies across multiple accounts—policies that even account administrators cannot disable or modify.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The problem it solves&lt;/strong&gt;: Account-level controls rely on administrator discipline.
A determined (or compromised) account administrator can disable Block Public Access
or re-enable ACLs. Organization-level controls provide actual enforcement from a
higher authority that cannot be bypassed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example use cases&lt;/strong&gt; (when available):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Immutable Block Public Access&lt;/strong&gt;: Cluster admin sets organization-wide &amp;quot;no public buckets&amp;quot;
policy: account admins cannot disable it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Required encryption&lt;/strong&gt;: Force all objects to use encryption → accounts cannot opt out&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-account access policies&lt;/strong&gt;: Restrict which accounts can share data with external accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit requirements&lt;/strong&gt;: Enforce logging and monitoring so that accounts cannot be disabled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This will provide enterprise multi-tenant governance that scales to thousands
of accounts with immutable top-down policy enforcement.&lt;/p&gt;
&lt;h2 id=&quot;conclusion%3A-ceph&#39;s-enterprise-security-transformation&quot;&gt;Conclusion: Ceph&#39;s Enterprise Security Transformation &lt;a class=&quot;link-anchor&quot; href=&quot;#conclusion%3A-ceph&#39;s-enterprise-security-transformation&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1767550127997/3f2532cb-2bac-45d2-b99c-b69ff3f7fec6.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The migration from ACLs to IAM represents a fundamental shift in S3 security
philosophy: from decentralized, object-level chaos to centralized, policy-based control.&lt;/p&gt;
&lt;p&gt;Available today in Ceph Squid and later:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;IAM Accounts: Multi-tenant isolation with proper account boundaries&lt;/li&gt;
&lt;li&gt;Cross-account role assumption: Secure data sharing with temporary credentials&lt;/li&gt;
&lt;li&gt;Comprehensive audit logging: Full visibility into who accessed what, when, and how&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Coming soon (active development):&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;BucketOwnerEnforced (Upcoming Tentacle update): Disable ACLs, fix ownership chaos&lt;/li&gt;
&lt;li&gt;S3Control Block Public Access (Tentacle/Umbrella): Account-level public access prevention&lt;/li&gt;
&lt;li&gt;Organizational Units &amp;amp; SCPs (future): Immutable cluster-wide security policies&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Ceph community is making a substantial investment to bring Ceph Object
Gateway (RGW) to full feature parity with AWS S3&#39;s modern security model.
The roadmap is clear, and the commitment is real.&lt;/p&gt;
&lt;p&gt;The modern S3 security model is simpler, safer, and more auditable than ACLs ever
were. ACLs created invisible access paths that security teams couldn&#39;t see. IAM
policies are explicit, centralized, and visible in one place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disable ACLs today&lt;/strong&gt;. Your future self will thank you.&lt;/p&gt;
&lt;p&gt;Daniel would like to thank IBM for supporting the community with his time to create these posts.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Breaking the Static Key Habit: Modernizing Ceph RGW S3 Security with STS</title>
    <link href="https://ceph.io/en/news/blog/2025/rgw-modernizing-sts/" />
    <updated>2025-12-18T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2025/rgw-modernizing-sts/</id>
    <author>
      <name>Daniel Alexander Parkes, Anthony D&#39;Atri</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="rgw" />
      <category term="s3" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2025/rgw-modernizing-sts/">&lt;h2 id=&quot;introduction%3A-the-usd-148-million-lesson&quot;&gt;Introduction: The USD 148 Million Lesson &lt;a class=&quot;link-anchor&quot; href=&quot;#introduction%3A-the-usd-148-million-lesson&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In late 2016, &lt;a href=&quot;https://www.uber.com/en-CH/newsroom/2016-data-incident&quot;&gt;Uber&lt;/a&gt;
learned that intruders had accessed a trove of personal data stored in an
Amazon S3 bucket. The entry point was painfully mundane: attackers accessed
Uber&#39;s source code on GitHub using stolen credentials, found an AWS credential,
and used it to access Uber’s data. That single, long-lived credential exposed
data on roughly 57 million users and 600,000 drivers.&lt;/p&gt;
&lt;p&gt;The breach was bad; the duration risk was worse. Static access keys do not expire.
Once leaked, they remain active until someone notices, locates every instance in
use, and rotates them. That makes credential theft uniquely dangerous in cloud
and S3-style storage, because an attacker can repeatedly return, automate access,
and quietly expand their footprint.&lt;/p&gt;
&lt;p&gt;Uber ultimately agreed to a $148 million multistate settlement related to how
the incident was handled and disclosed. The exact dollar figure is not the
main lesson, though. The lesson is this: a single static key can turn a small
mistake into a durable breach.&lt;/p&gt;
&lt;p&gt;If you are running the Ceph Object Gateway (RGW), you face the same dynamic:
S3 credentials in an application configuration file &lt;code&gt;config.yaml&lt;/code&gt;, embedded
in scripts, or stored in CI/CD variables. Each one is a long-lived credential
that, once copied, can be used from anywhere the S3 endpoint is reachable.&lt;/p&gt;
&lt;p&gt;This post shows you how to eliminate static credentials using Security Token
Service (STS) with temporary credentials that expire automatically. By the end,
you&#39;ll understand how to implement the same security model that prevented these
breaches from being even worse, and how to adapt it for Ceph RGW.&lt;/p&gt;
&lt;h2 id=&quot;the-static-credential-problem&quot;&gt;The Static Credential Problem &lt;a class=&quot;link-anchor&quot; href=&quot;#the-static-credential-problem&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&#39;s take a look at some examples of how most applications access S3 storage today:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# app-config.yaml (application config file)
s3:
  endpoint: https://s3.example.com
  access_key: AKIA1234567890ABCDEF
  secret_key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  bucket: production-data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or with the credentials embedded directly in code:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# backup.py
import boto3

s3 = boto3.client(
    &#39;s3&#39;,
    endpoint_url=&#39;https://s3.example.com&#39;,
    aws_access_key_id=&#39;AKIA1234567890ABCDEF&#39;,
    aws_secret_access_key=&#39;wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY&#39;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or in environment variables (slightly better, but not by much):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export AWS_ACCESS_KEY_ID=AKIA1234567890ABCDEF
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;why-this-is-dangerous%3F&quot;&gt;Why This Is Dangerous? &lt;a class=&quot;link-anchor&quot; href=&quot;#why-this-is-dangerous%3F&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;the-permanence-problem&quot;&gt;The Permanence Problem &lt;a class=&quot;link-anchor&quot; href=&quot;#the-permanence-problem&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The fundamental issue with static credentials is that they never expire. Once
created, these keys authenticate requests indefinitely, working the same on
day one as they do five years later. This creates a dangerous organizational
memory gap. Keys made in 2020 still work in 2025, but no one remembers which
application uses them, what permissions they have, or whether they&#39;re even
still needed. When rotation finally becomes necessary, it requires coordinated
updates across all applications simultaneously, often in the middle of an
incident when coordination is most difficult.&lt;/p&gt;
&lt;h3 id=&quot;key-proliferation&quot;&gt;Key Proliferation &lt;a class=&quot;link-anchor&quot; href=&quot;#key-proliferation&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Static credentials spread like a virus through an organization&#39;s infrastructure.
They start in a configuration file for a single application, then get copied
into container images where they&#39;re baked into immutable layers. They&#39;re added
to CI/CD pipelines where they&#39;re shared across multiple projects. Developers
copy them to their laptops for testing, where they sync to cloud backup services.
They end up in documentation and internal wikis, pasted as &amp;quot;helpful examples&amp;quot; for
other teams. Each copy represents another attack vector, another place where the
credentials might leak.&lt;/p&gt;
&lt;h3 id=&quot;the-revocation-nightmare&quot;&gt;The Revocation Nightmare &lt;a class=&quot;link-anchor&quot; href=&quot;#the-revocation-nightmare&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When credentials are eventually stolen, and with this level of exposure, it&#39;s
&lt;em&gt;when&lt;/em&gt;&amp;quot; not &lt;em&gt;if&lt;/em&gt;. The response options are replete with shortcomings. The
credentials work from anywhere where the S3 endpoint is accessible, so there&#39;s
no easy way to distinguish legitimate requests from attacker activity. Revoking
them immediately breaks every application that depends on those keys, forcing
an emergency deployment across potentially dozens of services. The alternative
is to leave them active while attackers maintain access, then race to update
applications before further damage occurs. Organizations need to coordinate
emergency updates during an active security incident, precisely when
coordination is hardest.&lt;/p&gt;
&lt;h3 id=&quot;the-permission-accumulation-problem&quot;&gt;The Permission Accumulation Problem &lt;a class=&quot;link-anchor&quot; href=&quot;#the-permission-accumulation-problem&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Static keys tend to accumulate permissions over time. They start with minimal
access, but as requirements evolve, it&#39;s easier to grant permissions than to
audit what&#39;s truly necessary carefully. &lt;em&gt;This key needs to read and write,
just to be safe.&lt;/em&gt; &lt;em&gt;Let&#39;s give it access to all buckets; we might expand to
new ones later.&lt;/em&gt; No one wants to risk disrupting production by restricting
access, mainly when credentials are spread across so many systems that tracking
down every usage point seems impossible.&lt;/p&gt;
&lt;h3 id=&quot;the-real-cost&quot;&gt;The Real Cost &lt;a class=&quot;link-anchor&quot; href=&quot;#the-real-cost&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Uber incident shows the real cost of a leaked static key. A single exposed
AWS access key pai9r exposed sensitive data to roughly 57 million users and
600,000 drivers, and Uber later agreed to a USD 148 million multistate settlement
related to the incident and its handling.&lt;/p&gt;
&lt;p&gt;The uncomfortable truth is that static keys turn small mistakes into persistent
breaches because credentials do not naturally &amp;quot;die”. Without expiration,
containment depends entirely on detection and coordinated rotation across
every place that the key has spread.&lt;/p&gt;
&lt;h2 id=&quot;the-solution%3A-temporary-credentials-via-sts&quot;&gt;The Solution: Temporary Credentials via STS &lt;a class=&quot;link-anchor&quot; href=&quot;#the-solution%3A-temporary-credentials-via-sts&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Security Token Service (STS) fundamentally reimagines how applications
authenticate with S3. Instead of using permanent credentials that live
forever, applications request temporary credentials that expire automatically
after a defined window, typically between fifteen minutes and twelve hours.
This simple shift transforms the entire security model.&lt;/p&gt;
&lt;p&gt;The mechanics work like this: Applications maintain a minimal service account
that is authorized to assume a role. When the application needs to access S3,
it calls the STS service using those service account credentials to request
temporary credentials for a specific role. STS validates that the service
account is authorized to assume that role, then issues time-limited credentials.
The application uses these temporary credentials for actual S3 operations. When
they expire, the application requests fresh credentials. The entire process is
transparent to the application&#39;s business logic.&lt;/p&gt;
&lt;p&gt;![](images/sequence.png align=&amp;quot;center&amp;quot;)&lt;/p&gt;
&lt;h3 id=&quot;the-security-transformation&quot;&gt;The Security Transformation &lt;a class=&quot;link-anchor&quot; href=&quot;#the-security-transformation&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With static keys, credentials remain valid indefinitely. Once stolen, they persist
indefinitely. STS eliminates these problems through automatic expiration. When an
application calls &lt;code&gt;AssumeRole&lt;/code&gt;, it specifies a &lt;code&gt;DurationSeconds&lt;/code&gt; parameter that
defaults to 3600 seconds (one hour). The temporary credentials returned include
an expiration timestamp that cannot be modified or extended. If an attacker steals
temporary credentials from a compromised server or intercepts them in transit, those
credentials become worthless the moment they expire.&lt;/p&gt;
&lt;p&gt;The audit trail improves dramatically as well. Instead of seeing generic access
key IDs that could be used by any application anywhere, the RGW logs now show
which specific role was assumed (&lt;code&gt;role_name&lt;/code&gt;) and the session name provided when
the role was assumed (&lt;code&gt;role_session_name&lt;/code&gt;). When applications use descriptive
session names that include the application name and a timestamp, security teams
can immediately identify which application and which specific execution generated
each request. This attribution becomes critical during incident response, when
distinguishing legitimate traffic from attacker activity can mean the difference
between containing a breach and suffering a complete data exfiltration.&lt;/p&gt;
&lt;p&gt;Consider the compromise scenario: An attacker gains access to a production server
and dumps memory, capturing the application&#39;s current S3 credentials. With static
keys, this can represent full, ongoing access to your data, potentially for months
before detection. With STS, the attacker has at most one hour before those credentials
expire and become useless. STS is not a silver bullet: it will not stop an attacker
already on the host. It does put every stolen credential on a timer, which sharply
limits persistence and reduces the “evergreen access key” problem. The application
continues to operate normally, automatically refreshing its credentials; incident
response can focus on evicting the attacker and preventing further refreshes rather
than racing to replace long-lived keys everywhere.&lt;/p&gt;
&lt;h4 id=&quot;%22wait%2C-aren&#39;t-we-still-using-a-static-key-to-assume-the-role%3F%22&quot;&gt;&amp;quot;Wait, aren&#39;t we still using a static key to assume the role?&amp;quot; &lt;a class=&quot;link-anchor&quot; href=&quot;#%22wait%2C-aren&#39;t-we-still-using-a-static-key-to-assume-the-role%3F%22&quot;&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Yes, but with a critical difference. The service account (e.g., &lt;code&gt;backup-service&lt;/code&gt;)
possesses static Access and Secret Keys, but this user has zero permissions to
access S3 data. It cannot list buckets, read objects, or delete data.&lt;/p&gt;
&lt;p&gt;Its only capability is to call the STS API to assume a specific Role. If these
credentials are leaked, an attacker cannot directly steal data. They would have
to know which Role to assume and how to use it, which would add significant
friction. Furthermore, you have traces in the audit logs, and you can rotate
these service keys without disrupting the application&#39;s active S3 sessions.&lt;/p&gt;
&lt;h2 id=&quot;quick-primer%3A-understanding-roles-(just-what-you-need-for-sts)&quot;&gt;Quick Primer: Understanding Roles (Just What You Need for STS) &lt;a class=&quot;link-anchor&quot; href=&quot;#quick-primer%3A-understanding-roles-(just-what-you-need-for-sts)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Roles are part of the IAM (Identity and Access Management) API, which the Ceph
Object Gateway (RGW) implements to provide AWS-compatible identity management.
In this post, we focus on how roles enable STS-based authentication. We&#39;ll dive
deeper into the full IAM capabilities, including users, groups, policies, and
account-level governance, in a specific IAM security post coming soon.&lt;/p&gt;
&lt;h3 id=&quot;the-role-structure&quot;&gt;The Role Structure &lt;a class=&quot;link-anchor&quot; href=&quot;#the-role-structure&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Every role has two policies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Trust Policy - Defines who can assume the role&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Permission Policy - Defines what the role can do once assumed&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&#39;s the complete flow: Your application holds a minimal service account that
is authorized to assume a role (via the role trust policy, an identity policy,
or both). When it needs to work (e.g., access S3 resources), it calls STS to
assume a role (e.g., &lt;code&gt;backup-reader&lt;/code&gt;). STS checks the role&#39;s trust policy,
validates the request, and issues temporary credentials (access key, secret
key, session token) that inherit the role&#39;s permissions. Those credentials
expire after one hour. The application uses them for S3 operations and
automatically requests new credentials as needed.&lt;/p&gt;
&lt;p&gt;Here is an example Trust Policy (who can assume the role) allowing the
user &lt;code&gt;backup-service&lt;/code&gt; to assume the role:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
  &amp;quot;Statement&amp;quot;: [{
    &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
    &amp;quot;Principal&amp;quot;: {&amp;quot;AWS&amp;quot;: &amp;quot;arn:aws:iam::123456:user/backup-service&amp;quot;},
    &amp;quot;Action&amp;quot;: &amp;quot;sts:AssumeRole&amp;quot;
  }]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is an example Permission Policy (what the role can do),
allowing read-only access to the bucket &lt;code&gt;backups&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
  &amp;quot;Statement&amp;quot;: [{
    &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
    &amp;quot;Action&amp;quot;: [&amp;quot;s3:GetObject&amp;quot;, &amp;quot;s3:ListBucket&amp;quot;],
    &amp;quot;Resource&amp;quot;: [
      &amp;quot;arn:aws:s3:::backups&amp;quot;,
      &amp;quot;arn:aws:s3:::backups/*&amp;quot;
    ]
  }]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this post, we&#39;ll use inline policies (policies embedded directly in the role).
There are other canned policy types available in the IAM API, which we&#39;ll cover
in a future IAM post.&lt;/p&gt;
&lt;h3 id=&quot;beyond-service-accounts%3A-single-sign-on-authentication-with-oidc-integration&quot;&gt;Beyond Service Accounts: Single Sign-on Authentication with OIDC Integration &lt;a class=&quot;link-anchor&quot; href=&quot;#beyond-service-accounts%3A-single-sign-on-authentication-with-oidc-integration&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The pattern we&#39;ll implement uses a service account with static credentials to
assume roles. However, RGW also supports &lt;code&gt;AssumeRoleWithWebIdentity&lt;/code&gt;, which
allows applications to assume roles using tokens from an enterprise identity
provider (such as RHSSO (Keycloak), IBM Security Verify, etc.) via OpenID
Connect (OIDC). This eliminates the need for static credentials: applications
authenticate via your existing SSO system to obtain a JWT, which they then use
to request a temporary credential directly from the STS API. This is the most
secure option for organizations with mature identity infrastructure, though it
requires additional OIDC provider configuration in RGW. We&#39;ll cover this
advanced pattern in a future post on identity federation.&lt;/p&gt;
&lt;h2 id=&quot;implementing-sts-in-ceph-rgw%3A-step-by-step&quot;&gt;Implementing STS in Ceph RGW: Step by Step &lt;a class=&quot;link-anchor&quot; href=&quot;#implementing-sts-in-ceph-rgw%3A-step-by-step&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This implementation builds on the IAM foundation covered
in &lt;a href=&quot;https://ceph.io/en/news/blog/2025/enhancing-ceph-multitenancy-with-iam-accounts&quot;&gt;Enhancing Ceph Multitenancy with IAM Accounts.&lt;/a&gt;
If you&#39;re new to Ceph IAM accounts, that post covers account creation, user
management, and policy basics. Here, we focus specifically on enabling STS
and using roles for temporary credentials.&lt;/p&gt;
&lt;p&gt;Let&#39;s build on an example use case. We&#39;ll create a role for a backup service
that needs read-only access to a specific bucket.&lt;/p&gt;
&lt;p&gt;To follow this guide, you will need:&lt;/p&gt;
&lt;p&gt;Admin access to the Ceph cluster: SSH access to a node where you can
run &lt;code&gt;ceph&lt;/code&gt; and &lt;code&gt;radosgw-admin&lt;/code&gt; commands.&lt;/p&gt;
&lt;p&gt;AWS CLI: Installed on your workstation to interact with the RGW S3 endpoint.&lt;/p&gt;
&lt;p&gt;Python 3 and Boto3: For running the automation scripts (&lt;code&gt;pip install boto3&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Ceph Squid or later: While basic STS works on older versions, the IAM Accounts
feature used in this guide requires Ceph Squid (19.2.0) or newer.&lt;/p&gt;
&lt;h3 id=&quot;step-1%3A-enable-sts-in-rgw-configuration&quot;&gt;Step 1: Enable STS in RGW Configuration &lt;a class=&quot;link-anchor&quot; href=&quot;#step-1%3A-enable-sts-in-rgw-configuration&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;STS must be explicitly enabled in your RGW configuration. The configuration
uses the Ceph config database and requires two settings.&lt;/p&gt;
&lt;p&gt;Generate a secure STS key (must be exactly 16 characters):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Generate a 16-character random key
$ openssl rand -hex 8
# Example output: 0a1b2c3d4e5f6789
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Configure RGW to use STS:&lt;/p&gt;
&lt;p&gt;Most deployments use client.rgw.default as the RGW client identifier. If your
deployment uses a custom service name, replace default with your service name.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Set the STS encryption key (MUST be exactly 16 characters)
$ ceph config set client.rgw.default rgw_sts_key 0a1b2c3d4e5f6789

# Enable STS authentication
$ ceph config set client.rgw.default rgw_s3_auth_use_sts true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Ceph-Specific Configuration Note&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Unlike AWS, where STS is a global service enabled by default, Ceph requires you
to explicitly configure the encryption key used to sign the session tokens.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Critical Requirement&lt;/em&gt;: The &lt;code&gt;rgw_sts_key&lt;/code&gt; must be exactly 16 characters long.
If it is 15 or 17 characters, the STS handshake will fail silently or with
opaque 500 errors.&lt;/p&gt;
&lt;p&gt;Restart all RGW instances to apply changes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# For default service
$ ceph orch restart client.rgw
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify the configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ ceph config get client.rgw.default rgw_s3_auth_use_sts
$ ceph config get client.rgw.default rgw_sts_key
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;step-2%3A-create-iam-account%2C-root-user%2C-and-service-user&quot;&gt;Step 2: Create IAM Account, Root User, and Service User &lt;a class=&quot;link-anchor&quot; href=&quot;#step-2%3A-create-iam-account%2C-root-user%2C-and-service-user&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;IAM accounts provide multi-tenancy and resource organization. We&#39;ll create an
account, a root user for administrative tasks, and a restricted service user
for applications.&lt;/p&gt;
&lt;h4 id=&quot;create-the-iam-account%3A&quot;&gt;Create the IAM account: &lt;a class=&quot;link-anchor&quot; href=&quot;#create-the-iam-account%3A&quot;&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin account create  --account-name=backup-team 
{
    &amp;quot;id&amp;quot;: &amp;quot;RGW89761398048153888&amp;quot;,
    &amp;quot;tenant&amp;quot;: &amp;quot;&amp;quot;,
    &amp;quot;name&amp;quot;: &amp;quot;backup-team&amp;quot;,
    &amp;quot;email&amp;quot;: &amp;quot;&amp;quot;,
    &amp;quot;quota&amp;quot;: {
        &amp;quot;enabled&amp;quot;: false,
        &amp;quot;check_on_raw&amp;quot;: false,
        &amp;quot;max_size&amp;quot;: -1,
        &amp;quot;max_size_kb&amp;quot;: 0,
        &amp;quot;max_objects&amp;quot;: -1
    },
    &amp;quot;bucket_quota&amp;quot;: {
        &amp;quot;enabled&amp;quot;: false,
        &amp;quot;check_on_raw&amp;quot;: false,
        &amp;quot;max_size&amp;quot;: -1,
        &amp;quot;max_size_kb&amp;quot;: 0,
        &amp;quot;max_objects&amp;quot;: -1
    },
    &amp;quot;max_users&amp;quot;: 1000,
    &amp;quot;max_roles&amp;quot;: 1000,
    &amp;quot;max_groups&amp;quot;: 1000,
    &amp;quot;max_buckets&amp;quot;: 1000,
    &amp;quot;max_access_keys&amp;quot;: 4
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;create-the-account-root-user-(for-administrative-tasks)&quot;&gt;Create the Account Root User (for administrative tasks) &lt;a class=&quot;link-anchor&quot; href=&quot;#create-the-account-root-user-(for-administrative-tasks)&quot;&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The account root user has full permissions on all resources within the account
by default, including the ability to use the IAM API to create roles and manage
policies. This is built into the account system; no additional capabilities are
needed.&lt;/p&gt;
&lt;h4 id=&quot;create-the-root-user-for-the-account%3A&quot;&gt;Create the root user for the account: &lt;a class=&quot;link-anchor&quot; href=&quot;#create-the-root-user-for-the-account%3A&quot;&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin user create   --account-id=RGW89761398048153888 &#92;
  --uid=backup-admin   --display-name=&amp;quot;Backup-Team-Admin&amp;quot; &#92;
  --account-root   --gen-access-key   --gen-secret
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;--account-root&lt;/code&gt; flag is critical: it designates this user as the account&#39;s
root user, granting full administrative permissions within the account&#39;s scope.&lt;/p&gt;
&lt;p&gt;The Ceph documentation stats that: &lt;em&gt;Account owners are encouraged to use this
account root user for management only, and create users and roles with fine-grained
permissions for specific applications.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For this tutorial, we&#39;ll use the root user for setup tasks to keep things simple.
In production, you would typically use the root user to set up IAM users with
specific permissions, then remove or restrict the root user&#39;s credentials.&lt;/p&gt;
&lt;h3 id=&quot;create-the-backup-service-user-(for-applications)&quot;&gt;Create the Backup Service User (for applications) &lt;a class=&quot;link-anchor&quot; href=&quot;#create-the-backup-service-user-(for-applications)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This user will have minimal permissions, only the ability to assume roles.
No direct access to S3 resources.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin user create &#92;
  --account-id=RGW89761398048153888 &#92;
  --uid=backup-service &#92;
  --display-name=&amp;quot;backup-service&amp;quot; &#92;
  --gen-access-key &#92;
  --gen-secret
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;The service account has no S3 permissions and no IAM capabilities. It can only
assume roles that explicitly trust it.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;configure-aws-cli-profiles&quot;&gt;Configure AWS CLI Profiles &lt;a class=&quot;link-anchor&quot; href=&quot;#configure-aws-cli-profiles&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Configure two AWS CLI profiles, one for each user. Each profile contains the user&#39;s
credentials and the RGW/STS endpoint URL, so we don’t need to specify the endpoint
on each &lt;code&gt;AWS CLI&lt;/code&gt; command. See
the &lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html&quot;&gt;AWS CLI configuration documentation&lt;/a&gt;
for details.&lt;/p&gt;
&lt;h3 id=&quot;aws-profile-summary-for-this-setup%3A&quot;&gt;AWS Profile summary for this setup: &lt;a class=&quot;link-anchor&quot; href=&quot;#aws-profile-summary-for-this-setup%3A&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;backup-admin&lt;/code&gt; profile: Uses root user credentials, S3/IAM/STS endpoint &lt;a href=&quot;https://s3.cephlabs.com&quot;&gt;https://s3.cephlabs.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backup-service&lt;/code&gt; profile: Uses service account credentials, S3/IAM/STS endpoint &lt;a href=&quot;https://s3.cephlabs.com&quot;&gt;https://s3.cephlabs.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an example &lt;code&gt;.aws/config&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;[profile backup-admin]
region = default
output = json
services = ceph-rgw

[profile backup-service]
region = default
output = json
services = ceph-rgw

[services ceph-rgw]
s3 =
  endpoint_url = https://s3.cephlabs.com
s3api =
  endpoint_url = https://s3.cephlabs.com
iam =
  endpoint_url = https://s3.cephlabs.com
sts =
  endpoint_url = https://s3.cephlabs.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify both profiles:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Test root user (should work - has full permissions)
$ aws s3 ls --profile backup-admin

# Test service user (should fail - has no S3 permissions yet)
$ aws s3 ls --profile backup-service
# Expect: AccessDenied in RGW logs
argument of type &#39;NoneType&#39; is not iterable
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;identity-summary&quot;&gt;Identity Summary &lt;a class=&quot;link-anchor&quot; href=&quot;#identity-summary&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;At this point, you have two users in the IAM account:&lt;/p&gt;
&lt;p&gt;||User||Type||Permissions||Used For||
|&lt;code&gt;backup-admin&lt;/code&gt;|Account root user (&lt;code&gt;--account-root&lt;/code&gt;)|Full permissions on all account resources + IAM API access	Creating buckets, creating/managing roles via AWS CLI|
|&lt;code&gt;backup-service&lt;/code&gt;|Regular user|None (can only assume roles)|Running backup applications with temporary credentials|&lt;/p&gt;
&lt;h3 id=&quot;step-3%3A-create-the-backup-bucket&quot;&gt;Step 3: Create the Backup Bucket &lt;a class=&quot;link-anchor&quot; href=&quot;#step-3%3A-create-the-backup-bucket&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Run this as the backup admin user (who has S3 permissions):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws s3 mb s3://backups --profile backup-admin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Why the admin user? The service account (&lt;code&gt;backup-service&lt;/code&gt;) has no S3 permissions
yet; it can only assume roles. The admin user creates the infrastructure (buckets),
then creates roles that grant specific permissions to those buckets.&lt;/p&gt;
&lt;p&gt;Verify the bucket exists:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws s3 ls --profile backup-admin
2025-12-12 17:09:25 backups
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;step-4%3A-create-the-role&quot;&gt;Step 4: Create the Role &lt;a class=&quot;link-anchor&quot; href=&quot;#step-4%3A-create-the-role&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Run these commands as the account root user (&lt;code&gt;backup-admin&lt;/code&gt;),
who has full IAM API permissions.&lt;/p&gt;
&lt;p&gt;Create a role trust policy (who can assume this role):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat &amp;gt; trust-policy.json &amp;lt;&amp;lt;&#39;EOF&#39;
{
  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
  &amp;quot;Statement&amp;quot;: [{
    &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
    &amp;quot;Principal&amp;quot;: {&amp;quot;AWS&amp;quot;: &amp;quot;arn:aws:iam::RGW89761398048153888:user/backup-service&amp;quot;},
    &amp;quot;Action&amp;quot;: &amp;quot;sts:AssumeRole&amp;quot;
  }]
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;_ARNs in IAM Accounts (Ceph Object Gateway): In the IAM Accounts model, the user
ARN is built from the account ID plus the user name; in Ceph this “name” corresponds
to the user’s display-name (not the &lt;code&gt;--uid&lt;/code&gt;). If your &lt;code&gt;--uid&lt;/code&gt; and &lt;code&gt;--display-name&lt;/code&gt;
differ, ensure that your trust policy Principal ARN uses the display-name value,
or the AssumeRole request will not match.&lt;/p&gt;
&lt;p&gt;Authorization to assume a role can be granted in two ways. In this tutorial we grant
it via the role trust policy by naming the service user as the &lt;code&gt;Principal&lt;/code&gt;. In
same-account setups, this is sufficient; no user policy is required. If you instead
trust the whole account or you are doing cross-account access, attach an identity
policy to the user or group allowing sts:AssumeRole on the specific role ARN._&lt;/p&gt;
&lt;p&gt;Create the role:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws iam create-role &#92;
  --profile backup-admin &#92;
  --role-name backup-reader &#92;
  --assume-role-policy-document file://trust-policy.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create permission policy (what the role can do):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat &amp;gt; permissions-policy.json &amp;lt;&amp;lt;&#39;EOF&#39;
{
  &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
  &amp;quot;Statement&amp;quot;: [{
    &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
    &amp;quot;Action&amp;quot;: [
      &amp;quot;s3:GetObject&amp;quot;,
      &amp;quot;s3:ListBucket&amp;quot;
    ],
    &amp;quot;Resource&amp;quot;: [
      &amp;quot;arn:aws:s3:::backups&amp;quot;,
      &amp;quot;arn:aws:s3:::backups/*&amp;quot;
    ]
  }]
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Attach permissions to role:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws iam put-role-policy &#92;
  --profile backup-admin &#92;
  --role-name backup-reader &#92;
  --policy-name backup-read-policy &#92;
  --policy-document file://permissions-policy.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify that the role was created:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws iam get-role &#92;
  --profile backup-admin &#92;
  --role-name backup-reader
{
    &amp;quot;Role&amp;quot;: {
        &amp;quot;Path&amp;quot;: &amp;quot;/&amp;quot;,
        &amp;quot;RoleName&amp;quot;: &amp;quot;backup-reader&amp;quot;,
        &amp;quot;RoleId&amp;quot;: &amp;quot;8c8eec8c-c647-42bb-8a53-36c6d2fc747a&amp;quot;,
        &amp;quot;Arn&amp;quot;: &amp;quot;arn:aws:iam::RGW89761398048153888:role/backup-reader&amp;quot;,
        &amp;quot;CreateDate&amp;quot;: &amp;quot;2025-12-12T22:10:18.644Z&amp;quot;,
        &amp;quot;AssumeRolePolicyDocument&amp;quot;: {
            &amp;quot;Version&amp;quot;: &amp;quot;2012-10-17&amp;quot;,
            &amp;quot;Statement&amp;quot;: [
                {
                    &amp;quot;Effect&amp;quot;: &amp;quot;Allow&amp;quot;,
                    &amp;quot;Principal&amp;quot;: {
                        &amp;quot;AWS&amp;quot;: &amp;quot;arn:aws:iam::RGW89761398048153888:user/backup-service&amp;quot;
                    },
                    &amp;quot;Action&amp;quot;: &amp;quot;sts:AssumeRole&amp;quot;
                }
            ]
        },
        &amp;quot;Description&amp;quot;: &amp;quot;&amp;quot;,
        &amp;quot;MaxSessionDuration&amp;quot;: 3600
    }
}

$ aws --profile backup-service sts assume-role --role-arn &amp;quot;arn:aws:iam::RGW89761398048153888:role/backup-reader&amp;quot; --output json --role-session-name testbr
{
    &amp;quot;Credentials&amp;quot;: {
        &amp;quot;AccessKeyId&amp;quot;: &amp;quot;reUwxxxxxxn&amp;quot;,
        &amp;quot;SecretAccessKey&amp;quot;: &amp;quot;CQGxxxxxxx&amp;quot;,
        &amp;quot;SessionToken&amp;quot;: &amp;quot;nADwRdQ5xxxx90qMZlDPl4ozBjcQKF1tceytgNVGD5D4h2FpoMvjybl31cXI9uh/nUrQePW+Ob3TmpMa4QXdXfml/gQYSYeQLJEzNncQPUQB9+QUl5TShDy4RYYziRulTMWrkYokL6kI0uN0LksQ56/qOyd59A1qbWtsBNYBdvxUUi7r3lhrifn4MNWQbErJKCVNdVOBSzN1L34JDMvjEqN2QyKWLQI16D+XhCq8V05OnQFMHsf128BealrX+KkWS6+74G960WzoHzWDwHF1uO08VlFYCdHO0A==&amp;quot;,
        &amp;quot;Expiration&amp;quot;: &amp;quot;2025-12-12T23:34:00.247844317Z&amp;quot;
    },
    &amp;quot;AssumedRoleUser&amp;quot;: {
        &amp;quot;Arn&amp;quot;: &amp;quot;arn:aws:sts::RGW89761398048153888:assumed-role/backup-reader/testbr&amp;quot;
    },
    &amp;quot;PackedPolicySize&amp;quot;: 0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;step-5%3A-write-application-code-(python-example)&quot;&gt;Step 5: Write Application Code (Python Example) &lt;a class=&quot;link-anchor&quot; href=&quot;#step-5%3A-write-application-code-(python-example)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This code runs with the service account credentials (&lt;code&gt;backup-service&lt;/code&gt;), which have
no direct S3 access. The application calls STS to assume the &lt;code&gt;backup-reader&lt;/code&gt;
role and receives temporary credentials for S3 operations.&lt;/p&gt;
&lt;p&gt;Identity flow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The application starts with &lt;code&gt;backup-service&lt;/code&gt; credentials (long-term, minimal permissions)&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;AssumeRole&lt;/code&gt; using those credentials to request the &lt;code&gt;backup-reader&lt;/code&gt; role&lt;/li&gt;
&lt;li&gt;Receives temporary credentials (access key + secret + session token)&lt;/li&gt;
&lt;li&gt;Uses temporary credentials for all S3 operations&lt;/li&gt;
&lt;li&gt;Temporary credentials expire after 1 hour (or configured duration)&lt;/li&gt;
&lt;li&gt;Application manually checks expiration before each operation and refreshes if needed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Upload test file (as admin user who has write permissions):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ echo &amp;quot;test backup data&amp;quot; &amp;gt; test-backup.txt
$ aws s3 cp test-backup.txt s3://backups/ --profile backup-admin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running the script: download the script from GitHub Gist, and export the
variables of the &lt;code&gt;backup-service&lt;/code&gt; user:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Download script
$ wget -O backup_service.py https://gist.githubusercontent.com/likid0/f7c40c4851bf32c595c7a5e63cf21f35/raw/137bfeea46c20d46d37fa026e29f1b5193c3e281/gistfile1.txt
# Make it executable
$ chmod +x backup_service.py
# Export Vars
$ export AWS_ACCESS_KEY_ID=&#39;AKIAIOSFODNN7EXAMPLE&#39;
$ export AWS_SECRET_ACCESS_KEY=&#39;wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY&#39;
$ export S3_ENDPOINT_URL=&#39;https://s3.example.com&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run the example &lt;code&gt;backup_service.py&lt;/code&gt; cript:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ python backup_service.py

================================================================================
 Backup Service - STS Temporary Credentials Demo
================================================================================

Configuration:
  Endpoint: https://s3.cephlabs.com
  User:     backup-service
  Key:      VQQPNR4XOW...

Note: These are the service account&#39;s PERMANENT credentials
      They have NO direct S3 permissions (can only assume roles)

================================================================================
Calling AssumeRole API to get temporary credentials...
================================================================================

AssumeRole Parameters:
  RoleArn:         arn:aws:iam::RGW89761398048153888:role/backup-reader
  RoleSessionName: backup-job-1765579042
  DurationSeconds: 3600 (1 hour)

Authentication:  Using service account credentials (backup-service)
                 AccessKey: VQQPNR4XOW...

Calling STS endpoint: https://s3.cephlabs.com

SUCCESS! Received temporary credentials:
  AccessKeyId:     YAhacPIIT4BcUWiyPC0M...
  SecretAccessKey: S4VSWFTM2U... (redacted)
  SessionToken:    Yn3A4Mt4VGQoIvloer2ByH3aecQAeP... (redacted)
  Expiration:      2025-12-12 23:37:22.878813+00:00
================================================================================


 Listing backups in bucket &#39;backups&#39;...
   Found 1 object(s):

    test-backup.txt
      Size: 0.00 MB (17 bytes)
      Modified: 2025-12-12 22:11:23.474000+00:00


================================================================================
Demo completed successfully!
================================================================================
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This example script uses manual credential checking: the &lt;code&gt;_check_credentials()&lt;/code&gt;
method checks expiration time before each operation and calls &lt;code&gt;_refresh_credentials()&lt;/code&gt;
when needed. This is simple and works well for most use cases.&lt;/p&gt;
&lt;p&gt;For long-running jobs (hours or days), see the &amp;quot;Handling Long-Running Jobs:
Credential Refresh Strategies&amp;quot; section later in this post, which covers
automatic credential refresh using Boto3&#39;s &lt;code&gt;RefreshableCredentials&lt;/code&gt;. With
automatic refresh, Boto3 handles the timing and renewal for you so you never
have to think about expiration.&lt;/p&gt;
&lt;h2 id=&quot;handling-long-running-jobs%3A-credential-refresh-strategies&quot;&gt;Handling Long-Running Jobs: Credential Refresh Strategies &lt;a class=&quot;link-anchor&quot; href=&quot;#handling-long-running-jobs%3A-credential-refresh-strategies&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A critical consideration for production deployments is handling jobs that run
longer than the credential lifetime.&lt;/p&gt;
&lt;h3 id=&quot;the-challenge&quot;&gt;The Challenge &lt;a class=&quot;link-anchor&quot; href=&quot;#the-challenge&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The DurationSeconds Parameter controls how long the temporary credentials remain valid:&lt;/p&gt;
&lt;p&gt;Minimum: 900 seconds (15 minutes) configurable via &lt;code&gt;rgw_sts_min_session_duration&lt;/code&gt;
Default: 3600 seconds (1 hour)
Maximum: Limited by the role&#39;s &lt;code&gt;max_session_duration&lt;/code&gt; attribute (defaults to 3600)&lt;/p&gt;
&lt;p&gt;When a role is created, it has a &lt;code&gt;max_session_duration&lt;/code&gt; of 3600 seconds by default.
This means even if you request &lt;code&gt;DurationSeconds=7200&lt;/code&gt; (2 hours), the request
will be limited to the role&#39;s maximum. To allow longer sessions, you would
need to modify the role&#39;s max_session_duration when creating it (though for
security, shorter durations are recommended).&lt;/p&gt;
&lt;p&gt;Here, we share three example strategies for handling this.&lt;/p&gt;
&lt;h3 id=&quot;strategy-1%3A-increase-token-duration-(up-to-12-hours)&quot;&gt;Strategy 1: Increase Token Duration (Up to 12 Hours) &lt;a class=&quot;link-anchor&quot; href=&quot;#strategy-1%3A-increase-token-duration-(up-to-12-hours)&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The most straightforward approach is to request longer-lived credentials and
configure the role to allow them.&lt;/p&gt;
&lt;h4 id=&quot;configure-maximum-session-duration-on-the-role%3A&quot;&gt;Configure maximum session duration on the role: &lt;a class=&quot;link-anchor&quot; href=&quot;#configure-maximum-session-duration-on-the-role%3A&quot;&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;When creating the role, you can set a maximum session duration:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws iam create-role &#92;
  --profile backup-admin &#92;
  --role-name backup-reader &#92;
  --assume-role-policy-document file://trust-policy.json &#92;
  --max-session-duration 43200  # 12 hours
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or modify an existing role:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws iam update-role &#92;
  --profile backup-admin &#92;
  --role-name backup-reader &#92;
  --max-session-duration 43200  # 12 hours
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify the setting:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws iam get-role &#92;
  --profile backup-admin &#92;
  --role-name backup-reader &#92;
  --query &#39;Role.MaxSessionDuration&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RGW Configuration: the following config option controls the global maximum:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ceph config set client.rgw.default rgw_sts_max_session_duration 43200
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maximum duration in Ceph RGW: 12 hours (43,200 seconds)&lt;/li&gt;
&lt;li&gt;Not an ideal solution, as it extends the duration of the tokens to twelve hours&lt;/li&gt;
&lt;li&gt;Suitable for jobs that can be completed within 12 hours&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;strategy-2%3A-automatic-credential-refresh-with-refreshablecredentials&quot;&gt;Strategy 2: Automatic Credential Refresh with RefreshableCredentials &lt;a class=&quot;link-anchor&quot; href=&quot;#strategy-2%3A-automatic-credential-refresh-with-refreshablecredentials&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For jobs longer than 12 hours, or to avoid managing token duration,
implement automatic refresh using botocore&#39;s &lt;code&gt;RefreshableCredentials&lt;/code&gt;.
This pattern continuously calls &lt;code&gt;AssumeRole&lt;/code&gt; to get fresh credentials
before expiration.&lt;/p&gt;
&lt;p&gt;An enhanced &lt;code&gt;BackupService&lt;/code&gt; example script with STS token Auto-Refresh
is available &lt;a href=&quot;https://gist.github.com/likid0/25519b2f46b63de89f7fe0d2dc9ff283&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;How it works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RefreshableCredentials&lt;/code&gt; wraps your credential fetching logic&lt;/li&gt;
&lt;li&gt;Before each AWS API call, Boto3 checks if credentials are expired or expiring soon&lt;/li&gt;
&lt;li&gt;If needed, &lt;code&gt;boto3&lt;/code&gt; automatically calls &lt;code&gt;_refresh_credentials()&lt;/code&gt; to get fresh credentials&lt;/li&gt;
&lt;li&gt;Your application never sees authentication errors due to expiration&lt;/li&gt;
&lt;li&gt;Each refresh calls &lt;code&gt;AssumeRole&lt;/code&gt; using the original service account credentials&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Key Advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Works for jobs of any length (days, weeks)&lt;/li&gt;
&lt;li&gt;No manual credential management needed&lt;/li&gt;
&lt;li&gt;Boto3 handles refresh timing automatically&lt;/li&gt;
&lt;li&gt;Original service account credentials remain secure (never exposed to S3 operations)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Important Notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The service account&#39;s long-term credentials must remain valid for the entire job&lt;/li&gt;
&lt;li&gt;Each refresh makes a new &lt;code&gt;AssumeRole&lt;/code&gt; call to STS&lt;/li&gt;
&lt;li&gt;Credentials are cached in memory only (not written to disk)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;strategy-3%3A-use-third-party-libraries&quot;&gt;Strategy 3: Use Third-Party Libraries &lt;a class=&quot;link-anchor&quot; href=&quot;#strategy-3%3A-use-third-party-libraries&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you prefer not to work with botocore internals, use a well-maintained library:&lt;/p&gt;
&lt;p&gt;Install the library &lt;code&gt;aws-assume-role-lib&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ pip install aws-assume-role-lib
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reference the library in code:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import boto3
import aws_assume_role_lib

# Create session with automatic refresh
parent_session = boto3.Session(
    aws_access_key_id=&#39;BACKUP_SERVICE_KEY&#39;,
    aws_secret_access_key=&#39;your-secret-key&#39;
)

# This session automatically refreshes expired credentials
assumed_role_session = aws_assume_role_lib.assume_role(
    parent_session, 
    &#39;arn:aws:iam::RGW12345678901234567:role/backup-reader&#39;
)

# Use it like any boto3 session
s3 = assumed_role_session.client(&#39;s3&#39;, endpoint_url=&#39;https://s3.example.com&#39;)
s3.list_buckets()  # Credentials auto-refresh as needed
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;static-key-rotation%3A-completing-the-security-model&quot;&gt;Static Key Rotation: Completing the Security Model &lt;a class=&quot;link-anchor&quot; href=&quot;#static-key-rotation%3A-completing-the-security-model&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You&#39;ve now implemented STS for temporary credentials, but there&#39;s one
final layer to complete the security architecture: rotating the service
account&#39;s static keys.&lt;/p&gt;
&lt;h3 id=&quot;background%3A-the-create_date-field&quot;&gt;Background: The create_date Field &lt;a class=&quot;link-anchor&quot; href=&quot;#background%3A-the-create_date-field&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Starting with Tentacle, Ceph RGW now includes a &lt;code&gt;create_date&lt;/code&gt; timestamp for
each access key in the user metadata. This addition enables programmatic key
age tracking and automated rotation: a critical capability for eliminating
static credential risk.&lt;/p&gt;
&lt;p&gt;Example output from &lt;code&gt;radosgw-admin user info&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;user_id&amp;quot;: &amp;quot;backup-service&amp;quot;,
    &amp;quot;keys&amp;quot;: [{
        &amp;quot;user&amp;quot;: &amp;quot;backup-service&amp;quot;,
        &amp;quot;access_key&amp;quot;: &amp;quot;XXXXXXXX&amp;quot;,
        &amp;quot;secret_key&amp;quot;: &amp;quot;XtDhTWsb6vkNOsAnWBXSIhDhqdRBYXXXXXXX&amp;quot;,
        &amp;quot;active&amp;quot;: true,
        &amp;quot;create_date&amp;quot;: &amp;quot;2025-12-12T22:02:16.628205Z&amp;quot;  ← Key creation timestamp
    }]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;recommended-approach%3A-use-a-secrets-manager&quot;&gt;Recommended Approach: Use a Secrets Manager &lt;a class=&quot;link-anchor&quot; href=&quot;#recommended-approach%3A-use-a-secrets-manager&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The best way to implement key rotation is with a secrets manager such as
HashiCorp Vault, IBM GKLM, AWS Secrets Manager, Google Secret Manager,
or Azure Key Vault. This approach enables zero-downtime rotation
without code changes.&lt;/p&gt;
&lt;p&gt;How it works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Application queries secrets manager (no hardcoded credentials):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application starts up and queries Vault/secrets manager for credentials&lt;/li&gt;
&lt;li&gt;Gets current &lt;code&gt;access_key&lt;/code&gt; and &lt;code&gt;secret_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Uses these to call &lt;code&gt;AssumeRole&lt;/code&gt; and get temporary STS credentials&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When keys rotate (automated monthly rotation using the &lt;code&gt;create_date&lt;/code&gt; field time stamp):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate a new Ceph access key with &lt;code&gt;radosgw-admin key create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Update the secret in Vault/secrets manager with new credentials&lt;/li&gt;
&lt;li&gt;Keep both old and new keys active in Ceph for a 7-day transition period&lt;/li&gt;
&lt;li&gt;After 7 days, remove the old key from Ceph&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Application automatically gets new keys:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The next time the application restarts or refreshes credentials, it queries the secrets manager&lt;/li&gt;
&lt;li&gt;Gets the new credentials automatically&lt;/li&gt;
&lt;li&gt;No code changes required: the application doesn&#39;t know rotation happened&lt;/li&gt;
&lt;li&gt;No downtime: the old key still works during the transition&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;migration-strategy%3A-from-static-to-temporary&quot;&gt;Migration Strategy: From Static to Temporary &lt;a class=&quot;link-anchor&quot; href=&quot;#migration-strategy%3A-from-static-to-temporary&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can&#39;t flip a switch and convert all applications overnight. The transition
requires methodical planning, careful testing, and phased rollout. Organizations
that rush this process end up with broken applications, emergency rollbacks, and
frustrated teams. The ones that succeed treat it as a deliberate migration project
with clear phases and success criteria.&lt;/p&gt;
&lt;p&gt;The challenge isn&#39;t technical; the STS implementation is straightforward once
one understands roles. The challenge is organizational: identifying where
static credentials exist, understanding what each application actually needs,
and coordinating updates across teams that may not even realize they&#39;re using
S3. This is why the first phase isn&#39;t about changing anything; it&#39;s about
understanding what you have.&lt;/p&gt;
&lt;h2 id=&quot;coming-in-the-next-post&quot;&gt;Coming in the Next Post &lt;a class=&quot;link-anchor&quot; href=&quot;#coming-in-the-next-post&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You now have STS working in your Ceph environment. Your applications use temporary
credentials that expire automatically, dramatically reducing the blast radius of
credential theft. The permanent credentials your applications hold can&#39;t access
S3 directly; they can only assume specific roles with limited permissions. Each
role follows least privilege. Every access is logged with full attribution.&lt;/p&gt;
&lt;p&gt;We kept the IAM explanation minimal in this post, just enough to implement STS.
In the next post, we&#39;ll dive into IAM architecture and access control patterns.
We&#39;ll cover the new IAM Accounts model introduced in Ceph Squid, how it creates
proper multi-tenancy, and why the distinction between root account and IAM users
matters for security. We&#39;ll explore advanced least privilege patterns, trust policy
design for cross-account access, and how to test policies before deployment. We&#39;ll
also examine organizational mandates, such as blocking ACLs entirely and using the
new S3Control API for account-level governance.&lt;/p&gt;
&lt;p&gt;The authors would like to thank IBM for supporting the community with our time to create these posts.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>RocksDB Compression in Ceph: Space Savings with No Performance Cost</title>
    <link href="https://ceph.io/en/news/blog/2025/rocksdb-compression-ftw/" />
    <updated>2025-12-17T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2025/rocksdb-compression-ftw/</id>
    <author>
      <name>Daniel Alexander Parkes, Anthony D&#39;Atri</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="rados" />
      <category term="rocksdb" />
      <category term="osd" />
      <category term="mon" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2025/rocksdb-compression-ftw/">&lt;h2 id=&quot;introduction&quot;&gt;Introduction &lt;a class=&quot;link-anchor&quot; href=&quot;#introduction&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the world of data storage, engineers and architects constantly face a
fundamental dilemma: the trade-off between performance and efficiency.
It’s a balancing act. When you want to save space, you typically enable
features like compression, but the common assumption is that this will
cost you performance, a CPU cycle tax that slows throughput.&lt;/p&gt;
&lt;p&gt;But what if you could significantly reduce your metadata storage footprint
without slowing things down?&lt;/p&gt;
&lt;p&gt;This search for an answer to this question started with research work
from Mark Nelson, who published
a &lt;a href=&quot;https://ceph.io/en/news/blog/2022/rocksdb-tuning-deep-dive&quot;&gt;blog post&lt;/a&gt; on &lt;a href=&quot;http://ceph.io&quot;&gt;ceph.io&lt;/a&gt;
that covers RocksDB tuning in depth, exploring RocksDB compression with
positive results. These promising results sparked a conversation on the
upstream GitHub about enabling compression by default; a link to the PR
is available &lt;a href=&quot;https://github.com/ceph/ceph/pull/53343&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To build on the previous investigation, the Ceph performance team ran tests on a
robust hardware configuration running IBM Storage Ceph 7.1 (Reef). The cluster
used the BlueStore OSDs for an erasure-coded (EC 4+2) pool, with a hybrid OSD
storage setup: HDDs for object data and fast NVMe drives for the BlueStore WAL+DB.&lt;/p&gt;
&lt;p&gt;To understand the test, it&#39;s helpful to know what the WAL+DB is. In modern Ceph,
the BlueStore storage engine manages all data on the OSDs (physical devices).
To do this, it must maintain a vast catalog of internal metadata: think of it
as a high-speed index that quickly locates every piece of data.&lt;/p&gt;
&lt;p&gt;RocksDB, a high-performance key-value database, manages this critical index. In
our hybrid cluster, the RocksDB database runs on the fast NVMe deviceses, while
the actual object data resides on the slower HDDs.&lt;/p&gt;
&lt;p&gt;Because this metadata can grow very large, RocksDB&#39;s efficiency, how much space
it consumes on those expensive NVMe drives, is a critical factor in the cluster&#39;s
overall cost and performance. Our test, therefore, focuses on a simple,
high-stakes question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can we compress this metadata to save space &lt;em&gt;without&lt;/em&gt; paying a performance penalty?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;executive-overview&quot;&gt;Executive Overview &lt;a class=&quot;link-anchor&quot; href=&quot;#executive-overview&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The results were not just positive; they were counterintuitive, revealing a powerful
opportunity for optimization that comes with virtually no downside.&lt;/p&gt;
&lt;p&gt;The results confirm that using RocksDB compression has no detrimental effect on
either throughput or resource consumption in Ceph, while providing significant
savings in DB space (compression ratio), especially for smaller objects. As a
result of the tests, RocksDB encryption is now enabled by default beginning with
the Squid release.&lt;/p&gt;
&lt;h2 id=&quot;test-environment-and-details&quot;&gt;Test Environment and Details &lt;a class=&quot;link-anchor&quot; href=&quot;#test-environment-and-details&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;All tests were run against the Ceph Gateway (RGW) to simulate a typical
Object Storage workload.&lt;/p&gt;
&lt;p&gt;Two different sets of object sizes were used in testing. Each workload leveraged
five clients and a range of fixed sizes (one object size per bucket, repeated
across the total bucket count), as listed below.&lt;/p&gt;
&lt;h3 id=&quot;testing-configuration&quot;&gt;Testing Configuration &lt;a class=&quot;link-anchor&quot; href=&quot;#testing-configuration&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Smaller&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 KiB, 4 KiB, 8 KiB, 64 KiB, 256 KiB&lt;/li&gt;
&lt;li&gt;100K objects, 300 buckets, five clients (150M total objectss)&lt;/li&gt;
&lt;li&gt;Fill Workload (~8%) - 3hr&lt;/li&gt;
&lt;li&gt;Hybrid workload (45% reads, 35% writes, 15% stats, 5% deletes)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Larger&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 MiB, 4 MiB, 8 MiB, 64 MiB, 256 MiB&lt;/li&gt;
&lt;li&gt;300 objects, 100 buckets, five clients (150K total objects)&lt;/li&gt;
&lt;li&gt;Fill Workload (~7%) - 40m&lt;/li&gt;
&lt;li&gt;Hybrid workload (45% reads, 35% writes, 15% stats, 5% deletes)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;hardware-used&quot;&gt;Hardware Used &lt;a class=&quot;link-anchor&quot; href=&quot;#hardware-used&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Two identical clusters, each with&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;3x Monitor / Manager nodes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dell R630&lt;/li&gt;
&lt;li&gt;2x E5-2683 v3 (28 total cores, 56 threads)&lt;/li&gt;
&lt;li&gt;128 GB RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8x OSD / RGW nodes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Supermicro 6048R&lt;/li&gt;
&lt;li&gt;2x Intel E5-2660 v4 (28 total cores, 56 threads)&lt;/li&gt;
&lt;li&gt;256 GB RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;192x OSDs (BluesStore): 24 2TB HDD and 2x 800GB NVMe SSD for WAL/DB per node&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pool: &lt;code&gt;site{1,2}.rgw.buckets.data&lt;/code&gt; EC 4+2, &lt;code&gt;pg_num=4096&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-%22free-lunch%22-is-real%3A-significant-space-savings-at-zero-performance-cost&quot;&gt;The &amp;quot;Free Lunch&amp;quot; is Real: Significant Space Savings at Zero Performance Cost &lt;a class=&quot;link-anchor&quot; href=&quot;#the-%22free-lunch%22-is-real%3A-significant-space-savings-at-zero-performance-cost&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The primary and most surprising finding from our tests is that enabling RocksDB
compression had no negative impact on performance. The specific algorithm used
was LZ4, a lightweight solution known for its high speed. Our analysis suggests
that modern CPUs are so efficient at processing algorithms like LZ4 that the
overhead is negligible, particularly when compression operations occur on the
high-speed NVMe devices where the RocksDB database resides.&lt;/p&gt;
&lt;p&gt;Across a variety of hybrid workloads (45% reads, 35% writes, 15% stats,
and 5% deletes), we observed no detrimental effect on throughput or CPU resource
consumption compared to running the same workloads without compression. This
effectively eliminates the traditional trade-off.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Graph 1. CPU Consumption for Small Objects&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/7a80e345-6972-4b18-9c05-860c5a64ab05.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Graph 2. CPU Consumption for Large Objects&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/d26761a5-1bd4-4115-8ac8-5c5976046026.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Graph 3. Throughput for Small Object Writes&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/a588ee07-7f0c-4903-a8ab-3b11f0f543d8.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Graph 4. Throughput for Small Object Reads&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/3c36de86-7470-4204-a50e-f644e166567d.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The results confirm that using RocksDB compression has no detrimental
effect on either throughput or resource consumption in Ceph, while
providing significant savings in DB space (compression ratio),
especially for smaller objects. This allows a smaller WAL+DB offload
partition for each OSD, or conversely helps avoid spillover of
RocksDB level data onto the BlueStore &lt;em&gt;slow&lt;/em&gt; device.&lt;/p&gt;
&lt;h2 id=&quot;small-objects%2C-massive-gains%3A-a-game-changer-for-object-storage-workloads.&quot;&gt;Small Objects, Massive Gains: A Game-Changer for Object Storage Workloads. &lt;a class=&quot;link-anchor&quot; href=&quot;#small-objects%2C-massive-gains%3A-a-game-changer-for-object-storage-workloads.&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While compression proved beneficial across the board, its impact was most
dramatic on small-object workloads. Our tests, which used object sizes
ranging from 1 KiB to 256 KiB, showed a remarkable reduction in the
storage required for RocksDB metadata. In a BlueStore configuration,
Ceph&#39;s internal metadata is managed by a RocksDB database running on
top of the BlueFS file system on a fast storage device, in
our case, an NVMe SSD.&lt;/p&gt;
&lt;p&gt;The single most impactful data point we recorded was this: with compression
enabled, the &lt;code&gt;bluefs db_used_bytes&lt;/code&gt; workload for small objects required 2.68
times less storage during the cluster fill. This is a massive efficiency gain.
For any organization whose workload involves storing millions or even billions
of tiny objects, the metadata overhead can become a significant storage burden.
This feature directly and powerfully addresses that specific pain point by
compressing the metadata database on the fast offload device, not object data
on HDDs.&lt;/p&gt;
&lt;p&gt;This is particularly critical for Object Storage (RGW) workloads. When using
the Ceph Object Gateway (RGW), all rich metadata associated with an object,
such as its name, size, ACLs, and custom user tags, is stored in RocksDB instances
spread across the OSDs that comprise the index pool.
Furthermore, the bucket index, which lists all objects within a bucket, is
maintained as omap entries in this same database.&lt;/p&gt;
&lt;p&gt;For clusters with millions or billions of small objects, this metadata and
index data can swell to consume terabytes of space, often becoming the primary
capacity bottleneck on the expensive, high-speed NVMe drives. Compressing
RocksDB directly compresses this RGW metadata, providing massive and immediate
relief on that fast tier.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/1953bdb1-9871-44db-90b6-d1ce81fde788.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;it&#39;s-not-just-for-small-objects%3A-large-objects-also-see-a-clear-benefit&quot;&gt;It&#39;s Not Just for Small Objects: Large Objects Also See a Clear Benefit &lt;a class=&quot;link-anchor&quot; href=&quot;#it&#39;s-not-just-for-small-objects%3A-large-objects-also-see-a-clear-benefit&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The positive effects were not limited to small objects. Our tests on large-object
workloads, ranging from 1 MiB to 256 MiB, also showed clear benefits. While the
source report highlights the most dramatic space savings for small objects, it
explicitly notes that the positive effect across both sets of object sizes is
evident, making compression a clear win for large-object workloads as well.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/94f71417-270f-4009-8e87-37c762dcf998.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Furthermore, our test plan included stressful OSD failure scenarios to measure
behavior under duress. The overall conclusion of &amp;quot;no detrimental effect&amp;quot; on
performance or resource consumption held even during these fault and recovery
operations. This implies that RocksDB compression is not just efficient but
also a stable and robust feature under pressure.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Graph 5. Throughput for Small Object Reads During Failure&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/23fe5bea-9c23-440a-9e84-b9bddd035c9e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Graph 6. Throughput for Small Object Writes During Failure&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/34f1ad7f-cb59-4e47-8be8-e1e0659e9d5b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;conclusion%3A-a-feature-that-should-be-enabled-by-default&quot;&gt;Conclusion: A Feature That Should Be Enabled By Default &lt;a class=&quot;link-anchor&quot; href=&quot;#conclusion%3A-a-feature-that-should-be-enabled-by-default&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Based on this comprehensive testing, RocksDB compression in a Ceph environment
is a low-risk, high-reward feature. It breaks the old rule that says efficiency
must come at the expense of performance. The evidence points to a clear win:
substantial storage savings on the metadata layer, with no measurable
trade-off in throughput or CPU usage.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/1de07550-5ebe-49cd-9e74-c58aaed0dea4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This led to a simple conclusion: given the potential for substantial space
savings with no performance downside, the decision was to enable RocksDB LZ4
compression by default in the Squid release.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# ceph version
ceph version 19.2.1-222.el9cp (f2cd71cc2f7b46709c2351134ac89ea3e9f609b6) squid (stable)

# ceph config get osd bluestore_rocksdb_options
compression=kLZ4Compression,max_write_buffer_number=64,min_write_buffer_number_to_merge=6,compaction_style=kCompactionStyleLevel,write_buffer_size=16777216,max_background_jobs=4,level0_file_num_compaction_trigger=8,max_bytes_for_level_base=1073741824,max_bytes_for_level_multiplier=8,compaction_readahead_size=2MB,max_total_wal_size=1073741824,writable_file_max_buffer_size=0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The authors would like to thank IBM for supporting the community with our time to create these posts.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Ceph RGW Rate Limiting</title>
    <link href="https://ceph.io/en/news/blog/2025/rgw-rate-limiting/" />
    <updated>2025-12-16T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2025/rgw-rate-limiting/</id>
    <author>
      <name>Daniel Alexander Parkes, Anthony D&#39;Atri</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="rgw" />
      <category term="s3" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2025/rgw-rate-limiting/">&lt;h2 id=&quot;introduction&quot;&gt;Introduction &lt;a class=&quot;link-anchor&quot; href=&quot;#introduction&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Tentacle release introduces significant enhancements to Object Gateway (RGW)
rate limiting, addressing a critical gap that has long challenged administrators
managing multi-tenant object storage environments. With the addition of rate
limiting for &lt;code&gt;LIST&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; operations, along with improved STS integration,
administrators now have more granular control over resource consumption across
their storage infrastructure.&lt;/p&gt;
&lt;h2 id=&quot;understanding-rate-limiting-in-the-ceph-object-gatway-(rgw)&quot;&gt;Understanding Rate Limiting in the Ceph Object Gatway (RGW) &lt;a class=&quot;link-anchor&quot; href=&quot;#understanding-rate-limiting-in-the-ceph-object-gatway-(rgw)&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Rate limiting in the Ceph Object Gateway has been a powerful tool for controlling
resource consumption and preventing individual users or applications from
monopolizing cluster resources. Before this enhancement, RGW supported rate
limiting for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read operations (&lt;code&gt;max-read-ops&lt;/code&gt;): Controlling GET request frequency&lt;/li&gt;
&lt;li&gt;Write operations (&lt;code&gt;max-write-ops&lt;/code&gt;): Limiting PUT request rates&lt;/li&gt;
&lt;li&gt;Read bandwidth (&lt;code&gt;max-read-bytes&lt;/code&gt;): Throttling data egress&lt;/li&gt;
&lt;li&gt;Write bandwidth (&lt;code&gt;max-write-bytes&lt;/code&gt;): Controlling data ingress&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These limits operate within configurable time windows (controlled by
the &lt;code&gt;rgw_ratelimit_interval&lt;/code&gt; option), traditionally defaulting to 60
seconds. The system uses a token bucket algorithm to track resource
consumption, and when limits are exceeded, RGW returns &lt;code&gt;HTTP 503&lt;/code&gt;
responses to throttle clients.&lt;/p&gt;
&lt;h3 id=&quot;the-scope-of-rate-limiting&quot;&gt;The Scope of Rate Limiting &lt;a class=&quot;link-anchor&quot; href=&quot;#the-scope-of-rate-limiting&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Rate limits can be applied at multiple scopes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User scope: Limits apply to a specific user across all buckets&lt;/li&gt;
&lt;li&gt;Bucket scope: Limits apply to operations in a particular bucket&lt;/li&gt;
&lt;li&gt;Global scope: Limits apply cluster-wide across all users and buckets&lt;/li&gt;
&lt;li&gt;Anonymous scope: Limits for unauthenticated requests&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;important-architectural-considerations&quot;&gt;Important Architectural Considerations &lt;a class=&quot;link-anchor&quot; href=&quot;#important-architectural-considerations&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Ceph Object Gateway&#39;s rate-limiting feature is not a complete QoS system. Key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Per-RGW enforcement: Limits are enforced per RGW instance, not cluster-wide.
With 2 RGWs and a desired 10 ops/minute limit, configure each RGW for 5 ops/minute.
If the client request load isn&#39;t evenly distributed across the endpoints, the required
limits may be lower than expected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Limit intersection: Both user-level AND bucket-level limits must be satisfied.
Requests are rejected if either limit is exceeded.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No traffic shaping: Throttled requests are immediately rejected (503) rather than queued.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No mid-request throttling: Bandwidth is counted after a request completes, not
during. Users who exceed limits go into &amp;quot;debt&amp;quot; (max: 2x the limit) and are
blocked from new requests until the next interval(s) repay the debt.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-problem%3A-missing-control-for-list-and-delete-operations&quot;&gt;The Problem: Missing Control for List and Delete Operations &lt;a class=&quot;link-anchor&quot; href=&quot;#the-problem%3A-missing-control-for-list-and-delete-operations&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While read and write operation limits provided good coverage for data transfer
operations, two critical operation types remained uncontrolled:&lt;/p&gt;
&lt;h3 id=&quot;list-operations&quot;&gt;List Operations &lt;a class=&quot;link-anchor&quot; href=&quot;#list-operations&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bucket listing operations, particularly against buckets with millions of objects,
can place a significant load on the cluster. These operations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scan bucket indexes extensively&lt;/li&gt;
&lt;li&gt;Consume RADOS read IOPS on index pools&lt;/li&gt;
&lt;li&gt;Can impact overall cluster performance when executed at high frequency&lt;/li&gt;
&lt;li&gt;Are costly when using prefixes and delimiters that require filtering&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Previous limitation: &lt;code&gt;LIST&lt;/code&gt; operations (which use &lt;code&gt;GET&lt;/code&gt;/&lt;code&gt;HEAD&lt;/code&gt; HTTP methods) were counted
as read operations under the &lt;code&gt;max-read-ops&lt;/code&gt; limit, making it impossible to control
listing separately from regular &lt;code&gt;GET&lt;/code&gt; operations. This meant administrators couldn&#39;t
prevent list-heavy workloads from consuming the entire read operation budget while
still allowing standard data retrieval.&lt;/p&gt;
&lt;p&gt;Consider a workload performing checkpoint validation by repeatedly listing with prefixes like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ aws s3api list-objects-v2 --bucket data --prefix checkpoint-flag --max-items 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Even though this returns minimal data, each request triggers index scanning
operations that consume cluster resources.&lt;/p&gt;
&lt;p&gt;As an example, Apache Iceberg tables in data lakehouse environments have been
particularly challenging to maintain metadata for Iceberg&#39;s &lt;code&gt;deleteOrphanFiles&lt;/code&gt;
procedure, which cleans up unreferenced data files, requiring complete table
listings that can overwhelm object storage systems.&lt;/p&gt;
&lt;p&gt;![](images/f06a38ed-1eb5-4457-a13e-45a0eba48684.png align=&amp;quot;center&amp;quot;)&lt;/p&gt;
&lt;h3 id=&quot;delete-operations&quot;&gt;Delete Operations &lt;a class=&quot;link-anchor&quot; href=&quot;#delete-operations&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Single-object and multi-object delete operations were also uncontrolled, creating challenges for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preventing abuse during bulk deletion scenarios&lt;/li&gt;
&lt;li&gt;Managing garbage collection workload&lt;/li&gt;
&lt;li&gt;Controlling the rate at which storage capacity is reclaimed&lt;/li&gt;
&lt;li&gt;Protecting against accidental or malicious mass deletion events&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Previous limitation: DELETE operations were classified as write
operations (non-GET/HEAD HTTP methods) and counted against &lt;code&gt;max-write-ops&lt;/code&gt;,
making it impossible to limit deletion rates from PUT operations separately.
Workloads that combined uploads and deletions had to balance their write-ops
budget across both operation types.&lt;/p&gt;
&lt;p&gt;Without dedicated controls for these operations, administrators had limited
options for managing workloads that mixed listing, reading, writing, and
deleting operations in different proportions.&lt;/p&gt;
&lt;h2 id=&quot;the-solution%3A-enhanced-rate-limiting-in-tentacle&quot;&gt;The Solution: Enhanced Rate Limiting in Tentacle &lt;a class=&quot;link-anchor&quot; href=&quot;#the-solution%3A-enhanced-rate-limiting-in-tentacle&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;![](images/a0ea6524-e006-496b-b2bf-855834372d56.jpeg align=&amp;quot;center&amp;quot;)&lt;/p&gt;
&lt;p&gt;Tentacle introduces two new rate-limiting parameters that address these gaps.&lt;/p&gt;
&lt;h3 id=&quot;new-configuration-options&quot;&gt;New Configuration Options &lt;a class=&quot;link-anchor&quot; href=&quot;#new-configuration-options&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Max-list-ops: Specifies the maximum number of bucket listing requests per
accumulation interval. A value of 0 (default) disables this limit, maintaining
backward compatibility.&lt;/li&gt;
&lt;li&gt;Max-delete-ops: Specifies the maximum number of delete operations per accumulation
interval. A value of 0 (default) disables this limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;critical%3A-backward-compatibility-behavior&quot;&gt;Critical: Backward Compatibility Behavior &lt;a class=&quot;link-anchor&quot; href=&quot;#critical%3A-backward-compatibility-behavior&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Important: The new limits work &lt;em&gt;in conjunction with&lt;/em&gt; existing read/write operation limits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LIST&lt;/code&gt; operations: Count against both &lt;code&gt;max-read-ops&lt;/code&gt; AND &lt;code&gt;max-list-ops&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE&lt;/code&gt; operations: Count against both &lt;code&gt;max-write-ops&lt;/code&gt; AND &lt;code&gt;max-delete-ops&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both limits must be satisfied for a request to proceed. Administrators upgrading
from earlier versions will see no behavior change unless they explicitly configure
the new parameters.&lt;/p&gt;
&lt;p&gt;![](images/36e1a637-6316-40de-90d6-df76a8fcb97f.png align=&amp;quot;center&amp;quot;)&lt;/p&gt;
&lt;h3 id=&quot;configurable-time-windows&quot;&gt;Configurable Time Windows &lt;a class=&quot;link-anchor&quot; href=&quot;#configurable-time-windows&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;rgw_ratelimit_interval&lt;/code&gt; configuration option allows administrators to adjust
the interval for rate limit accumulation. This is particularly important for
workloads that exhibit bursty behavior:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ ceph config set client.rgw.rgw.1 rgw_ratelimit_interval 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The default 60-second interval may not be optimal for all workloads. Bursty
workloads, such as Apache Iceberg&#39;s metadata maintenance operations (snapshot
expiration, orphan file cleanup), can exhaust their LIST operation budget in
the first few seconds of a time window. Since Iceberg&#39;s &lt;code&gt;deleteOrphanFiles&lt;/code&gt;
procedure performs complete table listings across potentially thousands of
partitions in rapid succession, the accumulated operations can quickly exceed
the rate limit, resulting in extended throttling periods during which subsequent
maintenance tasks are blocked. Shorter intervals (1-10 seconds) can provide more
consistent behavior by allowing the operation budget to replenish more frequently,
preventing long stalls in critical table maintenance workflows.&lt;/p&gt;
&lt;h3 id=&quot;sts-integration&quot;&gt;STS Integration &lt;a class=&quot;link-anchor&quot; href=&quot;#sts-integration&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A new enhancement to the STS/IAM feature ensures that rate limits now apply
correctly when users authenticate with temporary credentials obtained via the
Security Token Service (STS):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User rate limits configured on an account continue to be enforced when
that user assumes an IAM role and operates with temporary credentials.&lt;/li&gt;
&lt;li&gt;Bucket rate limits are enforced adequately for operations performed using
STS credentials, regardless of how the user authenticated.&lt;/li&gt;
&lt;li&gt;Global rate limits now work seamlessly with federated authentication flows,
such as AssumeRoleWithWebIdentity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This closes a previous gap where rate limiting enforcement may not have worked
correctly with STS sessions, ensuring consistent rate limit policies across all
authentication methods.&lt;/p&gt;
&lt;h2 id=&quot;rate-limiting-configuration-examples&quot;&gt;Rate Limiting Configuration Examples &lt;a class=&quot;link-anchor&quot; href=&quot;#rate-limiting-configuration-examples&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;example-1%3A-configuring-list-operation-rate-limits&quot;&gt;Example 1: Configuring LIST Operation Rate Limits &lt;a class=&quot;link-anchor&quot; href=&quot;#example-1%3A-configuring-list-operation-rate-limits&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Set up a user with list operation limits to control the frequency of bucket listings.&lt;/p&gt;
&lt;p&gt;Create a test user:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin user create --uid=testuser --display-name=&amp;quot;Test User&amp;quot;
{
    &amp;quot;user_id&amp;quot;: &amp;quot;testuser&amp;quot;,
    &amp;quot;display_name&amp;quot;: &amp;quot;Test User&amp;quot;,
    &amp;quot;email&amp;quot;: &amp;quot;&amp;quot;,
    &amp;quot;suspended&amp;quot;: 0,
    &amp;quot;max_buckets&amp;quot;: 1000,
    &amp;quot;subusers&amp;quot;: [],
    &amp;quot;keys&amp;quot;: [
        {
            &amp;quot;user&amp;quot;: &amp;quot;testuser&amp;quot;,
            &amp;quot;access_key&amp;quot;: &amp;quot;TESTUSER_ACCESS_KEY&amp;quot;,
            &amp;quot;secret_key&amp;quot;: &amp;quot;TESTUSER_SECRET_KEY&amp;quot;
        }
    ],
    &amp;quot;caps&amp;quot;: [],
    &amp;quot;op_mask&amp;quot;: &amp;quot;read, write, delete&amp;quot;,
    &amp;quot;type&amp;quot;: &amp;quot;rgw&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set rate limits for list operations. We have two RGW services deployed in our
cluster, so if we want to limit the operations to 10, we need to divide the
ops limit by the number of RGWs running in the cluster:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin ratelimit set --ratelimit-scope=user --uid=testuser &#92;
    --max-list-ops=5 &#92;
    --max-read-ops=100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enable rate limiting for this user:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin ratelimit enable --ratelimit-scope=user --uid=testuser
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify the configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin ratelimit get --ratelimit-scope=user --uid=testuser
{
    &amp;quot;user_ratelimit&amp;quot;: {
        &amp;quot;max_read_ops&amp;quot;: 100,
        &amp;quot;max_write_ops&amp;quot;: 0,
        &amp;quot;max_list_ops&amp;quot;: 5,
        &amp;quot;max_delete_ops&amp;quot;: 0,
        &amp;quot;max_read_bytes&amp;quot;: 0,
        &amp;quot;max_write_bytes&amp;quot;: 0,
        &amp;quot;enabled&amp;quot;: true
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;example-2%3A-configuring-delete-operation-rate-limits&quot;&gt;Example 2: Configuring DELETE Operation Rate Limits &lt;a class=&quot;link-anchor&quot; href=&quot;#example-2%3A-configuring-delete-operation-rate-limits&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Set up delete operation limits to control the rate of deletions.
Set rate limits for delete operations on the same user:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin ratelimit set --ratelimit-scope=user --uid=testuser &#92;
    --max-delete-ops=10 &#92;
    --max-write-ops=100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify the updated configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ radosgw-admin ratelimit get --ratelimit-scope=user --uid=testuser
{
    &amp;quot;user_ratelimit&amp;quot;: {
        &amp;quot;max_read_ops&amp;quot;: 100,
        &amp;quot;max_write_ops&amp;quot;: 100,
        &amp;quot;max_list_ops&amp;quot;: 5,
        &amp;quot;max_delete_ops&amp;quot;: 10,
        &amp;quot;max_read_bytes&amp;quot;: 0,
        &amp;quot;max_write_bytes&amp;quot;: 0,
        &amp;quot;enabled&amp;quot;: true
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;observing-rate-limiting-in-action&quot;&gt;Observing Rate Limiting in Action &lt;a class=&quot;link-anchor&quot; href=&quot;#observing-rate-limiting-in-action&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&#39;s see what happens when a user exceeds their configured limits.&lt;/p&gt;
&lt;h3 id=&quot;test-scenario%3A-exceeding-list-operation-limits&quot;&gt;Test Scenario: Exceeding List Operation Limits &lt;a class=&quot;link-anchor&quot; href=&quot;#test-scenario%3A-exceeding-list-operation-limits&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With the configuration from Example 2 (5 list ops per RGW, 10 list
ops total per minute), configure AWS CLI with test credentials:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws configure set aws_access_key_id TESTUSER_ACCESS_KEY
$ aws configure set aws_secret_access_key TESTUSER_SECRET_KEY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create a test bucket:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ aws --endpoint-url http://rgw.example.com s3 mb s3://test-bucket
make_bucket: test-bucket
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Populate the bucket with test objects:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ for i in {1..100}; do
    echo &amp;quot;Test object $i&amp;quot; | aws --endpoint-url http://rgw.example.com s3 cp - s3://test-bucket/object-$i
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rapidly execute list operations to exceed the limit. I will use a script that
uses &lt;code&gt;curl&lt;/code&gt; to list the contents of the bucket &lt;code&gt;test-bucket&lt;/code&gt; repeatedly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bash script.sh
Testing Rate Limit with list-objects-v2...
------------------------------------------------
Attempt 1: ✅ SUCCESS (200)
Attempt 2: ✅ SUCCESS (200)
Attempt 3: ✅ SUCCESS (200)
...
Attempt 10: ✅ SUCCESS (200)
Attempt 11: 🛑 BLOCKED (503) - Limit Reached
Attempt 12: 🛑 BLOCKED (503) - Limit Reached
Attempt 13: 🛑 BLOCKED (503) - Limit Reached
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;testing-delete-rate-limits&quot;&gt;Testing Delete Rate Limits &lt;a class=&quot;link-anchor&quot; href=&quot;#testing-delete-rate-limits&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Attempt to delete objects beyond the configured limit (20 deletes per minute) with the AWS CLI client:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ for i in {1..25}; do
    echo &amp;quot;Delete attempt $i&amp;quot;
    aws --endpoint-url http://rgw.example.com s3 rm s3://test-bucket/object-$i 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;delete:|error&amp;quot;
done
Delete attempt 1
delete: s3://test-bucket/object-1
Delete attempt 2
delete: s3://test-bucket/object-2
Delete attempt 3
delete: s3://test-bucket/object-3
...
Delete attempt 19
delete: s3://test-bucket/object-19
Delete attempt 20
delete: s3://test-bucket/object-20
Delete attempt 21
delete failed: s3://limits-bucket/object-21 argument of type &#39;NoneType&#39; is not iterable
Delete attempt 22
delete failed: s3://limits-bucket/object-22 argument of type &#39;NoneType&#39; is not iterable
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;known-limitations-and-future-enhancements&quot;&gt;Known Limitations and Future Enhancements &lt;a class=&quot;link-anchor&quot; href=&quot;#known-limitations-and-future-enhancements&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;current-limitations&quot;&gt;Current Limitations &lt;a class=&quot;link-anchor&quot; href=&quot;#current-limitations&quot;&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Backward Compatibility Constraint&lt;/em&gt;*: LIST operations still count against
max-read-ops, and DELETE operations count against max-write-ops. The
new  &lt;code&gt;max-list-ops&lt;/code&gt; and &lt;code&gt;max-delete-ops&lt;/code&gt; limits provide additional
constraints but do not replace the legacy limits. Both limits must be
satisfied for a request to proceed. This design choice maintains backward
compatibility but means you cannot completely isolate LIST/DELETE operations
from general read/write operation budgets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Multi-Object Delete&lt;/em&gt;: The S3 DeleteObjects API (bulk delete) is not
currently rate-limited but is tracked for future
enhancement: &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=2393080&quot;&gt;RFE&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;IAM Account Limitation&lt;/em&gt;: Rate limits on IAM accounts (as opposed to
users) do not currently work. This is tracked as an RFE for a future
release. &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=2394369&quot;&gt;RFE&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Multipart Upload Accounting&lt;/em&gt;: During multipart uploads with limited
write ops, the &lt;code&gt;CreateMultipartUpload&lt;/code&gt;, &lt;code&gt;UploadPart&lt;/code&gt;,
and &lt;code&gt;CompleteMultipartUpload operations&lt;/code&gt; each count against the write-ops
limit. For large files split into many parts, this can quickly consume the
operation budget. &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=2396664&quot;&gt;RFE&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Improved Logging Output&lt;/em&gt;. Currently, when hitting a rate limit, we see only
the following opaque errors in the RGW log, which don’t specify which rate
limit we have reached. &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=2396664&quot;&gt;RFE&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;2025-11-20T16:39:40.030+0000 7f9e6423a640  2 req 15365199512736087891 0.001000024s s3:delete_obj check rate limiting
2025-11-20T16:39:40.030+0000 7f9e6423a640 20 req 15365199512736087891 0.001000024s op-&amp;gt;ERRORHANDLER: err_no=-2218 new_err_no=-2218
2025-11-20T16:39:40.030+0000 7f9e6423a640  2 req 15365199512736087891 0.001000024s s3:delete_obj http status=503
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;link-anchor&quot; href=&quot;#conclusion&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The addition of &lt;code&gt;LIST&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; operation rate limiting in Tentacle represents
a significant maturity improvement for the Object Gateway. Combined with the new
STS integration and configurable time intervals, administrators now have
comprehensive tools for managing multi-tenant object storage workloads.&lt;/p&gt;
&lt;p&gt;These enhancements are particularly valuable for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Enterprises&lt;/em&gt; implementing department-level chargebacks and resource governance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Cloud-native applications&lt;/em&gt; using federated identity with OIDC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Data analytics platforms&lt;/em&gt; with mixed read-heavy and metadata-intensive operations&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While some limitations remain (particularly around multi-object delete and IAM
accounts), the current implementation provides production-ready capabilities
that have been extensively tested with workloads ranging from small-object writes
to multi-million object listings.&lt;/p&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;Get Involved &lt;a class=&quot;link-anchor&quot; href=&quot;#get-involved&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We encourage you to test these new capabilities in your environment and share
your experiences with &lt;a href=&quot;https://docs.ceph.com/en/latest/start/get-involved&quot;&gt;the community&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The authors would like to thank IBM for supporting the community with our time to create these posts.&lt;/p&gt;
&lt;p&gt;Special thanks to the Ceph community and the IBM Storage Ceph QE team for their
extensive testing and validation of these features, covering functional, scale,
and regression scenarios with millions of objects and hundreds of gigabytes of
test data.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Ending Support for some Erasure Code Plugins</title>
    <link href="https://ceph.io/en/news/blog/2025/ending-support-for-ec-plugins/" />
    <updated>2025-12-16T00:00:00Z</updated>
    <id>https://ceph.io/en/news/blog/2025/ending-support-for-ec-plugins/</id>
    <author>
      <name>Jamie Pryde (IBM)</name>
    </author>
      <category term="en-blog-post" />
      <category term="en-article" />
      <category term="blog-post" />
      <category term="ceph" />
      <category term="erasure-encoding" />
    <content type="html" xml:base="https://ceph.io/en/news/blog/2025/ending-support-for-ec-plugins/">&lt;p&gt;A plan to end support for some erasure code plugins and techniques
in the Ceph V release.&lt;/p&gt;
&lt;h2 id=&quot;the-erasure-code-plugin-interface&quot;&gt;The Erasure Code Plugin Interface &lt;a class=&quot;link-anchor&quot; href=&quot;#the-erasure-code-plugin-interface&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ceph uses a plugin interface for erasure coded pools. These plugins are
external code libraries that are used to do the encoding and decoding of data.
Ceph pass chunks of data to the plugin. The plugin uses an encoding algorithm
to produce additional chunks called parity (or coding) chunks.&lt;/p&gt;
&lt;p&gt;When an erasure coded pool is created, an erasure code profile must be selected.
Among other things, the profile includes the plugin and the technique that will be
used for the pool. The technique defines the algorithm that the plugin will use for
encoding and decoding, and some plugins support multiple different techniques.
Because the parity chunks generated are different for each combination of plugin
and technique, there is no way to change the plugin and technique after the pool has been
created.&lt;/p&gt;
&lt;p&gt;Ceph currently supports five erasure code plugins, some of which support multiple
techniques:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jerasure&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;reed_sol_van&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;reed_sol_r6_op&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;cauchy_orig&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;cauchy_good&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;liberation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;blaum_roth&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;liber8tion&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ISA-L (Intel Intelligent Storage Acceleration Library)&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;reed_sol_van&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;cauchy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SHEC (Shingled Erasure Code)&lt;/li&gt;
&lt;li&gt;CLAY (Coupled Layer)&lt;/li&gt;
&lt;li&gt;LRC (Locally Repairable Erasure Code)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why are there so many options?&lt;/p&gt;
&lt;p&gt;In the distant past, before CPUs supported SIMD instructions
(Single Instruction, Multiple Data) and could encode and decode lots of data in parallel,
Jerasure&#39;s XOR-optimized techniques (cauchy, liberation, liber8tion and blaum_roth) offered a
performance improvement when encoding and decoding data. Now, with SSE, AVX (and other) instructions,
the need for techniques that rely on XOR operations has been greatly reduced, and reed_sol_van is very close
or in some cases better, than the XOR-optimized techniques. See the comparison chart later
in this post for the data!&lt;/p&gt;
&lt;p&gt;SHEC and CLAY both focus on trying to improve the recovery efficiency (by optimizing network and disk usage
when decoding data) when an OSD or server fails and data must be rebuilt. Both of these plugins build
on top of Jerasure, with additional logic that aims to speed up recovery.&lt;/p&gt;
&lt;p&gt;LRC also builds on top of Jerasure and intends to improve recovery efficiency by using locally available
data (e.g. data in the same data centre or same rack) to minimise transfers between racks or sites.&lt;/p&gt;
&lt;h2 id=&quot;ending-support-for-plugins&quot;&gt;Ending Support For Plugins &lt;a class=&quot;link-anchor&quot; href=&quot;#ending-support-for-plugins&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the Ceph Tentacle release we introduced a new version of erasure coding
that has become known as Fast EC. Fast EC offers significant performance
improvements and some capacity savings when using erasure coding, particularly for block
and file workloads. There are even more improvements to Fast EC coming in future releases. See Lee Sanders&#39; blog post
&lt;a href=&quot;https://ceph.io/en/news/blog/2025/tentacle-fastec-performance-updates/&quot;&gt;https://ceph.io/en/news/blog/2025/tentacle-fastec-performance-updates/&lt;/a&gt; for more details about Fast EC.&lt;/p&gt;
&lt;p&gt;Fast EC changes the interface between Ceph and the erasure code plugins. In Tentacle, only ISA-L
(using reed_sol_van or cauchy) and Jerasure (using reed_sol_van) support Fast EC. The old EC code has been kept
as a separate code path in Ceph, and the other plugins (and other Jerasure techniques) continue to use old EC.&lt;/p&gt;
&lt;p&gt;Our proposal is that we should end support for the least used (and least useful) plugins
and techniques in the V release. Ceph clusters using these plugins and techniques will not be
able to upgrade to the V release unless data is first migrated to a pool that uses
a supported plugin and technique.&lt;/p&gt;
&lt;p&gt;Why not continue to support all of these plugins using the old EC code path?&lt;/p&gt;
&lt;p&gt;The Fast EC work exposed the amount of development effort required to continue to support
such a big list of plugins and techniques. Even though only the most important plugins and techniques
support Fast EC, code changes were still required to ensure that the other plugins continue working
correctly. We now have two separate erasure code paths to maintain. Along with extra development work, supporting
a big list of plugins also means lots more testing needs to be done to ensure nothing gets broken.&lt;/p&gt;
&lt;p&gt;We don&#39;t think this effort is justified given the small number of users using some plugins, and
the lack of benefits that these plugins and techniques provide according to performance benchmarks. Developer
focus would be better spent on improving other parts of Ceph.&lt;/p&gt;
&lt;p&gt;The proposed list of plugins and techniques that we will support in the V release are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jerasure&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;reed_sol_van&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ISA-L&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;reed_sol_van&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;cauchy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LRC (Although LRC doesn&#39;t currently support Fast EC and we wouldn&#39;t recommend using it yet, we think
we will be able to use LRC in future to improve support for erasure coded pools in stretched clusters.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;telemetry-data&quot;&gt;Telemetry Data &lt;a class=&quot;link-anchor&quot; href=&quot;#telemetry-data&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So let&#39;s look at some data. How many people are actually using each plugin? Not every Ceph cluster has opted in
to upload usage data to Telemetry, but enough have to give us a good idea about the plugins and techniques that
people are using. Here is a recent snapshot of the clusters using erasure coded pools:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/ec_plugin_telemetry.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;performance-data&quot;&gt;Performance Data &lt;a class=&quot;link-anchor&quot; href=&quot;#performance-data&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My talk at Cephalocon 2024 (&lt;a href=&quot;https://www.youtube.com/watch?v=aM8sJgDD-x4&quot;&gt;https://www.youtube.com/watch?v=aM8sJgDD-x4&lt;/a&gt;) discussed why we&#39;ve made ISA-L the
default plugin for new EC pools. The talk included performance data captured using Ceph&#39;s EC benchmarking
tool, and I&#39;ve included that here. These charts demonstrate how advancements in SIMD instructions have
brought the performance of the reed_sol_van technique to a point where reed_sol_van is almost as good as
or better than other techniques. Note that the ISA-L vandermonde and cauchy lines are overlapping in the encode
graph:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/encode_perf.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/decode_perf.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;As mentioned earlier, the goal of both SHEC and of CLAY is to improve recovery efficiency when an OSD is down.
A recent blog post written by Jake Squelch uses the Ceph Benchmarking Tool (CBT) to compare performance of the
Jerasure and CLAY plugins. His results show that there is a trade-off when using CLAY.
Although CLAY can reduce network bandwidth usage during recovery by around 50%, there is a performance penalty
for client I/O during normal operation, and when an OSD is down and the cluster needs to recover data. Data is being
read in a very inefficient way, particularly when using the default stripe_unit value.
See &lt;a href=&quot;https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part3/&quot;&gt;https://ceph.io/en/news/blog/2025/cbt-performance-benchmarking-part3/&lt;/a&gt; for more detail.&lt;/p&gt;
&lt;h2 id=&quot;pool-migration&quot;&gt;Pool Migration &lt;a class=&quot;link-anchor&quot; href=&quot;#pool-migration&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What if you&#39;re the owner of the single cluster using Jerasure&#39;s blaum_roth technique in the telemetry data?
As we end support for the above list of plugins and techniques, we will need a way to move
data from those pools into new pools that use supported plugins. In the Umbrella release
we plan to add such a pool migration feature. This new feature will provide a way to non-disruptively move data
from one pool to another. The migration will run as a background task, similar to backfill and recovery,
with no downtime where data is inaccessible. This will allow you to migrate all the objects from a pool that uses
an unsupported plugin to a new pool that uses a supported plugin and technique, and then upgrade the cluster to the
V release.
See &lt;a href=&quot;https://github.com/ceph/ceph/pull/65703&quot;&gt;https://github.com/ceph/ceph/pull/65703&lt;/a&gt; for the pool migration design document.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;link-anchor&quot; href=&quot;#conclusion&quot;&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As we&#39;ve developed Fast EC, it&#39;s become clear that continuing to support such a big list of plugins and techniques
is too much effort for the value that some of the plugins and techniques provide.&lt;/p&gt;
&lt;p&gt;In the Umbrella release we will deprecate the plugins and techniques not included in the supported list
mentioned above. In the V release we will end support for those plugins and techniques. You will not be
able to upgrade to the V release if your cluster has any pools that use those plugins and techniques.
You will be able to use the new pool migration feature in Umbrella to migrate data from a pool to a new pool
that uses one of the supported plugins and techniques.&lt;/p&gt;
&lt;p&gt;Reducing our list of supported plugins and techniques will allow us to focus our development efforts
and continue to improve Fast EC, without the risk of breaking lesser-used plugins.&lt;/p&gt;
</content>
  </entry>
</feed>
