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 2016/11/22 11:40:19 UTC

[30/50] [abbrv] ignite git commit: IGNITE-3443 Implemented metrics for queries monitoring.

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/core/src/main/resources/META-INF/classnames.properties
----------------------------------------------------------------------
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties
index ade21ce..0d291cc 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -75,11 +75,13 @@ org.apache.ignite.cache.eviction.sorted.SortedEvictionPolicy$HolderComparator
 org.apache.ignite.cache.query.CacheQueryEntryEvent
 org.apache.ignite.cache.query.ContinuousQuery
 org.apache.ignite.cache.query.Query
+org.apache.ignite.cache.query.QueryCancelledException
 org.apache.ignite.cache.query.ScanQuery
 org.apache.ignite.cache.query.SpiQuery
 org.apache.ignite.cache.query.SqlFieldsQuery
 org.apache.ignite.cache.query.SqlQuery
 org.apache.ignite.cache.query.TextQuery
+org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore$2
 org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore$EntryMapping$1
 org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore$EntryMapping$2
 org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore$TypeKind
@@ -366,6 +368,7 @@ org.apache.ignite.internal.processors.cache.CacheWeakQueryIteratorsHolder$WeakQu
 org.apache.ignite.internal.processors.cache.CacheWeakQueryIteratorsHolder$WeakReferenceCloseableIterator
 org.apache.ignite.internal.processors.cache.DynamicCacheChangeBatch
 org.apache.ignite.internal.processors.cache.DynamicCacheChangeRequest
+org.apache.ignite.internal.processors.cache.EntryProcessorResourceInjectorProxy
 org.apache.ignite.internal.processors.cache.GridCacheAdapter
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$10
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$11
@@ -373,9 +376,9 @@ org.apache.ignite.internal.processors.cache.GridCacheAdapter$12
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$13
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$14
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$15
-org.apache.ignite.internal.processors.cache.GridCacheAdapter$16$1
+org.apache.ignite.internal.processors.cache.GridCacheAdapter$16
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$17
-org.apache.ignite.internal.processors.cache.GridCacheAdapter$18
+org.apache.ignite.internal.processors.cache.GridCacheAdapter$18$1
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$2
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$26$1
 org.apache.ignite.internal.processors.cache.GridCacheAdapter$28
@@ -533,6 +536,7 @@ org.apache.ignite.internal.processors.cache.GridCacheUtils$8
 org.apache.ignite.internal.processors.cache.GridCacheUtils$9
 org.apache.ignite.internal.processors.cache.GridCacheValueCollection
 org.apache.ignite.internal.processors.cache.GridCacheValueCollection$1
+org.apache.ignite.internal.processors.cache.GridDeferredAckMessageSender$DeferredAckMessageBuffer
 org.apache.ignite.internal.processors.cache.IgniteCacheProxy
 org.apache.ignite.internal.processors.cache.IgniteCacheProxy$1
 org.apache.ignite.internal.processors.cache.IgniteCacheProxy$10
@@ -545,12 +549,13 @@ org.apache.ignite.internal.processors.cache.IgniteCacheProxy$8
 org.apache.ignite.internal.processors.cache.IgniteCacheProxy$9
 org.apache.ignite.internal.processors.cache.KeyCacheObject
 org.apache.ignite.internal.processors.cache.KeyCacheObjectImpl
+org.apache.ignite.internal.processors.cache.QueryCursorImpl$State
 org.apache.ignite.internal.processors.cache.affinity.GridCacheAffinityProxy
 org.apache.ignite.internal.processors.cache.binary.BinaryMetadataKey
 org.apache.ignite.internal.processors.cache.binary.CacheDefaultBinaryAffinityKeyMapper
 org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$1
-org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$4
 org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$5
+org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$6
 org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$MetaDataEntryFilter
 org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$MetaDataPredicate
 org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$MetadataProcessor
@@ -630,6 +635,7 @@ org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocal$2
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter$1
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter$2
+org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxOnePhaseCommitAckRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$2
 org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareFuture$3
@@ -670,25 +676,23 @@ org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomic
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$27
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$28
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$29
-org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$3
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$30
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$31
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$4
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$6
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$7
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$8
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$9
-org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$DeferredResponseBuffer
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicDeferredUpdateResponse
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicUpdateRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicUpdateResponse
+org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture$2
-org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFuture$3
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateFuture$1
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateFuture$2
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateFuture$3
-org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateFuture$4
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateRequest
 org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateResponse
 org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCache
@@ -760,6 +764,7 @@ org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockFuture$
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockFuture$2
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockFuture$3
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockFuture$4
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockFuture$LockTimeoutObject$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockFuture$MiniFuture$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockRequest
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockResponse
@@ -772,6 +777,7 @@ org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticS
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$2
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$3
+org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$4
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFuture$MiniFuture$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearOptimisticTxPrepareFutureAdapter$1
 org.apache.ignite.internal.processors.cache.distributed.near.GridNearPessimisticTxPrepareFuture$1
@@ -821,22 +827,23 @@ org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManag
 org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$7
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryAdapter$1
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryAdapter$ScanQueryFallbackClosableIterator
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryDetailMetricsAdapter
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter$1
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter$2
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$1$1
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$1$2
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$10
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$11
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$12
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$13
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$14
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$15$1
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$2
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$3
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$15
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$16
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$17$1
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$3$1
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$3$2
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$4
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$5
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$6
+org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$7
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$8
-org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$9
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$CacheSqlIndexMetadata
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$CacheSqlMetadata
 org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager$CachedResult$QueueIterator
@@ -896,6 +903,8 @@ org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$12
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$13
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$14
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$15
+org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$16
+org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$17
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$2
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$3
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxHandler$4
@@ -929,9 +938,9 @@ org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter$Po
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter$PostLockClosure1$4
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter$PostLockClosure2
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter$PostMissClosure
-org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$2
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$3
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$4
+org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$5
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$CommitListener
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$CommittedVersion
 org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager$NodeFailureTimeoutObject$1
@@ -1005,7 +1014,6 @@ org.apache.ignite.internal.processors.datastreamer.DataStreamerEntry
 org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$1
 org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$4
 org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$5
-org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$6
 org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$Buffer$1
 org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$Buffer$2
 org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$DataStreamerPda
@@ -1084,6 +1092,7 @@ org.apache.ignite.internal.processors.datastructures.GridCacheSetProxy
 org.apache.ignite.internal.processors.datastructures.GridSetQueryPredicate
 org.apache.ignite.internal.processors.dr.GridDrType
 org.apache.ignite.internal.processors.dr.IgniteDrDataStreamerCacheUpdater
+org.apache.ignite.internal.processors.hadoop.HadoopDefaultJobInfo
 org.apache.ignite.internal.processors.hadoop.HadoopFileBlock
 org.apache.ignite.internal.processors.hadoop.HadoopInputSplit
 org.apache.ignite.internal.processors.hadoop.HadoopJobId
@@ -1119,7 +1128,6 @@ org.apache.ignite.internal.processors.igfs.IgfsFragmentizerManager$IdentityHashS
 org.apache.ignite.internal.processors.igfs.IgfsFragmentizerRequest
 org.apache.ignite.internal.processors.igfs.IgfsFragmentizerResponse
 org.apache.ignite.internal.processors.igfs.IgfsHandshakeResponse
-org.apache.ignite.internal.processors.igfs.IgfsImpl$12$1
 org.apache.ignite.internal.processors.igfs.IgfsImpl$IgfsGlobalSpaceTask
 org.apache.ignite.internal.processors.igfs.IgfsImpl$IgfsGlobalSpaceTask$1
 org.apache.ignite.internal.processors.igfs.IgfsInputStreamDescriptor
