Repository: geode Updated Branches: refs/heads/develop b47673239 -> fda7e1344
GEODE-2870: Local node function execution failure correctly returns exception * Race condition and escaping synchronized block led to function possibly missing results * It was possible a remote node would enter the synchronized block after local node threw exception * Certain side effects would allow processing of remote node results to be considered last result * Local processing thread would be paused/non active and miss opportunity to write exception * This would manifest as incomplete results instead of a retry Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/fda7e134 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/fda7e134 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/fda7e134 Branch: refs/heads/develop Commit: fda7e134467ef8f06f09d05ebf20b6dfa2d3cc25 Parents: b476732 Author: Jason Huynh <[email protected]> Authored: Tue May 2 16:30:46 2017 -0700 Committer: Jason Huynh <[email protected]> Committed: Thu May 4 13:53:22 2017 -0700 ---------------------------------------------------------------------- .../execute/PartitionedRegionFunctionResultSender.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/fda7e134/geode-core/src/main/java/org/apache/geode/internal/cache/execute/PartitionedRegionFunctionResultSender.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/execute/PartitionedRegionFunctionResultSender.java b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/PartitionedRegionFunctionResultSender.java index 3b27cb4..9aa8262 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/execute/PartitionedRegionFunctionResultSender.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/execute/PartitionedRegionFunctionResultSender.java @@ -214,16 +214,15 @@ public final class PartitionedRegionFunctionResultSender implements InternalResu private synchronized void lastResult(Object oneResult, ResultCollector collector, boolean lastRemoteResult, boolean lastLocalResult, DistributedMember memberID) { + + boolean completedLocal = lastLocalResult || this.localLastResultRecieved; if (lastRemoteResult) { this.completelyDoneFromRemote = true; } - if (lastLocalResult) { - this.localLastResultRecieved = true; - } if (this.serverSender != null) { // Client-Server - if (this.completelyDoneFromRemote && this.localLastResultRecieved) { + if (this.completelyDoneFromRemote && completedLocal) { if (lastLocalResult) { checkForBucketMovement(oneResult); if (bme != null) { @@ -252,7 +251,7 @@ public final class PartitionedRegionFunctionResultSender implements InternalResu } } else { // P2P - if (this.completelyDoneFromRemote && this.localLastResultRecieved) { + if (this.completelyDoneFromRemote && completedLocal) { if (lastLocalResult) { checkForBucketMovement(oneResult); if (bme != null) { @@ -279,6 +278,9 @@ public final class PartitionedRegionFunctionResultSender implements InternalResu } } } + if (lastLocalResult) { + this.localLastResultRecieved = true; + } } public synchronized void lastResult(Object oneResult, boolean completelyDoneFromRemote,
