Repository: nifi
Updated Branches:
  refs/heads/develop 1eeed7301 -> a4f0afce7


NIFI-843: Ensure that a new HashMap is used when populating the propertyMap 
member variable for thread safety


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

Branch: refs/heads/develop
Commit: e9c2535df73ab72d7a20f9dc2f27ae2bd6ad02e5
Parents: 5962404
Author: Mark Payne <[email protected]>
Authored: Wed Aug 12 10:09:02 2015 -0400
Committer: Mark Payne <[email protected]>
Committed: Fri Aug 14 10:07:20 2015 -0400

----------------------------------------------------------------------
 .../processors/standard/RouteOnAttribute.java    | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/e9c2535d/nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/RouteOnAttribute.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/RouteOnAttribute.java
 
b/nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/RouteOnAttribute.java
index 0d113ce..7055a8a 100644
--- 
a/nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/RouteOnAttribute.java
+++ 
b/nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/RouteOnAttribute.java
@@ -34,7 +34,6 @@ import org.apache.nifi.annotation.behavior.SupportsBatching;
 import org.apache.nifi.annotation.documentation.CapabilityDescription;
 import org.apache.nifi.annotation.documentation.Tags;
 import org.apache.nifi.annotation.lifecycle.OnScheduled;
-import org.apache.nifi.annotation.lifecycle.OnStopped;
 import org.apache.nifi.components.AllowableValue;
 import org.apache.nifi.components.PropertyDescriptor;
 import org.apache.nifi.components.PropertyValue;
@@ -106,8 +105,7 @@ public class RouteOnAttribute extends AbstractProcessor {
     private volatile Set<String> dynamicPropertyNames = new HashSet<>();
 
     /**
-     * Cache of dynamic properties set during {@link 
#onScheduled(ProcessContext)} and
-     * cleared during {@link #onStopped(ProcessContext)} for quick access in
+     * Cache of dynamic properties set during {@link 
#onScheduled(ProcessContext)} for quick access in
      * {@link #onTrigger(ProcessContext, ProcessSession)}
      */
     private volatile Map<Relationship, PropertyValue> propertyMap = new 
HashMap<>();
@@ -182,21 +180,19 @@ public class RouteOnAttribute extends AbstractProcessor {
      */
     @OnScheduled
     public void onScheduled(final ProcessContext context) {
+        final Map<Relationship, PropertyValue> newPropertyMap = new 
HashMap<>();
         for (final PropertyDescriptor descriptor : 
context.getProperties().keySet()) {
             if (!descriptor.isDynamic()) {
                 continue;
             }
             getLogger().debug("Adding new dynamic property: {}", new 
Object[]{descriptor});
-            propertyMap.put(new 
Relationship.Builder().name(descriptor.getName()).build(), 
context.getProperty(descriptor));
+            newPropertyMap.put(new 
Relationship.Builder().name(descriptor.getName()).build(), 
context.getProperty(descriptor));
         }
-    }
 
-    @OnStopped
-    public void onStopped() {
-        getLogger().debug("Clearing propertyMap");
-        propertyMap.clear();
+        this.propertyMap = newPropertyMap;
     }
 
+
     @Override
     public void onTrigger(final ProcessContext context, final ProcessSession 
session) {
         FlowFile flowFile = session.get();
@@ -206,8 +202,9 @@ public class RouteOnAttribute extends AbstractProcessor {
 
         final ProcessorLog logger = getLogger();
 
+        final Map<Relationship, PropertyValue> propMap = this.propertyMap;
         final Set<Relationship> matchingRelationships = new HashSet<>();
-        for (final Map.Entry<Relationship, PropertyValue> entry : 
propertyMap.entrySet()) {
+        for (final Map.Entry<Relationship, PropertyValue> entry : 
propMap.entrySet()) {
             final PropertyValue value = entry.getValue();
 
             final boolean matches = 
value.evaluateAttributeExpressions(flowFile).asBoolean();
@@ -219,7 +216,7 @@ public class RouteOnAttribute extends AbstractProcessor {
         final Set<Relationship> destinationRelationships = new HashSet<>();
         switch (context.getProperty(ROUTE_STRATEGY).getValue()) {
             case routeAllMatchValue:
-                if (matchingRelationships.size() == propertyMap.size()) {
+                if (matchingRelationships.size() == propMap.size()) {
                     destinationRelationships.add(REL_MATCH);
                 } else {
                     destinationRelationships.add(REL_NO_MATCH);

Reply via email to