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)); } } }