@@ -50,15 +50,11 @@ func (m *SHostPendingUsageManager) Keyword() string {
5050}
5151
5252func (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-
6258func (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
211208func (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
217218type 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
307310func 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