package codeine.command_peer;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
public class LinearProgressiveRateClaculator implements ProgressiveRateClaculator {
private static final Logger log = Logger.getLogger(CommandExecutionStrategy.class);
private double minutesLeft;
private int nodesLeft,numOfNodesToExecute;
private double ratio;
@Override
public void iterationStart(double minutesLeft, int nodesLeft) {
this.minutesLeft = minutesLeft;
this.nodesLeft = nodesLeft;
calc();
}
private void calc() {
minutesLeft = minutesLeft < 1 ? 1 : minutesLeft;
ratio = nodesLeft / minutesLeft;
numOfNodesToExecute = (int) Math.ceil(ratio);
if (numOfNodesToExecute > CommandExecutionStrategy.MAX_NODES_TO_EXECUTE) {
log.info("linear concurrency is above limit " + numOfNodesToExecute);
}
numOfNodesToExecute = Math.min(numOfNodesToExecute, CommandExecutionStrategy.MAX_NODES_TO_EXECUTE);
}
@Override
public int numOfNodesToExecute() {
return numOfNodesToExecute;
}
@Override
public long getTimeToSleep(long loopTime) {
return getTimeToSleep(ratio(), loopTime);
}
public double ratio() {
return ratio;
}
public long getTimeToSleep(double ratioCalculated, long loopTime) {
long sleepTime = 0;
if (ratioCalculated > 1) {
sleepTime = TimeUnit.MINUTES.toMillis(1) - loopTime;
} else {
sleepTime = TimeUnit.MINUTES.toMillis((long) Math.ceil(1 / ratioCalculated)) - loopTime;
}
return sleepTime;
}
}