@@ -1155,6 +1163,7 @@ org.apache.ignite.internal.processors.igfs.client.IgfsClientSummaryCallable
 org.apache.ignite.internal.processors.igfs.client.IgfsClientUpdateCallable
 org.apache.ignite.internal.processors.igfs.client.meta.IgfsClientMetaIdsForPathCallable
 org.apache.ignite.internal.processors.igfs.client.meta.IgfsClientMetaInfoForPathCallable
+org.apache.ignite.internal.processors.igfs.client.meta.IgfsClientMetaUnlockCallable
 org.apache.ignite.internal.processors.igfs.data.IgfsDataPutProcessor
 org.apache.ignite.internal.processors.igfs.meta.IgfsMetaDirectoryCreateProcessor
 org.apache.ignite.internal.processors.igfs.meta.IgfsMetaDirectoryListingAddProcessor
@@ -1172,6 +1181,8 @@ org.apache.ignite.internal.processors.igfs.meta.IgfsMetaUpdateTimesProcessor
 org.apache.ignite.internal.processors.job.GridJobProcessor$5
 org.apache.ignite.internal.processors.job.GridJobWorker$3
 org.apache.ignite.internal.processors.jobmetrics.GridJobMetricsProcessor$SnapshotReducer
+org.apache.ignite.internal.processors.odbc.OdbcProtocolVersion
+org.apache.ignite.internal.processors.odbc.escape.OdbcEscapeType
 org.apache.ignite.internal.processors.platform.PlatformAbstractConfigurationClosure
 org.apache.ignite.internal.processors.platform.PlatformAbstractPredicate
 org.apache.ignite.internal.processors.platform.PlatformEventFilterListener
@@ -1180,7 +1191,7 @@ org.apache.ignite.internal.processors.platform.PlatformExtendedException
 org.apache.ignite.internal.processors.platform.PlatformJavaObjectFactoryProxy
 org.apache.ignite.internal.processors.platform.PlatformNativeException
 org.apache.ignite.internal.processors.platform.PlatformNoCallbackException
-org.apache.ignite.internal.processors.platform.cache.PlatformCache$1
+org.apache.ignite.internal.processors.platform.cache.PlatformCache$5
 org.apache.ignite.internal.processors.platform.cache.PlatformCacheEntryFilter
 org.apache.ignite.internal.processors.platform.cache.PlatformCacheEntryFilterImpl
 org.apache.ignite.internal.processors.platform.cache.PlatformCacheEntryProcessor
@@ -1211,6 +1222,8 @@ org.apache.ignite.internal.processors.platform.cpp.PlatformCppConfigurationClosu
 org.apache.ignite.internal.processors.platform.datastreamer.PlatformStreamReceiver
 org.apache.ignite.internal.processors.platform.datastreamer.PlatformStreamReceiverImpl
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$1
+org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$10
+org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$11
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$2
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$3
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$4
@@ -1218,6 +1231,7 @@ org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$5
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$6
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$7
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$8
+org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore$9
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetConfigurationClosure
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetService
 org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetServiceImpl
@@ -1232,19 +1246,24 @@ org.apache.ignite.internal.processors.platform.transactions.PlatformTransactions
 org.apache.ignite.internal.processors.platform.utils.PlatformFutureUtils$1
 org.apache.ignite.internal.processors.platform.utils.PlatformFutureUtils$FutureListenable$1
 org.apache.ignite.internal.processors.platform.utils.PlatformFutureUtils$InternalFutureListenable$1
+org.apache.ignite.internal.processors.platform.websession.PlatformDotNetSessionLockProcessor
+org.apache.ignite.internal.processors.platform.websession.PlatformDotNetSessionSetAndUnlockProcessor
 org.apache.ignite.internal.processors.query.GridQueryFieldMetadata
 org.apache.ignite.internal.processors.query.GridQueryIndexType
-org.apache.ignite.internal.processors.query.GridQueryProcessor$2
 org.apache.ignite.internal.processors.query.GridQueryProcessor$3
 org.apache.ignite.internal.processors.query.GridQueryProcessor$4
 org.apache.ignite.internal.processors.query.GridQueryProcessor$5
 org.apache.ignite.internal.processors.query.GridQueryProcessor$6
+org.apache.ignite.internal.processors.query.GridQueryProcessor$7
+org.apache.ignite.internal.processors.query.GridQueryProcessor$8
 org.apache.ignite.internal.processors.query.GridQueryProcessor$IndexType
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryCancelRequest
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryFailResponse
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageRequest
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageResponse
 org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryRequest
+org.apache.ignite.internal.processors.resource.GridResourceIoc$AnnotationSet
+org.apache.ignite.internal.processors.resource.GridResourceIoc$ResourceAnnotation
 org.apache.ignite.internal.processors.rest.GridRestCommand
 org.apache.ignite.internal.processors.rest.GridRestProcessor$2$1
 org.apache.ignite.internal.processors.rest.GridRestProcessor$3
@@ -1332,7 +1351,7 @@ org.apache.ignite.internal.processors.service.ServiceDescriptorImpl
 org.apache.ignite.internal.processors.task.GridTaskProcessor$1
 org.apache.ignite.internal.processors.task.GridTaskThreadContextKey
 org.apache.ignite.internal.processors.task.GridTaskWorker$3
-org.apache.ignite.internal.processors.task.GridTaskWorker$4
+org.apache.ignite.internal.processors.task.GridTaskWorker$5
 org.apache.ignite.internal.processors.task.GridTaskWorker$State
 org.apache.ignite.internal.transactions.IgniteTxHeuristicCheckedException
 org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException
@@ -1356,6 +1375,7 @@ org.apache.ignite.internal.util.GridBoundedConcurrentOrderedMap
 org.apache.ignite.internal.util.GridBoundedConcurrentOrderedSet
 org.apache.ignite.internal.util.GridBoundedLinkedHashMap
 org.apache.ignite.internal.util.GridBoundedLinkedHashSet
+org.apache.ignite.internal.util.GridBoundedPriorityQueue
 org.apache.ignite.internal.util.GridByteArrayList
 org.apache.ignite.internal.util.GridCloseableIteratorAdapter
 org.apache.ignite.internal.util.GridCloseableIteratorAdapterEx
@@ -1407,14 +1427,14 @@ org.apache.ignite.internal.util.IgniteUtils$11
 org.apache.ignite.internal.util.IgniteUtils$12
 org.apache.ignite.internal.util.IgniteUtils$13
 org.apache.ignite.internal.util.IgniteUtils$14
-org.apache.ignite.internal.util.IgniteUtils$16
-org.apache.ignite.internal.util.IgniteUtils$2
-org.apache.ignite.internal.util.IgniteUtils$22
+org.apache.ignite.internal.util.IgniteUtils$15
+org.apache.ignite.internal.util.IgniteUtils$17
 org.apache.ignite.internal.util.IgniteUtils$23
 org.apache.ignite.internal.util.IgniteUtils$24
 org.apache.ignite.internal.util.IgniteUtils$25
 org.apache.ignite.internal.util.IgniteUtils$26
 org.apache.ignite.internal.util.IgniteUtils$27
+org.apache.ignite.internal.util.IgniteUtils$28
 org.apache.ignite.internal.util.IgniteUtils$3
 org.apache.ignite.internal.util.IgniteUtils$4
 org.apache.ignite.internal.util.IgniteUtils$5
@@ -1647,12 +1667,19 @@ org.apache.ignite.internal.visor.cache.VisorCachePartitionsTask
 org.apache.ignite.internal.visor.cache.VisorCachePartitionsTask$VisorCachePartitionsJob
 org.apache.ignite.internal.visor.cache.VisorCacheQueryConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheQueryConfigurationV2
