1
1

Modify the name service to provide necessary support for failed-to-start scenarios. Add a new API to get_vpid_range - this should be used in place of the rmgr API of that name to avoid race conditions (will remove that API in later commit).

This commit was SVN r14465.
Этот коммит содержится в:
Ralph Castain 2007-04-23 12:48:19 +00:00
родитель ce35761683
Коммит 3d4f1b86d2
11 изменённых файлов: 322 добавлений и 9 удалений

Просмотреть файл

@ -52,15 +52,24 @@ orte_ns_base_create_jobid_not_available(orte_jobid_t *jobid, opal_list_t *attrs)
}
int
orte_ns_base_get_vpid_range_not_available(orte_jobid_t job,
orte_vpid_t range,
orte_vpid_t *startvpid)
orte_ns_base_reserve_range_not_available(orte_jobid_t job,
orte_vpid_t range,
orte_vpid_t *startvpid)
{
*startvpid = ORTE_VPID_INVALID;
ORTE_ERROR_LOG(ORTE_ERR_UNREACH);
return ORTE_ERR_UNREACH;
}
int
orte_ns_base_get_vpid_range_not_available(orte_jobid_t job,
orte_vpid_t *range)
{
*range = ORTE_VPID_INVALID;
ORTE_ERROR_LOG(ORTE_ERR_UNREACH);
return ORTE_ERR_UNREACH;
}
int orte_ns_base_get_job_descendants_not_available(orte_jobid_t** descendants,
orte_std_cntr_t *num_desc,
orte_jobid_t job)
@ -95,6 +104,16 @@ int orte_ns_base_get_parent_job_not_available(orte_jobid_t *parent, orte_jobid_t
return ORTE_ERR_UNREACH;
}
int orte_ns_base_get_job_family_not_available(orte_jobid_t** family,
orte_std_cntr_t *num_members,
orte_jobid_t job)
{
*family = NULL;
*num_members = 0;
ORTE_ERROR_LOG(ORTE_ERR_UNREACH);
return ORTE_ERR_UNREACH;
}
/**** JOB STRING FUNCTIONS ****/
int orte_ns_base_get_jobid_string(char **jobid_string, const orte_process_name_t* name)

Просмотреть файл

