Skip to content

Commit f34c20c

Browse files
authored
[IOTDB-4166] Fix select no files when time partition interval is too small (apache#7036)
* Fix select no files when time partition interval is too small * rename virable name
1 parent d8ac4a3 commit f34c20c

File tree

7 files changed

+120
-13
lines changed

7 files changed

+120
-13
lines changed

server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionScheduler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public static void scheduleCompaction(TsFileManager tsFileManager, long timePart
8080
}
8181

8282
public static void tryToSubmitInnerSpaceCompactionTask(
83-
String logicalStorageGroupName,
83+
String storageGroupName,
8484
String dataRegionId,
8585
long timePartition,
8686
TsFileManager tsFileManager,
@@ -96,12 +96,12 @@ public static void tryToSubmitInnerSpaceCompactionTask(
9696
innerSpaceCompactionSelector =
9797
config
9898
.getInnerSequenceCompactionSelector()
99-
.createInstance(logicalStorageGroupName, dataRegionId, timePartition);
99+
.createInstance(storageGroupName, dataRegionId, timePartition, tsFileManager);
100100
} else {
101101
innerSpaceCompactionSelector =
102102
config
103103
.getInnerUnsequenceCompactionSelector()
104-
.createInstance(logicalStorageGroupName, dataRegionId, timePartition);
104+
.createInstance(storageGroupName, dataRegionId, timePartition, tsFileManager);
105105
}
106106
List<List<TsFileResource>> taskList =
107107
innerSpaceCompactionSelector.selectInnerSpaceTask(

server/src/main/java/org/apache/iotdb/db/engine/compaction/constant/InnerSequenceCompactionSelector.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.apache.iotdb.db.engine.compaction.inner.IInnerSeqSpaceSelector;
2323
import org.apache.iotdb.db.engine.compaction.inner.sizetiered.SizeTieredCompactionSelector;
24+
import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
2425

2526
public enum InnerSequenceCompactionSelector {
2627
SIZE_TIERED;
@@ -33,12 +34,15 @@ public static InnerSequenceCompactionSelector getInnerSequenceCompactionSelector
3334
}
3435

3536
public IInnerSeqSpaceSelector createInstance(
36-
String logicalStorageGroupName, String virtualStorageGroupName, long timePartition) {
37+
String storageGroupName,
38+
String dataRegionId,
39+
long timePartition,
40+
TsFileManager tsFileManager) {
3741
switch (this) {
3842
case SIZE_TIERED:
3943
default:
4044
return new SizeTieredCompactionSelector(
41-
logicalStorageGroupName, virtualStorageGroupName, timePartition, true);
45+
storageGroupName, dataRegionId, timePartition, true, tsFileManager);
4246
}
4347
}
4448
}

server/src/main/java/org/apache/iotdb/db/engine/compaction/constant/InnerUnsequenceCompactionSelector.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import org.apache.iotdb.db.engine.compaction.inner.IInnerUnseqSpaceSelector;
2222
import org.apache.iotdb.db.engine.compaction.inner.sizetiered.SizeTieredCompactionSelector;
23+
import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
2324

2425
public enum InnerUnsequenceCompactionSelector {
2526
SIZE_TIERED;
@@ -33,12 +34,15 @@ public static InnerUnsequenceCompactionSelector getInnerUnsequenceCompactionSele
3334
}
3435

3536
public IInnerUnseqSpaceSelector createInstance(
36-
String logicalStorageGroupName, String virtualStorageGroupName, long timePartition) {
37+
String storageGroupName,
38+
String dataRegionId,
39+
long timePartition,
40+
TsFileManager tsFileManager) {
3741
switch (this) {
3842
case SIZE_TIERED:
3943
default:
4044
return new SizeTieredCompactionSelector(
41-
logicalStorageGroupName, virtualStorageGroupName, timePartition, false);
45+
storageGroupName, dataRegionId, timePartition, false, tsFileManager);
4246
}
4347
}
4448
}

server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.iotdb.db.engine.compaction.CompactionTaskManager;
2525
import org.apache.iotdb.db.engine.compaction.inner.IInnerSeqSpaceSelector;
2626
import org.apache.iotdb.db.engine.compaction.inner.IInnerUnseqSpaceSelector;
27+
import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
2728
import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
2829
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
2930
import org.apache.iotdb.db.engine.storagegroup.TsFileResourceStatus;
@@ -55,18 +56,26 @@ public class SizeTieredCompactionSelector
5556
private static final Logger LOGGER =
5657
LoggerFactory.getLogger(IoTDBConstant.COMPACTION_LOGGER_NAME);
5758
private static final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
58-
protected String logicalStorageGroupName;
59+
protected String storageGroupName;
5960
protected String dataRegionId;
6061
protected long timePartition;
6162
protected List<TsFileResource> tsFileResources;
6263
protected boolean sequence;
64+
protected TsFileManager tsFileManager;
65+
protected boolean hasNextTimePartition;
6366

