You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2016/11/04 06:29:24 UTC

kylin git commit: KYLIN-2130 QueryMetrics concurrent bug fix

Repository: kylin
Updated Branches:
  refs/heads/v1.6.0-rc1 c19d8e917 -> 7ce1cb6f8


KYLIN-2130 QueryMetrics concurrent bug fix

Signed-off-by: shaofengshi <sh...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/7ce1cb6f
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/7ce1cb6f
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/7ce1cb6f

Branch: refs/heads/v1.6.0-rc1
Commit: 7ce1cb6f80d14a62adf4991e0116eef3ef021c2c
Parents: c19d8e9
Author: kangkaisen <ka...@live.com>
Authored: Tue Oct 25 10:49:39 2016 +0800
Committer: shaofengshi <sh...@apache.org>
Committed: Fri Nov 4 14:29:19 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/7ce1cb6f/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;
     }
 }