BUG-5280: separate request sequence and transmit sequence
[controller.git] / opendaylight / md-sal / cds-access-client / src / main / java / org / opendaylight / controller / cluster / access / client / SequencedQueueEntry.java
index 83e3e079137e7b61ec601640fa21257e6bedf60b..8814d50c54e8be64e7d784ba85d000d937a0729b 100644 (file)
@@ -10,12 +10,11 @@ package org.opendaylight.controller.cluster.access.client;
 import akka.actor.ActorRef;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
-import java.util.Optional;
+import javax.annotation.Nullable;
 import org.opendaylight.controller.cluster.access.concepts.Request;
 import org.opendaylight.controller.cluster.access.concepts.RequestEnvelope;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 import org.opendaylight.controller.cluster.access.concepts.Response;
-import org.opendaylight.controller.cluster.access.concepts.ResponseEnvelope;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -23,49 +22,31 @@ import org.slf4j.LoggerFactory;
  * Single entry in {@link SequencedQueue}. Tracks the request, the associated callback and accounting information.
  *
  * @author Robert Varga
- *
- * @param <I> Target identifier type
  */
 final class SequencedQueueEntry {
-    private static final class LastTry {
-        final long timeTicks;
-        final long retry;
-
-        LastTry(final long retry, final long timeTicks) {
-            this.retry = retry;
-            this.timeTicks = timeTicks;
-        }
-    }
-
     private static final Logger LOG = LoggerFactory.getLogger(SequencedQueueEntry.class);
 
     private final Request<?, ?> request;
     private final RequestCallback callback;
     private final long enqueuedTicks;
-    private final long sequence;
 
-    private Optional<LastTry> lastTry = Optional.empty();
+    private TxDetails txDetails;
 
-    SequencedQueueEntry(final Request<?, ?> request, final long sequence, final RequestCallback callback,
+    SequencedQueueEntry(final Request<?, ?> request, final RequestCallback callback,
         final long now) {
         this.request = Preconditions.checkNotNull(request);
         this.callback = Preconditions.checkNotNull(callback);
         this.enqueuedTicks = now;
-        this.sequence = sequence;
     }
 
-    long getSequence() {
-        return sequence;
+    Request<?, ?> getRequest() {
+        return request;
     }
 
-    boolean acceptsResponse(final ResponseEnvelope<?> response) {
-        return getSequence() == response.getSequence() && request.getTarget().equals(response.getMessage().getTarget());
+    @Nullable TxDetails getTxDetails() {
+        return txDetails;
     }
 
-    long getCurrentTry() {
-        return lastTry.isPresent() ? lastTry.get().retry : 0;
-     }
-
     ClientActorBehavior complete(final Response<?, ?> response) {
         LOG.debug("Completing request {} with {}", request, response);
         return callback.complete(response);
@@ -79,8 +60,8 @@ final class SequencedQueueEntry {
     boolean isTimedOut(final long now, final long timeoutNanos) {
         final long elapsed;
 
-        if (lastTry.isPresent()) {
-            elapsed = now - lastTry.get().timeTicks;
+        if (txDetails != null) {
+            elapsed = now - txDetails.getTimeTicks();
         } else {
             elapsed = now - enqueuedTicks;
         }
@@ -93,18 +74,19 @@ final class SequencedQueueEntry {
         }
     }
 
-    void retransmit(final BackendInfo backend, final long now) {
-        final long retry = lastTry.isPresent() ? lastTry.get().retry + 1 : 0;
-        final RequestEnvelope toSend = new RequestEnvelope(request.toVersion(backend.getVersion()), sequence, retry);
+    void retransmit(final BackendInfo backend, final long txSequence, final long now) {
+        final RequestEnvelope toSend = new RequestEnvelope(request.toVersion(backend.getVersion()),
+            backend.getSessionId(), txSequence);
 
         final ActorRef actor = backend.getActor();
-        LOG.trace("Retransmitting request {} as {} to {}", request, toSend, actor);
+        LOG.trace("Transmitting request {} as {} to {}", request, toSend, actor);
         actor.tell(toSend, ActorRef.noSender());
-        lastTry = Optional.of(new LastTry(retry, now));
+        txDetails = new TxDetails(backend.getSessionId(), txSequence, now);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(SequencedQueueEntry.class).add("request", request).toString();
     }
+
 }