You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2019/04/30 17:14:39 UTC
[geode] branch develop updated: GEODE-6704: optimize
getAllGatewaySenderIds (#3518)
This is an automated email from the ASF dual-hosted git repository.
dschneider 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 f2710b1 GEODE-6704: optimize getAllGatewaySenderIds (#3518)
f2710b1 is described below
commit f2710b1d4c468b7bc591b990f8ffbcb4f409c36b
Author: Darrel Schneider <ds...@pivotal.io>
AuthorDate: Tue Apr 30 10:14:23 2019 -0700
GEODE-6704: optimize getAllGatewaySenderIds (#3518)
* added unit tests for AbstractRegion.getAllGatewaySenderIds
* optimized AbstractRegion.allGatewaySenderIds to do no object creations
---
.../geode/internal/cache/AbstractRegion.java | 11 ++--
.../internal/cache/AbstractRegionJUnitTest.java | 75 +++++++++++++++++++++-
2 files changed, 81 insertions(+), 5 deletions(-)
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
index 9b28c7f..182c899 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegion.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -190,6 +191,9 @@ public abstract class AbstractRegion implements InternalRegion, AttributesMutato
private Set<String> visibleAsyncEventQueueIds;
+ /**
+ * This set is always unmodifiable.
+ */
private Set<String> allGatewaySenderIds;
protected boolean enableSubscriptionConflation;
@@ -703,7 +707,7 @@ public abstract class AbstractRegion implements InternalRegion, AttributesMutato
@Override
public Set<String> getAllGatewaySenderIds() {
- return Collections.unmodifiableSet(this.allGatewaySenderIds);
+ return this.allGatewaySenderIds;
}
/**
@@ -997,12 +1001,11 @@ public abstract class AbstractRegion implements InternalRegion, AttributesMutato
if (getGatewaySenderIds().isEmpty() && getAsyncEventQueueIds().isEmpty()) {
this.allGatewaySenderIds = Collections.emptySet(); // fix for bug 45774
}
- Set<String> tmp = new CopyOnWriteArraySet<String>();
- tmp.addAll(this.getGatewaySenderIds());
+ Set<String> tmp = new HashSet<String>(this.getGatewaySenderIds());
for (String asyncQueueId : this.getAsyncEventQueueIds()) {
tmp.add(AsyncEventQueueImpl.getSenderIdFromAsyncEventQueueId(asyncQueueId));
}
- this.allGatewaySenderIds = tmp;
+ this.allGatewaySenderIds = Collections.unmodifiableSet(tmp);
}
private void initializeVisibleAsyncEventQueueIds(InternalRegionArguments internalRegionArgs) {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/AbstractRegionJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/AbstractRegionJUnitTest.java
index 41c79f0..a04f5b7 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/AbstractRegionJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/AbstractRegionJUnitTest.java
@@ -15,13 +15,26 @@
package org.apache.geode.internal.cache;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.Set;
import org.junit.Test;
+import org.apache.geode.cache.DataPolicy;
+import org.apache.geode.cache.DiskWriteAttributes;
+import org.apache.geode.cache.EvictionAction;
+import org.apache.geode.cache.EvictionAttributes;
+import org.apache.geode.cache.ExpirationAttributes;
import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionAttributes;
+import org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueImpl;
+import org.apache.geode.internal.cache.LocalRegion.RegionMapConstructor;
import org.apache.geode.internal.cache.extension.ExtensionPoint;
import org.apache.geode.internal.cache.extension.SimpleExtensionPoint;
+import org.apache.geode.test.fake.Fakes;
/**
* Unit tests for {@link AbstractRegion}.
@@ -38,10 +51,70 @@ public class AbstractRegionJUnitTest {
* rest.
*/
@Test
-
public void extensionPointIsSimpleExtensionPointByDefault() {
AbstractRegion region = spy(AbstractRegion.class);
ExtensionPoint<Region<?, ?>> extensionPoint = region.getExtensionPoint();
assertThat(extensionPoint).isNotNull().isInstanceOf(SimpleExtensionPoint.class);
}
+
+ @Test
+ public void getAllGatewaySenderIdsReturnsEmptySet() {
+ AbstractRegion region = createTestableAbstractRegion();
+
+ Set<String> result = region.getAllGatewaySenderIds();
+
+ assertThat(result).isEmpty();
+ }
+
+ @Test
+ public void getAllGatewaySenderIdsIncludesAsyncEventQueueId() {
+ AbstractRegion region = createTestableAbstractRegion();
+ region.addAsyncEventQueueId("asyncQueueId", false);
+ String asyncQueueId = AsyncEventQueueImpl.getSenderIdFromAsyncEventQueueId("asyncQueueId");
+
+ Set<String> result = region.getAllGatewaySenderIds();
+
+ assertThat(result).containsExactlyInAnyOrder(asyncQueueId);
+ }
+
+ @Test
+ public void getAllGatewaySenderIdsIncludesGatewaySenderIds() {
+ AbstractRegion region = createTestableAbstractRegion();
+ region.addGatewaySenderId("gatewaySenderId");
+
+ Set<String> result = region.getAllGatewaySenderIds();
+
+ assertThat(result).containsExactlyInAnyOrder("gatewaySenderId");
+ }
+
+ @Test
+ public void getAllGatewaySenderIdsIncludesBothGatewaySenderIdsAndAsyncQueueIds() {
+ AbstractRegion region = createTestableAbstractRegion();
+ region.addGatewaySenderId("gatewaySenderId");
+ region.addAsyncEventQueueId("asyncQueueId", false);
+ String asyncQueueId = AsyncEventQueueImpl.getSenderIdFromAsyncEventQueueId("asyncQueueId");
+
+ Set<String> result = region.getAllGatewaySenderIds();
+
+ assertThat(result).containsExactlyInAnyOrder("gatewaySenderId", asyncQueueId);
+ }
+
+ private AbstractRegion createTestableAbstractRegion() {
+ RegionAttributes regionAttributes = mock(RegionAttributes.class);
+ when(regionAttributes.getDataPolicy()).thenReturn(DataPolicy.DEFAULT);
+ EvictionAttributes evictionAttributes = mock(EvictionAttributes.class);
+ when(evictionAttributes.getAction()).thenReturn(EvictionAction.NONE);
+ when(regionAttributes.getEvictionAttributes()).thenReturn(evictionAttributes);
+ ExpirationAttributes expirationAttributes = mock(ExpirationAttributes.class);
+ when(regionAttributes.getRegionTimeToLive()).thenReturn(expirationAttributes);
+ when(regionAttributes.getRegionIdleTimeout()).thenReturn(expirationAttributes);
+ when(regionAttributes.getEntryTimeToLive()).thenReturn(expirationAttributes);
+ when(regionAttributes.getEntryIdleTimeout()).thenReturn(expirationAttributes);
+ DiskWriteAttributes diskWriteAttributes = mock(DiskWriteAttributes.class);
+ when(regionAttributes.getDiskWriteAttributes()).thenReturn(diskWriteAttributes);
+ RegionMapConstructor regionMapConstructor = mock(RegionMapConstructor.class);
+ AbstractRegion region = new LocalRegion("regionName", regionAttributes, null, Fakes.cache(),
+ new InternalRegionArguments(), null, regionMapConstructor, null, null, null);
+ return region;
+ }
}