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 <shaofeng...@apache.org> Authored: Sat Mar 11 20:42:15 2017 +0800 Committer: shaofengshi <shaofeng...@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();