13111: Merge branch 'master' into 12308-go-fuse
[arvados.git] / services / crunch-run / crunchrun.go
index 8d935604ee03e7b92c66421636a505d8dbcbbe95..a9f1c25d37fa1714868d371c245dc7aa8d041543 100644 (file)
@@ -103,17 +103,16 @@ type ContainerRunner struct {
        LogsPDH       *string
        RunArvMount
        MkTempDir
-       ArvMount       *exec.Cmd
-       ArvMountPoint  string
-       HostOutputDir  string
-       CleanupTempDir []string
-       Binds          []string
-       Volumes        map[string]struct{}
-       OutputPDH      *string
-       SigChan        chan os.Signal
-       ArvMountExit   chan error
-       finalState     string
-       parentTemp     string
+       ArvMount      *exec.Cmd
+       ArvMountPoint string
+       HostOutputDir string
+       Binds         []string
+       Volumes       map[string]struct{}
+       OutputPDH     *string
+       SigChan       chan os.Signal
+       ArvMountExit  chan error
+       finalState    string
+       parentTemp    string
 
        statLogger       io.WriteCloser
        statReporter     *crunchstat.Reporter
@@ -503,7 +502,6 @@ func (runner *ContainerRunner) SetupMounts() (err error) {
                        if staterr != nil {
                                return fmt.Errorf("While Chmod temp dir: %v", err)
                        }
-                       runner.CleanupTempDir = append(runner.CleanupTempDir, tmpdir)
                        runner.Binds = append(runner.Binds, fmt.Sprintf("%s:%s", tmpdir, bind))
                        if bind == runner.Container.OutputPath {
                                runner.HostOutputDir = tmpdir
@@ -523,7 +521,6 @@ func (runner *ContainerRunner) SetupMounts() (err error) {
                        if err != nil {
                                return fmt.Errorf("creating temp dir: %v", err)
                        }
-                       runner.CleanupTempDir = append(runner.CleanupTempDir, tmpdir)
                        tmpfn := filepath.Join(tmpdir, "mountdata.json")
                        err = ioutil.WriteFile(tmpfn, jsondata, 0644)
                        if err != nil {
@@ -536,7 +533,6 @@ func (runner *ContainerRunner) SetupMounts() (err error) {
                        if err != nil {
                                return fmt.Errorf("creating temp dir: %v", err)
                        }
-                       runner.CleanupTempDir = append(runner.CleanupTempDir, tmpdir)
                        err = gitMount(mnt).extractTree(runner.ArvClient, tmpdir, token)
                        if err != nil {
                                return err
@@ -579,25 +575,37 @@ func (runner *ContainerRunner) SetupMounts() (err error) {
        }
 
        for _, cp := range copyFiles {
-               dir, err := os.Stat(cp.src)
+               st, err := os.Stat(cp.src)
                if err != nil {
                        return fmt.Errorf("While staging writable file from %q to %q: %v", cp.src, cp.bind, err)
                }
-               if dir.IsDir() {
+               if st.IsDir() {
                        err = filepath.Walk(cp.src, func(walkpath string, walkinfo os.FileInfo, walkerr error) error {
                                if walkerr != nil {
                                        return walkerr
                                }
+                               target := path.Join(cp.bind, walkpath[len(cp.src):])
                                if walkinfo.Mode().IsRegular() {
-                                       return copyfile(walkpath, path.Join(cp.bind, walkpath[len(cp.src):]))
+                                       copyerr := copyfile(walkpath, target)
+                                       if copyerr != nil {
+                                               return copyerr
+                                       }
+                                       return os.Chmod(target, walkinfo.Mode()|0777)
                                } else if walkinfo.Mode().IsDir() {
-                                       return os.MkdirAll(path.Join(cp.bind, walkpath[len(cp.src):]), 0777)
+                                       mkerr := os.MkdirAll(target, 0777)
+                                       if mkerr != nil {
+                                               return mkerr
+                                       }
+                                       return os.Chmod(target, walkinfo.Mode()|os.ModeSetgid|0777)
                                } else {
                                        return fmt.Errorf("Source %q is not a regular file or directory", cp.src)
                                }
                        })
-               } else {
+               } else if st.Mode().IsRegular() {
                        err = copyfile(cp.src, cp.bind)
+                       if err == nil {
+                               err = os.Chmod(cp.bind, st.Mode()|0777)
+                       }
                }
                if err != nil {
                        return fmt.Errorf("While staging writable file from %q to %q: %v", cp.src, cp.bind, err)
@@ -1428,12 +1436,6 @@ func (runner *ContainerRunner) CleanupDirs() {
                }
        }
 
-       for _, tmpdir := range runner.CleanupTempDir {
-               if rmerr := os.RemoveAll(tmpdir); rmerr != nil {
-                       runner.CrunchLog.Printf("While cleaning up temporary directory %s: %v", tmpdir, rmerr)
-               }
-       }
-
        if rmerr := os.RemoveAll(runner.parentTemp); rmerr != nil {
                runner.CrunchLog.Printf("While cleaning up temporary directory %s: %v", runner.parentTemp, rmerr)
        }
@@ -1774,7 +1776,7 @@ func main() {
                os.Exit(1)
        }
 
-       parentTemp, tmperr := cr.MkTempDir("", "crunch-run")
+       parentTemp, tmperr := cr.MkTempDir("", "crunch-run."+containerId+".")
        if tmperr != nil {
                log.Fatalf("%s: %v", containerId, tmperr)
        }