From ab27e7ea1009e4915551f6971580c201f1be9b36 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Mon, 26 Mar 2007 22:36:09 +0000
Subject: [PATCH] svn merge -r11234:11242
 https://eris.llnl.gov/svn/slurm/branches/slurm-1.1

---
 NEWS                                          |  2 ++
 .../block_allocator/block_allocator.c         | 29 +++++++++----------
 .../block_allocator/block_allocator.h         |  2 +-
 src/plugins/select/bluegene/plugin/bluegene.c | 11 +++----
 .../select/bluegene/plugin/select_bluegene.c  |  4 ++-
 src/smap/configure_functions.c                |  2 +-
 src/smap/grid_functions.c                     |  5 ++--
 7 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/NEWS b/NEWS
index d1cfa404624..2f82232eb16 100644
--- a/NEWS
+++ b/NEWS
@@ -263,6 +263,8 @@ documents those changes that are of interest to users and admins.
  - sched/wiki2 - Report job's node sharing options.
  - sched/wiki2 - If SchedulerPort is in use, retry opening it indefinitely.
  - sched/wiki2 - Add support for changing the size of a pending job.
+ - BLUEGENE - Fix to correctly look at downed/drained nodes with picking 
+   a block to run a job and not confuse it with another running job.
 
 * Changes in SLURM 1.1.32
 =========================
diff --git a/src/plugins/select/bluegene/block_allocator/block_allocator.c b/src/plugins/select/bluegene/block_allocator/block_allocator.c
index 9d309de61a6..67df4fc5550 100644
--- a/src/plugins/select/bluegene/block_allocator/block_allocator.c
+++ b/src/plugins/select/bluegene/block_allocator/block_allocator.c
@@ -129,8 +129,8 @@ static int _create_config_even(ba_node_t *grid);
 #endif
 
 /** */
-static void _new_ba_node(ba_node_t *ba_node, 
-		int *coord);
+static void _new_ba_node(ba_node_t *ba_node, int *coord,
+			 bool track_down_nodes);
 /** */
 static int _reset_the_path(ba_switch_t *curr_switch, int source, 
 			   int target, int dim);
@@ -934,8 +934,6 @@ node_info_error:
 
 	_create_ba_system();
 	
-	init_grid(node_info_ptr);
-	
 #ifndef HAVE_BG_FILES
 	_create_config_even(ba_system_ptr->grid);
 #endif
@@ -943,6 +941,7 @@ node_info_error:
 	best_path = list_create(_delete_path_list);
 
 	_initialized = true;
+	init_grid(node_info_ptr);
 }
 
 extern void init_wires()
@@ -1223,7 +1222,7 @@ extern int copy_node_path(List nodes, List dest_nodes)
 			       ba_node->coord[Y],
 			       ba_node->coord[Z]);
 			new_ba_node = ba_copy_node(ba_node);
-			_new_ba_node(new_ba_node, ba_node->coord);
+			_new_ba_node(new_ba_node, ba_node->coord, false);
 			list_push(dest_nodes, new_ba_node);
 			
 		}
@@ -1431,7 +1430,7 @@ end_it:
 	return name;	
 }
 
-extern int reset_ba_system()
+extern int reset_ba_system(bool track_down_nodes)
 {
 	int x;
 #ifdef HAVE_BG
@@ -1447,11 +1446,11 @@ extern int reset_ba_system()
 				coord[Y] = y;
 				coord[Z] = z;
 				_new_ba_node(&ba_system_ptr->grid[x][y][z], 
-					     coord);
+					     coord, track_down_nodes);
 			}
 #else
 		coord[X] = x;
-		_new_ba_node(&ba_system_ptr->grid[x], coord);
+		_new_ba_node(&ba_system_ptr->grid[x], coord, track_down_nodes);
 
 #endif
 	}
@@ -2367,7 +2366,7 @@ static int _copy_the_path(List nodes, ba_switch_t *curr_switch,
 					       grid[mark_node_tar[X]]
 					       [mark_node_tar[Y]]
 					       [mark_node_tar[Z]]);
