12934: crunch-run creates .keep file in empty directories
[arvados.git] / services / crunch-run / crunchrun.go
index 8fd5801d236015b28ae125d56f787b3a236064cf..59fdd007e2b636f3b0be975a4add3d610980d657 100644 (file)
@@ -664,7 +664,6 @@ type infoCommand struct {
 // purposes.
 func (runner *ContainerRunner) LogNodeInfo() (err error) {
        w := runner.NewLogWriter("node-info")
-       logger := log.New(w, "node-info", 0)
 
        commands := []infoCommand{
                {
@@ -690,17 +689,17 @@ func (runner *ContainerRunner) LogNodeInfo() (err error) {
        }
 
        // Run commands with informational output to be logged.
-       var out []byte
        for _, command := range commands {
-               out, err = exec.Command(command.cmd[0], command.cmd[1:]...).CombinedOutput()
-               if err != nil {
-                       return fmt.Errorf("While running command %q: %v",
-                               command.cmd, err)
-               }
-               logger.Println(command.label)
-               for _, line := range strings.Split(string(out), "\n") {
-                       logger.Println(" ", line)
+               fmt.Fprintln(w, command.label)
+               cmd := exec.Command(command.cmd[0], command.cmd[1:]...)
+               cmd.Stdout = w
+               cmd.Stderr = w
+               if err := cmd.Run(); err != nil {
+                       err = fmt.Errorf("While running command %q: %v", command.cmd, err)
+                       fmt.Fprintln(w, err)
+                       return err
                }
+               fmt.Fprintln(w, "")
        }
 
        err = w.Close()
@@ -1052,6 +1051,21 @@ func (runner *ContainerRunner) UploadOutputFile(
        followed int) (manifestText string, err error) {
 
        if info.Mode().IsDir() {
+               // if empty, need to create a .keep file
+               dir, direrr := os.Open(path)
+               if (direrr != nil) {
+                       return "", direrr
+               }
+               defer dir.Close()
+               names, eof := dir.Readdirnames(1)
+               if len(names) == 0 && eof == io.EOF {
+                       keep, keeperr := os.Create(path+"/.keep")
+                       if keeperr != nil {
+                               return "", keeperr
+                       }
+                       keep.Close()
+               }
+
                return
        }