Skip to content

Commit

Permalink
Use the PMIx functions to check params
Browse files Browse the repository at this point in the history
Break the multi-loop thru loading of param files
that caused us to overwrite values. Defer to the
PMIx pmdl components for obtaining envars and for
checking MCA param overlaps across projects.

Signed-off-by: Ralph Castain <rhc@pmix.org>
  • Loading branch information
rhc54 committed Aug 4, 2024
1 parent dd7706c commit a68d647
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 349 deletions.
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;
}
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

0 comments on commit a68d647

Please sign in to comment.