This is an automated email from the ASF dual-hosted git repository. zhouxj 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 364ddef GEODE-6149: when client's cache is closing, its GetClientPRMetaDataOp could end up with NPE (#2952) 364ddef is described below commit 364ddeff7f867133060e999db6901be78a35268d Author: Xiaojian Zhou <gesterz...@users.noreply.github.com> AuthorDate: Thu Dec 6 13:25:03 2018 -0800 GEODE-6149: when client's cache is closing, its GetClientPRMetaDataOp could end up with NPE (#2952) --- .../client/internal/GetClientPRMetaDataOp.java | 4 +- .../internal/GetClientPRMetaDataOpJUnitTest.java | 50 ++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) 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..8fcf566 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 @@ -105,7 +105,9 @@ public class GetClientPRMetaDataOp { "GetClientPRMetaDataOpImpl#processResponse: for bucketId : {} locations are {}", bucketId, locations); } - advisor.updateBucketServerLocations(bucketId, locations, cms); + if (advisor != null) { + advisor.updateBucketServerLocations(bucketId, locations, cms); + } Set<ClientPartitionAdvisor> cpas = cms.getColocatedClientPartitionAdvisor(regionFullPath); 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..a1208e5 --- /dev/null +++ b/geode-core/src/test/java/org/apache/geode/cache/client/internal/GetClientPRMetaDataOpJUnitTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.geode.cache.client.internal; + +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +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)); + verify(cms, times(1)).setMetadataStable(eq(true)); + } +}