From 7bb4a76a81ecb09024c079391738dee7726860f8 Mon Sep 17 00:00:00 2001 From: Oguzhan Ozmen Date: Tue, 12 May 2026 19:43:13 +0000 Subject: [PATCH] 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 --- src/neorados/cls/log.h | 4 ++-- src/test/cls_log/test_neocls_log.cc | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/neorados/cls/log.h b/src/neorados/cls/log.h index 7c3714e616a..d9927892285 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 a871c34a341..7cb58a06ee3 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) { -- 2.47.3