From 98563310860c64721567aa7ac9cca542bd63ddb1 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 23 Dec 2021 01:13:08 +0800 Subject: [PATCH] fix: 1. migration timeout applicable to shared storage migrate only 2. migration timeout logic error 3. cancel host download handler timeout 4. add enable_vm_uuid option 5. add migrate event log notes --- pkg/compute/tasks/guest_live_migrate_task.go | 15 ++++++++++----- pkg/hostman/downloader/downloadhandler.go | 20 ++++++++++++++------ pkg/hostman/guestman/guesttasks.go | 6 +++--- pkg/hostman/guestman/qemu-arm.go | 6 ++++-- pkg/hostman/guestman/qemu-kvmhelper.go | 16 +++++++++++++--- pkg/hostman/options/options.go | 2 ++ 6 files changed, 46 insertions(+), 19 deletions(-) diff --git a/pkg/compute/tasks/guest_live_migrate_task.go b/pkg/compute/tasks/guest_live_migrate_task.go index a0c27afe36..c616966567 100644 --- a/pkg/compute/tasks/guest_live_migrate_task.go +++ b/pkg/compute/tasks/guest_live_migrate_task.go @@ -103,6 +103,11 @@ func (self *GuestMigrateTask) SaveScheduleResult(ctx context.Context, obj ISched body := jsonutils.NewDict() body.Set("target_host_id", jsonutils.NewString(targetHostId)) + // for params notes + body.Set("target_host_name", jsonutils.NewString(targetHost.Name)) + srcHost := models.HostManager.FetchHostById(guest.HostId) + body.Set("source_host_name", jsonutils.NewString(srcHost.Name)) + body.Set("source_host_id", jsonutils.NewString(srcHost.Id)) disks, _ := guest.GetGuestDisks() disk := disks[0].GetDisk() @@ -184,7 +189,7 @@ func (self *GuestMigrateTask) OnCachedCdromComplete(ctx context.Context, guest * if !jsonutils.QueryBoolean(self.Params, "is_rescue_mode", false) { host, _ := guest.GetHost() url := fmt.Sprintf("%s/servers/%s/src-prepare-migrate", host.ManagerUri, guest.Id) - self.SetStage("OnSrcPrepareComplete", nil) + self.SetStage("OnSrcPrepareComplete", body) _, _, err := httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, header, body, false) if err != nil { @@ -230,7 +235,7 @@ func (self *GuestMigrateTask) OnSrcPrepareComplete(ctx context.Context, guest *m headers := self.GetTaskRequestHeader() url := fmt.Sprintf("%s/servers/%s/dest-prepare-migrate", targetHost.ManagerUri, guest.Id) - self.SetStage("OnMigrateConfAndDiskComplete", nil) + self.SetStage("OnMigrateConfAndDiskComplete", body) _, _, err = httputils.JSONRequest(httputils.GetDefaultClient(), ctx, "POST", url, headers, body, false) if err != nil { @@ -472,7 +477,7 @@ func (self *GuestLiveMigrateTask) OnGuestSyncStatus(ctx context.Context, guest * func (self *GuestMigrateTask) TaskComplete(ctx context.Context, guest *models.SGuest) { self.SetStageComplete(ctx, nil) db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, "Migrate success", self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, "", self.UserCred, true) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, self.Params, self.UserCred, true) } func (self *GuestMigrateTask) TaskFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) { @@ -505,7 +510,7 @@ func (self *ManagedGuestMigrateTask) MigrateStart(ctx context.Context, guest *mo func (self *ManagedGuestMigrateTask) OnMigrateComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { guest := obj.(*models.SGuest) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, data, self.UserCred, true) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, self.Params, self.UserCred, true) db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, guest.GetShortDesc(ctx), self.UserCred) if jsonutils.QueryBoolean(self.Params, "auto_start", false) { self.SetStage("OnGuestStartSucc", nil) @@ -558,7 +563,7 @@ func (self *ManagedGuestLiveMigrateTask) MigrateStart(ctx context.Context, guest func (self *ManagedGuestLiveMigrateTask) OnMigrateComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { self.SetStage("OnGuestSyncStatus", nil) db.OpsLog.LogEvent(guest, db.ACT_MIGRATE, guest.GetShortDesc(ctx), self.UserCred) - logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, data, self.UserCred, true) + logclient.AddActionLogWithContext(ctx, guest, logclient.ACT_MIGRATE, self.Params, self.UserCred, true) guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId()) } diff --git a/pkg/hostman/downloader/downloadhandler.go b/pkg/hostman/downloader/downloadhandler.go index 001b1d4383..53efe1a59a 100644 --- a/pkg/hostman/downloader/downloadhandler.go +++ b/pkg/hostman/downloader/downloadhandler.go @@ -55,13 +55,21 @@ func AddDownloadHandler(prefix string, app *appsrv.Application) { nil, "snapshot_download", nil) customizeHandlerInfo(hi) - app.AddHandler("HEAD", fmt.Sprintf("%s/%s/disks//", - prefix, kerword), auth.Authenticate(diskHead)) - app.AddHandler("HEAD", + hi = app.AddHandler2("HEAD", fmt.Sprintf("%s/%s/disks//", + prefix, kerword), auth.Authenticate(diskHead), + nil, "head_disk_download", nil) + customizeHandlerInfo(hi) + + hi = app.AddHandler2("HEAD", fmt.Sprintf("%s/%s/snapshots///", - prefix, kerword), auth.Authenticate(snapshotHead)) - app.AddHandler("HEAD", - fmt.Sprintf("%s/%s/images/", prefix, kerword), auth.Authenticate(imageCacheHead)) + prefix, kerword), auth.Authenticate(snapshotHead), + nil, "head_snapshot_download", nil) + customizeHandlerInfo(hi) + + hi = app.AddHandler2("HEAD", + fmt.Sprintf("%s/%s/images/", prefix, kerword), auth.Authenticate(imageCacheHead), + nil, "head_image", nil) + customizeHandlerInfo(hi) } } diff --git a/pkg/hostman/guestman/guesttasks.go b/pkg/hostman/guestman/guesttasks.go index c18ac374a2..7b94ed4724 100644 --- a/pkg/hostman/guestman/guesttasks.go +++ b/pkg/hostman/guestman/guesttasks.go @@ -514,8 +514,8 @@ func (s *SGuestLiveMigrateTask) startMigrate(res string) { if migSeconds < options.HostOptions.MinMigrateTimeoutSeconds { migSeconds = options.HostOptions.MinMigrateTimeoutSeconds } - log.Infof("migrate timeout seconds: %d", migSeconds) s.timeoutAt = time.Now().Add(time.Second * time.Duration(migSeconds)) + log.Infof("migrate timeout seconds: %d now: %v expectfinial: %v", migSeconds, time.Now(), s.timeoutAt) var copyIncremental = false if s.params.IsLocal { copyIncremental = true @@ -550,8 +550,8 @@ func (s *SGuestLiveMigrateTask) onGetMigrateStatus(status string) { s.migrateTask = nil close(s.c) hostutils.TaskFailed(s.ctx, fmt.Sprintf("Query migrate got status: %s", status)) - } else if !s.doTimeoutMigrate { - if s.timeoutAt.After(time.Now()) { + } else if !s.params.IsLocal && !s.doTimeoutMigrate { + if s.timeoutAt.Before(time.Now()) { log.Warningf("migrate timeout, force stop to finish migrate") // timeout, start memory postcopy // https://wiki.qemu.org/Features/PostCopyLiveMigration diff --git a/pkg/hostman/guestman/qemu-arm.go b/pkg/hostman/guestman/qemu-arm.go index 470e1ad8c6..45fca401f6 100644 --- a/pkg/hostman/guestman/qemu-arm.go +++ b/pkg/hostman/guestman/qemu-arm.go @@ -167,9 +167,11 @@ function nic_mtu() { // warning: Number of hotpluggable cpus requested (128) // exceeds the recommended cpus supported by KVM (32) - cmd += fmt.Sprintf(" -smp %d,maxcpus=32", cpu) + cmd += fmt.Sprintf(" -smp cpus=%d,sockets=2,cores=64,maxcpus=128", cpu) cmd += fmt.Sprintf(" -name %s", name) - cmd += fmt.Sprintf(" -uuid %s", uuid) + if options.HostOptions.EnableVmUuid { + cmd += fmt.Sprintf(" -uuid %s", uuid) + } cmd += fmt.Sprintf(" -m %dM,slots=4,maxmem=262144M", mem) if options.HostOptions.HugepagesOption == "native" { diff --git a/pkg/hostman/guestman/qemu-kvmhelper.go b/pkg/hostman/guestman/qemu-kvmhelper.go index 21a7667321..086fd38a4e 100644 --- a/pkg/hostman/guestman/qemu-kvmhelper.go +++ b/pkg/hostman/guestman/qemu-kvmhelper.go @@ -163,6 +163,14 @@ func (s *SKVMGuestInstance) disablePvpanicDev() bool { return val == "true" } +func isLocalStorage(disk api.GuestdiskJsonDesc) bool { + if disk.StorageType == api.STORAGE_LOCAL || len(disk.StorageType) == 0 { + return true + } else { + return false + } +} + func (s *SKVMGuestInstance) getDriveDesc(disk api.GuestdiskJsonDesc, isArm bool) string { format := disk.Format diskIndex := disk.Index @@ -179,13 +187,13 @@ func (s *SKVMGuestInstance) getDriveDesc(disk api.GuestdiskJsonDesc, isArm bool) cmd += ",format=raw" } cmd += fmt.Sprintf(",cache=%s", cacheMode) - if disk.StorageType == api.STORAGE_LOCAL { + if isLocalStorage(disk) { cmd += fmt.Sprintf(",aio=%s", aioMode) } if len(disk.Url) > 0 { // # a remote file backed image cmd += ",copy-on-read=on" } - if disk.StorageType == api.STORAGE_LOCAL { + if isLocalStorage(disk) { cmd += ",file.locking=off" } // #cmd += ",media=disk" @@ -548,7 +556,9 @@ function nic_mtu() { // #cmd += " -g 800x600" cmd += fmt.Sprintf(" -smp cpus=%d,sockets=2,cores=64,maxcpus=128", cpu) cmd += fmt.Sprintf(" -name %s", name) - cmd += fmt.Sprintf(" -uuid %s", uuid) + if options.HostOptions.EnableVmUuid { + cmd += fmt.Sprintf(" -uuid %s", uuid) + } cmd += fmt.Sprintf(" -m %dM,slots=4,maxmem=524288M", mem) if s.manager.host.IsHugepagesEnabled() { diff --git a/pkg/hostman/options/options.go b/pkg/hostman/options/options.go index 4822211aaa..ad6b15d15e 100644 --- a/pkg/hostman/options/options.go +++ b/pkg/hostman/options/options.go @@ -155,6 +155,8 @@ type SHostOptions struct { DisableGPU bool `help:"force disable GPU" default:"false" json:"disable_gpu"` EthtoolEnableGso bool `help:"use ethtool to turn on or off GSO(generic segment offloading)" default:"false" json:"ethtool_enable_gso"` + + EnableVmUuid bool `help:"enable vm UUID" default:"true" json:"enable_vm_uuid"` } var (