From d8feb129d7201e4e15db91e79bdfe61a26542ef4 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Fri, 29 Feb 2008 18:22:41 +0000
Subject: [PATCH] gang3.patch from Chris Holmes, hp

---
 doc/html/schedplugins.shtml                   |  8 +++++++
 src/plugins/sched/backfill/backfill_wrapper.c |  9 +++++++
 src/plugins/sched/builtin/builtin_wrapper.c   |  9 +++++++
 src/plugins/sched/gang/gang.c                 | 24 +++++++++++++++++++
 src/plugins/sched/gang/sched_gang.c           | 13 +++++++++-
 src/plugins/sched/hold/hold_wrapper.c         |  9 +++++++
 src/plugins/sched/wiki/sched_wiki.c           |  8 +++++++
 src/plugins/sched/wiki2/sched_wiki.c          |  8 +++++++
 src/slurmctld/node_scheduler.c                |  2 ++
 src/slurmctld/sched_plugin.c                  | 14 +++++++++++
 src/slurmctld/sched_plugin.h                  |  5 ++++
 11 files changed, 108 insertions(+), 1 deletion(-)

diff --git a/doc/html/schedplugins.shtml b/doc/html/schedplugins.shtml
index 4de969fca64..11272733826 100644
--- a/doc/html/schedplugins.shtml
+++ b/doc/html/schedplugins.shtml
@@ -100,6 +100,14 @@ get partition, allocated resources, time limit, etc.</p>
 the plugin should return SLURM_ERROR and set the errno to an appropriate value 
 to indicate the reason for failure.</p>
 
+<p class="commandline">int slurm_sched_plugin_freealloc (void);</p>
+<p style="margin-left:.2in"><b>Description</b>: Note the successful release of resources for a job.</p>
+<p style="margin-left:.2in"><b>Arguments</b>: Pointer to the slurmctld job structure. This can be used to
+get partition, allocated resources, time limit, etc.</p>
+<p style="margin-left:.2in"><b>Returns</b>: SLURM_SUCCESS if successful. On failure, 
+the plugin should return SLURM_ERROR and set the errno to an appropriate value 
+to indicate the reason for failure.</p>
+
 <p class="commandline">uint32_t slurm_sched_plugin_initial_priority (
 uint32_t last_prio, struct job_record *job_ptr);</p>
 <p style="margin-left:.2in"><b>Description</b>: Establish the initial priority of a new job.</p>
diff --git a/src/plugins/sched/backfill/backfill_wrapper.c b/src/plugins/sched/backfill/backfill_wrapper.c
index 9f211250393..0d235cd6745 100644
--- a/src/plugins/sched/backfill/backfill_wrapper.c
+++ b/src/plugins/sched/backfill/backfill_wrapper.c
@@ -146,6 +146,15 @@ slurm_sched_plugin_newalloc( struct job_record *job_ptr )
 	return SLURM_SUCCESS;
 }
 
+/***************************************************************************/
+/*  TAG(                   slurm_sched_plugin_freealloc                  ) */
+/***************************************************************************/
+int
+slurm_sched_plugin_freealloc( struct job_record *job_ptr )
+{
+	return SLURM_SUCCESS;
+}
+
 
 /**************************************************************************/
 /* TAG(                   slurm_sched_plugin_initial_priority           ) */
diff --git a/src/plugins/sched/builtin/builtin_wrapper.c b/src/plugins/sched/builtin/builtin_wrapper.c
index c81c12e34c1..fb66522cf02 100644
--- a/src/plugins/sched/builtin/builtin_wrapper.c
+++ b/src/plugins/sched/builtin/builtin_wrapper.c
@@ -92,6 +92,15 @@ slurm_sched_plugin_newalloc( struct job_record *job_ptr )
 	return SLURM_SUCCESS;
 }
 
+/***************************************************************************/
+/*  TAG(                   slurm_sched_plugin_freealloc                  ) */
+/***************************************************************************/
+int
+slurm_sched_plugin_freealloc( struct job_record *job_ptr )
+{
+	return SLURM_SUCCESS;
+}
+
 
 /**************************************************************************/
 /* TAG(                   slurm_sched_plugin_initial_priority           ) */ 
