GEODE-1607: Fix ConcurrentModificationException during cache close

Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/186a09a7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/186a09a7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/186a09a7

Branch: refs/heads/feature/GEODE-1571
Commit: 186a09a74b202a4943ced37eddd258e7906d117f
Parents: ee05774
Author: eshu <e...@pivotal.io>
Authored: Thu Jun 30 11:11:28 2016 -0700
Committer: eshu <e...@pivotal.io>
Committed: Thu Jun 30 11:12:59 2016 -0700

----------------------------------------------------------------------
 .../gemstone/gemfire/internal/cache/TXManagerImpl.java   | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/186a09a7/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TXManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TXManagerImpl.java
 
b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TXManagerImpl.java
index 1512234..dc668eb 100644
--- 
a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TXManagerImpl.java
+++ 
b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/TXManagerImpl.java
@@ -583,8 +583,15 @@ public class TXManagerImpl implements 
CacheTransactionManager,
     if (isClosed()) {
       return;
     }
-    this.closed = true;
-    for (TXStateProxy proxy: this.hostedTXStates.values()) {
+    TXStateProxy[] proxies = null;
+    synchronized (this.hostedTXStates) {
+      //After this, newly added TXStateProxy would not operate on the TXState.
+      this.closed = true;
+      
+      proxies = this.hostedTXStates.values().toArray(new 
TXStateProxy[this.hostedTXStates.size()]);      
+    }
+    
+    for (TXStateProxy proxy: proxies) {
       proxy.getLock().lock();
       try {
         proxy.close();

Reply via email to