Skip to content

Commit 0dd60d1

Browse files
authored
Merge pull request #4330 from grondo/issue#4329
shell: improve handling of TMPDIR
2 parents 35080d5 + 660e8b7 commit 0dd60d1

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed

src/shell/tmpdir.c

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,51 +61,47 @@ static int mkjobtmp_rundir (flux_shell_t *shell, char *buf, size_t size)
6161
return 0;
6262
}
6363

64-
static int mkjobtmp_tmpdir (flux_shell_t *shell, char *buf, size_t size)
64+
static int mkjobtmp_tmpdir (flux_shell_t *shell,
65+
const char *tmpdir,
66+
char *buf,
67+
size_t size)
6568
{
66-
const char *tmpdir = flux_shell_getenv (shell, "TMPDIR");
67-
6869
if (make_job_path (shell, tmpdir ? tmpdir : "/tmp", buf, size) < 0
6970
|| mkdir_exist_ok (buf, false) < 0)
7071
return -1;
7172
return 0;
7273
}
7374

74-
static int mktmpdir (flux_shell_t *shell)
75-
{
76-
const char *tmpdir = flux_shell_getenv (shell, "TMPDIR");
77-
78-
if (tmpdir && mkdir_exist_ok (tmpdir, false) < 0)
79-
return -1;
80-
return 0;
81-
}
82-
8375
static int tmpdir_init (flux_plugin_t *p,
8476
const char *topic,
8577
flux_plugin_arg_t *args,
8678
void *data)
8779
{
8880
flux_shell_t *shell = flux_plugin_get_shell (p);
81+
const char *tmpdir = flux_shell_getenv (shell, "TMPDIR");
8982
char jobtmp[1024];
9083

91-
/* Ensure TMPDIR exists if it is set in job environment
84+
/* Attempt to create TMPDIR if set. If this fails, fallback to /tmp.
9285
*/
93-
if (mktmpdir (shell) < 0)
94-
shell_die_errno (1, "error creating TMPDIR");
86+
if (tmpdir && mkdir_exist_ok (tmpdir, true) < 0) {
87+
shell_warn ("Unable to create TMPDIR=%s, resetting TMPDIR=/tmp",
88+
tmpdir);
89+
tmpdir = "/tmp";
90+
if (flux_shell_setenvf (shell, 1, "TMPDIR", "%s", tmpdir) < 0)
91+
shell_die_errno (1, "Unable to set TMPDIR=/tmp");
92+
}
9593

9694
/* Try to create jobtmp in broker rundir.
9795
* Fall back to ${TMPDIR:-/tmp} if that fails (e.g. guest user).
9896
*/
9997
if (mkjobtmp_rundir (shell, jobtmp, sizeof (jobtmp)) < 0
100-
&& mkjobtmp_tmpdir (shell, jobtmp, sizeof (jobtmp)) < 0)
98+
&& mkjobtmp_tmpdir (shell, tmpdir, jobtmp, sizeof (jobtmp)) < 0)
10199
shell_die_errno (1, "error creating FLUX_JOB_TMPDIR");
102100
cleanup_push_string (cleanup_directory_recursive, jobtmp);
103101

104102
/* Set/change FLUX_JOB_TMPDIR to jobtmp.
105-
* If TMPDIR is unset, set it to $FLUX_JOB_TMPDIR.
106103
*/
107-
if (flux_shell_setenvf (shell, 1, "FLUX_JOB_TMPDIR", "%s", jobtmp) < 0
108-
|| flux_shell_setenvf (shell, 0, "TMPDIR", "%s", jobtmp) < 0)
104+
if (flux_shell_setenvf (shell, 1, "FLUX_JOB_TMPDIR", "%s", jobtmp) < 0)
109105
shell_die_errno (1, "error updating job environment");
110106

111107
return 0;

t/t2602-job-shell.t

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -279,12 +279,14 @@ test_expect_success 'job-shell: creates missing TMPDIR by default' '
279279
TMPDIR=$(pwd)/mytmpdir flux mini run true &&
280280
test -d mytmpdir
281281
'
282-
283-
test_expect_success 'job-shell: job fails if missing TMPDIR cannot be created' '
284-
! TMPDIR=/baddir flux mini run true 2>badtmp.err &&
285-
grep exception badtmp.err
282+
test_expect_success 'job-shell: uses /tmp if TMPDIR cannot be created' '
283+
TMPDIR=/baddir flux mini run printenv TMPDIR >badtmp.out 2>badtmp.err &&
284+
test_debug "cat badtmp.out badtmp.err" &&
285+
grep /tmp badtmp.out
286+
'
287+
test_expect_success 'job-shell: unset TMPDIR stays unset' '
288+
flux mini run --env=-TMPDIR sh -c "test -z \$TMPDIR"
286289
'
287-
288290
test_expect_success 'job-shell: FLUX_JOB_TMPDIR is set and is a directory' '
289291
flux mini run sh -c "test -d \$FLUX_JOB_TMPDIR"
290292
'

0 commit comments

Comments
 (0)