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();