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