+org.apache.ignite.internal.visor.cache.VisorCacheQueryDetailMetrics
+org.apache.ignite.internal.visor.cache.VisorCacheQueryDetailMetricsCollectorTask
+org.apache.ignite.internal.visor.cache.VisorCacheQueryDetailMetricsCollectorTask$VisorCacheQueryDetailMetricsCollectorJob
 org.apache.ignite.internal.visor.cache.VisorCacheQueryMetrics
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceConfiguration
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceTask
 org.apache.ignite.internal.visor.cache.VisorCacheRebalanceTask$VisorCachesRebalanceJob
 org.apache.ignite.internal.visor.cache.VisorCacheResetMetricsTask
 org.apache.ignite.internal.visor.cache.VisorCacheResetMetricsTask$VisorCacheResetMetricsJob
+org.apache.ignite.internal.visor.cache.VisorCacheResetQueryDetailMetricsTask
+org.apache.ignite.internal.visor.cache.VisorCacheResetQueryDetailMetricsTask$VisorCacheResetQueryDetailMetricsJob
+org.apache.ignite.internal.visor.cache.VisorCacheResetQueryMetricsTask
+org.apache.ignite.internal.visor.cache.VisorCacheResetQueryMetricsTask$VisorCacheResetQueryMetricsJob
 org.apache.ignite.internal.visor.cache.VisorCacheStartTask
 org.apache.ignite.internal.visor.cache.VisorCacheStartTask$VisorCacheStartArg
 org.apache.ignite.internal.visor.cache.VisorCacheStartTask$VisorCacheStartJob
@@ -1682,6 +1709,7 @@ org.apache.ignite.internal.visor.debug.VisorThreadLockInfo
 org.apache.ignite.internal.visor.debug.VisorThreadMonitorInfo
 org.apache.ignite.internal.visor.event.VisorGridDeploymentEvent
 org.apache.ignite.internal.visor.event.VisorGridDiscoveryEvent
+org.apache.ignite.internal.visor.event.VisorGridDiscoveryEventV2
 org.apache.ignite.internal.visor.event.VisorGridEvent
 org.apache.ignite.internal.visor.event.VisorGridEventsLost
 org.apache.ignite.internal.visor.event.VisorGridJobEvent
@@ -1769,6 +1797,7 @@ org.apache.ignite.internal.visor.util.VisorClusterGroupEmptyException
 org.apache.ignite.internal.visor.util.VisorEventMapper
 org.apache.ignite.internal.visor.util.VisorExceptionWrapper
 org.apache.ignite.internal.visor.util.VisorTaskUtils$4
