📄 rds_hostfile.c
字号:
/* * Copyright (c) 2004-2005 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_UNISTD_H#include <unistd.h>#endif#include <errno.h>#include <string.h>#include "opal/class/opal_list.h"#include "opal/util/output.h"#include "opal/util/argv.h"#include "opal/mca/mca.h"#include "opal/mca/base/base.h"#include "opal/util/show_help.h"#include "orte/orte_constants.h"#include "orte/util/sys_info.h"#include "orte/mca/ns/ns.h"#include "orte/mca/errmgr/errmgr.h"#include "orte/mca/ras/ras.h"#include "orte/mca/ras/base/ras_private.h"#include "orte/runtime/runtime_types.h"#include "orte/mca/rds/rds.h"#include "orte/mca/rds/base/rds_private.h"#include "orte/mca/rds/hostfile/rds_hostfile.h"#include "orte/mca/rds/hostfile/rds_hostfile_lex.h"static bool orte_rds_hostfile_queried = false;static orte_cellid_t local_cellid;static bool need_cellid = true;static char *cur_hostfile_name = NULL;static void orte_rds_hostfile_parse_error(int token){ switch (token) { case ORTE_RDS_HOSTFILE_STRING: opal_show_help("help-rds-hostfile.txt", "rds:parse_error_string", true, cur_hostfile_name, orte_rds_hostfile_line, token, orte_rds_hostfile_value.sval); break; case ORTE_RDS_HOSTFILE_IPV4: case ORTE_RDS_HOSTFILE_INT: opal_show_help("help-rds-hostfile.txt", "rds:parse_error_int", true, cur_hostfile_name, orte_rds_hostfile_line, token, orte_rds_hostfile_value.ival); break; default: opal_show_help("help-rds-hostfile.txt", "rds:parse_error", true, cur_hostfile_name, orte_rds_hostfile_line, token ); break; }} /** * Return the integer following an = (actually may only return positive ints) */static int orte_rds_hostfile_parse_int(void){ if (ORTE_RDS_HOSTFILE_EQUAL != orte_rds_hostfile_lex()) return -1; if (ORTE_RDS_HOSTFILE_INT != orte_rds_hostfile_lex()) return -1; return orte_rds_hostfile_value.ival;}/** * Return the string following an = (option to a keyword) */static char * orte_rds_hostfile_parse_string(void){ int rc; if (ORTE_RDS_HOSTFILE_EQUAL != orte_rds_hostfile_lex()) return NULL; rc = orte_rds_hostfile_lex(); if (ORTE_RDS_HOSTFILE_STRING != rc) return NULL; return strdup(orte_rds_hostfile_value.sval);}static orte_ras_node_t* orte_rds_hostfile_lookup(opal_list_t* nodes, const char* name){ opal_list_item_t* item; for(item = opal_list_get_first(nodes); item != opal_list_get_end(nodes); item = opal_list_get_next(item)) { orte_ras_node_t* node = (orte_ras_node_t*)item; if(strcmp(node->node_name, name) == 0) { opal_list_remove_item(nodes, item); return node; } } return NULL;}static int orte_rds_hostfile_parse_line(int token, opal_list_t* existing, opal_list_t* updates){ char buff[64]; int rc; orte_ras_node_t* node; bool update = false; bool got_count = false; bool got_max = false; if (ORTE_RDS_HOSTFILE_STRING == token || ORTE_RDS_HOSTFILE_HOSTNAME == token || ORTE_RDS_HOSTFILE_INT == token || ORTE_RDS_HOSTFILE_IPV4 == token) { char* value; char** argv; char* node_name = NULL; char* username = NULL; int cnt; if(ORTE_RDS_HOSTFILE_INT == token) { sprintf(buff,"%d", orte_rds_hostfile_value.ival); value = buff; } else { value = orte_rds_hostfile_value.sval; } argv = opal_argv_split (value, '@'); cnt = opal_argv_count (argv); if (1 == cnt) { node_name = strdup(argv[0]); } else if (2 == cnt) { username = strdup(argv[0]); node_name = strdup(argv[1]); } else { opal_output(0, "WARNING: Unhandeled user@host-combination\n"); /* XXX */ } opal_argv_free (argv); /* convert this into something globally unique */ if(strcmp(node_name, "localhost") == 0) { /* Nodename has been allocated, that is for sure */ free (node_name); node_name = strdup(orte_system_info.nodename); } /* Do we need to make a new node object? First check to see if it's in the existing list. */ if (NULL == (node = orte_rds_hostfile_lookup(existing, node_name))) { /* If it wasn't, see if it's already in the updates list */ if (NULL == (node = orte_rds_hostfile_lookup(updates, node_name))) { node = OBJ_NEW(orte_ras_node_t); node->node_name = node_name; node->node_username = username; node->node_slots = 0;#if 0 /* get a new cellid for this node */ /* JMS Temporarily turned off until cell IDs are properly handled elsewhere in the code */ /* JJH This assumes that each hostname listed should be placed in a new cell. Is this accurate to the design? */ if (ORTE_SUCCESS != (rc = orte_ns.create_cellid(&(node->node_cellid), "UNKNOWN-SITE", node->node_name))) { ORTE_ERROR_LOG(rc); return rc; }#endif } /* Note that we need to set update to true regardless of whether the node was found on the updates list or not. If it was found, we just removed it (in orte_rds_hostfile_lookup()), so the update puts it back (potentially after updating it, of course). If it was not found, then we have a new node instance that needs to be added to the updates list. */ update = true; } else { /* If it was in the existing list, then we can use its cellid * to add the reset of the hosts in the file to. */ local_cellid = node->node_cellid; need_cellid = false; } } else { orte_rds_hostfile_parse_error(token); return ORTE_ERROR; } got_count = false; while (!orte_rds_hostfile_done) { token = orte_rds_hostfile_lex(); switch (token) { case ORTE_RDS_HOSTFILE_DONE: goto done; case ORTE_RDS_HOSTFILE_NEWLINE: goto done; case ORTE_RDS_HOSTFILE_USERNAME: node->node_username = orte_rds_hostfile_parse_string(); break; case ORTE_RDS_HOSTFILE_COUNT: case ORTE_RDS_HOSTFILE_CPU: case ORTE_RDS_HOSTFILE_SLOTS: rc = orte_rds_hostfile_parse_int(); if (rc < 0) { opal_show_help("help-rds-hostfile.txt", "rds:slots", true, cur_hostfile_name, rc); OBJ_RELEASE(node); return ORTE_ERROR; } node->node_slots += rc; update = true; got_count = true; /* Ensure that node_slots_max >= node_slots */ if (node->node_slots_max != 0 && node->node_slots_max < node->node_slots) { node->node_slots_max = node->node_slots; } break; case ORTE_RDS_HOSTFILE_SLOTS_MAX: rc = orte_rds_hostfile_parse_int(); if (rc < 0) { opal_show_help("help-rds-hostfile.txt", "rds:max_slots", true, cur_hostfile_name, ((size_t) rc)); OBJ_RELEASE(node); return ORTE_ERROR; } /* Only take this update if it puts us >= node_slots */ if (rc >= node->node_slots) { if (node->node_slots_max != rc) { node->node_slots_max = rc; update = true; got_max = true; } } else { opal_show_help("help-rds-hostfile.txt", "rds:max_slots_lt", true, cur_hostfile_name, node->node_slots, rc); ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM); OBJ_RELEASE(node);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -