From bd2eb2ffb0e67aae0a1149f43dc8a6536f806c44 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Tue, 24 Nov 2009 23:44:32 +0000
Subject: [PATCH] more modifications for a real bluegene system. 1. sfree and
 scontrol now free blocks. 2. correct connection type is given for jobs now.
 3. configuring jobs are set at the correct time now

---
 src/common/slurm_protocol_defs.c              | 10 ++--
 .../select/bluegene/plugin/bg_block_info.c    |  1 -
 .../select/bluegene/plugin/bg_job_place.c     | 10 +++-
 .../select/bluegene/plugin/bg_job_run.c       | 44 +++++++-------
 .../bluegene/plugin/bg_record_functions.c     |  9 +--
 src/plugins/select/bluegene/plugin/bluegene.c | 27 ++++++---
 src/plugins/select/bluegene/plugin/bluegene.h |  2 +-
 src/plugins/select/bluegene/plugin/jobinfo.c  | 57 +++++--------------
 .../select/bluegene/plugin/select_bluegene.c  |  1 +
 src/slurmctld/node_scheduler.c                | 11 +++-
 src/slurmctld/proc_req.c                      |  4 +-
 src/smap/job_functions.c                      |  6 +-
 12 files changed, 92 insertions(+), 90 deletions(-)

diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c
index 67471db6d2f..a99997ceff9 100644
--- a/src/common/slurm_protocol_defs.c
+++ b/src/common/slurm_protocol_defs.c
@@ -1254,11 +1254,11 @@ extern char *conn_type_string(enum connection_type conn_type)
 {
 	switch (conn_type) {
 	case (SELECT_MESH):
-		return "MESH";
+		return "Mesh";
 	case (SELECT_TORUS):
-		return "TORUS";
+		return "Torus";
 	case (SELECT_SMALL):
-		return "SMALL";
+		return "Small";
 	case (SELECT_NAV):
 		return "NAV";
 #ifndef HAVE_BGL
@@ -1272,9 +1272,9 @@ extern char *conn_type_string(enum connection_type conn_type)
 		return "HTC_L";
 #endif
 	default:
-		return "";
+		return "n/a";
 	}
-	return "";
+	return "n/a";
 }
 
 #ifdef HAVE_BGL
diff --git a/src/plugins/select/bluegene/plugin/bg_block_info.c b/src/plugins/select/bluegene/plugin/bg_block_info.c
index 9a819591202..892122017ea 100644
--- a/src/plugins/select/bluegene/plugin/bg_block_info.c
+++ b/src/plugins/select/bluegene/plugin/bg_block_info.c
@@ -470,7 +470,6 @@ extern int update_block_list()
 					bg_record->job_ptr->job_state |=
 						JOB_CONFIGURING;
 					last_job_update = time(NULL);
-
 				}
 				break;
 			case RM_PARTITION_ERROR:
diff --git a/src/plugins/select/bluegene/plugin/bg_job_place.c b/src/plugins/select/bluegene/plugin/bg_job_place.c
index 8313f3a29aa..a0cec8d9f40 100644
--- a/src/plugins/select/bluegene/plugin/bg_job_place.c
+++ b/src/plugins/select/bluegene/plugin/bg_job_place.c
@@ -1603,10 +1603,16 @@ preempt:
 						job_ptr->select_jobinfo,
 						SELECT_JOBDATA_BLOCK_ID,
 						bg_record->bg_block_id);
+					conn_type = bg_record->conn_type;
 					select_g_select_jobinfo_set(
 						job_ptr->select_jobinfo,
 						SELECT_JOBDATA_CONN_TYPE,
-						&bg_record->conn_type);
+						&conn_type);
+					if(job_ptr) {
+						job_ptr->job_state 
+							|= JOB_CONFIGURING;
+						last_job_update = time(NULL);
+					}
 				} else
 					select_g_select_jobinfo_set(
 						job_ptr->select_jobinfo,
@@ -1642,7 +1648,7 @@ preempt:
 	if(bg_conf->layout_mode == LAYOUT_DYNAMIC) {		
 		slurm_mutex_lock(&block_state_mutex);
 		if(blocks_added) 
-			_sync_block_lists(block_list, bg_lists->main);		
+			_sync_block_lists(block_list, bg_lists->main);
 		slurm_mutex_unlock(&block_state_mutex);
 		slurm_mutex_unlock(&create_dynamic_mutex);
 	}
diff --git a/src/plugins/select/bluegene/plugin/bg_job_run.c b/src/plugins/select/bluegene/plugin/bg_job_run.c
index c8dda9d9c9a..836dff60a52 100644
--- a/src/plugins/select/bluegene/plugin/bg_job_run.c
+++ b/src/plugins/select/bluegene/plugin/bg_job_run.c
@@ -594,15 +594,16 @@ static void _start_agent(bg_update_t *bg_update_ptr)
 		return;
 	}
 	if(bg_record->state == RM_PARTITION_DEALLOCATING) {
-		slurm_mutex_unlock(&block_state_mutex);
 		debug("Block is in Deallocating state, waiting for free.");
-		bg_free_block(bg_record);
+		bg_free_block(bg_record, 1, 1);
 		/* no reason to reboot here since we are already
 		   deallocating */
 		bg_update_ptr->reboot = 0;
-		slurm_mutex_lock(&block_state_mutex);
-		if(!_make_sure_block_still_exists(bg_update_ptr, bg_record))
+		if(!_make_sure_block_still_exists(bg_update_ptr, bg_record)) {
+			slurm_mutex_unlock(&block_state_mutex);
+			slurm_mutex_unlock(&job_start_mutex);
 			return;
+		}
 	} 
 	
 	delete_list = list_create(NULL);
@@ -682,8 +683,11 @@ static void _start_agent(bg_update_t *bg_update_ptr)
 	num_block_to_free = num_block_freed = 0;
 	
 	slurm_mutex_lock(&block_state_mutex);
-	if(!_make_sure_block_still_exists(bg_update_ptr, bg_record))
+	if(!_make_sure_block_still_exists(bg_update_ptr, bg_record)) {
+		slurm_mutex_unlock(&block_state_mutex);
+		slurm_mutex_unlock(&job_start_mutex);
 		return;
+	}
 
 	if(bg_record->job_running <= NO_JOB_RUNNING) {
 		// _reset_block(bg_record); should already happened
@@ -751,13 +755,14 @@ static void _start_agent(bg_update_t *bg_update_ptr)
 
 	if(rc) {
 		bg_record->modifying = 1;
-		slurm_mutex_unlock(&block_state_mutex);
 			
-		bg_free_block(bg_record);
+		bg_free_block(bg_record, 1, 1);
 
-		slurm_mutex_lock(&block_state_mutex);
-		if(!_make_sure_block_still_exists(bg_update_ptr, bg_record))
+		if(!_make_sure_block_still_exists(bg_update_ptr, bg_record)) {
+			slurm_mutex_unlock(&block_state_mutex);
+			slurm_mutex_unlock(&job_start_mutex);
 			return;
+		}
 #ifdef HAVE_BG_FILES
 #ifdef HAVE_BGL
 		if ((rc = bridge_modify_block(bg_record->bg_block_id,
@@ -835,13 +840,14 @@ static void _start_agent(bg_update_t *bg_update_ptr)
 		bg_record->modifying = 0;		
 	} else if(bg_update_ptr->reboot) {
 		bg_record->modifying = 1;
-		slurm_mutex_unlock(&block_state_mutex);
 
-		bg_free_block(bg_record);
+		bg_free_block(bg_record, 1, 1);
 
-		slurm_mutex_lock(&block_state_mutex);
-		if(!_make_sure_block_still_exists(bg_update_ptr, bg_record))
+		if(!_make_sure_block_still_exists(bg_update_ptr, bg_record)) {
+			slurm_mutex_unlock(&block_state_mutex);
+			slurm_mutex_unlock(&job_start_mutex);
 			return;
+		}
 		bg_record->modifying = 0;		
 	}
 
@@ -871,8 +877,11 @@ static void _start_agent(bg_update_t *bg_update_ptr)
 			return;
 		}
 		slurm_mutex_lock(&block_state_mutex);		
-		if(!_make_sure_block_still_exists(bg_update_ptr, bg_record))
+		if(!_make_sure_block_still_exists(bg_update_ptr, bg_record)) {
+			slurm_mutex_unlock(&block_state_mutex);
+			slurm_mutex_unlock(&job_start_mutex);
 			return;
+		}
 	} else if (bg_record->state == RM_PARTITION_CONFIGURING) 
 		bg_record->boot_state = 1;		
 	
@@ -888,7 +897,8 @@ static void _start_agent(bg_update_t *bg_update_ptr)
 		
 	bg_record->boot_count = 0;
 	xfree(bg_record->target_name);
-	bg_record->target_name = uid_to_string(bg_update_ptr->job_ptr->user_id);
+	bg_record->target_name = 
+		uid_to_string(bg_update_ptr->job_ptr->user_id);
 	debug("setting the target_name for Block %s to %s",
 	      bg_record->bg_block_id, bg_record->target_name);
 	
@@ -1450,10 +1460,6 @@ extern int boot_block(bg_record_t *bg_record)
 	if(bg_record->state != RM_PARTITION_CONFIGURING)
 		bg_record->state = RM_PARTITION_CONFIGURING;
 	debug("Setting bootflag for %s", bg_record->bg_block_id);
-	if(bg_record->job_ptr) {
-		bg_record->job_ptr->job_state |= JOB_CONFIGURING;
-		last_job_update = time(NULL);
-	}
 	bg_record->boot_state = 1;
 	//bg_record->boot_count = 0;
 	last_bg_update = time(NULL);
diff --git a/src/plugins/select/bluegene/plugin/bg_record_functions.c b/src/plugins/select/bluegene/plugin/bg_record_functions.c
index 1457cb4f8e4..d785675aea1 100644
--- a/src/plugins/select/bluegene/plugin/bg_record_functions.c
+++ b/src/plugins/select/bluegene/plugin/bg_record_functions.c
@@ -1461,12 +1461,13 @@ extern int resume_block(bg_record_t *bg_record)
 {
 	xassert(bg_record);
 
-	if(bg_record->job_running >= NO_JOB_RUNNING)
+	if(bg_record->job_running > NO_JOB_RUNNING)
 		return SLURM_SUCCESS;
 
-	info("Block %s put back into service after "
-	     "being in an error state.",
-	      bg_record->bg_block_id);
+	if(bg_record->state == RM_PARTITION_ERROR)
+		info("Block %s put back into service after "
+		     "being in an error state.",
+		     bg_record->bg_block_id);
 
 	if(remove_from_bg_list(bg_lists->job_running, bg_record)
 	   == SLURM_SUCCESS) 
diff --git a/src/plugins/select/bluegene/plugin/bluegene.c b/src/plugins/select/bluegene/plugin/bluegene.c
index 3df42706ae2..b9859e1b5d5 100644
--- a/src/plugins/select/bluegene/plugin/bluegene.c
+++ b/src/plugins/select/bluegene/plugin/bluegene.c
@@ -448,23 +448,28 @@ extern bg_record_t *find_org_in_bg_list(List my_list, bg_record_t *bg_record)
 	return found_record;
 }
 
-extern int bg_free_block(bg_record_t *bg_record)
+extern int bg_free_block(bg_record_t *bg_record, bool wait, bool locked)
 {
 #ifdef HAVE_BG_FILES
 	int rc;
+	int first=1;
 #endif
 	if(!bg_record) {
 		error("bg_free_block: there was no bg_record");
 		return SLURM_ERROR;
 	}
-	
+
+	if(!locked)
+		first = 0;
+
 	while (1) {
 		/* Here we don't need to check if the block is still
 		 * in exsistance since this function can't be called on
 		 * the same block twice.  It may
 		 * had already been removed at this point also.
 		 */
-		slurm_mutex_lock(&block_state_mutex);
+		if(!first)
+			slurm_mutex_lock(&block_state_mutex);
 		if (bg_record->state != NO_VAL
 		    && bg_record->state != RM_PARTITION_FREE 
 		    && bg_record->state != RM_PARTITION_DEALLOCATING) {
@@ -495,18 +500,24 @@ extern int bg_free_block(bg_record_t *bg_record)
 #endif
 		}
 		
-		if ((bg_record->state == RM_PARTITION_FREE)
+		if (!wait || (bg_record->state == RM_PARTITION_FREE)
 #ifdef HAVE_BGL
 		    ||  (bg_record->state == RM_PARTITION_ERROR)
 #endif
 			) {
 			break;
 		}
-		slurm_mutex_unlock(&block_state_mutex);			
+		/* If we were locked outside of this we need to unlock
+		   to not cause deadlock on this mutex until we are
+		   done.
+		*/
+		slurm_mutex_unlock(&block_state_mutex);
 		sleep(3);
+		first = 0;
 	}
 	remove_from_bg_list(bg_lists->booted, bg_record);
-	slurm_mutex_unlock(&block_state_mutex);			
+	if(!locked)
+		slurm_mutex_unlock(&block_state_mutex);			
 		
 	return SLURM_SUCCESS;
 }
@@ -539,7 +550,7 @@ extern void *mult_free_block(void *args)
 			term_jobs_on_block(bg_record->bg_block_id);
 		}
 		debug("freeing the block %s.", bg_record->bg_block_id);
-		bg_free_block(bg_record);	
+		bg_free_block(bg_record, 1, 0);	
 		debug("done\n");
 		slurm_mutex_lock(&freed_cnt_mutex);
 		num_block_freed++;
@@ -603,7 +614,7 @@ extern void *mult_destroy_block(void *args)
 		term_jobs_on_block(bg_record->bg_block_id);
 		
 		debug2("destroying %s", (char *)bg_record->bg_block_id);
-		if(bg_free_block(bg_record) == SLURM_ERROR) {
+		if(bg_free_block(bg_record, 1, 0) == SLURM_ERROR) {
 			debug("there was an error");
 			goto already_here;
 		}
diff --git a/src/plugins/select/bluegene/plugin/bluegene.h b/src/plugins/select/bluegene/plugin/bluegene.h
index 2a979f73394..4d7a616d829 100644
--- a/src/plugins/select/bluegene/plugin/bluegene.h
+++ b/src/plugins/select/bluegene/plugin/bluegene.h
@@ -154,7 +154,7 @@ extern void *block_agent(void *args);
  * nodes, nodecards, and switches */
 extern void *state_agent(void *args);
 
-extern int bg_free_block(bg_record_t *bg_record);
+extern int bg_free_block(bg_record_t *bg_record, bool wait, bool locked);
 
 extern int remove_from_bg_list(List my_bg_list, bg_record_t *bg_record);
 extern bg_record_t *find_and_remove_org_from_bg_list(List my_list, 
diff --git a/src/plugins/select/bluegene/plugin/jobinfo.c b/src/plugins/select/bluegene/plugin/jobinfo.c
index 9b18113c071..39188762e16 100644
--- a/src/plugins/select/bluegene/plugin/jobinfo.c
+++ b/src/plugins/select/bluegene/plugin/jobinfo.c
@@ -41,37 +41,6 @@
 #include "src/common/xmalloc.h"
 #include "src/common/xstring.h"
 
-static char *_job_conn_type_string(uint16_t inx)
-{
-	switch(inx) {
-	case SELECT_TORUS:
-		return "torus";
-		break;
-	case SELECT_MESH:
-		return "mesh";
-		break;
-	case SELECT_SMALL:
-		return "small";
-		break;
-#ifndef HAVE_BGL
-	case SELECT_HTC_S:
-		return "htc_s";
-		break;
-	case SELECT_HTC_D:
-		return "htc_d";
-		break;
-	case SELECT_HTC_V:
-		return "htc_v";
-		break;
-	case SELECT_HTC_L:
-		return "htc_l";
-		break;
-#endif
-	default: 
-		return "n/a";
-	}
-}
-
 static char *_yes_no_string(uint16_t inx)
 {
 	if (inx == (uint16_t) NO_VAL)
@@ -471,7 +440,7 @@ unpack_error:
  * RET        - the string, same as buf
  */
 extern char *sprint_select_jobinfo(select_jobinfo_t *jobinfo,
-				     char *buf, size_t size, int mode)
+				   char *buf, size_t size, int mode)
 {
 	uint16_t geometry[SYSTEM_DIMENSIONS];
 	int i;
@@ -516,7 +485,7 @@ extern char *sprint_select_jobinfo(select_jobinfo_t *jobinfo,
 					 UNIT_NONE);
 		snprintf(buf, size, 
 			 "%7.7s %6.6s %6.6s %8s    %cx%cx%c %-16s",
-			 _job_conn_type_string(jobinfo->conn_type),
+			 conn_type_string(jobinfo->conn_type),
 			 _yes_no_string(jobinfo->reboot),
 			 _yes_no_string(jobinfo->rotate),
 			 max_cpus_char,
@@ -529,7 +498,7 @@ extern char *sprint_select_jobinfo(select_jobinfo_t *jobinfo,
 		snprintf(buf, size, 
 			 "Connection=%s Reboot=%s Rotate=%s "
 			 "Geometry=%cx%cx%c",
-			 _job_conn_type_string(jobinfo->conn_type),
+			 conn_type_string(jobinfo->conn_type),
 			 _yes_no_string(jobinfo->reboot),
 			 _yes_no_string(jobinfo->rotate),
 			 alpha_num[geometry[0]],
@@ -540,7 +509,7 @@ extern char *sprint_select_jobinfo(select_jobinfo_t *jobinfo,
 		snprintf(buf, size, 
 			 "Connection=%s Reboot=%s Rotate=%s "
 			 "Geometry=%cx%cx%c Block_ID=%s",
-			 _job_conn_type_string(jobinfo->conn_type),
+			 conn_type_string(jobinfo->conn_type),
 			 _yes_no_string(jobinfo->reboot),
 			 _yes_no_string(jobinfo->rotate),
 			 alpha_num[geometry[0]],
@@ -560,7 +529,7 @@ extern char *sprint_select_jobinfo(select_jobinfo_t *jobinfo,
 		break;
 	case SELECT_PRINT_CONNECTION:
 		snprintf(buf, size, "%s", 
-			 _job_conn_type_string(jobinfo->conn_type));
+			 conn_type_string(jobinfo->conn_type));
 		break;
 	case SELECT_PRINT_REBOOT:
 		snprintf(buf, size, "%s",
@@ -663,7 +632,7 @@ extern char *xstrdup_select_jobinfo(select_jobinfo_t *jobinfo, int mode)
 					 UNIT_NONE);
 		xstrfmtcat(buf, 
 			   "%7.7s %6.6s %6.6s %8s    %cx%cx%c %-16s",
-			   _job_conn_type_string(jobinfo->conn_type),
+			   conn_type_string(jobinfo->conn_type),
 			   _yes_no_string(jobinfo->reboot),
 			   _yes_no_string(jobinfo->rotate),
 			   max_cpus_char,
@@ -676,7 +645,7 @@ extern char *xstrdup_select_jobinfo(select_jobinfo_t *jobinfo, int mode)
 		xstrfmtcat(buf, 
 			 "Connection=%s Reboot=%s Rotate=%s "
 			 "Geometry=%cx%cx%c Block_ID=%s",
-			 _job_conn_type_string(jobinfo->conn_type),
+			 conn_type_string(jobinfo->conn_type),
 			 _yes_no_string(jobinfo->reboot),
 			 _yes_no_string(jobinfo->rotate),
 			 alpha_num[geometry[0]],
@@ -696,21 +665,21 @@ extern char *xstrdup_select_jobinfo(select_jobinfo_t *jobinfo, int mode)
 		break;
 	case SELECT_PRINT_CONNECTION:
 		xstrfmtcat(buf, "%s", 
-			 _job_conn_type_string(jobinfo->conn_type));
+			   conn_type_string(jobinfo->conn_type));
 		break;
 	case SELECT_PRINT_REBOOT:
 		xstrfmtcat(buf, "%s",
-			 _yes_no_string(jobinfo->reboot));
+			   _yes_no_string(jobinfo->reboot));
 		break;
 	case SELECT_PRINT_ROTATE:
 		xstrfmtcat(buf, "%s",
-			 _yes_no_string(jobinfo->rotate));
+			   _yes_no_string(jobinfo->rotate));
 		break;
 	case SELECT_PRINT_GEOMETRY:
 		xstrfmtcat(buf, "%cx%cx%c",
-			 alpha_num[geometry[0]],
-			 alpha_num[geometry[1]],
-			 alpha_num[geometry[2]]);
+			   alpha_num[geometry[0]],
+			   alpha_num[geometry[1]],
+			   alpha_num[geometry[2]]);
 		break;
 	case SELECT_PRINT_MAX_CPUS:
 		if (jobinfo->max_cpus == NO_VAL)
diff --git a/src/plugins/select/bluegene/plugin/select_bluegene.c b/src/plugins/select/bluegene/plugin/select_bluegene.c
index f1b49d578ae..97f1014293a 100644
--- a/src/plugins/select/bluegene/plugin/select_bluegene.c
+++ b/src/plugins/select/bluegene/plugin/select_bluegene.c
@@ -795,6 +795,7 @@ extern int select_p_update_block (update_block_msg_t *block_desc_ptr)
 		slurm_mutex_unlock(&block_state_mutex);
 		put_block_in_error_state(bg_record, BLOCK_ERROR_STATE, reason);
 	} else if(block_desc_ptr->state == RM_PARTITION_FREE) {
+		bg_free_block(bg_record, 0, 1);
 		resume_block(bg_record);
 		slurm_mutex_unlock(&block_state_mutex);
 	} else if (bg_conf->layout_mode == LAYOUT_DYNAMIC
diff --git a/src/slurmctld/node_scheduler.c b/src/slurmctld/node_scheduler.c
index fbeeb57b2b4..dbde1f803a3 100644
--- a/src/slurmctld/node_scheduler.c
+++ b/src/slurmctld/node_scheduler.c
@@ -1041,6 +1041,7 @@ extern int select_nodes(struct job_record *job_ptr, bool test_only,
 	uint32_t min_nodes, max_nodes, req_nodes;
 	enum job_state_reason fail_reason;
 	time_t now = time(NULL);
+	bool configuring = false;
 	List preemptee_job_list = NULL;
 
 	xassert(job_ptr);
@@ -1062,7 +1063,7 @@ extern int select_nodes(struct job_record *job_ptr, bool test_only,
 	fail_reason = WAIT_NO_REASON;
 	if (part_ptr->state_up == 0)
 		fail_reason = WAIT_PART_STATE;
-	else if (job_ptr->priority == 0)	/* user or administrator hold */
+	else if (job_ptr->priority == 0)       /* user or administrator hold */
 		fail_reason = WAIT_HELD;
 	else if ((job_ptr->time_limit != NO_VAL) &&
 		 (job_ptr->time_limit > part_ptr->max_time))
@@ -1213,8 +1214,14 @@ extern int select_nodes(struct job_record *job_ptr, bool test_only,
 	select_bitmap = NULL;	/* nothing left to free */
 	allocate_nodes(job_ptr);
 	build_node_details(job_ptr);
+
+	/* This could be set in the select plugin so we want to keep
+	   the flag. */
+	configuring = IS_JOB_CONFIGURING(job_ptr);
+
 	job_ptr->job_state = JOB_RUNNING;
-	if (bit_overlap(job_ptr->node_bitmap, power_node_bitmap))
+	if (configuring 
+	    || bit_overlap(job_ptr->node_bitmap, power_node_bitmap))
 		job_ptr->job_state |= JOB_CONFIGURING;
 	if (select_g_select_nodeinfo_set(job_ptr) != SLURM_SUCCESS) {
 		error("select_g_update_nodeinfo(%u): %m", job_ptr->job_id);
diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c
index d3ab6df256f..d9da76dd3f9 100644
--- a/src/slurmctld/proc_req.c
+++ b/src/slurmctld/proc_req.c
@@ -2772,12 +2772,12 @@ static void _slurm_rpc_update_block(slurm_msg_t * msg)
 			name = block_desc_ptr->bg_block_id;
 		} else if(block_desc_ptr->nodes) {
 			error_code = select_g_update_sub_node(block_desc_ptr);
-			END_TIMER2("_slurm_rpc_update_subbp");			
+			END_TIMER2("_slurm_rpc_update_subbp");
 			name = block_desc_ptr->nodes;
 		} else {
 			error("Unknown update for blocks");
 			error_code = SLURM_ERROR;
-			END_TIMER2("_slurm_rpc_update_block");			
+			END_TIMER2("_slurm_rpc_update_block");
 		}
 	}
 
diff --git a/src/smap/job_functions.c b/src/smap/job_functions.c
index 1363a498b61..6b67eb43a66 100644
--- a/src/smap/job_functions.c
+++ b/src/smap/job_functions.c
@@ -165,7 +165,8 @@ extern void get_job(void)
 			if((count>=text_line_cnt)
 			   && (printed_jobs 
 			       < (text_win->_maxy-3))) {
-				job_ptr->nodes = "waiting...";
+				xfree(job_ptr->nodes);
+				job_ptr->nodes = xstrdup("waiting...");
 				job_ptr->num_procs = (int) letters[count%62];
 				wattron(text_win,
 					COLOR_PAIR(colors[count%6]));
@@ -175,7 +176,8 @@ extern void get_job(void)
 				printed_jobs++;
 			} 
 		} else {
-			job_ptr->nodes = "waiting...";
+			xfree(job_ptr->nodes);
+			job_ptr->nodes = xstrdup("waiting...");
 			job_ptr->num_procs = (int) letters[count%62];
 			_print_text_job(job_ptr);
 			printed_jobs++;
-- 
GitLab