Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use the PMIx functions to check params #21

Merged
merged 1 commit into from
Sep 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions src/mca/schizo/base/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2020 IBM Corporation. All rights reserved.
* Copyright (c) 2020 Cisco Systems, Inc. All rights reserved
* Copyright (c) 2021-2023 Nanook Consulting. All rights reserved.
* Copyright (c) 2021-2024 Nanook Consulting All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
Expand Down Expand Up @@ -95,8 +95,6 @@ PRTE_EXPORT bool prte_schizo_base_check_directives(char *directive,
PRTE_EXPORT bool prte_schizo_base_check_qualifiers(char *directive,
char **valid,
char *qual);
PRTE_EXPORT bool prte_schizo_base_check_prte_param(char *param);
PRTE_EXPORT bool prte_schizo_base_check_pmix_param(char *param);
PRTE_EXPORT void prte_schizo_base_expose(char *param, char *prefix);
PRTE_EXPORT int prte_schizo_base_add_directive(pmix_cli_result_t *results,
const char *deprecated, const char *target,
Expand Down
70 changes: 3 additions & 67 deletions src/mca/schizo/base/schizo_base_stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "src/include/pmix_frameworks.h"
#include "src/include/prte_frameworks.h"
#include "src/mca/errmgr/errmgr.h"
#include "src/mca/pmdl/base/base.h"
#include "src/mca/schizo/base/base.h"
#include "src/runtime/prte_globals.h"
#include "src/util/pmix_argv.h"
Expand Down Expand Up @@ -242,26 +243,6 @@ char *prte_schizo_base_strip_quotes(char *p)
return pout;
}

bool prte_schizo_base_check_prte_param(char *param)
{
char *p;
size_t n;
int len;

p = strchr(param, '_');
len = (int)(p - param);

if (0 == strncmp(param, "prte", len)) {
return true;
}
for (n=0; NULL != prte_framework_names[n]; n++) {
if (0 == strncmp(param, prte_framework_names[n], len)) {
return true;
}
}
return false;
}

int prte_schizo_base_parse_prte(int argc, int start, char **argv, char ***target)
{
int i;
Expand Down Expand Up @@ -312,7 +293,7 @@ int prte_schizo_base_parse_prte(int argc, int start, char **argv, char ***target

/* this is a generic MCA designation, so see if the parameter it
* refers to belongs to one of our frameworks */
use = prte_schizo_base_check_prte_param(p1);
use = pmix_pmdl_base_check_prte_param(p1);
if (use) {
/* replace the generic directive with a PRRTE specific
* one so we know this has been processed */
Expand Down Expand Up @@ -361,51 +342,6 @@ int prte_schizo_base_parse_prte(int argc, int start, char **argv, char ***target
return PRTE_SUCCESS;
}

static char **pmix_frameworks_tocheck = pmix_framework_names;
static bool pmix_frameworks_setup = false;

static void setup_pmix_frameworks(void)
{
if (pmix_frameworks_setup) {
return;
}
pmix_frameworks_setup = true;

char *env = getenv("PMIX_MCA_PREFIXES");
if (NULL == env) {
return;
}

// If we found the env variable, it will be a comma-delimited list
// of values. Split it into an argv-style array.
char **tmp = PMIX_ARGV_SPLIT_COMPAT(env, ',');
if (NULL != tmp) {
pmix_frameworks_tocheck = tmp;
}
}

bool prte_schizo_base_check_pmix_param(char *param)
{
char *p;
size_t n;
int len;

setup_pmix_frameworks();

p = strchr(param, '_');
len = (int)(p - param);

if (0 == strncmp(param, "pmix", len)) {
return true;
}
for (n=0; NULL != pmix_frameworks_tocheck[n]; n++) {
if (0 == strncmp(param, pmix_frameworks_tocheck[n], len)) {
return true;
}
}
return false;
}

int prte_schizo_base_parse_pmix(int argc, int start, char **argv, char ***target)
{
int i;
Expand Down Expand Up @@ -487,7 +423,7 @@ int prte_schizo_base_parse_pmix(int argc, int start, char **argv, char ***target

/* this is a generic MCA designation, so see if the parameter it
* refers to belongs to one of our frameworks */
use = prte_schizo_base_check_pmix_param(p1);
use = pmix_pmdl_base_check_pmix_param(p1);
if (use) {
/* replace the generic directive with a PMIx specific
* one so we know this has been processed */
Expand Down
231 changes: 3 additions & 228 deletions src/mca/schizo/ompi/schizo_ompi.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include "src/mca/base/pmix_mca_base_vari.h"
#include "src/mca/errmgr/errmgr.h"
#include "src/mca/ess/base/base.h"
#include "src/mca/pmdl/base/base.h"
#include "src/mca/rmaps/base/base.h"
#include "src/mca/state/base/base.h"
#include "src/runtime/prte_globals.h"
Expand Down Expand Up @@ -1821,232 +1822,6 @@ static int parse_env(char **srcenv, char ***dstenv,
return PRTE_SUCCESS;
}

static bool check_prte_overlap(char *var, char *value)
{
char *tmp;

if (0 == strncmp(var, "dl_", 3)) {
pmix_asprintf(&tmp, "PRTE_MCA_prtedl_%s", &var[3]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "oob_", 4)) {
pmix_asprintf(&tmp, "PRTE_MCA_%s", var);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "hwloc_", 6)) {
pmix_asprintf(&tmp, "PRTE_MCA_%s", var);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "if_", 3)) {
// need to convert if to prteif
pmix_asprintf(&tmp, "PRTE_MCA_prteif_%s", &var[3]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "reachable_", strlen("reachable_"))) {
// need to convert reachable to prtereachable
pmix_asprintf(&tmp, "PRTE_MCA_prtereachable_%s", &var[strlen("reachable_")]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "plm_rsh_", strlen("plm_rsh_"))) {
// need to convert rsh to ssh
pmix_asprintf(&tmp, "PRTE_MCA_plm_ssh_%s", &var[strlen("plm_rsh_")]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "orte_", strlen("orte_"))) {
// need to convert "orte" to "prte"
pmix_asprintf(&tmp, "PRTE_MCA_prte_%s", &var[strlen("orte_")]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
}
return false;
}


static bool check_pmix_overlap(char *var, char *value)
{
char *tmp;

if (0 == strncmp(var, "dl_", 3)) {
pmix_asprintf(&tmp, "PMIX_MCA_pdl_%s", &var[3]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "oob_", 4)) {
pmix_asprintf(&tmp, "PMIX_MCA_ptl_%s", &var[4]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "hwloc_", 6)) {
pmix_asprintf(&tmp, "PMIX_MCA_%s", var);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
} else if (0 == strncmp(var, "if_", 3)) {
// need to convert if to pif
pmix_asprintf(&tmp, "PMIX_MCA_pif_%s", &var[3]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, value, false);
free(tmp);
return true;
}
return false;
}

// NOTE: This code is fundamentally the same (module PMIX <-> OPAL)
// as the translate_params() routine in the OMPI repo's
// opal/mca/pmix/base/pmix_base_fns.c file. If there are
// changes here, there are likely to be changes there.
static int translate_params(void)
{
char *evar, *tmp, *e2;
char *file;
const char *home;
pmix_list_t params;
pmix_mca_base_var_file_value_t *fv;
uid_t uid;
int n, len;

/* since we are the proxy, we need to check the OMPI default
* MCA params to see if there is something relating to PRRTE
* in them - this would be "old" references to things from
* ORTE, as well as a few OPAL references that also impact us
*
* NOTE: we do this in the following precedence order. Note
* that we do not overwrite at any step - this is so that we
* don't overwrite something previously set by the user. So
* the order to execution is the opposite of the intended
* precedence order.
*
* 1. check the environmental paramaters for OMPI_MCA values
* that need to be translated
*
* 2. the user's home directory file as it should
* overwrite the system default file, but not the
* envars
*
* 3. the system default parameter file
*/
len = strlen("OMPI_MCA_");
for (n=0; NULL != environ[n]; n++) {
if (0 == strncmp(environ[n], "OMPI_MCA_", len)) {
e2 = strdup(environ[n]);
evar = strrchr(e2, '=');
*evar = '\0';
++evar;
if (check_prte_overlap(&e2[len], evar)) {
// check for pmix overlap
check_pmix_overlap(&e2[len], evar);
} else if (prte_schizo_base_check_prte_param(&e2[len])) {
pmix_asprintf(&tmp, "PRTE_MCA_%s", &e2[len]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, evar, false);
free(tmp);
// check for pmix overlap
check_pmix_overlap(&e2[len], evar);
} else if (prte_schizo_base_check_pmix_param(&e2[len])) {
pmix_asprintf(&tmp, "PMIX_MCA_%s", &e2[len]);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, evar, false);
free(tmp);
}
free(e2);
}
}

/* see if the user has a default MCA param file */
uid = geteuid();

/* try to get their home directory */
home = pmix_home_directory(uid);
if (NULL != home) {
file = pmix_os_path(false, home, ".openmpi", "mca-params.conf", NULL);
PMIX_CONSTRUCT(&params, pmix_list_t);
pmix_mca_base_parse_paramfile(file, &params);
free(file);
PMIX_LIST_FOREACH (fv, &params, pmix_mca_base_var_file_value_t) {
// see if this param relates to PRRTE
if (check_prte_overlap(fv->mbvfv_var, fv->mbvfv_value)) {
check_pmix_overlap(fv->mbvfv_var, fv->mbvfv_value);
} else if (prte_schizo_base_check_prte_param(fv->mbvfv_var)) {
pmix_asprintf(&tmp, "PRTE_MCA_%s", fv->mbvfv_var);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, fv->mbvfv_value, false);
free(tmp);
// if this relates to the DL, OOB, HWLOC, IF, or
// REACHABLE frameworks, then we also need to set
// the equivalent PMIx value
check_pmix_overlap(fv->mbvfv_var, fv->mbvfv_value);
} else if (prte_schizo_base_check_pmix_param(fv->mbvfv_var)) {
pmix_asprintf(&tmp, "PMIX_MCA_%s", fv->mbvfv_var);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, fv->mbvfv_value, false);
free(tmp);
}
}
PMIX_LIST_DESTRUCT(&params);
}

/* check if the user has set OMPIHOME in their environment */
if (NULL != (evar = getenv("OMPIHOME"))) {
/* look for the default MCA param file */
file = pmix_os_path(false, evar, "etc", "openmpi-mca-params.conf", NULL);
PMIX_CONSTRUCT(&params, pmix_list_t);
pmix_mca_base_parse_paramfile(file, &params);
free(file);
PMIX_LIST_FOREACH (fv, &params, pmix_mca_base_var_file_value_t) {
// see if this param relates to PRRTE
if (check_prte_overlap(fv->mbvfv_var, fv->mbvfv_value)) {
check_pmix_overlap(fv->mbvfv_var, fv->mbvfv_value);
} else if (prte_schizo_base_check_prte_param(fv->mbvfv_var)) {
pmix_asprintf(&tmp, "PRTE_MCA_%s", fv->mbvfv_var);
// set it, but don't overwrite if they already
// have a value in our environment
setenv(tmp, fv->mbvfv_value, false);
free(tmp);
// if this relates to the DL, OOB, HWLOC, IF, or
// REACHABLE frameworks, then we also need to set
// the equivalent PMIx value
check_pmix_overlap(fv->mbvfv_var, fv->mbvfv_value);
}
}
PMIX_LIST_DESTRUCT(&params);
}

return 100;
}

static int detect_proxy(char *personalities)
{
char *evar;
Expand All @@ -2062,15 +1837,15 @@ static int detect_proxy(char *personalities)
/* this is a list of personalities we need to check -
* if it contains "ompi", then we are available */
if (NULL != strstr(personalities, "ompi")) {
return translate_params();
return 100;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why a hardocded value? Is this a priority value?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm guessing since these are ported over commits, you just leave things unchanged from how they are in the main prrte repo.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why a hardocded value? Is this a priority value?

Yes, it is - the max value means "pick me!"

}
return 0;
}

/* if we were told the proxy, then use it */
if (NULL != (evar = getenv("PRTE_MCA_schizo_proxy"))) {
if (0 == strcmp(evar, "ompi")) {
return translate_params();
return 100;
} else {
return 0;
}
Expand Down
Loading
Loading