This is an automated email from the ASF dual-hosted git repository. echobravo pushed a commit to branch release/1.12.0 in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/release/1.12.0 by this push: new 550cb2e GEODE-7763: Do not exportValue if no clients are waiting for result (#4771) 550cb2e is described below commit 550cb2edf3778d6151a07d6248dbdc42cd9a1b18 Author: Jason Huynh <huyn...@gmail.com> AuthorDate: Wed Mar 11 12:29:30 2020 -0700 GEODE-7763: Do not exportValue if no clients are waiting for result (#4771) * Avoid doing unnecessary serialization (cherry picked from commit b4c3e9413f0008635b0a0c9116c96147d1e4ceec) --- .../cache/tier/sockets/CacheClientNotifier.java | 12 +++++----- .../tier/sockets/CacheClientNotifierTest.java | 28 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientNotifier.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientNotifier.java index 5326dac..b6d5f7c 100755 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientNotifier.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientNotifier.java @@ -691,6 +691,12 @@ public class CacheClientNotifier { wrapper.incrementPutInProgressCounter("notify clients"); conflatable = wrapper; } + if (!filterClients.isEmpty()) { + if (event.getOperation().isEntry()) { + EntryEventImpl entryEvent = (EntryEventImpl) event; + entryEvent.exportNewValue(clientMessage); + } + } clientRegistrationEventQueueManager.add(event, conflatable, filterClients, this); @@ -1025,12 +1031,6 @@ public class CacheClientNotifier { new ClientUpdateMessageImpl(operation, (LocalRegion) event.getRegion(), keyOfInterest, null, delta, (byte) 0x01, callbackArgument, membershipID, eventIdentifier, versionTag); - if (event.getOperation().isEntry()) { - EntryEventImpl entryEvent = (EntryEventImpl) event; - // only need a value if notifyBySubscription is true - entryEvent.exportNewValue(clientUpdateMsg); - } - if (isNetLoad) { clientUpdateMsg.setIsNetLoad(isNetLoad); } diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/CacheClientNotifierTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/CacheClientNotifierTest.java index e9c7115..437c979 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/CacheClientNotifierTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/CacheClientNotifierTest.java @@ -48,10 +48,13 @@ import org.junit.Test; import org.apache.geode.cache.Operation; import org.apache.geode.cache.query.internal.cq.ServerCQ; import org.apache.geode.internal.cache.DistributedRegion; +import org.apache.geode.internal.cache.EntryEventImpl; +import org.apache.geode.internal.cache.EnumListenerEvent; import org.apache.geode.internal.cache.FilterProfile; import org.apache.geode.internal.cache.FilterRoutingInfo; import org.apache.geode.internal.cache.InternalCache; import org.apache.geode.internal.cache.InternalCacheEvent; +import org.apache.geode.internal.cache.LocalRegion; import org.apache.geode.internal.cache.RegionQueueException; import org.apache.geode.internal.statistics.StatisticsClock; import org.apache.geode.test.fake.Fakes; @@ -159,6 +162,31 @@ public class CacheClientNotifierTest { } @Test + public void initializingMessageShouldntSerializeValuePrematurely() throws Exception { + InternalCache internalCache = Fakes.cache(); + CacheServerStats cacheServerStats = mock(CacheServerStats.class); + ConnectionListener connectionListener = mock(ConnectionListener.class); + ClientProxyMembershipID clientProxyMembershipID = mock(ClientProxyMembershipID.class); + ClientRegistrationMetadata clientRegistrationMetadata = mock(ClientRegistrationMetadata.class); + StatisticsClock statisticsClock = mock(StatisticsClock.class); + + when(clientRegistrationMetadata.getClientProxyMembershipID()).thenReturn( + clientProxyMembershipID); + + CacheClientNotifier cacheClientNotifier = CacheClientNotifier.getInstance(internalCache, + new ClientRegistrationEventQueueManager(), statisticsClock, cacheServerStats, 0, 0, + connectionListener, null, false); + LocalRegion region = mock(LocalRegion.class); + + EntryEventImpl entryEvent = mock(EntryEventImpl.class); + when(entryEvent.getEventType()).thenReturn(EnumListenerEvent.AFTER_CREATE); + when(entryEvent.getOperation()).thenReturn(Operation.CREATE); + when(entryEvent.getRegion()).thenReturn(region); + cacheClientNotifier.constructClientMessage(entryEvent); + verify(entryEvent, times(0)).exportNewValue(any()); + } + + @Test public void clientRegistrationFailsQueueStillDrained() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {