diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index acc6fdc4cc..bb25bfef94 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1467,8 +1467,11 @@ func (self *SGuest) StartGueststartTask( data *jsonutils.JSONDict, parentTaskId string, ) error { schedStart := self.Hypervisor == api.HYPERVISOR_KVM && self.guestDisksStorageTypeIsShared() - if options.Options.IgnoreNonrunningGuests && self.CpuNumaPin != nil { - schedStart = true + if options.Options.IgnoreNonrunningGuests { + host := HostManager.FetchHostById(self.HostId) + if host != nil && host.EnableNumaAllocate { + schedStart = true + } } if schedStart { diff --git a/pkg/compute/tasks/guest_start_task.go b/pkg/compute/tasks/guest_start_task.go index f07f84987d..d1fceb0bc3 100644 --- a/pkg/compute/tasks/guest_start_task.go +++ b/pkg/compute/tasks/guest_start_task.go @@ -101,32 +101,32 @@ func (self *GuestSchedStartTask) OnInit(ctx context.Context, obj db.IStandaloneM } func (self *GuestSchedStartTask) StartScheduler(ctx context.Context, guest *models.SGuest) { - if guest.CpuNumaPin != nil { - self.ScheduleFailed(ctx, guest) + host, _ := guest.GetHost() + if host.EnableNumaAllocate { + self.ScheduleFailed(ctx, guest, true) return } - host, _ := guest.GetHost() if request := host.GetRunningGuestResourceUsage(); request == nil { self.TaskFailed(ctx, guest, jsonutils.NewString("Guest Start Failed: Can't Get Host Guests CPU Memory Usage")) } else { if float32(request.GuestVmemSize+guest.VmemSize) > host.GetVirtualMemorySize() { log.Infof("host memory not enough to start guest") - self.ScheduleFailed(ctx, guest) + self.ScheduleFailed(ctx, guest, false) } else if request.GuestVcpuCount+guest.VcpuCount > int(host.GetVirtualCPUCount()) { log.Infof("host cpu not enough to start guest") - self.ScheduleFailed(ctx, guest) + self.ScheduleFailed(ctx, guest, false) } else { self.ScheduleSucc(ctx, guest) } } } -func (self *GuestSchedStartTask) ScheduleFailed(ctx context.Context, guest *models.SGuest) { +func (self *GuestSchedStartTask) ScheduleFailed(ctx context.Context, guest *models.SGuest, resetCpuNumaPin bool) { self.SetStage("OnGuestMigrate", nil) preferHostId := "" - if guest.CpuNumaPin != nil { + if resetCpuNumaPin { preferHostId = guest.HostId } @@ -134,17 +134,27 @@ func (self *GuestSchedStartTask) ScheduleFailed(ctx context.Context, guest *mode } func (self *GuestSchedStartTask) OnGuestMigrate(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { - self.SetStageComplete(ctx, nil) - guest.GuestNonSchedStartTask(ctx, self.UserCred, nil, "") + self.SetStage("OnGuestStarted", nil) + + guest.GuestNonSchedStartTask(ctx, self.UserCred, self.Params, self.GetTaskId()) } func (self *GuestSchedStartTask) OnGuestMigrateFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { self.TaskFailed(ctx, guest, data) } -func (self *GuestSchedStartTask) ScheduleSucc(ctx context.Context, guest *models.SGuest) { +func (self *GuestSchedStartTask) OnGuestStarted(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { self.SetStageComplete(ctx, nil) - guest.GuestNonSchedStartTask(ctx, self.UserCred, self.Params, "") +} + +func (self *GuestSchedStartTask) OnGuestStartedFailed(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { + self.TaskFailed(ctx, guest, data) +} + +func (self *GuestSchedStartTask) ScheduleSucc(ctx context.Context, guest *models.SGuest) { + self.SetStage("OnGuestStarted", nil) + + guest.GuestNonSchedStartTask(ctx, self.UserCred, self.Params, self.GetTaskId()) } func (self *GuestSchedStartTask) TaskFailed(ctx context.Context, guest *models.SGuest, reason jsonutils.JSONObject) {