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