@ -72,9 +72,11 @@ mca_ns_base_module_t orte_ns = {
orte_ns_base_get_job_children_not_available,
orte_ns_base_get_root_job_not_available,
orte_ns_base_get_parent_job_not_available,
orte_ns_base_get_job_family_not_available,
orte_ns_base_get_jobid_string,
orte_ns_base_convert_jobid_to_string,
orte_ns_base_convert_string_to_jobid,
orte_ns_base_reserve_range_not_available,
orte_ns_base_get_vpid_range_not_available,
/* vpid functions */
orte_ns_base_get_vpid_string,

Просмотреть файл

@ -83,6 +83,8 @@ typedef uint8_t orte_ns_cmd_flag_t;
#define ORTE_NS_DUMP_JOBIDS_CMD (int8_t) 16
#define ORTE_NS_DUMP_TAGS_CMD (int8_t) 17
#define ORTE_NS_DUMP_DATATYPES_CMD (int8_t) 18
#define ORTE_NS_GET_VPID_RANGE_CMD (int8_t) 19
#define ORTE_NS_GET_JOB_FAMILY_CMD (int8_t) 20
/*
@ -164,9 +166,14 @@ ORTE_DECLSPEC int orte_ns_base_get_root_job_not_available(orte_jobid_t *root_
ORTE_DECLSPEC int orte_ns_base_get_parent_job_not_available(orte_jobid_t *parent, orte_jobid_t job);
ORTE_DECLSPEC int orte_ns_base_get_job_family_not_available(orte_jobid_t **family, orte_std_cntr_t *num_members, orte_jobid_t job);
ORTE_DECLSPEC int orte_ns_base_reserve_range_not_available(orte_jobid_t job,
orte_vpid_t range,
orte_vpid_t *startvpid);
ORTE_DECLSPEC int orte_ns_base_get_vpid_range_not_available(orte_jobid_t job,
orte_vpid_t range,
orte_vpid_t *startvpid);
orte_vpid_t *range);
ORTE_DECLSPEC int orte_ns_base_assign_rml_tag_not_available(orte_rml_tag_t *tag, char *name);

Просмотреть файл

@ -241,6 +241,15 @@ typedef int (*orte_ns_base_module_get_job_children_fn_t)(orte_jobid_t** children
*/
typedef int (*orte_ns_base_module_get_root_job_fn_t)(orte_jobid_t *root_job, orte_jobid_t job);
/*
* Get a job family
* Given a jobid, return the array of jobids (including the given one) that are members
* of that extended job family. This will return ALL jobs related to the given one.
*/
typedef int (*orte_ns_base_module_get_job_family_fn_t)(orte_jobid_t** family,
orte_std_cntr_t *num_members,
orte_jobid_t job);
/*
* Get parent jobid
* Given a jobid, return the parent job from which it descended. If the provided jobid is the
@ -270,6 +279,12 @@ typedef int (*orte_ns_base_module_reserve_range_fn_t)(orte_jobid_t job,
orte_vpid_t range,
orte_vpid_t *startvpid);
/*
* Get the range of vpids assigned to a specified jobid
* Given a jobid, return the maximum vpid value assigned to that job.
*/
typedef int (*orte_ns_base_module_get_vpid_range_fn_t)(orte_jobid_t job, orte_vpid_t *range);
/**
* Get the job id as a character string.
* The get_jobid_string() function returns the job id in a character string
@ -593,10 +608,12 @@ struct mca_ns_base_module_2_0_0_t {
orte_ns_base_module_get_job_children_fn_t get_job_children;
orte_ns_base_module_get_root_job_fn_t get_root_job;
orte_ns_base_module_get_parent_job_fn_t get_parent_job;
orte_ns_base_module_get_job_family_fn_t get_job_family;
orte_ns_base_module_get_jobid_string_fn_t get_jobid_string;
orte_ns_base_module_convert_jobid_to_string_fn_t convert_jobid_to_string;
orte_ns_base_module_convert_string_to_jobid_fn_t convert_string_to_jobid;
orte_ns_base_module_reserve_range_fn_t reserve_range;
orte_ns_base_module_get_vpid_range_fn_t get_vpid_range;
/* vpid functions */
orte_ns_base_module_get_vpid_string_fn_t get_vpid_string;
orte_ns_base_module_convert_vpid_to_string_fn_t convert_vpid_to_string;

Просмотреть файл

@ -114,9 +114,13 @@ int orte_ns_proxy_get_root_job(orte_jobid_t *root_job, orte_jobid_t job);
int orte_ns_proxy_get_parent_job(orte_jobid_t *parent, orte_jobid_t job);
int orte_ns_proxy_get_job_family(orte_jobid_t** family, orte_std_cntr_t *num_members, orte_jobid_t job);
int orte_ns_proxy_reserve_range(orte_jobid_t job, orte_vpid_t range,
orte_vpid_t *startvpid);
int orte_ns_proxy_get_vpid_range(orte_jobid_t job, orte_vpid_t *range);
int orte_ns_proxy_get_peers(orte_process_name_t **procs,
orte_std_cntr_t *num_procs, opal_list_t *attrs);

Просмотреть файл

@ -87,10 +87,12 @@ static mca_ns_base_module_t orte_ns_proxy_module = {
orte_ns_proxy_get_job_children,
orte_ns_proxy_get_root_job,
orte_ns_proxy_get_parent_job,
orte_ns_proxy_get_job_family,
orte_ns_base_get_jobid_string,
orte_ns_base_convert_jobid_to_string,
orte_ns_base_convert_string_to_jobid,
orte_ns_proxy_reserve_range,
orte_ns_proxy_get_vpid_range,
/* vpid functions */
orte_ns_base_get_vpid_string,
orte_ns_base_convert_vpid_to_string,

Просмотреть файл

@ -450,6 +450,102 @@ int orte_ns_proxy_get_parent_job(orte_jobid_t *parent, orte_jobid_t job)
}
int orte_ns_proxy_get_job_family(orte_jobid_t** family, orte_std_cntr_t *num_members, orte_jobid_t job)
{
orte_buffer_t* cmd;
orte_buffer_t* answer;
orte_ns_cmd_flag_t command;
orte_std_cntr_t count, ndesc=0;
orte_jobid_t *jobs=NULL;
int rc;
OPAL_TRACE(1);
/* set default response */
*family = NULL;
*num_members = 0;
if ((cmd = OBJ_NEW(orte_buffer_t)) == NULL) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
return ORTE_ERR_OUT_OF_RESOURCE;
}
command = ORTE_NS_GET_JOB_FAMILY_CMD;
if (ORTE_SUCCESS != (rc = orte_dss.pack(cmd, (void*)&command, 1, ORTE_NS_CMD))) { /* got a problem */
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(cmd);
return rc;
}
if (ORTE_SUCCESS != (rc = orte_dss.pack(cmd, (void*)&job, 1, ORTE_JOBID))) { /* got a problem */
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(cmd);
return rc;
}
if (0 > orte_rml.send_buffer(ORTE_NS_MY_REPLICA, cmd, ORTE_RML_TAG_NS, 0)) {
ORTE_ERROR_LOG(ORTE_ERR_COMM_FAILURE);
OBJ_RELEASE(cmd);
return ORTE_ERR_COMM_FAILURE;
}
OBJ_RELEASE(cmd);
if ((answer = OBJ_NEW(orte_buffer_t)) == NULL) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
OBJ_RELEASE(answer);
return ORTE_ERR_OUT_OF_RESOURCE;
}
if (0 > orte_rml.recv_buffer(ORTE_NS_MY_REPLICA, answer, ORTE_RML_TAG_NS)) {
ORTE_ERROR_LOG(ORTE_ERR_COMM_FAILURE);
OBJ_RELEASE(answer);
return ORTE_ERR_COMM_FAILURE;
}
count = 1;
if (ORTE_SUCCESS != (rc = orte_dss.unpack(answer, &command, &count, ORTE_NS_CMD))) {
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(answer);
return rc;
}
if (ORTE_NS_GET_JOB_FAMILY_CMD != command) {
ORTE_ERROR_LOG(ORTE_ERR_COMM_FAILURE);
OBJ_RELEASE(answer);
return ORTE_ERR_COMM_FAILURE;
}
count = 1;
if (ORTE_SUCCESS != (rc = orte_dss.unpack(answer, &ndesc, &count, ORTE_STD_CNTR))) {
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(answer);
return rc;
}
/* if there are any members, allocate space for them and unpack */
if (0 < ndesc) {
jobs = (orte_jobid_t*)malloc(ndesc * sizeof(orte_jobid_t));
if (NULL == jobs) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
OBJ_RELEASE(answer);
return ORTE_ERR_OUT_OF_RESOURCE;
}
count = ndesc;
if (ORTE_SUCCESS != (rc = orte_dss.unpack(answer, jobs, &count, ORTE_JOBID))) {
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(answer);
return rc;
}
}
OBJ_RELEASE(answer);
*family = jobs;
*num_members = count;
return ORTE_SUCCESS;
}
int orte_ns_proxy_reserve_range(orte_jobid_t job, orte_vpid_t range, orte_vpid_t *starting_vpid)
{
orte_buffer_t* cmd;
@ -524,3 +620,71 @@ int orte_ns_proxy_reserve_range(orte_jobid_t job, orte_vpid_t range, orte_vpid_t
return ORTE_SUCCESS;
}
int orte_ns_proxy_get_vpid_range(orte_jobid_t job, orte_vpid_t *range)
{
orte_buffer_t* cmd;
orte_buffer_t* answer;
orte_ns_cmd_flag_t command;
orte_std_cntr_t count;
int rc;
OPAL_TRACE(1);
/* set default return value */
*range = ORTE_VPID_INVALID;
if ((cmd = OBJ_NEW(orte_buffer_t)) == NULL) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
return ORTE_ERR_OUT_OF_RESOURCE;
}
command = ORTE_NS_GET_VPID_RANGE_CMD;
if (ORTE_SUCCESS != (rc = orte_dss.pack(cmd, (void*)&command, 1, ORTE_NS_CMD))) { /* got a problem */
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(cmd);
return rc;
}
if (ORTE_SUCCESS != (rc = orte_dss.pack(cmd, (void*)&job, 1, ORTE_JOBID))) { /* got a problem */
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(cmd);
return rc;
}
if (0 > orte_rml.send_buffer(ORTE_NS_MY_REPLICA, cmd, ORTE_RML_TAG_NS, 0)) {
ORTE_ERROR_LOG(ORTE_ERR_COMM_FAILURE);
OBJ_RELEASE(cmd);
return ORTE_ERR_COMM_FAILURE;
}
OBJ_RELEASE(cmd);
if ((answer = OBJ_NEW(orte_buffer_t)) == NULL) {
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
return ORTE_ERR_OUT_OF_RESOURCE;
}
if (0 > orte_rml.recv_buffer(ORTE_NS_MY_REPLICA, answer, ORTE_RML_TAG_NS)) {
ORTE_ERROR_LOG(ORTE_ERR_COMM_FAILURE);
OBJ_RELEASE(answer);
return ORTE_ERR_COMM_FAILURE;
}
count = 1;
if ((ORTE_SUCCESS != (rc = orte_dss.unpack(answer, &command, &count, ORTE_NS_CMD)))
|| (ORTE_NS_GET_VPID_RANGE_CMD != command)) {
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(answer);
return rc;
}
count = 1;
if (ORTE_SUCCESS != (rc = orte_dss.unpack(answer, range, &count, ORTE_VPID))) {
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(answer);
return rc;
}
OBJ_RELEASE(answer);
return ORTE_SUCCESS;
}

