Make sure we optimize DOMDataTreeIdentifier 56/45856/7
authorRobert Varga <rovarga@cisco.com>
Tue, 20 Sep 2016 00:59:00 +0000 (02:59 +0200)
committerRobert Varga <rovarga@cisco.com>
Wed, 21 Sep 2016 11:50:41 +0000 (13:50 +0200)
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>
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 d21eece43e91cccdefa5757fd984b4cf0fa3ab85..eb16ca3d064ced2645bd4a2b9cc8bd235e4be995 100644 (file)
@@ -22,9 +22,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 +58,11 @@ public final class DOMDataTreeIdentifier implements Immutable,
         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);
         }