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/08/24 01:24:01 UTC

[kylin] branch master updated: KYLIN-3449 Allow deleting a NEW status orphan segment

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 024a60d  KYLIN-3449 Allow deleting a NEW status orphan segment
024a60d is described below

commit 024a60d683d5761a1dc1bea357bfe80d030ba560
Author: chao long <wa...@qq.com>
AuthorDate: Fri Aug 17 11:57:40 2018 +0800

    KYLIN-3449 Allow deleting a NEW status orphan segment
---
 .../org/apache/kylin/rest/service/CubeService.java | 23 +++++++++++++++++++++-
 .../kylin/rest/controller/CubeControllerTest.java  | 21 +++++++++++++++++++-
 2 files changed, 42 insertions(+), 2 deletions(-)

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 8608baf..5e2c49e 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
@@ -42,7 +42,10 @@ import org.apache.kylin.cube.model.CubeDesc;
 import org.apache.kylin.engine.EngineFactory;
 import org.apache.kylin.engine.mr.CubingJob;
 import org.apache.kylin.engine.mr.common.CuboidRecommenderUtil;
+import org.apache.kylin.job.JobInstance;
 import org.apache.kylin.job.common.PatternedLogger;
+import org.apache.kylin.job.constant.JobStatusEnum;
+import org.apache.kylin.job.constant.JobTimeFilterEnum;
 import org.apache.kylin.job.exception.JobException;
 import org.apache.kylin.job.execution.DefaultChainedExecutable;
 import org.apache.kylin.job.execution.ExecutableState;
@@ -510,7 +513,13 @@ public class CubeService extends BasicService implements InitializingBean {
         }
 
         if (toDelete.getStatus() != SegmentStatusEnum.READY) {
-            throw new BadRequestException(String.format(msg.getDELETE_NOT_READY_SEG(), segmentName));
+            if (toDelete.getStatus() == SegmentStatusEnum.NEW) {
+                if (!isOrphonSegment(cube, toDelete.getUuid())) {
+                    throw new BadRequestException(String.format(msg.getDELETE_NOT_READY_SEG(), segmentName));
+                }
+            } else {
+                throw new BadRequestException(String.format(msg.getDELETE_NOT_READY_SEG(), segmentName));
+            }
         }
 
         if (!segmentName.equals(cube.getSegments().get(0).getName())
@@ -521,6 +530,18 @@ public class CubeService extends BasicService implements InitializingBean {
         return CubeManager.getInstance(getConfig()).updateCubeDropSegments(cube, toDelete);
     }
 
+    public boolean isOrphonSegment(CubeInstance cube, String segId) {
+        List<JobInstance> jobInstances = jobService.searchJobsByCubeName(cube.getName(), cube.getProject(), Lists.newArrayList(JobStatusEnum.NEW, JobStatusEnum.PENDING, JobStatusEnum.RUNNING, JobStatusEnum.ERROR, JobStatusEnum.STOPPED),
+                JobTimeFilterEnum.ALL, JobService.JobSearchMode.CUBING_ONLY);
+        for (JobInstance jobInstance : jobInstances) {
+            // if there are segment related jobs, can not delete this segment.
+            if (segId.equals(jobInstance.getRelatedSegment())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     protected void releaseAllJobs(CubeInstance cube) {
         final List<CubingJob> cubingJobs = jobService.listJobsByRealizationName(cube.getName(), null);
         for (CubingJob cubingJob : cubingJobs) {
diff --git a/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java b/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java
index 6ebd9e8..d30391b 100644
--- a/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java
+++ b/server/src/test/java/org/apache/kylin/rest/controller/CubeControllerTest.java
@@ -138,7 +138,26 @@ public class CubeControllerTest extends ServiceTestBase {
         CubeDesc[] cubes = cubeDescController.getCube(cubeName);
         Assert.assertNotNull(cubes);
 
-        cubeController.deleteSegment(cubeName, "20131212000000_20140112000000");
+        String segmentName = "20131212000000_20140112000000";
+
+        CubeInstance cube = cubeService.getCubeManager().getCube(cubeName);
+        CubeSegment toDelete = null;
+        for (CubeSegment seg : cube.getSegments()) {
+            if (seg.getName().equals(segmentName)) {
+                toDelete = seg;
+                break;
+            }
+        }
+
+        Assert.assertNotNull(toDelete);
+        String segId = toDelete.getUuid();
+
+        cubeController.deleteSegment(cubeName, segmentName);
+
+        // delete success, no related job 'NEW' segment can be delete
+        if (cubeService.isOrphonSegment(cube, segId)){
+            throw new InternalErrorException();
+        }
     }
 
     @Test(expected = NotFoundException.class)