KYLIN-2130 QueryMetrics concurrent bug fix Signed-off-by: shaofengshi <shaofeng...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/0759ca22 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/0759ca22 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/0759ca22 Branch: refs/heads/KYLIN-1971 Commit: 0759ca2216a0bc439f5e7442074280df04c32522 Parents: 38ab2e0 Author: kangkaisen <kangkai...@live.com> Authored: Tue Oct 25 10:49:39 2016 +0800 Committer: shaofengshi <shaofeng...@apache.org> Committed: Fri Nov 4 14:29:35 2016 +0800 ---------------------------------------------------------------------- .../kylin/rest/metrics/QueryMetricsFacade.java | 38 +++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/0759ca22/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java b/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java index 91aff8b..48a8e58 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java +++ b/server-base/src/main/java/org/apache/kylin/rest/metrics/QueryMetricsFacade.java @@ -18,6 +18,7 @@ package org.apache.kylin.rest.metrics; +import org.apache.hadoop.metrics2.MetricsException; import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.rest.request.SQLRequest; @@ -38,28 +39,28 @@ public class QueryMetricsFacade { private static boolean enabled = false; private static ConcurrentHashMap<String, QueryMetrics> metricsMap = new ConcurrentHashMap<String, QueryMetrics>(); - + public static void init() { enabled = KylinConfig.getInstanceFromEnv().getQueryMetricsEnabled(); if (!enabled) return; - + DefaultMetricsSystem.initialize("Kylin"); } public static void updateMetrics(SQLRequest sqlRequest, SQLResponse sqlResponse) { if (!enabled) return; - + String projectName = sqlRequest.getProject(); String cubeName = sqlResponse.getCube(); - update(getQueryMetrics("Server_Total", metricsMap), sqlResponse); + update(getQueryMetrics("Server_Total"), sqlResponse); - update(getQueryMetrics(projectName, metricsMap), sqlResponse); + update(getQueryMetrics(projectName), sqlResponse); String cubeMetricName = projectName + ",sub=" + cubeName; - update(getQueryMetrics(cubeMetricName, metricsMap), sqlResponse); + update(getQueryMetrics(cubeMetricName), sqlResponse); } private static void update(QueryMetrics queryMetrics, SQLResponse sqlResponse) { @@ -93,16 +94,29 @@ public class QueryMetricsFacade { } } - private static QueryMetrics getQueryMetrics(String name, ConcurrentHashMap<String, QueryMetrics> metricsMap) { + private static QueryMetrics getQueryMetrics(String name) { KylinConfig config = KylinConfig.getInstanceFromEnv(); int[] intervals = config.getQueryMetricsPercentilesIntervals(); - if (metricsMap.containsKey(name)) { - return metricsMap.get(name); - } else { - QueryMetrics queryMetrics = new QueryMetrics(intervals).registerWith(name); - metricsMap.put(name, queryMetrics); + QueryMetrics queryMetrics = metricsMap.get(name); + if (queryMetrics != null) { return queryMetrics; } + + synchronized (QueryMetricsFacade.class) { + queryMetrics = metricsMap.get(name); + if (queryMetrics != null) { + return queryMetrics; + } + + try { + queryMetrics = new QueryMetrics(intervals).registerWith(name); + metricsMap.put(name, queryMetrics); + return queryMetrics; + } catch (MetricsException e) { + logger.warn(name + " register error: ", e); + } + } + return queryMetrics; } }