Просмотреть файл

@ -168,10 +168,14 @@ int orte_ns_replica_get_root_job(orte_jobid_t *root_job, orte_jobid_t job);
int orte_ns_replica_get_parent_job(orte_jobid_t *parent, orte_jobid_t job);
int orte_ns_replica_get_job_family(orte_jobid_t **family, orte_std_cntr_t *num_members, orte_jobid_t job);
int orte_ns_replica_reserve_range(orte_jobid_t job,
orte_vpid_t range,
orte_vpid_t *startvpid);
int orte_ns_replica_get_vpid_range(orte_jobid_t job, orte_vpid_t *range);
/*
* GENERAL FUNCTIONS
*/

Просмотреть файл

@ -94,10 +94,12 @@ static mca_ns_base_module_t orte_ns_replica_module = {
orte_ns_replica_get_job_children,
orte_ns_replica_get_root_job,
orte_ns_replica_get_parent_job,
orte_ns_replica_get_job_family,
orte_ns_base_get_jobid_string,
orte_ns_base_convert_jobid_to_string,
orte_ns_base_convert_string_to_jobid,
orte_ns_replica_reserve_range,
orte_ns_replica_get_vpid_range,
/* vpid functions */
orte_ns_base_get_vpid_string,
orte_ns_base_convert_vpid_to_string,

Просмотреть файл

@ -30,6 +30,7 @@
#include "orte/dss/dss.h"
#include "orte/mca/errmgr/errmgr.h"
#include "orte/mca/rmgr/rmgr.h"
#include "orte/mca/gpr/gpr.h"
#include "ns_replica.h"
@ -265,15 +266,36 @@ REPORT:
}
int orte_ns_replica_get_job_family(orte_jobid_t **family, orte_std_cntr_t *num_members, orte_jobid_t job)
{
orte_jobid_t root;
int rc;
if (ORTE_SUCCESS != (rc = orte_ns_replica_get_root_job(&root, job))) {
ORTE_ERROR_LOG(rc);
return rc;
}
if (ORTE_SUCCESS != (rc = orte_ns_replica_get_job_descendants(family, num_members, job))) {
ORTE_ERROR_LOG(rc);
return rc;
}
return ORTE_SUCCESS;
}
int orte_ns_replica_reserve_range(orte_jobid_t job, orte_vpid_t range,
orte_vpid_t *start)
{
orte_ns_replica_jobitem_t *ptr;
orte_gpr_value_t *value;
char *segment;
int rc;
OPAL_TRACE(1);
OPAL_THREAD_LOCK(&orte_ns_replica.mutex);
/* find the job's record */
if (NULL == (ptr = orte_ns_replica_find_job(job))) {
ORTE_ERROR_LOG(ORTE_ERR_NOT_FOUND);
@ -284,12 +306,59 @@ int orte_ns_replica_reserve_range(orte_jobid_t job, orte_vpid_t range,
if ((ORTE_VPID_MAX-range-(ptr->next_vpid)) > 0) {
*start = ptr->next_vpid;
ptr->next_vpid += range;
/* now store it in the registry */
if(ORTE_SUCCESS != (rc = orte_schema.get_job_segment_name(&segment, job))) {
ORTE_ERROR_LOG(rc);
return rc;
}
if (ORTE_SUCCESS != (rc = orte_gpr.create_value(&value, ORTE_GPR_OVERWRITE, segment, 1, 1))) {
ORTE_ERROR_LOG(rc);
free(segment);
return rc;
}
free(segment);
value->tokens[0] = strdup(ORTE_JOB_GLOBALS);
if (ORTE_SUCCESS != (rc = orte_gpr.create_keyval(&(value->keyvals[0]), ORTE_JOB_VPID_RANGE_KEY, ORTE_VPID, &ptr->next_vpid))) {
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(value);
return rc;
}
if (ORTE_SUCCESS != (rc = orte_gpr.put(1, &value))) {
ORTE_ERROR_LOG(rc);
}
OBJ_RELEASE(value);
OPAL_THREAD_UNLOCK(&orte_ns_replica.mutex);
return ORTE_SUCCESS;
return rc;
}
/* get here if the range isn't available */
ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);
OPAL_THREAD_UNLOCK(&orte_ns_replica.mutex);
return ORTE_ERR_OUT_OF_RESOURCE;
}
int orte_ns_replica_get_vpid_range(orte_jobid_t job, orte_vpid_t *range)
{
orte_ns_replica_jobitem_t *ptr;
OPAL_TRACE(1);
OPAL_THREAD_LOCK(&orte_ns_replica.mutex);
/* find the job's record */
if (NULL == (ptr = orte_ns_replica_find_job(job))) {
ORTE_ERROR_LOG(ORTE_ERR_NOT_FOUND);
OPAL_THREAD_UNLOCK(&orte_ns_replica.mutex);
return ORTE_ERR_NOT_FOUND;
}
*range = ptr->next_vpid;
OPAL_THREAD_UNLOCK(&orte_ns_replica.mutex);
return ORTE_SUCCESS;
}

Просмотреть файл

@ -306,6 +306,29 @@ void orte_ns_replica_recv(int status, orte_process_name_t* sender,
}
break;
case ORTE_NS_GET_VPID_RANGE_CMD:
count = 1;
if (ORTE_SUCCESS != (rc = orte_dss.unpack(buffer, (void*)&job, &count, ORTE_JOBID))) {
ORTE_ERROR_LOG(rc);
goto RETURN_ERROR;
}
if (ORTE_SUCCESS != (rc = orte_ns_replica_get_vpid_range(job, &range))) {
ORTE_ERROR_LOG(rc);
goto RETURN_ERROR;
}
if (ORTE_SUCCESS != (rc = orte_dss.pack(&answer, (void*)&range, 1, ORTE_VPID))) {
ORTE_ERROR_LOG(rc);
goto RETURN_ERROR;
}
if (0 > (rc = orte_rml.send_buffer(sender, &answer, tag, 0))) {
ORTE_ERROR_LOG(ORTE_ERR_COMM_FAILURE);
goto RETURN_ERROR;
}
break;
case ORTE_NS_ASSIGN_OOB_TAG_CMD:
count = 1;
if (0 > orte_dss.unpack(buffer, &tagname, &count, ORTE_STRING)) {