librbd: propagate ENOENT for non-existent groups and images
Calling `list_images()` on a non-existent group falsely succeeded and
returned an empty iterator.This happened because `Group<I>::image_list`
ignored the negative error code returned by `group_image_list`, allowing
execution to proceed blindly. Furthermore, the C API `rbd_group_image_list`
intercepted `-ENOENT` and forced a success (0) return value.
Similarly other public C APIs `rbd_snap_list` and `rbd_group_snap_list`
also intercepts -ENOENT and forces a success (0) return value which
is incorrect.
Fix these behavior by:
- Propagating errors properly inside `Group<I>::image_list`.
- Removing the incorrect `-ENOENT` masking in `rbd_group_image_list`,
`rbd_snap_list`, rbd_group_snap_list`
Now `list_images()` consistently raise an `ObjectNotFound` error when
invoked on a non-existent group and public C APIs propagate ENOENT
without masking it into 0.
Also Extended the `TestGroups` test fixture with `self.dne_group` to
validate the expected error paths across all relevant APIs.
Patrick Donnelly [Tue, 28 Jul 2026 12:40:32 +0000 (08:40 -0400)]
Merge PR #70574 into main
* refs/pull/70574/head:
.github/workflows: bump checkout action version
.github/workflows/qa-symlink: sparse checkout verify-qa
.github/workflows/qa-symlink: run only for active branches
Reviewed-by: Joseph Mundackal <jmundackal@bloomberg.net>
Kefu Chai [Fri, 26 Jun 2026 11:35:15 +0000 (19:35 +0800)]
crimson: migrate off deprecated seastar::smp::count and all_cpus()
The updated seastar deprecates the global smp::count and smp::all_cpus() in
favour of the per-instance smp::shard_count() and smp::all_shards(). Under the
CI -Werror build these deprecation warnings are fatal.
Replace the uses with the reactor-local free functions
seastar::this_smp_shard_count() and seastar::this_smp_all_shards(), which read
the current smp instance's shard count and shard-id range. crimson runs a
single smp instance and every migrated site executes on a reactor thread (the
alienstore worker threads do not touch these), so the behaviour is unchanged.
Kefu Chai [Fri, 26 Jun 2026 07:56:35 +0000 (15:56 +0800)]
crimson: use the seastar span sink API and build at API level 10
At SEASTAR_API_LEVEL >= 9 seastar dropped output_stream::write(net::packet) in
favour of write(std::span<temporary_buffer<char>>). Convert Socket's writes to
the span form, writing the packet's released fragments and keeping them alive
across the write with do_with, then raise Seastar_API_LEVEL from 6 to 10 to
match the updated seastar. The span write overloads are unconditional, so the
Socket change is valid at every API level.
Kefu Chai [Fri, 26 Jun 2026 07:56:35 +0000 (15:56 +0800)]
crimson: bump seastar submodule and adapt to its new future API
Update src/seastar to ceph-umbrella-25.05.0-1074-gcced0236, which is
scylladb/seastar master (fd71a5b4c7) with the ceph patches reapplied,
and adapt crimson to the future API changes the bump brings in:
- interruptible_future.h: seastar split its single ready_future_marker into
set_ready_future_marker and set_from_tuple_ready_future_marker; route
futurize::from_tuple through the matching markers.
- thread_pool.h: future_state::set() is now templated and get_value() is
ref-qualified; pass seastar::internal::monostate{} for the void case and
move the state before reading its value.
These crimson changes need the new seastar, so they share one commit with the
submodule bump. The build stays at Seastar_API_LEVEL 6 here; the level is
raised in the following commit.
Ville Ojamo [Thu, 23 Jul 2026 07:18:30 +0000 (14:18 +0700)]
doc: standardize capitalization of NGINX following the vendor
The vendor stylizes it as NGINX.
Previously docs capitalized it as either NGINX, Nginx or nginx. nginx
was the preferred capitalization before commercialization of the
software.
Signed-off-by: Ville Ojamo <git2233+ceph@ojamo.eu>
Matty Williams [Thu, 11 Jun 2026 10:59:48 +0000 (11:59 +0100)]
test: Add TruncateWrite ops to IO Sequencer and Sequences using them
current io exerciser sequences can model standalone truncates and writes,
but cannot generate a single transaction that truncates an object and
then writes sparse regions. Add SingleTruncateWriteOp, DoubleTruncateWriteOp,
and TripleTruncateWriteOp, wire them through IoSequence, ObjectModel, and
RadosIo, and extend EC sequences/tests so truncate+write transactions can
be reproduced and validated.
Signed-off-by: Matty Williams <Matty.Williams@ibm.com> Assisted-by: IBM Bob:Claude/GPT
src/crimson/osd: statically link the ISA plugin in crimson-osd
Problem:
Before this change, when the ISA plugin (classic build, dlopen'd),
would try to log, it'd segfault due to null g_ceph_context.
We need a way to make logging work for EC plugins in crimson.
Solution:
By building the ISA plugin WITH_CRIMSON, its logging is
routed to seastar's logger, solving the issue.
It is not build separately and dlopen'd like in classic because
doing so would require the plugin to have its own seastar logger
copy, an undesirable outcome.
It is a statically built library in the crimson-osd binary, and thus
it shares the single seastar logger. The library is linked with
--whole-archive so the self-registration constructor is not dropped.
src/erasure-code: support statically-linked (built-in) plugins
This commit adds the functionality in EC plugin registry to support
built in (statically linked) plugins. This is done by 2 main changes:
1. introducing a new map, builtin_plugins, where plugins can register
a factory for itself at startup.
2. load() now first checks if the plugin is builtin and instantiates it,
otherwise it falls back to dynamically linking the plugin.
src/pybind: fixing the test_invalid_client_id failure
The test_invalid_client_id was failing due to the
incorrect returns by handle_command and in get_perf_data()
in mgr/ststs/fs/perf_stats.py Introduced-by: f8f972182cb1499e0b7686012b0a854f5e76918b
Fixes:https://tracker.ceph.com/issues/76162 Signed-off-by: Neeraj Pratap Singh <Neeraj.Pratap.Singh1@ibm.com>
qa/tests: drop parens from all health-code ignorelist entries
Monitor.cc logs a "Health check cleared: <CODE> (was: ...)" line
for any health check clearing mid-test, with the code bare (no
parens) -- while the "Health check failed"/"Health check failed
(unmute)" lines wrap the code in parens. Every \(CODE\) entry in
this file therefore only matches the raise/failed form and misses
the corresponding cleared form, the same gap just fixed for
POOL_FULL.
Drop the escaped parens from the remaining entries so each matches
both log forms, consistent with the bare entries already present
(OSD_ROOT_DOWN, MDS_INSUFFICIENT_STANDBY, POOL_FULL).
crimson/os/seastore/omap_manager: predict append (not overwrite) on initial_pending
An initial_pending LogNode always append_kv()s and never overwrites.
expect_overflow() was still called with can_ow=true whenever the tail entry is
_fastinfo. It then used only the overwrite gap while the append
itself consumed a full entryi - so the node rolled over far too late and
used_space() overran capacity().
This would result in `assert(capacity() >= used_space()`.
Gate can_ow on !is_initial_pending() so the append is predicted with the full
entry size and rolls over in time.
crimson/os/seastore/omap_manager: calculate the overwrite growth (gap)
The previous implementation computed ow_gap_from_last_entry() but never used
the result.
Use it to check only the additional space required when the tail
entry grows, which matches overwrite logic.
Note, this is a cleanup - behavior remains similar.