-			_new_ba_node(ba_node, mark_node_tar);
+			_new_ba_node(ba_node, mark_node_tar, false);
 			list_push(nodes, ba_node);
 			debug3("adding %d%d%d as a pass through",
 			       ba_node->coord[X], 
@@ -2819,15 +2818,15 @@ extern int set_bp_map(void)
 	
 }
 
-static void _new_ba_node(ba_node_t *ba_node, int *coord)
+static void _new_ba_node(ba_node_t *ba_node, int *coord, bool track_down_nodes)
 {
 	int i,j;
 	uint16_t node_base_state = ba_node->state & NODE_STATE_BASE;
 	
-	if((node_base_state != NODE_STATE_DOWN)
-	   && !(ba_node->state & NODE_STATE_DRAIN)) 
+	if(((node_base_state != NODE_STATE_DOWN)
+	   && !(ba_node->state & NODE_STATE_DRAIN)) || !track_down_nodes) 
 		ba_node->used = false;
-	
+
 	for (i=0; i<BA_SYSTEM_DIMENSIONS; i++){
 		ba_node->coord[i] = coord[i];
 		
@@ -2868,12 +2867,12 @@ static void _create_ba_system(void)
 				coord[Y] = y;
 				coord[Z] = z;
 				_new_ba_node(&ba_system_ptr->grid[x][y][z], 
-					     coord);
+					     coord, true);
 			}
 		}
 #else
 		coord[X] = x;
-		_new_ba_node(&ba_system_ptr->grid[x], coord);
+		_new_ba_node(&ba_system_ptr->grid[x], coord, true);
 #endif
 	}
 }
diff --git a/src/plugins/select/bluegene/block_allocator/block_allocator.h b/src/plugins/select/bluegene/block_allocator/block_allocator.h
index 95c6298d097..f882e197b88 100644
--- a/src/plugins/select/bluegene/block_allocator/block_allocator.h
+++ b/src/plugins/select/bluegene/block_allocator/block_allocator.h
@@ -350,7 +350,7 @@ extern int check_and_set_node_list(List nodes);
 extern char *set_bg_block(List results, int *start, 
 			  int *geometry, int conn_type);
 
