SHARE
TWEET

Untitled

a guest Aug 25th, 2019 71 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff --git a/virtcontainers/qemu.go b/virtcontainers/qemu.go
  2. index 8560df9..45441c7 100644
  3. --- a/virtcontainers/qemu.go
  4. +++ b/virtcontainers/qemu.go
  5. @@ -96,6 +96,8 @@ const (
  6.         qmpCapErrMsg  = "Failed to negoatiate QMP capabilities"
  7.         qmpExecCatCmd = "exec:cat"
  8.  
  9. +       qemuExitWaitSeconds = 5
  10. +
  11.         scsiControllerID  = "scsi0"
  12.         rngID             = "rng0"
  13.         vsockKernelOption = "agent.use_vsock"
  14. @@ -749,7 +751,7 @@ func (q *qemu) stopSandbox() error {
  15.                 return err
  16.         }
  17.  
  18. -       return nil
  19. +       return q.waitQemuDown(qemuExitWaitSeconds)
  20.  }
  21.  
  22.  func (q *qemu) cleanupVM() error {
  23. @@ -850,6 +852,37 @@ func (q *qemu) qmpShutdown() {
  24.         }
  25.  }
  26.  
  27. +// waitQemuDown will watch for the QMP monitor socket to disappear indicating
  28. +//     that QEMU process has actually exited. This can take 10-100ms sometimes
  29. +func (q *qemu) waitQemuDown(timeout int) error {
  30. +       q.Logger().Debug("Waiting for qmp socket to disappear: %s", q.qmpMonitorCh.path)
  31. +       q.qmpShutdown()
  32. +       timeStart := time.Now()
  33. +       for {
  34. +               _, err := os.Stat(q.qmpMonitorCh.path)
  35. +
  36. +               if err != nil {
  37. +                       if os.IsNotExist(err) { // happy path
  38. +                               q.Logger().Debug("No longer able to access %s, QEMU appears to have exited", q.qmpMonitorCh.path)
  39. +                               break
  40. +                       } else {
  41. +                               q.Logger().WithError(err).Error("Unexpected error checking for QMP socket on %s", q.qmpMonitorCh.path)
  42. +                               return fmt.Errorf("Unexpected error checking for QMP socket on %s: %v", q.qmpMonitorCh.path, err)
  43. +                       }
  44. +
  45. +               }
  46. +
  47. +               if int(time.Now().Sub(timeStart).Seconds()) > timeout {
  48. +                       return fmt.Errorf("QEMU still active(timeout %ds)", timeout)
  49. +               }
  50. +
  51. +               time.Sleep(time.Duration(50) * time.Millisecond)
  52. +       }
  53. +
  54. +       return nil
  55. +
  56. +}
  57. +
  58.  func (q *qemu) addDeviceToBridge(ID string) (string, types.PCIBridge, error) {
  59.         var err error
  60.         var addr uint32
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top