You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by zh...@apache.org on 2018/12/05 19:09:43 UTC

[geode] 01/01: GEODE-6149: when client's cache is closing, its GetClientPRMetaDataOp could end up with NPE

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

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

commit b13401c12ae53cc8356ba8f051eb10124d4680af
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Wed Dec 5 11:08:32 2018 -0800

    GEODE-6149: when client's cache is closing, its GetClientPRMetaDataOp could end up with NPE
---
 .../client/internal/GetClientPRMetaDataOp.java     |  5 ++++
 .../internal/GetClientPRMetaDataOpJUnitTest.java   | 32 ++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/GetClientPRMetaDataOp.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/GetClientPRMetaDataOp.java
index c82860d..5b676a0 100755
--- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/GetClientPRMetaDataOp.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/GetClientPRMetaDataOp.java
@@ -95,6 +95,11 @@ public class GetClientPRMetaDataOp {
           }
           int numParts = msg.getNumberOfParts();
           ClientPartitionAdvisor advisor = cms.getClientPartitionAdvisor(regionFullPath);
+          if (advisor == null) {
+            logger.debug(
+                "GetClientPRMetaDataOpImpl#processResponse: advisor is null, which could be due to cache is closed. Not to update PR meta data.");
+            return null;
+          }
           for (int i = 0; i < numParts; i++) {
             Object result = msg.getPart(i).getObject();
             List<BucketServerLocation66> locations = (List<BucketServerLocation66>) result;
diff --git a/geode-core/src/test/java/org/apache/geode/cache/client/internal/GetClientPRMetaDataOpJUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/client/internal/GetClientPRMetaDataOpJUnitTest.java
new file mode 100644
index 0000000..535d794
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/cache/client/internal/GetClientPRMetaDataOpJUnitTest.java
@@ -0,0 +1,32 @@
+package org.apache.geode.cache.client.internal;
+
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.internal.cache.tier.MessageType;
+import org.apache.geode.internal.cache.tier.sockets.Message;
+
+public class GetClientPRMetaDataOpJUnitTest {
+  @Test
+  public void processResponseWhenCacheClosedShuouldReturnNull() throws Exception {
+    Cache cache = mock(Cache.class);
+    ClientMetadataService cms = new ClientMetadataService(cache);
+    cms = spy(cms);
+    doReturn(true).when(cache).isClosed();
+
+    Message msg = mock(Message.class);
+    GetClientPRMetaDataOp.GetClientPRMetaDataOpImpl op =
+        new GetClientPRMetaDataOp.GetClientPRMetaDataOpImpl("testRegion", cms);
+    op = spy(op);
+
+    when(msg.getMessageType()).thenReturn(MessageType.RESPONSE_CLIENT_PR_METADATA);
+
+    assertNull(op.processResponse(msg));
+  }
+}