final void process(long newTime, double newValue) throws IOException {
Header header = parentDb.getHeader();
long step = header.getStep();
long oldTime = header.getLastUpdateTime();
long startTime = Util.normalize(oldTime, step);
long endTime = startTime + step;
double oldValue = lastValue.get();
double updateValue = calculateUpdateValue(oldTime, oldValue, newTime, newValue);
if (newTime < endTime) {
accumulate(oldTime, newTime, updateValue);
}
else {
long boundaryTime = Util.normalize(newTime, step);
accumulate(oldTime, boundaryTime, updateValue);
double value = calculateTotal(startTime, boundaryTime);
double lastCalculateValue = calculateLastTotal(startTime, boundaryTime);
long numSteps = (boundaryTime - endTime) / step + 1L;
parentDb.archive(this, value, lastCalculateValue, numSteps);
nanSeconds.set(0);
accumValue.set(0.0);
accumLastValue = Double.NaN;
accumulate(boundaryTime, newTime, updateValue);
}
}