You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by es...@apache.org on 2019/04/11 23:32:16 UTC

[geode] branch feature/GEODE-6638 updated: GEODE-6638: do not fail with IllegalMonitorStateException during cache close

This is an automated email from the ASF dual-hosted git repository.

eshu11 pushed a commit to branch feature/GEODE-6638
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/feature/GEODE-6638 by this push:
     new 5a6b9cb  GEODE-6638: do not fail with IllegalMonitorStateException during cache close
5a6b9cb is described below

commit 5a6b9cb64e903dec1310f9d7fc5ca99b4dcdb082
Author: eshu <es...@pivotal.io>
AuthorDate: Thu Apr 11 16:30:51 2019 -0700

    GEODE-6638: do not fail with IllegalMonitorStateException during cache close
---
 .../org/apache/geode/internal/cache/TXState.java   | 12 ++--
 .../apache/geode/internal/cache/TXStateTest.java   | 74 ++++++++++++++++++++++
 2 files changed, 79 insertions(+), 7 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java b/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
index f8671a2..1611da4 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
@@ -876,7 +876,7 @@ public class TXState implements TXStateInterface {
   }
 
   void doCleanup() {
-    IllegalArgumentException iae = null;
+    RuntimeException exception = null;
     try {
       this.closed = true;
       this.seenEvents.clear();
@@ -886,8 +886,8 @@ public class TXState implements TXStateInterface {
         final long conflictStart = CachePerfStats.getStatTime();
         try {
           this.locks.cleanup(getCache().getInternalDistributedSystem());
-        } catch (IllegalArgumentException e) {
-          iae = e;
+        } catch (IllegalArgumentException | IllegalMonitorStateException e) {
+          exception = e;
         }
         if (CachePerfStats.enableClockStats)
           this.proxy.getTxMgr().getCachePerfStats()
@@ -918,8 +918,6 @@ public class TXState implements TXStateInterface {
                     "Exception while unlocking bucket region {} this is probably because the bucket was destroyed and never locked initially.",
                     r.getFullPath(), rde);
               }
-            } finally {
-
             }
           }
         }
@@ -930,8 +928,8 @@ public class TXState implements TXStateInterface {
         this.completionGuard.notifyAll();
       }
 
-      if (iae != null && !this.proxy.getCache().isClosed()) {
-        throw iae;
+      if (exception != null && !this.proxy.getCache().isClosed()) {
+        throw exception;
       }
     }
   }
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/TXStateTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/TXStateTest.java
index fad1973..e49f423 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/TXStateTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/TXStateTest.java
@@ -40,12 +40,15 @@ import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.SynchronizationCommitConflictException;
 import org.apache.geode.cache.TransactionDataNodeHasDepartedException;
 import org.apache.geode.cache.TransactionException;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
 
 public class TXStateTest {
   private TXStateProxyImpl txStateProxy;
   private CommitConflictException exception;
   private TransactionDataNodeHasDepartedException transactionDataNodeHasDepartedException;
   private SingleThreadJTAExecutor executor;
+  private InternalCache cache;
+  private InternalDistributedSystem internalDistributedSystem;
 
   @Before
   public void setup() {
@@ -53,8 +56,11 @@ public class TXStateTest {
     exception = new CommitConflictException("");
     transactionDataNodeHasDepartedException = new TransactionDataNodeHasDepartedException("");
     executor = mock(SingleThreadJTAExecutor.class);
+    cache = mock(InternalCache.class);
+    internalDistributedSystem = mock(InternalDistributedSystem.class);
 
     when(txStateProxy.getTxMgr()).thenReturn(mock(TXManagerImpl.class));
+    when(cache.getInternalDistributedSystem()).thenReturn(internalDistributedSystem);
   }
 
   @Test
@@ -223,4 +229,72 @@ public class TXStateTest {
     verify(txRegionState, never()).cleanupNonDirtyEntries(internalRegion);
   }
 
+  @Test
+  public void doCleanupContinuesWhenReleasingLockGotIllegalArgumentExceptionIfCacheIsClosing() {
+    TXState txState = spy(new TXState(txStateProxy, false));
+    txState.locks = mock(TXLockRequest.class);
+    doReturn(cache).when(txStateProxy).getCache();
+    doThrow(new IllegalArgumentException()).when(txState.locks).cleanup(internalDistributedSystem);
+    when(cache.isClosed()).thenReturn(true);
+    TXRegionState regionState1 = mock(TXRegionState.class);
+    InternalRegion region1 = mock(InternalRegion.class);
+    txState.regions.put(region1, regionState1);
+
+    txState.doCleanup();
+
+    verify(regionState1).cleanup(region1);
+  }
+
+  @Test
+  public void doCleanupContinuesWhenReleasingLockGotIllegalMonitorStateExceptionIfCacheIsClosing() {
+    TXState txState = spy(new TXState(txStateProxy, false));
+    txState.locks = mock(TXLockRequest.class);
+    doReturn(cache).when(txStateProxy).getCache();
+    doThrow(new IllegalMonitorStateException()).when(txState.locks)
+        .cleanup(internalDistributedSystem);
+    when(cache.isClosed()).thenReturn(true);
+    TXRegionState regionState1 = mock(TXRegionState.class);
+    InternalRegion region1 = mock(InternalRegion.class);
+    txState.regions.put(region1, regionState1);
+
+    txState.doCleanup();
+
+    verify(regionState1).cleanup(region1);
+  }
+
+  @Test
+  public void doCleanupThrowsWhenReleasingLockGotIllegalArgumentExceptionIfCacheIsNotClosing() {
+    TXState txState = spy(new TXState(txStateProxy, false));
+    txState.locks = mock(TXLockRequest.class);
+    doReturn(cache).when(txStateProxy).getCache();
+    doThrow(new IllegalArgumentException()).when(txState.locks).cleanup(internalDistributedSystem);
+    when(cache.isClosed()).thenReturn(false);
+    TXRegionState regionState1 = mock(TXRegionState.class);
+    InternalRegion region1 = mock(InternalRegion.class);
+    txState.regions.put(region1, regionState1);
+
+    Throwable thrown = catchThrowable(() -> txState.doCleanup());
+
+    assertThat(thrown).isInstanceOf(IllegalArgumentException.class);
+    verify(regionState1).cleanup(region1);
+  }
+
+  @Test
+  public void doCleanupThrowsWhenReleasingLockGotIllegalMonitorStateExceptionIfCacheIsNotClosing() {
+    TXState txState = spy(new TXState(txStateProxy, false));
+    txState.locks = mock(TXLockRequest.class);
+    doReturn(cache).when(txStateProxy).getCache();
+    doThrow(new IllegalMonitorStateException()).when(txState.locks)
+        .cleanup(internalDistributedSystem);
+    when(cache.isClosed()).thenReturn(false);
+    TXRegionState regionState1 = mock(TXRegionState.class);
+    InternalRegion region1 = mock(InternalRegion.class);
+    txState.regions.put(region1, regionState1);
+
+    Throwable thrown = catchThrowable(() -> txState.doCleanup());
+
+    assertThat(thrown).isInstanceOf(IllegalMonitorStateException.class);
+    verify(regionState1).cleanup(region1);
+  }
+
 }