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 2018/07/26 01:44:36 UTC

[kylin] branch master updated: KYLIN-3259 when delete cube, remove it from hybrid

This is an automated email from the ASF dual-hosted git repository.

shaofengshi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kylin.git


The following commit(s) were added to refs/heads/master by this push:
     new f27a92b  KYLIN-3259 when delete cube, remove it from hybrid
f27a92b is described below

commit f27a92b648b891ac682c5527cfb4cd0266a33863
Author: chao long <wa...@qq.com>
AuthorDate: Tue Jul 24 15:03:31 2018 +0800

    KYLIN-3259 when delete cube, remove it from hybrid
---
 .../kylin/storage/hybrid/HybridInstance.java       |  4 +--
 .../org/apache/kylin/rest/job/HybridCubeCLI.java   | 12 ++++++--
 .../org/apache/kylin/rest/service/CubeService.java | 32 ++++++++++++++++++++++
 .../apache/kylin/rest/service/HybridService.java   | 23 ++++++++++++++++
 4 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java b/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java
index 9fbb7f3..286af5f 100644
--- a/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java
+++ b/core-storage/src/main/java/org/apache/kylin/storage/hybrid/HybridInstance.java
@@ -108,7 +108,7 @@ public class HybridInstance extends RootPersistentEntity implements IRealization
                 return;
 
             if (realizationEntries == null || realizationEntries.size() == 0)
-                throw new IllegalArgumentException();
+                return;
 
             RealizationRegistry registry = RealizationRegistry.getInstance(config);
             List<IRealization> realizationList = Lists.newArrayList();
@@ -301,7 +301,7 @@ public class HybridInstance extends RootPersistentEntity implements IRealization
 
     public IRealization[] getRealizations() {
         init();
-        return realizations;
+        return realizations == null ? new IRealization[0] : realizations;
     }
 
     public String getResourcePath() {
diff --git a/server-base/src/main/java/org/apache/kylin/rest/job/HybridCubeCLI.java b/server-base/src/main/java/org/apache/kylin/rest/job/HybridCubeCLI.java
index 72ae1ce..1c8a46a 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/job/HybridCubeCLI.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/job/HybridCubeCLI.java
@@ -65,6 +65,8 @@ public class HybridCubeCLI extends AbstractApplication {
 
     private static final Option OPTION_CUBES = OptionBuilder.withArgName("cubes").hasArg().isRequired(false).withDescription("the cubes used in HybridCube, seperated by comma, empty if to delete HybridCube").create("cubes");
 
+    private static final Option OPTION_CHECK = OptionBuilder.withArgName("check").hasArg().isRequired(false).withDescription("whether to check cube size, default true.").create("check");
+
     private final Options options;
 
     private KylinConfig kylinConfig;
@@ -80,6 +82,7 @@ public class HybridCubeCLI extends AbstractApplication {
         options.addOption(OPTION_PROJECT);
         options.addOption(OPTION_MODEL);
         options.addOption(OPTION_CUBES);
+        options.addOption(OPTION_CHECK);
 
         this.kylinConfig = KylinConfig.getInstanceFromEnv();
         this.store = ResourceStore.getStore(kylinConfig);
@@ -105,6 +108,8 @@ public class HybridCubeCLI extends AbstractApplication {
         String projectName = optionsHelper.getOptionValue(OPTION_PROJECT);
         String modelName = optionsHelper.getOptionValue(OPTION_MODEL);
         String cubeNamesStr = optionsHelper.getOptionValue(OPTION_CUBES);
+        boolean checkCubeSize = optionsHelper.hasOption(OPTION_CHECK) ? Boolean.valueOf(optionsHelper.getOptionValue(OPTION_CHECK)) : true;
+
         String[] cubeNames = new String[] {};
         if (cubeNamesStr != null)
             cubeNames = cubeNamesStr.split(",");
@@ -141,7 +146,7 @@ public class HybridCubeCLI extends AbstractApplication {
                 throw new RuntimeException("The Hybrid Cube doesn't exist, could not update: " + hybridName);
             }
             // Update the Hybrid
-            update(hybridInstance, realizationEntries, projectName, owner);
+            update(hybridInstance, realizationEntries, projectName, owner, checkCubeSize);
         } else if ("delete".equals(action)) {
             if (hybridInstance == null) {
                 throw new RuntimeException("The Hybrid Cube doesn't exist, could not delete: " + hybridName);
@@ -162,8 +167,9 @@ public class HybridCubeCLI extends AbstractApplication {
         return hybridInstance;
     }
 
-    private void update(HybridInstance hybridInstance, List<RealizationEntry> realizationEntries, String projectName, String owner) throws IOException {
-        checkSegmentOffset(realizationEntries);
+    private void update(HybridInstance hybridInstance, List<RealizationEntry> realizationEntries, String projectName, String owner, boolean checkCubeSize) throws IOException {
+        if (checkCubeSize)
+            checkSegmentOffset(realizationEntries);
         hybridInstance.setRealizationEntries(realizationEntries);
         store.putResource(hybridInstance.getResourcePath(), hybridInstance, HybridManager.HYBRID_SERIALIZER);
         ProjectManager.getInstance(kylinConfig).moveRealizationToProject(RealizationType.HYBRID, hybridInstance.getName(), projectName, owner);
diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
index da90771..8608baf 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
@@ -73,6 +73,7 @@ import org.apache.kylin.rest.response.HBaseResponse;
 import org.apache.kylin.rest.response.MetricsResponse;
 import org.apache.kylin.rest.util.AclEvaluate;
 import org.apache.kylin.rest.util.ValidateUtil;
+import org.apache.kylin.storage.hybrid.HybridInstance;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.InitializingBean;
@@ -117,6 +118,9 @@ public class CubeService extends BasicService implements InitializingBean {
     @Autowired
     private AclEvaluate aclEvaluate;
 
+    @Autowired
+    private HybridService hybridService;
+
     public boolean isCubeNameVaildate(final String cubeName) {
         if (StringUtils.isEmpty(cubeName) || !ValidateUtil.isAlphanumericUnderscore(cubeName)) {
             return false;
@@ -302,6 +306,34 @@ public class CubeService extends BasicService implements InitializingBean {
             //ignore the exception
         }
 
+        // remove from hybrid definition
+        ProjectInstance projectInstance = cube.getProjectInstance();
+        List<RealizationEntry> hybridRealizationEntries = projectInstance.getRealizationEntries(RealizationType.HYBRID);
+
+        if (hybridRealizationEntries != null) {
+            for (RealizationEntry entry : hybridRealizationEntries) {
+                HybridInstance instance = getHybridManager().getHybridInstance(entry.getRealization());
+                List<RealizationEntry> cubeRealizationEntries = instance.getRealizationEntries();
+
+                boolean needUpdateHybrid = false;
+                for (RealizationEntry cubeRealizationEntry : cubeRealizationEntries){
+                    if (cube.getName().equals(cubeRealizationEntry.getRealization())){
+                        needUpdateHybrid = true;
+                        cubeRealizationEntries.remove(cubeRealizationEntry);
+                        break;
+                    }
+                }
+
+                if (needUpdateHybrid){
+                    String[] cubeNames = new String[cubeRealizationEntries.size()];
+                    for (int i = 0; i < cubeRealizationEntries.size(); i++){
+                        cubeNames[i] = cubeRealizationEntries.get(i).getRealization();
+                    }
+                    hybridService.updateHybridCubeNoCheck(instance.getName(), projectInstance.getName(), cube.getModel().getName(), cubeNames);
+                }
+            }
+        }
+
         int cubeNum = getCubeManager().getCubesByDesc(cube.getDescriptor().getName()).size();
         getCubeManager().dropCube(cube.getName(), cubeNum == 1);//only delete cube desc when no other cube is using it
     }
diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java b/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java
index 2fb7f84..1b48082 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/HybridService.java
@@ -89,6 +89,29 @@ public class HybridService extends BasicService {
         return getHybridInstance(hybridName);
     }
 
+    public void updateHybridCubeNoCheck(String hybridName, String projectName, String modelName,
+                                           String[] cubeNames) {
+        List<String> args = new ArrayList<String>();
+        args.add("-name");
+        args.add(hybridName);
+        args.add("-project");
+        args.add(projectName);
+        args.add("-model");
+        args.add(modelName);
+        args.add("-cubes");
+        args.add(StringUtils.join(cubeNames, ","));
+        args.add("-check");
+        args.add("false");
+        args.add("-action");
+        args.add("update");
+        try {
+            HybridCubeCLI.main(args.toArray(new String[args.size()]));
+        } catch (Exception e) {
+            logger.warn("Update Hybrid Failed", e);
+            throw e;
+        }
+    }
+
     public void deleteHybridCube(String hybridName, String projectName, String modelName) {
         aclEvaluate.checkProjectWritePermission(projectName);
         List<String> args = new ArrayList<String>();