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