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(); } }