10701: Tidy up error handling.
authorTom Clegg <tom@curoverse.com>
Thu, 9 Feb 2017 17:24:20 +0000 (12:24 -0500)
committerTom Clegg <tom@curoverse.com>
Thu, 9 Feb 2017 17:24:20 +0000 (12:24 -0500)
services/crunch-dispatch-slurm/crunch-dispatch-slurm.go

index fe559f1c64775ca811a0680acc75caf0f7a6504f..476ca1f4a117cd5021460a5c8c63ef6b5d198d80 100644 (file)
@@ -151,18 +151,7 @@ var sbatchCmd = sbatchFunc
 var scancelCmd = scancelFunc
 
 // Submit job to slurm using sbatch.
 var scancelCmd = scancelFunc
 
 // Submit job to slurm using sbatch.
-func submit(dispatcher *dispatch.Dispatcher,
-       container arvados.Container, crunchRunCommand []string) (submitErr error) {
-       defer func() {
-               // If we didn't get as far as submitting a slurm job,
-               // unlock the container and return it to the queue.
-               if submitErr == nil {
-                       // OK, no cleanup needed
-                       return
-               }
-               dispatcher.Unlock(container.UUID)
-       }()
-
+func submit(dispatcher *dispatch.Dispatcher, container arvados.Container, crunchRunCommand []string) error {
        cmd := sbatchCmd(container)
 
        // Send a tiny script on stdin to execute the crunch-run
        cmd := sbatchCmd(container)
 
        // Send a tiny script on stdin to execute the crunch-run
@@ -179,13 +168,18 @@ func submit(dispatcher *dispatch.Dispatcher,
 
        log.Printf("exec sbatch %+q", cmd.Args)
        err := cmd.Run()
 
        log.Printf("exec sbatch %+q", cmd.Args)
        err := cmd.Run()
+
        switch err.(type) {
        case nil:
                log.Printf("sbatch succeeded: %q", strings.TrimSpace(stdout.String()))
                return nil
        switch err.(type) {
        case nil:
                log.Printf("sbatch succeeded: %q", strings.TrimSpace(stdout.String()))
                return nil
+
        case *exec.ExitError:
        case *exec.ExitError:
+               dispatcher.Unlock(container.UUID)
                return fmt.Errorf("sbatch %+q failed: %v (stderr: %q)", cmd.Args, err, stderr.Bytes())
                return fmt.Errorf("sbatch %+q failed: %v (stderr: %q)", cmd.Args, err, stderr.Bytes())
+
        default:
        default:
+               dispatcher.Unlock(container.UUID)
                return fmt.Errorf("exec failed: %v", err)
        }
 }
                return fmt.Errorf("exec failed: %v", err)
        }
 }