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 2017/01/18 15:27:38 UTC

[2/9] ignite git commit: ignite-db-x-opt

ignite-db-x-opt


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/658d2075
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/658d2075
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/658d2075

Branch: refs/heads/ignite-db-x-opt
Commit: 658d2075c423a5b993fe434df76bc66d8a4969c0
Parents: 7493f23
Author: sboikov <sb...@gridgain.com>
Authored: Wed Dec 14 13:49:10 2016 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Dec 14 13:49:10 2016 +0300

----------------------------------------------------------------------
 .../ignite/internal/GridKernalContext.java      |   6 +-
 .../ignite/internal/GridKernalContextImpl.java  |  45 +++---
 .../processors/cache/GridCacheContext.java      |  13 +-
 .../processors/cache/GridCacheMapEntry.java     |   7 +-
 .../processors/cache/GridCacheProcessor.java    |   9 +-
 .../cache/IgniteCacheOffheapManagerImpl.java    |  53 ++------
 .../processors/cache/IgniteCacheProxy.java      |  11 +-
 .../dht/atomic/GridDhtAtomicCache.java          |  27 ++--
 .../ignite/internal/util/CacheStatistics.java   |  65 +++++++++
 .../ignite/internal/util/DebugStatistic.java    |  60 --------
 .../ignite/internal/util/DebugStatistics.java   |  47 -------
 .../internal/util/InternalStatistics.java       | 136 +++++++++++++++++++
 .../internal/util/OperationStatistic.java       |  78 +++++++++++
 .../ignite/internal/util/PutStatistic.java      |  61 +++++++++
 .../loadtests/hashmap/GridCacheTestContext.java |   3 +-
 15 files changed, 419 insertions(+), 202 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
index 556d8d8..102a696 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
@@ -42,8 +42,8 @@ import org.apache.ignite.internal.processors.cluster.ClusterProcessor;
 import org.apache.ignite.internal.processors.continuous.GridContinuousProcessor;
 import org.apache.ignite.internal.processors.datastreamer.DataStreamProcessor;
 import org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor;
-import org.apache.ignite.internal.processors.hadoop.HadoopProcessorAdapter;
 import org.apache.ignite.internal.processors.hadoop.HadoopHelper;
+import org.apache.ignite.internal.processors.hadoop.HadoopProcessorAdapter;
 import org.apache.ignite.internal.processors.igfs.IgfsHelper;
 import org.apache.ignite.internal.processors.igfs.IgfsProcessorAdapter;
 import org.apache.ignite.internal.processors.job.GridJobProcessor;
@@ -63,8 +63,8 @@ import org.apache.ignite.internal.processors.service.GridServiceProcessor;
 import org.apache.ignite.internal.processors.session.GridTaskSessionProcessor;
 import org.apache.ignite.internal.processors.task.GridTaskProcessor;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
-import org.apache.ignite.internal.util.DebugStatistic;
 import org.apache.ignite.internal.util.IgniteExceptionRegistry;
+import org.apache.ignite.internal.util.InternalStatistics;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.plugin.PluginNotFoundException;
 import org.apache.ignite.plugin.PluginProvider;
