blob: faa05378cbddecd2bbfa2b0da695f084e675e733 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.admin;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.geode.cache.CacheListener;
import org.apache.geode.cache.CacheLoader;
import org.apache.geode.cache.CacheWriter;
import org.apache.geode.cache.RegionAttributes;
/**
* Presents an amalgam snapshot of all the {@linkplain org.apache.geode.cache.Region regions} in a
* distributed system.
*/
public class CompoundRegionSnapshot implements RegionSnapshot {
private static final long serialVersionUID = 6295026394298398004L;
/** The name of the Region */
private String name;
// private String constraintClass;
private long lastModifiedTime = 0L; // the lates modified time
private long lastAccessTime = 0L; // the latest access time
private long numHits = 0L; // sum of all hits
private long numMisses = 0L; // sum of all misses
private float hitRatio = 0f; // calculated from all
private long hitResponders = 0;
private double hitRatioSum = 0.0;
// private int entryCount = 0; //largest entryCount
// private int subregionCount = 0; //largest subregionCount
// private Map individuals = new HashMap();
private Set allCapControllers = new HashSet();
private Set allListeners = new HashSet();
private Set allDataPolicies = new HashSet();
private Set allRegionTtl = new HashSet();
private Set allEntryTtl = new HashSet();
private HashSet allCustomTtl = new HashSet();
private Set allRegionIdleTimeout = new HashSet();
private Set allEntryIdleTimeout = new HashSet();
private HashSet allCustomIdle = new HashSet();
private Set allScopes = new HashSet();
private Set allUserAttributes = new HashSet();
private Set allCacheLoaders = new HashSet();
private Set allCacheWriters = new HashSet();
private Set allLoadFactors = new HashSet();
private Set allInitialCaps = new HashSet();
private Set allConcLevels = new HashSet();
private Set allStatsEnabled = new HashSet();
private Set allKeyConstraints = new HashSet();
private Set allValueConstraints = new HashSet();
/**
* Creates a new <code>CompoundRegionSnapshot</code> for the region with the given name.
*/
public CompoundRegionSnapshot(String regionName) {
this.name = regionName;
}
/**
* Amalgamates a <code>RegionSnapshot</code> into this <code>CompoundRegionSnapshot</code>.
*
* @param systemEntity The member of the distributed system that sent the snapshot
* @param snap The snapshot to be amalgamated
*
* @throws IllegalArgumentException If <code>snap</code> is for a <code>Region</code> other than
* the one amalgamated by this snapshot.
*/
public void addCache(GemFireVM systemEntity, RegionSnapshot snap) {
if (!snap.getName().equals(this.name)) {
throw new IllegalArgumentException(
"All snapshots in a compound snapshot must have the same name");
}
// individuals.put(systemEntity, snap);
RegionAttributes ra = snap.getAttributes();
if (ra != null) {
CacheListener listener = ra.getCacheListener();
if (listener != null) {
allListeners.add(listener.toString());
}
CacheWriter writer = ra.getCacheWriter();
if (writer != null) {
allCacheWriters.add(writer.toString());
}
CacheLoader loader = ra.getCacheLoader();
if (loader != null) {
allCacheLoaders.add(loader);
}
allDataPolicies.add(ra.getDataPolicy());
allRegionTtl.add(ra.getRegionTimeToLive());
allEntryTtl.add(ra.getEntryTimeToLive());
allCustomTtl.add(ra.getCustomEntryTimeToLive().toString());
allRegionIdleTimeout.add(ra.getRegionIdleTimeout());
allEntryIdleTimeout.add(ra.getEntryIdleTimeout());
allCustomIdle.add(ra.getCustomEntryIdleTimeout().toString());
allScopes.add(ra.getScope());
allLoadFactors.add(new Float(ra.getLoadFactor()));
allInitialCaps.add(Integer.valueOf(ra.getInitialCapacity()));
allConcLevels.add(Integer.valueOf(ra.getConcurrencyLevel()));
allStatsEnabled.add(Boolean.valueOf(ra.getStatisticsEnabled()));
allUserAttributes.add(snap.getUserAttribute());
allKeyConstraints.add(ra.getKeyConstraint());
allValueConstraints.add(ra.getValueConstraint());
// if (constraintClass == null) {
// Class clazz = ra.getKeyConstraint();
// if (clazz != null) {
// constraintClass = clazz.getName();
// }
// }
}
long modified = snap.getLastModifiedTime();
if (modified > 0 && modified > this.lastModifiedTime) {
this.lastModifiedTime = modified;
}
long access = snap.getLastAccessTime();
if (access > 0 && access > this.lastAccessTime) {
this.lastAccessTime = access;
}
long hitCount = snap.getNumberOfHits();
if (hitCount > 0) {
this.numHits += hitCount;
}
long missCount = snap.getNumberOfMisses();
if (missCount > 0) {
this.numMisses += missCount;
}
float hitRatio = snap.getHitRatio();
if (hitRatio >= 0.00) {
hitResponders++;
hitRatioSum += hitRatio;
this.hitRatio = (float) (hitRatioSum / hitResponders);
}
}
/**
* Returns the name of the <code>Region</code> whose information is amalgamated in this snapshot.
*/
@Override
public Object getName() {
return this.name;
}
/**
* Since a compound snapshot does not have <code>RegionAttributes</code>, this method returns
* <code>null</code>.
*/
@Override
public RegionAttributes getAttributes() {
return null;
}
/**
* Since a compound snapshot does not have a <code>userAttributes</code>, this method returns
* <code>null</code>.
*/
@Override
public Object getUserAttribute() {
return null;
}
/**
* Since a compound snapshot does not really represent a <code>Region</code>, this method returns
* <code>false</code>.
*/
public boolean isShared() {
return false;
}
/**
* Returns an {@link java.util.Iterator} of {@link java.lang.String}
*/
public Iterator getAllCapacityControllers() {
return allCapControllers.iterator();
}
/**
* Returns an {@link java.util.Iterator} of {@link java.lang.String}
*/
public Iterator getAllListeners() {
return allListeners.iterator();
}
/**
* Returns an <code>Iterator</code> containing the <code>toString</code> of the
* <code>CacheWriter</code>s of each instance of this snapshot's <code>region</code>
*/
public Iterator getAllCacheWriters() {
return allCacheWriters.iterator();
}
/**
* Returns an <code>Iterator</code> containing the <code>toString</code> of the
* <code>CacheLoader</code>s of each instance of this snapshot's <code>region</code>
*/
public Iterator getAllCacheLoaders() {
return allCacheLoaders.iterator();
}
/**
* Returns an {@link java.util.Iterator} of {@link org.apache.geode.cache.DataPolicy}
*/
public Iterator getAllDataPolicies() {
return allDataPolicies.iterator();
}
/**
* Returns an {@link java.util.Iterator} of {@link org.apache.geode.cache.ExpirationAttributes}
*/
public Iterator getAllRegionTtl() {
return allRegionTtl.iterator();
}
/**
* Returns an {@link java.util.Iterator} of {@link org.apache.geode.cache.ExpirationAttributes}
*/
public Iterator getAllEntryTtl() {
return allEntryTtl.iterator();
}
/**
* Returns an <code>Iterator</code> containing the <code>toString</code> of the custom TTL
* CustomExpiry's of each instance of this snapshot's <code>region</code>
*/
public Iterator getAllCustomTtl() {
return allCustomTtl.iterator();
}
/**
* Returns an {@link java.util.Iterator} of {@link org.apache.geode.cache.ExpirationAttributes}
*/
public Iterator getAllRegionIdleTimeout() {
return allRegionIdleTimeout.iterator();
}
/**
* Returns an {@link java.util.Iterator} of {@link org.apache.geode.cache.ExpirationAttributes}
*/
public Iterator getAllEntryIdleTimeout() {
return allEntryIdleTimeout.iterator();
}
/**
* Returns an <code>Iterator</code> containing the <code>toString</code> of the custom idleTimeout
* CustomExpiry's of each instance of this snapshot's <code>region</code>
*/
public Iterator getAllCustomIdleTimeout() {
return allCustomIdle.iterator();
}
/**
* Returns an {@link java.util.Iterator} of {@link org.apache.geode.cache.Scope}
*/
public Iterator getAllScopes() {
return allScopes.iterator();
}
/**
* Returns an {@link java.util.Iterator} of float
*/
public Iterator getAllLoadFactors() {
return allLoadFactors.iterator();
}
/**
* Returns an {@link java.util.Iterator} of int
*/
public Iterator getAllInitialCapacities() {
return allInitialCaps.iterator();
}
/**
* Returns an {@link java.util.Iterator} of int
*/
public Iterator getAllConcurrencyLevels() {
return allConcLevels.iterator();
}
/**
* Returns an {@link java.util.Iterator} of <code>Boolean</code> - which may be silly
*/
public Iterator getAllStatsEnabled() {
return allStatsEnabled.iterator();
}
/**
* Returns an <code>Iterator</code> of the <code>userAttribute</code>s (as <code>Objects</code>s)
* over all instances of this snapshot's <code>Region</code>.
*/
public Iterator getAllUserAttributes() {
return allUserAttributes.iterator();
}
/**
* Returns an <code>Iterator</code> of the <code>keyConstraint</code>s (as <code>String</code>s)
* over all instances of this snapshot's <code>Region</code>.
*/
public Iterator getAllKeyConstraint() {
return allKeyConstraints.iterator();
}
/**
* Returns an <code>Iterator</code> of the <code>valueConstraint</code>s (as <code>String</code>s)
* over all instances of this snapshot's <code>Region</code>.
*/
public Iterator getAllValueConstraint() {
return allValueConstraints.iterator();
}
/**
* Returns the most recent <code>lastModifiedTime</code> of any instance of this snapshot's
* <code>Region</code> across the distributed system.
*/
@Override
public long getLastModifiedTime() {
return this.lastModifiedTime;
}
/**
* Returns the most recent <code>lastAccessTime</code> of any instance of this snapshot's
* <code>Region</code> across the distributed system.
*/
@Override
public long getLastAccessTime() {
return this.lastAccessTime;
}
/**
* Returns the cumulative number of hits across all instances of the snapshot's
* <code>Region</code>.
*/
@Override
public long getNumberOfHits() {
return this.numHits;
}
/**
* Returns the cumulative number of misses across all instances of this snapshot's
* <code>Region</code>.
*/
@Override
public long getNumberOfMisses() {
return this.numMisses;
}
/**
* Returns the aggregate hit ratio across all instances of this snapshot's <code>Region</code>.
*/
@Override
public float getHitRatio() {
return this.hitRatio;
}
}