ignite-37 Improve offheap metrics for cache
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/3faca824 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/3faca824 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/3faca824 Branch: refs/heads/ignite-37 Commit: 3faca8244b393532ae64763fc39a6734a73cad2f Parents: 6f1d642 Author: agura <ag...@gridgain.com> Authored: Thu Apr 30 20:53:53 2015 +0300 Committer: agura <ag...@gridgain.com> Committed: Wed May 6 20:06:34 2015 +0300 ---------------------------------------------------------------------- .../org/apache/ignite/cache/CacheMetrics.java | 124 +++++++-- .../processors/cache/CacheMetricsImpl.java | 162 ++++++++++- .../cache/CacheMetricsMXBeanImpl.java | 55 ++++ .../processors/cache/CacheMetricsSnapshot.java | 272 ++++++++++++++----- .../processors/cache/GridCacheSwapManager.java | 75 ++--- .../offheap/GridOffHeapProcessor.java | 95 ++++--- .../ignite/mxbean/CacheMetricsMXBean.java | 44 +++ 7 files changed, 640 insertions(+), 187 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3faca824/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java b/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java index 0d87326..e732d29 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java @@ -30,21 +30,21 @@ public interface CacheMetrics { /** * The number of get requests that were satisfied by the cache. * - * @return the number of hits + * @return The number of hits. */ public long getCacheHits(); /** * This is a measure of cache efficiency. * - * @return the percentage of successful hits, as a decimal e.g 75. + * @return The percentage of successful hits, as a decimal e.g 75. */ public float getCacheHitPercentage(); /** * A miss is a get request that is not satisfied. * - * @return the number of misses + * @return The number of misses. */ public long getCacheMisses(); @@ -52,7 +52,7 @@ public interface CacheMetrics { * Returns the percentage of cache accesses that did not find a requested entry * in the cache. * - * @return the percentage of accesses that failed to find anything + * @return The percentage of accesses that failed to find anything. */ public float getCacheMissPercentage(); @@ -60,14 +60,14 @@ public interface CacheMetrics { * The total number of requests to the cache. This will be equal to the sum of * the hits and misses. * - * @return the number of gets + * @return The number of gets. */ public long getCacheGets(); /** * The total number of puts to the cache. * - * @return the number of puts + * @return The number of puts. */ public long getCachePuts(); @@ -75,7 +75,7 @@ public interface CacheMetrics { * The total number of removals from the cache. This does not include evictions, * where the cache itself initiates the removal to make space. * - * @return the number of removals + * @return The number of removals. */ public long getCacheRemovals(); @@ -84,28 +84,28 @@ public interface CacheMetrics { * initiated by the cache itself to free up space. An eviction is not treated as * a removal and does not appear in the removal counts. * - * @return the number of evictions + * @return The number of evictions. */ public long getCacheEvictions(); /** * The mean time to execute gets. * - * @return the time in µs + * @return The time in µs. */ public float getAverageGetTime(); /** * The mean time to execute puts. * - * @return the time in µs + * @return The time in µs. */ public float getAveragePutTime(); /** * The mean time to execute removes. * - * @return the time in µs + * @return The time in µs. */ public float getAverageRemoveTime(); @@ -113,7 +113,7 @@ public interface CacheMetrics { /** * The mean time to execute tx commit. * - * @return the time in µs + * @return The time in µs. */ public float getAverageTxCommitTime(); @@ -124,7 +124,6 @@ public interface CacheMetrics { */ public float getAverageTxRollbackTime(); - /** * Gets total number of transaction commits. * @@ -154,6 +153,62 @@ public interface CacheMetrics { public long getOverflowSize(); /** + * The total number of get requests to the off-heap memory. + * + * @return The number of gets. + */ + public long getOffHeapGets(); + + /** + * The total number of put requests to the off-heap memory. + * + * @return The number of puts. + */ + public long getOffHeapPuts(); + + /** + * The total number of removals from the off-heap memory. This does not include evictions. + * + * @return The number of removals. + */ + public long getOffHeapRemovals(); + + /** + * The total number of evictions from the off-heap memory. + * + * @return The number of evictions. + */ + public long getOffHeapEvictions(); + + /** + * The number of get requests that were satisfied by the off-heap memory. + * + * @return The off-heap hits number. + */ + public long getOffHeapHits(); + + /** + * Gets the percentage of hits on off-heap memory. + * + * @return The percentage of hits on off-heap memory. + */ + public float getOffHeapHitPercentage(); + + /** + * A miss is a get request that is not satisfied by off-heap memory. + * + * @return The off-heap misses number. + */ + public long getOffHeapMisses(); + + /** + * Gets the percentage of misses on off-heap memory. + * + * @return The percentage of misses on off-heap memory. + */ + public float getOffHeapMissPercentage(); + + /** * Gets number of entries stored in off-heap memory. * * @return Number of entries stored in off-heap memory. @@ -161,6 +216,20 @@ public interface CacheMetrics { public long getOffHeapEntriesCount(); /** + * Gets number of primary entries stored in off-heap memory. + * + * @return Number of primary entries stored in off-heap memory. + */ + public long getOffHeapPrimaryEntriesCount(); + + /** + * Gets number of backup entries stored in off-heap memory. + * + * @return Number of backup entries stored in off-heap memory. + */ + public long getOffHeapBackupEntriesCount(); + + /** * Gets memory size allocated in off-heap. * * @return Memory size allocated in off-heap. @@ -168,6 +237,13 @@ public interface CacheMetrics { public long getOffHeapAllocatedSize(); /** + * Gets off-heap memory maximum size. + * + * @return Off-heap memory maximum size. + */ + public long getOffHeapMaxSize(); + + /** * Gets number of non-{@code null} values in the cache. * * @return Number of non-{@code null} values in the cache. @@ -184,7 +260,7 @@ public interface CacheMetrics { /** * Returns {@code true} if this cache is empty. * - * @return {@code true} if this cache is empty. + * @return {@code True} if this cache is empty. */ public boolean isEmpty(); @@ -294,7 +370,7 @@ public interface CacheMetrics { public int getTxDhtRolledbackVersionsSize(); /** - * Returns {@code True} if write-behind is enabled. + * Returns {@code true} if write-behind is enabled. * * @return {@code True} if write-behind is enabled. */ @@ -372,16 +448,16 @@ public interface CacheMetrics { /** * Determines the required type of keys for this {@link Cache}, if any. * - * @return the fully qualified class name of the key type, - * or "java.lang.Object" if the type is undefined. + * @return The fully qualified class name of the key type, + * or {@code "java.lang.Object"} if the type is undefined. */ public String getKeyType(); /** * Determines the required type of values for this {@link Cache}, if any. * - * @return the fully qualified class name of the value type, - * or "java.lang.Object" if the type is undefined. + * @return The fully qualified class name of the value type, + * or {@code "java.lang.Object"} if the type is undefined. */ public String getValueType(); @@ -407,7 +483,7 @@ public interface CacheMetrics { * <p> * The default value is {@code true}. * - * @return true if the cache is store by value + * @return {@code True} if the cache is store by value. */ public boolean isStoreByValue(); @@ -416,7 +492,7 @@ public interface CacheMetrics { * <p> * The default value is {@code false}. * - * @return true if statistics collection is enabled + * @return {@code True} if statistics collection is enabled. */ public boolean isStatisticsEnabled(); @@ -425,7 +501,7 @@ public interface CacheMetrics { * <p> * The default value is {@code false}. * - * @return true if management is enabled + * @return {@code true} if management is enabled. */ public boolean isManagementEnabled(); @@ -434,7 +510,7 @@ public interface CacheMetrics { * <p> * The default value is {@code false} * - * @return {@code true} when a {@link Cache} is in + * @return {@code True} when a {@link Cache} is in * "read-through" mode. * @see CacheLoader */ @@ -448,7 +524,7 @@ public interface CacheMetrics { * <p> * The default value is {@code false} * - * @return {@code true} when a {@link Cache} is in "write-through" mode. + * @return {@code True} when a {@link Cache} is in "write-through" mode. * @see CacheWriter */ public boolean isWriteThrough(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3faca824/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java index 560de97..c0cbf4b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java @@ -25,6 +25,8 @@ import org.apache.ignite.internal.util.typedef.internal.*; import java.util.concurrent.atomic.*; +import static org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion.*; + /** * Adapter for cache metrics. */ @@ -63,7 +65,7 @@ public class CacheMetricsImpl implements CacheMetrics { private AtomicLong getTimeNanos = new AtomicLong(); /** Remove time taken nanos. */ - private AtomicLong removeTimeNanos = new AtomicLong(); + private AtomicLong rmvTimeNanos = new AtomicLong(); /** Commit transaction time taken nanos. */ private AtomicLong commitTimeNanos = new AtomicLong(); @@ -71,6 +73,24 @@ public class CacheMetricsImpl implements CacheMetrics { /** Commit transaction time taken nanos. */ private AtomicLong rollbackTimeNanos = new AtomicLong(); + /** Number of reads from off-heap memory. */ + private AtomicLong offHeapGets = new AtomicLong(); + + /** Number of writes to off-heap memory. */ + private AtomicLong offHeapPuts = new AtomicLong(); + + /** Number of removed entries from off-heap memory. */ + private AtomicLong offHeapRemoves = new AtomicLong(); + + /** Number of evictions from off-heap memory. */ + private AtomicLong offHeapEvicts = new AtomicLong(); + + /** Number of off-heap hits. */ + private AtomicLong offHeapHits = new AtomicLong(); + + /** Number of off-heap misses. */ + private AtomicLong offHeapMisses = new AtomicLong(); + /** Cache metrics. */ @GridToStringExclude private transient CacheMetricsImpl delegate; @@ -126,16 +146,93 @@ public class CacheMetricsImpl implements CacheMetrics { } /** {@inheritDoc} */ + @Override public long getOffHeapGets() { + return offHeapGets.get(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapPuts() { + return offHeapPuts.get(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapRemovals() { + return offHeapRemoves.get(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapEvictions() { + return offHeapEvicts.get(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapHits() { + return offHeapHits.get(); + } + + /** {@inheritDoc} */ + @Override public float getOffHeapHitPercentage() { + long hits0 = offHeapHits.get(); + long gets0 = offHeapGets.get(); + + if (hits0 == 0) + return 0; + + return (float) hits0 / gets0 * 100.0f; + } + + /** {@inheritDoc} */ + @Override public long getOffHeapMisses() { + return offHeapMisses.get(); + } + + /** {@inheritDoc} */ + @Override public float getOffHeapMissPercentage() { + long misses0 = offHeapMisses.get(); + long reads0 = offHeapGets.get(); + + if (misses0 == 0) + return 0; + + return (float) misses0 / reads0 * 100.0f; + } + + /** {@inheritDoc} */ @Override public long getOffHeapEntriesCount() { return cctx.cache().offHeapEntriesCount(); } /** {@inheritDoc} */ + @Override public long getOffHeapPrimaryEntriesCount() { + try { + return cctx.swap().offheapEntriesCount(true, false, NONE); + } + catch (IgniteCheckedException e) { + return 0; + } + } + + /** {@inheritDoc} */ + @Override public long getOffHeapBackupEntriesCount() { + try { + return cctx.swap().offheapEntriesCount(false, true, NONE); + } + catch (IgniteCheckedException e) { + return 0; + } + } + + /** {@inheritDoc} */ @Override public long getOffHeapAllocatedSize() { return cctx.cache().offHeapAllocatedSize(); } /** {@inheritDoc} */ + @Override public long getOffHeapMaxSize() { + return cctx.config().getOffHeapMaxMemory(); + } + + /** {@inheritDoc} */ @Override public int getSize() { return cctx.cache().size(); } @@ -317,11 +414,18 @@ public class CacheMetricsImpl implements CacheMetrics { txCommits.set(0); txRollbacks.set(0); putTimeNanos.set(0); - removeTimeNanos.set(0); + rmvTimeNanos.set(0); getTimeNanos.set(0); commitTimeNanos.set(0); rollbackTimeNanos.set(0); + offHeapGets.set(0); + offHeapPuts.set(0); + offHeapRemoves.set(0); + offHeapHits.set(0); + offHeapMisses.set(0); + offHeapEvicts.set(0); + if (delegate != null) delegate.clear(); } @@ -402,7 +506,7 @@ public class CacheMetricsImpl implements CacheMetrics { /** {@inheritDoc} */ @Override public float getAverageRemoveTime() { - long timeNanos = removeTimeNanos.get(); + long timeNanos = rmvTimeNanos.get(); long removesCnt = rmCnt.get(); if (timeNanos == 0 || removesCnt == 0) @@ -483,7 +587,6 @@ public class CacheMetricsImpl implements CacheMetrics { delegate.onTxRollback(duration); } - /** * Increments the get time accumulator. * @@ -514,7 +617,7 @@ public class CacheMetricsImpl implements CacheMetrics { * @param duration the time taken in nanoseconds. */ public void addRemoveTimeNanos(long duration) { - removeTimeNanos.addAndGet(duration); + rmvTimeNanos.addAndGet(duration); if (delegate != null) delegate.addRemoveTimeNanos(duration); @@ -526,7 +629,7 @@ public class CacheMetricsImpl implements CacheMetrics { * @param duration the time taken in nanoseconds. */ public void addRemoveAndGetTimeNanos(long duration) { - removeTimeNanos.addAndGet(duration); + rmvTimeNanos.addAndGet(duration); getTimeNanos.addAndGet(duration); if (delegate != null) @@ -581,6 +684,53 @@ public class CacheMetricsImpl implements CacheMetrics { return cctx.config().isManagementEnabled(); } + /** + * Off-heap read callback. + * + * @param hit Hit or miss flag. + */ + public void onOffHeapRead(boolean hit) { + offHeapGets.incrementAndGet(); + + if (hit) + offHeapHits.incrementAndGet(); + else + offHeapMisses.incrementAndGet(); + + if (delegate != null) + delegate.onOffHeapRead(hit); + } + + /** + * Off-heap write callback. + */ + public void onOffHeapWrite() { + offHeapPuts.incrementAndGet(); + + if (delegate != null) + delegate.onWrite(); + } + + /** + * Off-heap remove callback. + */ + public void onOffHeapRemove() { + offHeapRemoves.incrementAndGet(); + + if (delegate != null) + delegate.onOffHeapRemove(); + } + + /** + * Off-heap evict callback. + */ + public void onOffHeapEvict() { + offHeapEvicts.incrementAndGet(); + + if (delegate != null) + delegate.onOffHeapRemove(); + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(CacheMetricsImpl.class, this); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3faca824/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsMXBeanImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsMXBeanImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsMXBeanImpl.java index e9d547c..127177c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsMXBeanImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsMXBeanImpl.java @@ -49,16 +49,71 @@ class CacheMetricsMXBeanImpl implements CacheMetricsMXBean { } /** {@inheritDoc} */ + @Override public long getOffHeapGets() { + return cache.metrics0().getOffHeapGets(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapPuts() { + return cache.metrics0().getOffHeapPuts(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapRemovals() { + return cache.metrics0().getOffHeapRemovals(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapEvictions() { + return cache.metrics0().getOffHeapEvictions(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapHits() { + return cache.metrics0().getOffHeapHits(); + } + + /** {@inheritDoc} */ + @Override public float getOffHeapHitPercentage() { + return cache.metrics0().getOffHeapHitPercentage(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapMisses() { + return cache.metrics0().getOffHeapMisses(); + } + + /** {@inheritDoc} */ + @Override public float getOffHeapMissPercentage() { + return cache.metrics0().getOffHeapMissPercentage(); + } + + /** {@inheritDoc} */ @Override public long getOffHeapEntriesCount() { return cache.metrics0().getOffHeapEntriesCount(); } /** {@inheritDoc} */ + @Override public long getOffHeapPrimaryEntriesCount() { + return cache.metrics0().getOffHeapPrimaryEntriesCount(); + } + + /** {@inheritDoc} */ + @Override public long getOffHeapBackupEntriesCount() { + return cache.metrics0().getOffHeapBackupEntriesCount(); + } + + /** {@inheritDoc} */ @Override public long getOffHeapAllocatedSize() { return cache.metrics0().getOffHeapAllocatedSize(); } /** {@inheritDoc} */ + @Override public long getOffHeapMaxSize() { + return cache.metrics0().getOffHeapMaxSize(); + } + + /** {@inheritDoc} */ @Override public int getSize() { return cache.metrics0().getSize(); } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3faca824/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java index 4fe152a..34f2f84 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java @@ -61,7 +61,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { private float getAvgTimeNanos = 0; /** Remove time taken nanos. */ - private float removeAvgTimeNanos = 0; + private float rmvAvgTimeNanos = 0; /** Commit transaction time taken nanos. */ private float commitAvgTimeNanos = 0; @@ -75,12 +75,39 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { /** Number of entries that was swapped to disk. */ private long overflowSize; + /** Number of reads from off-heap. */ + private long offHeapGets; + + /** Number of writes to off-heap. */ + private long offHeapPuts; + + /** Number of removed entries from off-heap. */ + private long offHeapRemoves; + + /** Number of evictions from off-heap. */ + private long offHeapEvicts; + + /** Off-heap hits number. */ + private long offHeapHits; + + /** Off-heap misses number. */ + private long offHeapMisses; + /** Number of entries stored in off-heap memory. */ - private long offHeapEntriesCount; + private long offHeapEntriesCnt; + + /** Number of primary entries stored in off-heap memory. */ + private long offHeapPrimaryEntriesCnt; + + /** Number of backup entries stored in off-heap memory. */ + private long offHeapBackupEntriesCnt; /** Memory size allocated in off-heap. */ private long offHeapAllocatedSize; + /** Off-heap memory maximum size*/ + private long offHeapMaxSize; + /** Number of non-{@code null} values in the cache. */ private int size; @@ -91,7 +118,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { private boolean isEmpty; /** Gets current size of evict queue used to batch up evictions. */ - private int dhtEvictQueueCurrentSize; + private int dhtEvictQueueCurrSize; /** Transaction per-thread map size. */ private int txThreadMapSize; @@ -106,7 +133,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { private int txPrepareQueueSize; /** Start version counts map size. */ - private int txStartVersionCountsSize; + private int txStartVerCountsSize; /** Number of cached committed transaction IDs. */ private int txCommittedVersionsSize; @@ -127,7 +154,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { private int txDhtPrepareQueueSize; /** DHT start version counts map size. */ - private int txDhtStartVersionCountsSize; + private int txDhtStartVerCountsSize; /** Number of cached committed DHT transaction IDs. */ private int txDhtCommittedVersionsSize; @@ -142,34 +169,34 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { private int writeBehindFlushSize; /** Count of worker threads. */ - private int writeBehindFlushThreadCount; + private int writeBehindFlushThreadCnt; /** Flush frequency in milliseconds. */ - private long writeBehindFlushFrequency; + private long writeBehindFlushFreq; /** Maximum size of batch. */ private int writeBehindStoreBatchSize; /** Count of cache overflow events since start. */ - private int writeBehindTotalCriticalOverflowCount; + private int writeBehindTotalCriticalOverflowCnt; /** Count of cache overflow events since start. */ - private int writeBehindCriticalOverflowCount; + private int writeBehindCriticalOverflowCnt; /** Count of entries in store-retry state. */ - private int writeBehindErrorRetryCount; + private int writeBehindErrorRetryCnt; /** Total count of entries in cache store internal buffer. */ - private int writeBehindBufferSize; + private int writeBehindBufSize; /** */ private String keyType; /** */ - private String valueType; + private String valType; /** */ - private boolean isStoreByValue; + private boolean isStoreByVal; /** */ private boolean isStatisticsEnabled; @@ -207,45 +234,54 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { putAvgTimeNanos = m.getAveragePutTime(); getAvgTimeNanos = m.getAverageGetTime(); - removeAvgTimeNanos = m.getAverageRemoveTime(); + rmvAvgTimeNanos = m.getAverageRemoveTime(); commitAvgTimeNanos = m.getAverageTxCommitTime(); rollbackAvgTimeNanos = m.getAverageTxRollbackTime(); cacheName = m.name(); overflowSize = m.getOverflowSize(); - offHeapEntriesCount = m.getOffHeapEntriesCount(); + offHeapGets = m.getOffHeapGets(); + offHeapPuts = m.getOffHeapPuts(); + offHeapRemoves = m.getOffHeapRemovals(); + offHeapEvicts = m.getOffHeapEvictions(); + offHeapHits = m.getOffHeapHits(); + offHeapMisses = m.getOffHeapMisses(); + offHeapEntriesCnt = m.getOffHeapEntriesCount(); + offHeapPrimaryEntriesCnt = m.getOffHeapPrimaryEntriesCount(); + offHeapBackupEntriesCnt = m.getOffHeapBackupEntriesCount(); offHeapAllocatedSize = m.getOffHeapAllocatedSize(); + offHeapMaxSize = m.getOffHeapMaxSize(); size = m.getSize(); keySize = m.getKeySize(); isEmpty = m.isEmpty(); - dhtEvictQueueCurrentSize = m.getDhtEvictQueueCurrentSize(); + dhtEvictQueueCurrSize = m.getDhtEvictQueueCurrentSize(); txThreadMapSize = m.getTxThreadMapSize(); txXidMapSize = m.getTxXidMapSize(); txCommitQueueSize = m.getTxCommitQueueSize(); txPrepareQueueSize = m.getTxPrepareQueueSize(); - txStartVersionCountsSize = m.getTxStartVersionCountsSize(); + txStartVerCountsSize = m.getTxStartVersionCountsSize(); txCommittedVersionsSize = m.getTxCommittedVersionsSize(); txRolledbackVersionsSize = m.getTxRolledbackVersionsSize(); txDhtThreadMapSize = m.getTxDhtThreadMapSize(); txDhtXidMapSize = m.getTxDhtXidMapSize(); txDhtCommitQueueSize = m.getTxDhtCommitQueueSize(); txDhtPrepareQueueSize = m.getTxDhtPrepareQueueSize(); - txDhtStartVersionCountsSize = m.getTxDhtStartVersionCountsSize(); + txDhtStartVerCountsSize = m.getTxDhtStartVersionCountsSize(); txDhtCommittedVersionsSize = m.getTxDhtCommittedVersionsSize(); txDhtRolledbackVersionsSize = m.getTxDhtRolledbackVersionsSize(); isWriteBehindEnabled = m.isWriteBehindEnabled(); writeBehindFlushSize = m.getWriteBehindFlushSize(); - writeBehindFlushThreadCount = m.getWriteBehindFlushThreadCount(); - writeBehindFlushFrequency = m.getWriteBehindFlushFrequency(); + writeBehindFlushThreadCnt = m.getWriteBehindFlushThreadCount(); + writeBehindFlushFreq = m.getWriteBehindFlushFrequency(); writeBehindStoreBatchSize = m.getWriteBehindStoreBatchSize(); - writeBehindTotalCriticalOverflowCount = m.getWriteBehindTotalCriticalOverflowCount(); - writeBehindCriticalOverflowCount = m.getWriteBehindCriticalOverflowCount(); - writeBehindErrorRetryCount = m.getWriteBehindErrorRetryCount(); - writeBehindBufferSize = m.getWriteBehindBufferSize(); + writeBehindTotalCriticalOverflowCnt = m.getWriteBehindTotalCriticalOverflowCount(); + writeBehindCriticalOverflowCnt = m.getWriteBehindCriticalOverflowCount(); + writeBehindErrorRetryCnt = m.getWriteBehindErrorRetryCount(); + writeBehindBufSize = m.getWriteBehindBufferSize(); keyType = m.getKeyType(); - valueType = m.getValueType(); - isStoreByValue = m.isStoreByValue(); + valType = m.getValueType(); + isStoreByVal = m.isStoreByValue(); isStatisticsEnabled = m.isStatisticsEnabled(); isManagementEnabled = m.isManagementEnabled(); isReadThrough = m.isReadThrough(); @@ -263,21 +299,23 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { isEmpty = loc.isEmpty(); isWriteBehindEnabled = loc.isWriteBehindEnabled(); writeBehindFlushSize = loc.getWriteBehindFlushSize(); - writeBehindFlushThreadCount = loc.getWriteBehindFlushThreadCount(); - writeBehindFlushFrequency = loc.getWriteBehindFlushFrequency(); + writeBehindFlushThreadCnt = loc.getWriteBehindFlushThreadCount(); + writeBehindFlushFreq = loc.getWriteBehindFlushFrequency(); writeBehindStoreBatchSize = loc.getWriteBehindStoreBatchSize(); - writeBehindBufferSize = loc.getWriteBehindBufferSize(); + writeBehindBufSize = loc.getWriteBehindBufferSize(); size = loc.getSize(); keySize = loc.getKeySize(); keyType = loc.getKeyType(); - valueType = loc.getValueType(); - isStoreByValue = loc.isStoreByValue(); + valType = loc.getValueType(); + isStoreByVal = loc.isStoreByValue(); isStatisticsEnabled = loc.isStatisticsEnabled(); isManagementEnabled = loc.isManagementEnabled(); isReadThrough = loc.isReadThrough(); isWriteThrough = loc.isWriteThrough(); + offHeapMaxSize = loc.getOffHeapMaxSize(); + for (CacheMetrics e : metrics) { reads += e.getCacheGets(); puts += e.getCachePuts(); @@ -290,7 +328,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { putAvgTimeNanos += e.getAveragePutTime(); getAvgTimeNanos += e.getAverageGetTime(); - removeAvgTimeNanos += e.getAverageRemoveTime(); + rmvAvgTimeNanos += e.getAverageRemoveTime(); commitAvgTimeNanos += e.getAverageTxCommitTime(); rollbackAvgTimeNanos += e.getAverageTxRollbackTime(); @@ -299,19 +337,27 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { else overflowSize = -1; - offHeapEntriesCount += e.getOffHeapEntriesCount(); + offHeapGets += e.getOffHeapGets(); + offHeapPuts += e.getOffHeapPuts(); + offHeapRemoves += e.getOffHeapRemovals(); + offHeapEvicts += e.getOffHeapEvictions(); + offHeapHits += e.getOffHeapHits(); + offHeapMisses += e.getOffHeapMisses(); + offHeapEntriesCnt += e.getOffHeapEntriesCount(); + offHeapPrimaryEntriesCnt += e.getOffHeapPrimaryEntriesCount(); + offHeapBackupEntriesCnt += e.getOffHeapBackupEntriesCount(); offHeapAllocatedSize += e.getOffHeapAllocatedSize(); if (e.getDhtEvictQueueCurrentSize() > -1) - dhtEvictQueueCurrentSize += e.getDhtEvictQueueCurrentSize(); + dhtEvictQueueCurrSize += e.getDhtEvictQueueCurrentSize(); else - dhtEvictQueueCurrentSize = -1; + dhtEvictQueueCurrSize = -1; txThreadMapSize += e.getTxThreadMapSize(); txXidMapSize += e.getTxXidMapSize(); txCommitQueueSize += e.getTxCommitQueueSize(); txPrepareQueueSize += e.getTxPrepareQueueSize(); - txStartVersionCountsSize += e.getTxStartVersionCountsSize(); + txStartVerCountsSize += e.getTxStartVersionCountsSize(); txCommittedVersionsSize += e.getTxCommittedVersionsSize(); txRolledbackVersionsSize += e.getTxRolledbackVersionsSize(); @@ -336,9 +382,9 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { txDhtPrepareQueueSize = -1; if (e.getTxDhtStartVersionCountsSize() > -1) - txDhtStartVersionCountsSize += e.getTxDhtStartVersionCountsSize(); + txDhtStartVerCountsSize += e.getTxDhtStartVersionCountsSize(); else - txDhtStartVersionCountsSize = -1; + txDhtStartVerCountsSize = -1; if (e.getTxDhtCommittedVersionsSize() > -1) txDhtCommittedVersionsSize += e.getTxDhtCommittedVersionsSize(); @@ -351,19 +397,19 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { txDhtRolledbackVersionsSize = -1; if (e.getWriteBehindTotalCriticalOverflowCount() > -1) - writeBehindTotalCriticalOverflowCount += e.getWriteBehindTotalCriticalOverflowCount(); + writeBehindTotalCriticalOverflowCnt += e.getWriteBehindTotalCriticalOverflowCount(); else - writeBehindTotalCriticalOverflowCount = -1; + writeBehindTotalCriticalOverflowCnt = -1; if (e.getWriteBehindCriticalOverflowCount() > -1) - writeBehindCriticalOverflowCount += e.getWriteBehindCriticalOverflowCount(); + writeBehindCriticalOverflowCnt += e.getWriteBehindCriticalOverflowCount(); else - writeBehindCriticalOverflowCount = -1; + writeBehindCriticalOverflowCnt = -1; if (e.getWriteBehindErrorRetryCount() > -1) - writeBehindErrorRetryCount += e.getWriteBehindErrorRetryCount(); + writeBehindErrorRetryCnt += e.getWriteBehindErrorRetryCount(); else - writeBehindErrorRetryCount = -1; + writeBehindErrorRetryCnt = -1; } int size = metrics.size(); @@ -371,7 +417,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { if (size > 1) { putAvgTimeNanos /= size; getAvgTimeNanos /= size; - removeAvgTimeNanos /= size; + rmvAvgTimeNanos /= size; commitAvgTimeNanos /= size; rollbackAvgTimeNanos /= size; } @@ -435,7 +481,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { /** {@inheritDoc} */ @Override public float getAverageRemoveTime() { - return removeAvgTimeNanos; + return rmvAvgTimeNanos; } /** {@inheritDoc} */ @@ -469,8 +515,63 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { } /** {@inheritDoc} */ + @Override public long getOffHeapGets() { + return offHeapGets; + } + + /** {@inheritDoc} */ + @Override public long getOffHeapPuts() { + return offHeapPuts; + } + + /** {@inheritDoc} */ + @Override public long getOffHeapRemovals() { + return offHeapRemoves; + } + + /** {@inheritDoc} */ + @Override public long getOffHeapEvictions() { + return offHeapEvicts; + } + + /** {@inheritDoc} */ + @Override public long getOffHeapHits() { + return offHeapHits; + } + + /** {@inheritDoc} */ + @Override public float getOffHeapHitPercentage() { + if (offHeapHits == 0 || offHeapGets == 0) + return 0; + + return (float) offHeapHits / offHeapGets * 100.0f; + } + + /** {@inheritDoc} */ + @Override public long getOffHeapMisses() { + return offHeapMisses; + } + + /** {@inheritDoc} */ + @Override public float getOffHeapMissPercentage() { + if (offHeapMisses == 0 || offHeapGets == 0) + return 0; + + return (float) offHeapMisses / offHeapGets * 100.0f; + } + /** {@inheritDoc} */ @Override public long getOffHeapEntriesCount() { - return offHeapEntriesCount; + return offHeapEntriesCnt; + } + + /** {@inheritDoc} */ + @Override public long getOffHeapPrimaryEntriesCount() { + return offHeapPrimaryEntriesCnt; + } + + /** {@inheritDoc} */ + @Override public long getOffHeapBackupEntriesCount() { + return offHeapBackupEntriesCnt; } /** {@inheritDoc} */ @@ -479,6 +580,11 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { } /** {@inheritDoc} */ + @Override public long getOffHeapMaxSize() { + return offHeapMaxSize; + } + + /** {@inheritDoc} */ @Override public int getSize() { return size; } @@ -495,7 +601,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { /** {@inheritDoc} */ @Override public int getDhtEvictQueueCurrentSize() { - return dhtEvictQueueCurrentSize; + return dhtEvictQueueCurrSize; } /** {@inheritDoc} */ @@ -520,7 +626,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { /** {@inheritDoc} */ @Override public int getTxStartVersionCountsSize() { - return txStartVersionCountsSize; + return txStartVerCountsSize; } /** {@inheritDoc} */ @@ -555,7 +661,7 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { /** {@inheritDoc} */ @Override public int getTxDhtStartVersionCountsSize() { - return txDhtStartVersionCountsSize; + return txDhtStartVerCountsSize; } /** {@inheritDoc} */ @@ -580,12 +686,12 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { /** {@inheritDoc} */ @Override public int getWriteBehindFlushThreadCount() { - return writeBehindFlushThreadCount; + return writeBehindFlushThreadCnt; } /** {@inheritDoc} */ @Override public long getWriteBehindFlushFrequency() { - return writeBehindFlushFrequency; + return writeBehindFlushFreq; } /** {@inheritDoc} */ @@ -595,22 +701,22 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { /** {@inheritDoc} */ @Override public int getWriteBehindTotalCriticalOverflowCount() { - return writeBehindTotalCriticalOverflowCount; + return writeBehindTotalCriticalOverflowCnt; } /** {@inheritDoc} */ @Override public int getWriteBehindCriticalOverflowCount() { - return writeBehindCriticalOverflowCount; + return writeBehindCriticalOverflowCnt; } /** {@inheritDoc} */ @Override public int getWriteBehindErrorRetryCount() { - return writeBehindErrorRetryCount; + return writeBehindErrorRetryCnt; } /** {@inheritDoc} */ @Override public int getWriteBehindBufferSize() { - return writeBehindBufferSize; + return writeBehindBufSize; } /** {@inheritDoc} */ @@ -620,12 +726,12 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { /** {@inheritDoc} */ @Override public String getValueType() { - return valueType; + return valType; } /** {@inheritDoc} */ @Override public boolean isStoreByValue() { - return isStoreByValue; + return isStoreByVal; } /** {@inheritDoc} */ @@ -666,31 +772,40 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { out.writeFloat(putAvgTimeNanos); out.writeFloat(getAvgTimeNanos); - out.writeFloat(removeAvgTimeNanos); + out.writeFloat(rmvAvgTimeNanos); out.writeFloat(commitAvgTimeNanos); out.writeFloat(rollbackAvgTimeNanos); out.writeLong(overflowSize); - out.writeLong(offHeapEntriesCount); + out.writeLong(offHeapGets); + out.writeLong(offHeapPuts); + out.writeLong(offHeapRemoves); + out.writeLong(offHeapEvicts); + out.writeLong(offHeapHits); + out.writeLong(offHeapMisses); + out.writeLong(offHeapEntriesCnt); + out.writeLong(offHeapPrimaryEntriesCnt); + out.writeLong(offHeapBackupEntriesCnt); out.writeLong(offHeapAllocatedSize); - out.writeInt(dhtEvictQueueCurrentSize); + out.writeLong(offHeapMaxSize); + out.writeInt(dhtEvictQueueCurrSize); out.writeInt(txThreadMapSize); out.writeInt(txXidMapSize); out.writeInt(txCommitQueueSize); out.writeInt(txPrepareQueueSize); - out.writeInt(txStartVersionCountsSize); + out.writeInt(txStartVerCountsSize); out.writeInt(txCommittedVersionsSize); out.writeInt(txRolledbackVersionsSize); out.writeInt(txDhtThreadMapSize); out.writeInt(txDhtXidMapSize); out.writeInt(txDhtCommitQueueSize); out.writeInt(txDhtPrepareQueueSize); - out.writeInt(txDhtStartVersionCountsSize); + out.writeInt(txDhtStartVerCountsSize); out.writeInt(txDhtCommittedVersionsSize); out.writeInt(txDhtRolledbackVersionsSize); - out.writeInt(writeBehindTotalCriticalOverflowCount); - out.writeInt(writeBehindCriticalOverflowCount); - out.writeInt(writeBehindErrorRetryCount); + out.writeInt(writeBehindTotalCriticalOverflowCnt); + out.writeInt(writeBehindCriticalOverflowCnt); + out.writeInt(writeBehindErrorRetryCnt); } /** {@inheritDoc} */ @@ -706,30 +821,39 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable { putAvgTimeNanos = in.readFloat(); getAvgTimeNanos = in.readFloat(); - removeAvgTimeNanos = in.readFloat(); + rmvAvgTimeNanos = in.readFloat(); commitAvgTimeNanos = in.readFloat(); rollbackAvgTimeNanos = in.readFloat(); overflowSize = in.readLong(); - offHeapEntriesCount = in.readLong(); + offHeapGets = in.readLong(); + offHeapPuts = in.readLong(); + offHeapRemoves = in.readLong(); + offHeapEvicts = in.readLong(); + offHeapHits = in.readLong(); + offHeapMisses = in.readLong(); + offHeapEntriesCnt = in.readLong(); + offHeapPrimaryEntriesCnt = in.readLong(); + offHeapBackupEntriesCnt = in.readLong(); offHeapAllocatedSize = in.readLong(); - dhtEvictQueueCurrentSize = in.readInt(); + offHeapMaxSize = in.readLong(); + dhtEvictQueueCurrSize = in.readInt(); txThreadMapSize = in.readInt(); txXidMapSize = in.readInt(); txCommitQueueSize = in.readInt(); txPrepareQueueSize = in.readInt(); - txStartVersionCountsSize = in.readInt(); + txStartVerCountsSize = in.readInt(); txCommittedVersionsSize = in.readInt(); txRolledbackVersionsSize = in.readInt(); txDhtThreadMapSize = in.readInt(); txDhtXidMapSize = in.readInt(); txDhtCommitQueueSize = in.readInt(); txDhtPrepareQueueSize = in.readInt(); - txDhtStartVersionCountsSize = in.readInt(); + txDhtStartVerCountsSize = in.readInt(); txDhtCommittedVersionsSize = in.readInt(); txDhtRolledbackVersionsSize = in.readInt(); - writeBehindTotalCriticalOverflowCount = in.readInt(); - writeBehindCriticalOverflowCount = in.readInt(); - writeBehindErrorRetryCount = in.readInt(); + writeBehindTotalCriticalOverflowCnt = in.readInt(); + writeBehindCriticalOverflowCnt = in.readInt(); + writeBehindErrorRetryCnt = in.readInt(); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3faca824/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java index 6444e37..fbab17b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java @@ -121,6 +121,9 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { warnFirstEvict(); writeToSwap(part, cctx.toCacheKeyObject(kb), vb); + + if (cctx.config().isStatisticsEnabled()) + cctx.cache().metrics0().onOffHeapEvict(); } catch (IgniteCheckedException e) { log.error("Failed to unmarshal off-heap entry [part=" + part + ", hash=" + hash + ']', e); @@ -395,8 +398,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { * @return Reconstituted swap entry or {@code null} if entry is obsolete. * @throws IgniteCheckedException If failed. */ - @Nullable private <X extends GridCacheSwapEntry> X swapEntry(X e) throws IgniteCheckedException - { + @Nullable private <X extends GridCacheSwapEntry> X swapEntry(X e) throws IgniteCheckedException { assert e != null; checkIteratorQueue(); @@ -425,16 +427,14 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { int part = cctx.affinity().partition(key); // First check off-heap store. - if (offheapEnabled) - if (offheap.contains(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext()))) - return true; + if (offheapEnabled && offheap.contains(spaceName, part, key, cctx)) + return true; if (swapEnabled) { assert key != null; - byte[] valBytes = swapMgr.read(spaceName, - new SwapKey(key.value(cctx.cacheObjectContext(), false), part, key.valueBytes(cctx.cacheObjectContext())), - cctx.deploy().globalLoader()); + byte[] valBytes = swapMgr.read(spaceName, new SwapKey(key.value(cctx.cacheObjectContext(), false), part, + key.valueBytes(cctx.cacheObjectContext())), cctx.deploy().globalLoader()); return valBytes != null; } @@ -444,7 +444,6 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { /** * @param key Key to read. - * @param keyBytes Key bytes. * @param part Key partition. * @param entryLocked {@code True} if cache entry is locked. * @param readOffheap Read offheap flag. @@ -454,7 +453,6 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { */ @SuppressWarnings({"unchecked"}) @Nullable private GridCacheSwapEntry read(KeyCacheObject key, - byte[] keyBytes, int part, boolean entryLocked, boolean readOffheap, @@ -479,7 +477,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { // First check off-heap store. if (readOffheap && offheapEnabled) { - byte[] bytes = offheap.get(spaceName, part, key, keyBytes); + byte[] bytes = offheap.get(spaceName, part, key, cctx); if (bytes != null) return swapEntry(unmarshalSwapEntry(bytes)); @@ -491,8 +489,8 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { assert key != null; byte[] bytes = swapMgr.read(spaceName, - new SwapKey(key.value(cctx.cacheObjectContext(), false), part, keyBytes), - cctx.deploy().globalLoader()); + new SwapKey(key.value(cctx.cacheObjectContext(), false), part, + key.valueBytes(cctx.cacheObjectContext())), cctx.deploy().globalLoader()); if (bytes == null && lsnr != null) return lsnr.entry; @@ -522,7 +520,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { // First try removing from offheap. if (offheapEnabled) { - byte[] entryBytes = offheap.remove(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext())); + byte[] entryBytes = offheap.remove(spaceName, part, key, cctx); if (entryBytes != null) { GridCacheSwapEntry entry = swapEntry(unmarshalSwapEntry(entryBytes)); @@ -567,8 +565,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { * @return Value from swap or {@code null}. * @throws IgniteCheckedException If failed. */ - @Nullable private GridCacheSwapEntry readAndRemoveSwap(final KeyCacheObject key, - final int part) + @Nullable private GridCacheSwapEntry readAndRemoveSwap(final KeyCacheObject key, final int part) throws IgniteCheckedException { if (!swapEnabled) return null; @@ -649,12 +646,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { if (!offheapEnabled && !swapEnabled) return null; - return read(entry.key(), - entry.key().valueBytes(cctx.cacheObjectContext()), - entry.partition(), - locked, - readOffheap, - readSwap); + return read(entry.key(), entry.partition(), locked, readOffheap, readSwap); } /** @@ -670,8 +662,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { int part = cctx.affinity().partition(key); - IgniteBiTuple<Long, Integer> ptr = - offheap.valuePointer(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext())); + IgniteBiTuple<Long, Integer> ptr = offheap.valuePointer(spaceName, part, key, cctx); if (ptr != null) { assert ptr.get1() != null; @@ -700,7 +691,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { int part = cctx.affinity().partition(key); - return read(key, key.valueBytes(cctx.cacheObjectContext()), part, false, readOffheap, readSwap); + return read(key, part, false, readOffheap, readSwap); } /** @@ -738,7 +729,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { int part = cctx.affinity().partition(key); byte[] entryBytes = - offheap.remove(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext())); + offheap.remove(spaceName, part, key, cctx); if (entryBytes != null) { GridCacheSwapEntry entry = swapEntry(unmarshalSwapEntry(entryBytes)); @@ -880,7 +871,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { int part = cctx.affinity().partition(key); - return offheap.removex(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext())); + return offheap.removex(spaceName, part, key, cctx); } /** @@ -904,7 +895,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { int part = cctx.affinity().partition(key); - offheap.enableEviction(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext())); + offheap.enableEviction(spaceName, part, key, cctx); } /** @@ -942,10 +933,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { // First try offheap. if (offheapEnabled) { - byte[] val = offheap.remove(spaceName, - part, - key.value(cctx.cacheObjectContext(), false), - key.valueBytes(cctx.cacheObjectContext())); + byte[] val = offheap.remove(spaceName, part, key, cctx); if (val != null) { if (c != null) @@ -1004,13 +992,8 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { keyClsLdrId, valClsLdrId); - if (offheapEnabled) { - offheap.put(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext()), entry.marshal()); - - if (cctx.events().isRecordable(EVT_CACHE_OBJECT_TO_OFFHEAP)) - cctx.events().addEvent(part, key, cctx.nodeId(), (IgniteUuid)null, null, - EVT_CACHE_OBJECT_TO_OFFHEAP, null, false, null, true, null, null, null); - } + if (offheapEnabled) + offheap.put(spaceName, part, key, entry.marshal(), cctx); else if (swapEnabled) writeToSwap(part, key, entry.marshal()); @@ -1035,15 +1018,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { if (offheapEnabled) { for (GridCacheBatchSwapEntry swapEntry : swapped) { - offheap.put(spaceName, - swapEntry.partition(), - swapEntry.key(), - swapEntry.key().valueBytes(cctx.cacheObjectContext()), - swapEntry.marshal()); - - if (cctx.events().isRecordable(EVT_CACHE_OBJECT_TO_OFFHEAP)) - cctx.events().addEvent(swapEntry.partition(), swapEntry.key(), cctx.nodeId(), - (IgniteUuid)null, null, EVT_CACHE_OBJECT_TO_OFFHEAP, null, false, null, true, null, null, null); + offheap.put(spaceName, swapEntry.partition(), swapEntry.key(), swapEntry.marshal(), cctx); if (qryMgr != null) qryMgr.onSwap(swapEntry.key()); @@ -1274,7 +1249,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { int part = cctx.affinity().partition(key); - offheap.removex(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext())); + offheap.removex(spaceName, part, key, cctx); } else it.removeX(); @@ -1592,7 +1567,7 @@ public class GridCacheSwapManager extends GridCacheManagerAdapter { int part = cctx.affinity().partition(key); - offheap.removex(spaceName, part, key, key.valueBytes(cctx.cacheObjectContext())); + offheap.removex(spaceName, part, key, cctx); } @Override protected void onClose() throws IgniteCheckedException { http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3faca824/modules/core/src/main/java/org/apache/ignite/internal/processors/offheap/GridOffHeapProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/offheap/GridOffHeapProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/offheap/GridOffHeapProcessor.java index ebedadb..e605ee0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/offheap/GridOffHeapProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/offheap/GridOffHeapProcessor.java @@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.offheap; import org.apache.ignite.*; import org.apache.ignite.internal.*; import org.apache.ignite.internal.processors.*; +import org.apache.ignite.internal.processors.cache.*; import org.apache.ignite.internal.util.*; import org.apache.ignite.internal.util.lang.*; import org.apache.ignite.internal.util.offheap.*; @@ -32,6 +33,8 @@ import org.jsr166.*; import java.util.*; +import static org.apache.ignite.events.EventType.*; + /** * Manages offheap memory caches. */ @@ -97,13 +100,15 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * Ensures that we have {@code keyBytes}. * * @param key Key. - * @param keyBytes Optional key bytes. - * @return Key bytes + * @param cctx Cache context. + * @return Key bytes. * @throws IgniteCheckedException If failed. */ - private byte[] keyBytes(Object key, @Nullable byte[] keyBytes) throws IgniteCheckedException { + private byte[] keyBytes(KeyCacheObject key, GridCacheContext cctx) throws IgniteCheckedException { assert key != null; + byte[] keyBytes = key.valueBytes(cctx.cacheObjectContext()); + return keyBytes != null ? keyBytes : marsh.marshal(key); } @@ -126,15 +131,20 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * @param spaceName Space name. * @param part Partition. * @param key Key. - * @param keyBytes Key bytes. - * @return {@code true} If offheap space contains value for the given key. + * @param cctx Cache context. + * @return {@code True} If offheap space contains value for the given key. * @throws IgniteCheckedException If failed. */ - public boolean contains(@Nullable String spaceName, int part, Object key, byte[] keyBytes) + public boolean contains(@Nullable String spaceName, int part, KeyCacheObject key, GridCacheContext cctx) throws IgniteCheckedException { GridOffHeapPartitionedMap m = offheap(spaceName); - return m != null && m.contains(part, U.hash(key), keyBytes(key, keyBytes)); + boolean hit = m != null && m.contains(part, U.hash(key), keyBytes(key, cctx)); + + if (cctx.config().isStatisticsEnabled()) + cctx.cache().metrics0().onOffHeapRead(hit); + + return hit; } /** @@ -143,15 +153,20 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * @param spaceName Space name. * @param part Partition. * @param key Key. - * @param keyBytes Key bytes. + * @param cctx Cache context. * @return Value bytes. * @throws IgniteCheckedException If failed. */ - @Nullable public byte[] get(@Nullable String spaceName, int part, Object key, byte[] keyBytes) + @Nullable public byte[] get(@Nullable String spaceName, int part, KeyCacheObject key, GridCacheContext cctx) throws IgniteCheckedException { GridOffHeapPartitionedMap m = offheap(spaceName); - return m == null ? null : m.get(part, U.hash(key), keyBytes(key, keyBytes)); + byte[] bytes = m == null ? null : m.get(part, U.hash(key), keyBytes(key, cctx)); + + if (cctx.config().isStatisticsEnabled()) + cctx.cache().metrics0().onOffHeapRead(bytes != null); + + return bytes; } /** @@ -162,15 +177,15 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * @param spaceName Space name. * @param part Partition. * @param key Key. - * @param keyBytes Key bytes. + * @param cctx Cache context. * @return Tuple where first value is pointer and second is value size. * @throws IgniteCheckedException If failed. */ - @Nullable public IgniteBiTuple<Long, Integer> valuePointer(@Nullable String spaceName, int part, Object key, - byte[] keyBytes) throws IgniteCheckedException { + @Nullable public IgniteBiTuple<Long, Integer> valuePointer(@Nullable String spaceName, int part, KeyCacheObject key, + GridCacheContext cctx) throws IgniteCheckedException { GridOffHeapPartitionedMap m = offheap(spaceName); - return m == null ? null : m.valuePointer(part, U.hash(key), keyBytes(key, keyBytes)); + return m == null ? null : m.valuePointer(part, U.hash(key), keyBytes(key, cctx)); } /** @@ -179,15 +194,15 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * @param spaceName Space name. * @param part Partition. * @param key Key. - * @param keyBytes Key bytes. + * @param cctx Cache context. * @throws IgniteCheckedException If failed. */ - public void enableEviction(@Nullable String spaceName, int part, Object key, byte[] keyBytes) + public void enableEviction(@Nullable String spaceName, int part, KeyCacheObject key, GridCacheContext cctx) throws IgniteCheckedException { GridOffHeapPartitionedMap m = offheap(spaceName); if (m != null) - m.enableEviction(part, U.hash(key), keyBytes(key, keyBytes)); + m.enableEviction(part, U.hash(key), keyBytes(key, cctx)); } /** @@ -196,14 +211,13 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * @param spaceName Space name. * @param part Partition. * @param key Key. - * @param keyBytes Key bytes. - * @param ldr Class loader. - * @return Value bytes. + * @param cctx Cache context. + * @param ldr Class loader. @return Value bytes. * @throws IgniteCheckedException If failed. */ - @Nullable public <T> T getValue(@Nullable String spaceName, int part, Object key, byte[] keyBytes, - @Nullable ClassLoader ldr) throws IgniteCheckedException { - byte[] valBytes = get(spaceName, part, key, keyBytes); + @Nullable public <T> T getValue(@Nullable String spaceName, int part, KeyCacheObject key, + GridCacheContext cctx, @Nullable ClassLoader ldr) throws IgniteCheckedException { + byte[] valBytes = get(spaceName, part, key, cctx); if (valBytes == null) return null; @@ -217,14 +231,18 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * @param spaceName Space name. * @param part Partition. * @param key Key. - * @param keyBytes Key bytes. + * @param cctx Cache context. * @return Value bytes. * @throws IgniteCheckedException If failed. */ - @Nullable public byte[] remove(@Nullable String spaceName, int part, Object key, byte[] keyBytes) throws IgniteCheckedException { + @Nullable public byte[] remove(@Nullable String spaceName, int part, KeyCacheObject key, GridCacheContext cctx) + throws IgniteCheckedException { GridOffHeapPartitionedMap m = offheap(spaceName); - return m == null ? null : m.remove(part, U.hash(key), keyBytes(key, keyBytes)); + if(cctx.config().isStatisticsEnabled()) + cctx.cache().metrics0().onOffHeapRemove(); + + return m == null ? null : m.remove(part, U.hash(key), keyBytes(key, cctx)); } /** @@ -233,11 +251,11 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * @param spaceName Space name. * @param part Partition. * @param key Key. - * @param keyBytes Key bytes. * @param valBytes Value bytes. + * @param cctx Cache context. * @throws IgniteCheckedException If failed. */ - public void put(@Nullable String spaceName, int part, Object key, byte[] keyBytes, byte[] valBytes) + public void put(@Nullable String spaceName, int part, KeyCacheObject key, byte[] valBytes, GridCacheContext cctx) throws IgniteCheckedException { GridOffHeapPartitionedMap m = offheap(spaceName); @@ -245,7 +263,14 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { throw new IgniteCheckedException("Failed to write data to off-heap space, no space registered for name: " + spaceName); - m.put(part, U.hash(key), keyBytes(key, keyBytes), valBytes); + m.put(part, U.hash(key), keyBytes(key, cctx), valBytes); + + if (cctx.config().isStatisticsEnabled()) + cctx.cache().metrics0().onOffHeapWrite(); + + if (cctx.events().isRecordable(EVT_CACHE_OBJECT_TO_OFFHEAP)) + cctx.events().addEvent(part, key, cctx.nodeId(), (IgniteUuid)null, null, + EVT_CACHE_OBJECT_TO_OFFHEAP, null, false, null, true, null, null, null); } /** @@ -254,14 +279,18 @@ public class GridOffHeapProcessor extends GridProcessorAdapter { * @param spaceName Space name. * @param part Partition. * @param key Key. - * @param keyBytes Key bytes. - * @return {@code true} If succeeded. + * @param cctx Cache context. + * @return {@code True} If succeeded. * @throws IgniteCheckedException If failed. */ - public boolean removex(@Nullable String spaceName, int part, Object key, byte[] keyBytes) throws IgniteCheckedException { + public boolean removex(@Nullable String spaceName, int part, KeyCacheObject key, GridCacheContext cctx) + throws IgniteCheckedException { GridOffHeapPartitionedMap m = offheap(spaceName); - return m != null && m.removex(part, U.hash(key), keyBytes(key, keyBytes)); + if(cctx.config().isStatisticsEnabled()) + cctx.cache().metrics0().onOffHeapRemove(); + + return m != null && m.removex(part, U.hash(key), keyBytes(key, cctx)); } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3faca824/modules/core/src/main/java/org/apache/ignite/mxbean/CacheMetricsMXBean.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/CacheMetricsMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/CacheMetricsMXBean.java index 2ad07b5..4c37682 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/CacheMetricsMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/CacheMetricsMXBean.java @@ -100,14 +100,58 @@ public interface CacheMetricsMXBean extends CacheStatisticsMXBean, CacheMXBean, public long getOverflowSize(); /** {@inheritDoc} */ + @MXBeanDescription("Number of gets from off-heap memory.") + public long getOffHeapGets(); + + /** {@inheritDoc} */ + @MXBeanDescription("Number of puts to off-heap memory.") + public long getOffHeapPuts(); + + /** {@inheritDoc} */ + @MXBeanDescription("Number of removed entries from off-heap memory.") + public long getOffHeapRemovals(); + + /** {@inheritDoc} */ + @MXBeanDescription("Number of evictions from off-heap memory.") + public long getOffHeapEvictions(); + + /** {@inheritDoc} */ + @MXBeanDescription("Number of hits on off-heap memory.") + public long getOffHeapHits(); + + /** {@inheritDoc} */ + @MXBeanDescription("Percentage of hits on off-heap memory.") + public float getOffHeapHitPercentage(); + + /** {@inheritDoc} */ + @MXBeanDescription("Number of misses on off-heap memory.") + public long getOffHeapMisses(); + + /** {@inheritDoc} */ + @MXBeanDescription("Percentage of misses on off-heap memory.") + public float getOffHeapMissPercentage(); + + /** {@inheritDoc} */ @MXBeanDescription("Number of entries stored in off-heap memory.") public long getOffHeapEntriesCount(); /** {@inheritDoc} */ + @MXBeanDescription("Number of primary entries stored in off-heap memory.") + public long getOffHeapPrimaryEntriesCount(); + + /** {@inheritDoc} */ + @MXBeanDescription("Number of backup stored in off-heap memory.") + public long getOffHeapBackupEntriesCount(); + + /** {@inheritDoc} */ @MXBeanDescription("Memory size allocated in off-heap.") public long getOffHeapAllocatedSize(); /** {@inheritDoc} */ + @MXBeanDescription("Off-heap memory maximum size.") + public long getOffHeapMaxSize(); + + /** {@inheritDoc} */ @MXBeanDescription("Number of non-null values in the cache.") public int getSize();