- var umount *exec.Cmd
- umount = exec.Command("fusermount", "-u", "-z", runner.ArvMountPoint)
- done := false
- try := 1
- for !done {
- umnterr := umount.Run()
- if umnterr != nil {
- runner.CrunchLog.Printf("Error: %v", umnterr)
- }
- timeout := time.NewTimer(10 * time.Second)
- select {
- case <-runner.ArvMountExit:
- done = true
- case <-timeout.C:
- if try == 1 {
- runner.CrunchLog.Printf("Timeout waiting for arv-mount to end. Will force unmount.")
- umount = exec.Command("arv-mount", "--unmount-timeout=10", "--unmount", runner.ArvMountPoint)
- try = 2
- } else {
- runner.CrunchLog.Printf("Killing arv-mount")
- runner.arvMountKill()
- umount = exec.Command("fusermount", "-u", "-z", runner.ArvMountPoint)
+ var delay int64 = 8
+ umount := exec.Command("arv-mount", fmt.Sprintf("--unmount-timeout=%d", delay), "--unmount", runner.ArvMountPoint)
+ umount.Stdout = runner.CrunchLog
+ umount.Stderr = runner.CrunchLog
+ runner.CrunchLog.Printf("Running %v", umount.Args)
+ umnterr := umount.Start()
+
+ if umnterr != nil {
+ runner.CrunchLog.Printf("Error unmounting: %v", umnterr)
+ } else {
+ // If arv-mount --unmount gets stuck for any reason, we
+ // don't want to wait for it forever. Do Wait() in a goroutine
+ // so it doesn't block crunch-run.
+ umountExit := make(chan error)
+ go func() {
+ mnterr := umount.Wait()
+ if mnterr != nil {
+ runner.CrunchLog.Printf("Error unmounting: %v", mnterr)
+ }
+ umountExit <- mnterr
+ }()
+
+ for again := true; again; {
+ again = false
+ select {
+ case <-umountExit:
+ umount = nil
+ again = true
+ case <-runner.ArvMountExit:
+ break
+ case <-time.After(time.Duration((delay + 1) * int64(time.Second))):
+ runner.CrunchLog.Printf("Timed out waiting for unmount")
+ if umount != nil {
+ umount.Process.Kill()
+ }
+ runner.ArvMount.Process.Kill()