You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2019/01/23 19:31:07 UTC

[geode] branch develop updated: GEODE-6255: Make ManagementListener testable and interruptible

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

klund pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new c54983e  GEODE-6255: Make ManagementListener testable and interruptible
c54983e is described below

commit c54983e97b1dcf2e8100d3df23916b8b077d9e7f
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Fri Jan 18 15:09:12 2019 -0800

    GEODE-6255: Make ManagementListener testable and interruptible
---
 .../internal/beans/ManagementListener.java           | 20 ++++++++++++++++----
 .../internal/beans/ManagementListenerTest.java       | 16 +++++++++-------
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/beans/ManagementListener.java b/geode-core/src/main/java/org/apache/geode/management/internal/beans/ManagementListener.java
index 06314bf..a82a7fb 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/beans/ManagementListener.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/beans/ManagementListener.java
@@ -17,6 +17,7 @@ package org.apache.geode.management.internal.beans;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import org.apache.geode.CancelCriterion;
 import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.DiskStore;
 import org.apache.geode.cache.Region;
@@ -41,6 +42,8 @@ public class ManagementListener implements ResourceEventsListener {
 
   private final InternalDistributedSystem system;
 
+  private final CancelCriterion cancelCriterion;
+
   /**
    * Adapter to co-ordinate between GemFire and Federation framework
    */
@@ -52,12 +55,15 @@ public class ManagementListener implements ResourceEventsListener {
   private final ReadWriteLock readWriteLock;
 
   public ManagementListener(InternalDistributedSystem system) {
-    this(system, new ManagementAdapter(), new ReentrantReadWriteLock());
+    this(system.getCancelCriterion(), system, new ManagementAdapter(),
+        new ReentrantReadWriteLock());
   }
 
   @VisibleForTesting
-  ManagementListener(InternalDistributedSystem system, ManagementAdapter adapter,
+  ManagementListener(CancelCriterion cancelCriterion, InternalDistributedSystem system,
+      ManagementAdapter adapter,
       ReadWriteLock readWriteLock) {
+    this.cancelCriterion = cancelCriterion;
     this.system = system;
     this.adapter = adapter;
     this.readWriteLock = readWriteLock;
@@ -105,10 +111,16 @@ public class ManagementListener implements ResourceEventsListener {
     }
     try {
       if (event == ResourceEvent.CACHE_CREATE || event == ResourceEvent.CACHE_REMOVE) {
-        readWriteLock.writeLock().lock();
+        readWriteLock.writeLock().lockInterruptibly();
       } else if (event != ResourceEvent.SYSTEM_ALERT) {
-        readWriteLock.readLock().lock();
+        readWriteLock.readLock().lockInterruptibly();
       }
+    } catch (InterruptedException e) {
+      // prefer CancelException if shutting down
+      cancelCriterion.checkCancelInProgress(e);
+      throw new RuntimeException(e);
+    }
+    try {
       switch (event) {
         case CACHE_CREATE:
           InternalCache createdCache = (InternalCache) resource;
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java
index 9542e12..585d2a1 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/beans/ManagementListenerTest.java
@@ -34,6 +34,7 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.mockito.InOrder;
 
+import org.apache.geode.CancelCriterion;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ResourceEvent;
 import org.apache.geode.internal.cache.InternalCache;
@@ -71,7 +72,8 @@ public class ManagementListenerTest {
     readLockInOrder = inOrder(readLock, readLock);
     writeLockInOrder = inOrder(writeLock, writeLock);
 
-    managementListener = new ManagementListener(system, managementAdapter, readWriteLock);
+    managementListener = new ManagementListener(mock(CancelCriterion.class), system,
+        managementAdapter, readWriteLock);
   }
 
   @Test
@@ -109,18 +111,18 @@ public class ManagementListenerTest {
   }
 
   @Test
-  public void handleEventUsesWriteLockForCacheCreateEvent() {
+  public void handleEventUsesWriteLockForCacheCreateEvent() throws InterruptedException {
     managementListener.handleEvent(CACHE_CREATE, null);
 
-    writeLockInOrder.verify(writeLock).lock();
+    writeLockInOrder.verify(writeLock).lockInterruptibly();
     writeLockInOrder.verify(writeLock).unlock();
   }
 
   @Test
-  public void handleEventUsesWriteLockForCacheRemoveEvent() {
+  public void handleEventUsesWriteLockForCacheRemoveEvent() throws InterruptedException {
     managementListener.handleEvent(CACHE_REMOVE, null);
 
-    writeLockInOrder.verify(writeLock).lock();
+    writeLockInOrder.verify(writeLock).lockInterruptibly();
     writeLockInOrder.verify(writeLock).unlock();
   }
 
@@ -134,13 +136,13 @@ public class ManagementListenerTest {
   }
 
   @Test
-  public void handleEventUsesReadLockForOtherEvents() {
+  public void handleEventUsesReadLockForOtherEvents() throws InterruptedException {
     for (ResourceEvent resourceEvent : ResourceEvent.values()) {
       if (resourceEvent != CACHE_CREATE && resourceEvent != CACHE_REMOVE
           && resourceEvent != SYSTEM_ALERT) {
         managementListener.handleEvent(resourceEvent, null);
 
-        readLockInOrder.verify(readLock).lock();
+        readLockInOrder.verify(readLock).lockInterruptibly();
         readLockInOrder.verify(readLock).unlock();
       }
     }