+org.apache.ignite.internal.visor.util.VisorTaskUtils$5
 org.apache.ignite.internal.websession.WebSessionAttributeProcessor
 org.apache.ignite.internal.websession.WebSessionEntity
 org.apache.ignite.lang.IgniteBiClosure

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/core/src/test/java/org/apache/ignite/lang/utils/GridBoundedPriorityQueueSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/lang/utils/GridBoundedPriorityQueueSelfTest.java b/modules/core/src/test/java/org/apache/ignite/lang/utils/GridBoundedPriorityQueueSelfTest.java
new file mode 100644
index 0000000..bcaecc4
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/lang/utils/GridBoundedPriorityQueueSelfTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.lang.utils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.ignite.internal.util.GridBoundedPriorityQueue;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.common.GridCommonTest;
+
+/**
+ * Test for {@link GridBoundedPriorityQueue}.
+ */
+@GridCommonTest(group = "Lang")
+public class GridBoundedPriorityQueueSelfTest extends GridCommonAbstractTest {
+    /** Queue items comparator. */
+    private static final Comparator<Integer> CMP = new Comparator<Integer>() {
+        @Override public int compare(Integer o1, Integer o2) {
+            return Integer.compare(o1, o2);
+        }
+    };
+
+    /** Queue items reverse order comparator. */
+    private static final Comparator<Integer> CMP_REVERSE = Collections.reverseOrder(CMP);
+
+    /**
+     * Test eviction in bounded priority queue.
+     */
+    public void testEviction() {
+        GridBoundedPriorityQueue<Integer> queue = new GridBoundedPriorityQueue<>(3, CMP);
+
+        assertTrue(queue.offer(2));
+        assertTrue(queue.offer(1));
+        assertTrue(queue.offer(3));
+        assertTrue(queue.offer(4));
+
+        assertEquals(3, queue.size());
+
+        assertFalse(queue.offer(0)); // Item with lower priority should not be put into queue.
+
+        assertEquals(3, queue.size());
+
+        assertEquals(Integer.valueOf(2), queue.poll());
+        assertEquals(Integer.valueOf(3), queue.poll());
+        assertEquals(Integer.valueOf(4), queue.poll());
+
+        assertNull(queue.poll());
+        assertTrue(queue.isEmpty());
+
+        // Test queue with reverse comparator.
+        GridBoundedPriorityQueue<Integer> queueReverse = new GridBoundedPriorityQueue<>(3, CMP_REVERSE);
+
+        assertTrue(queueReverse.offer(2));
+        assertTrue(queueReverse.offer(1));
+        assertTrue(queueReverse.offer(3));
+
+        assertFalse(queueReverse.offer(4)); // Item with lower priority should not be put into queue.
+
+        assertEquals(Integer.valueOf(3), queueReverse.poll());
+        assertEquals(Integer.valueOf(2), queueReverse.poll());
+        assertEquals(Integer.valueOf(1), queueReverse.poll());
+
+        assertNull(queueReverse.poll());
+        assertTrue(queueReverse.isEmpty());
+
+        // Test put random 100 items into GridBoundedPriorityQueue(10) and check result.
+        queue = new GridBoundedPriorityQueue<>(10, CMP);
+        queueReverse = new GridBoundedPriorityQueue<>(10, CMP_REVERSE);
+
+        Random rnd = new Random();
+
+        List<Integer> items = new ArrayList<>(100);
+
+        for (int i = 0; i < 100; i++) {
+            Integer item = rnd.nextInt(100);
+
+            items.add(item);
+            queue.offer(item);
+            queueReverse.offer(item);
+        }
+
+        Collections.sort(items);
+
+        for (int i = 0; i < 10; i++) {
+            assertEquals(items.get(90 + i), queue.poll());
+            assertEquals(items.get(9 - i), queueReverse.poll());
+        }
+
+        assertNull(queue.poll());
+        assertTrue(queue.isEmpty());
+
+        assertNull(queueReverse.poll());
+        assertTrue(queueReverse.isEmpty());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java
index 71dc964..46053b3 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java
@@ -40,6 +40,7 @@ import org.apache.ignite.cache.CacheMetrics;
 import org.apache.ignite.cache.CachePeekMode;
 import org.apache.ignite.cache.query.Query;
 import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.QueryDetailMetrics;
 import org.apache.ignite.cache.query.QueryMetrics;
 import org.apache.ignite.cluster.ClusterGroup;
 import org.apache.ignite.internal.processors.cache.CacheEntryImpl;
@@ -188,6 +189,21 @@ public class IgniteCacheProcessProxy<K, V> implements IgniteCache<K, V> {
     }
 
     /** {@inheritDoc} */
+    @Override public void resetQueryMetrics() {
+        throw new UnsupportedOperationException("Method should be supported.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public Collection<? extends QueryDetailMetrics> queryDetailMetrics() {
+        throw new UnsupportedOperationException("Method should be supported.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public void resetQueryDetailMetrics() {
+        throw new UnsupportedOperationException("Method should be supported.");
+    }
+
+    /** {@inheritDoc} */
     @Override public void localEvict(Collection<? extends K> keys) {
         compute.call(new LocalEvictTask<>(cacheName, isAsync, keys));
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteLangSelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteLangSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteLangSelfTestSuite.java
index 78c0ab4..cfec1ec 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteLangSelfTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteLangSelfTestSuite.java
@@ -32,6 +32,7 @@ import org.apache.ignite.lang.GridXSelfTest;
 import org.apache.ignite.lang.IgniteUuidSelfTest;
 import org.apache.ignite.lang.utils.GridBoundedConcurrentLinkedHashMapSelfTest;
 import org.apache.ignite.lang.utils.GridBoundedConcurrentOrderedMapSelfTest;
+import org.apache.ignite.lang.utils.GridBoundedPriorityQueueSelfTest;
 import org.apache.ignite.lang.utils.GridCircularBufferSelfTest;
 import org.apache.ignite.lang.utils.GridConcurrentLinkedHashMapSelfTest;
 import org.apache.ignite.lang.utils.GridConcurrentWeakHashSetSelfTest;
@@ -55,6 +56,7 @@ public class IgniteLangSelfTestSuite extends TestSuite {
         TestSuite suite = new TestSuite("Ignite Lang Test Suite");
 
         suite.addTest(new TestSuite(GridTupleSelfTest.class));
+        suite.addTest(new TestSuite(GridBoundedPriorityQueueSelfTest.class));
         suite.addTest(new TestSuite(GridByteArrayListSelfTest.class));
         suite.addTest(new TestSuite(GridLeanMapSelfTest.class));
         suite.addTest(new TestSuite(GridLeanIdentitySetSelfTest.class));
@@ -85,4 +87,4 @@ public class IgniteLangSelfTestSuite extends TestSuite {
 
         return suite;
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryDetailMetricsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryDetailMetricsSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryDetailMetricsSelfTest.java
new file mode 100644
index 0000000..1b870e4
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryDetailMetricsSelfTest.java
@@ -0,0 +1,572 @@
+/*
+ * 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.processors.cache;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.query.Query;
+import org.apache.ignite.cache.query.QueryDetailMetrics;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.cache.query.SqlQuery;
+import org.apache.ignite.cache.query.TextQuery;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInterruptedCheckedException;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+
+/**
+ * Tests for cache query details metrics.
+ */
+public abstract class CacheAbstractQueryDetailMetricsSelfTest extends GridCommonAbstractTest {
+    /**  */
+    private static final int QRY_DETAIL_METRICS_SIZE = 3;
+
+    /** Grid count. */
+    protected int gridCnt;
+
+    /** Cache mode. */
+    protected CacheMode cacheMode;
+
+    /** */
+    private static TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        startGridsMultiThreaded(gridCnt);
+
+        IgniteCache<Integer, String> cacheA = grid(0).cache("A");
+        IgniteCache<Integer, String> cacheB = grid(0).cache("B");
+
+        for (int i = 0; i < 100; i++) {
+            cacheA.put(i, String.valueOf(i));
+            cacheB.put(i, String.valueOf(i));
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+    }
+
+    /**
+     * @param cacheName Cache name.
+     * @return Cache configuration.
+     */
+    private CacheConfiguration<Integer, String> configureCache(String cacheName) {
+        CacheConfiguration<Integer, String> ccfg = defaultCacheConfiguration();
+
+        ccfg.setName(cacheName);
+        ccfg.setCacheMode(cacheMode);
+        ccfg.setWriteSynchronizationMode(FULL_SYNC);
+        ccfg.setIndexedTypes(Integer.class, String.class);
+        ccfg.setStatisticsEnabled(true);
+        ccfg.setQueryDetailMetricsSize(QRY_DETAIL_METRICS_SIZE);
+
+        return ccfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+        TcpDiscoverySpi disco = new TcpDiscoverySpi();
+
+        disco.setIpFinder(ipFinder);
+
+        cfg.setDiscoverySpi(disco);
+
+        cfg.setCacheConfiguration(configureCache("A"), configureCache("B"));
+
+        return cfg;
+    }
+
+    /**
+     * Test metrics for SQL fields queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlFieldsQueryMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from String");
+
+        checkQueryMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for SQL fields queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlFieldsQueryNotFullyFetchedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from String");
+        qry.setPageSize(10);
+
+        checkQueryNotFullyFetchedMetrics(cache, qry, false);
+    }
+
+    /**
+     * Test metrics for failed SQL queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlFieldsQueryFailedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from UNKNOWN");
+
+        checkQueryFailedMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics eviction.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testQueryMetricsEviction() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        // Execute several DIFFERENT queries with guaranteed DIFFERENT time of execution.
+        cache.query(new SqlFieldsQuery("select * from String")).getAll();
+        Thread.sleep(100);
+
+        cache.query(new SqlFieldsQuery("select count(*) from String")).getAll();
+        Thread.sleep(100);
+
+        cache.query(new SqlFieldsQuery("select * from String limit 1")).getAll();
+        Thread.sleep(100);
+
+        cache.query(new SqlFieldsQuery("select * from String limit 2")).getAll();
+        Thread.sleep(100);
+
+        cache.query(new ScanQuery()).getAll();
+        Thread.sleep(100);
+
+        cache.query(new SqlQuery("String", "from String")).getAll();
+
+        waitingFor(cache, "size", QRY_DETAIL_METRICS_SIZE);
+
+        for (int i = 0; i < QRY_DETAIL_METRICS_SIZE; i++)
+            checkMetrics(cache, QRY_DETAIL_METRICS_SIZE, i, 1, 1, 0, false);
+
+        // Check that collected metrics contains correct items: metrics for last 3 queries.
+        Collection<? extends QueryDetailMetrics> metrics = cache.queryDetailMetrics();
+
+        String lastMetrics = "";
+
+        for (QueryDetailMetrics m : metrics)
+            lastMetrics += m.queryType() +  " " + m.query() + ";";
+
+        assertTrue(lastMetrics.contains("SQL_FIELDS select * from String limit 2;"));
+        assertTrue(lastMetrics.contains("SCAN A;"));
+        assertTrue(lastMetrics.contains("SQL from String;"));
+
+        cache = grid(0).context().cache().jcache("B");
+
+        cache.query(new SqlFieldsQuery("select * from String")).getAll();
+        cache.query(new SqlFieldsQuery("select count(*) from String")).getAll();
+        cache.query(new SqlFieldsQuery("select * from String limit 1")).getAll();
+        cache.query(new SqlFieldsQuery("select * from String limit 2")).getAll();
+        cache.query(new ScanQuery()).getAll();
+        cache.query(new SqlQuery("String", "from String")).getAll();
+
+        waitingFor(cache, "size", QRY_DETAIL_METRICS_SIZE);
+
+        for (int i = 0; i < QRY_DETAIL_METRICS_SIZE; i++)
+            checkMetrics(cache, QRY_DETAIL_METRICS_SIZE, i, 1, 1, 0, false);
+
+        if (gridCnt > 1) {
+            cache = grid(1).context().cache().jcache("A");
+
+            cache.query(new SqlFieldsQuery("select * from String")).getAll();
+            cache.query(new SqlFieldsQuery("select count(*) from String")).getAll();
+            cache.query(new SqlFieldsQuery("select * from String limit 1")).getAll();
+            cache.query(new SqlFieldsQuery("select * from String limit 2")).getAll();
+            cache.query(new ScanQuery()).getAll();
+            cache.query(new SqlQuery("String", "from String")).getAll();
+
+            waitingFor(cache, "size", QRY_DETAIL_METRICS_SIZE);
+
+            for (int i = 0; i < QRY_DETAIL_METRICS_SIZE; i++)
+                checkMetrics(cache, QRY_DETAIL_METRICS_SIZE, i, 1, 1, 0, false);
+
+            cache = grid(1).context().cache().jcache("B");
+
+            cache.query(new SqlFieldsQuery("select * from String")).getAll();
+            cache.query(new SqlFieldsQuery("select count(*) from String")).getAll();
+            cache.query(new SqlFieldsQuery("select * from String limit 1")).getAll();
+            cache.query(new SqlFieldsQuery("select * from String limit 2")).getAll();
+            cache.query(new ScanQuery()).getAll();
+            cache.query(new SqlQuery("String", "from String")).getAll();
+
+            waitingFor(cache, "size", QRY_DETAIL_METRICS_SIZE);
+
+            for (int i = 0; i < QRY_DETAIL_METRICS_SIZE; i++)
+                checkMetrics(cache, QRY_DETAIL_METRICS_SIZE, i, 1, 1, 0, false);
+        }
+    }
+
+    /** */
+    private static class Worker extends Thread {
+        /** */
+        private final IgniteCache cache;
+
+        /** */
+        private final  Query qry;
+
+        /** */
+        Worker(IgniteCache cache, Query qry) {
+            this.cache = cache;
+            this.qry = qry;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void run() {
+            cache.query(qry).getAll();
+        }
+    }
+
+    /**
+     * Test metrics if queries executed from several threads.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testQueryMetricsMultithreaded() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        Collection<Worker> workers = new ArrayList<>();
+
+        int repeat = 10;
+
+        for (int k = 0; k < repeat; k++) {
+            // Execute as match queries as history size to avoid eviction.
+            for (int i = 1; i <= QRY_DETAIL_METRICS_SIZE; i++)
+                workers.add(new Worker(cache, new SqlFieldsQuery("select * from String limit " + i)));
+        }
+
+        for (Worker worker : workers)
+            worker.start();
+
+        for (Worker worker : workers)
+            worker.join();
+
+        for (int i = 0; i < QRY_DETAIL_METRICS_SIZE; i++)
+            checkMetrics(cache, QRY_DETAIL_METRICS_SIZE, i, repeat, repeat, 0, false);
+    }
+
+    /**
+     * Test metrics for Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testScanQueryMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        ScanQuery<Integer, String> qry = new ScanQuery<>();
+
+        checkQueryMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testScanQueryNotFullyFetchedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        ScanQuery<Integer, String> qry = new ScanQuery<>();
+        qry.setPageSize(10);
+
+        checkQueryNotFullyFetchedMetrics(cache, qry, true);
+    }
+
+    /**
+     * Test metrics for failed Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testScanQueryFailedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        ScanQuery<Integer, String> qry = new ScanQuery<>(Integer.MAX_VALUE);
+
+        checkQueryFailedMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlQueryMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlQuery<Integer, String> qry = new SqlQuery<>("String", "from String");
+
+        checkQueryMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlQueryNotFullyFetchedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlQuery<Integer, String> qry = new SqlQuery<>("String", "from String");
+        qry.setPageSize(10);
+
+        checkQueryNotFullyFetchedMetrics(cache, qry, true);
+    }
+
+    /**
+     * Test metrics for failed Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlQueryFailedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlQuery<Integer, String> qry = new SqlQuery<>("Long", "from Long");
+
+        checkQueryFailedMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Sql queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testTextQueryMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        TextQuery qry = new TextQuery<>("String", "1");
+
+        checkQueryMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Sql queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testTextQueryNotFullyFetchedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        TextQuery qry = new TextQuery<>("String", "1");
+        qry.setPageSize(10);
+
+        checkQueryNotFullyFetchedMetrics(cache, qry, true);
+    }
+
+    /**
+     * Test metrics for failed Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testTextQueryFailedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        TextQuery qry = new TextQuery<>("Unknown", "zzz");
+
+        checkQueryFailedMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for SQL cross cache queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlFieldsCrossCacheQueryMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"B\".String");
+
+        checkQueryMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for SQL cross cache queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlFieldsCrossCacheQueryNotFullyFetchedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"B\".String");
+        qry.setPageSize(10);
+
+        checkQueryNotFullyFetchedMetrics(cache, qry, false);
+    }
+
+    /**
+     * Test metrics for failed SQL cross cache queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlFieldsCrossCacheQueryFailedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"G\".String");
+
+        checkQueryFailedMetrics(cache, qry);
+    }
+
+    /**
+     * Check metrics.
+     *
+     * @param cache Cache to check metrics.
+     * @param sz Expected size of metrics.
+     * @param idx Index of metrics to check.
+     * @param execs Expected number of executions.
+     * @param completions Expected number of completions.
+     * @param failures Expected number of failures.
+     * @param first {@code true} if metrics checked for first query only.
+     */
+    private void checkMetrics(IgniteCache<Integer, String> cache, int sz, int idx, int execs,
+        int completions, int failures, boolean first) {
+        Collection<? extends QueryDetailMetrics> metrics = cache.queryDetailMetrics();
+
+        assertNotNull(metrics);
+        assertEquals(sz, metrics.size());
+
+        QueryDetailMetrics m = new ArrayList<>(metrics).get(idx);
+
+        info("Metrics: " + m);
+
+        assertEquals("Executions", execs, m.executions());
+        assertEquals("Completions", completions, m.completions());
+        assertEquals("Failures", failures, m.failures());
+        assertTrue(m.averageTime() >= 0);
+        assertTrue(m.maximumTime() >= 0);
+        assertTrue(m.minimumTime() >= 0);
+
+        if (first)
+            assertTrue("On first execution minTime == maxTime", m.minimumTime() == m.maximumTime());
+    }
+
+    /**
+     * @param cache Cache.
+     * @param qry Query.
+     */
+    private void checkQueryMetrics(IgniteCache<Integer, String> cache, Query qry) {
+        // Execute query.
+        cache.query(qry).getAll();
+
+        checkMetrics(cache, 1, 0, 1, 1, 0, true);
+
+        // Execute again with the same parameters.
+        cache.query(qry).getAll();
+
+        checkMetrics(cache, 1, 0, 2, 2, 0, false);
+    }
+
+    /**
+     * @param cache Cache.
+     * @param qry Query.
+     * @param waitingForCompletion Waiting for query completion.
+     */
+    private void checkQueryNotFullyFetchedMetrics(IgniteCache<Integer, String> cache, Query qry,
+        boolean waitingForCompletion) throws IgniteInterruptedCheckedException {
+        // Execute query.
+        cache.query(qry).iterator().next();
+
+        if (waitingForCompletion)
+            waitingFor(cache, "completions", 1);
+
+        checkMetrics(cache, 1, 0, 1, 1, 0, true);
+
+        // Execute again with the same parameters.
+        cache.query(qry).iterator().next();
+
+        if (waitingForCompletion)
+            waitingFor(cache, "completions", 2);
+
+        checkMetrics(cache, 1, 0, 2, 2, 0, false);
+    }
+
+    /**
+     * @param cache Cache.
+     * @param qry Query.
+     */
+    private void checkQueryFailedMetrics(IgniteCache<Integer, String> cache, Query qry) {
+        try {
+            // Execute invalid query.
+            cache.query(qry).getAll();
+        }
+        catch (Exception ignored) {
+            // No-op.
+        }
+
+        checkMetrics(cache, 1, 0, 1, 0, 1, true);
+
+        try {
+            // Execute invalid query again with the same parameters.
+            cache.query(qry).getAll();
+        }
+        catch (Exception ignored) {
+            // No-op.
+        }
+
+        checkMetrics(cache, 1, 0, 2, 0, 2, true);
+    }
+
+    /**
+     * @param cache Cache.
+     * @param cond Condition to check.
+     * @param exp Expected value.
+     */
+    private static void waitingFor(final IgniteCache<Integer, String> cache,
+        final String cond, final int exp) throws IgniteInterruptedCheckedException {
+        GridTestUtils.waitForCondition(new GridAbsPredicate() {
+            @Override public boolean apply() {
+                Collection<? extends QueryDetailMetrics> metrics = cache.queryDetailMetrics();
+
+                switch (cond) {
+                    case "size":
+                        return metrics.size() == exp;
+
+                    case "completions":
+                        int completions = 0;
+
+                        for (QueryDetailMetrics m : metrics)
+                            completions += m.completions();
+
+                        return completions == exp;
+
+                    default:
+                        return true;
+                }
+            }
+        }, 5000);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryMetricsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryMetricsSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryMetricsSelfTest.java
index 10f7612..e5845d3 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryMetricsSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheAbstractQueryMetricsSelfTest.java
@@ -17,11 +17,15 @@
 
 package org.apache.ignite.internal.processors.cache;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.query.Query;
 import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.cache.query.SqlQuery;
+import org.apache.ignite.cache.query.TextQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
@@ -52,15 +56,13 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
     @Override protected void beforeTest() throws Exception {
         startGridsMultiThreaded(gridCnt);
 
-        IgniteCache<String, Integer> cacheA = grid(0).cache("A");
+        IgniteCache<Integer, String> cacheA = grid(0).cache("A");
+        IgniteCache<Integer, String> cacheB = grid(0).cache("B");
 
-        for (int i = 0; i < 100; i++)
-            cacheA.put(String.valueOf(i), i);
-
-        IgniteCache<String, Integer> cacheB = grid(0).cache("B");
-
-        for (int i = 0; i < 100; i++)
-            cacheB.put(String.valueOf(i), i);
+        for (int i = 0; i < 100; i++) {
+            cacheA.put(i, String.valueOf(i));
+            cacheB.put(i, String.valueOf(i));
+        }
     }
 
     /** {@inheritDoc} */
@@ -78,20 +80,20 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
 
         cfg.setDiscoverySpi(disco);
 
-        CacheConfiguration<String, Integer> cacheCfg1 = defaultCacheConfiguration();
+        CacheConfiguration<Integer, String> cacheCfg1 = defaultCacheConfiguration();
 
         cacheCfg1.setName("A");
         cacheCfg1.setCacheMode(cacheMode);
         cacheCfg1.setWriteSynchronizationMode(FULL_SYNC);
-        cacheCfg1.setIndexedTypes(String.class, Integer.class);
+        cacheCfg1.setIndexedTypes(Integer.class, String.class);
         cacheCfg1.setStatisticsEnabled(true);
 
-        CacheConfiguration<String, Integer> cacheCfg2 = defaultCacheConfiguration();
+        CacheConfiguration<Integer, String> cacheCfg2 = defaultCacheConfiguration();
 
         cacheCfg2.setName("B");
         cacheCfg2.setCacheMode(cacheMode);
         cacheCfg2.setWriteSynchronizationMode(FULL_SYNC);
-        cacheCfg2.setIndexedTypes(String.class, Integer.class);
+        cacheCfg2.setIndexedTypes(Integer.class, String.class);
         cacheCfg2.setStatisticsEnabled(true);
 
         cfg.setCacheConfiguration(cacheCfg1, cacheCfg2);
@@ -105,11 +107,11 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      * @throws Exception In case of error.
      */
     public void testSqlFieldsQueryMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
-        SqlFieldsQuery qry = new SqlFieldsQuery("select * from Integer");
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from String");
 
-        testQueryMetrics(cache, qry);
+        checkQueryMetrics(cache, qry);
     }
 
     /**
@@ -118,12 +120,12 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      * @throws Exception In case of error.
      */
     public void testSqlFieldsQueryNotFullyFetchedMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
-        SqlFieldsQuery qry = new SqlFieldsQuery("select * from Integer");
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from String");
         qry.setPageSize(10);
 
-        testQueryNotFullyFetchedMetrics(cache, qry, false);
+        checkQueryNotFullyFetchedMetrics(cache, qry, false);
     }
 
     /**
@@ -132,11 +134,11 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      * @throws Exception In case of error.
      */
     public void testSqlFieldsQueryFailedMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
         SqlFieldsQuery qry = new SqlFieldsQuery("select * from UNKNOWN");
 
-        testQueryFailedMetrics(cache, qry);
+        checkQueryFailedMetrics(cache, qry);
     }
 
     /**
@@ -145,11 +147,11 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      * @throws Exception In case of error.
      */
     public void testScanQueryMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
-        ScanQuery<String, Integer> qry = new ScanQuery<>();
+        ScanQuery<Integer, String> qry = new ScanQuery<>();
 
-        testQueryMetrics(cache, qry);
+        checkQueryMetrics(cache, qry);
     }
 
     /**
@@ -158,12 +160,12 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      * @throws Exception In case of error.
      */
     public void testScanQueryNotFullyFetchedMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
-        ScanQuery<String, Integer> qry = new ScanQuery<>();
+        ScanQuery<Integer, String> qry = new ScanQuery<>();
         qry.setPageSize(10);
 
-        testQueryNotFullyFetchedMetrics(cache, qry, true);
+        checkQueryNotFullyFetchedMetrics(cache, qry, true);
     }
 
     /**
@@ -172,11 +174,91 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      * @throws Exception In case of error.
      */
     public void testScanQueryFailedMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        ScanQuery<Integer, String> qry = new ScanQuery<>(Integer.MAX_VALUE);
+
+        checkQueryFailedMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Sql queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlQueryMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlQuery qry = new SqlQuery<>("String", "from String");
+
+        checkQueryMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Sql queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlQueryNotFullyFetchedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlQuery qry = new SqlQuery<>("String", "from String");
+        qry.setPageSize(10);
+
+        checkQueryNotFullyFetchedMetrics(cache, qry, true);
+    }
+
+    /**
+     * Test metrics for failed Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testSqlQueryFailedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
-        ScanQuery<String, Integer> qry = new ScanQuery<>(Integer.MAX_VALUE);
+        SqlQuery qry = new SqlQuery<>("Long", "from Long");
 
-        testQueryFailedMetrics(cache, qry);
+        checkQueryFailedMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Sql queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testTextQueryMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        TextQuery qry = new TextQuery<>("String", "1");
+
+        checkQueryMetrics(cache, qry);
+    }
+
+    /**
+     * Test metrics for Sql queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testTextQueryNotFullyFetchedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        TextQuery qry = new TextQuery<>("String", "1");
+        qry.setPageSize(10);
+
+        checkQueryNotFullyFetchedMetrics(cache, qry, true);
+    }
+
+    /**
+     * Test metrics for failed Scan queries.
+     *
+     * @throws Exception In case of error.
+     */
+    public void testTextQueryFailedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        TextQuery qry = new TextQuery<>("Unknown", "zzz");
+
+        checkQueryFailedMetrics(cache, qry);
     }
 
     /**
@@ -184,12 +266,12 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      *
      * @throws Exception In case of error.
      */
-    public void testSqlCrossCacheQueryMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+    public void testSqlFieldsCrossCacheQueryMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
-        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"B\".Integer");
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"B\".String");
 
-        testQueryMetrics(cache, qry);
+        checkQueryMetrics(cache, qry);
     }
 
     /**
@@ -197,13 +279,13 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      *
      * @throws Exception In case of error.
      */
