mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-08-24 18:52:08 +00:00
qemu: make saveSandbox wait for migration completion
Then we can remove the arbitrary sleep waiting for migration completion when creating a tempalte vm. Fixes: #728 Signed-off-by: Peng Tao <bergwolf@gmail.com>
This commit is contained in:
parent
c3cfe8204a
commit
eb77a41535
@ -25,7 +25,6 @@ type template struct {
|
|||||||
|
|
||||||
var templateProxyType = vc.KataBuiltInProxyType
|
var templateProxyType = vc.KataBuiltInProxyType
|
||||||
var templateWaitForAgent = 2 * time.Second
|
var templateWaitForAgent = 2 * time.Second
|
||||||
var templateWaitForMigration = 1 * time.Second
|
|
||||||
|
|
||||||
// Fetch finds and returns a pre-built template factory.
|
// Fetch finds and returns a pre-built template factory.
|
||||||
// TODO: save template metadata and fetch from storage.
|
// TODO: save template metadata and fetch from storage.
|
||||||
@ -145,9 +144,6 @@ func (t *template) createTemplateVM(ctx context.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// qemu QMP does not wait for migration to finish...
|
|
||||||
time.Sleep(templateWaitForMigration)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,6 @@ import (
|
|||||||
func TestTemplateFactory(t *testing.T) {
|
func TestTemplateFactory(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
templateWaitForMigration = 1 * time.Microsecond
|
|
||||||
templateWaitForAgent = 1 * time.Microsecond
|
templateWaitForAgent = 1 * time.Microsecond
|
||||||
|
|
||||||
testDir, _ := ioutil.TempDir("", "vmfactory-tmp-")
|
testDir, _ := ioutil.TempDir("", "vmfactory-tmp-")
|
||||||
|
@ -76,6 +76,7 @@ const (
|
|||||||
qmpCapErrMsg = "Failed to negoatiate QMP capabilities"
|
qmpCapErrMsg = "Failed to negoatiate QMP capabilities"
|
||||||
qmpCapMigrationBypassSharedMemory = "bypass-shared-memory"
|
qmpCapMigrationBypassSharedMemory = "bypass-shared-memory"
|
||||||
qmpExecCatCmd = "exec:cat"
|
qmpExecCatCmd = "exec:cat"
|
||||||
|
qmpMigrationWaitTimeout = 5 * time.Second
|
||||||
|
|
||||||
scsiControllerID = "scsi0"
|
scsiControllerID = "scsi0"
|
||||||
rngID = "rng0"
|
rngID = "rng0"
|
||||||
@ -1181,6 +1182,29 @@ func (q *qemu) saveSandbox() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t := time.NewTimer(qmpMigrationWaitTimeout)
|
||||||
|
defer t.Stop()
|
||||||
|
for {
|
||||||
|
status, err := q.qmpMonitorCh.qmp.ExecuteQueryMigration(q.qmpMonitorCh.ctx)
|
||||||
|
if err != nil {
|
||||||
|
q.Logger().WithError(err).Error("failed to query migration status")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if status.Status == "completed" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-t.C:
|
||||||
|
q.Logger().WithField("migration-status", status).Error("timeout waiting for qemu migration")
|
||||||
|
return fmt.Errorf("timed out after %d seconds waiting for qemu migration", qmpMigrationWaitTimeout)
|
||||||
|
default:
|
||||||
|
// migration in progress
|
||||||
|
q.Logger().WithField("migration-status", status).Debug("migration in progress")
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user