Fix bierman02 ListenerAdapter memory leak 58/79758/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 20 Jan 2019 15:05:22 +0000 (16:05 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 20 Jan 2019 15:05:22 +0000 (16:05 +0100)
Storing notifications in a field causes them to be retained for
longer than needed. Pass them as arguments, fixing the leak and
making the adapter stateless.

Change-Id: I8cfb335db0ad21d37d5cce79e6fdbe31efc1ab8a
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/ListenerAdapter.java

index ed3dd560e38ce689f835ec2fa4d3b34f29f78f4c..b014859f927dca6f9ea66e2a449706153acfb892 100644 (file)
@@ -53,8 +53,6 @@ public class ListenerAdapter extends AbstractCommonSubscriber implements Cluster
     private final String streamName;
     private final NotificationOutputType outputType;
 
-    private Collection<DataTreeCandidate> candidates;
-
     /**
      * Creates new {@link ListenerAdapter} listener specified by path and stream
      * name and register for subscribing.
@@ -78,8 +76,7 @@ public class ListenerAdapter extends AbstractCommonSubscriber implements Cluster
 
     @Override
     public void onDataTreeChanged(@Nonnull final Collection<DataTreeCandidate> dataTreeCandidates) {
-        this.candidates = dataTreeCandidates;
-        final String xml = prepareXml();
+        final String xml = prepareXml(dataTreeCandidates);
         if (checkQueryParams(xml, this)) {
             prepareAndPostData(xml);
         }
@@ -133,7 +130,7 @@ public class ListenerAdapter extends AbstractCommonSubscriber implements Cluster
      *
      * @return Data in printable form.
      */
-    private String prepareXml() {
+    private String prepareXml(final Collection<DataTreeCandidate> candidates) {
         final SchemaContext schemaContext = controllerContext.getGlobalSchema();
         final DataSchemaContextTree dataContextTree = DataSchemaContextTree.from(schemaContext);
         final Document doc = createDocument();
@@ -142,8 +139,8 @@ public class ListenerAdapter extends AbstractCommonSubscriber implements Cluster
         final Element dataChangedNotificationEventElement = doc.createElementNS(
                 "urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote", "data-changed-notification");
 
-        addValuesToDataChangedNotificationEventElement(doc, dataChangedNotificationEventElement,
-                                                            this.candidates, schemaContext, dataContextTree);
+        addValuesToDataChangedNotificationEventElement(doc, dataChangedNotificationEventElement, candidates,
+            schemaContext, dataContextTree);
         notificationElement.appendChild(dataChangedNotificationEventElement);
         return transformDoc(doc);
     }