diff --git a/NEWS b/NEWS index 2662f272b7c34857c22adf7fa32a000eb4d40eab..9ed62532ac7e7829991248a9e01a5fd50086c9db 100644 --- a/NEWS +++ b/NEWS @@ -11,9 +11,12 @@ documents those changes that are of interest to users and admins. communicates with the slurmstepd processes through the slurmstepd's new named unix domain socket. The "stepd_api" is used to talk to the slurmstepd (src/slurmd/common/stepd_api.[ch]). - -- partition allocator will find most any partition size now. Added support - to start at any point in partition allocator to request a partition - instead of always starting at 000. + -- Bluegene specific - bluegene block allocator will find most any + partition size now. Added support to start at any point in smap + to request a partition instead of always starting at 000. + -- Bluegene specific - Support to smap to down or bring up nodes in + configure mode. Added commands include allup, alldown, + up [range], down [range] * Changes in SLURM 0.7.0-pre3 ============================= diff --git a/src/partition_allocator/partition_allocator.c b/src/partition_allocator/partition_allocator.c index cc712d10d8f075452a3604739f2418d52c087e40..2903c60efcb22219f03ed772ef6e912b91435fcb 100644 --- a/src/partition_allocator/partition_allocator.c +++ b/src/partition_allocator/partition_allocator.c @@ -1954,34 +1954,47 @@ static int _find_match(pa_request_t *pa_request, List results) if(startx == -1) startx = DIM_SIZE[X]-1; if(pa_request->start_req) { + if(pa_request->start[X]>DIM_SIZE[X] +#ifdef HAVE_BGL + || pa_request->start[Y]>DIM_SIZE[Y] + || pa_request->start[Z]>DIM_SIZE[Z] +#endif + ) + return 0; for(x=0;x<PA_SYSTEM_DIMENSIONS;x++) { start[x] = pa_request->start[x]; } } x=0; -#ifdef HAVE_BGL if(pa_request->geometry[X]>DIM_SIZE[X] +#ifdef HAVE_BGL || pa_request->geometry[Y]>DIM_SIZE[Y] - || pa_request->geometry[Z]>DIM_SIZE[Z]) + || pa_request->geometry[Z]>DIM_SIZE[Z] +#endif + ) if(!_check_for_options(pa_request)) return 0; -#endif start_again: while(x!=startx) { x++; debug3("finding %d%d%d try %d", pa_request->geometry[X], +#ifdef HAVE_BGL pa_request->geometry[Y], pa_request->geometry[Z], +#endif x); new_node: debug("starting at %d%d%d", - start[X], - start[Y], - start[Z]); - + start[X], +#ifdef HAVE_BGL + start[Y], + start[Z] +#endif + ); + pa_node = &pa_system_ptr-> grid[start[X]] #ifdef HAVE_BGL @@ -2028,8 +2041,10 @@ start_again: return 0; else { start[X]=0; +#ifdef HAVE_BGL start[Y]=0; start[Z]=0; +#endif goto start_again; } } diff --git a/src/smap/configure_functions.c b/src/smap/configure_functions.c index 5c4f043e1b3d9d3dd802a5923638962eb5f8d647..1d3ee6ebd2960dbc2d8b4eec68e2e861dde971ce 100644 --- a/src/smap/configure_functions.c +++ b/src/smap/configure_functions.c @@ -40,7 +40,8 @@ static void _delete_allocated_parts(List allocated_partitions); static allocated_part_t *_make_request(pa_request_t *request); static int _create_allocation(char *com, List allocated_partitions); static int _resolve(char *com); -static int _down_bps(char *com); +static int _change_state_all_bps(char *com, int state); +static int _change_state_bps(char *com, int state); static int _remove_allocation(char *com, List allocated_partitions); static int _alter_allocation(char *com, List allocated_partitions); static int _copy_allocation(char *com, List allocated_partitions); @@ -192,19 +193,17 @@ static int _create_allocation(char *com, List allocated_partitions) starti++; while(com[starti-1]!='x' && starti<len) starti++; - if(starti==len) - goto start_error_message; - + if(starti==len) + goto start_request; request->start[1] = atoi(&com[starti]); starti++; while(com[starti-1]!='x' && starti<len) starti++; if(starti==len) - goto start_error_message; - + goto start_request; request->start[2] = atoi(&com[starti]); } - + start_request: /* Here is where we do the allocating of the partition. It will send a request back which we will throw into @@ -234,16 +233,23 @@ static int _create_allocation(char *com, List allocated_partitions) if((allocated_part = _make_request(request)) != NULL) list_append(allocated_partitions, allocated_part); + else { + i2 = strlen(error_string); + sprintf(error_string+i2, + "\nGeo requested was %d (%dx%dx%d)\n" + "Start position was %dx%dx%d", + request->size, + request->geometry[0], + request->geometry[1], + request->geometry[2], + request->start[0], + request->start[1], + request->start[2]); + } } } return 1; -start_error_message: - memset(error_string,0,255); - sprintf(error_string, - "Error in start dimension " - "specified, please re-enter"); - return 0; geo_error_message: memset(error_string,0,255); sprintf(error_string, @@ -312,21 +318,44 @@ resolve_error: return 1; } -static int _down_bps(char *com) +static int _change_state_all_bps(char *com, int state) { - int i=4,x; + char allnodes[50]; + memset(allnodes,0,50); + +#ifdef HAVE_BGL + sprintf(allnodes, "[000x%d%d%d]", + DIM_SIZE[X]-1, DIM_SIZE[Y]-1, DIM_SIZE[Z]-1); +#else + sprintf(allnodes, "[0-%d]", + DIM_SIZE[X]); +#endif + return _change_state_bps(allnodes, state); + +} +static int _change_state_bps(char *com, int state) +{ + int i=1,x; int len = strlen(com); int start[SYSTEM_DIMENSIONS], end[SYSTEM_DIMENSIONS]; #ifdef HAVE_BGL int number=0, y=0, z=0; #endif + char letter = '.'; + bool used = false; + char *c_state = "up"; - while(com[i-1] != ' ' && i<len) + if(state == NODE_STATE_DOWN) { + letter = '#'; + used = true; + c_state = "down"; + } + while((com[i-1] > 57 || com[i-1] < 48) && com[i-1] != '[') i++; if(i>(len-1)) { memset(error_string,0,255); sprintf(error_string, - "You didn't specify any nodes to down."); + "You didn't specify any nodes to make %s. %s", c_state, com); return 0; } @@ -368,13 +397,23 @@ static int _down_bps(char *com) start[Y] = end[Y] = (number % 100) / 10; start[Z] = end[Z] = (number % 10); } + if((start[X]>end[X] + || start[Y]>end[Y] + || start[Z]>end[Z]) + || (start[X]<0 + && start[Y]<0 + && start[Z]<0) + || (end[X]>DIM_SIZE[X]-1 + || end[Y]>DIM_SIZE[Y]-1 + || end[Z]>DIM_SIZE[Z]-1)) + goto error_message; for(x=start[X];x<=end[X];x++) { for(y=start[Y];y<=end[Y];y++) { for(z=start[Z];z<=end[Z];z++) { pa_system_ptr->grid[x][y][z].color = 0; - pa_system_ptr->grid[x][y][z].letter = '#'; - pa_system_ptr->grid[x][y][z].used = true; + pa_system_ptr->grid[x][y][z].letter = letter; + pa_system_ptr->grid[x][y][z].used = used; } } } @@ -400,14 +439,31 @@ static int _down_bps(char *com) start[X] = end[X] = atoi(com + i); } + if((start[X]>end[X]) + || (start[X]<0) + || (end[X]>DIM_SIZE[X]-1)) + goto error_message; for(x=start[X];x<=end[X];x++) { pa_system_ptr->grid[x].color = 0; - pa_system_ptr->grid[x].letter = '#'; - pa_system_ptr->grid[x].used = true; + pa_system_ptr->grid[x].letter = letter; + pa_system_ptr->grid[x].used = used; } #endif return 1; +error_message: + memset(error_string,0,255); +#ifdef HAVE_BGL + sprintf(error_string, + "Problem with nodes specified range was %d%d%dx%d%d%d", + start[X],start[Y],start[Z], + end[X],end[Y],end[Z]); +#else + sprintf(error_string, + "Problem with nodes specified range was %d-%d", + start[X],end[X]); +#endif + return 0; } static int _remove_allocation(char *com, List allocated_partitions) { @@ -848,8 +904,14 @@ void get_command(void) mvwprintw(pa_system_ptr->text_win, pa_system_ptr->ycord, pa_system_ptr->xcord, "%s", com); + } else if (!strncasecmp(com, "alldown", 7)) { + _change_state_all_bps(com, NODE_STATE_DOWN); } else if (!strncasecmp(com, "down", 4)) { - _down_bps(com); + _change_state_bps(com, NODE_STATE_DOWN); + } else if (!strncasecmp(com, "allup", 5)) { + _change_state_all_bps(com, NODE_STATE_IDLE); + } else if (!strncasecmp(com, "up", 2)) { + _change_state_bps(com, NODE_STATE_IDLE); } else if (!strncasecmp(com, "remove", 6) || !strncasecmp(com, "delete", 6) || !strncasecmp(com, "drop", 4)) {