From f09d3a771ca657fe948f4d1938e79e17a66172aa Mon Sep 17 00:00:00 2001 From: Aishwarya Mathuria Date: Fri, 20 Jun 2025 12:12:46 +0530 Subject: [PATCH] crimson/test_messenger: remove usage of deprecated function at_exit() at_exit() is now deprecated, in place of that we will explicitly call stop() for the sharded objects. Signed-off-by: Aishwarya Mathuria --- src/test/crimson/test_messenger.cc | 47 +++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/test/crimson/test_messenger.cc b/src/test/crimson/test_messenger.cc index dc23447a7fff8..26ef4567a8a84 100644 --- a/src/test/crimson/test_messenger.cc +++ b/src/test/crimson/test_messenger.cc @@ -54,19 +54,34 @@ static entity_addr_t get_server_addr() { return saddr; } +/* + * at_exit() is now deprecated, and Seastar recommends using deferred_stop() + * as an alternative for object cleanup. + * + * However, in our use case, deferred_stop() is not a suitable replacement + * due to differences in how it manages object lifetimes. + * + * Previously, at_exit() captured the sharded_obj and kept it alive until shutdown. + * In contrast, deferred_stop() does not retain ownership and assumes the referenced + * object remains valid for the lifetime of the deferred_stop instance. + * + * To address this, we introduced a static list to retain each sharded_obj + * created via create_sharded(). + */ + +template +static std::list>> sharded_objects; + template seastar::future create_sharded(Args... args) { // we should only construct/stop shards on #0 - return seastar::smp::submit_to(0, [=] { + return seastar::smp::submit_to(0, [=]() -> seastar::future*> { auto sharded_obj = seastar::make_lw_shared>(); - return sharded_obj->start(args... - ).then([sharded_obj] { - seastar::engine().at_exit([sharded_obj] { - return sharded_obj->stop().then([sharded_obj] {}); - }); + sharded_objects.push_back(sharded_obj); + return sharded_obj->start(args...).then([sharded_obj] { return sharded_obj.get(); }); - }).then([](seastar::sharded *ptr_shard) { + }).then([](seastar::sharded* ptr_shard) { return &ptr_shard->local(); }); } @@ -390,6 +405,15 @@ static seastar::future<> test_echo(unsigned rounds, }).handle_exception([](auto eptr) { logger().error("test_echo() failed: got exception {}", eptr); throw; + }).then([] { + return seastar::smp::submit_to(0, [] { + return seastar::do_for_each(sharded_objects, + [](auto& sharded_obj) { + return sharded_obj->stop(); + }); + }).then([] { + sharded_objects.clear(); + }); }).finally([gates, server1, server2] { return gates->close(); }); @@ -3832,6 +3856,15 @@ seastar::future do_test(seastar::app_template& app) // which will result in memory leak and thus fail LeakSanitizer. return seastar::sleep(100ms); }); + }).then([] { + return seastar::smp::submit_to(0, [] { + return seastar::do_for_each(sharded_objects, + [](auto& sharded_obj) { + return sharded_obj->stop(); + }); + }).then([] { + sharded_objects.clear(); + }); }).then([] { return crimson::common::sharded_conf().stop(); }).then([] { -- 2.39.5