From 6325a85c352e10eb3a9e865313898cd07e805e85 Mon Sep 17 00:00:00 2001 From: sanjulian Date: Thu, 7 Dec 2017 14:22:35 +0800 Subject: [PATCH] KYLIN-2883 Add broken reason in SQL tab for broken cube --- .../src/main/java/org/apache/kylin/cube/CubeManager.java | 12 ++++++++++++ .../org/apache/kylin/rest/controller/CubeController.java | 9 +++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java b/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java index 5e72721..b78a34a 100755 --- a/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java @@ -35,6 +35,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.KylinConfigExt; @@ -43,6 +44,7 @@ import org.apache.kylin.common.persistence.ResourceStore; import org.apache.kylin.common.persistence.Serializer; import org.apache.kylin.common.util.Dictionary; import org.apache.kylin.common.util.Pair; +import org.apache.kylin.common.util.StringUtil; import org.apache.kylin.cube.cuboid.Cuboid; import org.apache.kylin.cube.model.CubeDesc; import org.apache.kylin.cube.model.DictionaryDesc; @@ -137,16 +139,24 @@ public class CubeManager implements IRealizationProvider { // for generation hbase table name of a new segment private ConcurrentMap usedStorageLocation = new ConcurrentHashMap<>(); + // for cube broken reason + private Map brokenReasons; + private CubeManager(KylinConfig config) throws IOException { logger.info("Initializing CubeManager with config " + config); this.config = config; this.cubeMap = new CaseInsensitiveStringCache(config, "cube"); + this.brokenReasons = Maps.newConcurrentMap(); // touch lower level metadata before registering my listener loadAllCubeInstance(); Broadcaster.getInstance(config).registerListener(new CubeSyncListener(), "cube"); } + public String getBrokenReason(String cubeName) { + return brokenReasons.get(cubeName); + } + private class CubeSyncListener extends Broadcaster.Listener { @Override public void onClearAll(Broadcaster broadcaster) throws IOException { @@ -304,6 +314,7 @@ public class CubeManager implements IRealizationProvider { // remove cube and update cache getStore().deleteResource(cube.getResourcePath()); cubeMap.remove(cube.getName()); + brokenReasons.remove(cube.getName()); Cuboid.clearCache(cube); if (deleteDesc && cube.getDescriptor() != null) { @@ -854,6 +865,7 @@ public class CubeManager implements IRealizationProvider { if (!cubeDesc.getError().isEmpty()) { cube.setStatus(RealizationStatusEnum.DESCBROKEN); + brokenReasons.put(cubeName, StringUtil.join(cubeDesc.getError(), "\n")); logger.error("cube descriptor {} (for cube '{}') is broken", cubeDesc.getResourcePath(), cubeName); for (String error : cubeDesc.getError()) { logger.error("Error: {}", error); diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java index 0e9f4ba..e15ab32 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java +++ b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java @@ -190,8 +190,13 @@ public class CubeController extends BasicController { if (cube == null) { throw new InternalErrorException("Cannot find cube " + cubeName); } - IJoinedFlatTableDesc flatTableDesc = EngineFactory.getJoinedFlatTableDesc(cube.getDescriptor()); - String sql = JoinedFlatTable.generateSelectDataStatement(flatTableDesc); + String sql; + if (RealizationStatusEnum.DESCBROKEN == cube.getStatus()) { + sql = cubeService.getCubeManager().getBrokenReason(cubeName); + } else { + IJoinedFlatTableDesc flatTableDesc = EngineFactory.getJoinedFlatTableDesc(cube.getDescriptor()); + sql = JoinedFlatTable.generateSelectDataStatement(flatTableDesc); + } GeneralResponse response = new GeneralResponse(); response.setProperty("sql", sql); -- 2.8.1