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);