@@ -606,5 +606,5 @@ public interface GridKernalContext extends Iterable<GridComponent> {
      */
     public PlatformProcessor platform();
 
-    public DebugStatistic addStatistic(String name);
+    public InternalStatistics stats();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
index 0db19bd..d7c6e5d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
@@ -58,8 +58,8 @@ import org.apache.ignite.internal.processors.cluster.ClusterProcessor;
 import org.apache.ignite.internal.processors.continuous.GridContinuousProcessor;
 import org.apache.ignite.internal.processors.datastreamer.DataStreamProcessor;
 import org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor;
-import org.apache.ignite.internal.processors.hadoop.HadoopProcessorAdapter;
 import org.apache.ignite.internal.processors.hadoop.HadoopHelper;
+import org.apache.ignite.internal.processors.hadoop.HadoopProcessorAdapter;
 import org.apache.ignite.internal.processors.igfs.IgfsHelper;
 import org.apache.ignite.internal.processors.igfs.IgfsProcessorAdapter;
 import org.apache.ignite.internal.processors.job.GridJobProcessor;
@@ -80,9 +80,8 @@ import org.apache.ignite.internal.processors.service.GridServiceProcessor;
 import org.apache.ignite.internal.processors.session.GridTaskSessionProcessor;
 import org.apache.ignite.internal.processors.task.GridTaskProcessor;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
-import org.apache.ignite.internal.util.DebugStatistic;
-import org.apache.ignite.internal.util.DebugStatistics;
 import org.apache.ignite.internal.util.IgniteExceptionRegistry;
+import org.apache.ignite.internal.util.InternalStatistics;
 import org.apache.ignite.internal.util.spring.IgniteSpringHelper;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
@@ -356,7 +355,7 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
     private volatile boolean disconnected;
 
     /** */
-    private DebugStatistics debugStatistics;
+    private InternalStatistics internalStatistics;
 
     /**
      * No-arg constructor is required by externalization.
@@ -435,30 +434,32 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
                     "META-INF/ignite.xml.");
         }
 
-        debugStatistics = new DebugStatistics();
+        internalStatistics = new InternalStatistics();
 
-        final DebugStatistics stat0 = debugStatistics;
+        final InternalStatistics stat0 = internalStatistics;
 
-        final IgniteLogger log0 = log(getClass());
+        if (config().getGridLogger() != null) {
+            final IgniteLogger log0 = log(getClass());
 
-        Thread thread = new Thread() {
-            @Override public void run() {
-                try {
-                    while (true) {
-                        stat0.dump(log0);
+            Thread thread = new Thread() {
+                @Override public void run() {
+                    try {
+                        while (true) {
+                            stat0.dump(log0);
 
-                        Thread.sleep(5000);
+                            Thread.sleep(5000);
+                        }
+                    }
+                    catch (Exception e) {
+                        e.printStackTrace();
                     }
                 }
-                catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        };
+            };
 
-        thread.setDaemon(true);
+            thread.setDaemon(true);
 
-        thread.start();
+            thread.start();
+        }
     }
 
     /** {@inheritDoc} */
@@ -1044,8 +1045,8 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
     }
 
     /** {@inheritDoc} */
