Merge pull request #536 from bergwolf/qmp_clear

qemu: clear qmp state before wait for qemu process
This commit is contained in:
James O. D. Hunt 2018-08-01 09:51:43 +01:00 committed by GitHub
commit 487f9efa57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 4 deletions

View File

@ -25,9 +25,10 @@ import (
) )
type qmpChannel struct { type qmpChannel struct {
ctx context.Context ctx context.Context
path string path string
qmp *govmmQemu.QMP qmp *govmmQemu.QMP
disconn chan struct{}
} }
// CPUDevice represents a CPU device which was hot-added in a running VM // CPUDevice represents a CPU device which was hot-added in a running VM
@ -522,12 +523,15 @@ func (q *qemu) waitSandbox(timeout int) error {
cfg := govmmQemu.QMPConfig{Logger: newQMPLogger()} cfg := govmmQemu.QMPConfig{Logger: newQMPLogger()}
var qmp *govmmQemu.QMP var qmp *govmmQemu.QMP
var disconnectCh chan struct{}
var ver *govmmQemu.QMPVersion var ver *govmmQemu.QMPVersion
var err error var err error
// clear any possible old state before trying to connect again.
q.qmpShutdown()
timeStart := time.Now() timeStart := time.Now()
for { for {
disconnectCh := make(chan struct{}) disconnectCh = make(chan struct{})
qmp, ver, err = govmmQemu.QMPStart(q.qmpMonitorCh.ctx, q.qmpMonitorCh.path, cfg, disconnectCh) qmp, ver, err = govmmQemu.QMPStart(q.qmpMonitorCh.ctx, q.qmpMonitorCh.path, cfg, disconnectCh)
if err == nil { if err == nil {
break break
@ -540,6 +544,7 @@ func (q *qemu) waitSandbox(timeout int) error {
time.Sleep(time.Duration(50) * time.Millisecond) time.Sleep(time.Duration(50) * time.Millisecond)
} }
q.qmpMonitorCh.qmp = qmp q.qmpMonitorCh.qmp = qmp
q.qmpMonitorCh.disconn = disconnectCh
defer q.qmpShutdown() defer q.qmpShutdown()
qemuMajorVersion = ver.Major qemuMajorVersion = ver.Major
@ -625,6 +630,7 @@ func (q *qemu) qmpSetup() error {
return err return err
} }
q.qmpMonitorCh.qmp = qmp q.qmpMonitorCh.qmp = qmp
q.qmpMonitorCh.disconn = disconnectCh
return nil return nil
} }
@ -632,7 +638,11 @@ func (q *qemu) qmpSetup() error {
func (q *qemu) qmpShutdown() { func (q *qemu) qmpShutdown() {
if q.qmpMonitorCh.qmp != nil { if q.qmpMonitorCh.qmp != nil {
q.qmpMonitorCh.qmp.Shutdown() q.qmpMonitorCh.qmp.Shutdown()
// wait on disconnected channel to be sure that the qmp channel has
// been closed cleanly.
<-q.qmpMonitorCh.disconn
q.qmpMonitorCh.qmp = nil q.qmpMonitorCh.qmp = nil
q.qmpMonitorCh.disconn = nil
} }
} }

View File

@ -367,3 +367,18 @@ func TestHotplugUnsupportedDeviceType(t *testing.T) {
_, err = q.hotplugRemoveDevice(&memoryDevice{0, 128}, fsDev) _, err = q.hotplugRemoveDevice(&memoryDevice{0, 128}, fsDev)
assert.Error(err) assert.Error(err)
} }
func TestQMPSetupShutdown(t *testing.T) {
assert := assert.New(t)
qemuConfig := newQemuConfig()
q := &qemu{
config: qemuConfig,
}
q.qmpShutdown()
q.qmpMonitorCh.qmp = &govmmQemu.QMP{}
err := q.qmpSetup()
assert.Nil(err)
}