Repository: incubator-geode Updated Branches: refs/heads/develop 8645fe038 -> 68dab4af5
GEODE-956 Product use log shows duplicate entries The product use logger was adding up the load of all of the servers and displaying it, but each load is a float between zero and 1.0 so the total was always zero. I've modified it to figure out the correct connection count for each CacheServer and also log the subscription queue count. The list of servers now has duplicate entries removed by putting all of the servers into a Set. Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/68dab4af Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/68dab4af Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/68dab4af Branch: refs/heads/develop Commit: 68dab4af591ba631234d156a84b5306ea39fe22f Parents: 8645fe0 Author: Bruce Schuchardt <bschucha...@pivotal.io> Authored: Mon Mar 21 09:17:02 2016 -0700 Committer: Bruce Schuchardt <bschucha...@pivotal.io> Committed: Mon Mar 21 09:22:09 2016 -0700 ---------------------------------------------------------------------- .../internal/AutoConnectionSourceImpl.java | 10 +-- .../internal/locator/LocatorListResponse.java | 8 ++- .../internal/InternalDistributedSystem.java | 6 ++ .../distributed/internal/ServerLocator.java | 70 ++++++++++++-------- .../internal/ProductUseLogDUnitTest.java | 50 +++++++++++--- .../management/ClientHealthStatsDUnitTest.java | 2 +- .../sanctionedDataSerializables.txt | 2 +- 7 files changed, 98 insertions(+), 50 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/68dab4af/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/AutoConnectionSourceImpl.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/AutoConnectionSourceImpl.java b/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/AutoConnectionSourceImpl.java index 6fe1c6b..dfc9b14 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/AutoConnectionSourceImpl.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/AutoConnectionSourceImpl.java @@ -174,16 +174,10 @@ public class AutoConnectionSourceImpl implements ConnectionSource { QueueConnectionRequest request = new QueueConnectionRequest(proxyId,numServers,excludedServers, serverGroup,findDurableQueue); QueueConnectionResponse response = (QueueConnectionResponse) queryLocators(request); if (response==null) { - // why log a warning if we are going to throw the caller and exception? - //getLogger().warning("Unable to connect to any locators in the list " + locators); throw new NoAvailableLocatorsException("Unable to connect to any locators in the list " + locators); } //TODO - do this logic on the server side, return one list in the message. List result = response.getServers(); -// if(getLogger().fineEnabled()) { -// getLogger().fine("Received queue connection response with server " + result+" excludeList:"+excludedServers); -// } - return result; } @@ -242,9 +236,9 @@ public class AutoConnectionSourceImpl implements ConnectionSource { protected void updateLocatorList(LocatorListResponse response) { if (response == null) return; isBalanced = response.isBalanced(); - ArrayList<ServerLocation> locatorResponse = response.getLocators(); + List<ServerLocation> locatorResponse = response.getLocators(); - ArrayList<InetSocketAddress> newLocators = new ArrayList<InetSocketAddress>(locatorResponse.size()); + List<InetSocketAddress> newLocators = new ArrayList<InetSocketAddress>(locatorResponse.size()); Set<InetSocketAddress> badLocators = new HashSet<InetSocketAddress>(initialLocators); for(Iterator<ServerLocation> itr = locatorResponse.iterator(); itr.hasNext(); ) { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/68dab4af/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/locator/LocatorListResponse.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/locator/LocatorListResponse.java b/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/locator/LocatorListResponse.java index a9ab821..f1261d9 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/locator/LocatorListResponse.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/cache/client/internal/locator/LocatorListResponse.java @@ -20,7 +20,9 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; +import java.util.List; +import com.gemstone.gemfire.distributed.internal.ServerLocation; import com.gemstone.gemfire.internal.DataSerializableFixedID; /** @@ -29,7 +31,7 @@ import com.gemstone.gemfire.internal.DataSerializableFixedID; */ public class LocatorListResponse extends ServerLocationResponse { /** ArrayList of ServerLocations for controllers */ - private ArrayList controllers; + private List<ServerLocation> controllers; private boolean isBalanced; private boolean locatorsFound = false; @@ -37,7 +39,7 @@ public class LocatorListResponse extends ServerLocationResponse { public LocatorListResponse() { } - public LocatorListResponse(ArrayList locators, boolean isBalanced) { + public LocatorListResponse(List<ServerLocation> locators, boolean isBalanced) { this.controllers = locators; if (locators != null && !locators.isEmpty()) { this.locatorsFound = true; @@ -62,7 +64,7 @@ public class LocatorListResponse extends ServerLocationResponse { * Returns an array list of type ServerLocation containing controllers. * @return list of controllers */ - public ArrayList getLocators() { + public List<ServerLocation> getLocators() { return this.controllers; } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/68dab4af/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java index 8fc884a..62755ca 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/InternalDistributedSystem.java @@ -947,6 +947,12 @@ public class InternalDistributedSystem this.forcedDisconnect = true; resetReconnectAttemptCounter(); if (sampler.isSamplingEnabled()) { + try { + // give the stat sampler time to take another sample + Thread.sleep(this.config.getStatisticSampleRate() * 2); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } if (sampler.getStatSamplerStats().getJvmPauses() > 0) { try { // if running tests then create a heap dump http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/68dab4af/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/ServerLocator.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/ServerLocator.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/ServerLocator.java index 644bf63..965c1e7 100644 --- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/ServerLocator.java +++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/ServerLocator.java @@ -79,10 +79,12 @@ public class ServerLocator implements TcpHandler, DistributionAdvisee { private final LocatorStats stats; private LocatorLoadSnapshot loadSnapshot = new LocatorLoadSnapshot(); private Map<ServerLocation, DistributedMember> ownerMap = new HashMap<ServerLocation, DistributedMember>(); - private volatile ArrayList cachedLocators; + private volatile List<ServerLocation> cachedLocators; private final Object cachedLocatorsLock = new Object(); private final static AtomicInteger profileSN = new AtomicInteger(); + + private static final long SERVER_LOAD_LOG_INTERVAL = (60 * 60 * 1000); // log server load once an hour private final String logFile; private final String hostName; @@ -90,6 +92,8 @@ public class ServerLocator implements TcpHandler, DistributionAdvisee { private ProductUseLog productUseLog; + private volatile long lastLogTime; + ServerLocator() throws IOException { this.port = 10334; this.hostName = SocketCreator.getLocalHost().getCanonicalHostName(); @@ -232,7 +236,7 @@ public class ServerLocator implements TcpHandler, DistributionAdvisee { } private Object getLocatorListResponse(LocatorListRequest request) { - ArrayList controllers = getLocators(); + List<ServerLocation> controllers = getLocators(); boolean balanced = loadSnapshot.hasBalancedConnections(request.getServerGroup()); return new LocatorListResponse(controllers, balanced); } @@ -358,16 +362,16 @@ public class ServerLocator implements TcpHandler, DistributionAdvisee { - private ArrayList getLocators() { + private List<ServerLocation> getLocators() { if(cachedLocators != null) { return cachedLocators; } else { synchronized(cachedLocatorsLock) { - List profiles = advisor.fetchControllers(); - ArrayList result = new ArrayList(profiles.size() + 1); - for (Iterator itr = profiles.iterator(); itr.hasNext(); ) { - result.add(buildServerLocation((ControllerProfile) itr.next())); + List<ControllerProfile> profiles = advisor.fetchControllers(); + List<ServerLocation> result = new ArrayList<>(profiles.size() + 1); + for (ControllerProfile profile: profiles) { + result.add(buildServerLocation(profile)); } result.add(new ServerLocation(hostNameForClients,port)); cachedLocators = result; @@ -400,7 +404,6 @@ public class ServerLocator implements TcpHandler, DistributionAdvisee { } else { cachedLocators = null; } - logServers(); } /** @@ -434,38 +437,53 @@ public class ServerLocator implements TcpHandler, DistributionAdvisee { } loadSnapshot.updateLoad(location, load, clientIds); this.stats.incServerLoadUpdates(); + logServers(); } private void logServers() { if (productUseLog != null) { - StringBuilder sb = new StringBuilder(1000); Map<ServerLocation, ServerLoad> loadMap = getLoadMap(); if (loadMap.size() == 0) { return; } + long now = System.currentTimeMillis(); + long lastLogTime = this.lastLogTime; + if (now < lastLogTime + SERVER_LOAD_LOG_INTERVAL) { + return; + } + this.lastLogTime = now; + + int queues = 0; int connections = 0; for (ServerLoad l: loadMap.values()) { - connections += l.getConnectionLoad(); + queues += l.getSubscriptionConnectionLoad(); + connections = (int)Math.ceil(l.getConnectionLoad() / l.getLoadPerConnection()); } - sb.append("server summary: ") - .append(loadMap.size()) - .append(" cache servers with ") - .append(connections) - .append(" client connections") - .append(File.separator) - .append("current cache servers : "); + Set<DistributedMember> servers; synchronized(ownerMap) { - String[] ids = new String[ownerMap.size()]; - int i=0; - for (DistributedMember id: ownerMap.values()) { - ids[i++] = id.toString(); - } - Arrays.sort(ids); - for (i=0; i<ids.length; i++) { - sb.append(ids[i]).append(' '); - } + servers = new HashSet<>(ownerMap.values()); + } + + StringBuilder sb = new StringBuilder(1000); + sb.append("server count: ") + .append(servers.size()) + .append(" connected client count: ") + .append(connections) + .append(" client subscription queue count: ") + .append(queues) + .append(System.lineSeparator()) + .append("current servers : "); + + String[] ids = new String[servers.size()]; + int i=0; + for (DistributedMember id: servers) { + ids[i++] = id.toString(); + } + Arrays.sort(ids); + for (i=0; i<ids.length; i++) { + sb.append(ids[i]).append(' '); } productUseLog.log(sb.toString()); } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/68dab4af/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/ProductUseLogDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/ProductUseLogDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/ProductUseLogDUnitTest.java index e2217b5..7715280 100644 --- a/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/ProductUseLogDUnitTest.java +++ b/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/ProductUseLogDUnitTest.java @@ -24,17 +24,24 @@ import java.util.Properties; import com.gemstone.gemfire.cache.Cache; import com.gemstone.gemfire.cache.CacheFactory; +import com.gemstone.gemfire.cache.Region; +import com.gemstone.gemfire.cache.RegionShortcut; +import com.gemstone.gemfire.cache.client.ClientCache; +import com.gemstone.gemfire.cache.client.ClientCacheFactory; +import com.gemstone.gemfire.cache.client.ClientRegionShortcut; import com.gemstone.gemfire.cache.server.CacheServer; +import com.gemstone.gemfire.cache30.CacheTestCase; import com.gemstone.gemfire.distributed.Locator; import com.gemstone.gemfire.internal.AvailablePort; import com.gemstone.gemfire.internal.cache.CacheServerImpl; import com.gemstone.gemfire.test.dunit.Assert; import com.gemstone.gemfire.test.dunit.DistributedTestCase; import com.gemstone.gemfire.test.dunit.Host; +import com.gemstone.gemfire.test.dunit.SerializableCallable; import com.gemstone.gemfire.test.dunit.SerializableRunnable; import com.gemstone.gemfire.test.dunit.VM; -public class ProductUseLogDUnitTest extends DistributedTestCase { +public class ProductUseLogDUnitTest extends CacheTestCase { public ProductUseLogDUnitTest(String name) { super(name); @@ -50,6 +57,7 @@ public class ProductUseLogDUnitTest extends DistributedTestCase { public void testMembershipMonitoring() throws Exception { Host host = Host.getHost(0); VM vm0 = host.getVM(0); + VM vm1 = host.getVM(1); // use a locator so we will monitor server load and record member->server mappings int locatorPort = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET); @@ -67,10 +75,11 @@ public class ProductUseLogDUnitTest extends DistributedTestCase { assertTrue(logFile.exists()); assertTrue(logFile.exists()); - vm0.invoke(new SerializableRunnable("get system") { - public void run() { - InternalDistributedSystem system = getSystem(); - Cache cache = CacheFactory.create(system); + int serverPort = (Integer)vm0.invoke(new SerializableCallable("get system") { + public Object call() { + getSystem(); + getCache(); + cache.createRegionFactory(RegionShortcut.REPLICATE).create("myregion"); CacheServer server = cache.addCacheServer(); server.setPort(0); try { @@ -78,17 +87,40 @@ public class ProductUseLogDUnitTest extends DistributedTestCase { } catch (IOException e) { Assert.fail("failed to start server", e); } + return server.getPort(); + } + }); + + vm1.invoke(new SerializableRunnable("create a client") { + public void run() { + ClientCache clientCache = new ClientCacheFactory() + .setPoolSubscriptionEnabled(true) + .addPoolServer("localhost", serverPort) + .create(); + Region r = clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY).create("myregion"); + r.registerInterest(".*"); + r.put("somekey", "somevalue"); + } + }); + + vm0.invoke(new SerializableRunnable("check region") { + public void run() { + Region r = cache.getRegion("myregion"); + Assert.assertNotNull(r.get("somekey")); } }); + // wait for the server info to be received and logged -// pause(2 * BridgeServerImpl.FORCE_LOAD_UPDATE_FREQUENCY * 1000); + Thread.sleep(2 * CacheServer.DEFAULT_LOAD_POLL_INTERVAL); system.disconnect(); String logContents = readFile(logFile); assertTrue("expected " + logFile + " to contain a View", logContents.contains("View")); - assertTrue("expected " + logFile + " to contain 'server summary'", logContents.contains("server summary")); + assertTrue("expected " + logFile + " to have a server count of 1", logContents.contains("server count: 1")); + assertTrue("expected " + logFile + " to have a client count of 1" , logContents.contains("client count: 1")); + assertTrue("expected " + logFile + " to have a queue count of 1", logContents.contains("queue count: 1")); } private String readFile(File file) throws IOException { @@ -101,8 +133,4 @@ public class ProductUseLogDUnitTest extends DistributedTestCase { return sb.toString(); } - @Override - public final void preTearDown() throws Exception { - disconnectAllFromDS(); - } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/68dab4af/geode-core/src/test/java/com/gemstone/gemfire/management/ClientHealthStatsDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/gemfire/management/ClientHealthStatsDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/management/ClientHealthStatsDUnitTest.java index 6751aea..721be03 100644 --- a/geode-core/src/test/java/com/gemstone/gemfire/management/ClientHealthStatsDUnitTest.java +++ b/geode-core/src/test/java/com/gemstone/gemfire/management/ClientHealthStatsDUnitTest.java @@ -237,7 +237,7 @@ public class ClientHealthStatsDUnitTest extends DistributedTestCase { props.setProperty(DistributionConfig.DURABLE_CLIENT_ID_NAME, "durable-"+clientNum); props.setProperty(DistributionConfig.DURABLE_CLIENT_TIMEOUT_NAME, "300000"); - props.setProperty("log-file", getTestMethodName()+"_client_" + clientNum + ".log"); +// props.setProperty("log-file", getTestMethodName()+"_client_" + clientNum + ".log"); props.setProperty("log-level", "info"); props.setProperty("statistic-archive-file", getTestMethodName()+"_client_" + clientNum + ".gfs"); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/68dab4af/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt ---------------------------------------------------------------------- diff --git a/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt b/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt index a6e951a..0dda2e6 100644 --- a/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt +++ b/geode-core/src/test/resources/com/gemstone/gemfire/codeAnalysis/sanctionedDataSerializables.txt @@ -59,7 +59,7 @@ fromData,31,2a2bb80005b500032ab40003c600122ab40003b600049a00082a04b50002b1 toData,9,2ab400032bb80006b1 com/gemstone/gemfire/cache/client/internal/locator/LocatorListResponse,2 -fromData,41,2a2bb80006b500032a2bb900070100b500052ab40003c600122ab40003b600049a00082a04b50002b1 +fromData,43,2a2bb80006b500032a2bb900070100b500052ab40003c600142ab40003b9000401009a00082a04b50002b1 toData,19,2ab400032bb800082b2ab40005b900090200b1 com/gemstone/gemfire/cache/client/internal/locator/LocatorStatusResponse,2