42ec26e640
This commit was SVN r7999.
133 строки
3.8 KiB
C
133 строки
3.8 KiB
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"
|
|
|
|
#include "opal/util/output.h"
|
|
#include "opal/util/argv.h"
|
|
#include "orte/include/orte_constants.h"
|
|
#include "orte/include/orte_types.h"
|
|
#include "orte/mca/ras/base/base.h"
|
|
#include "orte/mca/ras/base/ras_base_node.h"
|
|
#include "orte/mca/rmgr/base/base.h"
|
|
#include "orte/mca/ras/base/ras_base_node.h"
|
|
#include "orte/mca/errmgr/errmgr.h"
|
|
|
|
#include "orte/mca/ras/hostfile/ras_hostfile.h"
|
|
|
|
|
|
/*
|
|
* Local functions
|
|
*/
|
|
static int orte_ras_hostfile_allocate(orte_jobid_t jobid);
|
|
static int orte_ras_hostfile_deallocate(orte_jobid_t jobid);
|
|
static int orte_ras_hostfile_finalize(void);
|
|
|
|
|
|
/*
|
|
* Local variables
|
|
*/
|
|
orte_ras_base_module_t orte_ras_hostfile_module = {
|
|
orte_ras_hostfile_allocate,
|
|
orte_ras_base_node_insert,
|
|
orte_ras_base_node_query,
|
|
orte_ras_hostfile_deallocate,
|
|
orte_ras_hostfile_finalize
|
|
};
|
|
|
|
|
|
orte_ras_base_module_t *orte_ras_hostfile_init(int* priority)
|
|
{
|
|
*priority = mca_ras_hostfile_component.priority;
|
|
return &orte_ras_hostfile_module;
|
|
}
|
|
|
|
|
|
/*
|
|
* THIS FUNCTION NEEDS TO CHANGE POST-1.0.
|
|
*
|
|
* After 1.0, this function, and the rds/hostfile need to change to
|
|
* clean up properly. They're not "broken" right now, so we're not
|
|
* fixing them. But they're implemented wrong, so they should be
|
|
* adapted to the model that they're supposed to implement, not the
|
|
* workarounds that they currently have. The end result will be much,
|
|
* much cleaner.
|
|
*
|
|
* Specifically, the rds/hostfile currently puts all of its nodes on
|
|
* the resource segment *and* the node segment. It should not. It
|
|
* should only put its nodes on the resource segment, appropriately
|
|
* tagged that they came from a hostfile. The ras/hostfile should
|
|
* then examine the resources segment and pull out all nodes that came
|
|
* from a hostfile and put them on the nodes segment.
|
|
*/
|
|
static int orte_ras_hostfile_allocate(orte_jobid_t jobid)
|
|
{
|
|
opal_list_t nodes;
|
|
opal_list_item_t* item;
|
|
int rc;
|
|
|
|
OBJ_CONSTRUCT(&nodes, opal_list_t);
|
|
|
|
/* Query for all nodes in the node segment that have been
|
|
allocated to this job */
|
|
if (ORTE_SUCCESS != (rc = orte_ras_base_node_query_alloc(&nodes, jobid))) {
|
|
goto cleanup;
|
|
}
|
|
|
|
/* If there are nodes allocated, then query for *all* nodes */
|
|
if (opal_list_is_empty(&nodes)) {
|
|
if (ORTE_SUCCESS != (rc = orte_ras_base_node_query(&nodes))) {
|
|
goto cleanup;
|
|
}
|
|
|
|
/* If there are any nodes at all, allocate them all to this job */
|
|
if (!opal_list_is_empty(&nodes)) {
|
|
rc = orte_ras_base_allocate_nodes(jobid, &nodes);
|
|
goto cleanup;
|
|
}
|
|
}
|
|
|
|
cleanup:
|
|
while (NULL != (item = opal_list_remove_first(&nodes))) {
|
|
OBJ_RELEASE(item);
|
|
}
|
|
OBJ_DESTRUCT(&nodes);
|
|
|
|
return rc;
|
|
}
|
|
|
|
|
|
static int orte_ras_hostfile_deallocate(orte_jobid_t jobid)
|
|
{
|
|
/* Nothing to do */
|
|
|
|
opal_output(orte_ras_base.ras_output,
|
|
"ras:hostfile:deallocate: success (nothing to do)");
|
|
return ORTE_SUCCESS;
|
|
}
|
|
|
|
|
|
static int orte_ras_hostfile_finalize(void)
|
|
{
|
|
/* Nothing to do */
|
|
|
|
opal_output(orte_ras_base.ras_output,
|
|
"ras:hostfile:finalize: success (nothing to do)");
|
|
return ORTE_SUCCESS;
|
|
}
|