Bug 7449: Slice ReadTransactionSuccess response
[controller.git] / opendaylight / md-sal / cds-access-client / src / main / java / org / opendaylight / controller / cluster / access / client / ClientActorBehavior.java
index ccfbba6cd3d94f92ef9757999352893e1b0f7270..33e0c56d9ea2d6496d2d01651d9d30fa53fe4013 100644 (file)
@@ -32,6 +32,9 @@ import org.opendaylight.controller.cluster.access.concepts.RetiredGenerationExce
 import org.opendaylight.controller.cluster.access.concepts.RuntimeRequestException;
 import org.opendaylight.controller.cluster.access.concepts.SuccessEnvelope;
 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
+import org.opendaylight.controller.cluster.common.actor.Dispatchers.DispatcherType;
+import org.opendaylight.controller.cluster.io.FileBackedOutputStreamFactory;
+import org.opendaylight.controller.cluster.messaging.MessageAssembler;
 import org.opendaylight.yangtools.concepts.Identifiable;
 import org.opendaylight.yangtools.concepts.WritableIdentifier;
 import org.slf4j.Logger;
@@ -79,11 +82,18 @@ public abstract class ClientActorBehavior<T extends BackendInfo> extends
     private final Map<Long, AbstractClientConnection<T>> connections = new ConcurrentHashMap<>();
     private final InversibleLock connectionsLock = new InversibleLock();
     private final BackendInfoResolver<T> resolver;
+    private final MessageAssembler responseMessageAssembler;
 
     protected ClientActorBehavior(@Nonnull final ClientActorContext context,
             @Nonnull final BackendInfoResolver<T> resolver) {
         super(context);
         this.resolver = Preconditions.checkNotNull(resolver);
+
+        final ClientActorConfig config = context.config();
+        responseMessageAssembler = MessageAssembler.builder().logContext(persistenceId())
+                .fileBackedStreamFactory(new FileBackedOutputStreamFactory(config.getFileBackedStreamingThreshold(),
+                        config.getTempFileDirectory()))
+                .assembledMessageCallback((message, sender) -> context.self().tell(message, sender)).build();
     }
 
     @Override
@@ -92,6 +102,11 @@ public abstract class ClientActorBehavior<T extends BackendInfo> extends
         return context().getIdentifier();
     }
 
+    @Override
+    public void close() {
+        responseMessageAssembler.close();
+    }
+
     /**
      * Get a connection to a shard.
      *
@@ -121,13 +136,21 @@ public abstract class ClientActorBehavior<T extends BackendInfo> extends
         if (command instanceof InternalCommand) {
             return ((InternalCommand<T>) command).execute(this);
         }
+
         if (command instanceof SuccessEnvelope) {
             return onRequestSuccess((SuccessEnvelope) command);
         }
+
         if (command instanceof FailureEnvelope) {
             return internalOnRequestFailure((FailureEnvelope) command);
         }
 
+        if (MessageAssembler.isHandledMessage(command)) {
+            context().dispatchers().getDispatcher(DispatcherType.Serialization).execute(
+                () -> responseMessageAssembler.handleMessage(command, context().self()));
+            return this;
+        }
+
         return onCommand(command);
     }