diff --git a/src/v/cluster/data_migration_frontend.cc b/src/v/cluster/data_migration_frontend.cc index 99c068a976928..75c1c9bab12f1 100644 --- a/src/v/cluster/data_migration_frontend.cc +++ b/src/v/cluster/data_migration_frontend.cc @@ -32,6 +32,8 @@ #include +#include + namespace cluster::data_migrations { frontend::frontend( @@ -313,8 +315,19 @@ ss::future> frontend::do_create_migration(data_migration migration) { co_return result(id); } -ss::future> frontend::list_migrations() { - return _table.invoke_on_instance(&migrations_table::list_migrations); +ss::future>> +frontend::list_migrations() { + try { + co_return co_await _table.invoke_on_instance( + &migrations_table::list_migrations); + } catch (...) { + auto eptr = std::current_exception(); + if (ssx::is_shutdown_exception(eptr)) { + co_return cluster::errc::shutting_down; + } + vlog(dm_log.error, "unexpected exception on list_migrations {}", eptr); + throw; + } } ss::future> diff --git a/src/v/cluster/data_migration_frontend.h b/src/v/cluster/data_migration_frontend.h index 0065e15004d5d..d8a606608986f 100644 --- a/src/v/cluster/data_migration_frontend.h +++ b/src/v/cluster/data_migration_frontend.h @@ -58,7 +58,7 @@ class frontend : public ss::peering_sharded_service { model::node_id node, check_ntp_states_request&& req); ss::future> get_migration(id); - ss::future> list_migrations(); + ss::future>> list_migrations(); using list_mountable_topics_result = result>; diff --git a/src/v/redpanda/admin/migrations.cc b/src/v/redpanda/admin/migrations.cc index a5182ee787fc4..488dffa6b1caa 100644 --- a/src/v/redpanda/admin/migrations.cc +++ b/src/v/redpanda/admin/migrations.cc @@ -385,9 +385,15 @@ void admin_server::register_data_migration_routes() { } ss::future> admin_server::list_data_migrations( - std::unique_ptr, std::unique_ptr reply) { + std::unique_ptr req, + std::unique_ptr reply) { auto& frontend = _controller->get_data_migration_frontend(); - auto migrations = co_await frontend.local().list_migrations(); + auto maybe_migrations = co_await frontend.local().list_migrations(); + if (maybe_migrations.has_error()) { + co_await admin_server::throw_on_error( + *req, maybe_migrations.assume_error(), model::controller_ntp); + } + auto& migrations = maybe_migrations.assume_value(); json::StringBuffer buf; json::Writer writer(buf); writer.StartArray();