diff --git a/helper/tmpdir-setup b/helper/tmpdir-setup index 01207427..aab193f4 100755 --- a/helper/tmpdir-setup +++ b/helper/tmpdir-setup @@ -1,42 +1,60 @@ #! /usr/bin/bash -# Input (environment): -# -# MXQ_JOBID : job ident -# MXQ_SIZE : size in GB -# MXQ_UID : uid - -# Output: -# -# /dev/shm/mxqd/tmp/$JOBID mounted, space from /scratch/local2 +usage() { + cat <&2 +usage: + $0 create JOBID SIZE UID # create SIZE GiB /dev/shm/mxqd/mnt/job/$JOBID +EOF + exit 1 +} tmpdir=/scratch/local2/mxqd/tmp mntdir=/dev/shm/mxqd/mnt/job -filename=$tmpdir/$MXQ_JOBID.tmp -mountpoint=$mntdir/$MXQ_JOBID - -umask 006 -mkdir -p $tmpdir -mkdir -p $mntdir - -status=1; - -if fallocate -l ${MXQ_SIZE}G $filename; then - if loopdevice=$(losetup --find --show $filename); then - if mkfs.ext4 \ - -q \ - -m 0 \ - -E nodiscard,mmp_update_interval=300,lazy_journal_init=1,root_owner=$MXQ_UID:0 \ - -O '64bit,ext_attr,filetype,^has_journal,huge_file,inline_data,^mmp,^quota,sparse_super2' \ - $loopdevice \ - && mkdir -p $mountpoint && mount -Odata=writeback,barrier=0 $loopdevice $mountpoint; then - rmdir $mountpoint/lost+found - status=0 + +cmd_create() { + (( $# == 3 )) || usage + MXQ_JOBID=$1 + MXQ_SIZE=$2 + MXQ_UID=$3 + + filename=$tmpdir/$MXQ_JOBID.tmp + mountpoint=$mntdir/$MXQ_JOBID + + umask 006 + mkdir -p $tmpdir + mkdir -p $mntdir + + status=1; + + if fallocate -l ${MXQ_SIZE}G $filename; then + if loopdevice=$(losetup --find --show $filename); then + if mkfs.ext4 \ + -q \ + -m 0 \ + -E nodiscard,mmp_update_interval=300,lazy_journal_init=1,root_owner=$MXQ_UID:0 \ + -O '64bit,ext_attr,filetype,^has_journal,huge_file,inline_data,^mmp,^quota,sparse_super2' \ + $loopdevice \ + && mkdir -p $mountpoint && mount -Odata=writeback,barrier=0 $loopdevice $mountpoint; then + rmdir $mountpoint/lost+found + status=0 + fi + losetup -d $loopdevice fi - losetup -d $loopdevice + rm $filename + else + test -e $filename && rm $filename fi - rm $filename -else - test -e $filename && rm $filename -fi -exit $status + exit $status +} + +(( $# > 0 )) || usage +cmd="$1" +shift; +case "$cmd" in + create) + cmd_create "$@" + ;; + *) + usage + ;; +esac diff --git a/mxqd.c b/mxqd.c index 098595cf..6bb06af0 100644 --- a/mxqd.c +++ b/mxqd.c @@ -1292,7 +1292,6 @@ static unsigned long start_job(struct mxq_group_list *glist) pid_t pid; int res; - int status; assert(glist); assert(glist->user); @@ -1310,28 +1309,21 @@ static unsigned long start_job(struct mxq_group_list *glist) if (group->job_tmpdir_size > 0) { mx_mysql_disconnect(server->mysql); - pid = fork(); - if (pid==0) { - char *argv[2]; - char *envp[4]; - argv[0] = tmpdir_script, - argv[1] = NULL; - envp[0] = mx_asprintf_forever("MXQ_JOBID=%lu", job->job_id); - envp[1] = mx_asprintf_forever("MXQ_SIZE=%u", group->job_tmpdir_size); - envp[2] = mx_asprintf_forever("MXQ_UID=%d", group->user_uid); - envp[3] = NULL; - execve(tmpdir_script, argv,envp); - mx_log_fatal("exec %s : %m", tmpdir_script); - exit(1); - } + char *argv[] = { + tmpdir_script, + "create", + mx_asprintf_forever("%lu", job->job_id), + mx_asprintf_forever("%u", group->job_tmpdir_size), + mx_asprintf_forever("%d", group->user_uid), + NULL + }; + int status = mx_call_external(tmpdir_script, argv); + free(argv[2]); + free(argv[3]); + free(argv[4]); mx_mysql_connect_forever(&(server->mysql)); - if (pid < 0) { - mx_log_err("fork: %m"); - mxq_unload_job_from_server(server->mysql, job->job_id); - return(0); - } - waitpid(pid, &status, 0); - if (status) { + if (status == -1) { + mx_log_err("create job tmpdir: %m"); mxq_unload_job_from_server(server->mysql, job->job_id); return 0; }