v20.2.2 Tentacle released
This is the second minor release in the Tentacle series. We recommend that all users update to this release.
Release Date ¶
June 16, 2026
Notable Changes ¶
- Rocky 10 package-based installs are now supported starting with v20.2.2. Please see the supported platforms for current and planned support in Ceph.
MDS (Metadata Server) ¶
- Segmentation fault fixed due to incorrect queueing of request retries.
OSD (Object Storage Daemon) ¶
- PGLog Missed List: Fixed a bug to ensure the correct version is attached to the missing list when ignoring log entries.
- Data Integrity Asserts: Added assertions to explicitly catch potential corruption in the OSD missing list.
RGW (RADOS Gateway) ¶
- Lifecycle Management: Fixed lifecycle transition issues affecting encrypted multipart objects.
- REST & Query Handling: RESTArgs::get_string() now properly URL-decodes incoming query parameters.
RADOS / librados / neorados ¶
- 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.
- 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.
- Async Utilities: Fixed an issue regarding the improper removal of objects from the async service list.
Dashboard ¶
- NVMeoF Revamp: Complete UI overhaul with DHCHAP controller key support, namespace encryption, and secure listeners configuration.
- Pools & RGW: Added stretch cluster validation for pools, fixed RGW restart/stop issues, storage class restrictions, sync policy fixes, and MSR EC Profile support.
- NFS: Toggle visibility for CephFS snapshots, fixed export creation and path value consistency issues.
ceph-volume ¶
- Inventory Scanning: Enhanced inventory discovery logic to automatically skip RAM disk devices (/dev/ram*).
External Block Device (extblkdev) ¶
- Plugin Stability: Fixed an assertion failure in the FCM plugin when encountering multivolume devices.
Changelog ¶
(tentacle) ceph-volume: backport PRs 67047 and 67240 (pr#67343, Guillaume Abrioux, Parfait Detchenou)
[tentacle] bluestore, extblkdev: Now plugins can raise health warnings (pr#68663, Adam Kupczyk, Igor Fedotov, Martin Ohmacht)
Backporting PRs 67236 and 67419 (pr#67533, Adam King)
Beacon diff + Stretched cluster (pr#68347, Leonid Chernin, Samuel Just)
ceph-volume: include LVM mapper devices in get_devices() (pr#67989, Guillaume Abrioux)
ceph-volume: skip /dev/ram* devices in inventory (pr#68552, Ujjawal Anand)
ceph-volume: skip mkfs discard for LVM NVMe OSDs (pr#68286, Ujjawal Anand)
ceph-volume: skip redundant NVMe mkfs discards (pr#67341, Ujjawal Anand)
ceph-volume: skip virtual cdrom devices in inventory (pr#68108, Ujjawal Anand)
ceph.spec.in: replace golang github prometheus with promtool binary path (pr#68420, Nizamudeen A)
ceph_mon: Fix shutdown order to destroy Monitor before closing mon store (pr#68399, Prashant D)
cephadm: wait for latest osd map after ceph-volume before OSD deploy (pr#68379, Guillaume Abrioux)
cephfs: MDCache request cleanup (pr#66469, Abhishek Lekshmanan)
Check if
HTTP\_X\_AMZ\_COPY\_SOURCEheader is empty (pr#66027, Suyash Dongre)client: adjust
Fbcap ref count check during synchronous fsync() (issue#73624, pr#65913, Venky Shankar)client: crash caused by invalid iterator in _readdir_cache_cb (pr#65957, Zhansong Gao)
container/build.sh: add 'rocky-10' suffix if necessary (pr#67895, Dan Mick)
container/build.sh: FROM_IMAGE=rockylinux-10 default for >=tentacle backports (pr#67960, Matan Breizman, David Galloway, John Mulligan, Dan Mick)
debian: package mgr/smb in ceph-mgr-modules-core (pr#67510, Roland Sommer)
debian: remove invoke-rc.d calls from postrm scripts (pr#67354, Kefu Chai)
debian: remove stale distutils override from py3dist-overrides (pr#68276, Thomas Lamprecht, Max R. Carrara, Kefu Chai)
doc: Batch backport for start/hardware-recommendations.rst (pr#67907, Anthony D'Atri, Marc Methot, Pierre Riteau, Ville Ojamo)
extblkdev: Fix FCM plugin asserting on multivolume devices (pr#68877, Adam Kupczyk)
found duplicate series for the match group {fs_id="-1"} (pr#68369, bst2002git)
Implement Admin REST APIs for Setting Account Quota (pr#66905, Nicholas Liu, Jiffin Tony Thottan)
kv/RocksDB: Add instrumentation to BinnedLRUCache (pr#67349, Adam Kupczyk)
libcephsqlite: ensure atexit handlers are registered after openssl (pr#68263, Patrick Donnelly)
librbd/cache/pwl: WriteLogOperationSet::cell can be garbage (pr#67705, Ilya Dryomov)
librbd/migration/QCOWFormat: avoid use-after-free in execute_request() (pr#68188, Ilya Dryomov)
librbd/mirror: detect trashed snapshots in UnlinkPeerRequest (pr#67583, Ilya Dryomov)
librbd: avoid losing sparseness in read_parent() (pr#68463, Ilya Dryomov)
librbd: don't complete ImageUpdateWatchers::shut_down() prematurely (pr#67581, Ilya Dryomov)
librbd: rbd_aio_write_with_crc32c (pr#68038, Alexander Indenbaum)
mds: add ref counting to LogSegment (pr#68439, Milind Changire)
mds: add retry request to MDSRank wait queue rather via finisher (issue#76031, pr#68905, Venky Shankar)
mds: scrub pins more inodes than the mds_cache_memory_limit (pr#67808, Md Mahamudur Rahaman Sajib)
mds: use SimpleLock::WAIT_ALL for wait mask (pr#68313, Patrick Donnelly)
mgr/cephadm: Add KMIP server support for NVMeoF gateway (pr#68086, Gil Bregman)
mgr/cephadm: add rbd_with_crc32c parameter to nvmeof service spec (pr#66933, Alexander Indenbaum)
mgr/cephadm: fix mgmt-gateway startup on IPv6 VIP (pr#68387, Kobi Ginon)
mgr/cephadm: include cluster FSID in root CA Common Name (CN) (pr#64692, Redouane Kachach, Kushal Deb)
mgr/cephadm: serialize OSD class before returning for OSD rm status (pr#69226, Adam King)
mgr/DaemonServer: Implement ok-to-upgrade command (pr#66948, Sridhar Seshasayee)
mgr/DaemonServer: Limit search for OSDs to upgrade within the crush bucket (pr#68350, Sridhar Seshasayee)
mgr/dashboard : Add bottom padding for dashboard screens (pr#68523, Abhishek Desai)
mgr/dashboard : add stretch cluster validation for pools form (pr#68476, Afreen Misbah, Abhishek Desai)
mgr/dashboard : Fix RGW restart/stop issue (pr#68554, Abhishek Desai)
mgr/dashboard : fix-non-versioning-bucket-issue (pr#68520, Abhishek Desai)
mgr/dashboard : Fixes EC profile used pool empty (pr#68730, Abhishek Desai)
mgr/dashboard : Restrict create storage class with existing name (pr#68475, Abhishek Desai)
mgr/dashboard: [RGW-NFS]: User level export creation via UI fails with 500 - Internal Server Error (pr#67013, Dnyaneshwari Talwekar)
mgr/dashboard: [snap-visibility]Edit Client config option remains stuck in loading when nfs user is configured (pr#68542, Dnyaneshwari Talwekar)
mgr/dashboard: [storage-class]: Deleting local storage class from UI does not remove its entry from zone (pr#67949, Dnyaneshwari Talwekar)
mgr/dashboard: Add DHCHAP controller key to NVME host commands (pr#67600, Gil Bregman)
mgr/dashboard: add helper text to bucket form > policy and other spacing fixes (pr#67871, Naman Munet)
mgr/dashboard: Add location to gateway info command in NVMeoF CLI (pr#68345, Gil Bregman)
mgr/dashboard: Add namespace encryption support to NVMeoF CLI (pr#68339, Gil Bregman)
mgr/dashboard: Add nvmeof_top_cli service (pr#67566, Vallari Agrawal)
mgr/dashboard: Add option to edit zone with keys/ (pr#68317, Aashish Sharma)
mgr/dashboard: Add option to set motd via api (pr#68678, Aashish Sharma)
mgr/dashboard: Add overview page (pr#67840, Afreen Misbah, Devika Babrekar, Aashish Sharma, Abhishek Desai, Naman Munet, Nizamudeen A)
mgr/dashboard: Add port and secure-listeners to subsystem add NVMeoF CLI command (pr#68370, Vallari Agrawal, Gil Bregman)
mgr/dashboard: Add restore events in notification screen (pr#67912, pujashahu, pujaoshahu)
mgr/dashboard: Add secure and verify-host-name to "listener add" on NVMeoF CLI (pr#67799, Gil Bregman)
mgr/dashboard: Adding rados ns option into add_ns_req (pr#67470, gadi-didi)
mgr/dashboard: Allow empty port value when adding a listener in NVMEoF CLI (pr#68766, Gil Bregman)
mgr/dashboard: Batch backport nvmeof revamp (pr#67839, Afreen Misbah, Nizamudeen A, Sagar Gopale, pujaoshahu, Puja Shahu, Ville Ojamo)
mgr/dashboard: Bump lodash (pr#68695, Afreen Misbah)
mgr/dashboard: bump nvmeof submodule to 1.6.5 (pr#67326, Vallari Agrawal, Tomer Haskalovitch)
mgr/dashboard: carbonize-osd-flags-modal (pr#68133, Afreen Misbah, Sagar Gopale)
mgr/dashboard: Difference in "path" value observed when rgw user level export created via dashboard vs cli (pr#68583, Dnyaneshwari Talwekar)
mgr/dashboard: fix subvolume group corruption from smb share form (pr#68103, Nizamudeen A)
mgr/dashboard: Fix tags in subvolume list and subvolume groups list (pr#68382, pujaoshahu)
mgr/dashboard: Making 'ISA' as default plugin for EC profiles created through dashboard (pr#68373, Devika Babrekar)
mgr/dashboard: mgr/dashboard: Carbonize Realm Name and Token block in Multi-site Replication Wizard (pr#68546, Sagar Gopale)
mgr/dashboard: Misleading warning when no eligible devices are available for OSD creation (pr#67637, Naman Munet)
mgr/dashboard: nfs export creation fails with obj deserialization (pr#67564, Nizamudeen A)
mgr/dashboard: NFS: Toggle visibility of CephFS snapshots (pr#67636, Afreen Misbah, Dnyaneshwari Talwekar)
mgr/dashboard: Option to select archive option while Import Multi-site Token (pr#68513, Aashish Sharma)
mgr/dashboard: remove sync_from entry when sync_from_all is true (pr#68536, Aashish Sharma)
mgr/dashboard: Rename Alert breadcrumb to Alert Rules (pr#68238, Sagar Gopale)
mgr/dashboard: sync policy created for a bucket in Object >> Multi-site >> Sync-policy, is not reflecting under bucket's replication (pr#68512, Naman Munet)
mgr/dashboard:Adding MSR EC Profile via dashboard (pr#68349, Devika Babrekar)
mgr/smb: fix error handling for fundamental resource parsing (pr#65861, John Mulligan)
mgr/test_orchestrator: fixing daemon_action method signature (pr#69231, Redouane Kachach)
mgr: add config to load modules in main interpreter instead of subinterpreter (pr#67515, Nitzan Mordhai, Nitzan Mordechai, Samuel Just)
mgr: ensure that all modules have started before advertising active mgr (pr#67850, Laura Flores)
mgr: fix continous smb MgrDBNotReady (pr#68598, Pedro Gonzalez Gomez)
mgr: fix PyObject* refcounting in TTLCache and cleanup logic (pr#66482, Nitzan Mordechai)
mgr: guard close_section calls in get_perf_schema_python (pr#69436, Lumir Sliva)
mgr: isolated CherryPy to prevent global state sharing (pr#67465, Nizamudeen A, Anmol Babu)
mon [stretch-mode]: Allow a max bucket weight diff threshold (pr#67790, Kamoltat Sirivadhna, Kamoltat (Junior) Sirivadhna)
mon/AuthMonitor: add osd w cap for superuser client (pr#68314, Venky Shankar, Patrick Donnelly)
monitoring: Fix application overview to show Raw used (pr#68794, Ankush Behl)
mr/dashboard: remove rgw_servers filter from radosgw-sync-overview grafana dashboard (pr#68604, Aashish Sharma)
neorados: Fix Neorados CephContext leak (pr#67513, Adam C. Emerson)
neorados: specify alignments for aligned_storage (pr#67512, Casey Bodley)
neorados: Various Fixes to Watch/Notify (pr#68776, Adam C. Emerson, Casey Bodley)
node-proxy: major refactor and various fixes (pr#67418, Guillaume Abrioux)
nvmeof: Change the NVMEOF image version to 1.6 (pr#68415, Gil Bregman)
nvmeofgw: fix issue of delete all gws from the pool/group (pr#67942, Leonid Chernin)
orch/cephadm: fix osd.default creation (pr#68121, Guillaume Abrioux)
os/bluestore: track compression\_*blob_size* parameters for online update (pr#67888, Igor Fedotov)
os/bluestore:fix bluestore_volume_selection_reserved_factor usage (pr#66837, Igor Fedotov)
osd/scrub: support an operator-abort command (pr#67031, Ronen Friedman)
osd: add pg-upmap-primary to clean_pg_upmaps (pr#67407, Laura Flores)
osd: Allow multiple objects with same version in missing list (pr#69450, Alex Ainscow)
osd: Avoid assertion on empty object read when reading multiple objects (pr#68714, Alex Ainscow)
osd: Avoid pwlc spanning intervals (pr#68708, Bill Scales)
osd: Change rmissing map key from version_t to eversion_t (pr#68716, Alex Ainscow)
osd: Deleting PG should discard pwlc (pr#68709, Bill Scales)
osd: FastEC: always update pwlc epoch when activating (pr#68710, Bill Scales)
osd: Fix bug when calculating min_peer_features (pr#69159, Bill Scales)
osd: Fix incorrect rollback logic for partial write OI (pr#68715, Alex Ainscow)
osd: PGLog Attach correct version to missing list when ignoring log entries (pr#68718, Alex Ainscow)
osd: Twiddle should create a full sized vector for optimized EC (pr#68717, Alex Ainscow)
pybind/mgr: call new _ceph_exit for killpoints (pr#68518, Patrick Donnelly)
pybind/mgr: update modules to use independent CLICommand subtypes with distinct COMMAND attributes (pr#67511, Kefu Chai, Samuel Just)
qa/cephadm: derive container image from cephadm release (pr#68328, Lumir Sliva)
qa/cephfs: lua to respect missing kernel in yaml (pr#67293, Kyr Shatskyy)
qa/cephfs: treat "implicit declaration of function" for blogbench workunit for newer gcc version (issue#75380, pr#68820, Venky Shankar)
qa/distros: add rocky 10.0 as supported distro/container host (pr#68569, Patrick Donnelly, Casey Bodley, Adam King, David Galloway)
qa/radosgw_admin: replace boto2 with boto3 (pr#68739, Adam C. Emerson, Casey Bodley)
qa/rgw/multisite: remove duplicate test_suspended_delete_marker_incremental_sync (pr#68846, Oguzhan Ozmen)
qa/rgw/upgrade: symlinks are explicit about distro versions (pr#68057, Casey Bodley)
qa/rgw: Revive crypt kmip (pr#68371, Kyr Shatskyy)
qa/suites/fs: fix extraneous distro links (pr#69251, Patrick Donnelly)
qa/suites/upgrade: ignore osd in unknown state (pr#69307, Patrick Donnelly)
qa/suites/upgrade: ignore undersized PG during stress splits (pr#69310, Patrick Donnelly)
qa/suites/upgrade: update upgrade paths and exclude rocky10 from non-supported distros (pr#68660, Yaarit Hatuka, Laura Flores)
qa/suites: remove centos restriction from valgrind yaml (issue#18126, issue#20360, pr#67519, Samuel Just)
qa/suites: use tagged version of reef (pr#68357, Laura Flores)
qa/tasks/backfill_toofull.py: Fix assert failures with & without compression (pr#68118, Sridhar Seshasayee)
qa/tasks/keystone: upgrade keystone to 2025.2 (pr#67757, Kyr Shatskyy)
qa/tasks/quiescer: remove racy assertion (pr#68510, Patrick Donnelly)
qa/tasks: capture CommandCrashedError when running nvme list cmd (pr#69232, Redouane Kachach)
qa/tasks: make rbd_mirror_thrash inherit from ThrasherGreenlet (pr#67795, Ilya Dryomov)
qa/tasks: update egrep to 'grep -E' (pr#67518, Nitzan Mordechai, Samuel Just)
qa/workunits/ceph-helpers-root: Add Rocky support for install packages (pr#67507, Nitzan Mordechai)
qa/workunits/rbd: drop racy assert in test_tasks_recovery() (pr#68190, Ilya Dryomov)
qa/workunits: Add updated kernel archive URL (pr#68169, Brad Hubbard)
qa: add 'refresh' config to cephadm.wait_for_service (pr#67038, Vallari Agrawal)
qa: add MDS_INSUFFICIENT_STANDBY to ignorelist (pr#69036, Patrick Donnelly)
qa: Add nvmeof upgrade from v20.2.0 (pr#68149, Vallari Agrawal)
qa: allow multiple mgr sessions during eviction test (pr#68316, Patrick Donnelly)
qa: cephfs suite changes for rocky (pr#68374, Patrick Donnelly)
qa: Fix coredumps caused by udisks (pr#67526, Vallari Agrawal)
qa: Fix nvmeof 'errors during thrashing' (pr#68148, Vallari Agrawal)
qa: fix setting rbd_sparse_read_threshold_bytes in test_migration_clone() (pr#68617, Ilya Dryomov)
qa: fix TypeError in delay (pr#67617, Jos Collin)
qa: fixing cephadm mgmt-gateway test to remove openssl dependency (pr#67820, Redouane Kachach)
qa: ignore cephadm failed daemon warnings during thrashing (pr#69309, Patrick Donnelly)
qa: ignore POOL_FULL for rbd tests exercising full pools (pr#69304, Patrick Donnelly)
qa: install nvme-cli only if distro remains rocky10 (pr#69252, Patrick Donnelly)
qa: krbd_rxbounce.sh: do more reads to generate more errors (pr#67455, Ilya Dryomov)
qa: Leak_StillReachable RocksDB error_handler (pr#68524, Nitzan Mordechai)
qa: rbd_mirror_fsx_compare.sh doesn't error out as expected (pr#67797, Ilya Dryomov)
qa: Remove cephadm e2e tests from teuthology (pr#68818, Afreen Misbah)
qa: resolve py3.12 regression for random.sample (pr#68315, Patrick Donnelly)
qa: suppress false positive delete map mismatch errors (pr#68431, Casey Bodley, Nitzan Mordechai)
qa: suppress MismatchedFree operator delete RocksDB (pr#67508, Nitzan Mordechai)
rgw/beast: use strand executor for timeout timer to prevent concurrent socket access (pr#68506, Oguzhan Ozmen)
rgw/lc: Do not delete DM if its at end of pagination list (pr#67573, kchheda3)
rgw/multisite: check the local bucket's versioning status when replicating deletion from remote (pr#66168, Jane Zhu)
RGW/multisite: fix bucket-full-sync infinite loop caused by stale bucket_list_result reuse (pr#67923, Oguzhan Ozmen)
RGW/Multisite: fix uninitialized LatencyMonitor causing spurious "OSD cluster is overloaded" warning (pr#68803, Oguzhan Ozmen)
rgw/s3: Always include x-amz-content-sha256 header in AWS v4 signatures (pr#66358, Shilpa Jagannath, Matthew N. Heler)
rgw/tests: add os-specific java 1.7 install commands to keycloak task (pr#67982, J. Eric Ivancich)
rgw/website: preserve nameservers for future use in dnsmasq (pr#67061, Kyr Shatskyy)
rgw/zone: remove duplicated startup logic in RGWSI_Zone (pr#66300, Casey Bodley)
rgw: bucket logging fixes (pr#66769, Nithya Balachandran, N Balachandran, Yuval Lifshitz, Casey Bodley)
RGW: Change prerequest hook to run after authorization process (pr#68594, Emin Sunacoglu)
rgw: discard olh\_ attributes when copying object from a versioning-suspended bucket to a versioning-disabled bucket (pr#65557, Jane Zhu)
rgw: fix 'bucket stats' when bucket index doesn't exist (pr#68505, Casey Bodley)
rgw: fix lifecycle transition of encrypted multipart objects (pr#68826, Marcus Watts)
rgw: handle plain-text object tags in RGWObjTags::decode() (pr#67927, Oguzhan Ozmen)
rgw: java s3-tests change setting of JAVA_HOME (pr#68226, J. Eric Ivancich)
rgw: read_obj_policy() consults s3:prefix when deciding between 403/404 (pr#68651, Casey Bodley)
RGW: remove custom copy constructor for RGWObjectCtx and enforce no copy/move (pr#67440, Oguzhan Ozmen)
src/ceph-volume: fast device unavailable as error (pr#67916, Timothy Q Nguyen)
test/rgw/kafka: fix kafka relase to more recent one (pr#67993, Yuval Lifshitz)
test/rgw/lua: ignore hours for zero mtime (pr#67468, Kyr Shatskyy)
test/rgw/notification: do not use netstat in the code (pr#68142, Yuval Lifshitz)
test/rgw/notification: fix the cloudevents package version (pr#68704, Yuval Lifshitz, Adam C. Emerson)
test/rgw: remove depracated boto dependency (pr#68344, Yuval Lifshitz)
test: use json_extract instead of awkward json_tree (pr#67321, Patrick Donnelly)
This change introduces the shared memory communication (SMC-D) for the cluster network (pr#68254, Aliaksei Makarau)
tools/ceph-kvstore-tool: fix crash on db close (pr#68406, Igor Fedotov, Max Kellermann)
upgrade suites update for Rocky10 and missing centos (pr#68733, Nitzan Mordechai)