Merge pull request #18388 from wanyaoqi/automated-cherry-pick-of-#18384-upstream-master

Automated cherry pick of #18384: Automated cherry pick of #18383: fix(region,host): live migrate disk driver determines the migration mode
This commit is contained in:
Zexi Li
2023-10-23 11:18:11 +08:00
committed by GitHub
4 changed files with 50 additions and 19 deletions
+10 -8
View File
@@ -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)
@@ -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")
+11 -1
View File
@@ -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) {
+22 -7
View File
@@ -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)