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 <[email protected]> Authored: Wed Dec 14 13:49:10 2016 +0300 Committer: sboikov <[email protected]> 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>());
