package net.i2p.router;
import java.util.concurrent.atomic.AtomicLong;
import net.i2p.data.DataHelper;
/**
* Glorified struct to contain basic job stats.
* Public for router console only.
* For use by the router only. Not to be used by applications or plugins.
*/
public class JobStats {
private final String _job;
private final AtomicLong _numRuns = new AtomicLong();
private final AtomicLong _numDropped = new AtomicLong();
private final AtomicLong _totalTime = new AtomicLong();
private volatile long _maxTime;
private volatile long _minTime;
private final AtomicLong _totalPendingTime = new AtomicLong();
private volatile long _maxPendingTime;
private volatile long _minPendingTime;
public JobStats(String name) {
_job = name;
_maxTime = -1;
_minTime = -1;
_maxPendingTime = -1;
_minPendingTime = -1;
}
public void jobRan(long runTime, long lag) {
_numRuns.incrementAndGet();
_totalTime.addAndGet(runTime);
if ( (_maxTime < 0) || (runTime > _maxTime) )
_maxTime = runTime;
if ( (_minTime < 0) || (runTime < _minTime) )
_minTime = runTime;
_totalPendingTime.addAndGet(lag);
if ( (_maxPendingTime < 0) || (lag > _maxPendingTime) )
_maxPendingTime = lag;
if ( (_minPendingTime < 0) || (lag < _minPendingTime) )
_minPendingTime = lag;
}
/** @since 0.9.19 */
public void jobDropped() {
_numDropped.incrementAndGet();
}
/** @since 0.9.19 */
public long getDropped() { return _numDropped.get(); }
public String getName() { return _job; }
public long getRuns() { return _numRuns.get(); }
public long getTotalTime() { return _totalTime.get(); }
public long getMaxTime() { return _maxTime; }
public long getMinTime() { return _minTime; }
public double getAvgTime() {
long numRuns = _numRuns.get();
if (numRuns > 0)
return _totalTime.get() / (double) numRuns;
else
return 0;
}
public long getTotalPendingTime() { return _totalPendingTime.get(); }
public long getMaxPendingTime() { return _maxPendingTime; }
public long getMinPendingTime() { return _minPendingTime; }
public double getAvgPendingTime() {
long numRuns = _numRuns.get();
if (numRuns > 0)
return _totalPendingTime.get() / (double) numRuns;
else
return 0;
}
/****
@Override
public int hashCode() { return _job.hashCode(); }
@Override
public boolean equals(Object obj) {
if ( (obj != null) && (obj instanceof JobStats) ) {
JobStats stats = (JobStats)obj;
return DataHelper.eq(getName(), stats.getName()) &&
getRuns() == stats.getRuns() &&
getTotalTime() == stats.getTotalTime() &&
getMaxTime() == stats.getMaxTime() &&
getMinTime() == stats.getMinTime();
} else {
return false;
}
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
buf.append("Over ").append(getRuns()).append(" runs, job <b>").append(getName()).append("</b> took ");
buf.append(getTotalTime()).append("ms (").append(getAvgTime()).append("ms/").append(getMaxTime()).append("ms/");
buf.append(getMinTime()).append("ms avg/max/min) after a total lag of ");
buf.append(getTotalPendingTime()).append("ms (").append(getAvgPendingTime()).append("ms/");
buf.append(getMaxPendingTime()).append("ms/").append(getMinPendingTime()).append("ms avg/max/min)");
return buf.toString();
}
****/
}