Merge pull request #2148 from rhc54/topic/showhelp
Put show_help thru the PMIx "log" API.
Этот коммит содержится в:
Коммит
507ef670e5
@ -786,6 +786,14 @@ typedef const char* (*opal_pmix_base_module_get_nspace_fn_t)(opal_jobid_t jobid)
|
|||||||
/* register a jobid-to-nspace pair */
|
/* register a jobid-to-nspace pair */
|
||||||
typedef void (*opal_pmix_base_module_register_jobid_fn_t)(opal_jobid_t jobid, const char *nspace);
|
typedef void (*opal_pmix_base_module_register_jobid_fn_t)(opal_jobid_t jobid, const char *nspace);
|
||||||
|
|
||||||
|
/* query information from the system */
|
||||||
|
typedef void (*opal_pmix_base_module_query_fn_t)(opal_list_t *queries,
|
||||||
|
opal_pmix_info_cbfunc_t cbfunc, void *cbdata);
|
||||||
|
|
||||||
|
/* log data to the system */
|
||||||
|
typedef void (*opal_pmix_base_log_fn_t)(opal_list_t *info,
|
||||||
|
opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the standard public API data structure
|
* the standard public API data structure
|
||||||
*/
|
*/
|
||||||
@ -815,6 +823,8 @@ typedef struct {
|
|||||||
opal_pmix_base_module_disconnect_nb_fn_t disconnect_nb;
|
opal_pmix_base_module_disconnect_nb_fn_t disconnect_nb;
|
||||||
opal_pmix_base_module_resolve_peers_fn_t resolve_peers;
|
opal_pmix_base_module_resolve_peers_fn_t resolve_peers;
|
||||||
opal_pmix_base_module_resolve_nodes_fn_t resolve_nodes;
|
opal_pmix_base_module_resolve_nodes_fn_t resolve_nodes;
|
||||||
|
opal_pmix_base_module_query_fn_t query;
|
||||||
|
opal_pmix_base_log_fn_t log;
|
||||||
/* server APIs */
|
/* server APIs */
|
||||||
opal_pmix_base_module_server_init_fn_t server_init;
|
opal_pmix_base_module_server_init_fn_t server_init;
|
||||||
opal_pmix_base_module_server_finalize_fn_t server_finalize;
|
opal_pmix_base_module_server_finalize_fn_t server_finalize;
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "opal/mca/pmix/pmix_types.h"
|
#include "opal/mca/pmix/pmix_types.h"
|
||||||
|
|
||||||
#include <pmix_common.h>
|
#include <pmix_common.h>
|
||||||
|
#include <pmix.h>
|
||||||
|
|
||||||
/**** C.O.M.M.O.N I.N.T.E.R.F.A.C.E.S ****/
|
/**** C.O.M.M.O.N I.N.T.E.R.F.A.C.E.S ****/
|
||||||
|
|
||||||
@ -61,6 +62,10 @@ static int notify_event(int status,
|
|||||||
opal_pmix_data_range_t range,
|
opal_pmix_data_range_t range,
|
||||||
opal_list_t *info,
|
opal_list_t *info,
|
||||||
opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
|
opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
|
||||||
|
static void pmix3x_query(opal_list_t *queries,
|
||||||
|
opal_pmix_info_cbfunc_t cbfunc, void *cbdata);
|
||||||
|
static void pmix3x_log(opal_list_t *info,
|
||||||
|
opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
|
||||||
|
|
||||||
const opal_pmix_base_module_t opal_pmix_pmix3x_module = {
|
const opal_pmix_base_module_t opal_pmix_pmix3x_module = {
|
||||||
/* client APIs */
|
/* client APIs */
|
||||||
@ -88,6 +93,8 @@ const opal_pmix_base_module_t opal_pmix_pmix3x_module = {
|
|||||||
.disconnect_nb = pmix3x_disconnectnb,
|
.disconnect_nb = pmix3x_disconnectnb,
|
||||||
.resolve_peers = pmix3x_resolve_peers,
|
.resolve_peers = pmix3x_resolve_peers,
|
||||||
.resolve_nodes = pmix3x_resolve_nodes,
|
.resolve_nodes = pmix3x_resolve_nodes,
|
||||||
|
.query = pmix3x_query,
|
||||||
|
.log = pmix3x_log,
|
||||||
/* server APIs */
|
/* server APIs */
|
||||||
.server_init = pmix3x_server_init,
|
.server_init = pmix3x_server_init,
|
||||||
.server_finalize = pmix3x_server_finalize,
|
.server_finalize = pmix3x_server_finalize,
|
||||||
@ -1293,6 +1300,65 @@ static int notify_event(int status,
|
|||||||
return OPAL_SUCCESS;
|
return OPAL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pmix3x_query(opal_list_t *queries,
|
||||||
|
opal_pmix_info_cbfunc_t cbfunc, void *cbdata)
|
||||||
|
{
|
||||||
|
if (NULL != cbfunc) {
|
||||||
|
cbfunc(OPAL_ERR_NOT_SUPPORTED, NULL, cbdata, NULL, NULL);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void opcbfunc(pmix_status_t status, void *cbdata)
|
||||||
|
{
|
||||||
|
pmix3x_opcaddy_t *op = (pmix3x_opcaddy_t*)cbdata;
|
||||||
|
|
||||||
|
if (NULL != op->opcbfunc) {
|
||||||
|
op->opcbfunc(pmix3x_convert_rc(status), op->cbdata);
|
||||||
|
}
|
||||||
|
OBJ_RELEASE(op);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pmix3x_log(opal_list_t *info,
|
||||||
|
opal_pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
opal_value_t *ival;
|
||||||
|
size_t n, ninfo;
|
||||||
|
pmix3x_opcaddy_t *cd;
|
||||||
|
|
||||||
|
/* bozo check */
|
||||||
|
if (NULL == info || 0 == (ninfo = opal_list_get_size(info))) {
|
||||||
|
rc = OPAL_ERR_BAD_PARAM;
|
||||||
|
goto CLEANUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup the operation */
|
||||||
|
cd = OBJ_NEW(pmix3x_opcaddy_t);
|
||||||
|
cd->opcbfunc = cbfunc;
|
||||||
|
cd->cbdata = cbdata;
|
||||||
|
cd->ninfo = ninfo;
|
||||||
|
|
||||||
|
/* convert the list to an array of info objects */
|
||||||
|
PMIX_INFO_CREATE(cd->info, cd->ninfo);
|
||||||
|
n=0;
|
||||||
|
OPAL_LIST_FOREACH(ival, info, opal_value_t) {
|
||||||
|
(void)strncpy(cd->info[n].key, ival->key, PMIX_MAX_KEYLEN);
|
||||||
|
pmix3x_value_load(&cd->info[n].value, ival);
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pass it down */
|
||||||
|
PMIx_Log_nb(cd->info, cd->ninfo, NULL, 0,
|
||||||
|
opcbfunc, cd);
|
||||||
|
return;
|
||||||
|
|
||||||
|
CLEANUP:
|
||||||
|
if (NULL != cbfunc) {
|
||||||
|
cbfunc(rc, cbdata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**** INSTANTIATE INTERNAL CLASSES ****/
|
/**** INSTANTIATE INTERNAL CLASSES ****/
|
||||||
OBJ_CLASS_INSTANCE(opal_pmix3x_jobid_trkr_t,
|
OBJ_CLASS_INSTANCE(opal_pmix3x_jobid_trkr_t,
|
||||||
opal_list_item_t,
|
opal_list_item_t,
|
||||||
|
@ -201,6 +201,10 @@ BEGIN_C_DECLS
|
|||||||
// procs in job on same node
|
// procs in job on same node
|
||||||
#define OPAL_PMIX_QUERY_AUTHORIZATIONS "pmix.qry.auths" // return operations tool is authorized to perform"
|
#define OPAL_PMIX_QUERY_AUTHORIZATIONS "pmix.qry.auths" // return operations tool is authorized to perform"
|
||||||
|
|
||||||
|
/* log attributes */
|
||||||
|
#define OPAL_PMIX_LOG_STDERR "pmix.log.stderr" // (bool) log data to stderr
|
||||||
|
#define OPAL_PMIX_LOG_STDOUT "pmix.log.stdout" // (bool) log data to stdout
|
||||||
|
#define OPAL_PMIX_LOG_SYSLOG "pmix.log.syslog" // (bool) log data to syslog - defaults to ERROR priority unless
|
||||||
|
|
||||||
/* define a scope for data "put" by PMI per the following:
|
/* define a scope for data "put" by PMI per the following:
|
||||||
*
|
*
|
||||||
|
@ -481,18 +481,27 @@ void pmix_server_log_fn(opal_process_name_t *requestor,
|
|||||||
void *cbdata)
|
void *cbdata)
|
||||||
{
|
{
|
||||||
opal_value_t *val;
|
opal_value_t *val;
|
||||||
|
opal_buffer_t *buf;
|
||||||
|
int rc;
|
||||||
|
|
||||||
/* for now, we only support logging show_help messages */
|
/* for now, we only support logging show_help messages */
|
||||||
OPAL_LIST_FOREACH(val, info, opal_value_t) {
|
OPAL_LIST_FOREACH(val, info, opal_value_t) {
|
||||||
/* we ignore the key as irrelevant - we only want to
|
/* we ignore the key as irrelevant - we only want to
|
||||||
* pull out the string value */
|
* pull out the blob */
|
||||||
if (OPAL_STRING != val->type) {
|
if (OPAL_BYTE_OBJECT != val->type) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
opal_output(0, "SHOWHELP: %s", val->data.string);
|
buf = OBJ_NEW(opal_buffer_t);
|
||||||
|
opal_dss.load(buf, val->data.bo.bytes, val->data.bo.size);
|
||||||
|
val->data.bo.bytes = NULL;
|
||||||
|
if (ORTE_SUCCESS != (rc = orte_rml.send_buffer_nb(ORTE_PROC_MY_HNP, buf,
|
||||||
|
ORTE_RML_TAG_SHOW_HELP,
|
||||||
|
orte_rml_send_callback, NULL))) {
|
||||||
|
ORTE_ERROR_LOG(rc);
|
||||||
|
OBJ_RELEASE(buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (NULL != cbfunc) {
|
if (NULL != cbfunc) {
|
||||||
cbfunc(OPAL_SUCCESS, cbdata);
|
cbfunc(OPAL_SUCCESS, cbdata);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "opal/util/output.h"
|
#include "opal/util/output.h"
|
||||||
#include "opal/dss/dss.h"
|
#include "opal/dss/dss.h"
|
||||||
#include "opal/mca/event/event.h"
|
#include "opal/mca/event/event.h"
|
||||||
|
#include "opal/mca/pmix/pmix.h"
|
||||||
|
|
||||||
#include "orte/mca/errmgr/errmgr.h"
|
#include "orte/mca/errmgr/errmgr.h"
|
||||||
#include "orte/mca/rml/rml.h"
|
#include "orte/mca/rml/rml.h"
|
||||||
@ -602,11 +603,23 @@ int orte_show_help(const char *filename, const char *topic,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cbfunc(int status, void *cbdata)
|
||||||
|
{
|
||||||
|
volatile bool *active = (volatile bool*)cbdata;
|
||||||
|
*active = false;
|
||||||
|
}
|
||||||
|
|
||||||
int orte_show_help_norender(const char *filename, const char *topic,
|
int orte_show_help_norender(const char *filename, const char *topic,
|
||||||
bool want_error_header, const char *output)
|
bool want_error_header, const char *output)
|
||||||
{
|
{
|
||||||
int rc = ORTE_SUCCESS;
|
int rc = ORTE_SUCCESS;
|
||||||
int8_t have_output = 1;
|
int8_t have_output = 1;
|
||||||
|
opal_buffer_t *buf;
|
||||||
|
bool am_inside = false;
|
||||||
|
opal_list_t info;
|
||||||
|
opal_value_t *kv;
|
||||||
|
volatile bool active;
|
||||||
|
struct timespec tp;
|
||||||
|
|
||||||
if (!ready) {
|
if (!ready) {
|
||||||
/* if we are finalizing, then we have no way to process
|
/* if we are finalizing, then we have no way to process
|
||||||
@ -628,39 +641,44 @@ int orte_show_help_norender(const char *filename, const char *topic,
|
|||||||
* mode, then all we can do is process this locally
|
* mode, then all we can do is process this locally
|
||||||
*/
|
*/
|
||||||
if (ORTE_PROC_IS_HNP || ORTE_PROC_IS_TOOL ||
|
if (ORTE_PROC_IS_HNP || ORTE_PROC_IS_TOOL ||
|
||||||
orte_standalone_operation ||
|
orte_standalone_operation) {
|
||||||
NULL == orte_rml.send_buffer_nb ||
|
|
||||||
NULL == orte_routed.get_route ||
|
|
||||||
NULL == orte_process_info.my_hnp_uri) {
|
|
||||||
rc = show_help(filename, topic, output, ORTE_PROC_MY_NAME);
|
rc = show_help(filename, topic, output, ORTE_PROC_MY_NAME);
|
||||||
|
goto CLEANUP;
|
||||||
|
} else if (ORTE_PROC_IS_DAEMON) {
|
||||||
|
if (NULL == orte_rml.send_buffer_nb ||
|
||||||
|
NULL == orte_routed.get_route ||
|
||||||
|
NULL == orte_process_info.my_hnp_uri) {
|
||||||
|
rc = show_help(filename, topic, output, ORTE_PROC_MY_NAME);
|
||||||
|
goto CLEANUP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* otherwise, we relay the output message to
|
/* otherwise, we relay the output message to
|
||||||
* the HNP for processing
|
* the HNP for processing
|
||||||
*/
|
*/
|
||||||
else {
|
|
||||||
opal_buffer_t *buf;
|
|
||||||
static bool am_inside = false;
|
|
||||||
|
|
||||||
/* JMS Note that we *may* have a recursion situation here where
|
/* JMS Note that we *may* have a recursion situation here where
|
||||||
the RML could call show_help. Need to think about this
|
the RML could call show_help. Need to think about this
|
||||||
properly, but put a safeguard in here for sure for the time
|
properly, but put a safeguard in here for sure for the time
|
||||||
being. */
|
being. */
|
||||||
if (am_inside) {
|
if (am_inside) {
|
||||||
rc = show_help(filename, topic, output, ORTE_PROC_MY_NAME);
|
rc = show_help(filename, topic, output, ORTE_PROC_MY_NAME);
|
||||||
} else {
|
} else {
|
||||||
am_inside = true;
|
am_inside = true;
|
||||||
|
|
||||||
/* build the message to the HNP */
|
/* build the message to the HNP */
|
||||||
buf = OBJ_NEW(opal_buffer_t);
|
buf = OBJ_NEW(opal_buffer_t);
|
||||||
/* pack the filename of the show_help text file */
|
/* pack the filename of the show_help text file */
|
||||||
opal_dss.pack(buf, &filename, 1, OPAL_STRING);
|
opal_dss.pack(buf, &filename, 1, OPAL_STRING);
|
||||||
/* pack the topic tag */
|
/* pack the topic tag */
|
||||||
opal_dss.pack(buf, &topic, 1, OPAL_STRING);
|
opal_dss.pack(buf, &topic, 1, OPAL_STRING);
|
||||||
/* pack the flag that we have a string */
|
/* pack the flag that we have a string */
|
||||||
opal_dss.pack(buf, &have_output, 1, OPAL_INT8);
|
opal_dss.pack(buf, &have_output, 1, OPAL_INT8);
|
||||||
/* pack the resulting string */
|
/* pack the resulting string */
|
||||||
opal_dss.pack(buf, &output, 1, OPAL_STRING);
|
opal_dss.pack(buf, &output, 1, OPAL_STRING);
|
||||||
|
|
||||||
|
/* if we are a daemon, then send it via RML to the HNP */
|
||||||
|
if (ORTE_PROC_IS_DAEMON) {
|
||||||
/* send it to the HNP */
|
/* send it to the HNP */
|
||||||
if (ORTE_SUCCESS != (rc = orte_rml.send_buffer_nb(ORTE_PROC_MY_HNP, buf,
|
if (ORTE_SUCCESS != (rc = orte_rml.send_buffer_nb(ORTE_PROC_MY_HNP, buf,
|
||||||
ORTE_RML_TAG_SHOW_HELP,
|
ORTE_RML_TAG_SHOW_HELP,
|
||||||
@ -672,8 +690,33 @@ int orte_show_help_norender(const char *filename, const char *topic,
|
|||||||
} else {
|
} else {
|
||||||
rc = ORTE_SUCCESS;
|
rc = ORTE_SUCCESS;
|
||||||
}
|
}
|
||||||
am_inside = false;
|
} else {
|
||||||
|
/* if we are not a daemon (i.e., we are an app) and if PMIx
|
||||||
|
* support for "log" is available, then use that channel */
|
||||||
|
if (NULL != opal_pmix.log) {
|
||||||
|
OBJ_CONSTRUCT(&info, opal_list_t);
|
||||||
|
kv = OBJ_NEW(opal_value_t),
|
||||||
|
kv->key = strdup(OPAL_PMIX_LOG_STDERR);
|
||||||
|
kv->type = OPAL_BYTE_OBJECT;
|
||||||
|
opal_dss.unload(buf, (void**)&kv->data.bo.bytes, &kv->data.bo.size);
|
||||||
|
opal_list_append(&info, &kv->super);
|
||||||
|
active = true;
|
||||||
|
tp.tv_sec = 0;
|
||||||
|
tp.tv_nsec = 1000000;
|
||||||
|
opal_pmix.log(&info, cbfunc, (void*)&active);
|
||||||
|
while (active) {
|
||||||
|
nanosleep(&tp, NULL);
|
||||||
|
}
|
||||||
|
OBJ_RELEASE(buf);
|
||||||
|
kv->data.bo.bytes = NULL;
|
||||||
|
OPAL_LIST_DESTRUCT(&info);
|
||||||
|
rc = ORTE_SUCCESS;
|
||||||
|
goto CLEANUP;
|
||||||
|
} else {
|
||||||
|
rc = show_help(filename, topic, output, ORTE_PROC_MY_NAME);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
am_inside = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CLEANUP:
|
CLEANUP:
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user