Fix up release old producers to avoid memory leak
[mdsal.git] / dom / mdsal-dom-broker / src / main / java / org / opendaylight / mdsal / dom / broker / ProducerLayout.java
index e383d5be6a0a4849c03d0149922cb65d2964beed..6b5a0a531bd116122bfba2f76df6e679f45673bb 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.mdsal.dom.broker;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.BiMap;
@@ -42,8 +44,8 @@ final class ProducerLayout {
             final BiMap<DOMDataTreeIdentifier, DOMDataTreeShardProducer> idToProducer,
             final Map<DOMDataTreeIdentifier, DOMDataTreeProducer> children) {
         this.shardMap = ImmutableMap.copyOf(shardMap);
-        this.idToProducer = Preconditions.checkNotNull(idToProducer);
-        this.children = Preconditions.checkNotNull(children);
+        this.idToProducer = requireNonNull(idToProducer);
+        this.children = requireNonNull(children);
     }
 
     static ProducerLayout create(final Map<DOMDataTreeIdentifier, DOMDataTreeShard> shardMap) {
@@ -87,6 +89,7 @@ final class ProducerLayout {
     }
 
     ProducerLayout reshard(final Map<DOMDataTreeIdentifier, DOMDataTreeShard> newShardMap) {
+        close();
         return new ProducerLayout(newShardMap, mapIdsToProducer(newShardMap), children);
     }
 
@@ -134,4 +137,9 @@ final class ProducerLayout {
                 "Cannot create transaction since the producer is not mapped to any shard");
         return Maps.transformValues(idToProducer, DOMDataTreeShardProducer::createTransaction);
     }
+
+    void close() {
+        idToProducer.values().forEach(DOMDataTreeShardProducer::close);
+    }
+
 }