From 6f1596b17e2e68402850a61b89f7d9426dca05b8 Mon Sep 17 00:00:00 2001
From: Morris Jette <jette@schedmd.com>
Date: Thu, 1 Jun 2017 11:28:56 -0600
Subject: [PATCH] Wrap up salloc env vars for pack jobs

---
 doc/html/heterogeneous_jobs.shtml |  4 +--
 slurm/slurm.h.in                  |  2 ++
 src/common/env.c                  | 35 +++++++++++++++++++++++++-
 src/salloc/salloc.c               | 42 ++++---------------------------
 4 files changed, 43 insertions(+), 40 deletions(-)

diff --git a/doc/html/heterogeneous_jobs.shtml b/doc/html/heterogeneous_jobs.shtml
index 760145d147d..538888c4811 100644
--- a/doc/html/heterogeneous_jobs.shtml
+++ b/doc/html/heterogeneous_jobs.shtml
@@ -127,8 +127,8 @@ salloc: job 11741 has been allocated resources
 $ env | grep SLURM
 SLURM_JOB_ID=11741
 SLURM_PACK_SIZE=2
-SLURM_JOBID_PACK_GROUP_0=11741
-SLURM_JOBID_PACK_GROUP_1=11742
+SLURM_JOB_ID_PACK_GROUP_0=11741
+SLURM_JOB_ID_PACK_GROUP_1=11742
 SLURM_NNODES_PACK_GROUP_0=1
 SLURM_NNODES_PACK_GROUP_1=2
 SLURM_JOB_NODELIST_PACK_GROUP_0=nid00001
diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in
index dd6a40c8e89..a8bdbab9e13 100644
--- a/slurm/slurm.h.in
+++ b/slurm/slurm.h.in
@@ -1029,6 +1029,8 @@ enum ctx_keys {
 					 * end of a job. */
 #define SIB_JOB_FLUSH      0x00001000   /* Don't send complete to origin */
 #define JOB_PACK_FLAG      0x00002000	/* Heterogeneous job management flag */
+#define JOB_NTASKS_SET     0x00004000	/* --ntasks explicitly set */
+#define JOB_CPUS_SET       0x00008000	/* --cpus-per-tasks explicitly set */
 
 /*****************************************************************************\
  *      SLURM HOSTLIST FUNCTIONS
diff --git a/src/common/env.c b/src/common/env.c
index 0333af0bda2..cdddccfa136 100644
--- a/src/common/env.c
+++ b/src/common/env.c
@@ -1127,12 +1127,45 @@ extern int env_array_for_job(char ***dest,
 			if (value) {
 				value[0] = '\0';
 				value++;
-				env_array_overwrite(dest, key, value);
+				env_array_overwrite_pack_fmt(dest, key,
+							     pack_offset, "%s",
+							     value);
 			}
 			xfree(tmp);
 		}
 	}
 
+	if (desc->acctg_freq) {
+		env_array_overwrite_pack_fmt(dest, "SLURM_ACCTG_FREQ",
+					     pack_offset, "%s",
+					     desc->acctg_freq);
+	};
+
+	if (desc->network) {
+		env_array_overwrite_pack_fmt(dest, "SLURM_NETWORK",
+					     pack_offset, "%s", desc->network);
+	}
+
+	if (desc->overcommit != NO_VAL8) {
+		env_array_overwrite_pack_fmt(dest, "SLURM_OVERCOMMIT",
+					     pack_offset, "%u",
+					     desc->overcommit);
+	}
+
+	/* Add default task counst for srun, if not already set */
+	if (desc->bitflags & JOB_NTASKS_SET) {
+		env_array_overwrite_pack_fmt(dest, "SLURM_NTASKS", pack_offset,
+					     "%d", desc->num_tasks);
+		/* maintain for old scripts */
+		env_array_overwrite_pack_fmt(dest, "SLURM_NPROCS", pack_offset,
+					     "%d", desc->num_tasks);
+	}
+	if (desc->bitflags & JOB_NTASKS_SET) {
+		env_array_overwrite_pack_fmt(dest, "SLURM_CPUS_PER_TASK",
+					     pack_offset, "%d",
+					     desc->cpus_per_task);
+	}
+
 	return rc;
 }
 
diff --git a/src/salloc/salloc.c b/src/salloc/salloc.c
index 811f2d35458..98f59abd96f 100644
--- a/src/salloc/salloc.c
+++ b/src/salloc/salloc.c
@@ -490,33 +490,11 @@ int main(int argc, char **argv)
 		}
 		list_iterator_destroy(iter_resp);
 		list_iterator_destroy(iter_req);
-//FIXME: work through additional logic, including free of alloc
 	} else {
 		if (env_array_for_job(&env, alloc, desc, -1) != SLURM_SUCCESS)
 			goto relinquish;
 	}
 
-	/* Add default task count for srun, if not already set */
-	if (opt.ntasks_set) {
-		env_array_append_fmt(&env, "SLURM_NTASKS", "%d", opt.ntasks);
-		/* keep around for old scripts */
-		env_array_append_fmt(&env, "SLURM_NPROCS", "%d", opt.ntasks);
-	}
-	if (opt.cpus_set) {
-		env_array_append_fmt(&env, "SLURM_CPUS_PER_TASK", "%d",
-				     opt.cpus_per_task);
-	}
-	if (opt.overcommit) {
-		env_array_append_fmt(&env, "SLURM_OVERCOMMIT", "%d",
-			opt.overcommit);
-	}
-	if (opt.acctg_freq) {
-		env_array_append_fmt(&env, "SLURM_ACCTG_FREQ", "%s",
-			opt.acctg_freq);
-	}
-	if (opt.network)
-		env_array_append_fmt(&env, "SLURM_NETWORK", "%s", opt.network);
-
 	if (working_cluster_rec && working_cluster_rec->name) {
 		env_array_append_fmt(&env, "SLURM_CLUSTER_NAME", "%s",
 				     working_cluster_rec->name);
@@ -525,20 +503,6 @@ int main(int argc, char **argv)
 				     cluster_name);
 		xfree(cluster_name);
 	}
-	if (alloc->env_size) {	/* Used to set Burst Buffer environment */
-		char *key, *value, *tmp;
-		for (i = 0; i < alloc->env_size; i++) {
-			tmp = xstrdup(alloc->environment[i]);
-			key = tmp;
-			value = strchr(tmp, '=');
-			if (value) {
-				value[0] = '\0';
-				value++;
-				env_array_append(&env, key, value);
-			}
-			xfree(tmp);
-		}
-	}
 
 	env_array_set_environment(env);
 	env_array_free(env);
@@ -843,7 +807,7 @@ static int _fill_job_desc_from_opts(job_desc_msg_t *desc)
 
 	if (opt.licenses)
 		desc->licenses = xstrdup(opt.licenses);
-	desc->network = opt.network;
+	desc->network = xstrdup(opt.network);
 	if (opt.nice != NO_VAL)
 		desc->nice = NICE_OFFSET + opt.nice;
 	if (opt.priority)
@@ -958,6 +922,10 @@ static int _fill_job_desc_from_opts(job_desc_msg_t *desc)
 		desc->mcs_label = xstrdup(opt.mcs_label);
 	if (opt.delay_boot != NO_VAL)
 		desc->delay_boot = opt.delay_boot;
+	if (opt.cpus_set)
+		desc->bitflags |= JOB_CPUS_SET;
+	if (opt.ntasks_set)
+		desc->bitflags |= JOB_NTASKS_SET;
 
 	return 0;
 }
-- 
GitLab