blob: efce1990773e467e060e4b5033ffbbb603237bd5 [file] [log] [blame]
/*
* =========================================================================
* Copyright (c) 2002-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
* more patents listed at http://www.pivotal.io/patents.
* ========================================================================
*/
package com.gemstone.gemfire.management.internal.beans;
import java.util.Set;
import com.gemstone.gemfire.cache.PartitionAttributes;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.internal.cache.BucketRegion;
import com.gemstone.gemfire.internal.cache.PartitionedRegion;
import com.gemstone.gemfire.internal.cache.PartitionedRegionStats;
import com.gemstone.gemfire.management.FixedPartitionAttributesData;
import com.gemstone.gemfire.management.PartitionAttributesData;
import com.gemstone.gemfire.management.internal.ManagementConstants;
import com.gemstone.gemfire.management.internal.beans.stats.MBeanStatsMonitor;
import com.gemstone.gemfire.management.internal.beans.stats.StatType;
import com.gemstone.gemfire.management.internal.beans.stats.StatsAverageLatency;
import com.gemstone.gemfire.management.internal.beans.stats.StatsKey;
import com.gemstone.gemfire.management.internal.beans.stats.StatsLatency;
import com.gemstone.gemfire.management.internal.beans.stats.StatsRate;
/**
*
* @author rishim
*/
public class PartitionedRegionBridge<K, V> extends RegionMBeanBridge<K, V> {
private PartitionedRegionStats prStats;
private PartitionedRegion parRegion;
private PartitionAttributesData partitionAttributesData;
private FixedPartitionAttributesData[] fixedPartitionAttributesTable;
private int configuredRedundancy = -1;
private MBeanStatsMonitor parRegionMonitor;
private StatsRate putAllRate;
private StatsRate putRequestRate;
private StatsRate getRequestRate;
private StatsRate createsRate;
private StatsRate destroysRate;
private StatsRate putLocalRate;
private StatsRate putRemoteRate;
private StatsLatency putRemoteLatency;
private StatsRate averageWritesRate;
private StatsRate averageReadsRate;
private StatsAverageLatency remotePutAvgLatency;
public static final String PAR_REGION_MONITOR = "PartitionedRegionMonitor";
public static <K, V> PartitionedRegionBridge<K, V> getInstance(Region<K, V> region) {
if (region.getAttributes().getDataPolicy().withHDFS()) {
PartitionedRegionBridge<K, V> bridge = new HDFSRegionBridge<K, V>(region);
return bridge;
} else {
return new PartitionedRegionBridge<K, V> (region);
}
}
protected PartitionedRegionBridge(Region<K, V> region) {
super(region);
this.parRegion = (PartitionedRegion)region;
this.prStats = parRegion.getPrStats();
PartitionAttributes<K, V> partAttrs = parRegion.getPartitionAttributes();
this.parRegionMonitor = new MBeanStatsMonitor(PAR_REGION_MONITOR);
this.configurePartitionRegionMetrics();
this.configuredRedundancy = partAttrs.getRedundantCopies();
this.partitionAttributesData = RegionMBeanCompositeDataFactory.getPartitionAttributesData(partAttrs);
if (partAttrs.getFixedPartitionAttributes() != null) {
this.fixedPartitionAttributesTable = RegionMBeanCompositeDataFactory.getFixedPartitionAttributesData(partAttrs);
}
parRegionMonitor.addStatisticsToMonitor(prStats.getStats());
}
// Dummy constructor for testing purpose only
public PartitionedRegionBridge(PartitionedRegionStats prStats) {
this.prStats = prStats;
this.parRegionMonitor = new MBeanStatsMonitor(PAR_REGION_MONITOR);
parRegionMonitor.addStatisticsToMonitor(prStats.getStats());
configurePartitionRegionMetrics();
}
private Number getPrStatistic(String statName) {
if (prStats != null) {
return prStats.getStats().get(statName);
} else {
return ManagementConstants.ZERO;
}
}
public void stopMonitor(){
super.stopMonitor();
parRegionMonitor.stopListener();
}
private void configurePartitionRegionMetrics() {
putAllRate = new StatsRate(StatsKey.PUTALL_COMPLETED, StatType.INT_TYPE, parRegionMonitor);
putRequestRate = new StatsRate(StatsKey.PUTS_COMPLETED, StatType.INT_TYPE, parRegionMonitor);
getRequestRate = new StatsRate(StatsKey.GETS_COMPLETED, StatType.INT_TYPE, parRegionMonitor);
destroysRate = new StatsRate(StatsKey.DESTROYS_COMPLETED, StatType.INT_TYPE, parRegionMonitor);
createsRate = new StatsRate(StatsKey.CREATES_COMPLETED, StatType.INT_TYPE, parRegionMonitor);
// Remote Reads Only in case of partitioned Region
putRemoteRate = new StatsRate(StatsKey.REMOTE_PUTS, StatType.INT_TYPE, parRegionMonitor);
putLocalRate = new StatsRate(StatsKey.PUT_LOCAL, StatType.INT_TYPE, parRegionMonitor);
remotePutAvgLatency = new StatsAverageLatency(StatsKey.REMOTE_PUTS, StatType.INT_TYPE, StatsKey.REMOTE_PUT_TIME,
parRegionMonitor);
putRemoteLatency = new StatsLatency(StatsKey.REMOTE_PUTS, StatType.INT_TYPE, StatsKey.REMOTE_PUT_TIME,
parRegionMonitor);
String[] writesRates = new String[] { StatsKey.PUTALL_COMPLETED, StatsKey.PUTS_COMPLETED, StatsKey.CREATES_COMPLETED };
averageWritesRate = new StatsRate(writesRates, StatType.INT_TYPE, parRegionMonitor);
averageReadsRate = new StatsRate(StatsKey.GETS_COMPLETED, StatType.INT_TYPE, parRegionMonitor);
}
@Override
public float getAverageReads() {
return averageReadsRate.getRate();
}
@Override
public float getAverageWrites() {
return averageWritesRate.getRate();
}
@Override
public float getCreatesRate() {
return createsRate.getRate();
}
@Override
public float getPutAllRate() {
return putAllRate.getRate();
}
@Override
public float getPutsRate() {
return putRequestRate.getRate();
}
@Override
public float getDestroyRate() {
return destroysRate.getRate();
}
@Override
public float getGetsRate() {
return getRequestRate.getRate();
}
@Override
public int getActualRedundancy() {
return getPrStatistic(StatsKey.ACTUAL_REDUNDANT_COPIES).intValue();
}
@Override
public int getAvgBucketSize() {
return ManagementConstants.NOT_AVAILABLE_INT;
}
@Override
public int getBucketCount() {
return getPrStatistic(StatsKey.BUCKET_COUNT).intValue();
}
@Override
public int getConfiguredRedundancy() {
return configuredRedundancy;
}
@Override
public int getNumBucketsWithoutRedundancy() {
return getPrStatistic(StatsKey.LOW_REDUNDANCYBUCKET_COUNT).intValue();
}
@Override
public int getPrimaryBucketCount() {
return getPrStatistic(StatsKey.PRIMARY_BUCKET_COUNT).intValue();
}
@Override
public int getTotalBucketSize() {
return getPrStatistic(StatsKey.TOTAL_BUCKET_SIZE).intValue();
}
@Override
public PartitionAttributesData listPartitionAttributes() {
return partitionAttributesData;
}
@Override
public FixedPartitionAttributesData[] listFixedPartitionAttributes() {
return fixedPartitionAttributesTable;
}
@Override
public long getEntrySize() {
if (parRegion.isDataStore()) {
return getPrStatistic(StatsKey.DATA_STORE_BYTES_IN_USE).longValue();
} else {
return ManagementConstants.ZERO;
}
}
@Override
public long getHitCount() {
return ManagementConstants.NOT_AVAILABLE_LONG;
}
@Override
public float getHitRatio() {
return ManagementConstants.NOT_AVAILABLE_FLOAT;
}
@Override
public long getLastAccessedTime() {
return ManagementConstants.NOT_AVAILABLE_LONG;
}
@Override
public long getLastModifiedTime() {
return ManagementConstants.NOT_AVAILABLE_LONG;
}
@Override
public long getPutRemoteAvgLatency() {
return remotePutAvgLatency.getAverageLatency();
}
@Override
public long getPutRemoteLatency() {
return putRemoteLatency.getLatency();
}
@Override
public float getPutLocalRate() {
return putLocalRate.getRate();
}
@Override
public float getPutRemoteRate() {
return putRemoteRate.getRate();
}
/**
* partition region entry count is taken from all primary bucket entry count.
* Ideally it should come from stats.
* to be done in 8.0
* @return long
*/
@Override
public long getEntryCount() {
if (parRegion.isDataStore()) {
int numLocalEntries = 0;
Set<BucketRegion> localPrimaryBucketRegions = parRegion.getDataStore().getAllLocalPrimaryBucketRegions();
if (localPrimaryBucketRegions != null && localPrimaryBucketRegions.size() > 0) {
for (BucketRegion br : localPrimaryBucketRegions) {
// TODO soplog, fix this for griddb regions
numLocalEntries += br.getRegionMap().sizeInVM() - br.getTombstoneCount();
}
}
return numLocalEntries;
} else {
return ManagementConstants.ZERO;
}
}
public int getLocalMaxMemory() {
return partitionAttributesData.getLocalMaxMemory();
}
public long getEstimatedSizeForHDFSRegion() {
return -1;
}
}