From 16507604f760e87c2fb0bbab5830463f36648514 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Wed, 11 Jan 2023 17:14:56 +0800 Subject: [PATCH] fix(region): auto switch to backup on host down --- pkg/apis/input.go | 5 +++-- pkg/compute/models/guest_actions.go | 2 +- pkg/compute/models/host_health.go | 2 +- pkg/compute/models/hosts.go | 17 ----------------- pkg/compute/tasks/guest_backup_tasks.go | 9 +++++++++ pkg/hostman/guestman/qemu-kvm.go | 4 ++-- 6 files changed, 16 insertions(+), 23 deletions(-) diff --git a/pkg/apis/input.go b/pkg/apis/input.go index 07976feca5..8ff8953d8a 100644 --- a/pkg/apis/input.go +++ b/pkg/apis/input.go @@ -227,8 +227,9 @@ type PerformStatusInput struct { BlockJobsCount int `json:"block_jobs_count"` // 电源状态 PowerStates string `json:"power_states"` - // is call from slave guest - IsSlave bool `json:"is_slave"` + // call from host id + HostId string `json:"host_id"` + // 更改状态的原因描述 // required:false Reason string `json:"reason"` diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 348d2745e6..af106ad0c8 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -2859,7 +2859,7 @@ func (self *SGuest) SetBackupGuestStatus(userCred mcclient.TokenCredential, stat } func (self *SGuest) PerformStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input apis.PerformStatusInput) (jsonutils.JSONObject, error) { - if input.IsSlave { // perform status called from slave guest + if input.HostId != "" && self.BackupHostId != "" && input.HostId == self.BackupHostId { // perform status called from slave guest return nil, self.SetBackupGuestStatus(userCred, input.Status, input.Reason) } if input.PowerStates != "" { diff --git a/pkg/compute/models/host_health.go b/pkg/compute/models/host_health.go index 851b3b6642..52999801eb 100644 --- a/pkg/compute/models/host_health.go +++ b/pkg/compute/models/host_health.go @@ -68,7 +68,7 @@ func (h *SHostHealthChecker) load(hostname string) chan struct{} { } func (h *SHostHealthChecker) startHealthCheck(ctx context.Context) error { - q := HostManager.Query().IsTrue("enabled").IsTrue("enable_health_check").Equals("host_type", api.HOST_TYPE_HYPERVISOR) + q := HostManager.Query().IsTrue("enabled").Equals("host_type", api.HOST_TYPE_HYPERVISOR) rows, err := q.Rows() if err != nil { log.Errorf("HostHealth check Query hosts %s", err) diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 3819268309..c11ca97e50 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -5738,23 +5738,6 @@ func (host *SHost) switchWithBackup(ctx context.Context, userCred mcclient.Token ) } } - - guests2 := host.GetGuestsBackupOnThisHost() - for i := 0; i < len(guests2); i++ { - data := jsonutils.NewDict() - data.Set("purge", jsonutils.JSONTrue) - data.Set("create", jsonutils.JSONTrue) - _, err := guests2[i].PerformDeleteBackup(ctx, userCred, nil, data) - if err != nil { - db.OpsLog.LogEvent( - &guests2[i], db.ACT_DELETE_BACKUP_FAILED, fmt.Sprintf("PerformDeleteBackup on host down: %s", err), userCred, - ) - logclient.AddSimpleActionLog( - &guests2[i], logclient.ACT_DELETE_BACKUP, - fmt.Sprintf("PerformDeleteBackup on host down: %s", err), userCred, false, - ) - } - } } func (host *SHost) migrateOnHostDown(ctx context.Context, userCred mcclient.TokenCredential) { diff --git a/pkg/compute/tasks/guest_backup_tasks.go b/pkg/compute/tasks/guest_backup_tasks.go index 9f35ddce98..76ddf9579e 100644 --- a/pkg/compute/tasks/guest_backup_tasks.go +++ b/pkg/compute/tasks/guest_backup_tasks.go @@ -151,6 +151,15 @@ func (self *GuestStartAndSyncToBackupTask) checkTemplete(ctx context.Context, gu func (self *GuestStartAndSyncToBackupTask) OnCheckTemplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { self.SetStage("OnStartBackupGuest", nil) host := models.HostManager.FetchHostById(guest.BackupHostId) + + if !guest.IsGuestBackupMirrorJobReady(ctx, self.UserCred) { + hostMaster := models.HostManager.FetchHostById(guest.HostId) + self.Params.Set("block_ready", jsonutils.JSONFalse) + diskUri := fmt.Sprintf("%s/disks", hostMaster.GetFetchUrl(true)) + self.Params.Set("disk_uri", jsonutils.NewString(diskUri)) + } else { + self.Params.Set("block_ready", jsonutils.JSONTrue) + } err := guest.GetDriver().RequestStartOnHost(ctx, guest, host, self.UserCred, self) if err != nil { self.SetStageFailed(ctx, jsonutils.NewString(err.Error())) diff --git a/pkg/hostman/guestman/qemu-kvm.go b/pkg/hostman/guestman/qemu-kvm.go index fabd07fbe6..56e7459338 100644 --- a/pkg/hostman/guestman/qemu-kvm.go +++ b/pkg/hostman/guestman/qemu-kvm.go @@ -1362,8 +1362,8 @@ func (s *SKVMGuestInstance) SyncStatus(reason string) { statusInput := &apis.PerformStatusInput{ Status: status, Reason: reason, - IsSlave: s.IsSlave(), PowerStates: s.GetPowerStates(), + HostId: hostinfo.Instance().HostId, } if _, err := hostutils.UpdateServerStatus(context.Background(), s.Id, statusInput); err != nil { @@ -1390,7 +1390,7 @@ func (s *SKVMGuestInstance) CheckBlockOrRunning(jobs int) { Status: status, BlockJobsCount: jobs, PowerStates: s.GetPowerStates(), - IsSlave: s.IsSlave(), + HostId: hostinfo.Instance().HostId, } _, err := hostutils.UpdateServerStatus(context.Background(), s.Id, statusInput) if err != nil {