6467
public SizeTieredCompactionSelector(
65-
String logicalStorageGroupName, String dataRegionId, long timePartition, boolean sequence) {
66-
this.logicalStorageGroupName = logicalStorageGroupName;
68+
String storageGroupName,
69+
String dataRegionId,
70+
long timePartition,
71+
boolean sequence,
72+
TsFileManager tsFileManager) {
73+
this.storageGroupName = storageGroupName;
6774
this.dataRegionId = dataRegionId;
6875
this.timePartition = timePartition;
6976
this.sequence = sequence;
77+
this.tsFileManager = tsFileManager;
78+
hasNextTimePartition = tsFileManager.hasNextTimePartition(timePartition, sequence);
7079
}
7180

7281
/**
@@ -152,6 +161,13 @@ private boolean selectLevelTask(
152161
shouldContinueToSearch = false;
153162
}
154163
}
164+
165+
// if next time partition exists
166+
// submit a merge task even it does not meet the requirement for file num or file size
167+
if (hasNextTimePartition && selectedFileList.size() > 1) {
168+
taskPriorityQueue.add(new Pair<>(new ArrayList<>(selectedFileList), selectedFileSize));
169+
shouldContinueToSearch = false;
170+
}
155171
return shouldContinueToSearch;
156172
}
157173

server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public class TsFileManager {
5454

5555
private String writeLockHolder;
5656
// time partition -> double linked list of tsfiles
57-
private Map<Long, TsFileResourceList> sequenceFiles = new TreeMap<>();
58-
private Map<Long, TsFileResourceList> unsequenceFiles = new TreeMap<>();
57+
private TreeMap<Long, TsFileResourceList> sequenceFiles = new TreeMap<>();
58+
private TreeMap<Long, TsFileResourceList> unsequenceFiles = new TreeMap<>();
5959

6060
private List<TsFileResource> sequenceRecoverTsFileResources = new ArrayList<>();
6161
private List<TsFileResource> unsequenceRecoverTsFileResources = new ArrayList<>();
@@ -431,4 +431,14 @@ public static int compareFileName(File o1, File o2) {
431431
public long getNextCompactionTaskId() {
432432
return currentCompactionTaskSerialId.getAndIncrement();
433433
}
434+
435+
public boolean hasNextTimePartition(long timePartition, boolean sequence) {
436+
try {
437+
return sequence
438+
? sequenceFiles.higherKey(timePartition) != null
439+
: unsequenceFiles.higherKey(timePartition) != null;
440+
} catch (NullPointerException e) {
441+
return false;
442+
}
443+
}
434444
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.iotdb.db.engine.compaction.inner.sizetiered;
21+
22+
import org.apache.iotdb.db.conf.IoTDBDescriptor;
23+
import org.apache.iotdb.db.engine.storagegroup.FakedTsFileResource;
24+
import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
25+
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
26+
27+
import org.junit.Assert;
28+
import org.junit.Test;
29+
30+
import java.util.ArrayList;
31+
import java.util.List;
32+
33+
public class SizeTieredCompactionSelectorTest {
34+
@Test
35+
public void testSubmitWhenNextTimePartitionExists() {
36+
long originPartitionInterval = IoTDBDescriptor.getInstance().getConfig().getPartitionInterval();
37+
IoTDBDescriptor.getInstance().getConfig().setPartitionInterval(1000);
38+
List<TsFileResource> resources = new ArrayList<>();
39+
40+
for (int i = 0; i < 100; ++i) {
41+
FakedTsFileResource resource =
42+
new FakedTsFileResource(1024, String.format("%d-%d-0-0.tsfile", i + 1, i + 1));
43+
resource.timeIndex.updateStartTime("root.test.d", i * 100);
44+
resource.timeIndex.updateEndTime("root.test.d", (i + 1) * 100);
45+
resource.timePartition = i / 10;
46+
resources.add(resource);
47+
}
48+
49+
TsFileManager manager = new TsFileManager("root.test", "0", "");
50+
manager.addAll(resources, true);
51+
52+
for (long i = 0; i < 9; ++i) {
53+
Assert.assertEquals(
54+
1,
55+
new SizeTieredCompactionSelector("root.test", "0", i, true, manager)
56+
.selectInnerSpaceTask(manager.getSequenceListByTimePartition(i))
57+
.size());
58+
}
59+
60+
Assert.assertEquals(
61+
0,
62+
new SizeTieredCompactionSelector("root.test", "0", 9, true, manager)
63+
.selectInnerSpaceTask(manager.getSequenceListByTimePartition(9))
64+
.size());
65+
}
66+
}

server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FakedTsFileResource.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525

2626
public class FakedTsFileResource extends TsFileResource {
2727
/** time index */
28-
protected ITimeIndex timeIndex;
28+
public ITimeIndex timeIndex;
29+
30+
public long timePartition;
2931

3032
private long tsFileSize;
3133
private String fakeTsfileName;
@@ -69,4 +71,9 @@ public boolean equals(Object otherObject) {
6971

7072
return false;
7173
}
74+
75+
@Override
76+
public long getTimePartition() {
77+
return this.timePartition;
78+
}
7279
}

0 commit comments

Comments
 (0)