Use a bounded blocking queue in InmemoryDOMDataTreeShards. 27/45827/1
authorTomas Cere <tcere@cisco.com>
Wed, 31 Aug 2016 12:48:50 +0000 (14:48 +0200)
committerRobert Varga <rovarga@cisco.com>
Mon, 19 Sep 2016 15:05:45 +0000 (17:05 +0200)
Change-Id: I72b02d9f77985ec80db87792424403b6960616a2
Signed-off-by: Tomas Cere <tcere@cisco.com>
(cherry picked from commit f2ed6a6adc28783703c40facfcf4b5171581fbef)

dom/mdsal-dom-inmemory-datastore/src/main/java/org/opendaylight/mdsal/dom/store/inmemory/InMemoryDOMDataTreeShard.java

index 575c95d62a6751285900c32adbb9766b385f097b..031d9b297cc739a465e1d6f2e8e3b11eb6e70157 100644 (file)
@@ -20,7 +20,6 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import javax.annotation.Nonnull;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
@@ -28,6 +27,8 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeShard;
 import org.opendaylight.mdsal.dom.spi.DOMDataTreePrefixTable;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.util.concurrent.CountingRejectedExecutionHandler;
+import org.opendaylight.yangtools.util.concurrent.FastThreadPoolExecutor;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.CursorAwareDataTreeSnapshot;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
@@ -39,6 +40,8 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
 @Beta
 public class InMemoryDOMDataTreeShard implements ReadableWriteableDOMDataTreeShard, SchemaContextListener {
 
+    private static final int DEFAULT_SUBMIT_QUEUE_SIZE = 1000;
+
     private static final class SubshardProducerSpecification {
         private final Collection<DOMDataTreeIdentifier> prefixes = new ArrayList<>(1);
         private final ChildShardContext shard;
@@ -68,7 +71,7 @@ public class InMemoryDOMDataTreeShard implements ReadableWriteableDOMDataTreeSha
     private final ListeningExecutorService executor;
 
     private InMemoryDOMDataTreeShard(final DOMDataTreeIdentifier prefix, final ExecutorService dataTreeChangeExecutor,
-                                     final int maxDataChangeListenerQueueSize) {
+                                     final int maxDataChangeListenerQueueSize, final int submitQueueSize) {
         this.prefix = Preconditions.checkNotNull(prefix);
 
         final TreeType treeType = treeTypeFor(prefix.getDatastoreType());
@@ -76,12 +79,25 @@ public class InMemoryDOMDataTreeShard implements ReadableWriteableDOMDataTreeSha
 
         this.shardChangePublisher = new InMemoryDOMDataTreeShardChangePublisher(dataTreeChangeExecutor,
                 maxDataChangeListenerQueueSize, dataTree, prefix.getRootIdentifier(), childShards);
-        this.executor = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
+
+        final FastThreadPoolExecutor fte = new FastThreadPoolExecutor(1, submitQueueSize, "Shard[" + prefix + "]");
+        fte.setRejectedExecutionHandler(CountingRejectedExecutionHandler.newCallerWaitsPolicy());
+        this.executor = MoreExecutors.listeningDecorator(fte);
+    }
+
+    public static InMemoryDOMDataTreeShard create(final DOMDataTreeIdentifier id,
+                                                  final ExecutorService dataTreeChangeExecutor,
+                                                  final int maxDataChangeListenerQueueSize) {
+        return new InMemoryDOMDataTreeShard(id, dataTreeChangeExecutor,
+                maxDataChangeListenerQueueSize, DEFAULT_SUBMIT_QUEUE_SIZE);
     }
 
     public static InMemoryDOMDataTreeShard create(final DOMDataTreeIdentifier id,
-            final ExecutorService dataTreeChangeExecutor, final int maxDataChangeListenerQueueSize) {
-        return new InMemoryDOMDataTreeShard(id, dataTreeChangeExecutor, maxDataChangeListenerQueueSize);
+                                                  final ExecutorService dataTreeChangeExecutor,
+                                                  final int maxDataChangeListenerQueueSize,
+                                                  final int submitQueueSize) {
+        return new InMemoryDOMDataTreeShard(id, dataTreeChangeExecutor,
+                maxDataChangeListenerQueueSize, submitQueueSize);
     }
 
     @Override