diff --git a/pkg/compute/tasks/guest_live_migrate_task.go b/pkg/compute/tasks/guest_live_migrate_task.go index 774f033635..af123c2a44 100644 --- a/pkg/compute/tasks/guest_live_migrate_task.go +++ b/pkg/compute/tasks/guest_live_migrate_task.go @@ -473,20 +473,23 @@ func (task *GuestLiveMigrateTask) OnStartDestComplete(ctx context.Context, guest task.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Get migrate port error: %s", err))) return } - nbdServerPort, err := data.Get("nbd_server_port") - if err != nil { - task.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Get nbd server port error: %s", err))) - return + + var body = jsonutils.NewDict() + var nbdServerPort jsonutils.JSONObject + if !jsonutils.QueryBoolean(data, "nbd_server_disabled", false) { + nbdServerPort, err = data.Get("nbd_server_port") + if err != nil { + task.TaskFailed(ctx, guest, jsonutils.NewString(fmt.Sprintf("Get nbd server port error: %s", err))) + return + } + body.Set("nbd_server_port", nbdServerPort) } targetHostId, _ := task.Params.GetString("target_host_id") targetHost := models.HostManager.FetchHostById(targetHostId) - - body := jsonutils.NewDict() isLocalStorage, _ := task.Params.Get("is_local_storage") body.Set("is_local_storage", isLocalStorage) body.Set("live_migrate_dest_port", liveMigrateDestPort) - body.Set("nbd_server_port", nbdServerPort) body.Set("dest_ip", jsonutils.NewString(targetHost.AccessIp)) body.Set("enable_tls", jsonutils.NewBool(jsonutils.QueryBoolean(task.GetParams(), "enable_tls", false))) body.Set("quickly_finish", jsonutils.NewBool(jsonutils.QueryBoolean(task.GetParams(), "quickly_finish", false))) @@ -496,7 +499,6 @@ func (task *GuestLiveMigrateTask) OnStartDestComplete(ctx context.Context, guest } headers := task.GetTaskRequestHeader() - host, _ := guest.GetHost() url := fmt.Sprintf("%s/servers/%s/live-migrate", host.ManagerUri, guest.Id) task.SetStage("OnLiveMigrateComplete", nil) diff --git a/pkg/hostman/guestman/guesthandlers/guesthandler.go b/pkg/hostman/guestman/guesthandlers/guesthandler.go index 05374aff1d..00160f651b 100644 --- a/pkg/hostman/guestman/guesthandlers/guesthandler.go +++ b/pkg/hostman/guestman/guesthandlers/guesthandler.go @@ -447,10 +447,14 @@ func guestLiveMigrate(ctx context.Context, userCred mcclient.TokenCredential, si if err != nil { return nil, httperrors.NewMissingParameterError("live_migrate_dest_port") } - nbdServerPort, err := body.Int("nbd_server_port") - if err != nil { - return nil, httperrors.NewMissingParameterError("live_migrate_dest_port") + var nbdServerPort int64 = -1 + if body.Contains("nbd_server_port") { + nbdServerPort, err = body.Int("nbd_server_port") + if err != nil { + return nil, httperrors.NewMissingParameterError("live_migrate_dest_port") + } } + destIp, err := body.GetString("dest_ip") if err != nil { return nil, httperrors.NewMissingParameterError("dest_ip") diff --git a/pkg/hostman/guestman/guesttasks.go b/pkg/hostman/guestman/guesttasks.go index 7f78810872..b97e55021f 100644 --- a/pkg/hostman/guestman/guesttasks.go +++ b/pkg/hostman/guestman/guesttasks.go @@ -1196,7 +1196,17 @@ func (s *SGuestLiveMigrateTask) onDriveMirrorDisksFailed(res string) { } func (s *SGuestLiveMigrateTask) doMigrate() { - s.mirrorDisks("") + if s.params.NbdServerPort > 0 { + s.mirrorDisks("") + } else { + var copyIncremental = false + if s.params.IsLocal { + // copy disk data + copyIncremental = true + } + s.Monitor.Migrate(fmt.Sprintf("tcp:%s:%d", s.params.DestIp, s.params.DestPort), + copyIncremental, false, s.setMaxBandwidth) + } } func (s *SGuestLiveMigrateTask) setMaxBandwidth(res string) { diff --git a/pkg/hostman/guestman/qemu-kvm.go b/pkg/hostman/guestman/qemu-kvm.go index b6fc019533..94743f8d47 100644 --- a/pkg/hostman/guestman/qemu-kvm.go +++ b/pkg/hostman/guestman/qemu-kvm.go @@ -1180,6 +1180,15 @@ func (s *SKVMGuestInstance) getMemoryDevices() ([]monitor.MemoryDeviceInfo, erro return res, err } +func (s *SKVMGuestInstance) hasVirtioBlkDriver() bool { + for i := range s.Desc.Disks { + if s.Desc.Disks[i].Driver == "virtio" { + return true + } + } + return false +} + func (s *SKVMGuestInstance) guestRun(ctx context.Context) { if s.LiveMigrateDestPort != nil && ctx != nil && !s.IsSlave() { // dest migrate guest @@ -1190,14 +1199,20 @@ func (s *SKVMGuestInstance) guestRun(ctx context.Context) { hostutils.TaskFailed(ctx, err.Error()) return } - nbdServerPort := s.manager.GetNBDServerFreePort() - defer s.manager.unsetPort(nbdServerPort) - err = s.migrateStartNbdServer(nbdServerPort) - if err != nil { - hostutils.TaskFailed(ctx, err.Error()) - return + + if s.hasVirtioBlkDriver() { + // virtio driver bind iothread, need migrate use driver mirror + nbdServerPort := s.manager.GetNBDServerFreePort() + defer s.manager.unsetPort(nbdServerPort) + err = s.migrateStartNbdServer(nbdServerPort) + if err != nil { + hostutils.TaskFailed(ctx, err.Error()) + return + } + body.Set("nbd_server_port", jsonutils.NewInt(int64(nbdServerPort))) + } else { + body.Set("nbd_server_disabled", jsonutils.JSONTrue) } - body.Set("nbd_server_port", jsonutils.NewInt(int64(nbdServerPort))) if s.LiveMigrateUseTls { s.setDestMigrateTLS(ctx, body)