From: Tomas Cere Date: Wed, 31 Aug 2016 12:48:50 +0000 (+0200) Subject: Use a bounded blocking queue in InmemoryDOMDataTreeShards. X-Git-Tag: release/boron-sr1~32 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=mdsal.git;a=commitdiff_plain;h=093b38a5c2a4f6ed8b015916e4765be29e3d51e2 Use a bounded blocking queue in InmemoryDOMDataTreeShards. Change-Id: I72b02d9f77985ec80db87792424403b6960616a2 Signed-off-by: Tomas Cere (cherry picked from commit f2ed6a6adc28783703c40facfcf4b5171581fbef) --- diff --git a/dom/mdsal-dom-inmemory-datastore/src/main/java/org/opendaylight/mdsal/dom/store/inmemory/InMemoryDOMDataTreeShard.java b/dom/mdsal-dom-inmemory-datastore/src/main/java/org/opendaylight/mdsal/dom/store/inmemory/InMemoryDOMDataTreeShard.java index 575c95d62a..031d9b297c 100644 --- a/dom/mdsal-dom-inmemory-datastore/src/main/java/org/opendaylight/mdsal/dom/store/inmemory/InMemoryDOMDataTreeShard.java +++ b/dom/mdsal-dom-inmemory-datastore/src/main/java/org/opendaylight/mdsal/dom/store/inmemory/InMemoryDOMDataTreeShard.java @@ -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 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