You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/01/16 12:29:19 UTC
[4/7] incubator-ignite git commit: IGNITE-49 Implemented avg
statistics
IGNITE-49 Implemented avg statistics
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/d8ecf41a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/d8ecf41a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/d8ecf41a
Branch: refs/heads/ignite-49
Commit: d8ecf41a7f4ae42fb3becad1a9de61a62b1d26d5
Parents: c04013d
Author: nikolay_tikhonov <nt...@gridgain.com>
Authored: Mon Dec 29 19:07:24 2014 +0300
Committer: nikolay_tikhonov <nt...@gridgain.com>
Committed: Fri Jan 16 14:13:34 2015 +0300
----------------------------------------------------------------------
.../processors/cache/IgniteCacheProxy.java | 104 +++++++++-
.../cache/GridCacheMetricsAdapter.java | 110 +++++++++--
.../cache/GridCacheAbstractMetricsSelfTest.java | 190 +++++++++++++++++++
.../GridCachePartitionedMetricsSelfTest.java | 10 +
4 files changed, 396 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d8ecf41a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
index f95cd2a..10ff00b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
@@ -387,14 +387,24 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public V get(K key) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
+ V res;
+
try {
- return delegate.get(key);
+ res = delegate.get(key);
}
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled)
+ ctx.cache().metrics0().addGetTimeNanos(System.nanoTime() - start);
+
+ return res;
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -404,14 +414,24 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public Map<K, V> getAll(Set<? extends K> keys) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
+ Map<K, V> res;
+
try {
- return delegate.getAll(keys);
+ res = delegate.getAll(keys);
}
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled)
+ ctx.cache().metrics0().addGetTimeNanos(System.nanoTime() - start);
+
+ return res;
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -432,6 +452,9 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled)
+ ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -495,6 +518,9 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public void put(K key, V val) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
try {
@@ -503,6 +529,9 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled)
+ ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -512,14 +541,26 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public V getAndPut(K key, V val) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
+ V ret;
+
try {
- return delegate.put(key, val);
+ ret = delegate.put(key, val);
}
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled) {
+ ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
+ ctx.cache().metrics0().addGetTimeNanos(System.nanoTime() - start);
+ }
+
+ return ret;
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -529,6 +570,9 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public void putAll(Map<? extends K, ? extends V> map) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
try {
@@ -546,14 +590,24 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public boolean putIfAbsent(K key, V val) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
+ boolean stored;
+
try {
- return delegate.putxIfAbsent(key, val);
+ stored = delegate.putxIfAbsent(key, val);
}
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled && stored)
+ ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
+
+ return stored;
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -563,14 +617,24 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public boolean remove(K key) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
+ boolean removed;
+
try {
- return delegate.removex(key);
+ removed = delegate.removex(key);
}
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled)
+ ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
+
+ return removed;
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -580,14 +644,24 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public boolean remove(K key, V oldVal) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
+ boolean removed;
+
try {
- return delegate.remove(key, oldVal);
+ removed = delegate.remove(key, oldVal);
}
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled && removed)
+ ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
+
+ return removed;
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -597,14 +671,24 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public V getAndRemove(K key) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
+ V removed;
+
try {
- return delegate.remove(key);
+ removed = delegate.remove(key);
}
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled)
+ ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
+
+ return removed;
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -622,6 +706,9 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
finally {
gate.leave(prev);
}
+
+ if (statisticsEnabled)
+ ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
}
catch (IgniteCheckedException e) {
throw cacheException(e);
@@ -665,6 +752,9 @@ public class IgniteCacheProxy<K, V> extends IgniteAsyncSupportAdapter implements
/** {@inheritDoc} */
@Override public void removeAll(Set<? extends K> keys) {
try {
+ boolean statisticsEnabled = ctx.config().isStatisticsEnabled();
+ long start = statisticsEnabled ? System.nanoTime() : 0L;
+
GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
try {
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d8ecf41a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
index 4849fa5..a878972 100644
--- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
+++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
@@ -20,6 +20,7 @@ package org.gridgain.grid.kernal.processors.cache;
import org.gridgain.grid.cache.*;
import org.gridgain.grid.util.tostring.*;
import org.gridgain.grid.util.typedef.internal.*;
+import org.jdk8.backport.*;
import org.jetbrains.annotations.*;
import java.io.*;
@@ -29,6 +30,9 @@ import java.io.*;
*/
public class GridCacheMetricsAdapter implements GridCacheMetrics, Externalizable {
/** */
+ private static final long NANOS_IN_MICROSECOND = 1000L;
+
+ /** */
private static final long serialVersionUID = 0L;
/** Create time. */
@@ -70,6 +74,15 @@ public class GridCacheMetricsAdapter implements GridCacheMetrics, Externalizable
/** Number of removed entries. */
private volatile long rmCnt;
+ /** Put time taken nanos. */
+ private volatile long putTimeNanos;
+
+ /** Get time taken nanos. */
+ private volatile long getTimeNanos;
+
+ /** Remove time taken nanos. */
+ private volatile long removeTimeNanos;
+
/** Cache metrics. */
@GridToStringExclude
private transient GridCacheMetricsAdapter delegate;
@@ -84,7 +97,7 @@ public class GridCacheMetricsAdapter implements GridCacheMetrics, Externalizable
/**
* @param m Metrics to copy from.
*/
- public GridCacheMetricsAdapter(GridCacheMetrics m) {
+ public GridCacheMetricsAdapter(GridCacheMetricsAdapter m) {
createTime = m.createTime();
readTime = m.readTime();
writeTime = m.writeTime();
@@ -98,6 +111,9 @@ public class GridCacheMetricsAdapter implements GridCacheMetrics, Externalizable
txRollbacks = m.txRollbacks();
rmCnt = m.getCacheRemovals();
evictCnt = m.getCacheEvictions();
+ getTimeNanos = m.getTimeNanos();
+ putTimeNanos = m.putTimeNanos();
+ removeTimeNanos = m.removeTimeNanos();
}
/**
@@ -227,19 +243,64 @@ public class GridCacheMetricsAdapter implements GridCacheMetrics, Externalizable
return evictCnt;
}
- /** {@inheritDoc} */
- @Override public float getAverageGetTime() {
- return 0;
+ /**
+ * Increments the get time accumulator.
+ *
+ * @param duration the time taken in nanoseconds.
+ */
+ public void addGetTimeNanos(long duration) {
+ getTimeNanos += duration;
}
- /** {@inheritDoc} */
- @Override public float getAveragePutTime() {
- return 0;
+ /**
+ * Increments the put time accumulator.
+ *
+ * @param duration the time taken in nanoseconds.
+ */
+ public void addPutTimeNanos(long duration) {
+ putTimeNanos += duration;
}
- /** {@inheritDoc} */
- @Override public float getAverageRemoveTime() {
- return 0;
+ /**
+ * Increments the remove time accumulator.
+ *
+ * @param duration the time taken in nanoseconds.
+ */
+ public void addRemoveTimeNanos(long duration) {
+ removeTimeNanos += duration;
+ }
+
+ @Override
+ public float getAverageGetTime() {
+ long timeNanos = getTimeNanos;
+ long readsCnt = reads;
+
+ if (timeNanos == 0 || readsCnt == 0)
+ return 0;
+
+ return ((1f * timeNanos) / readsCnt) / NANOS_IN_MICROSECOND;
+ }
+
+ @Override
+ public float getAveragePutTime() {
+ long timeNanos = putTimeNanos;
+ long putsCnt = writes;
+
+ if (timeNanos == 0 || putsCnt == 0)
+ return 0;
+
+ return ((1f * timeNanos) / putsCnt) / NANOS_IN_MICROSECOND;
+ }
+
+ @Override
+ public float getAverageRemoveTime() {
+ long timeNanos = removeTimeNanos;
+ long removesCnt = rmCnt;
+
+ if (timeNanos == 0 || removesCnt == 0)
+ return 0;
+
+ return ((1f * timeNanos) / removesCnt) / NANOS_IN_MICROSECOND;
}
/**
@@ -319,12 +380,39 @@ public class GridCacheMetricsAdapter implements GridCacheMetrics, Externalizable
}
/**
+ * Gets remove time.
+ *
+ * @return Remove time taken nanos.
+ */
+ public long removeTimeNanos() {
+ return removeTimeNanos;
+ }
+
+ /**
+ * Gets get time.
+ *
+ * @return Get time taken nanos.
+ */
+ public long getTimeNanos() {
+ return getTimeNanos;
+ }
+
+ /**
+ * Gets put time.
+ *
+ * @return Get time taken nanos.
+ */
+ public long putTimeNanos() {
+ return putTimeNanos;
+ }
+
+ /**
* Create a copy of given metrics object.
*
* @param m Metrics to copy from.
* @return Copy of given metrics.
*/
- @Nullable public static GridCacheMetricsAdapter copyOf(@Nullable GridCacheMetrics m) {
+ @Nullable public static GridCacheMetricsAdapter copyOf(@Nullable GridCacheMetricsAdapter m) {
if (m == null)
return null;
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d8ecf41a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
index 5173837..82aa122 100644
--- a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
+++ b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
@@ -85,6 +85,196 @@ public abstract class GridCacheAbstractMetricsSelfTest extends GridCacheAbstract
}
}
+ /** {@inheritDoc} */
+ @Override protected void beforeTest() throws Exception {
+ super.beforeTest();
+
+ for (int i = 0; i < gridCount(); i++) {
+ Ignite g = grid(i);
+
+ g.cache(null).configuration().setStatisticsEnabled(true);
+ }
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testRemoveAvgTime() throws Exception {
+ IgniteCache<Integer, Integer> jcache = grid(0).jcache(null);
+ GridCache<Object, Object> cache = grid(0).cache(null);
+
+ jcache.put(1, 1);
+ jcache.put(2, 2);
+
+ assertEquals(cache.metrics().getAverageRemoveTime(), 0.0, 0.0);
+
+ long start = System.nanoTime();
+
+ jcache.remove(1);
+
+ float times = (System.nanoTime() - start) * 1.f / 1000;
+
+ float averageRemoveTime = cache.metrics().getAverageRemoveTime();
+
+ assert averageRemoveTime > 0;
+
+ assertEquals(times, averageRemoveTime, times / 10);
+
+ jcache.remove(2);
+
+ assert cache.metrics().getAverageRemoveTime() > 0;
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testRemoveAllAvgTime() throws Exception {
+ IgniteCache<Integer, Integer> jcache = grid(0).jcache(null);
+ GridCache<Object, Object> cache = grid(0).cache(null);
+
+ jcache.put(1, 1);
+ jcache.put(2, 2);
+ jcache.put(3, 3);
+
+ assertEquals(cache.metrics().getAverageRemoveTime(), 0.0, 0.0);
+
+ long start = System.nanoTime();
+
+ Set<Integer> keys = new HashSet<>(4, 1);
+ keys.add(1);
+ keys.add(2);
+ keys.add(3);
+
+ jcache.removeAll(keys);
+
+ float times = (System.nanoTime() - start) * 1.f / 3 / 1000;
+
+ float averageRemoveTime = cache.metrics().getAverageRemoveTime();
+
+ assert averageRemoveTime > 0;
+ assertEquals(times, averageRemoveTime, times / 10);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testGetAvgTime() throws Exception {
+ IgniteCache<Integer, Integer> jcache = grid(0).jcache(null);
+ GridCache<Object, Object> cache = grid(0).cache(null);
+
+ jcache.put(1, 1);
+
+ assertEquals(0.0, cache.metrics().getAverageGetTime(), 0.0);
+ assertEquals(0, cache.metrics().reads());
+
+ long start = System.nanoTime();
+
+ jcache.get(1);
+
+ float times = (System.nanoTime() - start) * 1.f / 1000;
+
+ float averageGetTime = cache.metrics().getAverageGetTime();
+
+ assert averageGetTime > 0;
+
+ assertEquals(1, cache.metrics().reads());
+ assertEquals(times, averageGetTime, times / 3);
+
+ jcache.get(2);
+
+ assert cache.metrics().getAverageGetTime() > 0;
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testGetAllAvgTime() throws Exception {
+ IgniteCache<Integer, Integer> jcache = grid(0).jcache(null);
+ GridCache<Object, Object> cache = grid(0).cache(null);
+
+ jcache.put(1, 1);
+ jcache.put(2, 2);
+ jcache.put(3, 3);
+
+ assertEquals(0.0, cache.metrics().getAverageGetTime(), 0.0);
+ assertEquals(0, cache.metrics().reads());
+
+ long start = System.nanoTime();
+
+ Set<Integer> keys = new HashSet<>();
+ keys.add(1);
+ keys.add(2);
+ keys.add(3);
+
+ jcache.getAll(keys);
+
+ float times = (System.nanoTime() - start) * 1.f / 3 / 1000;
+
+ float averageGetTime = cache.metrics().getAverageGetTime();
+
+ assert averageGetTime > 0;
+ assertEquals(3, cache.metrics().reads());
+ assertEquals(times, averageGetTime, times / 3);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testPutAvgTime() throws Exception {
+ IgniteCache<Integer, Integer> jcache = grid(0).jcache(null);
+ GridCache<Object, Object> cache = grid(0).cache(null);
+
+ assertEquals(0.0, cache.metrics().getAveragePutTime(), 0.0);
+ assertEquals(0, cache.metrics().writes());
+
+ long start = System.nanoTime();
+
+ jcache.put(1, 1);
+
+ float times = (System.nanoTime() - start) * 1.f / 1000;
+
+ float averagePutTime = cache.metrics().getAveragePutTime();
+
+ assert averagePutTime > 0;
+
+ assertEquals(1, cache.metrics().writes());
+ assertEquals(times, averagePutTime, times / 3);
+
+ jcache.put(2, 2);
+
+ assert cache.metrics().getAveragePutTime() > 0;
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testPutAllAvgTime() throws Exception {
+ IgniteCache<Integer, Integer> jcache = grid(0).jcache(null);
+ GridCache<Object, Object> cache = grid(0).cache(null);
+
+ assertEquals(0.0, cache.metrics().getAveragePutTime(), 0.0);
+ assertEquals(0, cache.metrics().writes());
+
+ Map<Integer, Integer> values = new HashMap<>();
+
+ values.put(1, 1);
+ values.put(2, 2);
+ values.put(3, 3);
+
+ long start = System.nanoTime();
+
+ jcache.putAll(values);
+
+ float times = (System.nanoTime() - start) * 1.f / 1000 / values.size();
+
+ float averagePutTime = cache.metrics().getAveragePutTime();
+
+ assert averagePutTime > 0;
+
+ assertEquals(values.size(), cache.metrics().writes());
+ assertEquals(times, averagePutTime, times / 3);
+ }
+
/**
* @throws Exception If failed.
*/
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d8ecf41a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCachePartitionedMetricsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCachePartitionedMetricsSelfTest.java b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCachePartitionedMetricsSelfTest.java
index 472f544..d7b37c4 100644
--- a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCachePartitionedMetricsSelfTest.java
+++ b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCachePartitionedMetricsSelfTest.java
@@ -57,4 +57,14 @@ public class GridCachePartitionedMetricsSelfTest extends GridCacheTransactionalA
@Override protected int gridCount() {
return GRID_CNT;
}
+
+ /** {@inheritDoc} */
+ @Override public void testGetAllAvgTime() throws Exception {
+ //TODO: GG-7578
+ }
+
+ /** {@inheritDoc} */
+ @Override public void testGetAvgTime() throws Exception {
+ //TODO: GG-7578
+ }
}