blob: fa181ace868db14a004d0dbab077c909ecae5df1 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.gemfire.management.bean.stats;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.TestName;
import com.gemstone.gemfire.distributed.internal.DistributionStats;
import com.gemstone.gemfire.distributed.internal.locks.DLockStats;
import com.gemstone.gemfire.internal.NanoTimer;
import com.gemstone.gemfire.internal.OSProcess;
import com.gemstone.gemfire.internal.VMStatsContract;
import com.gemstone.gemfire.internal.cache.CachePerfStats;
import com.gemstone.gemfire.internal.cache.DiskStoreStats;
import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
import com.gemstone.gemfire.internal.cache.PartitionedRegionStats;
import com.gemstone.gemfire.internal.cache.execute.FunctionServiceStats;
import com.gemstone.gemfire.internal.stats50.VMStats50;
import com.gemstone.gemfire.management.ManagementService;
import com.gemstone.gemfire.management.internal.beans.MemberMBeanBridge;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
/**
* @author rishim
*/
@Category(IntegrationTest.class)
public class MemberLevelStatsJUnitTest extends MBeanStatsTestCase {
@Rule public TestName name = new TestName();
private MemberMBeanBridge bridge;
private CachePerfStats cachePerfStats;
private FunctionServiceStats funcServiceStats;
private DistributionStats distributionStats;
private DLockStats dlockStats;
private List<DiskStoreStats> diskStatsList = new ArrayList<DiskStoreStats>();
private List<PartitionedRegionStats> parRegionStatsList = new ArrayList<PartitionedRegionStats>();
private static TimeUnit nanoSeconds = TimeUnit.NANOSECONDS;
private static long testStartTime = NanoTimer.getTime();
public void init() {
cachePerfStats = new CachePerfStats(system);
funcServiceStats = new FunctionServiceStats(system, "FunctionExecution");
long statId = OSProcess.getId();
distributionStats = new DistributionStats(system, statId);
DistributionStats.enableClockStats = true;
dlockStats = new DLockStats(system, statId);
bridge = new MemberMBeanBridge();
bridge.addCacheStats(cachePerfStats);
bridge.addFunctionStats(funcServiceStats);
bridge.addDistributionStats(distributionStats);
bridge.addLockServiceStats(dlockStats);
VMStatsContract vmstats = system.getStatSampler().getVMStats();
assertTrue(vmstats instanceof VMStats50);
bridge.addSystemStats();
bridge.addVMStats();
for(int i = 0; i<4 ; i++){
DiskStoreStats stats = new DiskStoreStats(system, name.getMethodName() + i);
diskStatsList.add(stats);
bridge.addDiskStoreStats(stats);
}
for(int i = 0; i<4 ; i++){
PartitionedRegionStats stats = new PartitionedRegionStats(system, name.getMethodName() + i);
parRegionStatsList.add(stats);
bridge.addPartionRegionStats(stats);
}
}
@Test
public void testPlainCounters() throws InterruptedException {
cachePerfStats.incRegions(3);
cachePerfStats.incEntryCount(400);
cachePerfStats.incGetInitialImageKeysReceived();
cachePerfStats.incDiskTasksWaiting();
funcServiceStats.incFunctionExecutionsRunning();
funcServiceStats.incFunctionExecutionHasResultRunning();
sample();
assertEquals(3, getTotalRegionCount());
assertEquals(400, getTotalRegionEntryCount());
assertEquals(1, getInitialImageKeysReceived());
assertEquals(1,getNumRunningFunctions());
assertEquals(1,getNumRunningFunctionsHavingResults());
assertEquals(1,getTotalDiskTasksWaiting());
}
@Test
public void testLockServiceCounters() throws InterruptedException {
dlockStats.incServices(5);
dlockStats.incGrantors(2);
dlockStats.incRequestQueues(10);
long lockWaitStarts = dlockStats.startLockWait();
sample();
int lockWaitinProgress = getLockWaitsInProgress();
int lockRequestQueue = getLockRequestQueues();
int numLockService = getTotalNumberOfLockService() ;
int lockGrantors = getTotalNumberOfGrantors() ;
assertEquals(1, lockWaitinProgress);
assertEquals(2,lockGrantors);
assertEquals(5,numLockService);
assertEquals(10,lockRequestQueue);
dlockStats.endLockWait(lockWaitStarts, true);
sample();
long lockWaitTime = getTotalLockWaitTime() ;
assertTrue(lockWaitTime >0);
}
@Test
public void testTimeBasedCounters() throws InterruptedException {
long startGIITime = cachePerfStats.startGetInitialImage();
long startCacheListenerTime = cachePerfStats.startCacheListenerCall();
long startCacheWriterTime = cachePerfStats.startCacheWriterCall();
long startLoadTime = cachePerfStats.startLoad();
cachePerfStats.endPutAll(testStartTime);
long startGetsTime1 = cachePerfStats.startGet();
long startGetsTime2 = cachePerfStats.startGet();
long startNetLoadTime = cachePerfStats.startNetload();
long startNetSearchTime = cachePerfStats.startNetsearch();
sample();
assertEquals(1, getInitialImagesInProgres());
cachePerfStats.endGetInitialImage(startGIITime);
cachePerfStats.endCacheListenerCall(startCacheListenerTime);
cachePerfStats.endCacheWriterCall(startCacheWriterTime);
cachePerfStats.endGet(startGetsTime1, true);
cachePerfStats.endGet(startGetsTime2, false);
cachePerfStats.endLoad(startLoadTime);
cachePerfStats.endNetload(startNetLoadTime);
cachePerfStats.endNetsearch(startNetSearchTime);
long startPutsTime = cachePerfStats.endPut(testStartTime, false);
cachePerfStats.txSuccess(CachePerfStats.getStatTime() - testStartTime, testStartTime,
1);
cachePerfStats.txRollback(CachePerfStats.getStatTime() - testStartTime, testStartTime,
1);
sample();
assertEquals(1, getTotalNetLoadsCompleted());
assertEquals(1, getTotalNetSearchCompleted());
long netLoadAverageLatency = getNetLoadsAverageLatency();
print("netLoadAverageLatency is " + new Long(netLoadAverageLatency).toString());
long netSearchAverageLatency = getNetSearchAverageLatency();
print("netSearchAverageLatency is " + new Long(netSearchAverageLatency).toString());
assertTrue(netLoadAverageLatency > 0);
assertTrue(netSearchAverageLatency > 0);
assertEquals(1, getTotalHitCount()); // Gets minus Misses
assertTrue(getInitialImageTime() > 0);
long cacheListenerLatency = getCacheListenerCallsAvgLatency();
assertTrue(cacheListenerLatency > 0);
long cacheWriterLatency = getCacheWriterCallsAvgLatency();
assertTrue(cacheWriterLatency > 0);
float putAllRate = getPutAllRate();
long putAllAverageLatency = getPutAllAvgLatency();
assertTrue(putAllAverageLatency > 0);
print("putAllRate is " + new Float(putAllRate).toString());
assertTrue(putAllRate > 0);
float getsRate = getGetsRate();
long getsAverageLatency = getGetsAvgLatency();
assertTrue(getsAverageLatency > 0);
print("getsRate is " + new Float(getsRate).toString());
assertTrue(getsRate > 0);
assertEquals(1, getTotalMissCount());
float putsRate = getPutsRate();
long putsAverageLatency = getPutsAvgLatency();
assertTrue(putsAverageLatency > 0);
print("putsRate is " + new Float(putsRate).toString());
assertTrue(putsRate > 0);
assertEquals(1, getTotalLoadsCompleted());
long loadAverageLatency = getLoadsAverageLatency();
assertTrue(loadAverageLatency > 0);
assertEquals(1,getTransactionCommittedTotalCount());
assertEquals(1, getTransactionRolledBackTotalCount());
assertEquals(2,getTotalTransactionsCount());
float txnCommitRates = getTransactionCommitsRate();
print("txnCommitRates is " + new Float(txnCommitRates).toString());
assertTrue(txnCommitRates > 0);
long txnCommitAverageLatency = getTransactionCommitsAvgLatency();
assertTrue(txnCommitAverageLatency > 0);
}
@Test
public void testRates() throws InterruptedException {
for (int i = 0; i < 20; i++) {
cachePerfStats.incCreates();
cachePerfStats.incDestroys();
funcServiceStats.incFunctionExecutionsCompleted();
distributionStats.incSentBytes(20);
distributionStats.incReceivedBytes(20);
}
sample();
float createsRate = getCreatesRate();
float destroyRate = getDestroysRate();
float functionExecutionRate = getFunctionExecutionRate();
float byteSentRate = getBytesSentRate();
float byteReceivedRate = getBytesReceivedRate();
print("createsRate is " + new Float(createsRate).toString());
print("destroyRate is " + new Float(destroyRate).toString());
print("functionExecutionRate is " + new Float(functionExecutionRate).toString());
print("byteSentRate is " + new Float(byteSentRate).toString());
print("byteReceivedRate is " + new Float(byteReceivedRate).toString());
assertTrue(createsRate > 0);
assertTrue(destroyRate > 0);
assertTrue(functionExecutionRate > 0);
assertTrue(byteSentRate > 0);
assertTrue(byteReceivedRate > 0);
}
@Test
public void testDistributionStats() throws InterruptedException {
long initTime = System.currentTimeMillis();
long startTime = distributionStats.startReplyWait();
distributionStats.incNodes(20);
sample();
assertEquals(1 , bridge.getReplyWaitsInProgress());
assertEquals(20 , bridge.getVisibleNodes());
distributionStats.endReplyWait(startTime, initTime);
sample();
assertEquals(0 , bridge.getReplyWaitsInProgress());
assertEquals(1 , bridge.getReplyWaitsCompleted());
}
@Test
public void testDiskCounters() throws InterruptedException {
for(DiskStoreStats stats : diskStatsList){
stats.startRead();
stats.startWrite();
stats.startBackup();
stats.incWrittenBytes(200, false);
stats.startFlush();
}
sample();
assertEquals(4, getTotalBackupInProgress());
assertTrue(getDiskWritesRate()>0);
for(DiskStoreStats stats : diskStatsList){
stats.endRead(testStartTime,20);
stats.endWrite(testStartTime);
stats.endBackup();
stats.endFlush(testStartTime);
}
sample();
assertEquals(4, getTotalBackupCompleted());
assertTrue(getDiskFlushAvgLatency()>0);
assertTrue(getDiskReadsRate()>0);
for(DiskStoreStats stats : diskStatsList){
bridge.removeDiskStoreStats(stats);
stats.close();
}
assertEquals(4, getTotalBackupCompleted());
}
@Test
public void testRegionCounters() throws InterruptedException {
for(PartitionedRegionStats stats : parRegionStatsList){
stats.incBucketCount(1);
stats.incPrimaryBucketCount(1);
stats.incDataStoreEntryCount(1);
}
sample();
assertEquals(4, getTotalBucketCount());
assertEquals(4, getTotalBucketSize());
assertEquals(4, getTotalPrimaryBucketCount());
for(PartitionedRegionStats stats : parRegionStatsList){
bridge.removePartionRegionStats(stats);
stats.close();
}
sample();
assertEquals(0, getTotalBucketCount());
assertEquals(0, getTotalBucketSize());
assertEquals(0, getTotalPrimaryBucketCount());
}
@Test
public void testCacheBasedStats() throws Exception{
GemFireCacheImpl cache = GemFireCacheImpl.getInstance();
ManagementService service = ManagementService.getExistingManagementService(cache);
long start = cache.getResourceManager().getStats().startRebalance();
assertEquals(1 , service.getMemberMXBean().getRebalancesInProgress());
cache.getResourceManager().getStats().endRebalance(start);
assertEquals(0 , service.getMemberMXBean().getRebalancesInProgress());
}
public void print(String message) {
system.getLogWriter().fine(message);
}
public int getTotalBucketSize() {
return bridge.getTotalBucketSize();
}
private int getInitialImageKeysReceived() {
return bridge.getInitialImageKeysReceived();
}
private long getInitialImageTime() {
return bridge.getInitialImageTime();
}
private int getInitialImagesInProgres() {
return bridge.getInitialImagesInProgres();
}
private float getBytesReceivedRate() {
return bridge.getBytesReceivedRate();
}
private float getBytesSentRate() {
return bridge.getBytesSentRate();
}
private long getCacheListenerCallsAvgLatency() {
return bridge.getCacheListenerCallsAvgLatency();
}
private long getCacheWriterCallsAvgLatency() {
return bridge.getCacheWriterCallsAvgLatency();
}
private float getCreatesRate() {
return bridge.getCreatesRate();
}
private float getDestroysRate() {
return bridge.getDestroysRate();
}
private float getDiskReadsRate() {
return bridge.getDiskReadsRate();
}
private float getDiskWritesRate() {
return bridge.getDiskWritesRate();
}
private int getTotalBackupInProgress() {
return bridge.getTotalBackupInProgress();
}
private int getTotalBackupCompleted() {
return bridge.getTotalBackupCompleted();
}
private long getDiskFlushAvgLatency() {
return bridge.getDiskFlushAvgLatency();
}
private float getFunctionExecutionRate() {
return bridge.getFunctionExecutionRate();
}
private long getGetsAvgLatency() {
return bridge.getGetsAvgLatency();
}
private float getGetsRate() {
return bridge.getGetsRate();
}
private int getLockWaitsInProgress() {
return bridge.getLockWaitsInProgress();
}
private int getNumRunningFunctions() {
return bridge.getNumRunningFunctions();
}
private int getNumRunningFunctionsHavingResults() {
return bridge.getNumRunningFunctionsHavingResults();
}
private long getPutAllAvgLatency() {
return bridge.getPutAllAvgLatency();
}
private float getPutAllRate() {
return bridge.getPutAllRate();
}
private long getPutsAvgLatency() {
return bridge.getPutAllAvgLatency();
}
private float getPutsRate() {
return bridge.getPutsRate();
}
private int getTotalPrimaryBucketCount() {
return bridge.getTotalPrimaryBucketCount();
}
private int getTotalBucketCount() {
return bridge.getTotalBucketCount();
}
private int getTotalHitCount() {
return bridge.getTotalHitCount();
}
private float getLruDestroyRate() {
return bridge.getLruDestroyRate();
}
private float getLruEvictionRate() {
return bridge.getLruEvictionRate();
}
private int getTotalLoadsCompleted() {
return bridge.getTotalLoadsCompleted();
}
private long getLoadsAverageLatency() {
return bridge.getLoadsAverageLatency();
}
private int getTotalNetLoadsCompleted() {
return bridge.getTotalNetLoadsCompleted();
}
private long getNetLoadsAverageLatency() {
return bridge.getNetLoadsAverageLatency();
}
private int getTotalNetSearchCompleted() {
return bridge.getTotalNetSearchCompleted();
}
private long getNetSearchAverageLatency() {
return bridge.getNetSearchAverageLatency();
}
private int getTotalMissCount() {
return bridge.getTotalMissCount();
}
private int getLockRequestQueues() {
return bridge.getLockRequestQueues();
}
private long getTotalLockWaitTime() {
return bridge.getTotalLockWaitTime();
}
private int getTotalNumberOfLockService() {
return bridge.getTotalNumberOfLockService();
}
private int getTotalNumberOfGrantors() {
return bridge.getTotalNumberOfGrantors();
}
private int getTotalDiskTasksWaiting() {
return bridge.getTotalDiskTasksWaiting();
}
private int getTotalRegionCount() {
return bridge.getTotalRegionCount();
}
private int getTotalRegionEntryCount() {
return bridge.getTotalRegionEntryCount();
}
private int getTotalTransactionsCount() {
return bridge.getTotalTransactionsCount();
}
private long getTransactionCommitsAvgLatency() {
return bridge.getTransactionCommitsAvgLatency();
}
private float getTransactionCommitsRate() {
return bridge.getTransactionCommitsRate();
}
private int getTransactionCommittedTotalCount() {
return bridge.getTransactionCommittedTotalCount();
}
private int getTransactionRolledBackTotalCount() {
return bridge.getTransactionRolledBackTotalCount();
}
}