14360: Use nonblocking mode when checking for stale lock.
[arvados.git] / services / crunch-run / background.go
index 57f770ae194aee974e667eecea3b4b9a99d1040a..deaf09cec84a7cd3e3549a9223ff4a913ebc053c 100644 (file)
@@ -18,7 +18,7 @@ import (
 )
 
 var (
-       lockdir    = "/var/run"
+       lockdir    = "/var/lock"
        lockprefix = "crunch-run-"
        locksuffix = ".lock"
 )
@@ -65,7 +65,12 @@ func detach(uuid string, args []string, stdout, stderr io.Writer) error {
        cmd := exec.Command(args[0], append([]string{"-detached"}, args[1:]...)...)
        cmd.Stdout = outfile
        cmd.Stderr = errfile
+       // Child inherits lockfile.
        cmd.ExtraFiles = []*os.File{lockfile}
+       // Ensure child isn't interrupted even if we receive signals
+       // from parent (sshd) while sending lockfile content to
+       // caller.
+       cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
        err = cmd.Start()
        if err != nil {
                os.Remove(outfile.Name())
@@ -155,7 +160,7 @@ func ListProcesses(stdout, stderr io.Writer) int {
                // acquisition during races, e.g., by connecting to a
                // unix socket or checking /proc/$pid/fd/$n ->
                // lockfile.
-               err = syscall.Flock(int(f.Fd()), syscall.LOCK_SH)
+               err = syscall.Flock(int(f.Fd()), syscall.LOCK_SH|syscall.LOCK_NB)
                if err == nil {
                        // lockfile is stale
                        err := os.Remove(path)