import com.google.common.base.Preconditions;
import com.google.common.base.Verify;
import java.util.ArrayDeque;
-import java.util.Iterator;
+import java.util.Optional;
import java.util.Queue;
import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe;
return history().persistenceId();
}
- final java.util.Optional<TransactionSuccess<?>> replaySequence(final long sequence) throws RequestException {
+ final Optional<TransactionSuccess<?>> replaySequence(final long sequence) throws RequestException {
// Fast path check: if the requested sequence is the next request, bail early
if (expectedSequence == sequence) {
- return java.util.Optional.empty();
+ return Optional.empty();
}
// Check sequencing: we do not need to bother with future requests
// machinery is asynchronous, hence a reply may be in the works and not available.
long replaySequence = firstReplaySequence;
- final Iterator<?> it = replayQueue.iterator();
- while (it.hasNext()) {
- final Object replay = it.next();
+ for (Object replay : replayQueue) {
if (replaySequence == sequence) {
if (replay instanceof RequestException) {
throw (RequestException) replay;
}
Verify.verify(replay instanceof TransactionSuccess);
- return java.util.Optional.of((TransactionSuccess<?>) replay);
+ return Optional.of((TransactionSuccess<?>) replay);
}
replaySequence++;
}
// Not found
- return java.util.Optional.empty();
+ return Optional.empty();
}
final void purgeSequencesUpTo(final long sequence) {
abstract TransactionSuccess<?> doHandleRequest(TransactionRequest<?> request, RequestEnvelope envelope,
long now) throws RequestException;
+ abstract void retire();
+
private void recordResponse(final long sequence, final Object response) {
if (replayQueue.isEmpty()) {
firstReplaySequence = sequence;