From 5de482347796dd9941c9516acd88bfadced24341 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Tue, 4 Oct 2005 00:15:06 +0000
Subject: [PATCH] Added configuration parameters for TaskEpilog, TaskProlog,
 and TaskPlugin.

---
 doc/man/man5/slurm.conf.5        | 18 ++++++++++++++-
 etc/slurm.conf.example           | 19 ++++++++++++++++
 slurm/slurm.h.in                 |  3 +++
 src/api/config_info.c            |  6 +++++
 src/common/read_config.c         | 35 ++++++++++++++++++++++++++--
 src/common/slurm_protocol_api.c  | 39 ++++++++++++++++++++++++++++++--
 src/common/slurm_protocol_api.h  | 16 +++++++++++--
 src/common/slurm_protocol_defs.c |  5 ++++
 src/common/slurm_protocol_pack.c | 10 +++++++-
 src/slurmctld/proc_req.c         |  3 +++
 10 files changed, 146 insertions(+), 8 deletions(-)

diff --git a/doc/man/man5/slurm.conf.5 b/doc/man/man5/slurm.conf.5
index b799b3e78c7..dd48236964d 100644
--- a/doc/man/man5/slurm.conf.5
+++ b/doc/man/man5/slurm.conf.5
@@ -1,4 +1,4 @@
-.TH "slurm.conf" "5" "September 2005" "slurm.conf 0.6" "Slurm configuration file"
+.TH "slurm.conf" "5" "October 2005" "slurm.conf 0.7" "Slurm configuration file"
 .SH "NAME"
 slurm.conf \- Slurm configuration file 
 .SH "DESCRIPTION"
@@ -451,6 +451,22 @@ change in \fBSwitchType\fR to take effect.
 If running jobs exist at the time \fBslurmctld\fR is restarted with a new 
 value of \fBSwitchType\fR, records of all jobs in any state may be lost.
 .TP
+\fBTaskEpilog\fR
+Fully qualified pathname of a program to be execute as user root after
+termination of each task.
+.TP
+\fBTaskPlugin\fR
+Identifies the type of task launch plugin, typically used to provide 
+resource management within a node (e.g. pinning tasks to specific 
+processors).
+Acceptable values include
+"task/none" for systems requiring no special handling.
+The default value is "task/none".
+.TP
+\fBTaskProlog\fR
+Fully qualified pathname of a program to be execute as user root prior to 
+initiation of each task.
+.TP
 \fBTmpFS\fR
 Fully qualified pathname of the file system available to user jobs for 
 temporary storage. This parameter is used in establishing a node's \fBTmpDisk\fR
diff --git a/etc/slurm.conf.example b/etc/slurm.conf.example
index 0255017fb88..6e0830d231a 100644
--- a/etc/slurm.conf.example
+++ b/etc/slurm.conf.example
@@ -446,6 +446,25 @@ JobAcctType=jobacct/none
 # SrunEpilog=/usr/local/slurm/srun_epilog   # default is no srun epilog
 
 
+#
+# o Define task launch specific parameters
+#
+#    "TaskProlog" : Define a program to be executed as root before each 
+#                   task begins execution.
+#    "TaskEpilog" : Define a program to be executed as root after each 
+#                   task terminates.
+#    "TaskPlugin" : Define a task launch plugin. This may be used to 
+#                   provide resource management within a node (e.g. pinning
+#                   tasks to specific processors). Permissible values are
+#      "task/none" : no task launch actions, the default.
+#
+# Example:
+#
+# TaskProlog=/usr/local/slurm/etc/task_prolog # default is none
+# TaskEpilog=/usr/local/slurm/etc/task_epilog # default is none
+# TaskPlugin=task/none                        # default is task/none
+
+
 #
 # o Define the temporary file system 
 #
diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in
index e16351955f0..7c38be6181a 100644
--- a/slurm/slurm.h.in
+++ b/slurm/slurm.h.in
@@ -573,6 +573,9 @@ typedef struct slurm_ctl_conf {
 	char *state_save_location;/* pathname of slurmctld state save
 				 * directory */
 	char *switch_type;	/* switch or interconnect type */
+	char *task_epilog;	/* pathname of task launch epilog */
+	char *task_plugin;	/* task launch plugin */
+	char *task_prolog;	/* pathname of task launch prolog */
 	char *tmp_fs;		/* pathname of temporary file system */
 	uint16_t wait_time;	/* default job --wait time */
 	char *job_credential_private_key;	/* path to private key */
diff --git a/src/api/config_info.c b/src/api/config_info.c
index 771eb85b59c..c1fc9a0fc3f 100644
--- a/src/api/config_info.c
+++ b/src/api/config_info.c
@@ -166,6 +166,12 @@ void slurm_print_ctl_conf ( FILE* out,
 		slurm_ctl_conf_ptr->state_save_location);
 	fprintf(out, "SwitchType        = %s\n",
 		slurm_ctl_conf_ptr->switch_type);
+	fprintf(out, "TaskEpilog        = %s\n",
+		slurm_ctl_conf_ptr->task_epilog);
+	fprintf(out, "TaskPlugin        = %s\n",
+		 slurm_ctl_conf_ptr->task_plugin);
+	fprintf(out, "TaskProlog        = %s\n",
+		slurm_ctl_conf_ptr->task_prolog);
 	fprintf(out, "TmpFS             = %s\n", 
 		slurm_ctl_conf_ptr->tmp_fs);
 	fprintf(out, "WaitTime          = %u\n", 
diff --git a/src/common/read_config.c b/src/common/read_config.c
index 877515c1fab..dc955d5efed 100644
--- a/src/common/read_config.c
+++ b/src/common/read_config.c
@@ -394,6 +394,9 @@ init_slurm_conf (slurm_ctl_conf_t *ctl_conf_ptr)
 	ctl_conf_ptr->slurmd_timeout		= (uint16_t) NO_VAL;
 	xfree (ctl_conf_ptr->state_save_location);
 	xfree (ctl_conf_ptr->switch_type);
+	xfree (ctl_conf_ptr->task_epilog);
+	xfree (ctl_conf_ptr->task_prolog);
+	xfree (ctl_conf_ptr->task_plugin);
 	xfree (ctl_conf_ptr->tmp_fs);
 	ctl_conf_ptr->wait_time			= (uint16_t) NO_VAL;
 	xfree (ctl_conf_ptr->srun_prolog);
@@ -450,6 +453,7 @@ parse_config_spec (char *in_line, slurm_ctl_conf_t *ctl_conf_ptr)
 	char *job_credential_private_key = NULL;
 	char *job_credential_public_certificate = NULL;
 	char *srun_prolog = NULL, *srun_epilog = NULL;
+	char *task_prolog = NULL, *task_epilog = NULL, *task_plugin = NULL;
 	long first_job_id = -1;
 
 	error_code = slurm_parser (in_line,
@@ -459,8 +463,9 @@ parse_config_spec (char *in_line, slurm_ctl_conf_t *ctl_conf_ptr)
 		"BackupController=", 's', &backup_controller, 
 		"ControlAddr=", 's', &control_addr, 
 		"ControlMachine=", 's', &control_machine, 
-		/* SrunEpilog MUST come before Epilog */
+		/* SrunEpilog and TaskEpilog MUST come before Epilog */
 		"SrunEpilog=", 's', &srun_epilog,
+		"TaskEpilog=", 's', &task_epilog,
 		"Epilog=", 's', &epilog, 
 		"FastSchedule=", 'l', &fast_schedule,
 		"FirstJobId=", 'l', &first_job_id,
@@ -483,8 +488,9 @@ parse_config_spec (char *in_line, slurm_ctl_conf_t *ctl_conf_ptr)
 		"MpiDefault=", 's', &mpi_default,
 		"PluginDir=", 's', &plugindir,
 		"ProctrackType=", 's', &proctrack_type,
-		/* SrunProlog MUST come before Prolog */
+		/* SrunProlog and TaskProlog  MUST come before Prolog */
 		"SrunProlog=", 's', &srun_prolog,
+		"TaskProlog=", 's', &task_prolog,
 		"Prolog=", 's', &prolog,
 		"PropagateResourceLimitsExcept=", 's',&propagate_rlimits_except,
 		"PropagateResourceLimits=",       's',&propagate_rlimits,
@@ -508,6 +514,7 @@ parse_config_spec (char *in_line, slurm_ctl_conf_t *ctl_conf_ptr)
 		"SlurmdTimeout=", 'l', &slurmd_timeout,
 		"StateSaveLocation=", 's', &state_save_location,
 		"SwitchType=", 's', &switch_type,
+		"TaskPlugin=", 's', &task_plugin,
 		"TmpFS=", 's', &tmp_fs,
 		"WaitTime=", 'l', &wait_time,
 		"END");
@@ -973,6 +980,30 @@ parse_config_spec (char *in_line, slurm_ctl_conf_t *ctl_conf_ptr)
 		ctl_conf_ptr->switch_type = switch_type;
 	}
 
+	if ( task_epilog ) {
+		if ( ctl_conf_ptr->task_epilog ) {
+			error (MULTIPLE_VALUE_MSG, "TaskEpilog");
+			xfree (ctl_conf_ptr->task_epilog);
+		}
+		ctl_conf_ptr->task_epilog = task_epilog;
+	}
+
+	if ( task_prolog ) {
+		if ( ctl_conf_ptr->task_prolog ) {
+			error (MULTIPLE_VALUE_MSG, "TaskProlog");
+			xfree (ctl_conf_ptr->task_prolog);
+		}
+		ctl_conf_ptr->task_prolog = task_prolog;
+	}
+
+	if ( task_plugin ) {
+		if ( ctl_conf_ptr->task_plugin ) {
+			error (MULTIPLE_VALUE_MSG, "TaskPlugin");
+			xfree (ctl_conf_ptr->task_plugin);
+		}
+		 ctl_conf_ptr->task_plugin = task_plugin;
+	}
+
 	if ( tmp_fs ) {
 		if ( ctl_conf_ptr->tmp_fs ) {
 			error (MULTIPLE_VALUE_MSG, "TmpFS");
diff --git a/src/common/slurm_protocol_api.c b/src/common/slurm_protocol_api.c
index 57af9625722..a8bf94c1d2e 100644
--- a/src/common/slurm_protocol_api.c
+++ b/src/common/slurm_protocol_api.c
@@ -412,7 +412,7 @@ uint16_t slurm_get_wait_time(void)
 
 /* slurm_get_srun_prolog
  * return the name of the srun prolog program
- * RET char *   - name of prolog program
+ * RET char *   - name of prolog program, must be xfreed by caller
  */
 char *slurm_get_srun_prolog(void)
 {
@@ -426,7 +426,7 @@ char *slurm_get_srun_prolog(void)
 
 /* slurm_get_srun_epilog
  * return the name of the srun epilog program
- * RET char *   - name of epilog program
+ * RET char *   - name of epilog program, must be xfreed by caller
  */
 char *slurm_get_srun_epilog(void)
 {
@@ -438,6 +438,41 @@ char *slurm_get_srun_epilog(void)
 	return epilog;
 }
 
+/* slurm_get_task_epilog
+ * RET task_epilog name, must be xfreed by caller */
+char *slurm_get_task_epilog(void)
+{
+        char *task_epilog;
+
+        _lock_update_config();
+        task_epilog = xstrdup(slurmctld_conf.task_epilog);
+        slurm_mutex_unlock(&config_lock);
+        return task_epilog;
+}
+
+/* slurm_get_task_prolog
+ * RET task_prolog name, must be xfreed by caller */
+char *slurm_get_task_prolog(void)
+{
+        char *task_prolog;
+                                                                                
+        _lock_update_config();
+        task_prolog = xstrdup(slurmctld_conf.task_prolog);
+        slurm_mutex_unlock(&config_lock);
+        return task_prolog;
+}
+
+/* slurm_get_task_plugin
+ * RET task_plugin name, must be xfreed by caller */
+char *slurm_get_task_plugin(void)
+{
+        char *task_plugin;
+
+        _lock_update_config();
+        task_plugin = xstrdup(slurmctld_conf.task_plugin);
+        slurm_mutex_unlock(&config_lock);
+        return task_plugin;
+}
 /* Change general slurm communication errors to slurmctld specific errors */
 static void _remap_slurmctld_errno(void)
 {
diff --git a/src/common/slurm_protocol_api.h b/src/common/slurm_protocol_api.h
index 3174cfa15a4..b5bdaef6a8c 100644
--- a/src/common/slurm_protocol_api.h
+++ b/src/common/slurm_protocol_api.h
@@ -190,16 +190,28 @@ uint16_t slurm_get_wait_time(void);
 
 /* slurm_get_srun_prolog
  * return the name of the srun prolog program
- * RET char *   - name of prolog program
+ * RET char *   - name of prolog program, must be xfreed by caller
  */
 char *slurm_get_srun_prolog(void);
 
 /* slurm_get_srun_epilog
  * return the name of the srun epilog program
- * RET char *   - name of epilog program
+ * RET char *   - name of epilog program, must be xfreed by caller
  */
 char *slurm_get_srun_epilog(void);
 
+/* slurm_get_task_epilog
+ * RET task_epilog name, must be xfreed by caller */
+char *slurm_get_task_epilog(void);
+
+/* slurm_get_task_prolog
+ * RET task_prolog name, must be xfreed by caller */
+char *slurm_get_task_prolog(void);
+
+/* slurm_get_task_plugin
+ * RET task_plugin name, must be xfreed by caller */
+char *slurm_get_task_plugin(void);
+
 /**********************************************************************\
  * general message management functions used by slurmctld, slurmd
 \**********************************************************************/
diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c
index 9076a6d43c3..7973845cb8b 100644
--- a/src/common/slurm_protocol_defs.c
+++ b/src/common/slurm_protocol_defs.c
@@ -722,6 +722,11 @@ void slurm_free_ctl_conf(slurm_ctl_conf_info_msg_t * config_ptr)
 		xfree(config_ptr->slurmd_spooldir);
 		xfree(config_ptr->slurm_conf);
 		xfree(config_ptr->state_save_location);
+		xfree(config_ptr->srun_epilog);
+		xfree(config_ptr->srun_prolog);
+		xfree(config_ptr->task_epilog);
+		xfree(config_ptr->task_prolog);
+		xfree(config_ptr->task_plugin);
 		xfree(config_ptr->tmp_fs);
 		xfree(config_ptr);
 	}
diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c
index ba4ae54d9d6..46dbd1a8a75 100644
--- a/src/common/slurm_protocol_pack.c
+++ b/src/common/slurm_protocol_pack.c
@@ -1845,11 +1845,13 @@ _pack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t * build_ptr, Buf buffer)
 	packstr(build_ptr->slurm_conf, buffer);
 	packstr(build_ptr->state_save_location, buffer);
 	packstr(build_ptr->switch_type, buffer);
+	packstr(build_ptr->task_epilog, buffer);
+	packstr(build_ptr->task_prolog, buffer);
+	packstr(build_ptr->task_plugin, buffer);
 	packstr(build_ptr->tmp_fs, buffer);
 	pack16(build_ptr->wait_time, buffer);
 	packstr(build_ptr->job_credential_private_key, buffer);
 	packstr(build_ptr->job_credential_public_certificate, buffer);
-	debug2("Packing string %s", build_ptr->srun_prolog);
 	packstr(build_ptr->srun_prolog, buffer);
 	packstr(build_ptr->srun_epilog, buffer);
 }
@@ -1928,6 +1930,9 @@ _unpack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t **
 	safe_unpackstr_xmalloc(&build_ptr->state_save_location,
 			       &uint16_tmp, buffer);
 	safe_unpackstr_xmalloc(&build_ptr->switch_type, &uint16_tmp, buffer);
+	safe_unpackstr_xmalloc(&build_ptr->task_epilog, &uint16_tmp, buffer);
+	safe_unpackstr_xmalloc(&build_ptr->task_prolog, &uint16_tmp, buffer);
+	safe_unpackstr_xmalloc(&build_ptr->task_plugin, &uint16_tmp, buffer);
 	safe_unpackstr_xmalloc(&build_ptr->tmp_fs, &uint16_tmp, buffer);
 	safe_unpack16(&build_ptr->wait_time, buffer);
 	safe_unpackstr_xmalloc(&build_ptr->job_credential_private_key,
@@ -1971,6 +1976,9 @@ _unpack_slurm_ctl_conf_msg(slurm_ctl_conf_info_msg_t **
 	xfree(build_ptr->slurmd_spooldir);
 	xfree(build_ptr->state_save_location);
 	xfree(build_ptr->switch_type);
+	xfree(build_ptr->task_epilog);
+	xfree(build_ptr->task_prolog);
+	xfree(build_ptr->task_plugin);
 	xfree(build_ptr->tmp_fs);
 	xfree(build_ptr->srun_prolog);
 	xfree(build_ptr->srun_epilog);
diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c
index c0897b644cb..1f018fe08f5 100644
--- a/src/slurmctld/proc_req.c
+++ b/src/slurmctld/proc_req.c
@@ -339,6 +339,9 @@ void _fill_ctld_conf(slurm_ctl_conf_t * conf_ptr)
 	conf_ptr->state_save_location = xstrdup(slurmctld_conf.
 					state_save_location);
 	conf_ptr->switch_type         = xstrdup(slurmctld_conf.switch_type);
+	conf_ptr->task_epilog         = xstrdup(slurmctld_conf.task_epilog);
+	conf_ptr->task_prolog         = xstrdup(slurmctld_conf.task_prolog);
+	conf_ptr->task_plugin         = xstrdup(slurmctld_conf.task_plugin);
 	conf_ptr->tmp_fs              = xstrdup(slurmctld_conf.tmp_fs);
 	conf_ptr->wait_time           = slurmctld_conf.wait_time;
 	conf_ptr->srun_prolog         = xstrdup(slurmctld_conf.srun_prolog);
-- 
GitLab