in accord-core/src/main/java/accord/topology/TopologyManager.java [278:336]
private Epochs(EpochState[] epochs, List<Notifications> pending, List<FutureEpoch> futureEpochs, long prevFirstNonEmptyEpoch)
{
this.currentEpoch = epochs.length > 0 ? epochs[0].epoch() : 0;
if (prevFirstNonEmptyEpoch != -1)
this.firstNonEmptyEpoch = prevFirstNonEmptyEpoch;
else if (epochs.length > 0 && !epochs[0].global().isEmpty())
this.firstNonEmptyEpoch = currentEpoch;
else
this.firstNonEmptyEpoch = prevFirstNonEmptyEpoch;
this.pending = pending;
this.futureEpochs = futureEpochs;
if (!futureEpochs.isEmpty())
Invariants.require(futureEpochs.get(0).epoch == currentEpoch + 1);
for (int i = 1; i < futureEpochs.size(); i++)
Invariants.requireArgument(futureEpochs.get(i).epoch == futureEpochs.get(i - 1).epoch + 1);
for (int i = 1; i < epochs.length; i++)
Invariants.requireArgument(epochs[i].epoch() == epochs[i - 1].epoch() - 1);
int truncateFrom = -1;
// > 0 because we do not want to be left without epochs in case they're all empty
for (int i = epochs.length - 1; i > 0; i--)
{
EpochState epochState = epochs[i];
if (epochState.allRetired() &&
(truncateFrom == -1 || truncateFrom == i + 1))
{
Invariants.require(epochs[i].syncComplete());
truncateFrom = i;
}
}
if (truncateFrom == -1)
{
this.epochs = epochs;
}
else
{
this.epochs = Arrays.copyOf(epochs, truncateFrom);
if (logger.isDebugEnabled())
{
for (int i = truncateFrom; i < epochs.length; i++)
{
EpochState state = epochs[i];
Invariants.require(epochs[i].syncComplete());
logger.debug("Retired epoch {} with added/removed ranges {}/{}. Topology: {}. Closed: {}", state.epoch(), state.addedRanges, state.removedRanges, state.global.ranges, state.closed);
}
}
if (logger.isTraceEnabled())
{
for (int i = 0; i < truncateFrom; i++)
{
EpochState state = epochs[i];
Invariants.require(state.syncComplete());
logger.trace("Leaving epoch {} with added/removed ranges {}/{}", state.epoch(), state.addedRanges, state.removedRanges);
}
}
}
}