blob: 099fcc1740b6d371119deb009576bd55386c72b4 [file] [log] [blame]
/**
* Copyright 2016 Yahoo Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.yahoo.pulsar.broker.loadbalance.impl;
import java.util.HashMap;
import java.util.Map;
import com.yahoo.pulsar.broker.loadbalance.ResourceDescription;
import com.yahoo.pulsar.common.policies.data.loadbalancer.ResourceUsage;
public class PulsarResourceDescription extends ResourceDescription {
// entry example : "cpu"->ResourceUsage(usage=80, limit=100)
private Map<String, ResourceUsage> resourceUsageByName;
public PulsarResourceDescription() {
resourceUsageByName = new HashMap<String, ResourceUsage>();
}
@Override
public int compareTo(ResourceDescription o) {
if (o.getResourceUsage().size() > resourceUsageByName.size())
return -1;
// TODO need to return zero if two resourceDescription match exactly
for (Map.Entry<String, ResourceUsage> entry : o.getResourceUsage().entrySet()) {
// if we don't have any entry which is in other but not in our set, we fail
String resourceName = entry.getKey();
// check if we have this resource, if not clearly we are lesser
if (resourceUsageByName.containsKey(resourceName)) {
int less = resourceUsageByName.get(resourceName).compareTo(entry.getValue());
// not using the resource till its last shred, so <= 0 is failure
if (less <= 0) {
return -1;
}
} else {
return -1;
}
}
return 1;
}
@Override
public void removeUsage(ResourceDescription rd) {
// TODO Auto-generated method stub
}
@Override
public void addUsage(ResourceDescription rd) {
// TODO Auto-generated method stub
}
@Override
public int getUsagePct() {
// TODO Auto-generated method stub
return 0;
}
@Override
public Map<String, ResourceUsage> getResourceUsage() {
return resourceUsageByName;
}
public void put(String resourceType, ResourceUsage resourceUsage) {
resourceUsageByName.put(resourceType, resourceUsage);
}
public long calculateRank() {
float weight = 1;
if (resourceUsageByName.size() > 1) {
weight = 1.0f / resourceUsageByName.size();
}
long rank = 0;
int resourcesWithHighUsage = 0;
int throttle = 75;
for (Map.Entry<String, ResourceUsage> entry : resourceUsageByName.entrySet()) {
double percentageUsage = 0;
if (entry.getValue().limit > 0)
percentageUsage = (entry.getValue().usage / entry.getValue().limit) * 100;
// give equal weight to each resource
double resourceWeight = weight * percentageUsage;
// any resource usage over 75% doubles the whole weight per resource
if (percentageUsage > throttle)
resourcesWithHighUsage++;
rank += resourceWeight;
}
if (resourcesWithHighUsage > 0)
rank = rank * resourcesWithHighUsage * 2;
return rank;
}
}