diff --git a/src/plugins/sched/gang/gang.c b/src/plugins/sched/gang/gang.c
index a97be206c94..b54b3f9bcb0 100644
--- a/src/plugins/sched/gang/gang.c
+++ b/src/plugins/sched/gang/gang.c
@@ -966,6 +966,30 @@ gs_job_scan(void)
 	return SLURM_SUCCESS;
 }
 
+extern int
+gs_job_fini(struct job_record *job_ptr)
+{
+	int i;
+	struct gs_part *p_ptr;
+	
+	debug3("sched/gang: entering gs_job_fini");
+	pthread_mutex_lock(&data_mutex);
+	p_ptr = _find_gs_part(job_ptr->partition);
+	if (!p_ptr) {
+		pthread_mutex_unlock(&data_mutex);
+		debug3("sched/gang: leaving gs_job_fini");
+		return SLURM_SUCCESS;
+	}
+
+	/*remove job from the partition */
+	_remove_job_from_part(job_ptr->job_id, p_ptr);
+	_update_active_row(p_ptr);
+	pthread_mutex_unlock(&data_mutex);
+	debug3("sched/gang: leaving gs_job_fini");
+	
+	return SLURM_SUCCESS;
+}
+
 /* rebuild from scratch */
 /* A reconfigure can affect this plugin in these ways:
  * - partitions can be added or removed
diff --git a/src/plugins/sched/gang/sched_gang.c b/src/plugins/sched/gang/sched_gang.c
index 6a43d503881..620ebfc8cb6 100644
--- a/src/plugins/sched/gang/sched_gang.c
+++ b/src/plugins/sched/gang/sched_gang.c
@@ -39,7 +39,7 @@
 
 const char		plugin_name[]	= "Gang Scheduler plugin";
 const char		plugin_type[]	= "sched/gang";
-const uint32_t		plugin_version	= 100;
+const uint32_t		plugin_version	= 101;
 
 /* A plugin-global errno. */
 static int plugin_errno = SLURM_SUCCESS;
@@ -90,6 +90,17 @@ extern int slurm_sched_plugin_newalloc( struct job_record *job_ptr )
 	return gs_job_start(job_ptr);
 }
 
+/***************************************************************************/
+/*  TAG(                   slurm_sched_plugin_freealloc                  ) */
+/***************************************************************************/
+extern int slurm_sched_plugin_freealloc( struct job_record *job_ptr )
+{
+	if (!job_ptr)
+		return SLURM_ERROR;
+	debug3("sched/gang: slurm_sched_freealloc called");
+	return gs_job_fini(job_ptr);
+}
+
 
 /**************************************************************************/
 /* TAG(                   slurm_sched_plugin_initial_priority           ) */ 
diff --git a/src/plugins/sched/hold/hold_wrapper.c b/src/plugins/sched/hold/hold_wrapper.c
index cc06452f56c..aa87fe81ea6 100644
--- a/src/plugins/sched/hold/hold_wrapper.c
+++ b/src/plugins/sched/hold/hold_wrapper.c
@@ -97,6 +97,15 @@ slurm_sched_plugin_newalloc( struct job_record *job_ptr )
 	return SLURM_SUCCESS;
 }
 
+/***************************************************************************/
+/*  TAG(                   slurm_sched_plugin_freealloc                  ) */
+/***************************************************************************/
+int
+slurm_sched_plugin_freealloc( struct job_record *job_ptr )
+{
+	return SLURM_SUCCESS;
+}
+
 
 /**************************************************************************/
 /* TAG(                   slurm_sched_plugin_initial_priority           ) */ 
diff --git a/src/plugins/sched/wiki/sched_wiki.c b/src/plugins/sched/wiki/sched_wiki.c
index 3bd61ab4d39..881c7b5fbfc 100644
--- a/src/plugins/sched/wiki/sched_wiki.c
+++ b/src/plugins/sched/wiki/sched_wiki.c
@@ -84,6 +84,14 @@ extern int slurm_sched_plugin_newalloc( struct job_record *job_ptr )
 	return SLURM_SUCCESS;
 }
 
+/***************************************************************************/
+/*  TAG(                   slurm_sched_plugin_freealloc                  ) */
+/***************************************************************************/
+extern int slurm_sched_plugin_freealloc( struct job_record *job_ptr )
+{
+	return SLURM_SUCCESS;
+}
+
 
 /**************************************************************************/
 /* TAG(                   slurm_sched_plugin_initial_priority           ) */ 
