]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
neocls log trimming (time based): fix infinite loop on ENODATA
authorOguzhan Ozmen <oozmen@bloomberg.net>
Tue, 12 May 2026 19:43:13 +0000 (19:43 +0000)
committerOguzhan Ozmen <oozmen@bloomberg.net>
Tue, 19 May 2026 23:51:16 +0000 (23:51 +0000)
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 <oozmen@bloomberg.net>
src/neorados/cls/log.h
src/test/cls_log/test_neocls_log.cc

index 7c3714e616a03dbd86773393f14640525c7ec791..d9927892285df8fafa9794bd28c444e3c1ee49b9 100644 (file)
@@ -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
index a871c34a341ab96eee82a737a81edab6b8b19cca..7cb58a06ee3d5acc0171da7ee89ad891d96b7168 100644 (file)
@@ -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<l::entry> entries{neorados::cls::log::max_list_entries};
+  std::span<l::entry> 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)
 {