Repository: ignite
Updated Branches:
  refs/heads/ignite-3443 0e149bdb0 -> 3d7eefe19


IGNITE-3443 WIP.


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

Branch: refs/heads/ignite-3443
Commit: 3d7eefe19d54cce619cae6e8ffadb7e687ff0eed
Parents: 0e149bd
Author: Alexey Kuznetsov <akuznet...@apache.org>
Authored: Thu Oct 20 13:11:48 2016 +0700
Committer: Alexey Kuznetsov <akuznet...@apache.org>
Committed: Thu Oct 20 13:11:48 2016 +0700

----------------------------------------------------------------------
 .../ignite/cache/query/QueryDetailsMetrics.java |   2 +-
 .../GridCacheQueryDetailsMetricsAdapter.java    | 127 ++++++++-----------
 .../query/GridCacheQueryDetailsMetricsKey.java  |  77 +++++++++++
 .../cache/query/GridCacheQueryManager.java      |  18 +--
 .../VisorCacheQueryMetricsCollectorTask.java    |  14 +-
 5 files changed, 146 insertions(+), 92 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3d7eefe1/modules/core/src/main/java/org/apache/ignite/cache/query/QueryDetailsMetrics.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cache/query/QueryDetailsMetrics.java
 
b/modules/core/src/main/java/org/apache/ignite/cache/query/QueryDetailsMetrics.java
index cac9488..8258899 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/cache/query/QueryDetailsMetrics.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/cache/query/QueryDetailsMetrics.java
@@ -36,7 +36,7 @@ public interface QueryDetailsMetrics {
     /**
      * @return Cache where query was executed.
      */
-    public String cache();
+    public String getCache();
 
     /**
      * Gets total number execution of query.

http://git-wip-us.apache.org/repos/asf/ignite/blob/3d7eefe1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsAdapter.java
index a0cf51f..fc8513c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsAdapter.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import org.apache.ignite.cache.query.QueryDetailsMetrics;
-import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
@@ -64,17 +63,6 @@ public class GridCacheQueryDetailsMetricsAdapter implements 
QueryDetailsMetrics,
     private long lastStartTime;
 
     /**
-     * Calculate hash code for query metrics.
-     *
-     * @param qryType Query type.
-     * @param qry Textual query representation.
-     * @return Hash code.
-     */
-    public static int queryHashCode(GridCacheQueryType qryType, String qry) {
-        return  31 * qryType.hashCode() + qry.hashCode();
-    }
-
-    /**
      * Required by {@link Externalizable}.
      */
     public GridCacheQueryDetailsMetricsAdapter() {
@@ -82,46 +70,56 @@ public class GridCacheQueryDetailsMetricsAdapter implements 
QueryDetailsMetrics,
     }
 
     /**
-     * Constructor.
+     * Constructor with metrics.
      *
      * @param qryType Query type.
      * @param qry Textual query representation.
-     */
-    public GridCacheQueryDetailsMetricsAdapter(GridCacheQueryType qryType, 
String qry) {
-        this.qryType = qryType;
-        this.qry = qry;
-    }
-
-    /**
-     * Update metrics on query execution.
-     *
+     * @param cache Cache name where query was executed.
      * @param startTime Duration of queue execution.
      * @param duration Duration of queue execution.
      * @param failed {@code True} query executed unsuccessfully {@code false} 
otherwise.
      * @param completed {@code True} query executed unsuccessfully {@code 
false} otherwise.
-     * @param cache Cache name where query was executed.
      */
-    public void update(long startTime, long duration, boolean failed, boolean 
completed, String cache) {
-        lastStartTime = startTime;
+    public GridCacheQueryDetailsMetricsAdapter(GridCacheQueryType qryType, 
String qry, String cache, long startTime,
+        long duration, boolean failed, boolean completed) {
+        this.qryType = qryType;
+        this.qry = qry;
+        this.cache = cache;
 
         if (failed) {
-            execs += 1;
-            failures += 1;
+            execs = 1;
+            failures = 1;
         }
         else if (completed) {
-            execs += 1;
-            completions += 1;
-
-            totalTime += duration;
-
-            if (minTime < 0 || minTime > duration)
-                minTime = duration;
-
-            if (maxTime < duration)
-                maxTime = duration;
+            execs = 1;
+            completions = 1;
+            totalTime = duration;
+            minTime = duration;
+            maxTime = duration;
         }
 
+        lastStartTime = startTime;
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param qryType Query type.
+     * @param qry Textual query representation.
+     * @param cache Cache name where query was executed.
+     */
+    public GridCacheQueryDetailsMetricsAdapter(GridCacheQueryType qryType, 
String qry, String cache,
+        int execs, int completions, int failures, long minTime, long maxTime, 
long totalTime, long lastStartTime) {
+        this.qryType = qryType;
+        this.qry = qry;
         this.cache = cache;
+        this.execs = execs;
+        this.completions = completions;
+        this.failures = failures;
+        this.minTime = minTime;
+        this.maxTime = maxTime;
+        this.totalTime = totalTime;
+        this.lastStartTime = lastStartTime;
     }
 
     /**
@@ -129,23 +127,26 @@ public class GridCacheQueryDetailsMetricsAdapter 
implements QueryDetailsMetrics,
      *
      * @param m Other metrics to take into account.
      */
-    public void aggregate(QueryDetailsMetrics m) {
-        if (lastStartTime < m.getLastStartTime())
-            lastStartTime = m.getLastStartTime();
-
-        execs += m.getExecutions();
-        failures += m.getFailures();
-        completions += m.getCompletions();
-
-        totalTime += m.getTotalTime();
-
-        if (minTime < 0 || minTime > m.getMinimumTime())
-            minTime = m.getMinimumTime();
-
-        if (maxTime < m.getMaximumTime())
-            maxTime = m.getMaximumTime();
+    public GridCacheQueryDetailsMetricsAdapter aggregate(QueryDetailsMetrics 
m) {
+        return new GridCacheQueryDetailsMetricsAdapter(
+            qryType,
+            qry,
+            m.getCache(),
+            execs + m.getExecutions(),
+            completions + m.getCompletions(),
+            failures + m.getFailures(),
+            minTime < 0 || minTime > m.getMinimumTime() ? m.getMinimumTime() : 
minTime,
+            maxTime < m.getMaximumTime() ? m.getMaximumTime() : maxTime,
+            totalTime + m.getTotalTime(),
+            lastStartTime < m.getLastStartTime() ? m.getLastStartTime() : 
lastStartTime
+        );
+    }
 
-        cache = m.cache();
+    /**
+     * @return Metrics group key.
+     */
+    public GridCacheQueryDetailsMetricsKey key() {
+        return new GridCacheQueryDetailsMetricsKey(qryType, qry);
     }
 
     /** {@inheritDoc} */
@@ -159,7 +160,7 @@ public class GridCacheQueryDetailsMetricsAdapter implements 
QueryDetailsMetrics,
     }
 
     /** {@inheritDoc} */
-    @Override public String cache() {
+    @Override public String getCache() {
         return cache;
     }
 
@@ -232,24 +233,6 @@ public class GridCacheQueryDetailsMetricsAdapter 
implements QueryDetailsMetrics,
     }
 
     /** {@inheritDoc} */
-    @Override public int hashCode() {
-        return queryHashCode(qryType, qry);
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean equals(Object o) {
-        if (this == o)
-            return true;
-
-        if (o == null || getClass() != o.getClass())
-            return false;
-
-        GridCacheQueryDetailsMetricsAdapter other = 
(GridCacheQueryDetailsMetricsAdapter)o;
-
-        return qryType == other.qryType && F.eq(qry, other.qry);
-    }
-
-    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(GridCacheQueryDetailsMetricsAdapter.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3d7eefe1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsKey.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsKey.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsKey.java
new file mode 100644
index 0000000..afb2c87
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryDetailsMetricsKey.java
@@ -0,0 +1,77 @@
+/*
+ * 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.query;
+
+import org.apache.ignite.internal.util.typedef.F;
+
+/**
+ * Immutable query metrics key used to group metrics.
+ */
+public class GridCacheQueryDetailsMetricsKey {
+    /** Query type to track metrics. */
+    private final GridCacheQueryType qryType;
+
+    /** Textual query representation. */
+    private final String qry;
+
+    /**
+     * Constructor.
+     *
+     * @param qryType Query type.
+     * @param qry Textual query representation.
+     */
+    public GridCacheQueryDetailsMetricsKey(GridCacheQueryType qryType, String 
qry) {
+        assert qryType != null;
+        assert qry != null;
+
+        this.qryType = qryType;
+        this.qry = qry;
+    }
+
+    /**
+     * @return Query type.
+     */
+    public GridCacheQueryType getQueryType() {
+        return qryType;
+    }
+
+    /**
+     * @return Textual representation of query.
+     */
+    public String getQuery() {
+        return qry;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return  31 * qryType.hashCode() + qry.hashCode();
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object o) {
+        if (this == o)
+            return true;
+
+        if (o == null || getClass() != o.getClass())
+            return false;
+
+        GridCacheQueryDetailsMetricsKey other = 
(GridCacheQueryDetailsMetricsKey)o;
+
+        return qryType == other.qryType && F.eq(qry, other.qry);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3d7eefe1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
index 418417d..ee1439f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
@@ -153,7 +153,7 @@ public abstract class GridCacheQueryManager<K, V> extends 
GridCacheManagerAdapte
     private int qryHistSz;
 
     /** */
-    private GridBoundedConcurrentLinkedHashMap<Integer, QueryDetailsMetrics> 
qryHist;
+    private 
GridBoundedConcurrentLinkedHashMap<GridCacheQueryDetailsMetricsKey, 
GridCacheQueryDetailsMetricsAdapter> qryHist;
 
     /** */
     private final ConcurrentMap<UUID, RequestFutureMap> qryIters =
@@ -2092,7 +2092,7 @@ public abstract class GridCacheQueryManager<K, V> extends 
GridCacheManagerAdapte
      *
      * @return Cache queries metrics aggregated by query type and query text.
      */
-    public Collection<QueryDetailsMetrics> detailsMetrics() {
+    public Collection<GridCacheQueryDetailsMetricsAdapter> detailsMetrics() {
         return qryHist.values();
     }
 
@@ -2117,19 +2117,19 @@ public abstract class GridCacheQueryManager<K, V> 
extends GridCacheManagerAdapte
             metrics.update(duration, failed, completed);
 
             if (qryHistSz > 0) {
-                Integer qryHash = 
GridCacheQueryDetailsMetricsAdapter.queryHashCode(qryType, qry);
+                GridCacheQueryDetailsMetricsAdapter newQryMetrics = new 
GridCacheQueryDetailsMetricsAdapter(qryType,
+                    qry, cctx.name(), startTime, duration, failed, completed);
+
+                GridCacheQueryDetailsMetricsKey qryKey = newQryMetrics.key();
 
                 // Non-blocking algorithm to update metrics.
                 while(true) {
-                    QueryDetailsMetrics qryMetrics = qryHist.remove(qryHash);
-
-                    if (qryMetrics == null)
-                        qryMetrics = new 
GridCacheQueryDetailsMetricsAdapter(qryType, qry);
+                    GridCacheQueryDetailsMetricsAdapter qryMetrics = 
qryHist.remove(qryKey);
 
-                    
((GridCacheQueryDetailsMetricsAdapter)qryMetrics).update(startTime, duration, 
failed, completed, cctx.name());
+                    qryMetrics = qryMetrics != null ? 
qryMetrics.aggregate(newQryMetrics) : newQryMetrics;
 
                     // Leave if updated.
-                    if (qryHist.putIfAbsent(qryHash, qryMetrics) == null)
+                    if (qryHist.putIfAbsent(qryKey, qryMetrics) == null)
                         break;
                 }
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3d7eefe1/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetricsCollectorTask.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetricsCollectorTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetricsCollectorTask.java
index 9d0b64e..8120d51 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetricsCollectorTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheQueryMetricsCollectorTask.java
@@ -61,7 +61,7 @@ public class VisorCacheQueryMetricsCollectorTask extends 
VisorMultiNodeTask<Long
             if (res.getException() != null)
                 throw res.getException();
 
-            Collection<QueryDetailsMetrics> metrics = res.getData();
+            Collection<GridCacheQueryDetailsMetricsAdapter> metrics = 
res.getData();
 
             VisorCacheQueryMetricsCollectorJob.aggregateMetrics(-1, taskRes, 
metrics);
         }
@@ -92,21 +92,15 @@ public class VisorCacheQueryMetricsCollectorTask extends 
VisorMultiNodeTask<Long
          * @param metrics Metrics.
          */
         private static void aggregateMetrics(long since, Map<Integer, 
GridCacheQueryDetailsMetricsAdapter> res,
-            Collection<QueryDetailsMetrics> metrics) {
+            Collection<GridCacheQueryDetailsMetricsAdapter> metrics) {
             if (!metrics.isEmpty()) {
-                for (QueryDetailsMetrics m : metrics) {
+                for (GridCacheQueryDetailsMetricsAdapter m : metrics) {
                     if (m.getLastStartTime() > since) {
                         Integer qryHashCode = m.hashCode();
 
                         GridCacheQueryDetailsMetricsAdapter aggMetrics = 
res.get(qryHashCode);
 
-                        if (aggMetrics == null) {
-                            aggMetrics = new 
GridCacheQueryDetailsMetricsAdapter(m.getQueryType(), m.getQuery());
-
-                            res.put(qryHashCode, aggMetrics);
-                        }
-
-                        aggMetrics.aggregate(m);
+                        res.put(qryHashCode, aggMetrics == null ? m : 
aggMetrics.aggregate(m));
                     }
                 }
             }

Reply via email to