-    public void testSqlCrossCacheQueryNotFullyFetchedMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+    public void testSqlFieldsCrossCacheQueryNotFullyFetchedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
-        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"B\".Integer");
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"B\".String");
         qry.setPageSize(10);
 
-        testQueryNotFullyFetchedMetrics(cache, qry, false);
+        checkQueryNotFullyFetchedMetrics(cache, qry, false);
     }
 
     /**
@@ -211,46 +293,102 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      *
      * @throws Exception In case of error.
      */
-    public void testSqlCrossCacheQueryFailedMetrics() throws Exception {
-        IgniteCache<String, Integer> cache = grid(0).context().cache().jcache("A");
+    public void testSqlFieldsCrossCacheQueryFailedMetrics() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
+
+        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"G\".String");
+
+        checkQueryFailedMetrics(cache, qry);
+    }
+
+    /** */
+    private static class Worker extends Thread {
+        /** */
+        private final IgniteCache cache;
+
+        /** */
+        private final  Query qry;
 
-        SqlFieldsQuery qry = new SqlFieldsQuery("select * from \"G\".Integer");
+        /** */
+        Worker(IgniteCache cache, Query qry) {
+            this.cache = cache;
+            this.qry = qry;
+        }
 
-        testQueryFailedMetrics(cache, qry);
+        /** {@inheritDoc} */
+        @Override public void run() {
+            cache.query(qry).getAll();
+        }
     }
 
     /**
-     * @param cache Cache.
-     * @param qry Query.
+     * Test metrics if queries executed from several threads.
+     *
+     * @throws Exception In case of error.
      */
