diff --git a/src/lib/c_wrapper.cpp b/src/lib/c_wrapper.cpp index 1074843a97d52ad4cab2aedd280ac8bfe6819cb5..e383a86e47de1f32794d4d3102492da6b98c4cf1 100644 --- a/src/lib/c_wrapper.cpp +++ b/src/lib/c_wrapper.cpp @@ -161,6 +161,14 @@ ADM_deploy_adhoc_storage(ADM_server_t server, srv, scord::adhoc_storage{adhoc_storage}); } +ADM_return_t +ADM_tear_down_adhoc_storage(ADM_server_t server, + ADM_adhoc_storage_t adhoc_storage) { + + return scord::detail::tear_down_adhoc_storage( + scord::server{server}, scord::adhoc_storage{adhoc_storage}); +} + ADM_return_t ADM_register_pfs_storage(ADM_server_t server, const char* name, ADM_pfs_storage_type_t type, ADM_pfs_context_t ctx, diff --git a/src/lib/detail/impl.cpp b/src/lib/detail/impl.cpp index 6f3bc40d82e359ebc7cc73e8c4153d92885ebf56..ec28bcb799929b100b8e22d959948da019917fb5 100644 --- a/src/lib/detail/impl.cpp +++ b/src/lib/detail/impl.cpp @@ -479,6 +479,43 @@ deploy_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage) { return scord::error_code::other; } +scord::error_code +tear_down_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage) { + + scord::network::client rpc_client{srv.protocol()}; + + const auto rpc_id = ::api::remote_procedure::new_id(); + + if(const auto lookup_rv = rpc_client.lookup(srv.address()); + lookup_rv.has_value()) { + const auto& endp = lookup_rv.value(); + + LOGGER_INFO("rpc id: {} name: {} from: {} => " + "body: {{adhoc_id: {}}}", + rpc_id, std::quoted("ADM_"s + __FUNCTION__), + std::quoted(rpc_client.self_address()), adhoc_storage.id()); + + if(const auto call_rv = + endp.call("ADM_"s + __FUNCTION__, adhoc_storage.id()); + call_rv.has_value()) { + + const scord::network::generic_response resp{call_rv.value()}; + + LOGGER_EVAL(resp.error_code(), INFO, ERROR, + "rpc id: {} name: {} from: {} <= " + "body: {{retval: {}}} [op_id: {}]", + rpc_id, std::quoted("ADM_"s + __FUNCTION__), + std::quoted(endp.address()), resp.error_code(), + resp.op_id()); + + return resp.error_code(); + } + } + + LOGGER_ERROR("rpc call failed"); + return scord::error_code::other; +} + tl::expected<transfer, error_code> transfer_datasets(const server& srv, const job& job, const std::vector<dataset>& sources, diff --git a/src/lib/detail/impl.hpp b/src/lib/detail/impl.hpp index 40bb30c9132521941f7cec8b19f180a1db53a805..d87539086ac90ef9a2f4fa15948fdf9bfd2c5297 100644 --- a/src/lib/detail/impl.hpp +++ b/src/lib/detail/impl.hpp @@ -62,6 +62,9 @@ remove_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage); scord::error_code deploy_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage); +scord::error_code +tear_down_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage); + tl::expected<scord::pfs_storage, scord::error_code> register_pfs_storage(const server& srv, const std::string& name, enum pfs_storage::type type, const pfs_storage::ctx& ctx); diff --git a/src/lib/libscord.cpp b/src/lib/libscord.cpp index cbe3b47c37195774ca3bbe2c88132c66d27f42c8..a73c7738fdd19cc7211b16c8660fcb6638e07ec9 100644 --- a/src/lib/libscord.cpp +++ b/src/lib/libscord.cpp @@ -299,6 +299,17 @@ deploy_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage) { } } +void +tear_down_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage) { + + const auto ec = detail::tear_down_adhoc_storage(srv, adhoc_storage); + + if(!ec) { + throw std::runtime_error(fmt::format( + "ADM_deploy_adhoc_storage() error: {}", ec.message())); + } +} + scord::pfs_storage register_pfs_storage(const server& srv, const std::string& name, enum pfs_storage::type type, const pfs_storage::ctx& ctx) { diff --git a/src/lib/scord/scord.h b/src/lib/scord/scord.h index 1693a3ba5a2c20112add750d5d1728812cca3e61..4733624aab84c149ec7e32db369b165241b59418 100644 --- a/src/lib/scord/scord.h +++ b/src/lib/scord/scord.h @@ -158,6 +158,18 @@ ADM_return_t ADM_deploy_adhoc_storage(ADM_server_t server, ADM_adhoc_storage_t adhoc_storage); +/** + * Tear down a previously deployed adhoc storage system instance + * + * @param[in] server The server to which the request is directed + * @param[in] adhoc_storage An ADM_STORAGE referring to the adhoc storage + * instance of interest. + * @return Returns ADM_SUCCESS if the remote procedure has completed + */ +ADM_return_t +ADM_tear_down_adhoc_storage(ADM_server_t server, + ADM_adhoc_storage_t adhoc_storage); + /** * Register a PFS storage tier. * diff --git a/src/lib/scord/scord.hpp b/src/lib/scord/scord.hpp index 1a9a5c560b18a6df818a26b69f6b261ef48cee3b..1325b5c617b95919e608864d1ce9d6c73d498a66 100644 --- a/src/lib/scord/scord.hpp +++ b/src/lib/scord/scord.hpp @@ -73,6 +73,9 @@ remove_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage); void deploy_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage); +void +tear_down_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage); + scord::pfs_storage register_pfs_storage(const server& srv, const std::string& name, enum scord::pfs_storage::type type, diff --git a/src/scord/rpc_handlers.cpp b/src/scord/rpc_handlers.cpp index 9c4045bc00bd88af52cf23c50cb377bc41747285..329f4c716b9eaeb6ce9e932257e1f0ea4601432d 100644 --- a/src/scord/rpc_handlers.cpp +++ b/src/scord/rpc_handlers.cpp @@ -401,6 +401,32 @@ deploy_adhoc_storage(const request& req, std::uint64_t adhoc_id) { req.respond(resp); } +void +tear_down_adhoc_storage(const request& req, std::uint64_t adhoc_id) { + + using scord::network::generic_response; + using scord::network::get_address; + + const auto rpc_name = "ADM_"s + __FUNCTION__; + const auto rpc_id = remote_procedure::new_id(); + + LOGGER_INFO("rpc id: {} name: {} from: {} => " + "body: {{adhoc_id: {}}}", + rpc_id, std::quoted(rpc_name), std::quoted(get_address(req)), + adhoc_id); + + // TODO: actually tear down the adhoc storage instance + + const auto resp = generic_response{rpc_id, scord::error_code::success}; + + LOGGER_INFO("rpc id: {} name: {} to: {} <= " + "body: {{retval: {}}}", + rpc_id, std::quoted(rpc_name), std::quoted(get_address(req)), + scord::error_code::success); + + req.respond(resp); +} + void register_pfs_storage(const request& req, const std::string& name, enum scord::pfs_storage::type type, diff --git a/src/scord/rpc_handlers.hpp b/src/scord/rpc_handlers.hpp index c0bc39638518673053a2ed16633b4b461e3c827b..1ccc493dcfd43be900b74a4f70e13fed7b41509d 100644 --- a/src/scord/rpc_handlers.hpp +++ b/src/scord/rpc_handlers.hpp @@ -62,6 +62,9 @@ remove_adhoc_storage(const request& req, std::uint64_t adhoc_id); void deploy_adhoc_storage(const request& req, std::uint64_t adhoc_id); +void +tear_down_adhoc_storage(const request& req, std::uint64_t adhoc_id); + void register_pfs_storage(const request& req, const std::string& name, enum scord::pfs_storage::type type, diff --git a/src/scord/scord.cpp b/src/scord/scord.cpp index 3615a8bfeb16647eb5add0acbd15cb28faf8863d..bdace7a7180bcd592f61174b258376700251795f 100644 --- a/src/scord/scord.cpp +++ b/src/scord/scord.cpp @@ -192,6 +192,7 @@ main(int argc, char* argv[]) { daemon.set_handler(EXPAND(update_adhoc_storage)); daemon.set_handler(EXPAND(remove_adhoc_storage)); daemon.set_handler(EXPAND(deploy_adhoc_storage)); + daemon.set_handler(EXPAND(tear_down_adhoc_storage)); daemon.set_handler(EXPAND(register_pfs_storage)); daemon.set_handler(EXPAND(update_pfs_storage)); daemon.set_handler(EXPAND(remove_pfs_storage));