5538: update the test case for "error" to use better stub parameters with nil status...
[arvados.git] / sdk / go / crunchrunner / crunchrunner.go
index ea29be8ba05d8cdbbc7b84527d17b20facbf8c8b..8e24e18fda845866909aff7f6bba1bd02234d53c 100644 (file)
@@ -124,14 +124,10 @@ func setupCommand(cmd *exec.Cmd, taskp TaskDef, outdir string, replacements map[
        return stdin, stdout, nil
 }
 
+// Set up signal handlers.  Go sends signal notifications to a "signal
+// channel".
 func setupSignals(cmd *exec.Cmd) chan os.Signal {
-       // Set up signal handlers
-       // Forward SIGINT, SIGTERM and SIGQUIT to inner process
        sigChan := make(chan os.Signal, 1)
-       go func(sig <-chan os.Signal) {
-               catch := <-sig
-               cmd.Process.Signal(catch)
-       }(sigChan)
        signal.Notify(sigChan, syscall.SIGTERM)
        signal.Notify(sigChan, syscall.SIGINT)
        signal.Notify(sigChan, syscall.SIGQUIT)
@@ -237,11 +233,34 @@ func runner(api IArvadosClient,
        }
        log.Printf("Running %v%v%v", cmd.Args, stdin, stdout)
 
+       var caughtSignal os.Signal
+       sigChan := setupSignals(cmd)
+
        err = cmd.Start()
+       if err != nil {
+               signal.Stop(sigChan)
+               return TempFail{err}
+       }
+
+       finishedSignalNotify := make(chan struct{})
+       go func(sig <-chan os.Signal) {
+               for sig := range sig {
+                       caughtSignal = sig
+                       cmd.Process.Signal(caughtSignal)
+               }
+               close(finishedSignalNotify)
+       }(sigChan)
 
-       signals := setupSignals(cmd)
        err = cmd.Wait()
-       signal.Stop(signals)
+       signal.Stop(sigChan)
+
+       close(sigChan)
+       <-finishedSignalNotify
+
+       if caughtSignal != nil {
+               log.Printf("Caught signal %v", caughtSignal)
+               return PermFail{}
+       }
 
        if err != nil {
                // Run() returns ExitError on non-zero exit code, but we handle
@@ -321,6 +340,7 @@ func main() {
                log.Fatal(err)
        }
 
+       syscall.Umask(0022)
        err = runner(api, kc, jobUuid, taskUuid, tmpdir, keepmount, jobStruct, taskStruct)
 
        if err == nil {