diff --git a/src/plugins/sched/wiki2/sched_wiki.c b/src/plugins/sched/wiki2/sched_wiki.c
index 2d8aa93d57b..cbafc576704 100644
--- a/src/plugins/sched/wiki2/sched_wiki.c
+++ b/src/plugins/sched/wiki2/sched_wiki.c
@@ -83,6 +83,14 @@ extern int slurm_sched_plugin_newalloc( struct job_record *job_ptr )
 	return SLURM_SUCCESS;
 }
 
+/***************************************************************************/
+/*  TAG(                   slurm_sched_plugin_freealloc                  ) */
+/***************************************************************************/
+extern int slurm_sched_plugin_freealloc( struct job_record *job_ptr )
+{
+	return SLURM_SUCCESS;
+}
+
 
 /**************************************************************************/
 /* TAG(                   slurm_sched_plugin_initial_priority           ) */ 
diff --git a/src/slurmctld/node_scheduler.c b/src/slurmctld/node_scheduler.c
index f0904115cac..f2489ee3d31 100644
--- a/src/slurmctld/node_scheduler.c
+++ b/src/slurmctld/node_scheduler.c
@@ -152,6 +152,8 @@ extern void deallocate_nodes(struct job_record *job_ptr, bool timeout,
 	xassert(job_ptr);
 	xassert(job_ptr->details);
 
+	if (slurm_sched_freealloc(job_ptr) != SLURM_SUCCESS)
+		error("slurm_sched_freealloc(%u): %m", job_ptr->job_id);
 	if (select_g_job_fini(job_ptr) != SLURM_SUCCESS)
 		error("select_g_job_fini(%u): %m", job_ptr->job_id);
 	
diff --git a/src/slurmctld/sched_plugin.c b/src/slurmctld/sched_plugin.c
index 58448d47bcd..6b2f9f3fe67 100644
--- a/src/slurmctld/sched_plugin.c
+++ b/src/slurmctld/sched_plugin.c
@@ -53,6 +53,7 @@
 typedef struct slurm_sched_ops {
 	int		(*schedule)		( void );
 	int		(*newalloc)		( struct job_record * );
+	int		(*freealloc)		( struct job_record * );
 	uint32_t	(*initial_priority)	( uint32_t, 
 						  struct job_record * );
 	void            (*job_is_pending)     	( void );
@@ -93,6 +94,7 @@ slurm_sched_get_ops( slurm_sched_context_t *c )
 	static const char *syms[] = {
 		"slurm_sched_plugin_schedule",
 		"slurm_sched_plugin_newalloc",
+		"slurm_sched_plugin_freealloc",
 		"slurm_sched_plugin_initial_priority",
 		"slurm_sched_plugin_job_is_pending",
 		"slurm_sched_plugin_reconfig",
@@ -279,6 +281,18 @@ slurm_sched_newalloc( struct job_record *job_ptr )
 	return (*(g_sched_context->ops.newalloc))( job_ptr );
 }
 
+/* *********************************************************************** */
+/*  TAG(                        slurm_sched_freealloc                    )  */
+/* *********************************************************************** */
+int
+slurm_sched_freealloc( struct job_record *job_ptr )
+{
+	if ( slurm_sched_init() < 0 )
+		return SLURM_ERROR;
+	
+	return (*(g_sched_context->ops.freealloc))( job_ptr );
+}
+
 
 /* *********************************************************************** */
 /*  TAG(                   slurm_sched_initital_priority                )  */
diff --git a/src/slurmctld/sched_plugin.h b/src/slurmctld/sched_plugin.h
index 7ff27f020c3..d5e6adf7ff8 100644
--- a/src/slurmctld/sched_plugin.h
+++ b/src/slurmctld/sched_plugin.h
@@ -76,6 +76,11 @@ int slurm_sched_schedule( void );
  */
 int slurm_sched_newalloc( struct job_record *job_ptr );
 
+/*
+ * Note the successful release of resources to a job.
+ */
+int slurm_sched_freealloc( struct job_record *job_ptr );
+
 /*
  * Supply the initial SLURM priority for a newly-submitted job.
  */
-- 
GitLab