-    @Override public DebugStatistic addStatistic(String name) {
-        return debugStatistics.add(name);
+    @Override public InternalStatistics stats() {
+        return internalStatistics;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
index 7a2009f..e42d42b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
@@ -82,6 +82,7 @@ import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProces
 import org.apache.ignite.internal.processors.closure.GridClosureProcessor;
 import org.apache.ignite.internal.processors.plugin.CachePluginManager;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
+import org.apache.ignite.internal.util.CacheStatistics;
 import org.apache.ignite.internal.util.F0;
 import org.apache.ignite.internal.util.lang.GridFunc;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
@@ -243,6 +244,9 @@ public class GridCacheContext<K, V> implements Externalizable {
     /** */
     private boolean customAffMapper;
 
+    /** */
+    private CacheStatistics stats;
+
     /**
      * Empty constructor required for {@link Externalizable}.
      */
@@ -294,7 +298,8 @@ public class GridCacheContext<K, V> implements Externalizable {
         IgniteCacheOffheapManager offheapMgr,
         CacheConflictResolutionManager<K, V> rslvrMgr,
         CachePluginManager pluginMgr,
-        GridCacheAffinityManager affMgr
+        GridCacheAffinityManager affMgr,
+        CacheStatistics stats
     ) {
         assert ctx != null;
         assert sharedCtx != null;
@@ -355,6 +360,12 @@ public class GridCacheContext<K, V> implements Externalizable {
             expiryPlc = null;
 
         itHolder = new CacheWeakQueryIteratorsHolder(log);
+
+        this.stats = stats;
+    }
+
+    public CacheStatistics stats() {
+        return stats;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
index 7a577d6..7fbfd26 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
@@ -36,6 +36,7 @@ import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.cache.CacheAtomicWriteOrderMode;
 import org.apache.ignite.cache.eviction.EvictableEntry;
+import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.pagemem.wal.StorageException;
 import org.apache.ignite.internal.pagemem.wal.record.DataEntry;
 import org.apache.ignite.internal.pagemem.wal.record.DataRecord;
@@ -4062,15 +4063,15 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
 
     /** {@inheritDoc} */
     @Override public boolean equals(Object o) {
-        if (true)
-            throw new IgniteException("Error");
-
         // Identity comparison left on purpose.
         return o == this;
     }
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
+        if (true)
+            throw new IgniteException("hasCode should not be called");
+
         return hash;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index b470940..3db8a74 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -101,6 +101,7 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersionManag
 import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor;
 import org.apache.ignite.internal.processors.plugin.CachePluginManager;
 import org.apache.ignite.internal.processors.query.GridQueryProcessor;
+import org.apache.ignite.internal.util.CacheStatistics;
 import org.apache.ignite.internal.util.F0;
 import org.apache.ignite.internal.util.future.GridCompoundFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
@@ -1353,6 +1354,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
         boolean affNode = CU.affinityNode(ctx.discovery().localNode(), cfg.getNodeFilter());
 
+        CacheStatistics stats = ctx.stats().cache();
+
         GridCacheContext<?, ?> cacheCtx = new GridCacheContext(
             ctx,
             sharedCtx,
@@ -1376,7 +1379,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             offheapMgr,
             rslvrMgr,
             pluginMgr,
-            affMgr
+            affMgr,
+            stats
         );
 
         cacheCtx.cacheObjectContext(cacheObjCtx);
@@ -1504,7 +1508,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 offheapMgr,
                 rslvrMgr,
                 pluginMgr,
-                affMgr
+                affMgr,
+                stats
             );
 
             cacheCtx.cacheObjectContext(cacheObjCtx);

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index 084b938..da2c070 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -50,7 +50,6 @@ import org.apache.ignite.internal.processors.cache.local.GridLocalCache;
 import org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.query.GridQueryProcessor;
-import org.apache.ignite.internal.util.DebugStatistic;
 import org.apache.ignite.internal.util.GridAtomicLong;
 import org.apache.ignite.internal.util.GridCloseableIteratorAdapter;
 import org.apache.ignite.internal.util.GridEmptyCloseableIterator;
@@ -67,6 +66,10 @@ import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_IDX;
 import static org.apache.ignite.internal.pagemem.PageIdAllocator.INDEX_PARTITION;
+import static org.apache.ignite.internal.util.PutStatistic.Ops.FIND_ONE;
+import static org.apache.ignite.internal.util.PutStatistic.Ops.STORE_ADD;
+import static org.apache.ignite.internal.util.PutStatistic.Ops.STORE_RMV;
+import static org.apache.ignite.internal.util.PutStatistic.Ops.TREE_PUT;
 
 /**
  *
@@ -94,18 +97,6 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
     /** */
     private final GridAtomicLong globalRmvId = new GridAtomicLong(U.currentTimeMillis() * 1000_000);
 
-    /** */
-    private DebugStatistic storeAddStat;
-
-    /** */
-    private DebugStatistic storeRmvStat;
-
-    /** */
-    private DebugStatistic treePutStat;
-
-    /** */
-    private DebugStatistic treeFindOneStat;
-
     /** {@inheritDoc} */
     @Override public GridAtomicLong globalRemoveId() {
         return globalRmvId;
@@ -133,11 +124,6 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
                 cctx.shared().database().checkpointReadUnlock();
             }
         }
-
-        storeAddStat = cctx.kernalContext().addStatistic(cctx.name() + "-storeAdd");
-        storeRmvStat = cctx.kernalContext().addStatistic(cctx.name() + "-storeRmv");
-        treePutStat = cctx.kernalContext().addStatistic(cctx.name() + "-treePut");
-        treeFindOneStat = cctx.kernalContext().addStatistic(cctx.name() + "-treeFindOne");
     }
 
     /**
@@ -851,27 +837,24 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
             key.valueBytes(cctx.cacheObjectContext());
             val.valueBytes(cctx.cacheObjectContext());
 
-            long start = storeAddStat.start();
+            cctx.stats().opStart(STORE_ADD);
 
             rowStore.addRow(dataRow);
 
-            storeAddStat.addTime(start);
+            cctx.stats().opEnd(STORE_ADD);
 
             assert dataRow.link() != 0 : dataRow;
 
-            start = treePutStat.start();
+            cctx.stats().opStart(TREE_PUT);
 
             DataRow old = dataTree.put(dataRow);
 
-            treePutStat.addTime(start);
+            cctx.stats().opEnd(TREE_PUT);
 
             if (old == null)
                 storageSize.incrementAndGet();
 
             if (indexingEnabled) {
-                if (true)
-                    throw new IgniteException("Error");
-
                 GridCacheQueryManager qryMgr = cctx.queries();
 
                 assert qryMgr.enabled();
@@ -885,26 +868,18 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
             if (old != null) {
                 assert old.link() != 0 : old;
 
-                if (pendingEntries != null && old.expireTime() != 0) {
-                    if (true)
-                        throw new IgniteException("Error");
-
+                if (pendingEntries != null && old.expireTime() != 0)
                     pendingEntries.remove(new PendingRow(old.expireTime(), old.link()));
-                }
 
-                start = storeRmvStat.start();
+                cctx.stats().opStart(STORE_RMV);
 
                 rowStore.removeRow(old.link());
 
-                storeRmvStat.addTime(start);
+                cctx.stats().opEnd(STORE_RMV);
             }
 
-            if (pendingEntries != null && expireTime != 0) {
-                if (true)
-                    throw new IgniteException("Error");
-
+            if (pendingEntries != null && expireTime != 0)
                 pendingEntries.put(new PendingRow(expireTime, dataRow.link()));
-            }
         }
 
         /** {@inheritDoc} */
@@ -942,13 +917,13 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
         /** {@inheritDoc} */
         @Override public CacheDataRow find(KeyCacheObject key)
             throws IgniteCheckedException {
-            long start = treeFindOneStat.start();
+            cctx.stats().opStart(FIND_ONE);
 
             try {
                 return dataTree.findOne(new KeySearchRow(key.hashCode(), key, 0));
             }
             finally {
-                treeFindOneStat.addTime(start);
+                cctx.stats().opEnd(FIND_ONE);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/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 8908a11..2b87715 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
@@ -64,13 +64,11 @@ import org.apache.ignite.internal.AsyncSupportAdapter;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.binary.BinaryUtils;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.query.CacheQuery;
 import org.apache.ignite.internal.processors.cache.query.CacheQueryFuture;
 import org.apache.ignite.internal.processors.cache.query.GridCacheQueryType;
 import org.apache.ignite.internal.processors.query.GridQueryProcessor;
-import org.apache.ignite.internal.util.DebugStatistic;
 import org.apache.ignite.internal.util.GridCloseableIteratorAdapter;
 import org.apache.ignite.internal.util.GridEmptyIterator;
 import org.apache.ignite.internal.util.future.IgniteFutureImpl;
@@ -136,9 +134,6 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V
     @GridToStringExclude
     private boolean lock;
 
-    /** */
-    private DebugStatistic putStat;
-
     /**
      * Empty constructor required for {@link Externalizable}.
      */
@@ -189,8 +184,6 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V
         internalProxy = new GridCacheProxyImpl<>(ctx, delegate, opCtx);
 
         this.lock = lock;
-
-        putStat = ctx.kernalContext().addStatistic(ctx.name() + "-put");
     }
 
     /**
@@ -1351,7 +1344,7 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V
     /** {@inheritDoc} */
     @Override public void put(K key, V val) {
         try {
-            long start = putStat.start();
+            ctx.stats().putStart();
 
             GridCacheGateway<K, V> gate = this.gate;
 
@@ -1382,7 +1375,7 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V
             finally {
                 onLeave(gate, prev);
 
-                putStat.addTime(start);
+                ctx.stats().putEnd();
             }
         }
         catch (IgniteCheckedException e) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
index c3a7ca1..c5ed1e7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
@@ -81,7 +81,6 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalEx;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersionConflictContext;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx;
-import org.apache.ignite.internal.util.DebugStatistic;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.future.GridEmbeddedFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
@@ -118,6 +117,9 @@ import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isNearE
 import static org.apache.ignite.internal.processors.dr.GridDrType.DR_BACKUP;
 import static org.apache.ignite.internal.processors.dr.GridDrType.DR_NONE;
 import static org.apache.ignite.internal.processors.dr.GridDrType.DR_PRIMARY;
+import static org.apache.ignite.internal.util.PutStatistic.Ops.LOCK;
+import static org.apache.ignite.internal.util.PutStatistic.Ops.UNLOCK;
+import static org.apache.ignite.internal.util.PutStatistic.Ops.UPDATE_INTERNAL;
 
 /**
  * Non-transactional partitioned cache.
@@ -229,12 +231,6 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
         };
     }
 
-    /** */
-    private DebugStatistic updateStat;
-
-    /** */
-    private DebugStatistic lockStat;
-
     /** {@inheritDoc} */
     @SuppressWarnings({"IfMayBeConditional", "SimplifiableIfStatement"})
     @Override public void start() throws IgniteCheckedException {
@@ -298,9 +294,6 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
 
         preldr.start();
 
-        updateStat = ctx.kernalContext().addStatistic("update-" + cacheCfg.getName());
-        lockStat = ctx.kernalContext().addStatistic("lock-" + cacheCfg.getName());
-
         ctx.io().addHandler(
             ctx.cacheId(),
             GridNearGetRequest.class,
@@ -1699,7 +1692,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
         GridNearAtomicAbstractUpdateRequest req,
         CI2<GridNearAtomicAbstractUpdateRequest, GridNearAtomicUpdateResponse> completionCb
     ) {
-        long start = updateStat.start();
+        ctx.stats().opStart(UPDATE_INTERNAL);
 
         GridNearAtomicUpdateResponse res = new GridNearAtomicUpdateResponse(ctx.cacheId(), nodeId, req.futureVersion(),
             ctx.deploymentEnabled());
@@ -1717,11 +1710,11 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
         try {
             // If batch store update is enabled, we need to lock all entries.
             // First, need to acquire locks on cache entries, then check filter.
-            long lockStart = lockStat.start();
+            ctx.stats().opStart(LOCK);
 
             List<GridDhtCacheEntry> locked = lockEntries(req, req.topologyVersion());
 
-            lockStat.addTime(lockStart);
+            ctx.stats().opEnd(LOCK);
 
             Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted = null;
 
@@ -1852,9 +1845,13 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                 e.printStackTrace();
             }
             finally {
+                ctx.stats().opStart(UNLOCK);
+
                 if (locked != null)
                     unlockEntries(locked, req.topologyVersion());
 
+                ctx.stats().opEnd(UNLOCK);
+
                 // Enqueue if necessary after locks release.
                 if (deleted != null) {
                     assert !deleted.isEmpty();
@@ -1893,7 +1890,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
             return;
         }
         finally {
-            updateStat.addTime(start);
+            ctx.stats().opEnd(UPDATE_INTERNAL);
         }
 
         if (remap) {
@@ -2923,7 +2920,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
      * @param locked Locked entries.
      * @param topVer Topology version.
      */
-    private void unlockEntries(Collection<GridDhtCacheEntry> locked, AffinityTopologyVersion topVer) {
+    private void unlockEntries(List<GridDhtCacheEntry> locked, AffinityTopologyVersion topVer) {
         // Process deleted entries before locks release.
         assert ctx.deferredDelete() : this;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/util/CacheStatistics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/CacheStatistics.java b/modules/core/src/main/java/org/apache/ignite/internal/util/CacheStatistics.java
new file mode 100644
index 0000000..ab6d614
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/CacheStatistics.java
@@ -0,0 +1,65 @@
+/*
+ * 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.ignite.internal.util;
+
+/**
+ *
+ */
+public class CacheStatistics {
+    /** */
+    private final ThreadLocal<PutStatistic> putStat = new ThreadLocal<>();
+
+    private final InternalStatistics stats;
+
+    public CacheStatistics(InternalStatistics stats) {
+        this.stats = stats;
+    }
+
+    public void putStart() {
+        PutStatistic stat = putStat.get();
+
+        if (stat == null)
+            putStat.set(stat = new PutStatistic());
+
+        stat.start();
+    }
+
+    public void putEnd() {
+        PutStatistic stat = putStat.get();
+
+        if (stat != null) {
+            stat.end();
+
+            stats.add(stat);
+        }
+    }
+
+    public final void opStart(Enum op) {
+        PutStatistic stat = putStat.get();
+
+        if (stat != null)
+            stat.startOp(op.ordinal());
+    }
+
+    public final void opEnd(Enum op) {
+        PutStatistic stat = putStat.get();
+
+        if (stat != null)
+            stat.endOp(op.ordinal());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/util/DebugStatistic.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/DebugStatistic.java b/modules/core/src/main/java/org/apache/ignite/internal/util/DebugStatistic.java
deleted file mode 100644
index e1f0619..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/DebugStatistic.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.ignite.internal.util;
-
-import org.jsr166.LongAdder8;
-
-/**
- *
- */
-public class DebugStatistic {
-    /** */
-    private final String name;
-
-    /** */
-    private final LongAdder8 time = new LongAdder8();
-
-    /** */
-    private final LongAdder8 cnt = new LongAdder8();
-
-    DebugStatistic(String name) {
-        this.name = name;
-    }
-
-    public long start() {
-        return System.nanoTime();
-    }
-
-    public String name() {
-        return name;
-    }
-
-    public void addTime(long start) {
-        time.add(System.nanoTime() - start);
-
-        cnt.increment();
-    }
-
-    public LongAdder8 time() {
-        return time;
-    }
-
-    public LongAdder8 count() {
-        return cnt;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/util/DebugStatistics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/DebugStatistics.java b/modules/core/src/main/java/org/apache/ignite/internal/util/DebugStatistics.java
deleted file mode 100644
index c094192..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/DebugStatistics.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.ignite.internal.util;
-
-import java.util.concurrent.CopyOnWriteArrayList;
-import org.apache.ignite.IgniteLogger;
-
-/**
- *
- */
-public class DebugStatistics {
-    /** */
-    private final CopyOnWriteArrayList<DebugStatistic> stats = new CopyOnWriteArrayList<>();
-
-    public DebugStatistic add(String name) {
-        DebugStatistic stat = new DebugStatistic(name);
-
-        stats.add(stat);
-
-        return stat;
-    }
-
-    public void dump(IgniteLogger log) {
-        for (DebugStatistic stat : stats) {
-            long cnt = stat.count().sumThenReset();
-            long time = stat.time().sumThenReset();
-
-            if (cnt > 0)
-                log.info("Statistic [name=" + stat.name() + ", cnt=" + time + ", avg=" + (time / (double)cnt) + ']');
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/util/InternalStatistics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/InternalStatistics.java b/modules/core/src/main/java/org/apache/ignite/internal/util/InternalStatistics.java
new file mode 100644
index 0000000..c4312a8
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/InternalStatistics.java
@@ -0,0 +1,136 @@
+/*
+ * 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.ignite.internal.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.apache.ignite.IgniteLogger;
+import org.jsr166.LongAdder8;
+
+/**
+ *
+ */
+public class InternalStatistics {
+    /** */
+    private final CacheStatistics cache;
+
+    /** */
+    private final ConcurrentMap<Class<?>, StatAggregate> stats = new ConcurrentHashMap<>();
+
+    public InternalStatistics() {
+        cache = new CacheStatistics(this);
+    }
+
+    public void dump(IgniteLogger log) {
+        for (StatAggregate stat : stats.values())
+            stat.dump(log);
+    }
+
+    public void add(OperationStatistic stat) {
+        StatAggregate agg = stats.get(stat.getClass());
+
+        if (agg == null) {
+            StatAggregate old = stats.putIfAbsent(stat.getClass(), agg = new StatAggregate(stat));
+
+            if (old != null)
+                agg = old;
+        }
+
+        agg.add(stat);
+    }
+
+    public CacheStatistics cache() {
+        return cache;
+    }
+
+    /**
+     *
+     */
+    static class StatAggregate {
+        /** */
+        private final LongAdder8 totalTime = new LongAdder8();
+
+        /** */
+        private final LongAdder8 cnt = new LongAdder8();
+
+        /** */
+        private final LongAdder8[] times;
+
+        /** */
+        private final OperationStatistic op;
+
+        StatAggregate(OperationStatistic op) {
+            this.op = op;
+
+            this.times = new LongAdder8[op.time().length];
+
+            for (int i = 0; i < times.length; i++)
+                times[i] = new LongAdder8();
+        }
+
+        void dump(IgniteLogger log) {
+            long cnt = this.cnt.sumThenReset();
+            long totalTime = this.totalTime.sumThenReset();
+
+            if (cnt > 0) {
+                double totAvg = (totalTime / (double)cnt);
+
+                log.info(String.format("Total statistic [name=%s, cnt=%d, avg=%.2f]",
+                    op.getClass().getSimpleName(),
+                    cnt,
+                    totAvg));
+
+                for (int i = 0; i < times.length; i++) {
+                    long time = times[i].sumThenReset();
+
+                    if (time > 0) {
+                        double avg = (time / (double)cnt);
+
+                        log.info(String.format("Part statistic [name=%s, cnt=%d, avg=%.2f, p=%.2f]",
+                            op.opName(i),
+                            cnt,
+                            avg,
+                            avg / totAvg));
+                    }
+                }
+            }
+            else {
+                for (int i = 0; i < times.length; i++)
+                    times[i].sumThenReset();
+            }
+        }
+
+        public void add(OperationStatistic op) {
+            if (op.endTime() > 0) {
+                cnt.increment();
+
+                totalTime.add(op.endTime() - op.startTime());
+
+                long time[] = op.time();
+
+                for (int i = 0; i < time.length; i++) {
+                    long time0 = time[i];
+
+                    if (time0 > 0)
+                        times[i].add(time0);
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/util/OperationStatistic.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/OperationStatistic.java b/modules/core/src/main/java/org/apache/ignite/internal/util/OperationStatistic.java
new file mode 100644
index 0000000..6de5f5e
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/OperationStatistic.java
@@ -0,0 +1,78 @@
+/*
+ * 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.ignite.internal.util;
+
+import java.util.Arrays;
+
+/**
+ *
+ */
+public class OperationStatistic {
+    /** */
+    private long startTime;
+
+    /** */
+    private long endTime;
+
+    /** */
+    private final long[] time;
+
+    OperationStatistic(int ops) {
+        time = new long[ops];
+    }
+
+    public final long[] time() {
+        return time;
+    }
+
+    public final long startTime() {
+        return startTime;
+    }
+
+    public final long endTime() {
+        return endTime;
+    }
+
+    public String opName(int op) {
+        return "N/A";
+    }
+
+    public final void start() {
+        startTime = System.nanoTime();
+
+        Arrays.fill(time, -1L);
+    }
+
+    public final void end() {
+        endTime = System.nanoTime();
+    }
+
+    public final void startOp(int op) {
+        assert time[op] == -1L : time[op];
+
+        time[op] = System.nanoTime();
+    }
+
+    public final void endOp(int op) {
+        long start = time[op];
+
+        assert start > 0 : start;
+
+        time[op] = System.nanoTime() - start;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/main/java/org/apache/ignite/internal/util/PutStatistic.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/PutStatistic.java b/modules/core/src/main/java/org/apache/ignite/internal/util/PutStatistic.java
new file mode 100644
index 0000000..fbd72b0
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/PutStatistic.java
@@ -0,0 +1,61 @@
+/*
+ * 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.ignite.internal.util;
+
+/**
+ *
+ */
+public class PutStatistic extends OperationStatistic {
+    /** */
+    private static final Ops VALS[] = Ops.values();
+
+    PutStatistic() {
+        super(VALS.length);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String opName(int op) {
+        return VALS[op].name();
+    }
+
+    /**
+     *
+     */
+    public enum Ops {
+        /** */
+        UPDATE_INTERNAL,
+
+        /** */
+        FIND_ONE,
+
+        /** */
+        LOCK,
+
+        /** */
+        UNLOCK,
+
+        /** */
+        STORE_ADD,
+
+        /** */
+        STORE_RMV,
+
+        /** */
+        TREE_PUT;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/658d2075/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
index cec9e30..71d4886 100644
--- a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
+++ b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
@@ -91,7 +91,8 @@ public class GridCacheTestContext<K, V> extends GridCacheContext<K, V> {
             null,
             new CacheOsConflictResolutionManager<K, V>(),
             new CachePluginManager(ctx, new CacheConfiguration()),
-            new GridCacheAffinityManager()
+            new GridCacheAffinityManager(),
+            null
         );
 
         store().initialize(null, new IdentityHashMap<CacheStore, ThreadLocal>());