1
1

A bit of cleanup in the pretty_printing, making it a bit more sane.

Since we don't properly handle connecting/disconecting from multiple
universes, only connect to the first one (or the user specified one).
This is a bug that needs to be fixed, but involves some deep magic in
ORTE.

Print the node segment upon request (-n option). 
{{{
Node Name | Arch | Cell ID |   State | Slots | Slots Max | 
-----------------------------------------------------------
  odin001 |      |       0 | Unknown |     2 |         4 | 
  odin002 |      |       0 | Unknown |     2 |         5 | 
  odin003 |      |       0 | Unknown |     2 |         6 | 
  odin004 |      |       0 | Unknown |     2 |         7 | 
}}}

Since node_slots_alloc and node_slots_inuse are not properly updated
in the GPR don't print those values.

This commit was SVN r10633.
Этот коммит содержится в:
Josh Hursey 2006-07-03 17:11:02 +00:00
родитель fc72eb4a01
Коммит 38df31e488

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

@ -71,6 +71,10 @@
#include "orte/mca/snapc/base/base.h" #include "orte/mca/snapc/base/base.h"
#endif #endif
#include "orte/mca/rmgr/base/base.h" #include "orte/mca/rmgr/base/base.h"
#include "orte/mca/ras/ras.h"
#include "orte/mca/ras/ras_types.h"
#include "orte/mca/ras/base/base.h"
#include "orte/mca/ras/base/ras_base_node.h"
#include "opal/runtime/opal.h" #include "opal/runtime/opal.h"
#if OPAL_ENABLE_FT == 1 #if OPAL_ENABLE_FT == 1
@ -167,6 +171,9 @@ struct orte_ps_universe_info_t {
/** List of Jobs */ /** List of Jobs */
opal_list_t job_list; opal_list_t job_list;
/** List of nodes on orte-node segment */
opal_list_t nodes;
}; };
typedef struct orte_ps_universe_info_t orte_ps_universe_info_t; typedef struct orte_ps_universe_info_t orte_ps_universe_info_t;
@ -190,8 +197,18 @@ static int parse_args(int argc, char *argv[]);
static int connect_to_universe(orte_universe_t universe_info); static int connect_to_universe(orte_universe_t universe_info);
static int gather_information(orte_ps_universe_info_t* universe); static int gather_information(orte_ps_universe_info_t* universe);
static int gather_active_jobs(orte_ps_universe_info_t* universe);
static int gather_nodes(orte_ps_universe_info_t* universe);
static int gather_job_info(orte_ps_universe_info_t* universe);
static int gather_vpid_info(orte_ps_universe_info_t* universe);
static int pretty_print(orte_ps_universe_info_t* universe); static int pretty_print(orte_ps_universe_info_t* universe);
static int pretty_print_nodes(opal_list_t *nodes);
static int pretty_print_jobs(opal_list_t *jobs);
static int pretty_print_vpids(orte_ps_job_info_t *job);
static char *pretty_univ_state(orte_universe_state_t state);
static char *pretty_node_state(orte_node_state_t state);
static char *pretty_job_state(orte_job_state_t state); static char *pretty_job_state(orte_job_state_t state);
static char *pretty_vpid_state(orte_proc_state_t state); static char *pretty_vpid_state(orte_proc_state_t state);
@ -206,6 +223,7 @@ typedef struct {
int vpid; int vpid;
bool gpr_dump; bool gpr_dump;
bool attached; bool attached;
bool nodes;
} orte_ps_globals_t; } orte_ps_globals_t;
orte_ps_globals_t orte_ps_globals; orte_ps_globals_t orte_ps_globals;
@ -247,6 +265,12 @@ opal_cmd_line_init_t cmd_line_opts[] = {
&orte_ps_globals.vpid, OPAL_CMD_LINE_TYPE_INT, &orte_ps_globals.vpid, OPAL_CMD_LINE_TYPE_INT,
"Specify a specific vpid. Must specify a --jobid as well" }, "Specify a specific vpid. Must specify a --jobid as well" },
{ NULL, NULL, NULL,
'n', NULL, "nodes",
0,
&orte_ps_globals.nodes, OPAL_CMD_LINE_TYPE_INT,
"Print Node Information" },
/* End of list */ /* End of list */
{ NULL, NULL, NULL, { NULL, NULL, NULL,
'\0', NULL, NULL, '\0', NULL, NULL,
@ -373,6 +397,13 @@ main(int argc, char *argv[])
goto cleanup; goto cleanup;
} }
} }
/*
* Since connecting and disconnecting from a universe is
* not well defined, only allow connection to the first
* universe found.
*/
break;
} }
/*************** /***************
@ -402,7 +433,14 @@ static int parse_args(int argc, char *argv[]) {
int i, ret, len; int i, ret, len;
opal_cmd_line_t cmd_line; opal_cmd_line_t cmd_line;
char **app_env = NULL, **global_env = NULL; char **app_env = NULL, **global_env = NULL;
orte_ps_globals_t tmp = { false, false, NULL, -1, -1, false}; orte_ps_globals_t tmp = { false,
false,
NULL,
-1,
-1,
false,
false,
false};
/* Parse the command line options */ /* Parse the command line options */
@ -523,310 +561,460 @@ static int orte_ps_init(void) {
} }
static int pretty_print(orte_ps_universe_info_t* universe) { static int pretty_print(orte_ps_universe_info_t* universe) {
opal_list_item_t* job_item = NULL;
opal_list_item_t* vpid_item = NULL;
int len_opn = 0,
len_pn = 0,
len_r = 0,
len_p = 0,
len_s = 0,
#if OPAL_ENABLE_FT == 1
len_cs = 0,
len_cr = 0,
len_cl = 0,
#endif
len_n = 0;
int i, line_len; int i, line_len;
int len_name = 0,
len_host = 0,
len_uid = 0,
len_scope = 0,
len_per = 0,
len_state = 0;
printf("------------------------------------------------------\n"); /*
printf("------------------------------------------------------\n"); * Calculate segment lengths
printf("%*s | ", (int)strlen(universe->universe_info.name) , "Universe Name"); */
printf("%*s | ", (int)strlen(universe->universe_info.host) , "Hostname"); len_name = (int) (strlen(universe->universe_info.name) < strlen("Universe Name") ?
printf("%*s | ", (int)strlen(universe->universe_info.uid) , "uid"); strlen("Universe Name") :
printf("%*s | ", 11 , "Persistent"); strlen(universe->universe_info.name) );
printf("%*s | ", (int)strlen(universe->universe_info.scope) , "Scope"); len_host = (int) (strlen(universe->universe_info.host) < strlen("Hostname") ?
printf(" State"); strlen("Hostname") :
strlen(universe->universe_info.host));
len_uid = (int) (strlen(universe->universe_info.uid) < strlen("UID") ?
strlen("UID") :
strlen(universe->universe_info.uid));
len_per = (int) strlen("Persistent");
len_scope = (int) (strlen(universe->universe_info.scope) < strlen("Scope") ?
strlen("Scope") :
strlen(universe->universe_info.scope));
len_state = (int) (strlen(pretty_univ_state(universe->universe_info.state)) < strlen("State") ?
strlen("State") :
strlen(pretty_univ_state(universe->universe_info.state)) );
line_len = (len_name + 3 +
len_host + 3 +
len_uid + 3 +
len_per + 3 +
len_scope + 3 +
len_state) + 3 ;
/*
* Print header
*/
printf("%*s | ", len_name , "Universe Name");
printf("%*s | ", len_host , "Hostname");
printf("%*s | ", len_uid , "UID");
printf("%*s | ", len_per , "Persistent");
printf("%*s | ", len_scope, "Scope");
printf("%*s |" , len_state, "State");
printf("\n"); printf("\n");
line_len = (strlen(universe->universe_info.name) + 3 +
strlen(universe->universe_info.host) + 3 +
strlen(universe->universe_info.uid) + 3 +
11 + 3 +
strlen(universe->universe_info.scope) + 3 +
6 + 3);
for(i = 0; i < line_len; ++i) { for(i = 0; i < line_len; ++i) {
printf("-"); printf("-");
} }
printf("\n"); printf("\n");
printf("%s | ", universe->universe_info.name); /*
printf("%s | ", universe->universe_info.host); * Print Info
printf("%s | ", universe->universe_info.uid); */
printf("%*s | ", len_name, universe->universe_info.name);
printf("%*s | ", len_host, universe->universe_info.host);
printf("%*s | ", len_uid, universe->universe_info.uid);
if(universe->universe_info.persistence) if(universe->universe_info.persistence)
printf("%*s | ", 11, "true"); printf("%*s | ", len_per, "true");
else else
printf("%*s | ", 11, "false"); printf("%*s | ", len_per, "false");
printf("%*s | ", len_scope, universe->universe_info.scope);
printf("%s | ", universe->universe_info.scope); printf("%*s |", len_state, pretty_univ_state(universe->universe_info.state));
switch(universe->universe_info.state) {
case ORTE_UNIVERSE_STATE_PRE_INIT:
printf("Pre-Init");
break;
case ORTE_UNIVERSE_STATE_INIT:
printf("Initializing");
break;
case ORTE_UNIVERSE_STATE_RUNNING:
printf("Running");
break;
case ORTE_UNIVERSE_STATE_FINALIZE:
printf("Finalized");
break;
default:
printf("Unknown");
break;
}
printf("\n"); printf("\n");
#if 0
printf("\tSeed URI :\t %s\n", universe->universe_info.seed_uri);
printf("\tScriptfile :\t %s\n", universe->universe_info.scriptfile);
#endif
printf("\n"); printf("\n");
/* /*
* Print job information * Print Node Information
*/ */
for(job_item = opal_list_get_first(&(universe->job_list)); if( orte_ps_globals.nodes )
job_item != opal_list_get_end(&(universe->job_list)); pretty_print_nodes(&universe->nodes);
/*
* Print Job Information
*/
pretty_print_jobs(&universe->job_list);
return ORTE_SUCCESS;
}
static int pretty_print_nodes(opal_list_t *nodes) {
opal_list_item_t* node_item = NULL;
int i, line_len;
int len_name = 0,
len_arch = 0,
len_cell = 0,
len_state = 0,
len_slots = 0,
len_slots_i = 0,
len_slots_a = 0,
len_slots_m = 0;
/*
* Caculate segment lengths
*/
len_name = (int) strlen("Node Name");
len_arch = (int) strlen("Arch");
len_cell = (int) strlen("Cell ID");
len_state = (int) strlen("State");
len_slots = (int) strlen("Slots");
len_slots_i = (int) strlen("Slots In Use");
len_slots_a = (int) strlen("Slots Alloc");
len_slots_m = (int) strlen("Slots Max");
for(node_item = opal_list_get_first(nodes);
node_item != opal_list_get_end(nodes);
node_item = opal_list_get_next(node_item) ) {
orte_ras_node_t *node;
node = (orte_ras_node_t *)node_item;
if( NULL != node->node_name &&
(int)strlen(node->node_name) > len_name)
len_name = (int) strlen(node->node_name);
if( NULL != node->node_arch &&
(int)strlen(node->node_arch) > len_arch)
len_arch = (int) strlen(node->node_arch);
if( (int)strlen(pretty_node_state(node->node_state)) > len_state )
len_state = (int)strlen(pretty_node_state(node->node_state));
}
/*
* JJH Since node_slots_inuse and node_slots_alloc are not used properly
* JJH do not display them to the user.
*/
line_len = (len_name + 3 +
len_arch + 3 +
len_cell + 3 +
len_state + 3 +
len_slots + 3 +
#if 0
len_slots_i + 3 +
len_slots_a + 3 +
#endif
len_slots_m + 3);
/*
* Print the header
*/
printf("%*s | ", len_name, "Node Name");
printf("%*s | ", len_arch, "Arch");
printf("%*s | ", len_cell, "Cell ID");
printf("%*s | ", len_state, "State");
printf("%*s | ", len_slots, "Slots");
printf("%*s | ", len_slots_m, "Slots Max");
#if 0
printf("%*s | ", len_slots_i, "Slots In Use");
printf("%*s | ", len_slots_a, "Slots Alloc");
#endif
printf("\n");
for(i = 0; i < line_len; ++i) {
printf("-");
}
printf("\n");
/*
* Print Info
*/
for(node_item = opal_list_get_first(nodes);
node_item != opal_list_get_end(nodes);
node_item = opal_list_get_next(node_item) ) {
orte_ras_node_t *node;
node = (orte_ras_node_t *)node_item;
printf("%*s | ", len_name, node->node_name);
printf("%*s | ", len_arch, (NULL == node->node_arch ?
"" :
node->node_arch));
printf("%*d | ", len_cell, node->node_cellid);
printf("%*s | ", len_state, pretty_node_state(node->node_state));
printf("%*d | ", len_slots, (uint)node->node_slots);
printf("%*d | ", len_slots_m, (uint)node->node_slots_max);
#if 0
printf("%*d | ", len_slots_i, (uint)node->node_slots_inuse);
printf("%*d | ", len_slots_a, (uint)node->node_slots_alloc);
#endif
printf("\n");
}
return ORTE_SUCCESS;
}
static int pretty_print_jobs(opal_list_t *jobs) {
opal_list_item_t* job_item = NULL;
int len_jobid = 0,
len_state = 0,
len_slots = 0,
len_vpid_s = 0,
len_vpid_r = 0,
len_ckpt_s = 0,
len_ckpt_r = 0,
len_ckpt_l = 0;
int i, line_len;
for(job_item = opal_list_get_first(jobs);
job_item != opal_list_get_end(jobs);
job_item = opal_list_get_next(job_item) ) { job_item = opal_list_get_next(job_item) ) {
orte_ps_job_info_t *job; orte_ps_job_info_t *job;
job = (orte_ps_job_info_t *)job_item; job = (orte_ps_job_info_t *)job_item;
printf("\n"); /*
printf("%*s | ", 6 , "JobID"); * Caculate segment lengths
printf("%*s | ", (int)strlen(pretty_job_state(job->state)) , "State"); */
printf("%*s | ", 6 , "Slots"); len_jobid = 6;
printf("%*s | ", 10 , "VPID start"); len_state = (int) (strlen(pretty_job_state(job->state)) < strlen("State") ?
printf("%*s | ", 10 , "VPID range"); strlen("State") :
#if 0 strlen(pretty_job_state(job->state)));
printf("%*s | ", 10 , "Num Init"); len_slots = 6;
printf("%*s | ", 10 , "Num Launched"); len_vpid_s = (int) strlen("VPID Start");
printf("%*s | ", 10 , "Num Running"); len_vpid_r = (int) strlen("VPID Range");
printf("%*s | ", 10 , "Num Finalized");
printf("%*s | ", 10 , "Num Terminated");
printf("%*s | ", 10 , "Num aborted");
#endif
#if OPAL_ENABLE_FT == 1 #if OPAL_ENABLE_FT == 1
printf("%*s | ", (int)strlen(orte_snapc_ckpt_state_str(job->ckpt_state)) , "Ckpt State"); len_ckpt_s = (int) (strlen(orte_snapc_ckpt_state_str(job->ckpt_state)) < strlen("Ckpt State") ?
printf("%*s | ", (int)(NULL == job->ckpt_ref ? strlen("Ckpt Ref") : strlen(job->ckpt_ref)) , "Ckpt Ref"); strlen("Ckpt State") ?
printf("%*s", (int)(NULL == job->ckpt_loc ? strlen("Ckpt Loc") : strlen(job->ckpt_loc)) , "Ckpt Loc"); strlen(orte_snapc_ckpt_state_str(job->ckpt_state)) );
len_ckpt_r = (int) (NULL == job->ckpt_ref ? strlen("Ckpt Ref") :
(strlen(job->ckpt_ref) < strlen("Ckpt Ref") ?
strlen("Ckpt Ref") ?
strlen(job->ckpt_ref) ) );
len_ckpt_l = (int) (NULL == job->ckpt_loc ? strlen("Ckpt Loc") :
(strlen(job->ckpt_loc) < strlen("Ckpt Loc") ?
strlen("Ckpt Loc") ?
strlen(job->ckpt_loc) ) );
#else
len_ckpt_s = 0;
len_ckpt_r = 0;
len_ckpt_l = 0;
#endif
line_len = (len_jobid + 3 +
len_state + 3 +
len_slots + 3 +
len_vpid_s + 3 +
len_vpid_r + 3 +
len_ckpt_s + 3 +
len_ckpt_r + 3 +
len_ckpt_l
#if OPAL_ENABLE_FT != 1
- 6
#endif
);
/*
* Print Header
*/
printf("\n");
printf("%*s | ", len_jobid , "JobID");
printf("%*s | ", len_state , "State");
printf("%*s | ", len_slots , "Slots");
printf("%*s | ", len_vpid_s , "VPID Start");
printf("%*s | ", len_vpid_r , "VPID Range");
#if OPAL_ENABLE_FT == 1
printf("%*s | ", len_ckpt_s , "Ckpt State");
printf("%*s | ", len_ckpt_r , "Ckpt Ref");
printf("%*s |", len_ckpt_l , "Ckpt Loc");
#endif #endif
printf("\n"); printf("\n");
line_len = (6 + 3 +
strlen(pretty_job_state(job->state)) + 3 +
6 + 3 +
10 + 3 +
10 + 3 +
#if OPAL_ENABLE_FT == 1
(strlen(orte_snapc_ckpt_state_str(job->ckpt_state)) < strlen("Ckpt State") ?
strlen("Ckpt State") :
strlen(orte_snapc_ckpt_state_str(job->ckpt_state))) + 3 +
(NULL == job->ckpt_ref || strlen(job->ckpt_ref) < strlen("Ckpt Ref") ?
strlen("Ckpt Ref") :
strlen(job->ckpt_ref)) + 3 +
(NULL == job->ckpt_loc || strlen(job->ckpt_loc) < strlen("Ckpt Loc") ?
strlen("Ckpt Loc") :
strlen(job->ckpt_loc)) + 3
#else
0
#endif
);
for(i = 0; i < line_len; ++i) { for(i = 0; i < line_len; ++i) {
printf("-"); printf("-");
} }
printf("\n"); printf("\n");
printf("%*d | ", 6, job->id); /*
printf("%s | ", pretty_job_state(job->state)); * Print Info
printf("%*d | ", 6, (uint)job->slots); */
printf("%*d | ", 10, job->vpid_start); printf("%*d | ", len_jobid , job->id);
printf("%*d | ", 10, job->vpid_range); printf("%*s | ", len_state , pretty_job_state(job->state));
#if 0 printf("%*d | ", len_slots , (uint)job->slots);
printf("%*lu | ", 10, job->num_init); printf("%*d | ", len_vpid_s, job->vpid_start);
printf("%*lu | ", 10, job->num_launched); printf("%*d | ", len_vpid_r, job->vpid_range);
printf("%*lu | ", 10, job->num_running);
printf("%*lu | ", 10, job->num_finalized);
printf("%*lu | ", 10, job->num_terminated);
printf("%*lu | ", 10, job->num_aborted);
#endif
#if OPAL_ENABLE_FT == 1 #if OPAL_ENABLE_FT == 1
printf("%*s | ", printf("%*s | ", len_ckpt_s, orte_snapc_ckpt_state_str(job->ckpt_state));
(strlen("Ckpt State") > strlen(orte_snapc_ckpt_state_str(job->ckpt_state)) ? printf("%*s | ", len_ckpt_r, (NULL == job->ckpt_ref ?
(int)strlen("Ckpt State") : (int)strlen(orte_snapc_ckpt_state_str(job->ckpt_state)) ), "" :
orte_snapc_ckpt_state_str(job->ckpt_state)); job->ckpt_ref) );
if( NULL == job->ckpt_ref ) { printf("%*s |", len_ckpt_l, (NULL == job->ckpt_loc ?
printf("%*s", (int)strlen("Ckpt Ref"), ""); "" :
} job->ckpt_loc) );
else {
printf("%*s",
(strlen("Ckpt Ref") > strlen(job->ckpt_ref) ?
(int)strlen("Ckpt Ref") : (int)strlen(job->ckpt_ref) ),
job->ckpt_ref);
}
printf(" | ");
if( NULL == job->ckpt_loc ) {
printf("%*s", (int)strlen("Ckpt Loc"), "");
}
else {
printf("%*s",
(strlen("Ckpt Loc") > strlen(job->ckpt_loc) ?
(int)strlen("Ckpt Loc") : (int)strlen(job->ckpt_loc) ),
job->ckpt_loc);
}
#endif #endif
printf("\n"); printf("\n");
/*
* Pretty print all VPID's in job
*/
if(0 == job->id) { /* No vpids for the HNP */ if(0 == job->id) { /* No vpids for the HNP */
continue; continue;
} }
/* pretty_print_vpids(job);
* For each VPID in the job }
*/
/* First time through to get the max len */ return ORTE_SUCCESS;
len_pn = strlen("Process Name"); }
len_opn = strlen("ORTE Name");
len_r = 6; static int pretty_print_vpids(orte_ps_job_info_t *job) {
len_p = 6; opal_list_item_t* vpid_item = NULL;
len_s = 0; int len_o_proc_name = 0,
len_proc_name = 0,
len_rank = 0,
len_pid = 0,
len_state = 0,
len_node = 0,
len_ckpt_s = 0,
len_ckpt_r = 0,
len_ckpt_l = 0;
int i, line_len;
/*
* Caculate segment lengths
*/
len_o_proc_name = strlen("ORTE Name");
len_proc_name = strlen("Process Name");
len_rank = 6;
len_pid = 6;
len_state = 0;
len_node = 0;
#if OPAL_ENABLE_FT == 1 #if OPAL_ENABLE_FT == 1
len_cs = strlen("Ckpt State"); len_ckpt_s = strlen("Ckpt State");
len_cr = strlen("Ckpt Ref"); len_ckpt_r = strlen("Ckpt Ref");
len_cl = strlen("Ckpt Loc"); len_ckpt_l = strlen("Ckpt Loc");
#endif
for(vpid_item = opal_list_get_first(&(job->vpid_list));
vpid_item != opal_list_get_end(&(job->vpid_list));
vpid_item = opal_list_get_next(vpid_item) ) {
orte_ps_vpid_info_t *vpid;
char *proc_name = NULL;
vpid = (orte_ps_vpid_info_t *)vpid_item;
/*
* Find my app context
*/
for( i = 0; i < (int)job->num_app_context; ++i) {
if( job->app_context[i]->idx == vpid->app_context_idx ) {
if( (int)strlen(job->app_context[i]->app) > len_pn)
len_pn = strlen(job->app_context[i]->app);
break;
}
}
asprintf(&proc_name, "%d.%d.%d", vpid->name.cellid, vpid->name.jobid, vpid->name.vpid);
if( (int)strlen(proc_name) > len_opn )
len_opn = strlen(proc_name);
if( (int)strlen(vpid->node) > len_n)
len_n = strlen(vpid->node);
if( (int)strlen(pretty_vpid_state(vpid->state)) > len_s)
len_s = strlen(pretty_vpid_state(vpid->state));
#if OPAL_ENABLE_FT == 1
if( (int)strlen(orte_snapc_ckpt_state_str(vpid->ckpt_state)) > len_cs)
len_cs = strlen(orte_snapc_ckpt_state_str(vpid->ckpt_state));
if( NULL != vpid->ckpt_ref &&
(int)strlen(vpid->ckpt_ref) > len_cr)
len_cr = strlen(vpid->ckpt_ref);
if( NULL != vpid->ckpt_loc &&
(int)strlen(vpid->ckpt_loc) > len_cl)
len_cl = strlen(vpid->ckpt_loc);
#endif
if( NULL != proc_name) {
free(proc_name);
proc_name = NULL;
}
}
printf("\t");
printf("%*s | ", len_pn , "Process Name");
printf("%*s | ", len_opn, "ORTE Name");
printf("%*s | ", len_r , "Rank");
printf("%*s | ", len_p , "PID");
printf("%*s | ", len_n , "Node");
printf("%*s | ", len_s , "State");
#if OPAL_ENABLE_FT == 1
printf("%*s | ", len_cs , "Ckpt State");
printf("%*s | ", len_cr , "Ckpt Ref");
printf("%*s", len_cl , "Ckpt Loc");
#endif
printf("\n");
line_len = (len_pn + 3 +
len_opn + 3 +
len_r + 3 +
len_p + 3 +
len_s + 3 +
len_n + 3 +
#if OPAL_ENABLE_FT == 1
len_cs + 3 +
len_cr + 3 +
len_cl + 3
#else #else
0 len_ckpt_s = 0;
len_ckpt_r = 0;
len_ckpt_l = 0;
#endif #endif
);
printf("\t"); for(vpid_item = opal_list_get_first(&(job->vpid_list));
for(i = 0; i < line_len; ++i) { vpid_item != opal_list_get_end(&(job->vpid_list));
printf("-"); vpid_item = opal_list_get_next(vpid_item) ) {
orte_ps_vpid_info_t *vpid;
char *proc_name = NULL;
vpid = (orte_ps_vpid_info_t *)vpid_item;
/*
* Find my app context
*/
for( i = 0; i < (int)job->num_app_context; ++i) {
if( job->app_context[i]->idx == vpid->app_context_idx ) {
if( (int)strlen(job->app_context[i]->app) > len_proc_name)
len_proc_name = strlen(job->app_context[i]->app);
break;
}
} }
printf("\n");
asprintf(&proc_name, "%d.%d.%d", vpid->name.cellid, vpid->name.jobid, vpid->name.vpid);
for(vpid_item = opal_list_get_first(&(job->vpid_list)); if( (int)strlen(proc_name) > len_o_proc_name )
vpid_item != opal_list_get_end(&(job->vpid_list)); len_o_proc_name = strlen(proc_name);
vpid_item = opal_list_get_next(vpid_item) ) {
orte_ps_vpid_info_t *vpid; if( (int)strlen(vpid->node) > len_node)
char *proc_name = NULL; len_node = strlen(vpid->node);
vpid = (orte_ps_vpid_info_t *)vpid_item;
if( (int)strlen(pretty_vpid_state(vpid->state)) > len_state)
asprintf(&proc_name, "%d.%d.%d", vpid->name.cellid, vpid->name.jobid, vpid->name.vpid); len_state = strlen(pretty_vpid_state(vpid->state));
printf("\t");
for( i = 0; i < (int)job->num_app_context; ++i) {
if( job->app_context[i]->idx == vpid->app_context_idx ) {
printf("%*s | ", len_pn, job->app_context[i]->app);
break;
}
}
printf("%*s | ", len_opn, proc_name);
printf("%*d | ", len_r, (uint)vpid->rank);
printf("%*d | ", len_p, vpid->pid);
printf("%*s | ", len_n, vpid->node);
printf("%s | ", pretty_vpid_state(vpid->state));
#if OPAL_ENABLE_FT == 1 #if OPAL_ENABLE_FT == 1
printf("%*s | ", len_cs, orte_snapc_ckpt_state_str(vpid->ckpt_state)); if( (int)strlen(orte_snapc_ckpt_state_str(vpid->ckpt_state)) > len_ckpt_s)
printf("%*s | ", len_cr, (NULL == vpid->ckpt_ref ? "" : vpid->ckpt_ref)); len_ckpt_s = strlen(orte_snapc_ckpt_state_str(vpid->ckpt_state));
printf("%*s", len_cl, (NULL == vpid->ckpt_loc ? "" : vpid->ckpt_loc));
if( NULL != vpid->ckpt_ref &&
(int)strlen(vpid->ckpt_ref) > len_ckpt_r)
len_ckpt_r = strlen(vpid->ckpt_ref);
if( NULL != vpid->ckpt_loc &&
(int)strlen(vpid->ckpt_loc) > len_ckpt_l)
len_ckpt_l = strlen(vpid->ckpt_loc);
#endif #endif
printf("\n");
if( NULL != proc_name) { if( NULL != proc_name) {
free(proc_name); free(proc_name);
proc_name = NULL; proc_name = NULL;
}
} }
} }
line_len = (len_o_proc_name + 3 +
len_proc_name + 3 +
len_rank + 3 +
len_pid + 3 +
len_state + 3 +
len_node + 3 +
len_ckpt_s + 3 +
len_ckpt_r + 3 +
len_ckpt_l
#if OPAL_ENABLE_FT != 1
- 6
#endif
);
/*
* Print Header
*/
printf("\t");
printf("%*s | ", len_proc_name , "Process Name");
printf("%*s | ", len_o_proc_name , "ORTE Name");
printf("%*s | ", len_rank , "Rank");
printf("%*s | ", len_pid , "PID");
printf("%*s | ", len_node , "Node");
printf("%*s | ", len_state , "State");
#if OPAL_ENABLE_FT == 1
printf("%*s | ", len_ckpt_s , "Ckpt State");
printf("%*s | ", len_ckpt_r , "Ckpt Ref");
printf("%*s |", len_ckpt_l , "Ckpt Loc");
#endif
printf("\n");
printf("\t");
for(i = 0; i < line_len; ++i) {
printf("-");
}
printf("\n");
/*
* Print Info
*/
for(vpid_item = opal_list_get_first(&(job->vpid_list));
vpid_item != opal_list_get_end(&(job->vpid_list));
vpid_item = opal_list_get_next(vpid_item) ) {
orte_ps_vpid_info_t *vpid;
char *proc_name = NULL;
vpid = (orte_ps_vpid_info_t *)vpid_item;
printf("\t");
asprintf(&proc_name, "%d.%d.%d", vpid->name.cellid, vpid->name.jobid, vpid->name.vpid);
for( i = 0; i < (int)job->num_app_context; ++i) {
if( job->app_context[i]->idx == vpid->app_context_idx ) {
printf("%*s | ", len_proc_name, job->app_context[i]->app);
break;
}
}
printf("%*s | ", len_o_proc_name, proc_name);
printf("%*d | ", len_rank , (uint)vpid->rank);
printf("%*d | ", len_pid , vpid->pid);
printf("%*s | ", len_node , vpid->node);
printf("%*s | ", len_state , pretty_vpid_state(vpid->state));
#if OPAL_ENABLE_FT == 1
printf("%*s | ", len_ckpt_s, orte_snapc_ckpt_state_str(vpid->ckpt_state));
printf("%*s | ", len_ckpt_r, (NULL == vpid->ckpt_ref ?
"" :
vpid->ckpt_ref));
printf("%*s |", len_ckpt_l, (NULL == vpid->ckpt_loc ?
"" :
vpid->ckpt_loc));
#endif
printf("\n");
if( NULL != proc_name) {
free(proc_name);
proc_name = NULL;
}
}
return ORTE_SUCCESS; return ORTE_SUCCESS;
} }
@ -884,11 +1072,6 @@ static int connect_to_universe(orte_universe_t universe_info) {
return exit_status; return exit_status;
} }
static int gather_active_jobs(orte_ps_universe_info_t* universe);
static int gather_nodes(orte_ps_universe_info_t* universe);
static int gather_job_info(orte_ps_universe_info_t* universe);
static int gather_vpid_info(orte_ps_universe_info_t* universe);
static int gather_information(orte_ps_universe_info_t* universe) { static int gather_information(orte_ps_universe_info_t* universe) {
int ret, exit_status = ORTE_SUCCESS; int ret, exit_status = ORTE_SUCCESS;
@ -981,7 +1164,13 @@ static int gather_active_jobs(orte_ps_universe_info_t* universe) {
} }
static int gather_nodes(orte_ps_universe_info_t* universe) { static int gather_nodes(orte_ps_universe_info_t* universe) {
return ORTE_SUCCESS; int ret, exit_status = ORTE_SUCCESS;
if( ORTE_SUCCESS != (ret = orte_ras_base_node_query(&(universe->nodes)))) {
exit_status = ret;
}
return exit_status;
} }
static int gather_job_info(orte_ps_universe_info_t* universe) { static int gather_job_info(orte_ps_universe_info_t* universe) {
@ -1404,6 +1593,7 @@ void orte_ps_job_info_destruct( orte_ps_job_info_t *obj) {
void orte_ps_universe_info_construct(orte_ps_universe_info_t *obj) { void orte_ps_universe_info_construct(orte_ps_universe_info_t *obj) {
OBJ_CONSTRUCT(&obj->job_list, opal_list_t); OBJ_CONSTRUCT(&obj->job_list, opal_list_t);
OBJ_CONSTRUCT(&obj->nodes, opal_list_t);
OBJ_CONSTRUCT(&obj->universe_info, orte_universe_t); OBJ_CONSTRUCT(&obj->universe_info, orte_universe_t);
} }
@ -1414,6 +1604,11 @@ void orte_ps_universe_info_destruct( orte_ps_universe_info_t *obj) {
OBJ_RELEASE(item); OBJ_RELEASE(item);
} }
OBJ_DESTRUCT(&obj->job_list); OBJ_DESTRUCT(&obj->job_list);
while (NULL != (item = opal_list_remove_first(&obj->nodes))) {
OBJ_RELEASE(item);
}
OBJ_DESTRUCT(&obj->nodes);
OBJ_DESTRUCT(&obj->universe_info); OBJ_DESTRUCT(&obj->universe_info);
} }
@ -1489,3 +1684,45 @@ static char *pretty_vpid_state(orte_proc_state_t state) {
return NULL; return NULL;
} }
static char *pretty_univ_state(orte_universe_state_t state) {
switch(state) {
case ORTE_UNIVERSE_STATE_PRE_INIT:
return strdup("Pre-Init");
break;
case ORTE_UNIVERSE_STATE_INIT:
return strdup("Initializing");
break;
case ORTE_UNIVERSE_STATE_RUNNING:
return strdup("Running");
break;
case ORTE_UNIVERSE_STATE_FINALIZE:
return strdup("Finalized");
break;
default:
return strdup("Unknown");
break;
}
return NULL;
}
static char *pretty_node_state(orte_node_state_t state) {
switch(state) {
case ORTE_NODE_STATE_DOWN:
return strdup("Down");
break;
case ORTE_NODE_STATE_UP:
return strdup("Up");
break;
case ORTE_NODE_STATE_REBOOT:
return strdup("Reboot");
break;
case ORTE_NODE_STATE_UNKNOWN:
default:
return strdup("Unknown");
break;
}
return NULL;
}