3288ce0462
Modify the seed and singleton SDS code so it returns the right local rank and num_local_procs. This commit was SVN r14707.
150 строки
5.5 KiB
C
150 строки
5.5 KiB
C
/*
|
|
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
|
* University Research and Technology
|
|
* Corporation. All rights reserved.
|
|
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
|
* of Tennessee Research Foundation. All rights
|
|
* reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "orte_config.h"
|
|
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#include "opal/mca/base/mca_base_param.h"
|
|
#include "opal/util/output.h"
|
|
#include "orte/orte_constants.h"
|
|
#include "orte/mca/sds/base/base.h"
|
|
#include "orte/util/proc_info.h"
|
|
#include "orte/runtime/runtime.h"
|
|
#include "orte/mca/errmgr/base/base.h"
|
|
#include "orte/mca/ns/ns.h"
|
|
#include "orte/mca/ns/base/base.h"
|
|
|
|
int
|
|
orte_sds_base_basic_contact_universe(void)
|
|
{
|
|
int ret, rc, exit_if_not_exist;
|
|
orte_universe_t univ;
|
|
|
|
OBJ_CONSTRUCT(&univ, orte_universe_t);
|
|
|
|
/* if we were NOT given registry and name service replicas (i.e., we
|
|
* weren't told a universe contact point), check for some
|
|
* existing universe to join */
|
|
if (NULL == orte_process_info.ns_replica_uri || NULL == orte_process_info.gpr_replica_uri) {
|
|
if (ORTE_SUCCESS == (ret = orte_universe_exists(&univ))) {
|
|
/* copy universe info into our universe structure */
|
|
orte_universe_info.name = strdup(univ.name);
|
|
orte_universe_info.host = strdup(univ.host);
|
|
orte_universe_info.uid = strdup(univ.uid);
|
|
orte_universe_info.persistence = univ.persistence;
|
|
orte_universe_info.scope = strdup(univ.scope);
|
|
/* JJH XXX This will inadvertently overwrite the console MCA param */
|
|
/* orte_universe_info.console = univ.console; */
|
|
orte_universe_info.seed_uri = strdup(univ.seed_uri);
|
|
orte_universe_info.console_connected = univ.console_connected;
|
|
if( NULL != univ.scriptfile)
|
|
orte_universe_info.scriptfile = strdup(univ.scriptfile);
|
|
else
|
|
orte_universe_info.scriptfile = NULL;
|
|
/* define the replica contact points */
|
|
orte_process_info.ns_replica_uri = strdup(univ.seed_uri);
|
|
orte_process_info.gpr_replica_uri = strdup(univ.seed_uri);
|
|
} else {
|
|
/* if an existing universe is not detected, check the
|
|
* relevant MCA parameter to see if the caller wants
|
|
* us to abort in this situation
|
|
*/
|
|
if (0 > (rc = mca_base_param_register_int("orte", "univ", "exist", NULL, 0))) {
|
|
ORTE_ERROR_LOG(rc);
|
|
return rc;
|
|
}
|
|
if (ORTE_SUCCESS != (rc = mca_base_param_lookup_int(rc, &exit_if_not_exist))) {
|
|
ORTE_ERROR_LOG(rc);
|
|
return rc;
|
|
}
|
|
if (exit_if_not_exist) {
|
|
/* cleanup the subsystems that were already opened */
|
|
orte_system_finalize();
|
|
return ORTE_ERR_UNREACH;
|
|
}
|
|
if (ORTE_ERR_NOT_FOUND != ret) {
|
|
/* user-specified name - abort */
|
|
opal_output(0, "orte_init: could not contact the specified universe name %s",
|
|
orte_universe_info.name);
|
|
return ORTE_ERR_UNREACH;
|
|
}
|
|
orte_process_info.seed = true;
|
|
/* since we are seed, ensure that all replica info is NULL'd */
|
|
if (NULL != orte_process_info.ns_replica_uri) {
|
|
free(orte_process_info.ns_replica_uri);
|
|
orte_process_info.ns_replica_uri = NULL;
|
|
}
|
|
if (NULL != orte_process_info.ns_replica) {
|
|
free(orte_process_info.ns_replica);
|
|
orte_process_info.ns_replica = NULL;
|
|
}
|
|
|
|
if (NULL != orte_process_info.gpr_replica_uri) {
|
|
free(orte_process_info.gpr_replica_uri);
|
|
orte_process_info.gpr_replica_uri = NULL;
|
|
}
|
|
if (NULL != orte_process_info.gpr_replica) {
|
|
free(orte_process_info.gpr_replica);
|
|
orte_process_info.gpr_replica = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
OBJ_DESTRUCT(&univ);
|
|
|
|
return ORTE_SUCCESS;
|
|
}
|
|
|
|
|
|
int
|
|
orte_sds_base_seed_set_name(void)
|
|
{
|
|
int id, flag, rc;
|
|
|
|
/* if we are a seed, then there can be only one proc */
|
|
orte_process_info.num_procs = 1;
|
|
orte_process_info.vpid_start = 0;
|
|
orte_process_info.local_rank = 0;
|
|
orte_process_info.num_local_procs = 1;
|
|
|
|
/* if we're a seed and we're not infrastructure, we're also a
|
|
singleton. So set the singleton flag in that case */
|
|
id = mca_base_param_find("orte", NULL, "infrastructure");
|
|
mca_base_param_lookup_int(id, &flag);
|
|
if (!flag) {
|
|
orte_process_info.singleton = true;
|
|
}
|
|
/* now need to create our name in a manner that puts our job info on the name service
|
|
* tracker. This is necessary so that
|
|
* functions like get_job_peers will work. Since we are the seed, these
|
|
* functions will always return the proper jobid=0, vpid=0 values
|
|
*/
|
|
if (ORTE_SUCCESS != (rc = orte_ns.create_my_name())) {
|
|
ORTE_ERROR_LOG(rc);
|
|
return rc;
|
|
}
|
|
|
|
return ORTE_SUCCESS;
|
|
}
|