Author: davsclaus Date: Fri Mar 1 09:48:39 2013 New Revision: 1451546 URL: http://svn.apache.org/r1451546 Log: CAMEL-6097: Fixed race condition in aggregate eip when doing recovery task.
Modified: camel/branches/camel-2.10.x/ (props changed) camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java Propchange: camel/branches/camel-2.10.x/ ------------------------------------------------------------------------------ Merged /camel/trunk:r1451544 Propchange: camel/branches/camel-2.10.x/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java URL: http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java?rev=1451546&r1=1451545&r2=1451546&view=diff ============================================================================== --- camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java (original) +++ camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java Fri Mar 1 09:48:39 2013 @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -756,6 +757,9 @@ public class AggregateProcessor extends LOG.trace("Starting recover check"); + // copy the current in progress before doing scan + final Set<String> copyOfInProgress = new LinkedHashSet<String>(inProgressCompleteExchanges); + Set<String> exchangeIds = recoverable.scan(camelContext); for (String exchangeId : exchangeIds) { @@ -765,7 +769,9 @@ public class AggregateProcessor extends return; } - boolean inProgress = inProgressCompleteExchanges.contains(exchangeId); + // consider in progress if it was in progress before we did the scan, or currently after we did the scan + // its safer to consider it in progress than risk duplicates due both in progress + recovered + boolean inProgress = copyOfInProgress.contains(exchangeId) || inProgressCompleteExchanges.contains(exchangeId); if (inProgress) { LOG.trace("Aggregated exchange with id: {} is already in progress.", exchangeId); } else {