From a1fb600398a52542a754f158cef9b522a0c6c651 Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Tue, 25 Oct 2016 10:49:39 +0800 Subject: [PATCH] KYLIN-2130 QueryMetrics concurrent bug fix --- .../kylin/rest/metrics/QueryMetricsFacade.java | 38 +++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) 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 metricsMap = new ConcurrentHashMap(); - + 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 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; } } -- 2.8.4 (Apple Git-73)