Make sure we optimize DOMDataTreeIdentifier 69/46369/2
authorRobert Varga <rovarga@cisco.com>
Tue, 20 Sep 2016 00:59:00 +0000 (02:59 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 3 Oct 2016 13:49:39 +0000 (13:49 +0000)
DOMDataTreeIdentifier inside a shard is heavily reused. Do not trust
the user to give us an optimized YangInstanceIdentifier but try
optimizing it.

Change-Id: I8a73b21562393a5f9100359d5ffaf3e2af057b6e
Signed-off-by: Robert Varga <rovarga@cisco.com>
(cherry picked from commit 7488878f65eef4396e5985f2228fbbad2f05d536)

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

index c61722c5b43f5d3376abc914305b75ca11ab242e..2d4b4f94983a42c7a8b82ebba0ba69090e601e1b 100644 (file)
@@ -24,8 +24,10 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum
  * A unique identifier for a particular subtree. It is composed of the logical
  * data store type and the instance identifier of the root node.
  */
-public final class DOMDataTreeIdentifier implements Immutable, Path<DOMDataTreeIdentifier>, Serializable, Comparable<DOMDataTreeIdentifier> {
+public final class DOMDataTreeIdentifier implements Immutable, Path<DOMDataTreeIdentifier>, Serializable,
+        Comparable<DOMDataTreeIdentifier> {
     private static final long serialVersionUID = 1L;
+
     private final YangInstanceIdentifier rootIdentifier;
     private final LogicalDatastoreType datastoreType;
 
@@ -57,6 +59,11 @@ public final class DOMDataTreeIdentifier implements Immutable, Path<DOMDataTreeI
         return datastoreType == other.datastoreType && rootIdentifier.contains(other.rootIdentifier);
     }
 
+    public DOMDataTreeIdentifier toOptimized() {
+        final YangInstanceIdentifier opt = rootIdentifier.toOptimized();
+        return opt == rootIdentifier ? this : new DOMDataTreeIdentifier(datastoreType, opt);
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
index afdc2ee28051db955f98a15b2080510e7ba2b3e2..97b2354f9ad1965b42c3ab7d5f67033f361682ac 100644 (file)
@@ -91,7 +91,7 @@ public class InMemoryDOMDataTreeShard implements ReadableWriteableDOMDataTreeSha
     public static InMemoryDOMDataTreeShard create(final DOMDataTreeIdentifier id,
                                                   final Executor dataTreeChangeExecutor,
                                                   final int maxDataChangeListenerQueueSize) {
-        return new InMemoryDOMDataTreeShard(id, dataTreeChangeExecutor,
+        return new InMemoryDOMDataTreeShard(id.toOptimized(), dataTreeChangeExecutor,
                 maxDataChangeListenerQueueSize, DEFAULT_SUBMIT_QUEUE_SIZE);
     }
 
@@ -99,7 +99,7 @@ public class InMemoryDOMDataTreeShard implements ReadableWriteableDOMDataTreeSha
                                                   final Executor dataTreeChangeExecutor,
                                                   final int maxDataChangeListenerQueueSize,
                                                   final int submitQueueSize) {
-        return new InMemoryDOMDataTreeShard(id, dataTreeChangeExecutor,
+        return new InMemoryDOMDataTreeShard(id.toOptimized(), dataTreeChangeExecutor,
                 maxDataChangeListenerQueueSize, submitQueueSize);
     }
 
index 317dc920beef43ff2a630d47049c1a6a2c4bb994..a98205df020b56a5d1d7af78357866b7f71ac223 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.mdsal.dom.store.inmemory;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 
 abstract class ModificationContextNodeBuilder<T extends WriteableModificationNode> {
@@ -32,10 +31,9 @@ abstract class ModificationContextNodeBuilder<T extends WriteableModificationNod
     }
 
     final T build() {
-        HashMap<PathArgument, WriteableModificationNode> builtChildren =
-                new HashMap<PathArgument, WriteableModificationNode>(boundaryChildren);
-        for (Entry<PathArgument, InteriorNodeBuilder> interiorNode : interiorChildren.entrySet()) {
-            WriteableModificationNode builded = interiorNode.getValue().build();
+        final Map<PathArgument, WriteableModificationNode> builtChildren = new HashMap<>(boundaryChildren);
+        for (InteriorNodeBuilder interiorNode : interiorChildren.values()) {
+            WriteableModificationNode builded = interiorNode.build();
             builtChildren.put(builded.getIdentifier(), builded);
         }