You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2017/03/12 11:49:09 UTC

[37/48] kylin git commit: KYLIN-2499 HybridInstance cache wasn't cleaned when underlying Cube be updated

KYLIN-2499 HybridInstance cache wasn't cleaned when underlying Cube be updated


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

Branch: refs/heads/master-hbase0.98
Commit: 5d012b9fa0ca6b3f98aa80f1ae9418be90d32bca
Parents: 791a010
Author: shaofengshi <sh...@apache.org>
Authored: Sat Mar 11 20:42:15 2017 +0800
Committer: shaofengshi <sh...@apache.org>
Committed: Sat Mar 11 20:42:15 2017 +0800

----------------------------------------------------------------------
 .../kylin/storage/hybrid/HybridManager.java     | 45 +++++++++++---------
 1 file changed, 26 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/5d012b9f/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridManager.java
----------------------------------------------------------------------
diff --git a/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridManager.java b/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridManager.java
index 2d330c0..cf40416 100644
--- a/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridManager.java
+++ b/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridManager.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import com.google.common.collect.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.persistence.JsonSerializer;
@@ -88,14 +89,14 @@ public class HybridManager implements IRealizationProvider {
         logger.info("Initializing HybridManager with config " + config);
         this.config = config;
         this.hybridMap = new CaseInsensitiveStringCache<HybridInstance>(config, "hybrid");
-        
+
         // touch lower level metadata before registering my listener
         reloadAllHybridInstance();
-        Broadcaster.getInstance(config).registerListener(new HybridSyncListener(), "hybrid");
+        Broadcaster.getInstance(config).registerListener(new HybridSyncListener(), "hybrid", "cube");
     }
 
     private class HybridSyncListener extends Broadcaster.Listener {
-        
+
         @Override
         public void onClearAll(Broadcaster broadcaster) throws IOException {
             clearCache();
@@ -112,15 +113,22 @@ public class HybridManager implements IRealizationProvider {
 
         @Override
         public void onEntityChange(Broadcaster broadcaster, String entity, Event event, String cacheKey) throws IOException {
-            String hybridName = cacheKey;
-            
-            if (event == Event.DROP)
-                hybridMap.removeLocal(hybridName);
-            else
-                reloadHybridInstance(hybridName);
-            
-            for (ProjectInstance prj : ProjectManager.getInstance(config).findProjects(RealizationType.HYBRID, hybridName)) {
-                broadcaster.notifyProjectSchemaUpdate(prj.getName());
+            if ("hybrid".equals(entity)) {
+                String hybridName = cacheKey;
+
+                if (event == Event.DROP)
+                    hybridMap.removeLocal(hybridName);
+                else
+                    reloadHybridInstance(hybridName);
+
+                for (ProjectInstance prj : ProjectManager.getInstance(config).findProjects(RealizationType.HYBRID, hybridName)) {
+                    broadcaster.notifyProjectSchemaUpdate(prj.getName());
+                }
+            } else if ("cube".equals(entity)) {
+                String cubeName = cacheKey;
+                for (HybridInstance hybrid : getHybridInstancesByChild(RealizationType.CUBE, cubeName)) {
+                    reloadHybridInstance(hybrid.getName());
+                }
             }
         }
     }
@@ -139,25 +147,24 @@ public class HybridManager implements IRealizationProvider {
         logger.debug("Loaded " + paths.size() + " Hybrid(s)");
     }
 
-    public void reloadHybridInstanceByChild(RealizationType type, String realizationName) {
+    public List<HybridInstance> getHybridInstancesByChild(RealizationType type, String realizationName) {
+        List<HybridInstance> result = Lists.newArrayList();
         for (HybridInstance hybridInstance : hybridMap.values()) {
-            boolean includes = false;
             for (RealizationEntry realizationEntry : hybridInstance.getRealizationEntries()) {
                 if (realizationEntry.getType() == type && realizationEntry.getRealization().equalsIgnoreCase(realizationName)) {
-                    includes = true;
-                    break;
+                    result.add(hybridInstance);
                 }
             }
 
-            if (includes == true)
-                reloadHybridInstance(hybridInstance.getName());
         }
+
+        return result;
     }
 
     public void reloadHybridInstance(String name) {
         reloadHybridInstanceAt(HybridInstance.concatResourcePath(name));
     }
-    
+
     private synchronized HybridInstance reloadHybridInstanceAt(String path) {
         ResourceStore store = getStore();