-    private void testQueryMetrics(IgniteCache<String, Integer> cache, Query qry) {
-        cache.query(qry).getAll();
+    public void testQueryMetricsMultithreaded() throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).context().cache().jcache("A");
 
+        Collection<CacheAbstractQueryMetricsSelfTest.Worker> workers = new ArrayList<>();
+
+        int repeat = 100;
+
+        for (int i = 0; i < repeat; i++) {
+            workers.add(new CacheAbstractQueryMetricsSelfTest.Worker(cache, new SqlFieldsQuery("select * from String limit " + i)));
+            workers.add(new CacheAbstractQueryMetricsSelfTest.Worker(cache, new SqlQuery("String", "from String")));
+            workers.add(new CacheAbstractQueryMetricsSelfTest.Worker(cache, new ScanQuery()));
+            workers.add(new CacheAbstractQueryMetricsSelfTest.Worker(cache, new TextQuery("String", "1")));
+        }
+
+        for (CacheAbstractQueryMetricsSelfTest.Worker worker : workers)
+            worker.start();
+
+        for (CacheAbstractQueryMetricsSelfTest.Worker worker : workers)
+            worker.join();
+
+        checkMetrics(cache, repeat * 4, repeat * 4, 0, false);
+    }
+
+    /**
+     * Check metrics.
+     *
+     * @param cache Cache to check metrics.
+     * @param execs Expected number of executions.
+     * @param completions Expected number of completions.
+     * @param failures Expected number of failures.
+     * @param first {@code true} if metrics checked for first query only.
+     */
+    private void checkMetrics(IgniteCache<Integer, String> cache, int execs, int completions, int failures, boolean first) {
         GridCacheQueryMetricsAdapter m = (GridCacheQueryMetricsAdapter)cache.queryMetrics();
 
+        assertNotNull(m);
+
         info("Metrics: " + m);
 
-        assertEquals(1, m.executions());
-        assertEquals(1, m.completedExecutions());
-        assertEquals(0, m.fails());
+        assertEquals("Executions", execs, m.executions());
+        assertEquals("Completions", completions, m.completedExecutions());
+        assertEquals("Failures", failures, m.fails());
         assertTrue(m.averageTime() >= 0);
         assertTrue(m.maximumTime() >= 0);
         assertTrue(m.minimumTime() >= 0);
-        assertTrue("On first execution minTime == maxTime", m.minimumTime() == m.maximumTime());
 
-        // Execute again with the same parameters.
+        if (first)
+            assertTrue("On first execution minTime == maxTime", m.minimumTime() == m.maximumTime());
+    }
+
+    /**
+     * @param cache Cache.
+     * @param qry Query.
+     */
+    private void checkQueryMetrics(IgniteCache<Integer, String> cache, Query qry) {
         cache.query(qry).getAll();
 
-        m = (GridCacheQueryMetricsAdapter)cache.queryMetrics();
+        checkMetrics(cache, 1, 1, 0, true);
 
-        info("Metrics: " + m);
+        // Execute again with the same parameters.
+        cache.query(qry).getAll();
 
-        assertEquals(2, m.executions());
-        assertEquals(2, m.completedExecutions());
-        assertEquals(0, m.fails());
-        assertTrue(m.averageTime() >= 0);
-        assertTrue(m.maximumTime() >= 0);
-        assertTrue(m.minimumTime() >= 0);
+        checkMetrics(cache, 2, 2, 0, false);
     }
 
     /**
@@ -258,24 +396,14 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
      * @param qry Query.
      * @param waitingForCompletion Waiting for query completion.
      */
