This is an automated email from the ASF dual-hosted git repository. liyang pushed a commit to branch sync in repository https://gitbox.apache.org/repos/asf/kylin.git
commit ab7bdaea290123b1823eb8e1f65d4206d198f6d5 Author: Li Yang <liy...@apache.org> AuthorDate: Thu Jul 5 14:16:01 2018 +0800 KYLIN-3370 bug fix in UpdateCubeInfoAfterMergeStep --- .../org/apache/kylin/cube/DimensionRangeInfoTest.java | 1 + .../engine/mr/steps/UpdateCubeInfoAfterMergeStep.java | 18 +++++++++--------- .../mr/steps/UpdateCubeInfoAfterOptimizeStep.java | 1 + .../apache/kylin/provision/BuildCubeWithEngine.java | 1 + 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/core-cube/src/test/java/org/apache/kylin/cube/DimensionRangeInfoTest.java b/core-cube/src/test/java/org/apache/kylin/cube/DimensionRangeInfoTest.java index 94acf9f..43175c9 100644 --- a/core-cube/src/test/java/org/apache/kylin/cube/DimensionRangeInfoTest.java +++ b/core-cube/src/test/java/org/apache/kylin/cube/DimensionRangeInfoTest.java @@ -67,6 +67,7 @@ public class DimensionRangeInfoTest extends LocalFileMetadataTestCase { Map<String, DimensionRangeInfo> m2 = new HashMap<>(); Assert.assertTrue(DimensionRangeInfo.mergeRangeMap(model, m1, m2).isEmpty()); + Assert.assertTrue(DimensionRangeInfo.mergeRangeMap(model, m2, m1).isEmpty()); } // null min/max value (happens on empty segment, or all-null columns) diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java index 56f5077..4cf6fc6 100644 --- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java +++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterMergeStep.java @@ -63,28 +63,29 @@ public class UpdateCubeInfoAfterMergeStep extends AbstractExecutable { if (mergingSegmentIds.isEmpty()) { return ExecuteResult.createFailed(new SegmentNotFoundException("there are no merging segments")); } + long sourceCount = 0L; long sourceSize = 0L; - boolean isOffsetCube = mergedSegment.isOffsetCube(); Long tsStartMin = Long.MAX_VALUE, tsEndMax = 0L; + for (String id : mergingSegmentIds) { + CubeSegment segment = cube.getSegmentById(id); + sourceCount += segment.getInputRecords(); + sourceSize += segment.getInputRecordsSize(); + tsStartMin = Math.min(tsStartMin, segment.getTSRange().start.v); + tsEndMax = Math.max(tsEndMax, segment.getTSRange().end.v); + } + Map<String, DimensionRangeInfo> mergedSegDimRangeMap = null; for (String id : mergingSegmentIds) { CubeSegment segment = cube.getSegmentById(id); Map<String, DimensionRangeInfo> segDimRangeMap = segment.getDimensionRangeInfoMap(); - if (segDimRangeMap.isEmpty()) { - continue; - } if (mergedSegDimRangeMap == null) { mergedSegDimRangeMap = segDimRangeMap; } else { mergedSegDimRangeMap = DimensionRangeInfo.mergeRangeMap(cube.getModel(), segDimRangeMap, mergedSegDimRangeMap); } - sourceCount += segment.getInputRecords(); - sourceSize += segment.getInputRecordsSize(); - tsStartMin = Math.min(tsStartMin, segment.getTSRange().start.v); - tsEndMax = Math.max(tsEndMax, segment.getTSRange().end.v); } // update segment info @@ -94,7 +95,6 @@ public class UpdateCubeInfoAfterMergeStep extends AbstractExecutable { mergedSegment.setLastBuildJobID(CubingExecutableUtil.getCubingJobId(this.getParams())); mergedSegment.setLastBuildTime(System.currentTimeMillis()); mergedSegment.setDimensionRangeInfoMap(mergedSegDimRangeMap); - if (isOffsetCube) { SegmentRange.TSRange tsRange = new SegmentRange.TSRange(tsStartMin, tsEndMax); mergedSegment.setTSRange(tsRange); diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterOptimizeStep.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterOptimizeStep.java index d013386..03aa616 100644 --- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterOptimizeStep.java +++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/steps/UpdateCubeInfoAfterOptimizeStep.java @@ -59,6 +59,7 @@ public class UpdateCubeInfoAfterOptimizeStep extends AbstractExecutable { segment.setSizeKB(cubeSizeBytes / 1024); segment.setInputRecords(sourceCount); segment.setInputRecordsSize(sourceSizeBytes); + segment.setDimensionRangeInfoMap(originalSegment.getDimensionRangeInfoMap()); try { cubeManager.promoteNewlyOptimizeSegments(cube, segment); diff --git a/kylin-it/src/test/java/org/apache/kylin/provision/BuildCubeWithEngine.java b/kylin-it/src/test/java/org/apache/kylin/provision/BuildCubeWithEngine.java index 2f22bd4..16ceede 100644 --- a/kylin-it/src/test/java/org/apache/kylin/provision/BuildCubeWithEngine.java +++ b/kylin-it/src/test/java/org/apache/kylin/provision/BuildCubeWithEngine.java @@ -313,6 +313,7 @@ public class BuildCubeWithEngine { checkNormalSegRangeInfo(cubeManager.getCube(cubeName)); if (!buildSegment(cubeName, date2, date3)) return false; + checkNormalSegRangeInfo(cubeManager.getCube(cubeName)); if (!optimizeCube(cubeName)) return false; checkNormalSegRangeInfo(cubeManager.getCube(cubeName));