BUG-5280: introduce request/response Envelope
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / actors / client / ClientActorBehavior.java
index c3df604ef20ce2a77fd2ddb114d6ab6b471a369c..110a414939943da7821b408f05363316b25ebb82 100644 (file)
@@ -14,10 +14,11 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.opendaylight.controller.cluster.access.commands.TransactionRequest;
 import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
+import org.opendaylight.controller.cluster.access.concepts.FailureEnvelope;
 import org.opendaylight.controller.cluster.access.concepts.RequestException;
 import org.opendaylight.controller.cluster.access.concepts.RequestFailure;
-import org.opendaylight.controller.cluster.access.concepts.RequestSuccess;
 import org.opendaylight.controller.cluster.access.concepts.RetiredGenerationException;
+import org.opendaylight.controller.cluster.access.concepts.SuccessEnvelope;
 import org.opendaylight.yangtools.concepts.Identifiable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,21 +50,22 @@ public abstract class ClientActorBehavior extends RecoveredClientActorBehavior<C
         if (command instanceof InternalCommand) {
             return ((InternalCommand) command).execute(this);
         }
-        if (command instanceof RequestSuccess) {
-            return onRequestSuccess((RequestSuccess<?, ?>) command);
+        if (command instanceof SuccessEnvelope) {
+            return onRequestSuccess((SuccessEnvelope) command);
         }
-        if (command instanceof RequestFailure) {
-            return onRequestFailure((RequestFailure<?, ?>) command);
+        if (command instanceof FailureEnvelope) {
+            return onRequestFailure((FailureEnvelope) command);
         }
 
         return onCommand(command);
     }
 
-    private ClientActorBehavior onRequestSuccess(final RequestSuccess<?, ?> success) {
-        return context().completeRequest(this, success);
+    private ClientActorBehavior onRequestSuccess(final SuccessEnvelope command) {
+        return context().completeRequest(this, command);
     }
 
-    private ClientActorBehavior onRequestFailure(final RequestFailure<?, ?> failure) {
+    private ClientActorBehavior onRequestFailure(final FailureEnvelope command) {
+        final RequestFailure<?, ?> failure = command.getMessage();
         final RequestException cause = failure.getCause();
         if (cause instanceof RetiredGenerationException) {
             LOG.error("{}: current generation {} has been superseded", persistenceId(), getIdentifier(), cause);
@@ -73,22 +75,23 @@ public abstract class ClientActorBehavior extends RecoveredClientActorBehavior<C
         }
 
         if (failure.isHardFailure()) {
-            return context().completeRequest(this, failure);
+            return context().completeRequest(this, command);
         }
 
         // TODO: add instanceof checks on cause to detect more problems
 
-        LOG.warn("{}: Unhandled retriable failure {}, promoting to hard failure", persistenceId(), failure);
-        return context().completeRequest(this, failure);
+        LOG.warn("{}: Unhandled retriable failure {}, promoting to hard failure", persistenceId(), command);
+        return context().completeRequest(this, command);
     }
 
     // This method is executing in the actor context, hence we can safely interact with the queue
-    private ClientActorBehavior doSendRequest(final TransactionRequest<?> request, final RequestCallback callback) {
+    private ClientActorBehavior doSendRequest(final long sequence, final TransactionRequest<?> request,
+            final RequestCallback callback) {
         // Get or allocate queue for the request
         final SequencedQueue queue = context().queueFor(request.getTarget().getHistoryId().getCookie());
 
         // Note this is a tri-state return and can be null
-        final Optional<FiniteDuration> result = queue.enqueueRequest(request, callback);
+        final Optional<FiniteDuration> result = queue.enqueueRequest(sequence, request, callback);
         if (result == null) {
             // Happy path: we are done here
             return this;
@@ -188,7 +191,7 @@ public abstract class ClientActorBehavior extends RecoveredClientActorBehavior<C
      * @param request Request to send
      * @param callback Callback to invoke
      */
-    public final void sendRequest(final TransactionRequest<?> request, final RequestCallback callback) {
-        context().executeInActor(cb -> cb.doSendRequest(request, callback));
+    public final void sendRequest(final long sequence, final TransactionRequest<?> request, final RequestCallback callback) {
+        context().executeInActor(cb -> cb.doSendRequest(sequence, request, callback));
     }
 }