diff --git a/doc/man/man5/bluegene.conf.5 b/doc/man/man5/bluegene.conf.5 index 344b5b5fc5680e25cd1d075d0cd29e2a088d51ac..eb24261238bc925cacfc90800207b25e41cf1a58 100644 --- a/doc/man/man5/bluegene.conf.5 +++ b/doc/man/man5/bluegene.conf.5 @@ -17,8 +17,10 @@ Changes to the configuration file take effect upon restart of SLURM daemons, daemon receipt of the SIGHUP signal, or execution of the command "scontrol reconfigure" unless otherwise noted. .LP -The overall configuration parameters available include: +There are some differences between Bluegene/L and Bluegene/P in respects to the contents of the bluegene.conf file. + +.SH "The Bluegene/L specific options are:" .TP \fBAltBlrtsImage\fR Alternative BlrtsImage. This is an optional field only used for @@ -36,16 +38,59 @@ Groups= is not stated then this image will be able to be used by all groups. You can but as many alternative images as you want in the conf file. .TP -\fBAltMloaderImage\fR -Alternative MloaderImage. This is an optional field only used for +\fBAltRamDiskImage\fR +Alternative RamDiskImage. This is an optional field only used for mulitple images on a system and should be followed by a Groups= with the user groups allowed to use this image (i.e. Groups=da,jette) if Groups= is not stated then this image will be able to be used by all groups. You can but as many alternative images as you want in the conf file. .TP -\fBAltRamDiskImage\fR -Alternative RamDiskImage. This is an optional field only used for +\fBBlrtsImage\fR +BlrtsImage used for creation of all bgblocks. +There is no default value and this must be specified. + +.TP +\fBLinuxImage\fR +LinuxImage used for creation of all bgblocks. +There is no default value and this must be specified. + +.TP +\fBRamDiskImage\fR +RamDiskImage used for creation of all bgblocks. +There is no default value and this must be specified. + +.SH "The Bluegene/P specific options are:" +.TP +\fBAltCnloadImage\fR +Alternative CnloadImage. This is an optional field only used for +mulitple images on a system and should be followed by a Groups= with +the user groups allowed to use this image (i.e. Groups=da,jette) if +Groups= is not stated then this image will be able to be used by all +groups. You can but as many alternative images as you want in the conf file. + +.TP +\fBAltIoloadImage\fR +Alternative IoloadImage. This is an optional field only used for +mulitple images on a system and should be followed by a Groups= with +the user groups allowed to use this image (i.e. Groups=da,jette) if +Groups= is not stated then this image will be able to be used by all +groups. You can but as many alternative images as you want in the conf file. + +.TP +\fBCnloadImage\fR +CnloadImage used for creation of all bgblocks. +There is no default value and this must be specified. + +.TP +\fBIoloadImage\fR +IoloadImage used for creation of all bgblocks. +There is no default value and this must be specified. + +.SH "All options below are common on all Bluegene systems:" +.TP +\fBAltMloaderImage\fR +Alternative MloaderImage. This is an optional field only used for mulitple images on a system and should be followed by a Groups= with the user groups allowed to use this image (i.e. Groups=da,jette) if Groups= is not stated then this image will be able to be used by all @@ -57,11 +102,6 @@ The number of c\-nodes per base partition. There is no default value and this must be specified. (For bgl systems this is usually 512) -.TP -\fBBlrtsImage\fR -BlrtsImage used for creation of all bgblocks. -There is no default value and this must be specified. - .TP \fBBridgeAPILogFile\fR Fully qualified pathname of a into which the Bridge API logs are @@ -85,6 +125,11 @@ The default value is 0. \fB4\fR: Log all messages .RE +.TP +\fBDenyPassthrough\fR +Specify which dimsions you do not want to allow pass throughs. Valid options are X, Y, Z or all. +example: If you don't want to allow passthroughs in the X and Y diminsions you would specify DenyPassthrough=X,Y + .TP \fBLayoutMode\fR Describes how SLURM should create bgblocks. @@ -104,11 +149,6 @@ and starvation of larger jobs. \fBUse this mode with caution.\fR .RE -.TP -\fBLinuxImage\fR -LinuxImage used for creation of all bgblocks. -There is no default value and this must be specified. - .TP \fBMloaderImage\fR MloaderImage used for creation of all bgblocks. @@ -132,11 +172,6 @@ you do not wish to create small blocks, 8 is usually the number to use. For bgp IO rich systems 32 is the value that should be used to create small blocks since you can only have 2 ionodes per nodecard instead of 4 like on bgl. -.TP -\fBRamDiskImage\fR -RamDiskImage used for creation of all bgblocks. -There is no default value and this must be specified. - .LP Each bgblock is defined by the base partitions used to construct it. Ordering is very important for laying out switch wires. Please create diff --git a/src/plugins/accounting_storage/mysql/mysql_jobacct_process.c b/src/plugins/accounting_storage/mysql/mysql_jobacct_process.c index 527467889d8b2fbae5d612f63c6e2801233da25b..f43a42f236528e5a4c9014550e5c7fc5f292bc6e 100644 --- a/src/plugins/accounting_storage/mysql/mysql_jobacct_process.c +++ b/src/plugins/accounting_storage/mysql/mysql_jobacct_process.c @@ -231,7 +231,7 @@ extern int setup_job_cond_limits(acct_job_cond_t *job_cond, char **extra) while((object = list_next(itr))) { if(set) xstrcat(*extra, " || "); - xstrfmtcat(*extra, "t1.gid=", object); + xstrfmtcat(*extra, "t1.gid='%s'", object); set = 1; } list_iterator_destroy(itr); diff --git a/src/plugins/select/bluegene/block_allocator/block_allocator.c b/src/plugins/select/bluegene/block_allocator/block_allocator.c index 0b6a774fcf42cb9c406c7f0a324434569d7bc9aa..d1fd596c034570f0f18ed253d687268433392755 100644 --- a/src/plugins/select/bluegene/block_allocator/block_allocator.c +++ b/src/plugins/select/bluegene/block_allocator/block_allocator.c @@ -62,10 +62,11 @@ List path = NULL; List best_path = NULL; int best_count; int color_count = 0; -bool *passthrough = NULL; +uint16_t *deny_pass = NULL; /* extern Global */ my_bluegene_t *bg = NULL; +uint16_t ba_deny_pass = 0; List bp_map_list = NULL; char letters[62]; char colors[6]; @@ -91,6 +92,7 @@ s_p_options_t bg_conf_file_options[] = { {"AltCnloadImage", S_P_ARRAY, parse_image, NULL}, {"AltIoloadImage", S_P_ARRAY, parse_image, NULL}, #endif + {"DenyPassthrough", S_P_STRING}, {"LayoutMode", S_P_STRING}, {"MloaderImage", S_P_STRING}, {"BridgeAPILogFile", S_P_STRING}, @@ -242,6 +244,28 @@ extern char *bg_block_state_string(rm_partition_state_t state) return tmp; } +extern char *ba_passthroughs_string(uint16_t passthrough) +{ + char *pass = NULL; + if(passthrough & PASS_FOUND_X) + xstrcat(pass, "X"); + if(passthrough & PASS_FOUND_Y) { + if(pass) + xstrcat(pass, ",Y"); + else + xstrcat(pass, "Y"); + } + if(passthrough & PASS_FOUND_Z) { + if(pass) + xstrcat(pass, ",Z"); + else + xstrcat(pass, "Z"); + } + + return pass; +} + + extern int parse_blockreq(void **dest, slurm_parser_enum_t type, const char *key, const char *value, const char *line, char **leftover) @@ -489,8 +513,11 @@ extern int new_ba_request(ba_request_t* ba_request) geo[X] = ba_request->geometry[X]; geo[Y] = ba_request->geometry[Y]; geo[Z] = ba_request->geometry[Z]; - passthrough = &ba_request->passthrough; - + if(ba_request->deny_pass == (uint16_t)NO_VAL) + ba_request->deny_pass = ba_deny_pass; + + deny_pass = &ba_request->deny_pass; + if(geo[X] != (uint16_t)NO_VAL) { for (i=0; i<BA_SYSTEM_DIMENSIONS; i++){ if ((geo[i] < 1) @@ -2102,17 +2129,38 @@ extern int *find_bp_loc(char* bp_id) #ifdef HAVE_BG_FILES ba_bp_map_t *bp_map = NULL; ListIterator itr; - + char *check = bp_id; + if(!bp_map_list) { if(set_bp_map() == -1) return NULL; } + + /* with BGP they changed the names of the rack midplane action from + * R000 to R00-M0 so we now support both formats for each of the + * systems */ +#ifdef HAVE_BGL + if(check[3] == '-') { + if(check[5]) { + check[3] = check[5]; + check[4] = '\0'; + } + } +#else + if(bp_id[3] != '-') + check = xstrdup_printf("R%c%c-M%c", + bp_id[1], bp_id[2], bp_id[3]); +#endif + itr = list_iterator_create(bp_map_list); while ((bp_map = list_next(itr))) - if (!strcasecmp(bp_map->bp_id, bp_id)) + if (!strcasecmp(bp_map->bp_id, check)) break; /* we found it */ - list_iterator_destroy(itr); + +#ifndef HAVE_BGL + xfree(check); +#endif if(bp_map != NULL) return bp_map->coord; else @@ -2795,7 +2843,9 @@ static int _append_geo(int *geometry, List geos, int rotate) if(rotate) { for (i = (BA_SYSTEM_DIMENSIONS - 1); i >= 0; i--) { for (j = 1; j <= i; j++) { - if (geometry[j-1] > geometry[j]) { + if ((geometry[j-1] > geometry[j]) + && (geometry[j] <= DIM_SIZE[j-i]) + && (geometry[j-1] <= DIM_SIZE[j])) { temp_geo = geometry[j-1]; geometry[j-1] = geometry[j]; geometry[j] = temp_geo; @@ -2921,6 +2971,19 @@ static int _fill_in_coords(List results, List start_list, goto failed; } } + + if(deny_pass) { + if((*deny_pass & PASS_DENY_Y) + && (*deny_pass & PASS_FOUND_Y)) { + debug("We don't allow Y passthoughs"); + rc = 0; + } else if((*deny_pass & PASS_DENY_Z) + && (*deny_pass & PASS_FOUND_Z)) { + debug("We don't allow Z passthoughs"); + rc = 0; + } + } + failed: list_iterator_destroy(itr); @@ -3124,7 +3187,16 @@ static int _find_yz_path(ba_node_t *ba_node, int *first, dim_curr_switch->int_wire[2].port_tar = 0; dim_curr_switch = dim_next_switch; - + + if(deny_pass + && (node_tar[i2] != first[i2])) { + if(i2 == 1) + *deny_pass |= + PASS_FOUND_Y; + else + *deny_pass |= + PASS_FOUND_Z; + } while(node_tar[i2] != first[i2]) { debug3("on dim %d at %d " "looking for %d", @@ -3138,6 +3210,7 @@ static int _find_yz_path(ba_node_t *ba_node, int *first, "here 3"); return 0; } + dim_curr_switch-> int_wire[2].used = 1; dim_curr_switch-> @@ -4262,6 +4335,11 @@ static int _find_x_path(List results, ba_node_t *ba_node, } else if(found == x_size) { debug2("Algo(%d) finishing the torus!", algo); + if(deny_pass && (*deny_pass & PASS_DENY_X)) { + info("we don't allow passthroughs 1"); + return 0; + } + if(best_path) list_flush(best_path); else @@ -4416,7 +4494,13 @@ static int _find_x_path(List results, ba_node_t *ba_node, debug2("Algo(%d) yes found next free %d", algo, best_count); node_tar = _set_best_path(); - + + if(deny_pass && (*deny_pass & PASS_DENY_X) + && (*deny_pass & PASS_FOUND_X)) { + debug("We don't allow X passthoughs."); + return 0; + } + next_node = &ba_system_ptr->grid[node_tar[X]] #ifdef HAVE_3D [node_tar[Y]] @@ -4834,9 +4918,9 @@ static int *_set_best_path() itr = list_iterator_create(best_path); while((path_switch = (ba_path_switch_t*) list_next(itr))) { - if(passthrough && path_switch->in > 1 && path_switch->out > 1) { - *passthrough = true; - debug2("got a passthrough"); + if(deny_pass && path_switch->in > 1 && path_switch->out > 1) { + *deny_pass |= PASS_FOUND_X; + debug2("got a passthrough in X"); } #ifdef HAVE_3D debug3("mapping %c%c%c %d->%d", diff --git a/src/plugins/select/bluegene/block_allocator/block_allocator.h b/src/plugins/select/bluegene/block_allocator/block_allocator.h index d8cc9ff70f9c570490f3b51b0d7504c77a4275e4..45aea50ca0f16e7946f6cabad8da7745395a1b6b 100644 --- a/src/plugins/select/bluegene/block_allocator/block_allocator.h +++ b/src/plugins/select/bluegene/block_allocator/block_allocator.h @@ -52,6 +52,16 @@ #define BA_SYSTEM_DIMENSIONS 1 #endif +#define PASS_DENY_X 0x0001 +#define PASS_DENY_Y 0x0002 +#define PASS_DENY_Z 0x0004 +#define PASS_DENY_ALL 0x00ff + +#define PASS_FOUND_X 0x0100 +#define PASS_FOUND_Y 0x0200 +#define PASS_FOUND_Z 0x0400 +#define PASS_FOUND_ANY 0xff00 + extern bool _initialized; enum {X, Y, Z}; @@ -92,8 +102,11 @@ typedef struct { int geometry[BA_SYSTEM_DIMENSIONS]; /* size of block in geometry */ char *linuximage; /* LinuxImage for this block */ char *mloaderimage; /* mloaderImage for this block */ - bool passthrough; /* filled in if there are - passthroughs in the block created */ + uint16_t deny_pass; /* PASSTHROUGH_FOUND is set if there are + passthroughs in the block + created you can deny + passthroughs by setting the + appropriate bits*/ int procs; /* Number of Real processors in block */ char *ramdiskimage; /* RamDiskImage for this block */ @@ -258,10 +271,14 @@ extern int DIM_SIZE[BA_SYSTEM_DIMENSIONS]; /* how many midplanes in * each dimension */ extern s_p_options_t bg_conf_file_options[]; /* used to parse the * bluegene.conf file. */ +extern uint16_t ba_deny_pass; /* Translate a state enum to a readable string */ extern char *bg_block_state_string(rm_partition_state_t state); +/* must xfree return of this */ +extern char *ba_passthroughs_string(uint16_t passthrough); + /* Parse a block request from the bluegene.conf file */ extern int parse_blockreq(void **dest, slurm_parser_enum_t type, const char *key, const char *value, diff --git a/src/plugins/select/bluegene/plugin/bg_job_place.c b/src/plugins/select/bluegene/plugin/bg_job_place.c index 838b68d81f0a5884ae76336d7c1d9227e98e1acb..517421d9c042a1f38627d8175d277269d14a49c8 100644 --- a/src/plugins/select/bluegene/plugin/bg_job_place.c +++ b/src/plugins/select/bluegene/plugin/bg_job_place.c @@ -932,12 +932,15 @@ static int _find_best_block_match(List block_list, *found_bg_record = NULL; allow = 0; + memset(&request, 0, sizeof(ba_request_t)); + for(i=0; i<BA_SYSTEM_DIMENSIONS; i++) request.start[i] = start[i]; for(i=0; i<BA_SYSTEM_DIMENSIONS; i++) request.geometry[i] = req_geometry[i]; - + + request.deny_pass = (uint16_t)NO_VAL; request.save_name = NULL; request.elongate_geos = NULL; request.size = target_size; diff --git a/src/plugins/select/bluegene/plugin/bluegene.c b/src/plugins/select/bluegene/plugin/bluegene.c index e81c3a9ce85b0bded3de2c381b65171a86fcc6f5..a7aa544ea783fcc769cddc0e3d2eaef5d7c9d9ce 100644 --- a/src/plugins/select/bluegene/plugin/bluegene.c +++ b/src/plugins/select/bluegene/plugin/bluegene.c @@ -86,6 +86,7 @@ uint16_t bluegene_quarter_ionode_cnt = 0; uint16_t bluegene_nodecard_node_cnt = 0; uint16_t bluegene_nodecard_ionode_cnt = 0; uint16_t bridge_api_verb = 0; + bool agent_fini = false; time_t last_bg_update; pthread_mutex_t block_state_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -1287,6 +1288,20 @@ extern int read_bg_conf(void) info("BridgeAPILogFile not configured in bluegene.conf"); else _reopen_bridge_log(); + + if (s_p_get_string(&layout, "DenyPassthrough", tbl)) { + if(strstr(layout, "X")) + ba_deny_pass |= PASS_DENY_X; + if(strstr(layout, "Y")) + ba_deny_pass |= PASS_DENY_Y; + if(strstr(layout, "Z")) + ba_deny_pass |= PASS_DENY_Z; + if(!strcasecmp(layout, "ALL")) + ba_deny_pass |= PASS_DENY_ALL; + + xfree(layout); + } + if (!s_p_get_string(&layout, "LayoutMode", tbl)) { info("Warning: LayoutMode was not specified in bluegene.conf " "defaulting to STATIC partitioning"); diff --git a/src/plugins/select/bluegene/plugin/bluegene.h b/src/plugins/select/bluegene/plugin/bluegene.h index 7674c0e651d55719c9d8e6d8fcb7ba4119b9c7db..4c6b6ef941fa9e5e06f0291bf797e9bb5fe5160c 100644 --- a/src/plugins/select/bluegene/plugin/bluegene.h +++ b/src/plugins/select/bluegene/plugin/bluegene.h @@ -49,7 +49,6 @@ typedef enum bg_layout_type { LAYOUT_DYNAMIC /* slurm will make all blocks */ } bg_layout_t; - /* Global variables */ #ifdef HAVE_BGL extern char *default_blrtsimage; @@ -72,6 +71,7 @@ extern uint16_t bluegene_nodecard_node_cnt; extern uint16_t bluegene_nodecard_ionode_cnt; extern uint16_t bluegene_quarter_node_cnt; extern uint16_t bluegene_quarter_ionode_cnt; + extern ba_system_t *ba_system_ptr; extern time_t last_bg_update; diff --git a/src/smap/configure_functions.c b/src/smap/configure_functions.c index fca5cf5ab5dc2e37ce392806c8b7b60416c712c1..693939d97048e7ca86d59f7949e3724f6f8022c4 100644 --- a/src/smap/configure_functions.c +++ b/src/smap/configure_functions.c @@ -98,9 +98,12 @@ static allocated_block_t *_make_request(ba_request_t *request) request->geometry[2]); return NULL; } else { - if(request->passthrough) + char *pass = ba_passthroughs_string(request->deny_pass); + if(pass) { sprintf(error_string,"THERE ARE PASSTHROUGHS IN " - "THIS ALLOCATION!!!!!!!"); + "THIS ALLOCATION DIM %s!!!!!!!", pass); + xfree(pass); + } allocated_block = (allocated_block_t *)xmalloc( sizeof(allocated_block_t)); @@ -213,7 +216,7 @@ static int _create_allocation(char *com, List allocated_blocks) request->size = 0; request->small32 = 0; request->small128 = 0; - request->passthrough = false; + request->deny_pass = 0; request->avail_node_bitmap = NULL; while(i<len) { @@ -1393,7 +1396,9 @@ void get_command(void) _delete_allocated_blocks(allocated_blocks); ba_fini(); exit(0); - } if (!strcmp(com, "quit")) { + } + + if (!strcmp(com, "quit") || !strcmp(com, "\\q")) { break; } else if (!strncasecmp(com, "layout", 6)) { _set_layout(com); diff --git a/src/smap/job_functions.c b/src/smap/job_functions.c index ec2cb5f1baa2fa592351acca93c19b73cbd87504..aca404349338006a54527d74ac77cb6198880235 100644 --- a/src/smap/job_functions.c +++ b/src/smap/job_functions.c @@ -195,7 +195,7 @@ static void _print_header_job(void) main_xcord += 3; mvwprintw(text_win, main_ycord, main_xcord, "JOBID"); - main_xcord += 6; + main_xcord += 8; mvwprintw(text_win, main_ycord, main_xcord, "PARTITION"); main_xcord += 10; @@ -291,7 +291,7 @@ static int _print_text_job(job_info_t * job_ptr) main_xcord += 3; mvwprintw(text_win, main_ycord, main_xcord, "%d", job_ptr->job_id); - main_xcord += 6; + main_xcord += 8; mvwprintw(text_win, main_ycord, main_xcord, "%.10s", job_ptr->partition); main_xcord += 10; @@ -378,7 +378,7 @@ static int _print_text_job(job_info_t * job_ptr) main_xcord = 1; main_ycord++; } else { - printf("%5d ", job_ptr->job_id); + printf("%8d ", job_ptr->job_id); printf("%9.9s ", job_ptr->partition); #ifdef HAVE_BG printf("%16.16s ", diff --git a/src/sview/block_info.c b/src/sview/block_info.c index 702ac98a99dbfef137078a7c9d1bbcdac69d6f8c..1ae5873e830ee625a5ac7a0a5f92f2194b9f674e 100644 --- a/src/sview/block_info.c +++ b/src/sview/block_info.c @@ -73,7 +73,9 @@ enum { SORTID_RAMDISKIMAGE, SORTID_STATE, SORTID_UPDATED, +#ifdef HAVE_BGL SORTID_USE, +#endif SORTID_USER, SORTID_CNT }; diff --git a/src/sview/common.c b/src/sview/common.c index aecce533c8eb4e4cbb8d62cd30fe30b52f6988bb..fa341ede4296df0f82d5445694b71081b602bc47 100644 --- a/src/sview/common.c +++ b/src/sview/common.c @@ -546,7 +546,7 @@ extern GtkTreeStore *create_treestore(GtkTreeView *tree_view, treestore = gtk_tree_store_newv(count, types); if(!treestore) { - g_error("Can't great treestore.\n"); + g_error("Can't create treestore.\n"); return NULL; }