From be826c4eb8ed180db77086ada9ebfb3077c34df9 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 31 Oct 2024 12:07:09 -0700 Subject: [PATCH 1/5] reader: update JGF reader comment --- resource/readers/resource_reader_jgf.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/resource/readers/resource_reader_jgf.cpp b/resource/readers/resource_reader_jgf.cpp index 6f8f6f3c7..f50997d1b 100644 --- a/resource/readers/resource_reader_jgf.cpp +++ b/resource/readers/resource_reader_jgf.cpp @@ -1298,10 +1298,7 @@ int resource_reader_jgf_t::unpack_at (resource_graph_t &g, const std::string &str, int rank) { - /* This functionality is currently experimental, as resource graph - * growth causes a resize of the boost vecS vertex container type. - * Resizing the vecS results in lost job allocations and reservations - * as there is no copy constructor for planner. + /* This functionality is currently experimental. * vtx_t vtx is not implemented and may be used in the future * for optimization. */ From ebf5d3f00e8cc27d0572593d6a28ce1ca17fa399 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 31 Oct 2024 12:07:52 -0700 Subject: [PATCH 2/5] reapi: add grow function to C API --- resource/reapi/bindings/c/reapi_cli.cpp | 22 +++++++++++++++++----- resource/reapi/bindings/c/reapi_cli.h | 12 ++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/resource/reapi/bindings/c/reapi_cli.cpp b/resource/reapi/bindings/c/reapi_cli.cpp index 6bec44ca9..1f08c2ddb 100644 --- a/resource/reapi/bindings/c/reapi_cli.cpp +++ b/resource/reapi/bindings/c/reapi_cli.cpp @@ -186,6 +186,16 @@ extern "C" int reapi_cli_update_allocate (reapi_cli_ctx_t *ctx, return rc; } +extern "C" int reapi_cli_grow (reapi_cli_ctx_t *ctx, + const char *R_subgraph) +{ + if (!ctx || !ctx->rqt || !R_subgraph) { + errno = EINVAL; + return -1; + } + return reapi_cli_t::grow (ctx->rqt, R_subgraph) +} + extern "C" int reapi_cli_cancel (reapi_cli_ctx_t *ctx, const uint64_t jobid, bool noent_ok) { if (!ctx || !ctx->rqt) { @@ -259,11 +269,13 @@ extern "C" const char *reapi_cli_get_err_msg (reapi_cli_ctx_t *ctx) { std::string err_buf = ""; - if (ctx->rqt) - err_buf = ctx->rqt->get_resource_query_err_msg () + reapi_cli_t::get_err_message () - + ctx->err_msg; - else - err_buf = reapi_cli_t::get_err_message () + ctx->err_msg; + if (!ctx || !ctx->rqt) { + errno = EINVAL; + return "ERROR: REAPI context and/or rqt null \n"; + } + + err_buf = ctx->rqt->get_resource_query_err_msg () + reapi_cli_t::get_err_message () + + ctx->err_msg; return strdup (err_buf.c_str ()); } diff --git a/resource/reapi/bindings/c/reapi_cli.h b/resource/reapi/bindings/c/reapi_cli.h index eeca639dd..46063eb9f 100644 --- a/resource/reapi/bindings/c/reapi_cli.h +++ b/resource/reapi/bindings/c/reapi_cli.h @@ -140,6 +140,18 @@ int reapi_cli_update_allocate (reapi_cli_ctx_t *ctx, double *ov, const char **R_out); +/*! Update the resource state with R. + * + * \param h Opaque handle. How it is used is an implementation + * detail. However, when it is used within a Flux's + * service module, it is expected to be a pointer + * to a flux_t object. + * \param R_subgraph R string + * \return 0 on success; -1 on error. + */ +int reapi_cli_grow (reapi_cli_ctx_t *ctx, + const char *R_subgraph); + /*! Cancel the allocation or reservation corresponding to jobid. * * \param ctx reapi_cli_ctx_t context object From a0271835a0e0a0ca81a13669f786cf45968d7334 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Thu, 31 Oct 2024 12:08:50 -0700 Subject: [PATCH 3/5] reapi: add C++ API functionality --- resource/reapi/bindings/c++/reapi.hpp | 15 ++++++ resource/reapi/bindings/c++/reapi_cli.hpp | 2 + .../reapi/bindings/c++/reapi_cli_impl.hpp | 50 +++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/resource/reapi/bindings/c++/reapi.hpp b/resource/reapi/bindings/c++/reapi.hpp index cf5eec3e9..f16ca0bef 100644 --- a/resource/reapi/bindings/c++/reapi.hpp +++ b/resource/reapi/bindings/c++/reapi.hpp @@ -190,6 +190,21 @@ class reapi_t { return -1; } + /*! Update the resource state with R. + * + * \param h Opaque handle. How it is used is an implementation + * detail. However, when it is used within a Flux's + * service module, it is expected to be a pointer + * to a flux_t object. + * \param R_subgraph R string of std::string. + * \return 0 on success; -1 on error. + */ + static int grow (void *h, + const std::string &R_subgraph) + { + return -1; + } + /*! Cancel the allocation or reservation corresponding to jobid. * * \param h Opaque handle. How it is used is an implementation diff --git a/resource/reapi/bindings/c++/reapi_cli.hpp b/resource/reapi/bindings/c++/reapi_cli.hpp index 5edb8393c..1892b0131 100644 --- a/resource/reapi/bindings/c++/reapi_cli.hpp +++ b/resource/reapi/bindings/c++/reapi_cli.hpp @@ -89,6 +89,7 @@ class resource_query_t { void set_job (const uint64_t jobid, const std::shared_ptr &job); int remove_job (const uint64_t jobid); int remove_job (const uint64_t jobid, const std::string &R, bool &full_removal); + int grow (const std::string &R_subgraph); void incr_job_counter (); /* Run the traverser to match the jobspec */ @@ -148,6 +149,7 @@ class reapi_cli_t : public reapi_t { int64_t &at, double &ov, std::string &R_out); + static int grow (void *h, const std::string &R_subgraph); static int cancel (void *h, const uint64_t jobid, bool noent_ok); static int cancel (void *h, const uint64_t jobid, diff --git a/resource/reapi/bindings/c++/reapi_cli_impl.hpp b/resource/reapi/bindings/c++/reapi_cli_impl.hpp index 1d81410fe..5eee864eb 100644 --- a/resource/reapi/bindings/c++/reapi_cli_impl.hpp +++ b/resource/reapi/bindings/c++/reapi_cli_impl.hpp @@ -165,6 +165,20 @@ int reapi_cli_t::update_allocate (void *h, return NOT_YET_IMPLEMENTED; } +int reapi_cli_t::grow (void *h, + const std::string &R_subgraph) +{ + resource_query_t *rq = static_cast (h); + int rc = -1; + + if ((rc = rq->grow (R_subgraph)) != 0) { + m_err_msg += __FUNCTION__; + m_err_msg += ": ERROR: grow error: " + std::string (strerror (errno)) + "\n"; + } + + return rc; +} + int reapi_cli_t::match_allocate_multi (void *h, bool orelse_reserve, const char *jobs, @@ -722,6 +736,42 @@ int resource_query_t::remove_job (const uint64_t jobid, const std::string &R, bo return rc; } +int resource_query_t::grow (const std::string &R_subgraph) +{ + int rc = -1; + std::shared_ptr reader; + vtx_t v = boost::graph_traits::null_vertex (); + + if (R_subgraph == "") { + errno = EINVAL; + return rc; + } + if (params.load_format != "jgf") { + m_err_msg = __FUNCTION__; + m_err_msg += ": ERROR: growing a resource graph not "; + m_err_msg += " initialized with JGF is unsupported\n"; + errno = ENOTSUP; + return rc; + } + if ((reader = create_resource_reader ("jgf")) == nullptr) { + m_err_msg = __FUNCTION__; + m_err_msg += ": ERROR: can't create JGF reader\n"; + return rc; + } + if ((rc = reader->unpack_at (db->resource_graph, db->metadata, v, R_subgraph, -1)) != 0) { + m_err_msg = __FUNCTION__; + m_err_msg += ": ERROR: reader returned error: "; + m_err_msg += reader->err_message () + "\n"; + return rc; + } + if ((rc = traverser->initialize (db, matcher)) != 0) { + m_err_msg = __FUNCTION__; + m_err_msg += ": ERROR: reinitialize traverser after grow. "; + m_err_msg += reader->err_message () + "\n"; + } + return rc; +} + void resource_query_t::incr_job_counter () { jobid_counter++; From 4f775db93c12d70961b19f75d50fcd4058b5bfc6 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Wed, 11 Dec 2024 16:30:32 -0800 Subject: [PATCH 4/5] fixup! C api --- resource/reapi/bindings/c/reapi_cli.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resource/reapi/bindings/c/reapi_cli.cpp b/resource/reapi/bindings/c/reapi_cli.cpp index 1f08c2ddb..4a1269452 100644 --- a/resource/reapi/bindings/c/reapi_cli.cpp +++ b/resource/reapi/bindings/c/reapi_cli.cpp @@ -193,7 +193,7 @@ extern "C" int reapi_cli_grow (reapi_cli_ctx_t *ctx, errno = EINVAL; return -1; } - return reapi_cli_t::grow (ctx->rqt, R_subgraph) + return reapi_cli_t::grow (ctx->rqt, R_subgraph); } extern "C" int reapi_cli_cancel (reapi_cli_ctx_t *ctx, const uint64_t jobid, bool noent_ok) From 3d569fe66a434b3414502f7bf3c006634c9243e3 Mon Sep 17 00:00:00 2001 From: Daniel Milroy Date: Wed, 11 Dec 2024 16:31:06 -0800 Subject: [PATCH 5/5] resource-query: reinitialize the traverser after attach --- resource/utilities/command.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resource/utilities/command.cpp b/resource/utilities/command.cpp index 782d0dd0f..b7c6c8bdc 100644 --- a/resource/utilities/command.cpp +++ b/resource/utilities/command.cpp @@ -562,7 +562,10 @@ static int remove (std::shared_ptr &ctx, std::vectorerr_message (); return -1; } - // TODO: reinitialize the traverser, see issue #1075 + if (ctx->traverser->initialize (ctx->db, ctx->matcher) != 0) { + std::cerr << "ERROR: can't reinitialize traverser after attach" << std::endl; + return -1; + } return 0; }