/**
*
*/
package io.nettythrift.core;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.thrift.TBase;
/**
* @author HouKx
*
*/
public class DefaultTrafficForecastImpl implements TrafficForecast {
private HashMap<Integer, MethodTraffic> traffics;
public DefaultTrafficForecastImpl(Map<String, Integer> inits, int statisticSum) {
this.traffics = new HashMap<>(inits.size());
for (Map.Entry<String, Integer> entry : inits.entrySet()) {
traffics.put(entry.getKey().hashCode(), new MethodTraffic(entry.getValue(), statisticSum));
}
}
public int getInitBytesForWrite(String method) {
MethodTraffic mt = traffics.get(method.hashCode());
if (mt != null) {
return mt.avg;
}
return 1024;
}
@SuppressWarnings("rawtypes")
public void saveWritedBytes(String method, int writedBytes, TBase args, TBase result) {
MethodTraffic mt = traffics.get(method.hashCode());
if (mt != null) {
mt.save(writedBytes);
}
}
private static class MethodTraffic {
volatile int avg;
long lastSum;
int[] history;
MethodTraffic(int initMaxBytes, int statisticSum) {
avg = initMaxBytes;
history = new int[statisticSum + 1];
Arrays.fill(history, 1, statisticSum + 1, initMaxBytes);
history[0] = 1;
lastSum = statisticSum * initMaxBytes;
}
synchronized void save(int writedBytes) {
int index = history[0]++;
final int LENGTH = history.length - 1;
if (index == LENGTH) {
history[0] = 1;
}
int old = history[index];
history[index] = writedBytes;
lastSum += writedBytes - old;
avg = (int) Math.ceil(lastSum * 1.0 / LENGTH);
}
}
}