-    private void testQueryNotFullyFetchedMetrics(IgniteCache<String, Integer> cache, Query qry,
+    private void checkQueryNotFullyFetchedMetrics(IgniteCache<Integer, String> cache, Query qry,
         boolean waitingForCompletion) throws IgniteInterruptedCheckedException {
         cache.query(qry).iterator().next();
 
         if (waitingForCompletion)
             waitingForCompletion(cache, 1);
 
-        GridCacheQueryMetricsAdapter m = (GridCacheQueryMetricsAdapter)cache.queryMetrics();
-
-        info("Metrics: " + m);
-
-        assertEquals(1, m.executions());
-        assertEquals(1, m.completedExecutions());
-        assertEquals(0, m.fails());
-        assertTrue(m.averageTime() >= 0);
-        assertTrue(m.maximumTime() >= 0);
-        assertTrue(m.minimumTime() >= 0);
-        assertTrue("On first execution minTime == maxTime", m.minimumTime() == m.maximumTime());
+        checkMetrics(cache, 1, 1, 0, true);
 
         // Execute again with the same parameters.
         cache.query(qry).iterator().next();
@@ -283,23 +411,14 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
         if (waitingForCompletion)
             waitingForCompletion(cache, 2);
 
-        m = (GridCacheQueryMetricsAdapter)cache.queryMetrics();
-
-        info("Metrics: " + m);
-
-        assertEquals(2, m.executions());
-        assertEquals(2, m.completedExecutions());
-        assertEquals(0, m.fails());
-        assertTrue(m.averageTime() >= 0);
-        assertTrue(m.maximumTime() >= 0);
-        assertTrue(m.minimumTime() >= 0);
+        checkMetrics(cache, 2, 2, 0, false);
     }
 
     /**
      * @param cache Cache.
      * @param qry Query.
      */
-    private void testQueryFailedMetrics(IgniteCache<String, Integer> cache, Query qry) {
+    private void checkQueryFailedMetrics(IgniteCache<Integer, String> cache, Query qry) {
         try {
             cache.query(qry).getAll();
         }
@@ -307,16 +426,7 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
             // No-op.
         }
 
-        GridCacheQueryMetricsAdapter m = (GridCacheQueryMetricsAdapter)cache.queryMetrics();
-
-        info("Metrics: " + m);
-
-        assertEquals(1, m.executions());
-        assertEquals(0, m.completedExecutions());
-        assertEquals(1, m.fails());
-        assertTrue(m.averageTime() == 0);
-        assertTrue(m.maximumTime() == 0);
-        assertTrue(m.minimumTime() == 0);
+        checkMetrics(cache, 1, 0, 1, true);
 
         // Execute again with the same parameters.
         try {
@@ -326,23 +436,14 @@ public abstract class CacheAbstractQueryMetricsSelfTest extends GridCommonAbstra
             // No-op.
         }
 
-        m = (GridCacheQueryMetricsAdapter)cache.queryMetrics();
-
-        info("Metrics: " + m);
-
-        assertEquals(2, m.executions());
-        assertEquals(0, m.completedExecutions());
-        assertEquals(2, m.fails());
-        assertTrue(m.averageTime() == 0);
-        assertTrue(m.maximumTime() == 0);
-        assertTrue(m.minimumTime() == 0);
+        checkMetrics(cache, 2, 0, 2, true);
     }
 
     /**
      * @param cache Cache.
      * @param exp Expected.
      */
-    private static void waitingForCompletion(final IgniteCache<String, Integer> cache,
+    private static void waitingForCompletion(final IgniteCache<Integer, String> cache,
         final int exp) throws IgniteInterruptedCheckedException {
         GridTestUtils.waitForCondition(new GridAbsPredicate() {
             @Override public boolean apply() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheLocalQueryDetailMetricsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheLocalQueryDetailMetricsSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheLocalQueryDetailMetricsSelfTest.java
new file mode 100644
index 0000000..7797120
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheLocalQueryDetailMetricsSelfTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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.processors.cache;
+
+import static org.apache.ignite.cache.CacheMode.LOCAL;
+
+/**
+ * Tests for local cache query metrics.
+ */
+public class CacheLocalQueryDetailMetricsSelfTest extends CacheAbstractQueryDetailMetricsSelfTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        gridCnt = 1;
+        cacheMode = LOCAL;
+
+        super.beforeTest();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CachePartitionedQueryDetailMetricsDistributedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CachePartitionedQueryDetailMetricsDistributedSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CachePartitionedQueryDetailMetricsDistributedSelfTest.java
new file mode 100644
index 0000000..c924487
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CachePartitionedQueryDetailMetricsDistributedSelfTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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.processors.cache;
+
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+
+/**
+ * Tests for partitioned distributed cache query metrics.
+ */
+public class CachePartitionedQueryDetailMetricsDistributedSelfTest extends CacheAbstractQueryDetailMetricsSelfTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        gridCnt = 2;
+        cacheMode = PARTITIONED;
+
+        super.beforeTest();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CachePartitionedQueryDetailMetricsLocalSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CachePartitionedQueryDetailMetricsLocalSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CachePartitionedQueryDetailMetricsLocalSelfTest.java
new file mode 100644
index 0000000..4ffba3e
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CachePartitionedQueryDetailMetricsLocalSelfTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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.processors.cache;
+
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+
+/**
+ * Tests for partitioned local cache query metrics.
+ */
+public class CachePartitionedQueryDetailMetricsLocalSelfTest extends CacheAbstractQueryDetailMetricsSelfTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        gridCnt = 1;
+        cacheMode = PARTITIONED;
+
+        super.beforeTest();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheReplicatedQueryDetailMetricsDistributedSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheReplicatedQueryDetailMetricsDistributedSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheReplicatedQueryDetailMetricsDistributedSelfTest.java
new file mode 100644
index 0000000..32edb66
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheReplicatedQueryDetailMetricsDistributedSelfTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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.processors.cache;
+
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+
+/**
+ * Tests for replicated distributed cache query metrics.
+ */
+public class CacheReplicatedQueryDetailMetricsDistributedSelfTest extends CacheAbstractQueryDetailMetricsSelfTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        gridCnt = 2;
+        cacheMode = REPLICATED;
+
+        super.beforeTest();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheReplicatedQueryDetailMetricsLocalSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheReplicatedQueryDetailMetricsLocalSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheReplicatedQueryDetailMetricsLocalSelfTest.java
new file mode 100644
index 0000000..65c372d
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/CacheReplicatedQueryDetailMetricsLocalSelfTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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.processors.cache;
+
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+
+/**
+ * Tests for replicated local cache query metrics.
+ */
+public class CacheReplicatedQueryDetailMetricsLocalSelfTest extends CacheAbstractQueryDetailMetricsSelfTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        gridCnt = 1;
+        cacheMode = REPLICATED;
+
+        super.beforeTest();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
index be7523f..21f6864 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
@@ -18,12 +18,17 @@
 package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
+import org.apache.ignite.internal.processors.cache.CacheLocalQueryDetailMetricsSelfTest;
 import org.apache.ignite.internal.processors.cache.CacheLocalQueryMetricsSelfTest;
 import org.apache.ignite.internal.processors.cache.CacheOffheapBatchIndexingSingleTypeTest;
+import org.apache.ignite.internal.processors.cache.CachePartitionedQueryDetailMetricsDistributedSelfTest;
+import org.apache.ignite.internal.processors.cache.CachePartitionedQueryDetailMetricsLocalSelfTest;
 import org.apache.ignite.internal.processors.cache.CachePartitionedQueryMetricsDistributedSelfTest;
 import org.apache.ignite.internal.processors.cache.CachePartitionedQueryMetricsLocalSelfTest;
 import org.apache.ignite.internal.processors.cache.CacheQueryNewClientSelfTest;
 import org.apache.ignite.internal.processors.cache.CacheQueryOffheapEvictDataLostTest;
+import org.apache.ignite.internal.processors.cache.CacheReplicatedQueryDetailMetricsDistributedSelfTest;
+import org.apache.ignite.internal.processors.cache.CacheReplicatedQueryDetailMetricsLocalSelfTest;
 import org.apache.ignite.internal.processors.cache.CacheReplicatedQueryMetricsDistributedSelfTest;
 import org.apache.ignite.internal.processors.cache.CacheReplicatedQueryMetricsLocalSelfTest;
 import org.apache.ignite.internal.processors.cache.CacheScanPartitionQueryFallbackSelfTest;
@@ -93,6 +98,13 @@ public class IgniteCacheQuerySelfTestSuite2 extends TestSuite {
         suite.addTestSuite(CacheReplicatedQueryMetricsDistributedSelfTest.class);
         suite.addTestSuite(CacheReplicatedQueryMetricsLocalSelfTest.class);
 
+        // Cache query metrics.
+        suite.addTestSuite(CacheLocalQueryDetailMetricsSelfTest.class);
+        suite.addTestSuite(CachePartitionedQueryDetailMetricsDistributedSelfTest.class);
+        suite.addTestSuite(CachePartitionedQueryDetailMetricsLocalSelfTest.class);
+        suite.addTestSuite(CacheReplicatedQueryDetailMetricsDistributedSelfTest.class);
+        suite.addTestSuite(CacheReplicatedQueryDetailMetricsLocalSelfTest.class);
+
         // Unmarshalling query test.
         suite.addTestSuite(IgniteCacheP2pUnmarshallingQueryErrorTest.class);
         suite.addTestSuite(IgniteCacheNoClassQuerySelfTest.class);

http://git-wip-us.apache.org/repos/asf/ignite/blob/0234f673/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
index 1fa185f..04a68ae 100755
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
@@ -22,7 +22,8 @@ import java.util.{Collection => JavaCollection, Collections, UUID}
 
 import org.apache.ignite._
 import org.apache.ignite.cluster.ClusterNode
-import org.apache.ignite.internal.util.typedef._
+import org.apache.ignite.internal.util.lang.{GridFunc => F}
+import org.apache.ignite.internal.util.typedef.X
 import org.apache.ignite.internal.visor.cache._
 import org.apache.ignite.internal.visor.util.VisorTaskUtils._
 import org.apache.ignite.lang.IgniteBiTuple
@@ -287,7 +288,7 @@ class VisorCacheCommand {
                     if (hasArgFlag("scan", argLst))
                         VisorCacheScanCommand().scan(argLst, node)
                     else {
-                        if (aggrData.nonEmpty && !aggrData.exists(cache => safeEquals(cache.name(), name) && cache.system())) {
+                        if (aggrData.nonEmpty && !aggrData.exists(cache => F.eq(cache.name(), name) && cache.system())) {
                             if (hasArgFlag("clear", argLst))
                                 VisorCacheClearCommand().clear(argLst, node)
                             else if (hasArgFlag("swap", argLst))
@@ -470,7 +471,7 @@ class VisorCacheCommand {
                     println("  Total number of executions: " + ad.execsQuery)
                     println("  Total number of failures:   " + ad.failsQuery)
 
-                    gCfg.foreach(ccfgs => ccfgs.find(ccfg => safeEquals(ccfg.name(), ad.name()))
+                    gCfg.foreach(ccfgs => ccfgs.find(ccfg => F.eq(ccfg.name(), ad.name()))
                         .foreach(ccfg => {
                             nl()