diff --git a/src/lib/detail/impl.cpp b/src/lib/detail/impl.cpp index db85beaca63e50cc760b0bc00c4ce1ddaee5da7f..1da6b6a0d6d9bfa97b5e7b73a725d45221a9c311 100644 --- a/src/lib/detail/impl.cpp +++ b/src/lib/detail/impl.cpp @@ -239,7 +239,8 @@ register_adhoc_storage(const server& srv, const std::string& name, return tl::make_unexpected(ec); } - return scord::adhoc_storage{type, name, resp.value(), ctx}; + return scord::adhoc_storage{type, name, resp.value(), ctx, + resources}; } } diff --git a/src/lib/scord/types.h b/src/lib/scord/types.h index 8b2d939d24f0bde0db3b2b90f576fb65193009b8..f1f24923d809f780fdec61dce2839f3b028db3af 100644 --- a/src/lib/scord/types.h +++ b/src/lib/scord/types.h @@ -429,11 +429,13 @@ ADM_dataset_list_destroy(ADM_dataset_list_t list); * @param[in] adhoc_ctx Some specific context information for the storage * tier or NULL if none is required. For instance, an adhoc storage system may * find it useful to provide an ADM_adhoc_context_t describing the instance. + * @param[in] adhoc_resources The adhoc resources for this instance. * @return A valid ADM_ADHOC_STORAGE if successful, or NULL in case of failure. */ ADM_adhoc_storage_t ADM_adhoc_storage_create(const char* name, ADM_adhoc_storage_type_t type, - uint64_t id, ADM_adhoc_context_t adhoc_ctx); + uint64_t id, ADM_adhoc_context_t adhoc_ctx, + ADM_adhoc_resources_t adhoc_resources); /** * Destroy an ADM_ADHOC_STORAGE created by ADM_adhoc_storage_destroy(). diff --git a/src/lib/scord/types.hpp b/src/lib/scord/types.hpp index 775d2ad272f176e5a8cb1eaeaae6b450f0d1577c..12722a39b236dc38119a590b7af9c56d9947a08a 100644 --- a/src/lib/scord/types.hpp +++ b/src/lib/scord/types.hpp @@ -255,7 +255,8 @@ struct adhoc_storage { explicit adhoc_storage(ADM_adhoc_storage_t storage); explicit operator ADM_adhoc_storage_t() const; adhoc_storage(enum adhoc_storage::type type, std::string name, - std::uint64_t id, const scord::adhoc_storage::ctx& ctx); + std::uint64_t id, const scord::adhoc_storage::ctx& ctx, + adhoc_storage::resources resources); adhoc_storage(const adhoc_storage& other) noexcept; adhoc_storage(adhoc_storage&&) noexcept; @@ -274,6 +275,9 @@ struct adhoc_storage { adhoc_storage::ctx context() const; + adhoc_storage::resources + get_resources() const; + void update(scord::adhoc_storage::ctx new_ctx); diff --git a/src/lib/types.c b/src/lib/types.c index a3f560ea54879036491cab8b6f4ab1d341a5f9ab..0a44d15f7034a397d93e263c26faf5e53b1d05f7 100644 --- a/src/lib/types.c +++ b/src/lib/types.c @@ -430,7 +430,8 @@ ADM_dataset_list_destroy(ADM_dataset_list_t list) { ADM_adhoc_storage_t ADM_adhoc_storage_create(const char* name, ADM_adhoc_storage_type_t type, - uint64_t id, ADM_adhoc_context_t adhoc_ctx) { + uint64_t id, ADM_adhoc_context_t adhoc_ctx, + ADM_adhoc_resources_t adhoc_resources) { struct adm_adhoc_storage* adm_adhoc_storage = (struct adm_adhoc_storage*) malloc(sizeof(*adm_adhoc_storage)); @@ -466,6 +467,8 @@ ADM_adhoc_storage_create(const char* name, ADM_adhoc_storage_type_t type, memcpy(adm_adhoc_storage->s_adhoc_ctx, adhoc_ctx, sizeof(*adhoc_ctx)); + adm_adhoc_storage->s_resources = adhoc_resources; + return adm_adhoc_storage; cleanup_on_error: @@ -824,7 +827,7 @@ ADM_job_requirements_create(ADM_dataset_t inputs[], size_t inputs_len, adm_job_reqs->r_adhoc_storage = ADM_adhoc_storage_create( adhoc_storage->s_name, adhoc_storage->s_type, adhoc_storage->s_id, - adhoc_storage->s_adhoc_ctx); + adhoc_storage->s_adhoc_ctx, adhoc_storage->s_resources); return adm_job_reqs; diff --git a/src/lib/types.cpp b/src/lib/types.cpp index 4b7c2b0c0d50eb51c513c61c5ece6f3cf1ad25c9..023ff07520f7bb0d70ca72b15eac09ce9b709be3 100644 --- a/src/lib/types.cpp +++ b/src/lib/types.cpp @@ -585,9 +585,10 @@ class adhoc_storage::impl { public: impl() = default; explicit impl(enum adhoc_storage::type type, std::string name, - std::uint64_t id, adhoc_storage::ctx ctx) + std::uint64_t id, adhoc_storage::ctx ctx, + struct adhoc_storage::resources resources) : m_type(type), m_name(std::move(name)), m_id(id), - m_ctx(std::move(ctx)) {} + m_ctx(std::move(ctx)), m_resources(std::move(resources)) {} impl(const impl& rhs) = default; impl(impl&& rhs) = default; impl& @@ -616,6 +617,11 @@ public: return m_ctx; } + struct adhoc_storage::resources + resources() const { + return m_resources; + }; + void update(adhoc_storage::ctx new_ctx) { m_ctx = std::move(new_ctx); @@ -645,6 +651,7 @@ private: std::string m_name; std::uint64_t m_id; adhoc_storage::ctx m_ctx; + struct adhoc_storage::resources m_resources; }; adhoc_storage::adhoc_storage() = default; @@ -652,29 +659,32 @@ adhoc_storage::adhoc_storage() = default; adhoc_storage::adhoc_storage(enum adhoc_storage::type type, std::string name, std::uint64_t id, execution_mode exec_mode, access_type access_type, - adhoc_storage::resources res, + struct adhoc_storage::resources res, std::uint32_t walltime, bool should_flush) - : m_pimpl(std::make_unique<impl>( - type, std::move(name), id, - adhoc_storage::ctx{exec_mode, access_type, std::move(res), - walltime, should_flush})) {} + : m_pimpl(std::make_unique<impl>(type, std::move(name), id, + adhoc_storage::ctx{exec_mode, access_type, + walltime, should_flush}, + std::move(res))) {} adhoc_storage::adhoc_storage(ADM_adhoc_storage_t st) : m_pimpl(std::make_unique<impl>( static_cast<enum adhoc_storage::type>(st->s_type), st->s_name, - st->s_id, adhoc_storage::ctx{st->s_adhoc_ctx})) {} + st->s_id, adhoc_storage::ctx{st->s_adhoc_ctx}, + adhoc_storage::resources{st->s_resources})) {} adhoc_storage::operator ADM_adhoc_storage_t() const { return ADM_adhoc_storage_create( m_pimpl->name().c_str(), static_cast<ADM_adhoc_storage_type_t>(m_pimpl->type()), - m_pimpl->id(), - static_cast<ADM_adhoc_context_t>(m_pimpl->context())); + m_pimpl->id(), static_cast<ADM_adhoc_context_t>(m_pimpl->context()), + static_cast<ADM_adhoc_resources_t>(m_pimpl->resources())); } adhoc_storage::adhoc_storage(enum adhoc_storage::type type, std::string name, - std::uint64_t id, const adhoc_storage::ctx& ctx) - : m_pimpl(std::make_unique<impl>(type, std::move(name), id, ctx)) {} + std::uint64_t id, const adhoc_storage::ctx& ctx, + adhoc_storage::resources resources) + : m_pimpl(std::make_unique<impl>(type, std::move(name), id, ctx, + std::move(resources))) {} adhoc_storage::adhoc_storage(const adhoc_storage& other) noexcept : m_pimpl(std::make_unique<impl>(*other.m_pimpl)) {} @@ -710,6 +720,11 @@ adhoc_storage::context() const { return m_pimpl->context(); } +adhoc_storage::resources +adhoc_storage::get_resources() const { + return m_pimpl->resources(); +} + void adhoc_storage::update(scord::adhoc_storage::ctx new_ctx) { return m_pimpl->update(std::move(new_ctx)); diff --git a/src/lib/types_private.h b/src/lib/types_private.h index b90a7fc118dad09563dc26008da2b3464ef915f1..db44caf5dd896f24341082fffeddcb6814cf5d60 100644 --- a/src/lib/types_private.h +++ b/src/lib/types_private.h @@ -95,6 +95,8 @@ struct adm_adhoc_storage { ADM_adhoc_storage_type_t s_type; uint64_t s_id; ADM_adhoc_context_t s_adhoc_ctx; + /** The resources assigned for the adhoc storage system */ + ADM_adhoc_resources_t s_resources; }; struct adm_pfs_storage { diff --git a/src/scord/adhoc_storage_manager.hpp b/src/scord/adhoc_storage_manager.hpp index c0d6d051ebafbc374bec87634b0cb2b296d69358..eeb7b88ac43471b283c170e926676cc696bc8378 100644 --- a/src/scord/adhoc_storage_manager.hpp +++ b/src/scord/adhoc_storage_manager.hpp @@ -43,7 +43,8 @@ struct adhoc_storage_manager : scord::utils::singleton<adhoc_storage_manager> { tl::expected<std::shared_ptr<scord::internal::adhoc_storage_info>, scord::error_code> create(enum scord::adhoc_storage::type type, const std::string& name, - const scord::adhoc_storage::ctx& ctx) { + const scord::adhoc_storage::ctx& ctx, + const scord::adhoc_storage::resources& resources) { static std::atomic_uint64_t current_id; std::uint64_t id = current_id++; @@ -54,7 +55,8 @@ struct adhoc_storage_manager : scord::utils::singleton<adhoc_storage_manager> { it == m_adhoc_storages.end()) { const auto& [it_adhoc, inserted] = m_adhoc_storages.emplace( id, std::make_shared<scord::internal::adhoc_storage_info>( - scord::adhoc_storage{type, name, id, ctx})); + scord::adhoc_storage{type, name, id, ctx, + resources})); if(!inserted) { LOGGER_ERROR("{}: Emplace failed", __FUNCTION__); diff --git a/src/scord/rpc_handlers.cpp b/src/scord/rpc_handlers.cpp index ac0b2f7c1bac57404ad5448d44d6509fc76e5f76..999d4ff0395cdc1356f1bb969561ac05e87944d6 100644 --- a/src/scord/rpc_handlers.cpp +++ b/src/scord/rpc_handlers.cpp @@ -216,7 +216,7 @@ register_adhoc_storage(const request& req, const std::string& name, std::optional<std::uint64_t> adhoc_id; auto& adhoc_manager = scord::adhoc_storage_manager::instance(); - if(const auto am_result = adhoc_manager.create(type, name, ctx); + if(const auto am_result = adhoc_manager.create(type, name, ctx, resources); am_result.has_value()) { const auto& adhoc_storage_info = am_result.value(); adhoc_id = adhoc_storage_info->adhoc_storage().id(); @@ -325,8 +325,8 @@ deploy_adhoc_storage(const request& req, std::uint64_t adhoc_id) { if(adhoc_storage.type() == scord::adhoc_storage::type::gekkofs) { const auto adhoc_ctx = adhoc_storage.context(); /* Number of nodes */ - const std::string nodes = - std::to_string(adhoc_ctx.resources().nodes().size()); + const std::string nodes = std::to_string( + adhoc_storage.get_resources().nodes().size()); /* Walltime */ const std::string walltime = std::to_string(adhoc_ctx.walltime());