From d82585cd90da93dbc4dfecacd97659509f72bb1f Mon Sep 17 00:00:00 2001 From: Danny Auble <da@llnl.gov> Date: Fri, 21 May 2010 00:17:31 +0000 Subject: [PATCH] smap is on it's way, jobs and such don't work yet though, but partitions and blocks do --- slurm/slurmdb.h | 4 + src/common/hostlist.c | 214 +++++++++++++-------------- src/common/hostlist.h | 4 + src/common/slurm_protocol_api.h | 1 + src/common/slurmdb_defs.c | 32 ++++ src/common/slurmdb_defs.h | 1 + src/common/slurmdb_pack.c | 2 + src/smap/opts.c | 2 + src/smap/partition_functions.c | 197 +++++++++++-------------- src/smap/smap.c | 254 +++++++++++++++++--------------- src/smap/smap.h | 2 + 11 files changed, 367 insertions(+), 346 deletions(-) diff --git a/slurm/slurmdb.h b/slurm/slurmdb.h index d7b8cb7369e..c9ef4ad1fdc 100644 --- a/slurm/slurmdb.h +++ b/slurm/slurmdb.h @@ -411,6 +411,10 @@ typedef struct { uint32_t control_port; uint32_t cpu_count; uint16_t dimensions; /* number of dimensions this cluster is */ + int *dim_size; /* For convenience only. + * Size of each dimension For now only on + * a bluegene cluster. DOESN'T GET + * PACKED, is set up in slurmdb_get_info_cluster */ uint32_t flags; /* set of CLUSTER_FLAG_* */ char *name; char *nodes; diff --git a/src/common/hostlist.c b/src/common/hostlist.c index a802d136085..f52ca3a4e68 100644 --- a/src/common/hostlist.c +++ b/src/common/hostlist.c @@ -75,6 +75,7 @@ #include "src/common/xmalloc.h" #include "src/common/timers.h" #include "src/common/xassert.h" +#include "src/common/slurmdb_defs.h" /* * Define slurm-specific aliases for use by plugins, see slurm_xlator.h @@ -294,8 +295,6 @@ static int dim_grid_size = -1; /* used to protect the above grid, grid_start, and grid_end. */ static pthread_mutex_t multi_dim_lock = PTHREAD_MUTEX_INITIALIZER; -static int _set_hostlist_base(); -static void _parse_int_to_array(int in, int *out); static int _tell_if_used(int dim, int curr, int *start, int *end, @@ -602,8 +601,7 @@ static int _width_equiv(unsigned long n, int *wn, unsigned long m, int *wm) static int host_prefix_end(const char *hostname) { int idx, len; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); assert(hostname != NULL); @@ -640,9 +638,8 @@ static hostname_t hostname_create(const char *hostname) hostname_t hn = NULL; char *p = '\0'; int idx = 0; - int hostlist_base = _set_hostlist_base(); - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int hostlist_base = hostlist_get_base(); + int dims = slurmdb_setup_cluster_dims(); assert(hostname != NULL); if (!(hn = (hostname_t) malloc(sizeof(*hn)))) @@ -950,8 +947,7 @@ static char *hostrange_pop(hostrange_t hr) { size_t size = 0; char *host = NULL; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); assert(hr != NULL); @@ -968,7 +964,8 @@ static char *hostrange_pop(hostrange_t hr) int i2=0; int coord[dims]; - _parse_int_to_array(hr->hi, coord); + hostlist_parse_int_to_array( + hr->hi, coord, dims, 0); len = snprintf(host, size, "%s", hr->prefix); for(i2 = 0; i2<dims; i2++) { @@ -996,8 +993,7 @@ static char *hostrange_shift(hostrange_t hr) { size_t size = 0; char *host = NULL; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); assert(hr != NULL); @@ -1015,7 +1011,8 @@ static char *hostrange_shift(hostrange_t hr) int i2=0; int coord[dims]; - _parse_int_to_array(hr->lo, coord); + hostlist_parse_int_to_array( + hr->lo, coord, dims, 0); len = snprintf(host, size, "%s", hr->prefix); for(i2 = 0; i2<dims; i2++) { @@ -1171,8 +1168,7 @@ hostrange_to_string(hostrange_t hr, size_t n, char *buf, char *separator) int truncated = 0; int len = 0; char sep = separator == NULL ? ',' : separator[0]; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); if (n == 0) return 0; @@ -1190,7 +1186,8 @@ hostrange_to_string(hostrange_t hr, size_t n, char *buf, char *separator) int i2=0; int coord[dims]; - _parse_int_to_array(i, coord); + hostlist_parse_int_to_array( + i, coord, dims, 0); ret = snprintf(buf+len, m, "%s", hr->prefix); for(i2 = 0; i2<dims; i2++) { if(len+ret < n) @@ -1232,8 +1229,7 @@ hostrange_to_string(hostrange_t hr, size_t n, char *buf, char *separator) static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf) { int len = 0; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); assert(buf != NULL); assert(hr != NULL); @@ -1246,7 +1242,8 @@ static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf) int i2=0; int coord[dims]; - _parse_int_to_array(hr->lo, coord); + hostlist_parse_int_to_array( + hr->lo, coord, dims, 0); for(i2 = 0; i2<dims; i2++) { if(len <= n) @@ -1267,7 +1264,8 @@ static size_t hostrange_numstr(hostrange_t hr, size_t n, char *buf) int i2=0; int coord[dims]; - _parse_int_to_array(hr->hi, coord); + hostlist_parse_int_to_array( + hr->hi, coord, dims, 0); buf[len++] = '-'; for(i2 = 0; i2<dims; i2++) { @@ -1500,7 +1498,7 @@ hostlist_t _hostlist_create(const char *hostlist, char *sep, char *r_op) char prefix[256] = ""; int pos = 0; int error = 0; - int hostlist_base = _set_hostlist_base(); + int hostlist_base = hostlist_get_base(); char range_op = r_op[0];/* XXX support > 1 char range ops in future? */ hostlist_t new = hostlist_new(); @@ -1651,8 +1649,7 @@ hostlist_t _hostlist_create(const char *hostlist, char *sep, char *r_op) static int _parse_box_range(char *str, struct _range *ranges, int len, int *count) { - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); int start[dims], end[dims], pos[dims]; char coord[dims+1]; @@ -1703,9 +1700,8 @@ static int _parse_single_range(const char *str, struct _range *range) { char *p, *q; char *orig = strdup(str); - int hostlist_base = _set_hostlist_base(); - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int hostlist_base = hostlist_get_base(); + int dims = slurmdb_setup_cluster_dims(); if (!orig) seterrno_ret(ENOMEM, 0); @@ -1769,8 +1765,7 @@ static int _parse_range_list(char *str, struct _range *ranges, int len) { char *p; int count = 0; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); while (str) { if (count == len) { @@ -2225,8 +2220,7 @@ _hostrange_string(hostrange_t hr, int depth) { char buf[MAXHOSTNAMELEN + 16]; int len = snprintf(buf, MAXHOSTNAMELEN + 15, "%s", hr->prefix); - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); if (!hr->singlehost) { if (dims > 1) { @@ -2234,7 +2228,8 @@ _hostrange_string(hostrange_t hr, int depth) int i2=0; int coord[dims]; - _parse_int_to_array((hr->lo+depth), coord); + hostlist_parse_int_to_array( + (hr->lo+depth), coord, dims, 0); for(i2 = 0; i2<dims; i2++) { if(len <= (MAXHOSTNAMELEN + 15)) @@ -2538,6 +2533,63 @@ ssize_t hostlist_deranged_string(hostlist_t hl, size_t n, char *buf) return truncated ? -1 : len; } +int hostlist_get_base() +{ + int hostlist_base; + if(working_cluster_rec) { + if(working_cluster_rec->dimensions > 1) + hostlist_base = 36; + else + hostlist_base = 10; + } else + hostlist_base = HOSTLIST_BASE; + + return hostlist_base; +} + + +void hostlist_parse_int_to_array(int in, int *out, int dims, int hostlist_base) +{ + int a; + + static int my_start_pow_minus = 0; + static int my_start_pow = 0; + static int last_dims = 0; + int my_pow_minus = my_start_pow_minus; + int my_pow = my_start_pow; + + if(!hostlist_base) + hostlist_base = hostlist_get_base(); + + if(!my_start_pow || (last_dims != dims)) { + /* this will never change so just calculate it once */ + my_start_pow = 1; + + /* To avoid having to use the pow function and include + the math lib everywhere just do this. */ + for(a = 0; a<dims; a++) + my_start_pow *= hostlist_base; + + my_pow = my_start_pow; + my_pow_minus = my_start_pow_minus = + my_start_pow / hostlist_base; + last_dims = dims; + } + + for(a = 0; a<dims; a++) { + out[a] = (int)in % my_pow; + /* This only needs to be done until we get a 0 here + meaning we are on the last dimension. This avoids + dividing by 0. */ + if(dims - a) { + out[a] /= my_pow_minus; + /* set this up for the next dimension */ + my_pow = my_pow_minus; + my_pow_minus /= hostlist_base; + } + } +} + /* return true if a bracket is needed for the range at i in hostlist hl */ static int _is_bracket_needed(hostlist_t hl, int i) { @@ -2598,61 +2650,6 @@ _get_bracketed_list(hostlist_t hl, int *start, const size_t n, char *buf) return len; } -static int _set_hostlist_base() -{ - int hostlist_base; - if(working_cluster_rec) { - if(working_cluster_rec->dimensions > 1) - hostlist_base = 36; - else - hostlist_base = 10; - } else - hostlist_base = HOSTLIST_BASE; - - return hostlist_base; -} - -static void _parse_int_to_array(int in, int *out) -{ - int a; - - static int my_start_pow_minus = 0; - static int my_start_pow = 0; - int my_pow_minus = my_start_pow_minus; - int my_pow = my_start_pow; - int hostlist_base = _set_hostlist_base(); - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; - - if(!my_start_pow) { - /* this will never change so just calculate it once */ - my_start_pow = 1; - - /* To avoid having to use the pow function and include - the math lib everywhere just do this. */ - for(a = 0; a<dims; a++) - my_start_pow *= hostlist_base; - - my_pow = my_start_pow; - my_pow_minus = my_start_pow_minus = - my_start_pow / hostlist_base; - } - - for(a = 0; a<dims; a++) { - out[a] = (int)in % my_pow; - /* This only needs to be done until we get a 0 here - meaning we are on the last dimension. This avoids - dividing by 0. */ - if(dims - a) { - out[a] /= my_pow_minus; - - /* set this up for the next dimension */ - my_pow = my_pow_minus; - my_pow_minus /= hostlist_base; - } - } -} - static int _tell_if_used(int dim, int curr, int *start, int *end, @@ -2660,8 +2657,7 @@ static int _tell_if_used(int dim, int curr, { int rc = 1; int start_curr = curr; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); /* int i; */ /* char coord[dims+1]; */ /* memset(coord, 0, sizeof(coord)); */ @@ -2730,9 +2726,8 @@ end_it: static int _get_next_box(int *start, int *end) { - int hostlist_base = _set_hostlist_base(); - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int hostlist_base = hostlist_get_base(); + int dims = slurmdb_setup_cluster_dims(); static int orig_grid_end[HIGHEST_DIMENSIONS]; static int last[HIGHEST_DIMENSIONS]; int pos[dims]; @@ -2826,8 +2821,7 @@ static int _get_boxes(char *buf, int max_len) { int len=0, i; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); int curr_min[dims], curr_max[dims]; /* char coord[dims+1]; */ /* char coord2[dims+1]; */ @@ -2892,8 +2886,7 @@ _set_box_in_grid(int dim, int curr, int *start, { int i; int start_curr = curr; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); for (i=start[dim]; i<=end[dim]; i++) { curr = start_curr + (i * offset[dim]); @@ -2914,8 +2907,7 @@ static int _add_box_ranges(int dim, int curr, { int i; int start_curr = curr; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); for (pos[dim]=start[dim]; pos[dim]<=end[dim]; pos[dim]++) { curr = start_curr + (pos[dim] * offset[dim]); @@ -2961,8 +2953,7 @@ static void _set_min_max_of_grid(int dim, int curr, { int i; int start_curr = curr; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); for (pos[dim]=start[dim]; pos[dim]<=end[dim]; pos[dim]++) { curr = start_curr + (pos[dim] * offset[dim]); @@ -2982,8 +2973,7 @@ static void _set_min_max_of_grid(int dim, int curr, static void _set_grid(unsigned long start, unsigned long end) { - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); int sent_start[dims], sent_end[dims]; int i; /* char coord[dims+1]; */ @@ -2991,8 +2981,8 @@ _set_grid(unsigned long start, unsigned long end) /* memset(coord, 0, sizeof(coord)); */ /* memset(coord2, 0, sizeof(coord2)); */ - _parse_int_to_array(start, sent_start); - _parse_int_to_array(end, sent_end); + hostlist_parse_int_to_array(start, sent_start, dims, 0); + hostlist_parse_int_to_array(end, sent_end, dims, 0); for(i = 0; i<dims; i++) { grid_start[i] = MIN(grid_start[i], sent_start[i]); @@ -3011,8 +3001,7 @@ _test_box_in_grid(int dim, int curr, { int i; int start_curr = curr; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); for (i=start[dim]; i<=end[dim]; i++) { curr = start_curr + (i * offset[dim]); @@ -3032,8 +3021,7 @@ static bool _test_box(int *start, int *end) { int i; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); if(!memcmp(start, end, dim_grid_size)) /* single node */ return false; @@ -3051,9 +3039,8 @@ ssize_t hostlist_ranged_string(hostlist_t hl, size_t n, char *buf) int len = 0; int truncated = 0; bool box = false; - int hostlist_base = _set_hostlist_base(); - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int hostlist_base = hostlist_get_base(); + int dims = slurmdb_setup_cluster_dims(); DEF_TIMERS; START_TIMER; @@ -3277,8 +3264,7 @@ char *hostlist_next(hostlist_iterator_t i) { char buf[MAXHOSTNAMELEN + 16]; int len = 0; - int dims = working_cluster_rec ? - working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; + int dims = slurmdb_setup_cluster_dims(); assert(i != NULL); assert(i->magic == HOSTLIST_MAGIC); @@ -3296,8 +3282,8 @@ char *hostlist_next(hostlist_iterator_t i) if (i->hr->width == dims) { int i2=0; int coord[dims]; - _parse_int_to_array((i->hr->lo + i->depth), - coord); + hostlist_parse_int_to_array( + (i->hr->lo + i->depth), coord, dims, 0); for(i2 = 0; i2<dims; i2++) { if(len <= (MAXHOSTNAMELEN + 15)) buf[len++] = diff --git a/src/common/hostlist.h b/src/common/hostlist.h index 450950eb93a..812be1b2140 100644 --- a/src/common/hostlist.h +++ b/src/common/hostlist.h @@ -318,6 +318,10 @@ void hostlist_sort(hostlist_t hl); */ void hostlist_uniq(hostlist_t hl); +int hostlist_get_base(); + +/* given a int will parse it into sizes in each dimension */ +void hostlist_parse_int_to_array(int in, int *out, int dims, int hostlist_base); /* ----[ hostlist print functions ]---- */ diff --git a/src/common/slurm_protocol_api.h b/src/common/slurm_protocol_api.h index 428fa522d9f..6ff64149497 100644 --- a/src/common/slurm_protocol_api.h +++ b/src/common/slurm_protocol_api.h @@ -1056,6 +1056,7 @@ extern char *nodelist_nth_host(const char *nodelist, int inx); extern int nodelist_find(const char *nodelist, const char *name); extern void convert_num_unit(float num, char *buf, int buf_size, int orig_type); extern int revert_num_unit(const char *buf); +extern void parse_int_to_array(int in, int *out); /* * slurm_job_step_create - Ask the slurm controller for a new job step diff --git a/src/common/slurmdb_defs.c b/src/common/slurmdb_defs.c index 2b973097ec0..f63fddf8f97 100644 --- a/src/common/slurmdb_defs.c +++ b/src/common/slurmdb_defs.c @@ -229,6 +229,7 @@ extern void slurmdb_destroy_cluster_rec(void *object) if(slurmdb_cluster->accounting_list) list_destroy(slurmdb_cluster->accounting_list); xfree(slurmdb_cluster->control_host); + xfree(slurmdb_cluster->dim_size); xfree(slurmdb_cluster->name); xfree(slurmdb_cluster->nodes); slurmdb_destroy_association_rec(slurmdb_cluster->root_assoc); @@ -754,6 +755,12 @@ extern void slurmdb_destroy_report_cluster_grouping(void *object) } } +extern uint16_t slurmdb_setup_cluster_dims() +{ + return working_cluster_rec ? + working_cluster_rec->dimensions : SYSTEM_DIMENSIONS; +} + extern uint32_t slurmdb_setup_cluster_flags() { uint32_t cluster_flags = 0; @@ -863,6 +870,31 @@ extern List slurmdb_get_info_cluster(char *cluster_names) err = 1; goto next; } + + if(cluster_rec->flags & CLUSTER_FLAG_BG) { + int number, i, len; + char *nodes = cluster_rec->nodes; + + cluster_rec->dim_size = xmalloc( + sizeof(int) * cluster_rec->dimensions); + len = strlen(nodes); + i = len - cluster_rec->dimensions; + if(nodes[len-1] == ']') + i--; + if(i > cluster_rec->dimensions) { + char *p = '\0'; + number = strtoul(nodes + i, &p, 36); + hostlist_parse_int_to_array( + number, cluster_rec->dim_size, + cluster_rec->dimensions, 36); + /* all calculations this is for should + be expecting 0 not to count as a + number so add 1 to it. */ + for(i=0; i<cluster_rec->dimensions; i++) + cluster_rec->dim_size[i]++; + } + } + next: list_iterator_reset(itr); } diff --git a/src/common/slurmdb_defs.h b/src/common/slurmdb_defs.h index ddc19c492c2..906b0468372 100644 --- a/src/common/slurmdb_defs.h +++ b/src/common/slurmdb_defs.h @@ -100,6 +100,7 @@ extern void slurmdb_destroy_report_cluster_grouping(void *object); extern void slurmdb_init_association_rec(slurmdb_association_rec_t *assoc); extern void slurmdb_init_qos_rec(slurmdb_qos_rec_t *qos); +extern uint16_t slurmdb_setup_cluster_dims(); extern uint32_t slurmdb_setup_cluster_flags(); extern List slurmdb_get_info_cluster(char *cluster_name); extern char *slurmdb_qos_str(List qos_list, uint32_t level); diff --git a/src/common/slurmdb_pack.c b/src/common/slurmdb_pack.c index 00d2743cabd..44eb94962c9 100644 --- a/src/common/slurmdb_pack.c +++ b/src/common/slurmdb_pack.c @@ -36,6 +36,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. \*****************************************************************************/ +#include <stdlib.h> #include "slurmdb_pack.h" #include "slurm_protocol_defs.h" #include "list.h" @@ -671,6 +672,7 @@ extern int slurmdb_unpack_cluster_rec(void **object, uint16_t rpc_version, safe_unpack16(&object_ptr->rpc_version, buffer); } + return SLURM_SUCCESS; unpack_error: diff --git a/src/smap/opts.c b/src/smap/opts.c index 47618327136..951c4b6bb81 100644 --- a/src/smap/opts.c +++ b/src/smap/opts.c @@ -169,6 +169,8 @@ extern void parse_command_line(int argc, char *argv[]) exit(0); } } + params.cluster_dims = slurmdb_setup_cluster_dims(); + params.cluster_flags = slurmdb_setup_cluster_flags(); } extern void print_date() diff --git a/src/smap/partition_functions.c b/src/smap/partition_functions.c index 5b3c371223d..376cd53325e 100644 --- a/src/smap/partition_functions.c +++ b/src/smap/partition_functions.c @@ -49,9 +49,7 @@ typedef struct { char *bg_block_name; enum connection_type bg_conn_type; -#ifdef HAVE_BGL enum node_use_type bg_node_use; -#endif char *bg_user_name; char *ionodes; int job_running; @@ -65,24 +63,18 @@ typedef struct { rm_partition_state_t state; } db2_block_info_t; -#ifdef HAVE_BG static List block_list = NULL; -#endif -#ifdef HAVE_BG static int _marknodes(db2_block_info_t *block_ptr, int count); -#endif static void _print_header_part(void); static int _print_text_part(partition_info_t *part_ptr, db2_block_info_t *db2_info_ptr); -#ifdef HAVE_BG static void _block_list_del(void *object); static void _nodelist_del(void *object); static int _list_match_all(void *object, void *key); static int _in_slurm_partition(List slurm_nodes, List bg_nodes); static int _print_rest(db2_block_info_t *block_ptr); static int _make_nodelist(char *nodes, List nodelist); -#endif extern void get_slurm_part() { @@ -187,7 +179,6 @@ extern void get_slurm_part() extern void get_bg_part() { -#ifdef HAVE_BG int error_code, i, j, recs=0, count = 0, last_count = -1; static partition_info_msg_t *part_info_ptr = NULL; static partition_info_msg_t *new_part_ptr = NULL; @@ -201,6 +192,9 @@ extern void get_bg_part() List nodelist = NULL; bitstr_t *nodes_req = NULL; + if(!(params.cluster_flags & CLUSTER_FLAG_BG)) + return; + if (part_info_ptr) { error_code = slurm_load_partitions(part_info_ptr->last_update, &new_part_ptr, SHOW_ALL); @@ -310,9 +304,10 @@ extern void get_bg_part() = xstrdup(new_bg_ptr->block_array[i].owner_name); block_ptr->state = new_bg_ptr->block_array[i].state; block_ptr->bg_conn_type = new_bg_ptr->block_array[i].conn_type; -#ifdef HAVE_BGL - block_ptr->bg_node_use = new_bg_ptr->block_array[i].node_use; -#endif + if(params.cluster_flags & CLUSTER_FLAG_BGL) + block_ptr->bg_node_use = + new_bg_ptr->block_array[i].node_use; + block_ptr->ionodes = xstrdup(new_bg_ptr->block_array[i].ionodes); block_ptr->node_cnt = new_bg_ptr->block_array[i].node_cnt; @@ -393,20 +388,21 @@ extern void get_bg_part() if (params.commandline && params.iterate) printf("\n"); - + part_info_ptr = new_part_ptr; bg_info_ptr = new_bg_ptr; -#endif /* HAVE_BG */ return; } -#ifdef HAVE_BG static int _marknodes(db2_block_info_t *block_ptr, int count) { int j=0; int start[BA_SYSTEM_DIMENSIONS]; int end[BA_SYSTEM_DIMENSIONS]; int number = 0; + int dims = slurmdb_setup_cluster_dims(); + int hostlist_base = hostlist_get_base(); + char *p = '\0'; block_ptr->letter_num = count; while (block_ptr->nodes[j] != '\0') { @@ -417,33 +413,23 @@ static int _marknodes(db2_block_info_t *block_ptr, int count) && (block_ptr->nodes[j+4] == 'x' || block_ptr->nodes[j+4] == '-')) { j++; - number = xstrntol(block_ptr->nodes + j, - NULL, BA_SYSTEM_DIMENSIONS, - HOSTLIST_BASE); - start[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE); - start[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE)) - / HOSTLIST_BASE; - start[Z] = (number % HOSTLIST_BASE); + number = strtoul(block_ptr->nodes + j, &p, + hostlist_base); + hostlist_parse_int_to_array( + number, start, dims, hostlist_base); j += 4; - number = xstrntol(block_ptr->nodes + j, - NULL, BA_SYSTEM_DIMENSIONS, - HOSTLIST_BASE); - end[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE); - end[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE)) - / HOSTLIST_BASE; - end[Z] = (number % HOSTLIST_BASE); + number = strtoul(block_ptr->nodes + j, &p, + hostlist_base); + hostlist_parse_int_to_array( + number, end, dims, hostlist_base); j += 3; if(block_ptr->state != RM_PARTITION_FREE) - block_ptr->size += set_grid_bg(start, - end, - count, - 1); + block_ptr->size += set_grid_bg( + start, end, count, 1); else - block_ptr->size += set_grid_bg(start, - end, - count, - 0); + block_ptr->size += set_grid_bg( + start, end, count, 0); if(block_ptr->nodes[j] != ',') break; j--; @@ -452,18 +438,13 @@ static int _marknodes(db2_block_info_t *block_ptr, int count) || (block_ptr->nodes[j] >= 'A' && block_ptr->nodes[j] <= 'Z')) { - number = xstrntol(block_ptr->nodes + j, - NULL, BA_SYSTEM_DIMENSIONS, - HOSTLIST_BASE); - start[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE); - start[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE)) - / HOSTLIST_BASE; - start[Z] = (number % HOSTLIST_BASE); + number = strtoul(block_ptr->nodes + j, &p, + hostlist_base); + hostlist_parse_int_to_array( + number, start, dims, hostlist_base); j+=3; - block_ptr->size += set_grid_bg(start, - start, - count, - 0); + block_ptr->size += set_grid_bg( + start, start, count, 0); if(block_ptr->nodes[j] != ',') break; j--; @@ -472,7 +453,6 @@ static int _marknodes(db2_block_info_t *block_ptr, int count) } return SLURM_SUCCESS; } -#endif static void _print_header_part(void) { @@ -514,24 +494,23 @@ static void _print_header_part(void) main_ycord, main_xcord, "CONN"); main_xcord += 7; -#ifdef HAVE_BGL - mvwprintw(text_win, - main_ycord, - main_xcord, "NODE_USE"); - main_xcord += 10; -#endif + if(params.cluster_flags & CLUSTER_FLAG_BGL) { + mvwprintw(text_win, + main_ycord, + main_xcord, "NODE_USE"); + main_xcord += 10; + } } mvwprintw(text_win, main_ycord, main_xcord, "NODES"); main_xcord += 7; -#ifdef HAVE_BG - mvwprintw(text_win, main_ycord, - main_xcord, "BP_LIST"); -#else - mvwprintw(text_win, main_ycord, - main_xcord, "NODELIST"); -#endif + if(params.cluster_flags & CLUSTER_FLAG_BG) + mvwprintw(text_win, main_ycord, + main_xcord, "BP_LIST"); + else + mvwprintw(text_win, main_ycord, + main_xcord, "NODELIST"); main_xcord = 1; main_ycord++; } else { @@ -545,17 +524,15 @@ static void _print_header_part(void) printf(" JOBID "); printf(" USER "); printf(" CONN "); -#ifdef HAVE_BGL - printf(" NODE_USE "); -#endif + if(params.cluster_flags & CLUSTER_FLAG_BGL) + printf(" NODE_USE "); } printf("NODES "); -#ifdef HAVE_BG - printf("BP_LIST\n"); -#else - printf("NODELIST\n"); -#endif + if(params.cluster_flags & CLUSTER_FLAG_BG) + printf("BP_LIST\n"); + else + printf("NODELIST\n"); } } @@ -571,12 +548,11 @@ static int _print_text_part(partition_info_t *part_ptr, char tmp_cnt[8]; char tmp_char[8]; -#ifdef HAVE_BG - convert_num_unit((float)part_ptr->total_nodes, tmp_cnt, - sizeof(tmp_cnt), UNIT_NONE); -#else - snprintf(tmp_cnt, sizeof(tmp_cnt), "%u", part_ptr->total_nodes); -#endif + if(params.cluster_flags & CLUSTER_FLAG_BG) + convert_num_unit((float)part_ptr->total_nodes, tmp_cnt, + sizeof(tmp_cnt), UNIT_NONE); + else + snprintf(tmp_cnt, sizeof(tmp_cnt), "%u", part_ptr->total_nodes); if(!params.commandline) { uint16_t root_only = 0; @@ -672,14 +648,15 @@ static int _print_text_part(partition_info_t *part_ptr, db2_info_ptr-> bg_conn_type)); main_xcord += 7; -#ifdef HAVE_BGL - mvwprintw(text_win, - main_ycord, - main_xcord, "%.9s", - node_use_string( - db2_info_ptr->bg_node_use)); - main_xcord += 10; -#endif + if(params.cluster_flags & CLUSTER_FLAG_BGL) { + mvwprintw(text_win, + main_ycord, + main_xcord, "%.9s", + node_use_string( + db2_info_ptr-> + bg_node_use)); + main_xcord += 10; + } } else { mvwprintw(text_win, main_ycord, @@ -810,10 +787,10 @@ static int _print_text_part(partition_info_t *part_ptr, printf("%5.5s ", conn_type_string( db2_info_ptr->bg_conn_type)); -#ifdef HAVE_BGL - printf("%9.9s ", node_use_string( - db2_info_ptr->bg_node_use)); -#endif + if(params.cluster_flags & CLUSTER_FLAG_BGL) + printf("%9.9s ", node_use_string( + db2_info_ptr-> + bg_node_use)); } } @@ -833,7 +810,6 @@ static int _print_text_part(partition_info_t *part_ptr, return printed; } -#ifdef HAVE_BG static void _block_list_del(void *object) { db2_block_info_t *block_ptr = (db2_block_info_t *)object; @@ -932,10 +908,11 @@ static int _addto_nodelist(List nodelist, int *start, int *end) { int *coord = NULL; int x,y,z; - - if(end[X] >= DIM_SIZE[X] - || end[Y] >= DIM_SIZE[Y] - || end[Z] >= DIM_SIZE[Z]) { + int *use_dims = working_cluster_rec ? + working_cluster_rec->dim_size : DIM_SIZE; + if(end[X] >= use_dims[X] + || end[Y] >= use_dims[Y] + || end[Z] >= use_dims[Z]) { fatal("It appears the slurm.conf file has changed since " "the last restart.\nThings are in an incompatible " "state, please restart the slurmctld."); @@ -965,6 +942,9 @@ static int _make_nodelist(char *nodes, List nodelist) int number; int start[BA_SYSTEM_DIMENSIONS]; int end[BA_SYSTEM_DIMENSIONS]; + char *p = '\0'; + int dims = slurmdb_setup_cluster_dims(); + int hostlist_base = hostlist_get_base(); if(!nodelist) nodelist = list_create(_nodelist_del); @@ -976,21 +956,13 @@ static int _make_nodelist(char *nodes, List nodelist) && (nodes[j+4] == 'x' || nodes[j+4] == '-')) { j++; - number = xstrntol(nodes + j, NULL, - BA_SYSTEM_DIMENSIONS, HOSTLIST_BASE); - start[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE); - start[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE)) - / HOSTLIST_BASE; - start[Z] = (number % HOSTLIST_BASE); - + number = strtoul(nodes + j, &p, hostlist_base); + hostlist_parse_int_to_array( + number, start, dims, hostlist_base); j += 4; - number = xstrntol(nodes + j, NULL, - BA_SYSTEM_DIMENSIONS, HOSTLIST_BASE); - end[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE); - end[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE)) - / HOSTLIST_BASE; - end[Z] = (number % HOSTLIST_BASE); - + number = strtoul(nodes + j, &p, hostlist_base); + hostlist_parse_int_to_array( + number, end, dims, hostlist_base); j += 3; _addto_nodelist(nodelist, start, end); if(nodes[j] != ',') @@ -999,12 +971,9 @@ static int _make_nodelist(char *nodes, List nodelist) } else if((nodes[j] >= '0' && nodes[j] <= '9') || (nodes[j] >= 'A' && nodes[j] <= 'Z')) { - number = xstrntol(nodes + j, NULL, - BA_SYSTEM_DIMENSIONS, HOSTLIST_BASE); - start[X] = number / (HOSTLIST_BASE * HOSTLIST_BASE); - start[Y] = (number % (HOSTLIST_BASE * HOSTLIST_BASE)) - / HOSTLIST_BASE; - start[Z] = (number % HOSTLIST_BASE); + number = strtoul(nodes + j, &p, hostlist_base); + hostlist_parse_int_to_array( + number, start, dims, hostlist_base); j+=3; _addto_nodelist(nodelist, start, start); if(nodes[j] != ',') @@ -1015,5 +984,3 @@ static int _make_nodelist(char *nodes, List nodelist) } return 1; } - -#endif diff --git a/src/smap/smap.c b/src/smap/smap.c index 64d699af52a..9d50a8de385 100644 --- a/src/smap/smap.c +++ b/src/smap/smap.c @@ -44,11 +44,8 @@ #include <signal.h> #include "src/smap/smap.h" -#ifdef HAVE_3D -#define MIN_SCREEN_WIDTH 92 -#else -#define MIN_SCREEN_WIDTH 72 -#endif +static int min_screen_width = 72; + /******************** * Global Variables * ********************/ @@ -87,9 +84,7 @@ int main(int argc, char *argv[]) int end = 0; int i; int rc; -#ifdef HAVE_BG int mapset = 0; -#endif //char *name; log_init(xbasename(argv[0]), opts, SYSLOG_FACILITY_DAEMON, NULL); @@ -99,8 +94,12 @@ int main(int argc, char *argv[]) log_alter(opts, SYSLOG_FACILITY_USER, NULL); } - if(params.clusters) - working_cluster_rec = list_peek(params.clusters); + if(params.cluster_dims == 4) { + /* FIX ME: smap doesn't do anything correctly with + more than 3 dims yet. + */ + } else if(params.cluster_dims == 3) + min_screen_width = 92; while (slurm_load_node((time_t) NULL, &new_node_ptr, SHOW_ALL)) { error_code = slurm_get_errno(); @@ -161,33 +160,36 @@ int main(int argc, char *argv[]) } part_fini: #else - printf("Must be on BG System to resolve.\n"); + printf("Must be physically on a BG System to resolve.\n"); #endif ba_fini(); xfree(params.resolve); exit(0); } if(!params.commandline) { - + int check_width = min_screen_width; signal(SIGWINCH, (void (*)(int))_resize_handler); initscr(); -#ifdef HAVE_3D - height = DIM_SIZE[Y] * DIM_SIZE[Z] + DIM_SIZE[Y] + 3; - width = DIM_SIZE[X] + DIM_SIZE[Z] + 3; - if (COLS < (MIN_SCREEN_WIDTH + width) || LINES < height) { - width += MIN_SCREEN_WIDTH; -#else - height = 10; - width = COLS; - if (COLS < MIN_SCREEN_WIDTH || LINES < height) { - width = MIN_SCREEN_WIDTH; -#endif + if(params.cluster_dims == 4) { + /* FIX ME: smap doesn't do anything correctly with + more than 3 dims yet. + */ + } else if(params.cluster_dims == 3) { + height = DIM_SIZE[Y] * DIM_SIZE[Z] + DIM_SIZE[Y] + 3; + width = DIM_SIZE[X] + DIM_SIZE[Z] + 3; + check_width += width; + } else { + height = 10; + width = COLS; + } + + if (COLS < check_width || LINES < height) { endwin(); error("Screen is too small make sure the screen " "is at least %dx%d\n" "Right now it is %dx%d\n", - width, + check_width, height, COLS, LINES); @@ -208,17 +210,20 @@ part_fini: max_display = grid_win->_maxy * grid_win->_maxx; //scrollok(grid_win, TRUE); -#ifdef HAVE_3D - startx = width; - COLS -= 2; - width = COLS - width; - height = LINES; -#else - startx = 0; - starty = height; - height = LINES - height; - -#endif + if(params.cluster_dims == 4) { + /* FIX ME: smap doesn't do anything correctly with + more than 3 dims yet. + */ + } else if(params.cluster_dims == 3) { + startx = width; + COLS -= 2; + width = COLS - width; + height = LINES; + } else { + startx = 0; + starty = height; + height = LINES - height; + } text_win = newwin(height, width, starty, startx); } @@ -249,29 +254,36 @@ part_fini: case SLURMPART: get_slurm_part(); break; -#ifdef HAVE_BG case COMMANDS: - if(!mapset) { - mapset = set_bp_map(); - wclear(text_win); - //doupdate(); - //move(0,0); + if(params.cluster_flags & CLUSTER_FLAG_BG) { + if(!mapset) { + mapset = set_bp_map(); + wclear(text_win); + //doupdate(); + //move(0,0); + } + get_command(); + } else { + error("Must be on a BG SYSTEM to " + "run this command"); + if(!params.commandline) + endwin(); + ba_fini(); + exit(1); } - get_command(); - break; - case BGPART: - get_bg_part(); break; -#else - case COMMANDS: case BGPART: - error("Must be on a BG SYSTEM to run this command"); - if(!params.commandline) - endwin(); - ba_fini(); - exit(1); + if(params.cluster_flags & CLUSTER_FLAG_BG) + get_bg_part(); + else { + error("Must be on a BG SYSTEM to " + "run this command"); + if(!params.commandline) + endwin(); + ba_fini(); + exit(1); + } break; -#endif } if(!params.commandline) { @@ -359,19 +371,19 @@ static int _get_option() case '-': case '_': text_line_cnt++; - return 1; - break; + return 1; + break; case KEY_LEFT: case '=': case '+': text_line_cnt--; - if(text_line_cnt<0) { - text_line_cnt = 0; - return 0; + if(text_line_cnt<0) { + text_line_cnt = 0; + return 0; - } - return 1; - break; + } + return 1; + break; case 'H': case 'h': @@ -379,8 +391,8 @@ static int _get_option() params.all_flag = 0; else params.all_flag = 1; - return 1; - break; + return 1; + break; case 's': text_line_cnt = 0; grid_line_cnt = 0; @@ -399,47 +411,49 @@ static int _get_option() params.display = RESERVATIONS; return 1; break; -#ifdef HAVE_BG case 'b': - text_line_cnt = 0; - grid_line_cnt = 0; - params.display = BGPART; - return 1; + if(params.cluster_flags & CLUSTER_FLAG_BG) { + text_line_cnt = 0; + grid_line_cnt = 0; + params.display = BGPART; + return 1; + } break; case 'c': - params.display = COMMANDS; - return 1; + if(params.cluster_flags & CLUSTER_FLAG_BG) { + params.display = COMMANDS; + return 1; + } break; -#endif - -#ifndef HAVE_BG case 'u': case KEY_UP: - grid_line_cnt--; - if(grid_line_cnt<0) { - grid_line_cnt = 0; - return 0; + if(!(params.cluster_flags & CLUSTER_FLAG_BG)) { + grid_line_cnt--; + if(grid_line_cnt<0) { + grid_line_cnt = 0; + return 0; + } + return 1; } - return 1; - break; + break; case 'd': case KEY_DOWN: - grid_line_cnt++; - if((((grid_line_cnt-2) * (grid_win->_maxx-1)) + - max_display) > DIM_SIZE[X]) { - grid_line_cnt--; - return 0; + if(!(params.cluster_flags & CLUSTER_FLAG_BG)) { + grid_line_cnt++; + if((((grid_line_cnt-2) * (grid_win->_maxx-1)) + + max_display) > DIM_SIZE[X]) { + grid_line_cnt--; + return 0; + } + return 1; } - - return 1; - break; -#endif + break; case 'q': case '\n': endwin(); - ba_fini(); - exit(0); - break; + ba_fini(); + exit(0); + break; } return 0; } @@ -447,7 +461,8 @@ static int _get_option() static void *_resize_handler(int sig) { int startx=0, starty=0; - int height, width; + int height = 40, width = 100; + int check_width = min_screen_width; main_ycord = 1; /* clear existing data and update to avoid ghost during resize */ @@ -464,18 +479,20 @@ static void *_resize_handler(int sig) doupdate(); /* update now to make sure we get the new size */ getmaxyx(stdscr,LINES,COLS); -#ifdef HAVE_3D - height = DIM_SIZE[Y] * DIM_SIZE[Z] + DIM_SIZE[Y] + 3; - width = DIM_SIZE[X] + DIM_SIZE[Z] + 3; - if (COLS < (MIN_SCREEN_WIDTH + width) || LINES < height) { - width += MIN_SCREEN_WIDTH; -#else - height = 10; - width = COLS; - if (COLS < MIN_SCREEN_WIDTH || LINES < height) { - width = MIN_SCREEN_WIDTH; -#endif + if(params.cluster_dims == 4) { + /* FIX ME: smap doesn't do anything correctly with + more than 3 dims yet. + */ + } else if(params.cluster_dims == 3) { + height = DIM_SIZE[Y] * DIM_SIZE[Z] + DIM_SIZE[Y] + 3; + width = DIM_SIZE[X] + DIM_SIZE[Z] + 3; + check_width += width; + } else { + height = 10; + width = COLS; + } + if (COLS < check_width || LINES < height) { endwin(); error("Screen is too small make sure " "the screen is at least %dx%d\n" @@ -487,17 +504,20 @@ static void *_resize_handler(int sig) grid_win = newwin(height, width, starty, startx); max_display = grid_win->_maxy * grid_win->_maxx; -#ifdef HAVE_3D - startx = width; - COLS -= 2; - width = COLS - width; - height = LINES; -#else - startx = 0; - starty = height; - height = LINES - height; - -#endif + if(params.cluster_dims == 4) { + /* FIX ME: smap doesn't do anything correctly with + more than 3 dims yet. + */ + } else if(params.cluster_dims == 3) { + startx = width; + COLS -= 2; + width = COLS - width; + height = LINES; + } else { + startx = 0; + starty = height; + height = LINES - height; + } text_win = newwin(height, width, starty, startx); @@ -512,14 +532,14 @@ static void *_resize_handler(int sig) case SLURMPART: get_slurm_part(); break; -#ifdef HAVE_BG case COMMANDS: - get_command(); + if(params.cluster_flags & CLUSTER_FLAG_BG) + get_command(); break; case BGPART: - get_bg_part(); + if(params.cluster_flags & CLUSTER_FLAG_BG) + get_bg_part(); break; -#endif } print_grid(grid_line_cnt * (grid_win->_maxx-1)); diff --git a/src/smap/smap.h b/src/smap/smap.h index e3d66880cce..5ea1eb4cdbf 100644 --- a/src/smap/smap.h +++ b/src/smap/smap.h @@ -115,6 +115,8 @@ enum { JOBS, RESERVATIONS, SLURMPART, BGPART, COMMANDS }; typedef struct { bool all_flag; List clusters; + uint16_t cluster_dims; + uint32_t cluster_flags; bool commandline; int display; int iterate; -- GitLab