-extern int reset_ba_system();
+extern int reset_ba_system(bool track_down_nodes);
 
 extern void init_grid(node_info_msg_t *node_info_ptr);
 /*
diff --git a/src/plugins/select/bluegene/plugin/bluegene.c b/src/plugins/select/bluegene/plugin/bluegene.c
index 6e074a48b83..cb5432968ad 100644
--- a/src/plugins/select/bluegene/plugin/bluegene.c
+++ b/src/plugins/select/bluegene/plugin/bluegene.c
@@ -692,7 +692,7 @@ extern bool blocks_overlap(bg_record_t *rec_a, bg_record_t *rec_b)
 	bitstr_t *my_bitmap = NULL;
 
 	if(rec_a->bp_count > 1 && rec_a->bp_count > 1) {
-		reset_ba_system();
+		reset_ba_system(false);
 		check_and_set_node_list(rec_a->bg_block_list);
 		if(check_and_set_node_list(rec_b->bg_block_list)
 		   == SLURM_ERROR) 
@@ -956,7 +956,7 @@ extern int create_defined_blocks(bg_layout_t overlapped)
 	init_wires();
 #endif
 	slurm_mutex_lock(&block_state_mutex);
-	reset_ba_system();
+	reset_ba_system(false);
 	if(bg_list) {
 		itr = list_iterator_create(bg_list);
 		while((bg_record = list_next(itr))) {
@@ -993,7 +993,7 @@ extern int create_defined_blocks(bg_layout_t overlapped)
 			   && bg_record->cpus_per_bp == procs_per_node) {
 				char *name = NULL;
 				if(overlapped == LAYOUT_OVERLAP)
-					reset_ba_system();
+					reset_ba_system(false);
 				for(i=0; i<BA_SYSTEM_DIMENSIONS; i++) 
 					geo[i] = bg_record->geo[i];
 				debug2("adding %s %d%d%d %d%d%d",
@@ -1140,9 +1140,9 @@ extern int create_dynamic_block(ba_request_t *request, List my_block_list)
 	blockreq_t blockreq;
 
 	slurm_mutex_lock(&block_state_mutex);
-	reset_ba_system();
 		
 	if(my_block_list) {
+		reset_ba_system(true);
 		itr = list_iterator_create(my_block_list);
 		while ((bg_record = (bg_record_t *) list_next(itr)) != NULL) {
 			if(!my_bitmap) {
@@ -1181,6 +1181,7 @@ extern int create_dynamic_block(ba_request_t *request, List my_block_list)
 		list_iterator_destroy(itr);
 		FREE_NULL_BITMAP(my_bitmap);
 	} else {
+		reset_ba_system(false);
 		debug("No list was given");
 	}
 
@@ -1432,7 +1433,7 @@ extern int create_full_system_block()
 		rc = SLURM_ERROR;
 		goto no_total;
 	}
-	reset_ba_system();
+	reset_ba_system(false);
 	for(i=0; i<BA_SYSTEM_DIMENSIONS; i++) 
 		geo[i] = bg_record->geo[i];
 	debug2("adding %s %d%d%d %d%d%d",
diff --git a/src/plugins/select/bluegene/plugin/select_bluegene.c b/src/plugins/select/bluegene/plugin/select_bluegene.c
index 107d5de9702..2098a175e94 100644
--- a/src/plugins/select/bluegene/plugin/select_bluegene.c
+++ b/src/plugins/select/bluegene/plugin/select_bluegene.c
@@ -406,7 +406,7 @@ extern int select_p_state_restore(char *dir_name)
 	if(select_g_unpack_node_info(&node_select_ptr, buffer) == SLURM_ERROR) 
 		goto unpack_error;
 	
-	reset_ba_system();
+	reset_ba_system(false);
 
 	node_bitmap = bit_alloc(node_record_count);	
 	ionode_bitmap = bit_alloc(bluegene_numpsets);	
@@ -1086,6 +1086,8 @@ extern int select_p_update_node_state (int index, uint16_t state)
 		}
 	}
 #endif
+	if(bluegene_layout_mode == LAYOUT_DYNAMIC) 
+		remove_from_request_list();
 	return SLURM_ERROR;
 }
 
diff --git a/src/smap/configure_functions.c b/src/smap/configure_functions.c
index 0a3f3c8e488..684379de1c0 100644
--- a/src/smap/configure_functions.c
+++ b/src/smap/configure_functions.c
@@ -344,7 +344,7 @@ static int _create_allocation(char *com, List allocated_blocks)
 		}
 	start_request:
 		if(!strcasecmp(layout_mode,"OVERLAP"))
-			reset_ba_system();
+			reset_ba_system(true);
 	
 		/*
 		  Here is where we do the allocating of the partition. 
diff --git a/src/smap/grid_functions.c b/src/smap/grid_functions.c
index 11093a5b1da..444ee30e4d8 100644
--- a/src/smap/grid_functions.c
+++ b/src/smap/grid_functions.c
@@ -56,7 +56,7 @@ extern int set_grid(int start, int end, int count)
 				    ||  (ba_system_ptr->grid[x][y][z].state 
 					 & NODE_STATE_DRAIN))
 					continue;
-				
+
 				ba_system_ptr->grid[x][y][z].letter = 
 					letters[count%62];
 				ba_system_ptr->grid[x][y][z].color = 
@@ -102,10 +102,11 @@ extern int set_grid_bg(int *start, int *end, int count, int set)
 		for (y = start[Y]; y <= end[Y]; y++) {
 			for (z = start[Z]; z <= end[Z]; z++) {
 				if(set 
-				   || ((ba_system_ptr->grid[x][y][z].letter
+				   && ((ba_system_ptr->grid[x][y][z].letter
 					== '.')
 				       && (ba_system_ptr->grid[x][y][z].letter 
 					   != '#'))) {
+					
 						ba_system_ptr->
 							grid[x][y][z].letter = 
 							letters[count%62];
-- 
GitLab