[
https://issues.apache.org/jira/browse/GEODE-4147?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16330867#comment-16330867
]
ASF GitHub Bot commented on GEODE-4147:
---------------------------------------
upthewaterspout closed pull request #1284: GEODE-4147: Add variability to
client rebalance logic.
URL: https://github.com/apache/geode/pull/1284
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java
index b2fb67907f..687470bb6d 100644
---
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java
+++
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerImpl.java
@@ -15,8 +15,20 @@
package org.apache.geode.cache.client.internal.pooling;
import java.net.SocketException;
-import java.util.*;
-import java.util.concurrent.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.SplittableRandom;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
@@ -26,9 +38,18 @@
import org.apache.geode.CancelException;
import org.apache.geode.SystemFailure;
import org.apache.geode.cache.GatewayConfigurationException;
-import org.apache.geode.cache.client.*;
-import org.apache.geode.cache.client.internal.*;
+import org.apache.geode.cache.client.AllConnectionsInUseException;
+import org.apache.geode.cache.client.NoAvailableServersException;
+import org.apache.geode.cache.client.ServerConnectivityException;
+import org.apache.geode.cache.client.ServerOperationException;
+import org.apache.geode.cache.client.ServerRefusedConnectionException;
+import org.apache.geode.cache.client.internal.Connection;
+import org.apache.geode.cache.client.internal.ConnectionFactory;
+import org.apache.geode.cache.client.internal.Endpoint;
+import org.apache.geode.cache.client.internal.EndpointManager;
+import org.apache.geode.cache.client.internal.PoolImpl;
import org.apache.geode.cache.client.internal.PoolImpl.PoolTask;
+import org.apache.geode.cache.client.internal.QueueConnectionImpl;
import org.apache.geode.distributed.PoolCancelledException;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.distributed.internal.ServerLocation;
@@ -86,6 +107,26 @@
private static final long NANOS_PER_MS = 1000000L;
+ /**
+ * Adds an arbitrary variance to a positive temporal interval. Where
possible, 10% of the interval
+ * is added or subtracted from the interval. Otherwise, 1 is added or
subtracted from the
+ * interval. For all positive intervals, the returned value will
<bold>not</bold> equal the
+ * supplied interval.
+ *
+ * @param interval Positive temporal interval.
+ * @return Adjusted interval including the variance for positive intervals;
the unmodified
+ * interval for non-positive intervals.
+ */
+ static int addVarianceToInterval(int interval) {
+ if (1 <= interval) {
+ final SplittableRandom random = new SplittableRandom();
+ final int variance = (interval < 10) ? 1 : (1 + random.nextInt((interval
/ 10) - 1));
+ final int sign = random.nextBoolean() ? 1 : -1;
+ return interval + (sign * variance);
+ }
+ return interval;
+ }
+
/**
* Create a connection manager
*
@@ -121,12 +162,12 @@ public ConnectionManagerImpl(String poolName,
ConnectionFactory factory,
this.endpointManager = endpointManager;
this.maxConnections = maxConnections == -1 ? Integer.MAX_VALUE :
maxConnections;
this.minConnections = minConnections;
- this.lifetimeTimeout = lifetimeTimeout;
- this.lifetimeTimeoutNanos = lifetimeTimeout * NANOS_PER_MS;
- if (lifetimeTimeout != -1) {
- if (idleTimeout > lifetimeTimeout || idleTimeout == -1) {
+ this.lifetimeTimeout = addVarianceToInterval(lifetimeTimeout);
+ this.lifetimeTimeoutNanos = this.lifetimeTimeout * NANOS_PER_MS;
+ if (this.lifetimeTimeout != -1) {
+ if (idleTimeout > this.lifetimeTimeout || idleTimeout == -1) {
// lifetimeTimeout takes precedence over longer idle timeouts
- idleTimeout = lifetimeTimeout;
+ idleTimeout = this.lifetimeTimeout;
}
}
this.idleTimeout = idleTimeout;
diff --git
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/ConnectionPoolImplJUnitTest.java
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/ConnectionPoolImplJUnitTest.java
index da87243fc1..e6f2429528 100644
---
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/ConnectionPoolImplJUnitTest.java
+++
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/ConnectionPoolImplJUnitTest.java
@@ -16,7 +16,9 @@
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import java.net.InetSocketAddress;
import java.net.SocketTimeoutException;
@@ -266,5 +268,4 @@ public boolean useThreadLocalConnection() {
assertEquals(location1, pool.executeOnPrimary(testOp));
assertEquals(location1,
pool.executeOnQueuesAndReturnPrimaryResult(testOp));
}
-
}
diff --git
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerJUnitTest.java
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerJUnitTest.java
index d6da9e32e8..60e51e120f 100644
---
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerJUnitTest.java
+++
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/pooling/ConnectionManagerJUnitTest.java
@@ -16,12 +16,12 @@
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
-import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.Properties;
@@ -40,7 +40,16 @@
import org.apache.geode.CancelCriterion;
import org.apache.geode.cache.client.AllConnectionsInUseException;
import org.apache.geode.cache.client.NoAvailableServersException;
-import org.apache.geode.cache.client.internal.*;
+import org.apache.geode.cache.client.internal.ClientUpdater;
+import org.apache.geode.cache.client.internal.Connection;
+import org.apache.geode.cache.client.internal.ConnectionFactory;
+import org.apache.geode.cache.client.internal.ConnectionStats;
+import org.apache.geode.cache.client.internal.Endpoint;
+import org.apache.geode.cache.client.internal.EndpointManager;
+import org.apache.geode.cache.client.internal.EndpointManagerImpl;
+import org.apache.geode.cache.client.internal.Op;
+import org.apache.geode.cache.client.internal.QueueManager;
+import org.apache.geode.cache.client.internal.ServerBlackList;
import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.distributed.DistributedSystem;
import org.apache.geode.distributed.internal.ServerLocation;
@@ -104,6 +113,17 @@ public void tearDown() throws InterruptedException {
background.shutdownNow();
}
+ @Test
+ public void testAddVarianceToInterval() {
+ assertThat(ConnectionManagerImpl.addVarianceToInterval(0)).as("Zero gets
zero variance")
+ .isEqualTo(0);
+ assertThat(ConnectionManagerImpl.addVarianceToInterval(300000))
+ .as("Large value gets +/-10%
variance").isNotEqualTo(300000).isGreaterThanOrEqualTo(270000)
+ .isLessThanOrEqualTo(330000);
+ assertThat(ConnectionManagerImpl.addVarianceToInterval(9)).as("Small value
gets +/-1 variance")
+ .isNotEqualTo(9).isGreaterThanOrEqualTo(8).isLessThanOrEqualTo(10);
+ }
+
@Test
public void testGet()
throws InterruptedException, AllConnectionsInUseException,
NoAvailableServersException {
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> Add variability to client rebalance logic
> -----------------------------------------
>
> Key: GEODE-4147
> URL: https://issues.apache.org/jira/browse/GEODE-4147
> Project: Geode
> Issue Type: Improvement
> Components: client/server, locator
> Reporter: Galen O'Sullivan
> Assignee: Michael Dodge
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.5.0
>
>
> Clients periodically check with the locator to see if they would be better
> connected to another server, for load balancing purposes
> ({{ClientReplacementRequest}}). Currently the delay is always the same, which
> can cause clients to flip flop between servers that the locator thinks are
> more or less loaded. Adding variability to the delay will help reduce the
> amount of coordinated hammering.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)