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)