@@ -165,11 +165,15 @@ func divideUpToFairShare(totalResourceAmount, kValue float64, queues map[common_
165165 for {
166166 shouldRunAnotherRound := false
167167 amountToGiveInCurrentRound := totalResourceAmount
168- totalWeights := getTotalWeightsForUnsatisfied (queues , resourceName )
168+ totalWeights , totalUsages := getTotalWeightsForUnsatisfied (queues , resourceName )
169169 if totalWeights == 0 {
170170 break
171171 }
172172
173+ if totalUsages == 0 {
174+ totalUsages = 1
175+ }
176+
173177 for _ , queue := range queues {
174178 requested := getRemainingRequested (queue , resourceName )
175179 if requested == 0 {
@@ -190,7 +194,12 @@ func divideUpToFairShare(totalResourceAmount, kValue float64, queues map[common_
190194 log .InfraLogger .V (6 ).Infof ("calculating %v resource fair share for %v: deserved: %v, " +
191195 "remaining requested: %v, fairShare: %v" ,
192196 resourceName , queue .Name , resourceShare .Deserved , requested , resourceShare .FairShare )
193- fairShare := amountToGiveInCurrentRound * (overQuotaWeight / totalWeights )
197+
198+ // normalize values
199+ nWeight := overQuotaWeight / totalWeights
200+ nUsage := resourceShare .GetUsage () / totalUsages
201+
202+ fairShare := amountToGiveInCurrentRound * (nWeight + kValue * (nWeight - nUsage ))
194203 resourceToGive := getResourceToGiveInCurrentRound (fairShare , requested , queue , remainingRequested )
195204 if resourceToGive == 0 {
196205 continue
@@ -255,14 +264,24 @@ func getResourceToGiveInCurrentRound(fairShare float64, requested float64, queue
255264 return resourcesToGive
256265}
257266
258- func getTotalWeightsForUnsatisfied (queues map [common_info.QueueID ]* rs.QueueAttributes , resourceName rs.ResourceName ) (totalOverQuotaWeights float64 ) {
267+ func getTotalWeightsForUnsatisfied (queues map [common_info.QueueID ]* rs.QueueAttributes , resourceName rs.ResourceName ) (totalOverQuotaWeights , totalUsages float64 ) {
259268 for _ , queue := range queues {
260269 remainingRequested := getRemainingRequested (queue , resourceName )
261- if remainingRequested > 0 {
262- totalOverQuotaWeights += queue . ResourceShare ( resourceName ). OverQuotaWeight
270+ if remainingRequested <= 0 {
271+ continue
263272 }
273+ totalOverQuotaWeights += queue .ResourceShare (resourceName ).OverQuotaWeight
274+
275+ queueUsage := queue .ResourceShare (resourceName ).GetUsage ()
276+ if queueUsage < 0 {
277+ log .InfraLogger .V (1 ).Warnf ("queue <%v> has negative usage score of <%v> for resource <%v>, expected non-negative" ,
278+ queue .Name , queueUsage , resourceName )
279+ continue
280+ }
281+
282+ totalUsages += queueUsage
264283 }
265- return totalOverQuotaWeights
284+ return totalOverQuotaWeights , totalUsages
266285}
267286
268287func getRemainingRequested (queue * rs.QueueAttributes , resourceName rs.ResourceName ) float64 {
0 commit comments