From: Oguzhan Ozmen Date: Tue, 12 May 2026 19:43:13 +0000 (+0000) Subject: neocls log trimming (time based): fix infinite loop on ENODATA X-Git-Tag: v21.0.1~141^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7bb4a76a81ecb09024c079391738dee7726860f8;p=ceph.git neocls log trimming (time based): fix infinite loop on ENODATA This is essentially the same as previous commit. The time-based use_awaitable_t overload of trim() has the same issue as the marker-based overload: the try-catch for ENODATA is inside the for(;;) loop, so ENODATA is caught and swallowed, causing the loop to retry forever. Fixes: https://tracker.ceph.com/issues/76563 Signed-off-by: Oguzhan Ozmen --- diff --git a/src/neorados/cls/log.h b/src/neorados/cls/log.h index 7c3714e616a0..d9927892285d 100644 --- a/src/neorados/cls/log.h +++ b/src/neorados/cls/log.h @@ -494,10 +494,10 @@ trim(RADOS& r, Object oid, IOContext ioc, ua); } catch (const system_error& e) { if (e.code() != no_message_available) { - co_return e.code(); + throw; } + co_return; } - co_return error_code{}; } /// \brief List log entries diff --git a/src/test/cls_log/test_neocls_log.cc b/src/test/cls_log/test_neocls_log.cc index a871c34a341a..7cb58a06ee3d 100644 --- a/src/test/cls_log/test_neocls_log.cc +++ b/src/test/cls_log/test_neocls_log.cc @@ -512,6 +512,32 @@ CORO_TEST_F(neocls_log, trim_loop_empty_log_by_marker, NeoRadosTest) } +CORO_TEST_F(neocls_log, trim_loop_all_entries_by_time, NeoRadosTest) +{ + co_await create_obj(oid); + auto start_time = real_clock::now(); + co_await generate_log(rados(), oid, pool(), 10, start_time, true, + asio::use_awaitable); + + auto end_time = start_time + 100s; + co_await neorados::cls::log::trim( + rados(), oid, pool(), real_time{}, end_time, asio::use_awaitable); + + std::vector entries{neorados::cls::log::max_list_entries}; + std::span result; + co_await list(rados(), oid, pool(), entries, &result, asio::use_awaitable); + EXPECT_EQ(0u, result.size()); +} + +CORO_TEST_F(neocls_log, trim_loop_empty_log_by_time, NeoRadosTest) +{ + co_await create_obj(oid); + + auto end_time = real_clock::now() + 100s; + co_await neorados::cls::log::trim( + rados(), oid, pool(), real_time{}, end_time, asio::use_awaitable); +} + #if 0 // Disable until we get rid of GCC11 TEST(neocls_log_bare, lambdata) {