Skip to content

Commit d463a94

Browse files
authored
fix(scheduler,region): fill resource info check guest is in pending usage (#21675)
1 parent db83d01 commit d463a94

File tree

5 files changed

+84
-39
lines changed

5 files changed

+84
-39
lines changed

pkg/apis/scheduler/api.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ type ScheduleInput struct {
9090
// For Migrate
9191
CpuNumaPin []SCpuNumaPin `json:"cpu_numa_pin"`
9292

93+
// GuestIds
94+
GuestIds []string `json:"guest_ids"`
95+
9396
HostMemPageSizeKB int `json:"host_mem_page_size"`
9497
SkipKernelCheck *bool `json:"skip_kernel_check"`
9598
TargetHostKernel string `json:"target_host_kernel"`

pkg/compute/tasks/schedule.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ func doScheduleObjects(
141141
return
142142
}
143143

144+
sort.Sort(sortedIScheduleModelList(objs))
145+
schedInput.GuestIds = make([]string, len(objs))
146+
for i := range objs {
147+
schedInput.GuestIds[i] = objs[i].GetId()
148+
}
149+
144150
output, err := doScheduleWithInput(ctx, task, schedInput, len(objs))
145151
if err != nil {
146152
onSchedulerRequestFail(ctx, task, objs, jsonutils.NewString(err.Error()))
@@ -202,7 +208,6 @@ func onSchedulerResults(
202208
task.SaveScheduleResult(ctx, nil, results[0], 0)
203209
return
204210
}
205-
sort.Sort(sortedIScheduleModelList(objs))
206211
succCount := 0
207212
for idx := 0; idx < len(objs); idx += 1 {
208213
obj := objs[idx]

pkg/scheduler/cache/candidate/hosts.go

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,7 @@ func (b *HostBuilder) fillGuestsResourceInfo(desc *HostDesc, host *computemodels
13431343
guestsOnHost = append(guestsOnHost, backupGuestsOnHost...)
13441344
}
13451345

1346+
pendingUsage := desc.GetPendingUsage()
13461347
desc.Tenants = make(map[string]int64)
13471348
for _, gst := range guestsOnHost {
13481349
guest := gst.(computemodels.SGuest)
@@ -1352,25 +1353,33 @@ func (b *HostBuilder) fillGuestsResourceInfo(desc *HostDesc, host *computemodels
13521353
} else {
13531354
desc.Tenants[projectId] = 1
13541355
}
1355-
if IsGuestRunning(guest) {
1356-
runningCount++
1357-
memSize += int64(guest.VmemSize)
1358-
cpuCount += int64(guest.VcpuCount)
1359-
if guest.CpuNumaPin != nil {
1360-
cpuNumaPin := make([]scheduler.SCpuNumaPin, 0)
1361-
if err := guest.CpuNumaPin.Unmarshal(&cpuNumaPin); err != nil {
1362-
return errors.Wrap(err, "unmarshal cpu numa pin")
1363-
}
1364-
guestsCpuNumaPin = append(guestsCpuNumaPin, cpuNumaPin...)
1365-
}
1366-
} else if IsGuestCreating(guest) {
1367-
creatingGuestCount++
1368-
creatingMemSize += int64(guest.VmemSize)
1369-
creatingCPUCount += int64(guest.VcpuCount)
1370-
} else if IsGuestPendingDelete(guest) {
1356+
1357+
if IsGuestPendingDelete(guest) {
13711358
memFakeDeletedSize += int64(guest.VmemSize)
13721359
cpuFakeDeletedCount += int64(guest.VcpuCount)
1360+
} else {
1361+
if _, ok := pendingUsage.PendingGuestIds[guest.Id]; ok {
1362+
log.Infof("fillGuestsResourceInfo guest %s in pending usage", guest.Id)
1363+
continue
1364+
}
1365+
if IsGuestRunning(guest) {
1366+
runningCount++
1367+
memSize += int64(guest.VmemSize)
1368+
cpuCount += int64(guest.VcpuCount)
1369+
if guest.CpuNumaPin != nil {
1370+
cpuNumaPin := make([]scheduler.SCpuNumaPin, 0)
1371+
if err := guest.CpuNumaPin.Unmarshal(&cpuNumaPin); err != nil {
1372+
return errors.Wrap(err, "unmarshal cpu numa pin")
1373+
}
1374+
guestsCpuNumaPin = append(guestsCpuNumaPin, cpuNumaPin...)
1375+
}
1376+
} else if IsGuestCreating(guest) {
1377+
creatingGuestCount++
1378+
creatingMemSize += int64(guest.VmemSize)
1379+
creatingCPUCount += int64(guest.VcpuCount)
1380+
}
13731381
}
1382+
13741383
guestCount++
13751384
cpuReqCount += int64(guest.VcpuCount)
13761385
memReqSize += int64(guest.VmemSize)

pkg/scheduler/manager/task_queue.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,16 @@ func setSchedPendingUsage(driver computemodels.IGuestDriver, req *api.SchedInfo,
132132
if req.IsSuggestion || IsDriverSkipScheduleDirtyMark(driver) {
133133
return nil
134134
}
135-
for _, item := range resp.Candidates {
136-
schedmodels.HostPendingUsageManager.AddPendingUsage(req, item)
135+
for i, item := range resp.Candidates {
136+
if item.Error != "" {
137+
// schedule failed skip add pending usage
138+
continue
139+
}
140+
var guestId string
141+
if len(req.GuestIds) > i {
142+
guestId = req.GuestIds[i]
143+
}
144+
schedmodels.HostPendingUsageManager.AddPendingUsage(guestId, req, item)
137145
}
138146
return nil
139147
}

pkg/scheduler/models/pending_usage.go

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,11 @@ func (m *SHostPendingUsageManager) Keyword() string {
5050
}
5151

5252
func (m *SHostPendingUsageManager) newSessionUsage(req *api.SchedInfo, hostId string, candidate *schedapi.CandidateResource) *SessionPendingUsage {
53-
su := NewSessionUsage(req.SessionId, hostId)
54-
su.Usage = NewPendingUsageBySchedInfo(hostId, req, candidate)
53+
usage := NewPendingUsageBySchedInfo(hostId, req, candidate)
54+
su := NewSessionUsage(req.SessionId, hostId, usage)
5555
return su
5656
}
5757

58-
func (m *SHostPendingUsageManager) newPendingUsage(hostId string) *SPendingUsage {
59-
return NewPendingUsageBySchedInfo(hostId, nil, nil)
60-
}
61-
6258
func (m *SHostPendingUsageManager) GetPendingUsage(hostId string) (*SPendingUsage, error) {
6359
return m.getPendingUsage(hostId)
6460
}
@@ -75,33 +71,33 @@ func (m *SHostPendingUsageManager) GetSessionUsage(sessionId, hostId string) (*S
7571
return m.store.GetSessionUsage(sessionId, hostId)
7672
}
7773

78-
func (m *SHostPendingUsageManager) AddPendingUsage(req *api.SchedInfo, candidate *schedapi.CandidateResource) {
74+
func (m *SHostPendingUsageManager) AddPendingUsage(guestId string, req *api.SchedInfo, candidate *schedapi.CandidateResource) {
7975
hostId := candidate.HostId
8076

8177
sessionUsage, _ := m.GetSessionUsage(req.SessionId, hostId)
8278
if sessionUsage == nil {
8379
sessionUsage = m.newSessionUsage(req, hostId, candidate)
8480
sessionUsage.StartTimer()
8581
}
86-
m.addSessionUsage(candidate.HostId, sessionUsage)
82+
m.addSessionUsage(candidate.HostId, guestId, sessionUsage)
8783
if candidate.BackupCandidate != nil {
88-
m.AddPendingUsage(req, candidate.BackupCandidate)
84+
m.AddPendingUsage(guestId, req, candidate.BackupCandidate)
8985
}
9086
}
9187

9288
// addSessionUsage add pending usage and session usage
93-
func (m *SHostPendingUsageManager) addSessionUsage(hostId string, usage *SessionPendingUsage) {
89+
func (m *SHostPendingUsageManager) addSessionUsage(hostId, guestId string, usage *SessionPendingUsage) {
9490
ctx := context.Background()
9591
lockman.LockClass(ctx, m, hostId)
9692
defer lockman.ReleaseClass(ctx, m, hostId)
9793

9894
pendingUsage, _ := m.getPendingUsage(hostId)
9995
if pendingUsage == nil {
100-
pendingUsage = m.newPendingUsage(hostId)
96+
pendingUsage = NewPendingUsageBySchedInfo(hostId, nil, nil)
10197
}
10298
// add pending usage
103-
pendingUsage.Add(usage.Usage)
104-
usage.AddCount()
99+
pendingUsage.Add(usage.Usage, guestId)
100+
usage.AddCount(guestId)
105101
m.store.SetSessionUsage(usage.SessionId, hostId, usage)
106102
m.store.SetPendingUsage(hostId, pendingUsage)
107103
}
@@ -186,11 +182,11 @@ type SessionPendingUsage struct {
186182
cancelCh chan string
187183
}
188184

189-
func NewSessionUsage(sid, hostId string) *SessionPendingUsage {
185+
func NewSessionUsage(sid, hostId string, usage *SPendingUsage) *SessionPendingUsage {
190186
su := &SessionPendingUsage{
191187
HostId: hostId,
192188
SessionId: sid,
193-
Usage: NewPendingUsageBySchedInfo(hostId, nil, nil),
189+
Usage: usage,
194190
count: 0,
195191
countLock: new(sync.Mutex),
196192
cancelCh: make(chan string),
@@ -202,16 +198,21 @@ func (su *SessionPendingUsage) GetHostId() string {
202198
return su.Usage.HostId
203199
}
204200

205-
func (su *SessionPendingUsage) AddCount() {
201+
func (su *SessionPendingUsage) AddCount(guestId string) {
206202
su.countLock.Lock()
207203
defer su.countLock.Unlock()
208204
su.count++
205+
su.Usage.PendingGuestIds[guestId] = struct{}{}
209206
}
210207

211208
func (su *SessionPendingUsage) SubCount() {
212209
su.countLock.Lock()
213210
defer su.countLock.Unlock()
214211
su.count--
212+
for guestId, _ := range su.Usage.PendingGuestIds {
213+
delete(su.Usage.PendingGuestIds, guestId)
214+
break
215+
}
215216
}
216217

217218
type SResourcePendingUsage struct {
@@ -295,6 +296,8 @@ type SPendingUsage struct {
295296
CpuPin map[int]int
296297
Memory int
297298

299+
PendingGuestIds map[string]struct{}
300+
298301
// nodeId: memSizeMB
299302
NumaMemPin map[int]int
300303
IsolatedDevice int
@@ -306,9 +309,10 @@ type SPendingUsage struct {
306309

307310
func NewPendingUsageBySchedInfo(hostId string, req *api.SchedInfo, candidate *schedapi.CandidateResource) *SPendingUsage {
308311
u := &SPendingUsage{
309-
HostId: hostId,
310-
DiskUsage: NewResourcePendingUsage(nil),
311-
NetUsage: NewResourcePendingUsage(nil),
312+
HostId: hostId,
313+
DiskUsage: NewResourcePendingUsage(nil),
314+
NetUsage: NewResourcePendingUsage(nil),
315+
PendingGuestIds: make(map[string]struct{}),
312316
}
313317

314318
// group init
@@ -385,7 +389,7 @@ func (self *SPendingUsage) ToMap() map[string]interface{} {
385389
}
386390
}
387391

388-
func (self *SPendingUsage) Add(sUsage *SPendingUsage) {
392+
func (self *SPendingUsage) Add(sUsage *SPendingUsage, addGuestId string) {
389393
self.Cpu = self.Cpu + sUsage.Cpu
390394
for k, v1 := range sUsage.CpuPin {
391395
if v2, ok := self.CpuPin[k]; ok {
@@ -395,6 +399,17 @@ func (self *SPendingUsage) Add(sUsage *SPendingUsage) {
395399
}
396400
}
397401

402+
for guestId := range sUsage.PendingGuestIds {
403+
if _, ok := self.PendingGuestIds[guestId]; !ok {
404+
log.Infof("add guest %s in pending usage", guestId)
405+
self.PendingGuestIds[guestId] = struct{}{}
406+
}
407+
}
408+
if addGuestId != "" {
409+
log.Infof("add guest %s in pending usage", addGuestId)
410+
self.PendingGuestIds[addGuestId] = struct{}{}
411+
}
412+
398413
self.Memory = self.Memory + sUsage.Memory
399414
for k, v1 := range sUsage.NumaMemPin {
400415
if v2, ok := self.NumaMemPin[k]; ok {
@@ -423,6 +438,11 @@ func (self *SPendingUsage) Sub(sUsage *SPendingUsage) {
423438
}
424439
}
425440

441+
for guestId := range sUsage.PendingGuestIds {
442+
log.Infof("delete guest %s in pending usage", guestId)
443+
delete(self.PendingGuestIds, guestId)
444+
}
445+
426446
self.Memory = quotas.NonNegative(self.Memory - sUsage.Memory)
427447
for k, v1 := range sUsage.NumaMemPin {
428448
if v2, ok := self.NumaMemPin[k]; ok {

0 commit comments

Comments
 (0)