You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2018/06/13 20:00:25 UTC

nifi git commit: NIFI-5308: Avoid holding Template DOM Nodes in heap. This closes #2790

Repository: nifi
Updated Branches:
  refs/heads/master da99f873a -> 275b8cbf2


NIFI-5308: Avoid holding Template DOM Nodes in heap. This closes #2790


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/275b8cbf
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/275b8cbf
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/275b8cbf

Branch: refs/heads/master
Commit: 275b8cbf231f2c41aa2d79d69d8abf6dbaabd278
Parents: da99f87
Author: Mark Payne <ma...@hotmail.com>
Authored: Wed Jun 13 15:37:02 2018 -0400
Committer: Matt Gilman <ma...@gmail.com>
Committed: Wed Jun 13 16:00:01 2018 -0400

----------------------------------------------------------------------
 .../serialization/StandardFlowSerializer.java   | 32 ++++++--------------
 1 file changed, 9 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/275b8cbf/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java
index e2676a7..c3d0c1f 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/serialization/StandardFlowSerializer.java
@@ -22,7 +22,6 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Map;
 import java.util.Optional;
-import java.util.WeakHashMap;
 import java.util.concurrent.TimeUnit;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -82,12 +81,6 @@ public class StandardFlowSerializer implements FlowSerializer<Document> {
 
     private final StringEncryptor encryptor;
 
-    // Cache of template to DOM Node for that template. This is done because when we serialize templates, we have to first
-    // take the template DTO, then serialize that into a byte[], then parse that byte[] as XML DOM objects. Then we can use that
-    // XML DOM Object in the serialized flow. This is expensive, so we cache these XML DOM objects here. We use a WeakHashMap
-    // because we don't get notified when the template has been removed from the system.
-    private static final Map<Template, Node> templateNodes = new WeakHashMap<>();
-
     public StandardFlowSerializer(final StringEncryptor encryptor) {
         this.encryptor = encryptor;
     }
@@ -625,25 +618,18 @@ public class StandardFlowSerializer implements FlowSerializer<Document> {
         element.appendChild(toAdd);
     }
 
-
-    public static synchronized void addTemplate(final Element element, final Template template) {
+    public static void addTemplate(final Element element, final Template template) {
         try {
-            Node templateNode = templateNodes.get(template);
-            if (templateNode == null) {
-                final byte[] serialized = TemplateSerializer.serialize(template.getDetails());
-
-                final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
-                final DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
-                final Document document;
-                try (final InputStream in = new ByteArrayInputStream(serialized)) {
-                    document = docBuilder.parse(in);
-                }
-
-                templateNode = document.getDocumentElement();
-                templateNodes.put(template, templateNode);
+            final byte[] serialized = TemplateSerializer.serialize(template.getDetails());
+
+            final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
+            final DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+            final Document document;
+            try (final InputStream in = new ByteArrayInputStream(serialized)) {
+                document = docBuilder.parse(in);
             }
 
-            templateNode = element.getOwnerDocument().importNode(templateNode, true);
+            final Node templateNode = element.getOwnerDocument().importNode(document.getDocumentElement(), true);
             element.appendChild(templateNode);
         } catch (final Exception e) {
             throw new FlowSerializationException(e);