This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch tsfile_name
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/tsfile_name by this push:
new 58e8db5e6d [IOTDB-3100] Semantics change of TsFile filename (#6088)
58e8db5e6d is described below
commit 58e8db5e6d08c6115a07018e59d706dd51aa0c83
Author: Alan Choo <[email protected]>
AuthorDate: Tue May 31 14:52:52 2022 +0800
[IOTDB-3100] Semantics change of TsFile filename (#6088)
---
.../org/apache/iotdb/db/engine/StorageEngine.java | 8 -
.../compaction/inner/InnerSpaceCompactionTask.java | 7 +-
.../sizetiered/SizeTieredCompactionSelector.java | 23 +-
.../inner/utils/MultiTsFileDeviceIterator.java | 4 +-
.../iotdb/db/engine/storagegroup/DataRegion.java | 141 +++++-----
.../db/engine/storagegroup/TsFileManager.java | 193 ++++++++++---
.../iotdb/db/engine/storagegroup/TsFileName.java | 221 +++++++++++++++
.../engine/storagegroup/TsFileNameGenerator.java | 185 +++----------
.../db/engine/storagegroup/TsFileResource.java | 108 ++++----
.../db/engine/storagegroup/TsFileResourceList.java | 34 ++-
.../dataregion/StorageGroupManager.java | 9 -
.../cross/RewriteCompactionFileSelectorTest.java | 250 +++--------------
.../ReadChunkCompactionPerformerNoAlignedTest.java | 29 +-
.../utils/CompactionFileGeneratorUtils.java | 6 +-
.../db/engine/storagegroup/TsFileManagerTest.java | 300 +++++++++++++++++++--
.../tsfile/fileSystem/fsFactory/FSFactory.java | 8 +
.../tsfile/fileSystem/fsFactory/HDFSFactory.java | 5 +
.../fileSystem/fsFactory/LocalFSFactory.java | 11 +
.../org/apache/iotdb/tsfile/utils/TsFileUtils.java | 1 +
.../org/apache/iotdb/tsfile/write/PerfTest.java | 7 +-
20 files changed, 936 insertions(+), 614 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
index a91ef781ff..31dfdddfc9 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
@@ -958,14 +958,6 @@ public class StorageEngine implements IService {
return false;
}
- /**
- * Set the version of given partition to newMaxVersion if it is larger than
the current version.
- */
- public void setPartitionVersionToMax(
- PartialPath storageGroup, long partitionId, long newMaxVersion) {
- processorMap.get(storageGroup).setPartitionVersionToMax(partitionId,
newMaxVersion);
- }
-
public void removePartitions(PartialPath storageGroupPath,
TimePartitionFilter filter) {
if (processorMap.get(storageGroupPath) != null) {
processorMap.get(storageGroupPath).removePartitions(filter);
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/InnerSpaceCompactionTask.java
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/InnerSpaceCompactionTask.java
index 8f9b538816..d175c71eca 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/InnerSpaceCompactionTask.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/InnerSpaceCompactionTask.java
@@ -26,6 +26,7 @@ import
org.apache.iotdb.db.engine.compaction.log.CompactionLogger;
import org.apache.iotdb.db.engine.compaction.performer.ICompactionPerformer;
import org.apache.iotdb.db.engine.compaction.task.AbstractCompactionTask;
import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
+import org.apache.iotdb.db.engine.storagegroup.TsFileName;
import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.engine.storagegroup.TsFileResourceList;
@@ -38,7 +39,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -267,8 +267,7 @@ public class InnerSpaceCompactionTask extends
AbstractCompactionTask {
for (TsFileResource resource : selectedTsFileResourceList) {
try {
selectedFileSize += resource.getTsFileSize();
- TsFileNameGenerator.TsFileName fileName =
- TsFileNameGenerator.getTsFileName(resource.getTsFile().getName());
+ TsFileName fileName = TsFileName.parse(resource.getTsFile().getName());
sumOfCompactionCount += fileName.getInnerCompactionCnt();
if (fileName.getInnerCompactionCnt() > maxCompactionCount) {
maxCompactionCount = fileName.getInnerCompactionCnt();
@@ -276,7 +275,7 @@ public class InnerSpaceCompactionTask extends
AbstractCompactionTask {
if (fileName.getVersion() > maxFileVersion) {
maxFileVersion = fileName.getVersion();
}
- } catch (IOException e) {
+ } catch (RuntimeException e) {
LOGGER.warn("Fail to get the tsfile name of {}", resource.getTsFile(),
e);
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java
index bb16f60c5a..48612d791b 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.engine.compaction.CompactionTaskManager;
import org.apache.iotdb.db.engine.compaction.inner.IInnerSeqSpaceSelector;
import org.apache.iotdb.db.engine.compaction.inner.IInnerUnseqSpaceSelector;
-import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
+import org.apache.iotdb.db.engine.storagegroup.TsFileName;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.engine.storagegroup.TsFileResourceStatus;
import org.apache.iotdb.tsfile.utils.Pair;
@@ -32,7 +32,6 @@ import org.apache.iotdb.tsfile.utils.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -113,19 +112,16 @@ public class SizeTieredCompactionSelector
* @param taskPriorityQueue it stores the batches of files to be compacted
and the total size of
* each batch
* @return return whether to continue the search to higher levels
- * @throws IOException
*/
private boolean selectLevelTask(
- int level, PriorityQueue<Pair<List<TsFileResource>, Long>>
taskPriorityQueue)
- throws IOException {
+ int level, PriorityQueue<Pair<List<TsFileResource>, Long>>
taskPriorityQueue) {
boolean shouldContinueToSearch = true;
List<TsFileResource> selectedFileList = new ArrayList<>();
long selectedFileSize = 0L;
long targetCompactionFileSize = config.getTargetCompactionFileSize();
for (TsFileResource currentFile : tsFileResources) {
- TsFileNameGenerator.TsFileName currentName =
- TsFileNameGenerator.getTsFileName(currentFile.getTsFile().getName());
+ TsFileName currentName =
TsFileName.parse(currentFile.getTsFile().getName());
if (currentName.getInnerCompactionCnt() != level
|| currentFile.getStatus() != TsFileResourceStatus.CLOSED) {
selectedFileList.clear();
@@ -155,11 +151,10 @@ public class SizeTieredCompactionSelector
return shouldContinueToSearch;
}
- private int searchMaxFileLevel() throws IOException {
+ private int searchMaxFileLevel() {
int maxLevel = -1;
for (TsFileResource currentFile : tsFileResources) {
- TsFileNameGenerator.TsFileName currentName =
- TsFileNameGenerator.getTsFileName(currentFile.getTsFile().getName());
+ TsFileName currentName =
TsFileName.parse(currentFile.getTsFile().getName());
if (currentName.getInnerCompactionCnt() > maxLevel) {
maxLevel = currentName.getInnerCompactionCnt();
}
@@ -175,15 +170,13 @@ public class SizeTieredCompactionSelector
TsFileResource resourceOfO1 = o1.left.get(0);
TsFileResource resourceOfO2 = o2.left.get(0);
try {
- TsFileNameGenerator.TsFileName fileNameOfO1 =
-
TsFileNameGenerator.getTsFileName(resourceOfO1.getTsFile().getName());
- TsFileNameGenerator.TsFileName fileNameOfO2 =
-
TsFileNameGenerator.getTsFileName(resourceOfO2.getTsFile().getName());
+ TsFileName fileNameOfO1 =
TsFileName.parse(resourceOfO1.getTsFile().getName());
+ TsFileName fileNameOfO2 =
TsFileName.parse(resourceOfO2.getTsFile().getName());
if (fileNameOfO1.getInnerCompactionCnt() !=
fileNameOfO2.getInnerCompactionCnt()) {
return fileNameOfO2.getInnerCompactionCnt() -
fileNameOfO1.getInnerCompactionCnt();
}
return (int) (fileNameOfO2.getVersion() - fileNameOfO1.getVersion());
- } catch (IOException e) {
+ } catch (RuntimeException e) {
return 0;
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/MultiTsFileDeviceIterator.java
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/MultiTsFileDeviceIterator.java
index be6d2c8691..7e2161f8e5 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/MultiTsFileDeviceIterator.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/MultiTsFileDeviceIterator.java
@@ -22,6 +22,7 @@ import
org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.engine.modification.Modification;
import org.apache.iotdb.db.engine.modification.ModificationFile;
+import org.apache.iotdb.db.engine.storagegroup.TsFileName;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.query.control.FileReaderManager;
import org.apache.iotdb.db.utils.QueryUtils;
@@ -57,7 +58,8 @@ public class MultiTsFileDeviceIterator implements
AutoCloseable {
/** Used for inner space compaction. */
public MultiTsFileDeviceIterator(List<TsFileResource> tsFileResources)
throws IOException {
this.tsFileResources = new ArrayList<>(tsFileResources);
- Collections.sort(this.tsFileResources, TsFileResource::compareFileName);
+ this.tsFileResources.sort(
+ (r1, r2) -> TsFileName.compareFileName(r1.getTsFile(),
r2.getTsFile()));
try {
for (TsFileResource tsFileResource : this.tsFileResources) {
TsFileSequenceReader reader = new
TsFileSequenceReader(tsFileResource.getTsFilePath());
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
index 7bb7abe855..55375b3e60 100755
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/DataRegion.java
@@ -123,8 +123,8 @@ import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -202,8 +202,6 @@ public class DataRegion {
private AtomicInteger upgradeFileCount = new AtomicInteger();
- private AtomicBoolean isSettling = new AtomicBoolean();
-
/** data region id */
private String dataRegionId;
/** logical storage group name */
@@ -232,12 +230,15 @@ public class DataRegion {
/** file flush policy */
private TsFileFlushPolicy fileFlushPolicy;
/**
- * The max file versions in each partition. By recording this, if several
IoTDB instances have the
- * same policy of closing file and their ingestion is identical, then files
of the same version in
- * different IoTDB instance will have identical data, providing convenience
for data comparison
- * across different instances. partition number -> max version number
+ * TODOļ¼delete this field when new load is completed The max file versions
in each partition. By
+ * recording this, if several IoTDB instances have the same policy of
closing file and their
+ * ingestion is identical, then files of the same version in different IoTDB
instance will have
+ * identical data, providing convenience for data comparison across
different instances. partition
+ * number -> max version number
*/
private Map<Long, Long> partitionMaxFileVersions = new HashMap<>();
+ /** The last file created time in each partition. partition number -> max
created time */
+ private final Map<Long, AtomicLong> partition2LastFileCreatedTime = new
HashMap<>();
/** storage group info for mem control */
private StorageGroupInfo storageGroupInfo = new StorageGroupInfo(this);
/** whether it's ready from recovery */
@@ -337,14 +338,6 @@ public class DataRegion {
return ret;
}
- public AtomicBoolean getIsSettling() {
- return isSettling;
- }
-
- public void setSettling(boolean isSettling) {
- this.isSettling.set(isSettling);
- }
-
/** this class is used to store recovering context */
private class DataRegionRecoveryContext {
/** number of files to be recovered */
@@ -471,18 +464,26 @@ public class DataRegion {
for (TsFileResource resource : tsFileManager.getTsFileList(true)) {
long partitionNum = resource.getTimePartition();
updatePartitionFileVersion(partitionNum, resource.getVersion());
+ updatePartitionFileCreatedTime(
+ partitionNum,
TsFileName.parseTime(resource.getTsFile().getName()));
}
for (TsFileResource resource : tsFileManager.getTsFileList(false)) {
long partitionNum = resource.getTimePartition();
updatePartitionFileVersion(partitionNum, resource.getVersion());
+ updatePartitionFileCreatedTime(
+ partitionNum,
TsFileName.parseTime(resource.getTsFile().getName()));
}
for (TsFileResource resource : upgradeSeqFileList) {
long partitionNum = resource.getTimePartition();
updatePartitionFileVersion(partitionNum, resource.getVersion());
+ updatePartitionFileCreatedTime(
+ partitionNum,
TsFileName.parseTime(resource.getTsFile().getName()));
}
for (TsFileResource resource : upgradeUnseqFileList) {
long partitionNum = resource.getTimePartition();
updatePartitionFileVersion(partitionNum, resource.getVersion());
+ updatePartitionFileCreatedTime(
+ partitionNum,
TsFileName.parseTime(resource.getTsFile().getName()));
}
updateLatestFlushedTime();
} catch (IOException e) {
@@ -524,7 +525,7 @@ public class DataRegion {
TimeUnit.MILLISECONDS);
}
- private void recoverCompaction() throws Exception {
+ private void recoverCompaction() {
CompactionRecoverManager compactionRecoverManager =
new CompactionRecoverManager(tsFileManager, logicalStorageGroupName,
dataRegionId);
compactionRecoverManager.recoverInnerSpaceCompaction(true);
@@ -539,6 +540,20 @@ public class DataRegion {
}
}
+ private void updatePartitionFileCreatedTime(long partitionNum, long
createdTime) {
+ AtomicLong maxCreatedTime =
+ partition2LastFileCreatedTime.computeIfAbsent(partitionNum, k -> new
AtomicLong());
+ boolean flag = true;
+ while (flag) {
+ long oldVal = maxCreatedTime.get();
+ if (createdTime > oldVal) {
+ flag = !maxCreatedTime.compareAndSet(oldVal, createdTime);
+ } else {
+ flag = false;
+ }
+ }
+ }
+
/**
* use old seq file to update latestTimeForEachDevice,
globalLatestFlushedTimeForEachDevice,
* partitionLatestFlushedTimeForEachDevice and
timePartitionIdVersionControllerMap
@@ -623,14 +638,14 @@ public class DataRegion {
}
}
- tsFiles.sort(this::compareFileName);
+ tsFiles.sort(TsFileName::compareFileName);
if (!tsFiles.isEmpty()) {
checkTsFileTime(tsFiles.get(tsFiles.size() - 1));
}
List<TsFileResource> ret = new ArrayList<>();
tsFiles.forEach(f -> ret.add(new TsFileResource(f)));
- upgradeFiles.sort(this::compareFileName);
+ upgradeFiles.sort(TsFileName::compareFileName);
if (!upgradeFiles.isEmpty()) {
checkTsFileTime(upgradeFiles.get(upgradeFiles.size() - 1));
}
@@ -751,7 +766,7 @@ public class DataRegion {
recoverPerformer.recover();
// pick up crashed compaction target files
if (recoverPerformer.hasCrashed()) {
- if
(TsFileResource.getInnerCompactionCount(sealedTsFile.getTsFile().getName()) >
0) {
+ if
(TsFileName.parseInnerCompactionCnt(sealedTsFile.getTsFile().getName()) > 0) {
tsFileManager.addForRecover(sealedTsFile, isSeq);
return;
} else {
@@ -761,7 +776,7 @@ public class DataRegion {
}
}
sealedTsFile.close();
- tsFileManager.add(sealedTsFile, isSeq);
+ tsFileManager.keepOrderInsert(sealedTsFile, isSeq);
tsFileResourceManager.registerSealedTsFileResource(sealedTsFile);
} catch (DataRegionException | IOException e) {
logger.error("Fail to recover sealed TsFile {}, skip it.",
sealedTsFile.getTsFilePath(), e);
@@ -771,20 +786,6 @@ public class DataRegion {
}
}
- // ({systemTime}-{versionNum}-{mergeNum}.tsfile)
- private int compareFileName(File o1, File o2) {
- String[] items1 = o1.getName().replace(TSFILE_SUFFIX,
"").split(FILE_NAME_SEPARATOR);
- String[] items2 = o2.getName().replace(TSFILE_SUFFIX,
"").split(FILE_NAME_SEPARATOR);
- long ver1 = Long.parseLong(items1[0]);
- long ver2 = Long.parseLong(items2[0]);
- int cmp = Long.compare(ver1, ver2);
- if (cmp == 0) {
- return Long.compare(Long.parseLong(items1[1]),
Long.parseLong(items2[1]));
- } else {
- return cmp;
- }
- }
-
/**
* insert one row of data
*
@@ -1416,17 +1417,42 @@ public class DataRegion {
private TsFileProcessor newTsFileProcessor(boolean sequence, long
timePartitionId)
throws IOException, DiskSpaceInsufficientException {
-
long version = partitionMaxFileVersions.getOrDefault(timePartitionId, 0L)
+ 1;
partitionMaxFileVersions.put(timePartitionId, version);
+
+ AtomicLong maxCreatedTime =
+ partition2LastFileCreatedTime.computeIfAbsent(timePartitionId, k ->
new AtomicLong());
+ long createdTime = System.currentTimeMillis();
+ boolean flag = true;
+ while (flag) {
+ long oldVal = maxCreatedTime.get();
+ createdTime = System.currentTimeMillis();
+ if (createdTime > oldVal) {
+ flag = !maxCreatedTime.compareAndSet(oldVal, createdTime);
+ } else {
+ logger.warn(
+ "System currentTimeMillis is smaller than time partition-{}'s max
file created time {}.",
+ timePartitionId,
+ oldVal);
+ try {
+ Thread.sleep(1_000);
+ } catch (InterruptedException e) {
+ logger.error(
+ "Interrupted when waiting for System currentTimeMillis increases
to bigger than {}.",
+ oldVal);
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
+
String filePath =
TsFileNameGenerator.generateNewTsFilePathWithMkdir(
sequence,
logicalStorageGroupName,
dataRegionId,
timePartitionId,
- System.currentTimeMillis(),
- version,
+ createdTime,
+ version, // TODO: change version to 0L when field
partitionMaxFileVersions is removed
0,
0);
@@ -1469,21 +1495,6 @@ public class DataRegion {
return tsFileProcessor;
}
- /**
- * Create a new tsfile name
- *
- * @return file name
- */
- private String getNewTsFileName(long timePartitionId) {
- long version = partitionMaxFileVersions.getOrDefault(timePartitionId, 0L)
+ 1;
- partitionMaxFileVersions.put(timePartitionId, version);
- return getNewTsFileName(System.currentTimeMillis(), version, 0, 0);
- }
-
- private String getNewTsFileName(long time, long version, int mergeCnt, int
unseqCompactionCnt) {
- return TsFileNameGenerator.generateNewTsFileName(time, version, mergeCnt,
unseqCompactionCnt);
- }
-
/**
* close one tsfile processor
*
@@ -2498,21 +2509,6 @@ public class DataRegion {
}
}
- /**
- * Set the version in "partition" to "version" if "version" is larger than
the current version.
- */
- public void setPartitionFileVersionToMax(long partition, long version) {
- partitionMaxFileVersions.compute(
- partition, (prt, oldVer) -> computeMaxVersion(oldVer, version));
- }
-
- private long computeMaxVersion(Long oldVersion, Long newVersion) {
- if (oldVersion == null) {
- return newVersion;
- }
- return Math.max(oldVersion, newVersion);
- }
-
private Long getTsFileResourceEstablishTime(TsFileResource tsFileResource) {
String tsFileName = tsFileResource.getTsFile().getName();
return Long.parseLong(tsFileName.split(FILE_NAME_SEPARATOR)[0]);
@@ -2694,8 +2690,9 @@ public class DataRegion {
* Get an appropriate filename to ensure the order between files. The tsfile
is named after
*
({systemTime}-{versionNum}-{in_space_compaction_num}-{cross_space_compaction_num}.tsfile).
*
- * <p>The sorting rules for tsfile names @see {@link this#compareFileName},
we can restore the
- * list based on the file name and ensure the correctness of the order, so
there are three cases.
+ * <p>The sorting rules for tsfile names @see {@link
TsFileName#compareFileName} }, we can restore
+ * the list based on the file name and ensure the correctness of the order,
so there are three
+ * cases.
*
* <p>1. The tsfile is to be inserted in the first place of the list.
Timestamp can be set to half
* of the timestamp value in the file name of the first tsfile in the list ,
and the version
@@ -2718,7 +2715,7 @@ public class DataRegion {
List<TsFileResource> sequenceList) {
long timePartitionId = newTsFileResource.getTimePartition();
if (tsFileType == LoadTsFileType.LOAD_UNSEQUENCE || insertIndex ==
sequenceList.size() - 1) {
- return getNewTsFileName(
+ return TsFileName.getTsFileName(
System.currentTimeMillis(),
getAndSetNewVersion(timePartitionId, newTsFileResource),
0,
@@ -2730,7 +2727,7 @@ public class DataRegion {
long subsequenceTime =
getTsFileResourceEstablishTime(sequenceList.get(insertIndex + 1));
long meanTime = preTime + ((subsequenceTime - preTime) >> 1);
- return getNewTsFileName(
+ return TsFileName.getTsFileName(
meanTime, getAndSetNewVersion(timePartitionId, newTsFileResource), 0,
0);
}
@@ -3489,7 +3486,7 @@ public class DataRegion {
}
public List<Long> getTimePartitions() {
- return new ArrayList<>(partitionMaxFileVersions.keySet());
+ return new ArrayList<>(partition2LastFileCreatedTime.keySet());
}
public String getInsertWriteLockHolder() {
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java
index 009e151d87..6453ec1d88 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java
@@ -29,6 +29,8 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -39,9 +41,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-import static org.apache.iotdb.commons.conf.IoTDBConstant.FILE_NAME_SEPARATOR;
-import static
org.apache.iotdb.tsfile.common.constant.TsFileConstant.TSFILE_SUFFIX;
-
public class TsFileManager {
private static final Logger LOGGER =
LoggerFactory.getLogger(TsFileManager.class);
private String storageGroupName;
@@ -168,7 +167,7 @@ public class TsFileManager {
}
}
- public void keepOrderInsert(TsFileResource tsFileResource, boolean sequence)
throws IOException {
+ public void keepOrderInsert(TsFileResource tsFileResource, boolean sequence)
{
writeLock("keepOrderInsert");
try {
Map<Long, TsFileResourceList> selectedMap = sequence ? sequenceFiles :
unsequenceFiles;
@@ -199,6 +198,141 @@ public class TsFileManager {
}
}
+ /**
+ * Add files with same timestamp after target file in order, some files'
version field will be
+ * renamed when name conflicting occurs.
+ *
+ * @param addAfterThisFile files will be added after this file, null means
add to the beginning of
+ * corresponding TsFileResourceList
+ * @param filesToAdd files to add, add order will follow files order in the
list. File name format
+ * should like {@link TsFileName#TS_FILE_NAME_PATTERN } and their time
fields should be same.
+ * @param sequence files in filesToAdd are sequence or not
+ * @param timePartition the time partition of files in filesToAdd
+ * @return false if target file doesn't exist in the TsFileManger or files
to add don't share same
+ * timestamp
+ */
+ public boolean keepOrderAddAllAndRenameAfter(
+ TsFileResource addAfterThisFile,
+ List<TsFileResource> filesToAdd,
+ boolean sequence,
+ long timePartition) {
+ if (filesToAdd.isEmpty()) {
+ return true;
+ }
+ // all files to add should share the same timestamp
+ long targetTime = filesToAdd.get(0).getCreatedTime();
+ for (TsFileResource resource : filesToAdd) {
+ if (resource.getCreatedTime() != targetTime) {
+ LOGGER.warn(
+ "File {} and file {} don't share the same timestamp, please check
it.",
+ filesToAdd.get(0).getTsFile(),
+ resource.getTsFile());
+ return false;
+ }
+ }
+
+ writeLock("keepOrderAddAllAndRenameAfter");
+ try {
+ Map<Long, TsFileResourceList> targetMap = sequence ? sequenceFiles :
unsequenceFiles;
+ TsFileResourceList targetList =
+ targetMap.computeIfAbsent(timePartition, o -> new
TsFileResourceList());
+ Map<Long, TsFileResourceList> leftMap = sequence ? unsequenceFiles :
sequenceFiles;
+ TsFileResourceList leftList =
+ leftMap.computeIfAbsent(timePartition, o -> new
TsFileResourceList());
+
+ // check target file position
+ if (addAfterThisFile == null) {
+ // check time, make sure target time <= header.time
+ if (!targetList.isEmpty() && targetList.get(0).getCreatedTime() <
targetTime) {
+ LOGGER.warn(
+ "Files to add will destroy the order of TsFileResourceList,
please check the add position of file {}",
+ filesToAdd.get(0).getTsFile());
+ return false;
+ }
+ } else {
+ // target file doesn't exist
+ if (!targetList.contains(addAfterThisFile)) {
+ LOGGER.warn(
+ "TsFileManager doesn't contain file {}, cannot add files after
it.",
+ addAfterThisFile.getTsFile());
+ return false;
+ }
+ // check time, make sure prev.time <= target time <= next.time
+ if ((addAfterThisFile.prev != null &&
addAfterThisFile.prev.getCreatedTime() > targetTime)
+ || (addAfterThisFile.next != null
+ && addAfterThisFile.next.getCreatedTime() < targetTime)) {
+ LOGGER.warn(
+ "Files to add will destroy the order of TsFileResourceList,
please check the add position of file {}",
+ filesToAdd.get(0).getTsFile());
+ return false;
+ }
+ }
+
+ // filter files need renaming
+ List<TsFileResource> filesToRename = new ArrayList<>();
+ long startVersion =
+ addAfterThisFile != null && addAfterThisFile.getCreatedTime() ==
targetTime
+ ? addAfterThisFile.getVersion() + 1
+ : -1;
+ // 1. filter files need renaming from target list
+ List<TsFileResource> targetSameTimeList =
targetList.getFilesByTime(targetTime);
+ // e.g., seq: [1-0-0-0, add here with time=2, 2-0-0-0], unseq: [2-1-0-0]
+ if (startVersion == -1 && !targetSameTimeList.isEmpty()) {
+ startVersion = targetSameTimeList.get(0).getVersion();
+ }
+ for (TsFileResource resource : targetSameTimeList) {
+ if (resource.getVersion() >= startVersion) {
+ filesToRename.add(resource);
+ }
+ }
+ // 2. filter files need renaming from another list
+ List<TsFileResource> leftSameTimeList =
leftList.getFilesByTime(targetTime);
+ // e.g., seq: [1-0-0-0, add here with time=2, 3-0-0-0], unseq: [2-0-0-0,
2-1-0-0]
+ if (startVersion == -1 && !leftSameTimeList.isEmpty()) {
+ startVersion = leftSameTimeList.get(leftSameTimeList.size() -
1).getVersion() + 1;
+ }
+ for (TsFileResource resource : leftSameTimeList) {
+ if (resource.getVersion() >= startVersion) {
+ filesToRename.add(resource);
+ }
+ }
+
+ // rename existing files
+ filesToRename.sort(((Comparator<TsFileResource>)
(TsFileName::compareFileName)).reversed());
+ long offset = filesToAdd.size();
+ for (TsFileResource resource : filesToRename) {
+ resource.setVersion(resource.getVersion() + offset);
+ }
+
+ // add files
+ if (startVersion == -1) {
+ startVersion = 0;
+ }
+ int index = 0;
+ if (addAfterThisFile == null) {
+ addAfterThisFile = filesToAdd.get(0);
+ addAfterThisFile.setVersion(startVersion);
+ startVersion++;
+ index++;
+ targetList.set(0, addAfterThisFile);
+ }
+ TsFileResource prev = addAfterThisFile;
+ for (; index < filesToAdd.size(); index++) {
+ TsFileResource current = filesToAdd.get(index);
+ // update version
+ current.setVersion(startVersion);
+ startVersion++;
+ // add it to manager
+ targetList.insertAfter(prev, current);
+ prev = current;
+ }
+ } finally {
+ writeUnlock();
+ }
+
+ return true;
+ }
+
/** This method is called after compaction to update memory. */
public void replace(
List<TsFileResource> seqFileResources,
@@ -209,7 +343,16 @@ public class TsFileManager {
throws IOException {
writeLock("replace");
try {
+ Map<Long, List<TsFileResource>> time2TargetFiles = new HashMap<>();
+ for (TsFileResource resource : targetFileResources) {
+ time2TargetFiles
+ .computeIfAbsent(resource.getCreatedTime(), k -> new ArrayList<>())
+ .add(resource);
+ }
+ Map<Long, TsFileResource> time2TargetPosition = new HashMap<>();
+ // remove source
for (TsFileResource tsFileResource : seqFileResources) {
+ time2TargetPosition.put(tsFileResource.getCreatedTime(),
tsFileResource.prev);
if (sequenceFiles.get(timePartition).remove(tsFileResource)) {
TsFileResourceManager.getInstance().removeTsFileResource(tsFileResource);
}
@@ -219,20 +362,18 @@ public class TsFileManager {
TsFileResourceManager.getInstance().removeTsFileResource(tsFileResource);
}
}
- if (isTargetSequence) {
- // seq inner space compaction or cross space compaction
- for (TsFileResource resource : targetFileResources) {
-
TsFileResourceManager.getInstance().registerSealedTsFileResource(resource);
- sequenceFiles.get(timePartition).keepOrderInsert(resource);
- }
- } else {
- // unseq inner space compaction
- for (TsFileResource resource : targetFileResources) {
-
TsFileResourceManager.getInstance().registerSealedTsFileResource(resource);
- unsequenceFiles.get(timePartition).keepOrderInsert(resource);
- }
+ // add target
+ for (Long time : time2TargetFiles.keySet()) {
+ keepOrderAddAllAndRenameAfter(
+ time2TargetPosition.get(time),
+ time2TargetFiles.get(time),
+ isTargetSequence,
+ timePartition);
+ }
+ // register to TsFileResourceManager
+ for (TsFileResource resource : targetFileResources) {
+
TsFileResourceManager.getInstance().registerSealedTsFileResource(resource);
}
-
} finally {
writeUnlock();
}
@@ -407,22 +548,4 @@ public class TsFileManager {
}
}
}
-
- //
({systemTime}-{versionNum}-{innerCompactionNum}-{crossCompactionNum}.tsfile)
- public static int compareFileName(File o1, File o2) {
- String[] items1 = o1.getName().replace(TSFILE_SUFFIX,
"").split(FILE_NAME_SEPARATOR);
- String[] items2 = o2.getName().replace(TSFILE_SUFFIX,
"").split(FILE_NAME_SEPARATOR);
- long ver1 = Long.parseLong(items1[0]);
- long ver2 = Long.parseLong(items2[0]);
- int cmp = Long.compare(ver1, ver2);
- if (cmp == 0) {
- int cmpVersion = Long.compare(Long.parseLong(items1[1]),
Long.parseLong(items2[1]));
- if (cmpVersion == 0) {
- return Long.compare(Long.parseLong(items1[2]),
Long.parseLong(items2[2]));
- }
- return cmpVersion;
- } else {
- return cmp;
- }
- }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileName.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileName.java
new file mode 100644
index 0000000000..a7d848324e
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileName.java
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.engine.storagegroup;
+
+import java.io.File;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static
org.apache.iotdb.commons.conf.IoTDBConstant.CROSS_COMPACTION_TMP_FILE_SUFFIX;
+import static org.apache.iotdb.commons.conf.IoTDBConstant.FILE_NAME_SEPARATOR;
+import static
org.apache.iotdb.commons.conf.IoTDBConstant.INNER_COMPACTION_TMP_FILE_SUFFIX;
+import static
org.apache.iotdb.tsfile.common.constant.TsFileConstant.TSFILE_SUFFIX;
+
+public class TsFileName implements Comparable<TsFileName> {
+ /**
+ * The format is
{time}-{version}-{innerCompactionCnt}-{crossCompactionCnt}.tsfile. Field time
and
+ * version are used to guarantee the order of tsfiles, if two tsfiles have
the same time, then we
+ * use version to guarantee the order.
+ */
+ public static final Pattern TS_FILE_NAME_PATTERN =
+ Pattern.compile(
+ String.format(
+
"(?<time>\\d+)%s(?<version>\\d+)%s(?<innerCompactionCnt>\\d+)%s(?<crossCompactionCnt>\\d+)(?<suffix>\\%s|\\%s|\\%s)$",
+ FILE_NAME_SEPARATOR,
+ FILE_NAME_SEPARATOR,
+ FILE_NAME_SEPARATOR,
+ TSFILE_SUFFIX,
+ INNER_COMPACTION_TMP_FILE_SUFFIX,
+ CROSS_COMPACTION_TMP_FILE_SUFFIX));
+
+ public static final String TS_FILE_NAME_FORMAT =
+ "%d" + FILE_NAME_SEPARATOR + "%d" + FILE_NAME_SEPARATOR + "%d" +
FILE_NAME_SEPARATOR + "%d";
+
+ private volatile long time;
+ private volatile long version;
+ private int innerCompactionCnt;
+ private int crossCompactionCnt;
+ private final String suffix;
+
+ public TsFileName(
+ long time, long version, int innerCompactionCnt, int crossCompactionCnt,
String suffix) {
+ this.time = time;
+ this.version = version;
+ this.innerCompactionCnt = innerCompactionCnt;
+ this.crossCompactionCnt = crossCompactionCnt;
+ this.suffix = suffix;
+ }
+
+ public String toFileName() {
+ return formatPrefix(time, version, innerCompactionCnt, crossCompactionCnt)
+ suffix;
+ }
+
+ public long getTime() {
+ return time;
+ }
+
+ public void setTime(long time) {
+ this.time = time;
+ }
+
+ public long getVersion() {
+ return version;
+ }
+
+ public void setVersion(long version) {
+ this.version = version;
+ }
+
+ public int getInnerCompactionCnt() {
+ return innerCompactionCnt;
+ }
+
+ public void setInnerCompactionCnt(int innerCompactionCnt) {
+ this.innerCompactionCnt = innerCompactionCnt;
+ }
+
+ public int getCrossCompactionCnt() {
+ return crossCompactionCnt;
+ }
+
+ public void setCrossCompactionCnt(int crossCompactionCnt) {
+ this.crossCompactionCnt = crossCompactionCnt;
+ }
+
+ private static int compare(long time1, long version1, long time2, long
version2) {
+ int cmp = Long.compare(time1, time2);
+ if (cmp == 0) {
+ cmp = Long.compare(version1, version2);
+ }
+ return cmp;
+ }
+
+ @Override
+ public int compareTo(TsFileName other) {
+ return compare(this.time, this.version, other.time, other.version);
+ }
+
+ /** Compare tsfile name, first compare createdTime, then compare versionId */
+ public static int compareFileName(String tsFileName1, String tsFileName2) {
+ return parse(tsFileName1).compareTo(parse(tsFileName2));
+ }
+
+ /** Compare tsfile name, first compare createdTime, then compare versionId */
+ public static int compareFileName(File tsFile1, File tsFile2) {
+ return compareFileName(tsFile1.getName(), tsFile2.getName());
+ }
+
+ public static int compareFileName(TsFileResource resource1, TsFileResource
resource2) {
+ return compare(
+ resource1.getCreatedTime(),
+ resource1.getVersion(),
+ resource2.getCreatedTime(),
+ resource2.getVersion());
+ }
+
+ private static String formatPrefix(
+ long time, long version, int innerCompactionCnt, int crossCompactionCnt)
{
+ return String.format(
+ TS_FILE_NAME_FORMAT, time, version, innerCompactionCnt,
crossCompactionCnt);
+ }
+
+ /**
+ * Gets tsfile name, the format is
+ * {time}-{version}-{innerCompactionCnt}-{crossCompactionCnt}.tsfile
+ */
+ public static String getTsFileName(
+ long time, long version, int innerCompactionCnt, int crossCompactionCnt)
{
+ return formatPrefix(time, version, innerCompactionCnt, crossCompactionCnt)
+ TSFILE_SUFFIX;
+ }
+
+ /**
+ * Gets inner tsfile name, the format is
+ * {time}-{version}-{innerCompactionCnt}-{crossCompactionCnt}.inner
+ */
+ public static String getInnerTsFileName(
+ long time, long version, int innerCompactionCnt, int crossCompactionCnt)
{
+ return formatPrefix(time, version, innerCompactionCnt, crossCompactionCnt)
+ + INNER_COMPACTION_TMP_FILE_SUFFIX;
+ }
+
+ /**
+ * Gets cross tsfile name, the format is
+ * {time}-{version}-{innerCompactionCnt}-{crossCompactionCnt}.cross
+ */
+ public static String getCrossTsFileName(
+ long time, long version, int innerCompactionCnt, int crossCompactionCnt)
{
+ return formatPrefix(time, version, innerCompactionCnt, crossCompactionCnt)
+ + CROSS_COMPACTION_TMP_FILE_SUFFIX;
+ }
+
+ /** Judge whether the file name is valid */
+ public static boolean isNameValid(String fileName) {
+ return TS_FILE_NAME_PATTERN.matcher(fileName).find();
+ }
+
+ /** Parses info from tsfile name */
+ public static TsFileName parse(String tsFileName) {
+ Matcher matcher = TS_FILE_NAME_PATTERN.matcher(tsFileName);
+ if (!matcher.find()) {
+ throw new RuntimeException("TsFile file name format is incorrect: " +
tsFileName);
+ }
+ return new TsFileName(
+ Long.parseLong(matcher.group("time")),
+ Long.parseLong(matcher.group("version")),
+ Integer.parseInt(matcher.group("innerCompactionCnt")),
+ Integer.parseInt(matcher.group("crossCompactionCnt")),
+ matcher.group("suffix"));
+ }
+
+ /** Parses time from tsfile name */
+ public static long parseTime(String tsFileName) {
+ Matcher matcher = TS_FILE_NAME_PATTERN.matcher(tsFileName);
+ if (!matcher.find()) {
+ throw new RuntimeException("TsFile file name format is incorrect: " +
tsFileName);
+ }
+ return Long.parseLong(matcher.group("time"));
+ }
+
+ /** Parses version id from tsfile name */
+ public static long parseVersion(String tsFileName) {
+ Matcher matcher = TS_FILE_NAME_PATTERN.matcher(tsFileName);
+ if (!matcher.find()) {
+ throw new RuntimeException("TsFile file name format is incorrect: " +
tsFileName);
+ }
+ return Long.parseLong(matcher.group("version"));
+ }
+
+ /** Parses inner space merge num from tsfile name */
+ public static int parseInnerCompactionCnt(String tsFileName) {
+ Matcher matcher = TS_FILE_NAME_PATTERN.matcher(tsFileName);
+ if (!matcher.find()) {
+ throw new RuntimeException("TsFile file name format is incorrect: " +
tsFileName);
+ }
+ return Integer.parseInt(matcher.group("innerCompactionCnt"));
+ }
+
+ /** Parses cross space merge num from tsfile name */
+ public static int parseCrossCompactionCnt(String tsFileName) {
+ Matcher matcher = TS_FILE_NAME_PATTERN.matcher(tsFileName);
+ if (!matcher.find()) {
+ throw new RuntimeException("TsFile file name format is incorrect: " +
tsFileName);
+ }
+ return Integer.parseInt(matcher.group("crossCompactionCnt"));
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileNameGenerator.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileNameGenerator.java
index 946d827461..4374291beb 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileNameGenerator.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileNameGenerator.java
@@ -19,26 +19,18 @@
package org.apache.iotdb.db.engine.storagegroup;
-import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.db.conf.directories.DirectoryManager;
import org.apache.iotdb.db.exception.DiskSpaceInsufficientException;
-import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
import org.apache.iotdb.tsfile.fileSystem.fsFactory.FSFactory;
import java.io.File;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import static org.apache.iotdb.commons.conf.IoTDBConstant.FILE_NAME_SEPARATOR;
-import static
org.apache.iotdb.tsfile.common.constant.TsFileConstant.TSFILE_SUFFIX;
public class TsFileNameGenerator {
- private static FSFactory fsFactory = FSFactoryProducer.getFSFactory();
+ private static final FSFactory fsFactory = FSFactoryProducer.getFSFactory();
public static String generateNewTsFilePath(
String tsFileDir,
@@ -48,7 +40,7 @@ public class TsFileNameGenerator {
int crossSpaceCompactionCount) {
return tsFileDir
+ File.separator
- + generateNewTsFileName(
+ + TsFileName.getTsFileName(
time, version, innerSpaceCompactionCount,
crossSpaceCompactionCount);
}
@@ -67,7 +59,7 @@ public class TsFileNameGenerator {
fsFactory.getFile(tsFileDir).mkdirs();
return tsFileDir
+ File.separator
- + generateNewTsFileName(
+ + TsFileName.getTsFileName(
time, version, innerSpaceCompactionCount,
crossSpaceCompactionCount);
}
@@ -91,71 +83,20 @@ public class TsFileNameGenerator {
+ timePartitionId;
}
- public static String generateNewTsFileName(
- long time, long version, int innerSpaceCompactionCount, int
crossSpaceCompactionCount) {
- return time
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + version
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + innerSpaceCompactionCount
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + crossSpaceCompactionCount
- + TsFileConstant.TSFILE_SUFFIX;
- }
-
- public static TsFileName getTsFileName(String fileName) throws IOException {
- Matcher matcher = TsFileName.FILE_NAME_MATCHER.matcher(fileName);
- if (matcher.find()) {
- try {
- TsFileName tsFileName =
- new TsFileName(
- Long.parseLong(matcher.group(1)),
- Long.parseLong(matcher.group(2)),
- Integer.parseInt(matcher.group(3)),
- Integer.parseInt(matcher.group(4)));
- return tsFileName;
- } catch (NumberFormatException e) {
- throw new IOException("tsfile file name format is incorrect:" +
fileName);
- }
- } else {
- throw new IOException("tsfile file name format is incorrect:" +
fileName);
- }
- }
-
- public static TsFileResource increaseCrossCompactionCnt(TsFileResource
tsFileResource)
- throws IOException {
+ public static TsFileResource increaseCrossCompactionCnt(TsFileResource
tsFileResource) {
File tsFile = tsFileResource.getTsFile();
String path = tsFile.getParent();
- TsFileName tsFileName =
getTsFileName(tsFileResource.getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(tsFileResource.getTsFile().getName());
tsFileName.setCrossCompactionCnt(tsFileName.getCrossCompactionCnt() + 1);
- tsFileResource.setFile(
- new File(
- path,
- tsFileName.time
- + FILE_NAME_SEPARATOR
- + tsFileName.version
- + FILE_NAME_SEPARATOR
- + tsFileName.innerCompactionCnt
- + FILE_NAME_SEPARATOR
- + tsFileName.crossCompactionCnt
- + TSFILE_SUFFIX));
+ tsFileResource.setFile(new File(path, tsFileName.toFileName()));
return tsFileResource;
}
- public static File increaseCrossCompactionCnt(File tsFile) throws
IOException {
+ public static File increaseCrossCompactionCnt(File tsFile) {
String path = tsFile.getParent();
- TsFileName tsFileName = getTsFileName(tsFile.getName());
+ TsFileName tsFileName = TsFileName.parse(tsFile.getName());
tsFileName.setCrossCompactionCnt(tsFileName.getCrossCompactionCnt() + 1);
- return new File(
- path,
- tsFileName.time
- + FILE_NAME_SEPARATOR
- + tsFileName.version
- + FILE_NAME_SEPARATOR
- + tsFileName.innerCompactionCnt
- + FILE_NAME_SEPARATOR
- + tsFileName.crossCompactionCnt
- + TSFILE_SUFFIX);
+ return new File(path, tsFileName.toFileName());
}
/**
@@ -164,26 +105,22 @@ public class TsFileNameGenerator {
*
* @param seqResources
* @return tmp target file list, which is xxx.cross
- * @throws IOException
*/
public static List<TsFileResource> getCrossCompactionTargetFileResources(
- List<TsFileResource> seqResources) throws IOException {
+ List<TsFileResource> seqResources) {
List<TsFileResource> targetFileResources = new ArrayList<>();
for (TsFileResource resource : seqResources) {
- TsFileName tsFileName = getTsFileName(resource.getTsFile().getName());
+ TsFileName tsFileName = TsFileName.parse(resource.getTsFile().getName());
tsFileName.setCrossCompactionCnt(tsFileName.getCrossCompactionCnt() + 1);
targetFileResources.add(
new TsFileResource(
new File(
resource.getTsFile().getParent(),
- tsFileName.time
- + FILE_NAME_SEPARATOR
- + tsFileName.version
- + FILE_NAME_SEPARATOR
- + tsFileName.innerCompactionCnt
- + FILE_NAME_SEPARATOR
- + tsFileName.crossCompactionCnt
- + IoTDBConstant.CROSS_COMPACTION_TMP_FILE_SUFFIX)));
+ TsFileName.getCrossTsFileName(
+ tsFileName.getTime(),
+ tsFileName.getVersion(),
+ tsFileName.getInnerCompactionCnt(),
+ tsFileName.getCrossCompactionCnt()))));
}
return targetFileResources;
}
@@ -195,96 +132,34 @@ public class TsFileNameGenerator {
* @param tsFileResources
* @param sequence
* @return tmp target file, which is xxx.target
- * @throws IOException
*/
public static TsFileResource getInnerCompactionTargetFileResource(
- List<TsFileResource> tsFileResources, boolean sequence) throws
IOException {
+ List<TsFileResource> tsFileResources, boolean sequence) {
long minTime = Long.MAX_VALUE;
long maxTime = Long.MIN_VALUE;
long minVersion = Long.MAX_VALUE;
long maxVersion = Long.MIN_VALUE;
- long maxInnerMergeCount = Long.MIN_VALUE;
- long maxCrossMergeCount = Long.MIN_VALUE;
+ int maxInnerMergeCount = Integer.MIN_VALUE;
+ int maxCrossMergeCount = Integer.MIN_VALUE;
for (TsFileResource resource : tsFileResources) {
- TsFileName tsFileName = getTsFileName(resource.getTsFile().getName());
- minTime = Math.min(tsFileName.time, minTime);
- maxTime = Math.max(tsFileName.time, maxTime);
- minVersion = Math.min(tsFileName.version, minVersion);
- maxVersion = Math.max(tsFileName.version, maxVersion);
- maxInnerMergeCount = Math.max(tsFileName.innerCompactionCnt,
maxInnerMergeCount);
- maxCrossMergeCount = Math.max(tsFileName.crossCompactionCnt,
maxCrossMergeCount);
+ TsFileName tsFileName = TsFileName.parse(resource.getTsFile().getName());
+ minTime = Math.min(tsFileName.getTime(), minTime);
+ maxTime = Math.max(tsFileName.getTime(), maxTime);
+ minVersion = Math.min(tsFileName.getVersion(), minVersion);
+ maxVersion = Math.max(tsFileName.getVersion(), maxVersion);
+ maxInnerMergeCount = Math.max(tsFileName.getInnerCompactionCnt(),
maxInnerMergeCount);
+ maxCrossMergeCount = Math.max(tsFileName.getCrossCompactionCnt(),
maxCrossMergeCount);
}
return sequence
? new TsFileResource(
new File(
tsFileResources.get(0).getTsFile().getParent(),
- minTime
- + FILE_NAME_SEPARATOR
- + minVersion
- + FILE_NAME_SEPARATOR
- + (maxInnerMergeCount + 1)
- + FILE_NAME_SEPARATOR
- + maxCrossMergeCount
- + IoTDBConstant.INNER_COMPACTION_TMP_FILE_SUFFIX))
+ TsFileName.getInnerTsFileName(
+ minTime, minVersion, (maxInnerMergeCount + 1),
maxCrossMergeCount)))
: new TsFileResource(
new File(
tsFileResources.get(0).getTsFile().getParent(),
- maxTime
- + FILE_NAME_SEPARATOR
- + maxVersion
- + FILE_NAME_SEPARATOR
- + (maxInnerMergeCount + 1)
- + FILE_NAME_SEPARATOR
- + maxCrossMergeCount
- + IoTDBConstant.INNER_COMPACTION_TMP_FILE_SUFFIX));
- }
-
- public static class TsFileName {
- private static final String FILE_NAME_PATTERN =
"(\\d+)-(\\d+)-(\\d+)-(\\d+).tsfile$";
- private static final Pattern FILE_NAME_MATCHER =
Pattern.compile(TsFileName.FILE_NAME_PATTERN);
-
- private long time;
- private long version;
- private int innerCompactionCnt;
- private int crossCompactionCnt;
-
- public TsFileName(long time, long version, int innerCompactionCnt, int
crossCompactionCnt) {
- this.time = time;
- this.version = version;
- this.innerCompactionCnt = innerCompactionCnt;
- this.crossCompactionCnt = crossCompactionCnt;
- }
-
- public long getTime() {
- return time;
- }
-
- public long getVersion() {
- return version;
- }
-
- public int getInnerCompactionCnt() {
- return innerCompactionCnt;
- }
-
- public int getCrossCompactionCnt() {
- return crossCompactionCnt;
- }
-
- public void setTime(long time) {
- this.time = time;
- }
-
- public void setVersion(long version) {
- this.version = version;
- }
-
- public void setInnerCompactionCnt(int innerCompactionCnt) {
- this.innerCompactionCnt = innerCompactionCnt;
- }
-
- public void setCrossCompactionCnt(int crossCompactionCnt) {
- this.crossCompactionCnt = crossCompactionCnt;
- }
+ TsFileName.getInnerTsFileName(
+ maxTime, maxVersion, (maxInnerMergeCount + 1),
maxCrossMergeCount)));
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
index 1a5cc07f3d..57ec1458c6 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
@@ -26,7 +26,6 @@ import
org.apache.iotdb.db.engine.modification.ModificationFile;
import org.apache.iotdb.db.engine.querycontext.ReadOnlyMemChunk;
import org.apache.iotdb.db.engine.storagegroup.DataRegion.SettleTsFileCallBack;
import
org.apache.iotdb.db.engine.storagegroup.DataRegion.UpgradeTsFileResourceCallBack;
-import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator.TsFileName;
import org.apache.iotdb.db.engine.storagegroup.timeindex.DeviceTimeIndex;
import org.apache.iotdb.db.engine.storagegroup.timeindex.FileTimeIndex;
import org.apache.iotdb.db.engine.storagegroup.timeindex.ITimeIndex;
@@ -42,7 +41,6 @@ import
org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata;
import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
import org.apache.iotdb.tsfile.fileSystem.fsFactory.FSFactory;
import org.apache.iotdb.tsfile.read.filter.basic.Filter;
-import org.apache.iotdb.tsfile.utils.FilePathUtils;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import org.slf4j.Logger;
@@ -63,10 +61,6 @@ import java.util.Objects;
import java.util.Random;
import java.util.Set;
-import static org.apache.iotdb.commons.conf.IoTDBConstant.FILE_NAME_SEPARATOR;
-import static
org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator.getTsFileName;
-import static
org.apache.iotdb.tsfile.common.constant.TsFileConstant.TSFILE_SUFFIX;
-
@SuppressWarnings("java:S1135") // ignore todos
public class TsFileResource {
@@ -127,6 +121,8 @@ public class TsFileResource {
/** Minimum index of plans executed within this TsFile. */
protected long minPlanIndex = Long.MAX_VALUE;
+ private long createdTime = 0;
+
private long version = 0;
private long ramSize;
@@ -158,6 +154,9 @@ public class TsFileResource {
public TsFileResource(TsFileResource other) throws IOException {
this.file = other.file;
+ TsFileName tsFileName = TsFileName.parse(this.file.getName());
+ this.createdTime = tsFileName.getTime();
+ this.version = tsFileName.getVersion();
this.processor = other.processor;
this.timeIndex = other.timeIndex;
this.timeIndexType = other.timeIndexType;
@@ -170,14 +169,15 @@ public class TsFileResource {
this.fsFactory = other.fsFactory;
this.maxPlanIndex = other.maxPlanIndex;
this.minPlanIndex = other.minPlanIndex;
- this.version = FilePathUtils.splitAndGetTsFileVersion(this.file.getName());
this.tsFileSize = other.tsFileSize;
}
/** for sealed TsFile, call setClosed to close TsFileResource */
public TsFileResource(File file) {
this.file = file;
- this.version = FilePathUtils.splitAndGetTsFileVersion(this.file.getName());
+ TsFileName tsFileName = TsFileName.parse(this.file.getName());
+ this.createdTime = tsFileName.getTime();
+ this.version = tsFileName.getVersion();
this.timeIndex = CONFIG.getTimeIndexLevel().getTimeIndex();
this.timeIndexType = (byte) CONFIG.getTimeIndexLevel().ordinal();
}
@@ -185,7 +185,9 @@ public class TsFileResource {
/** unsealed TsFile, for writter */
public TsFileResource(File file, TsFileProcessor processor) {
this.file = file;
- this.version = FilePathUtils.splitAndGetTsFileVersion(this.file.getName());
+ TsFileName tsFileName = TsFileName.parse(this.file.getName());
+ this.createdTime = tsFileName.getTime();
+ this.version = tsFileName.getVersion();
this.timeIndex = CONFIG.getTimeIndexLevel().getTimeIndex();
this.timeIndexType = (byte) CONFIG.getTimeIndexLevel().ordinal();
this.processor = processor;
@@ -199,12 +201,14 @@ public class TsFileResource {
TsFileResource originTsFileResource)
throws IOException {
this.file = originTsFileResource.file;
+ TsFileName tsFileName = TsFileName.parse(this.file.getName());
+ this.createdTime = tsFileName.getTime();
+ this.version = tsFileName.getVersion();
this.timeIndex = originTsFileResource.timeIndex;
this.timeIndexType = originTsFileResource.timeIndexType;
this.pathToReadOnlyMemChunkMap.put(path, readOnlyMemChunk);
this.pathToChunkMetadataListMap.put(path, chunkMetadataList);
this.originTsFileResource = originTsFileResource;
- this.version = originTsFileResource.version;
}
/** unsealed TsFile, for query */
@@ -214,21 +218,15 @@ public class TsFileResource {
TsFileResource originTsFileResource)
throws IOException {
this.file = originTsFileResource.file;
+ TsFileName tsFileName = TsFileName.parse(this.file.getName());
+ this.createdTime = tsFileName.getTime();
+ this.version = tsFileName.getVersion();
this.timeIndex = originTsFileResource.timeIndex;
this.timeIndexType = originTsFileResource.timeIndexType;
this.pathToReadOnlyMemChunkMap = pathToReadOnlyMemChunkMap;
this.pathToChunkMetadataListMap = pathToChunkMetadataListMap;
generatePathToTimeSeriesMetadataMap();
this.originTsFileResource = originTsFileResource;
- this.version = originTsFileResource.version;
- }
-
- @TestOnly
- public TsFileResource(
- File file, Map<String, Integer> deviceToIndex, long[] startTimes, long[]
endTimes) {
- this.file = file;
- this.timeIndex = new DeviceTimeIndex(deviceToIndex, startTimes, endTimes);
- this.timeIndexType = 1;
}
public synchronized void serialize() throws IOException {
@@ -537,10 +535,15 @@ public class TsFileResource {
}
void moveTo(File targetDir) {
+ // .tsfile file
fsFactory.moveFile(file, fsFactory.getFile(targetDir, file.getName()));
- fsFactory.moveFile(
- fsFactory.getFile(file.getPath() + RESOURCE_SUFFIX),
- fsFactory.getFile(targetDir, file.getName() + RESOURCE_SUFFIX));
+ // .resource file
+ File originResourceFile = fsFactory.getFile(file.getPath() +
RESOURCE_SUFFIX);
+ if (originResourceFile.exists()) {
+ fsFactory.moveFile(
+ originResourceFile, fsFactory.getFile(targetDir, file.getName() +
RESOURCE_SUFFIX));
+ }
+ // .mods file
File originModFile = fsFactory.getFile(file.getPath() +
ModificationFile.FILE_SUFFIX);
if (originModFile.exists()) {
fsFactory.moveFile(
@@ -549,6 +552,26 @@ public class TsFileResource {
}
}
+ void renameTo(String targetFileName) {
+ File dir = file.getParentFile();
+ // .tsfile file
+ File targetFile = fsFactory.getFile(dir, targetFileName);
+ fsFactory.renameTo(file, targetFile);
+ // .resource file
+ File originResourceFile = fsFactory.getFile(file.getPath() +
RESOURCE_SUFFIX);
+ if (originResourceFile.exists()) {
+ fsFactory.renameTo(
+ originResourceFile, fsFactory.getFile(dir, targetFileName +
RESOURCE_SUFFIX));
+ }
+ // .mods file
+ File originModFile = fsFactory.getFile(file.getPath() +
ModificationFile.FILE_SUFFIX);
+ if (originModFile.exists()) {
+ fsFactory.renameTo(
+ originModFile, fsFactory.getFile(dir, targetFileName +
ModificationFile.FILE_SUFFIX));
+ }
+ file = targetFile;
+ }
+
@Override
public String toString() {
return String.format("file is %s, status: ", file.toString(), status);
@@ -892,11 +915,6 @@ public class TsFileResource {
}
}
- public static int getInnerCompactionCount(String fileName) throws
IOException {
- TsFileName tsFileName = getTsFileName(fileName);
- return tsFileName.getInnerCompactionCnt();
- }
-
/** For merge, the index range of the new file should be the union of all
files' in this merge. */
public void updatePlanIndexes(TsFileResource another) {
maxPlanIndex = Math.max(maxPlanIndex, another.maxPlanIndex);
@@ -919,40 +937,28 @@ public class TsFileResource {
this.minPlanIndex = minPlanIndex;
}
+ public int compareTsFileName(TsFileResource other) {
+ return TsFileName.compareFileName(this, other);
+ }
+
+ /** This method will rename file name of this tsfile */
public void setVersion(long version) {
+ TsFileName tsFileName = TsFileName.parse(file.getName());
this.version = version;
+ tsFileName.setVersion(version);
+ renameTo(tsFileName.toFileName());
}
public long getVersion() {
return version;
}
- public void setTimeIndex(ITimeIndex timeIndex) {
- this.timeIndex = timeIndex;
+ public long getCreatedTime() {
+ return createdTime;
}
- // ({systemTime}-{versionNum}-{innerMergeNum}-{crossMergeNum}.tsfile)
- public static int compareFileName(TsFileResource o1, TsFileResource o2) {
- String[] items1 =
- o1.getTsFile().getName().replace(TSFILE_SUFFIX,
"").split(FILE_NAME_SEPARATOR);
- String[] items2 =
- o2.getTsFile().getName().replace(TSFILE_SUFFIX,
"").split(FILE_NAME_SEPARATOR);
- long ver1 = Long.parseLong(items1[0]);
- long ver2 = Long.parseLong(items2[0]);
- int cmp = Long.compare(ver1, ver2);
- if (cmp == 0) {
- int cmpVersion = Long.compare(Long.parseLong(items1[1]),
Long.parseLong(items2[1]));
- if (cmpVersion == 0) {
- int cmpInnerCompact = Long.compare(Long.parseLong(items1[2]),
Long.parseLong(items2[2]));
- if (cmpInnerCompact == 0) {
- return Long.compare(Long.parseLong(items1[3]),
Long.parseLong(items2[3]));
- }
- return cmpInnerCompact;
- }
- return cmpVersion;
- } else {
- return cmp;
- }
+ public void setTimeIndex(ITimeIndex timeIndex) {
+ this.timeIndex = timeIndex;
}
public void setSeq(boolean seq) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceList.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceList.java
index 091d8f180e..6a57608257 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceList.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceList.java
@@ -25,19 +25,16 @@ import
org.apache.iotdb.tsfile.exception.NotImplementedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TsFileResourceList implements List<TsFileResource> {
private static final Logger LOGGER =
LoggerFactory.getLogger(TsFileResourceList.class);
private TsFileResource header;
private TsFileResource tail;
- private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private int count = 0;
/**
@@ -137,7 +134,7 @@ public class TsFileResourceList implements
List<TsFileResource> {
* timestamp is greater than its. If there is no tsfile whose timestamp is
greater than the new
* node's, the new node will be inserted to the tail of the list.
*/
- public boolean keepOrderInsert(TsFileResource newNode) throws IOException {
+ public boolean keepOrderInsert(TsFileResource newNode) {
if (newNode.prev != null || newNode.next != null || (count == 1 && header
== newNode)) {
// this node already in a list
return false;
@@ -149,16 +146,13 @@ public class TsFileResourceList implements
List<TsFileResource> {
} else {
// find the position to insert of this node
// the list should be ordered by file timestamp
- long timeOfNewNode =
-
TsFileNameGenerator.getTsFileName(newNode.getTsFile().getName()).getTime();
+ long timeOfNewNode = newNode.getCreatedTime();
- if
(TsFileNameGenerator.getTsFileName(header.getTsFile().getName()).getTime()
- > timeOfNewNode) {
+ if (header.getCreatedTime() > timeOfNewNode) {
// the timestamp of head node is greater than the new node
// insert it before the head
insertBefore(header, newNode);
- } else if
(TsFileNameGenerator.getTsFileName(tail.getTsFile().getName()).getTime()
- < timeOfNewNode) {
+ } else if (tail.getCreatedTime() < timeOfNewNode) {
// the timestamp of new node is greater than the tail node
// insert it after the tail
insertAfter(tail, newNode);
@@ -168,14 +162,12 @@ public class TsFileResourceList implements
List<TsFileResource> {
// and insert the new node before this node
TsFileResource currNode = header;
while (currNode.next != null) {
- if
(TsFileNameGenerator.getTsFileName(currNode.getTsFile().getName()).getTime()
- > timeOfNewNode) {
+ if (currNode.compareTsFileName(newNode) > 0) {
break;
}
currNode = currNode.next;
}
- if
(TsFileNameGenerator.getTsFileName(currNode.getTsFile().getName()).getTime()
- < timeOfNewNode) {
+ if (currNode.compareTsFileName(newNode) < 0) {
LOGGER.error("Cannot find an appropriate place to insert {}",
newNode);
} else {
insertBefore(currNode, newNode);
@@ -369,6 +361,20 @@ public class TsFileResourceList implements
List<TsFileResource> {
return list;
}
+ public List<TsFileResource> getFilesByTime(long targetTime) {
+ List<TsFileResource> list = new ArrayList<>();
+ TsFileResource current = header;
+ while (current != null) {
+ if (current.getCreatedTime() == targetTime) {
+ list.add(current);
+ } else if (!list.isEmpty()) {
+ break;
+ }
+ current = current.next;
+ }
+ return list;
+ }
+
private class TsFileIterator implements Iterator<TsFileResource> {
List<TsFileResource> tsFileResourceList;
int currentIndex = 0;
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/dataregion/StorageGroupManager.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/dataregion/StorageGroupManager.java
index aa7f8c2c26..fb00ff401b 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/dataregion/StorageGroupManager.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/dataregion/StorageGroupManager.java
@@ -413,15 +413,6 @@ public class StorageGroupManager {
}
}
- /** push setPartitionVersionToMax operation down to all virtual storage
group processors */
- public void setPartitionVersionToMax(long partitionId, long newMaxVersion) {
- for (DataRegion dataRegion : this.dataRegion) {
- if (dataRegion != null) {
- dataRegion.setPartitionFileVersionToMax(partitionId, newMaxVersion);
- }
- }
- }
-
/** push removePartitions operation down to all virtual storage group
processors */
public void removePartitions(TimePartitionFilter filter) {
for (DataRegion dataRegion : this.dataRegion) {
diff --git
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCompactionFileSelectorTest.java
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCompactionFileSelectorTest.java
index 42ea9adacc..b550b32a8b 100644
---
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCompactionFileSelectorTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCompactionFileSelectorTest.java
@@ -19,12 +19,12 @@
package org.apache.iotdb.db.engine.compaction.cross;
-import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.constant.TestConstant;
import
org.apache.iotdb.db.engine.compaction.cross.rewrite.CrossSpaceCompactionResource;
import
org.apache.iotdb.db.engine.compaction.cross.rewrite.selector.ICrossSpaceMergeFileSelector;
import
org.apache.iotdb.db.engine.compaction.cross.rewrite.selector.RewriteCompactionFileSelector;
+import org.apache.iotdb.db.engine.storagegroup.TsFileName;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.engine.storagegroup.TsFileResourceStatus;
import org.apache.iotdb.db.engine.storagegroup.timeindex.ITimeIndex;
@@ -58,7 +58,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
LoggerFactory.getLogger(RewriteCompactionFileSelectorTest.class);
@Test
- public void testFullSelection() throws MergeException, IOException {
+ public void testFullSelection() throws MergeException {
CrossSpaceCompactionResource resource =
new CrossSpaceCompactionResource(seqResources, unseqResources);
ICrossSpaceMergeFileSelector mergeFileSelector =
@@ -87,7 +87,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
}
@Test
- public void testWithFewMemoryBudgeSelection() throws MergeException,
IOException {
+ public void testWithFewMemoryBudgeSelection() throws MergeException {
CrossSpaceCompactionResource resource =
new CrossSpaceCompactionResource(seqResources, unseqResources);
ICrossSpaceMergeFileSelector mergeFileSelector = new
RewriteCompactionFileSelector(resource, 1);
@@ -96,7 +96,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
}
@Test
- public void testRestrictedSelection() throws MergeException, IOException {
+ public void testRestrictedSelection() throws MergeException {
CrossSpaceCompactionResource resource =
new CrossSpaceCompactionResource(seqResources, unseqResources);
ICrossSpaceMergeFileSelector mergeFileSelector =
@@ -109,9 +109,9 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
}
/**
- * test unseq merge select with the following files: {0seq-0-0-0.tsfile
0-100 1seq-1-1-0.tsfile
- * 100-200 2seq-2-2-0.tsfile 200-300 3seq-3-3-0.tsfile 300-400
4seq-4-4-0.tsfile 400-500}
- * {10unseq-10-10-0.tsfile 0-500}
+ * test unseq merge select with the following files: {seq/0-0-0-0.tsfile
0-100 seq/1-1-1-0.tsfile
+ * 100-200 seq/2-2-2-0.tsfile 200-300 seq/3-3-3-0.tsfile 300-400
seq/4-4-4-0.tsfile 400-500}
+ * {unseq/10-10-10-0.tsfile 0-500}
*/
@Test
public void testFileOpenSelection()
@@ -119,16 +119,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
IllegalAccessException {
File file =
new File(
- TestConstant.BASE_OUTPUT_PATH.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
TsFileName.getTsFileName(10, 10, 10, 0));
TsFileResource largeUnseqTsFileResource = new TsFileResource(file);
unseqResources.add(largeUnseqTsFileResource);
largeUnseqTsFileResource.setStatus(TsFileResourceStatus.CLOSED);
@@ -163,25 +154,16 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
}
/**
- * test unseq merge select with the following files: {0seq-0-0-0.tsfile
0-100 1seq-1-1-0.tsfile
- * 100-200 2seq-2-2-0.tsfile 200-300 3seq-3-3-0.tsfile 300-400
4seq-4-4-0.tsfile 400-500}
- * {10unseq-10-10-0.tsfile 0-500}
+ * test unseq merge select with the following files: {seq/0-0-0-0.tsfile
0-100 seq/1-1-1-0.tsfile
+ * 100-200 seq/2-2-2-0.tsfile 200-300 seq/3-3-3-0.tsfile 300-400
seq/4-4-4-0.tsfile 400-500}
+ * {unseq/10-10-10-0.tsfile 0-500}
*/
@Test
public void testFileOpenSelectionFromCompaction()
throws IOException, WriteProcessException, NoSuchFieldException,
IllegalAccessException {
File file =
new File(
- TestConstant.BASE_OUTPUT_PATH.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
TsFileName.getTsFileName(10, 10, 10, 0));
TsFileResource largeUnseqTsFileResource = new TsFileResource(file);
unseqResources.add(largeUnseqTsFileResource);
largeUnseqTsFileResource.setStatus(TsFileResourceStatus.CLOSED);
@@ -215,25 +197,16 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
}
/**
- * test unseq merge select with the following files: {0seq-0-0-0.tsfile
0-100 1seq-1-1-0.tsfile
- * 100-200 2seq-2-2-0.tsfile 200-300 3seq-3-3-0.tsfile 300-400
4seq-4-4-0.tsfile 400-500}
- * {10unseq-10-10-0.tsfile 0-101}
+ * test unseq merge select with the following files: {seq/0-0-0-0.tsfile
0-100 seq/1-1-1-0.tsfile
+ * 100-200 seq/2-2-2-0.tsfile 200-300 seq/3-3-3-0.tsfile 300-400
seq/4-4-4-0.tsfile 400-500}
+ * {unseq/10-10-10-0.tsfile 0-101}
*/
@Test
public void testFileSelectionAboutLastSeqFile()
throws MergeException, IOException, WriteProcessException {
File file =
new File(
- TestConstant.BASE_OUTPUT_PATH.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
TsFileName.getTsFileName(10, 10, 10, 0));
TsFileResource largeUnseqTsFileResource = new TsFileResource(file);
largeUnseqTsFileResource.setStatus(TsFileResourceStatus.CLOSED);
largeUnseqTsFileResource.setMinPlanIndex(10);
@@ -263,16 +236,8 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 0; i < seqFileNum; i++) {
File file =
new File(
- TestConstant.BASE_OUTPUT_PATH.concat(
- 10
- + "seq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("seq"),
+ TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
prepareFile(fileResource, i, 1, 0);
@@ -283,16 +248,8 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 0; i < unseqFileNum; i++) {
File file =
new File(
- TestConstant.BASE_OUTPUT_PATH.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
+ TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
unseqList.add(fileResource);
@@ -341,16 +298,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 11; i < seqFileNum + 11; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "seq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("seq"),
TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
prepareFile(fileResource, i, 1, i);
@@ -361,16 +309,8 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 0; i < unseqFileNum; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
+ TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
prepareFile(fileResource, i, 1, i);
@@ -404,16 +344,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 11; i < seqFileNum + 11; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "seq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("seq"),
TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
prepareFile(fileResource, i, 1, i);
@@ -424,16 +355,8 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 0; i < unseqFileNum; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
+ TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
prepareFile(fileResource, i, 10, i);
@@ -466,16 +389,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 11; i < seqFileNum + 11; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "seq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("seq"),
TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
prepareFile(fileResource, i, 1, i);
@@ -486,16 +400,8 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 0; i < unseqFileNum; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
+ TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
unseqList.add(fileResource);
@@ -530,16 +436,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 11; i < seqFileNum + 11; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "seq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("seq"),
TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
prepareFile(fileResource, i, 1, i);
@@ -550,16 +447,8 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 0; i < unseqFileNum; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
+ TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
unseqList.add(fileResource);
@@ -597,16 +486,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 11; i < seqFileNum + 11; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "seq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("seq"),
TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
if (i - 11 != 3) {
fileResource.setStatus(TsFileResourceStatus.CLOSED);
@@ -619,16 +499,8 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
for (int i = 0; i < unseqFileNum; i++) {
File file =
new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 10
- + "unseq"
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + i
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 10
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ TestConstant.BASE_OUTPUT_PATH.concat("unseq"),
+ TsFileName.getTsFileName(10, i, 10, 0));
TsFileResource fileResource = new TsFileResource(file);
fileResource.setStatus(TsFileResourceStatus.CLOSED);
unseqList.add(fileResource);
@@ -657,17 +529,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
// first file [0, 10]
// first device [0, 5]
// second device [0, 10]
- File firstFile =
- new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 1
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 1
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ File firstFile = new File(TestConstant.OUTPUT_DATA_DIR,
TsFileName.getTsFileName(1, 1, 0, 0));
TsFileResource firstTsFileResource = new TsFileResource(firstFile);
firstTsFileResource.setStatus(TsFileResourceStatus.CLOSED);
firstTsFileResource.setMinPlanIndex(1);
@@ -710,17 +572,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
// second file time range: [11, 20]
// first measurement: [11, 20]
// second measurement: [11, 20]
- File secondFile =
- new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 2
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 2
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ File secondFile = new File(TestConstant.OUTPUT_DATA_DIR,
TsFileName.getTsFileName(2, 2, 0, 0));
TsFileResource secondTsFileResource = new TsFileResource(secondFile);
secondTsFileResource.setStatus(TsFileResourceStatus.CLOSED);
secondTsFileResource.setMinPlanIndex(2);
@@ -756,17 +608,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
fileWriter.close();
// unseq file: [0, 1]
- File thirdFile =
- new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 3
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 3
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ File thirdFile = new File(TestConstant.OUTPUT_DATA_DIR,
TsFileName.getTsFileName(3, 3, 0, 0));
TsFileResource thirdTsFileResource = new TsFileResource(thirdFile);
thirdTsFileResource.setStatus(TsFileResourceStatus.CLOSED);
thirdTsFileResource.setMinPlanIndex(3);
@@ -802,17 +644,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
fileWriter.close();
// unseq file: [6, 14]
- File fourthFile =
- new File(
- TestConstant.OUTPUT_DATA_DIR.concat(
- 4
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 4
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + IoTDBConstant.FILE_NAME_SEPARATOR
- + 0
- + ".tsfile"));
+ File fourthFile = new File(TestConstant.OUTPUT_DATA_DIR,
TsFileName.getTsFileName(4, 4, 0, 0));
TsFileResource fourthTsFileResource = new TsFileResource(fourthFile);
fourthTsFileResource.setStatus(TsFileResourceStatus.CLOSED);
fourthTsFileResource.setMinPlanIndex(4);
@@ -871,7 +703,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
}
@Test
- public void testMaxFileSelection() throws MergeException, IOException {
+ public void testMaxFileSelection() throws MergeException {
int oldMaxCrossCompactionCandidateFileNum =
IoTDBDescriptor.getInstance().getConfig().getMaxCrossCompactionCandidateFileNum();
IoTDBDescriptor.getInstance().getConfig().setMaxCrossCompactionCandidateFileNum(5);
@@ -892,7 +724,7 @@ public class RewriteCompactionFileSelectorTest extends
MergeTest {
}
@Test
- public void testAtLeastOneUnseqFileBeenSelected() throws IOException,
MergeException {
+ public void testAtLeastOneUnseqFileBeenSelected() throws MergeException {
int maxCrossFilesNum =
IoTDBDescriptor.getInstance().getConfig().getMaxCrossCompactionCandidateFileNum();
IoTDBDescriptor.getInstance().getConfig().setMaxCrossCompactionCandidateFileNum(1);
diff --git
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/ReadChunkCompactionPerformerNoAlignedTest.java
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/ReadChunkCompactionPerformerNoAlignedTest.java
index a88a6e57d5..8122587ea7 100644
---
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/ReadChunkCompactionPerformerNoAlignedTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/ReadChunkCompactionPerformerNoAlignedTest.java
@@ -29,7 +29,7 @@ import
org.apache.iotdb.db.engine.compaction.performer.impl.ReadChunkCompactionP
import org.apache.iotdb.db.engine.compaction.utils.CompactionCheckerUtils;
import org.apache.iotdb.db.engine.compaction.utils.CompactionConfigRestorer;
import
org.apache.iotdb.db.engine.compaction.utils.CompactionFileGeneratorUtils;
-import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
+import org.apache.iotdb.db.engine.storagegroup.TsFileName;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.metadata.path.MeasurementPath;
import org.apache.iotdb.db.service.IoTDB;
@@ -189,8 +189,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
}
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
@@ -279,8 +278,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
@@ -371,8 +369,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
@@ -450,8 +447,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
}
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
@@ -559,8 +555,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
@@ -638,8 +633,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
}
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
@@ -720,8 +714,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
}
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
@@ -796,8 +789,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
@@ -874,8 +866,7 @@ public class ReadChunkCompactionPerformerNoAlignedTest {
Map<PartialPath, List<TimeValuePair>> originData =
CompactionCheckerUtils.getDataByQuery(paths, schemaList,
sourceFiles, new ArrayList<>());
- TsFileNameGenerator.TsFileName tsFileName =
-
TsFileNameGenerator.getTsFileName(sourceFiles.get(0).getTsFile().getName());
+ TsFileName tsFileName =
TsFileName.parse(sourceFiles.get(0).getTsFile().getName());
TsFileResource targetResource =
new TsFileResource(
new File(
diff --git
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/CompactionFileGeneratorUtils.java
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/CompactionFileGeneratorUtils.java
index ad23d081d2..af4e094db1 100644
---
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/CompactionFileGeneratorUtils.java
+++
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/CompactionFileGeneratorUtils.java
@@ -25,8 +25,8 @@ import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.constant.TestConstant;
import org.apache.iotdb.db.engine.modification.Deletion;
import org.apache.iotdb.db.engine.modification.ModificationFile;
+import org.apache.iotdb.db.engine.storagegroup.TsFileName;
import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
-import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator.TsFileName;
import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -47,8 +47,8 @@ import java.util.Set;
public class CompactionFileGeneratorUtils {
public static TsFileResource getTargetTsFileResourceFromSourceResource(
- TsFileResource sourceResource) throws IOException {
- TsFileName tsFileName =
TsFileNameGenerator.getTsFileName(sourceResource.getTsFile().getName());
+ TsFileResource sourceResource) {
+ TsFileName tsFileName =
TsFileName.parse(sourceResource.getTsFile().getName());
return new TsFileResource(
new File(
TestConstant.BASE_OUTPUT_PATH.concat(
diff --git
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileManagerTest.java
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileManagerTest.java
index b7971c5174..eb3fd88de2 100644
---
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileManagerTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileManagerTest.java
@@ -44,42 +44,54 @@ public class TsFileManagerTest {
File tempSGDir;
private TsFileManager tsFileManager;
- private List<TsFileResource> seqResources;
- private List<TsFileResource> unseqResources;
@Before
public void setUp() throws IOException, WriteProcessException,
MetadataException {
- tempSGDir = new File(TestConstant.BASE_OUTPUT_PATH.concat("tempSG"));
+ tempSGDir =
+ new File(
+ TestConstant.BASE_OUTPUT_PATH
+ .concat("tempSG")
+ .concat(File.separator)
+ .concat("0") // vsg
+ .concat(File.separator)
+ .concat("0")); // time partition
tempSGDir.mkdirs();
tsFileManager = new TsFileManager("test", "0",
tempSGDir.getAbsolutePath());
- seqResources = new ArrayList<>();
- for (int i = 0; i < 5; i++) {
- TsFileResource resource = generateTsFileResource(i);
- seqResources.add(resource);
- }
- unseqResources = new ArrayList<>();
- for (int i = 6; i < 10; i++) {
- TsFileResource resource = generateTsFileResource(i);
- unseqResources.add(resource);
- }
}
@After
public void tearDown() throws IOException, StorageEngineException {
- FileUtils.deleteDirectory(tempSGDir);
+ FileUtils.deleteDirectory(new File(TestConstant.BASE_OUTPUT_PATH));
}
private TsFileResource generateTsFileResource(int id) {
+ File file =
+ new
File(TsFileNameGenerator.generateNewTsFilePath(tempSGDir.getPath(), id, id, id,
id));
+ return new TsFileResource(file);
+ }
+
+ private TsFileResource generateTsFileResource(long time, long version)
throws IOException {
File file =
new File(
TsFileNameGenerator.generateNewTsFilePath(
- TestConstant.BASE_OUTPUT_PATH, id, id, id, id));
+ TestConstant.BASE_OUTPUT_PATH, time, version, 0, 0));
+ file.createNewFile();
return new TsFileResource(file);
}
/** just compaction once */
@Test
public void testAddRemoveAndIterator() {
+ List<TsFileResource> seqResources = new ArrayList<>();
+ for (int i = 0; i < 5; i++) {
+ TsFileResource resource = generateTsFileResource(i);
+ seqResources.add(resource);
+ }
+ List<TsFileResource> unseqResources = new ArrayList<>();
+ for (int i = 6; i < 10; i++) {
+ TsFileResource resource = generateTsFileResource(i);
+ unseqResources.add(resource);
+ }
for (TsFileResource tsFileResource : seqResources) {
tsFileManager.add(tsFileResource, true);
}
@@ -174,6 +186,11 @@ public class TsFileManagerTest {
@Test
public void testIteratorRemove() {
+ List<TsFileResource> seqResources = new ArrayList<>();
+ for (int i = 0; i < 5; i++) {
+ TsFileResource resource = generateTsFileResource(i);
+ seqResources.add(resource);
+ }
for (TsFileResource tsFileResource : seqResources) {
tsFileManager.add(tsFileResource, true);
}
@@ -237,4 +254,257 @@ public class TsFileManagerTest {
}
assertEquals(8, count);
}
+
+ /**
+ * seq: [1-0-0-0, 2-0-0-0, 6-0-0-0, 6-2-0-0, 10-0-0-0] unseq: [1-1-0-0,
4-0-0-0, 6-1-0-0, 8-0-0-0,
+ * 9-0-0-0] add 2 files with time=6 after seq/6-0-0-0
+ */
+ @Test
+ public void testKeepOrderAddAllAndRenameAfter01() throws IOException {
+ List<TsFileResource> seqResources = new ArrayList<>();
+ seqResources.add(generateTsFileResource(1, 0));
+ seqResources.add(generateTsFileResource(2, 0));
+ seqResources.add(generateTsFileResource(6, 0));
+ seqResources.add(generateTsFileResource(6, 2));
+ seqResources.add(generateTsFileResource(10, 0));
+ tsFileManager.addAll(seqResources, true);
+ List<TsFileResource> unseqResources = new ArrayList<>();
+ unseqResources.add(generateTsFileResource(1, 1));
+ unseqResources.add(generateTsFileResource(4, 0));
+ unseqResources.add(generateTsFileResource(6, 1));
+ unseqResources.add(generateTsFileResource(8, 0));
+ unseqResources.add(generateTsFileResource(9, 0));
+ tsFileManager.addAll(unseqResources, false);
+
+ List<TsFileResource> filesToAdd = new ArrayList<>();
+ filesToAdd.add(generateTsFileResource(6, 0));
+ filesToAdd.add(generateTsFileResource(6, 1));
+ tsFileManager.keepOrderAddAllAndRenameAfter(seqResources.get(2),
filesToAdd, true, 0);
+
+ List<TsFileResource> expect = new ArrayList<>();
+ expect.add(seqResources.get(2));
+ expect.addAll(filesToAdd);
+ expect.add(unseqResources.get(2));
+ expect.add(seqResources.get(3));
+ expect.addAll(filesToAdd);
+ List<TsFileResource> result = new ArrayList<>();
+ TsFileResourceList seqList =
tsFileManager.getSequenceListByTimePartition(0);
+ TsFileResourceList unseqList =
tsFileManager.getUnsequenceListByTimePartition(0);
+ result.add(seqList.get(2));
+ result.add(seqList.get(3));
+ result.add(seqList.get(4));
+ result.add(unseqList.get(2));
+ result.add(seqList.get(5));
+ for (int i = 0; i < result.size(); i++) {
+ assertEquals(expect.get(i), result.get(i));
+ assertEquals(6, result.get(i).getCreatedTime());
+ assertEquals(i, result.get(i).getVersion());
+ }
+ }
+
+ /**
+ * seq: [1-0-0-0, 2-0-0-0, 6-0-0-0, 6-2-0-0, 10-0-0-0] unseq: [1-1-0-0,
4-0-0-0, 6-1-0-0, 8-0-0-0,
+ * 9-0-0-0] add 2 files with time=1 before unseq/1-1-0-0
+ */
+ @Test
+ public void testKeepOrderAddAllAndRenameAfter02() throws IOException {
+ List<TsFileResource> seqResources = new ArrayList<>();
+ seqResources.add(generateTsFileResource(1, 0));
+ seqResources.add(generateTsFileResource(2, 0));
+ seqResources.add(generateTsFileResource(6, 0));
+ seqResources.add(generateTsFileResource(6, 2));
+ seqResources.add(generateTsFileResource(10, 0));
+ tsFileManager.addAll(seqResources, true);
+ List<TsFileResource> unseqResources = new ArrayList<>();
+ unseqResources.add(generateTsFileResource(1, 1));
+ unseqResources.add(generateTsFileResource(4, 0));
+ unseqResources.add(generateTsFileResource(6, 1));
+ unseqResources.add(generateTsFileResource(8, 0));
+ unseqResources.add(generateTsFileResource(9, 0));
+ tsFileManager.addAll(unseqResources, false);
+
+ List<TsFileResource> filesToAdd = new ArrayList<>();
+ filesToAdd.add(generateTsFileResource(1, 0));
+ filesToAdd.add(generateTsFileResource(1, 1));
+ tsFileManager.keepOrderAddAllAndRenameAfter(unseqResources.get(0),
filesToAdd, false, 0);
+
+ List<TsFileResource> expect = new ArrayList<>();
+ expect.add(seqResources.get(0));
+ expect.add(unseqResources.get(0));
+ expect.addAll(filesToAdd);
+ List<TsFileResource> result = new ArrayList<>();
+ TsFileResourceList seqList =
tsFileManager.getSequenceListByTimePartition(0);
+ TsFileResourceList unseqList =
tsFileManager.getUnsequenceListByTimePartition(0);
+ result.add(seqList.get(0));
+ result.add(unseqList.get(0));
+ result.add(unseqList.get(1));
+ result.add(unseqList.get(2));
+ for (int i = 0; i < result.size(); i++) {
+ assertEquals(expect.get(i), result.get(i));
+ assertEquals(1, result.get(i).getCreatedTime());
+ assertEquals(i, result.get(i).getVersion());
+ }
+ }
+
+ /**
+ * seq: [1-0-0-0, 2-0-0-0, 6-0-0-0, 6-2-0-0, 10-0-0-0] unseq: [1-1-0-0,
4-0-0-0, 6-1-0-0, 8-0-0-0,
+ * 9-0-0-0] add 2 files with time=10 after seq/10-0-0-0
+ */
+ @Test
+ public void testKeepOrderAddAllAndRenameAfter03() throws IOException {
+ List<TsFileResource> seqResources = new ArrayList<>();
+ seqResources.add(generateTsFileResource(1, 0));
+ seqResources.add(generateTsFileResource(2, 0));
+ seqResources.add(generateTsFileResource(6, 0));
+ seqResources.add(generateTsFileResource(6, 2));
+ seqResources.add(generateTsFileResource(10, 0));
+ tsFileManager.addAll(seqResources, true);
+ List<TsFileResource> unseqResources = new ArrayList<>();
+ unseqResources.add(generateTsFileResource(1, 1));
+ unseqResources.add(generateTsFileResource(4, 0));
+ unseqResources.add(generateTsFileResource(6, 1));
+ unseqResources.add(generateTsFileResource(8, 0));
+ unseqResources.add(generateTsFileResource(9, 0));
+ tsFileManager.addAll(unseqResources, false);
+
+ List<TsFileResource> filesToAdd = new ArrayList<>();
+ filesToAdd.add(generateTsFileResource(10, 0));
+ filesToAdd.add(generateTsFileResource(10, 1));
+ tsFileManager.keepOrderAddAllAndRenameAfter(seqResources.get(4),
filesToAdd, true, 0);
+
+ List<TsFileResource> expect = new ArrayList<>();
+ expect.add(seqResources.get(4));
+ expect.addAll(filesToAdd);
+ List<TsFileResource> result = new ArrayList<>();
+ TsFileResourceList seqList =
tsFileManager.getSequenceListByTimePartition(0);
+ result.add(seqList.get(4));
+ result.add(seqList.get(5));
+ result.add(seqList.get(6));
+ for (int i = 0; i < result.size(); i++) {
+ assertEquals(expect.get(i), result.get(i));
+ assertEquals(10, result.get(i).getCreatedTime());
+ assertEquals(i, result.get(i).getVersion());
+ }
+ }
+
+ /**
+ * seq: [1-0-0-0, 2-0-0-0, 6-0-0-0, 6-1-0-0, 10-0-0-0] unseq: [] add 2 files
with time=6 to unseq
+ */
+ @Test
+ public void testKeepOrderAddAllAndRenameAfter04() throws IOException {
+ List<TsFileResource> seqResources = new ArrayList<>();
+ seqResources.add(generateTsFileResource(1, 0));
+ seqResources.add(generateTsFileResource(2, 0));
+ seqResources.add(generateTsFileResource(6, 0));
+ seqResources.add(generateTsFileResource(6, 1));
+ seqResources.add(generateTsFileResource(10, 0));
+ tsFileManager.addAll(seqResources, true);
+
+ List<TsFileResource> filesToAdd = new ArrayList<>();
+ filesToAdd.add(generateTsFileResource(6, 0));
+ filesToAdd.add(generateTsFileResource(6, 1));
+ tsFileManager.keepOrderAddAllAndRenameAfter(null, filesToAdd, false, 0);
+
+ List<TsFileResource> expect = new ArrayList<>();
+ expect.add(seqResources.get(2));
+ expect.add(seqResources.get(3));
+ expect.addAll(filesToAdd);
+ List<TsFileResource> result = new ArrayList<>();
+ TsFileResourceList seqList =
tsFileManager.getSequenceListByTimePartition(0);
+ TsFileResourceList unseqList =
tsFileManager.getUnsequenceListByTimePartition(0);
+ result.add(seqList.get(2));
+ result.add(seqList.get(3));
+ result.add(unseqList.get(0));
+ result.add(unseqList.get(1));
+ for (int i = 0; i < result.size(); i++) {
+ assertEquals(expect.get(i), result.get(i));
+ assertEquals(6, result.get(i).getCreatedTime());
+ assertEquals(i, result.get(i).getVersion());
+ }
+ }
+
+ /**
+ * seq: [1-0-0-0, 2-0-0-0, 6-0-0-0, 6-2-0-0, 10-0-0-0] unseq: [1-1-0-0,
4-0-0-0, 6-1-0-0, 8-0-0-0,
+ * 9-0-0-0] add 2 files with time=6 after seq/2-0-0-0
+ */
+ @Test
+ public void testKeepOrderAddAllAndRenameAfter05() throws IOException {
+ List<TsFileResource> seqResources = new ArrayList<>();
+ seqResources.add(generateTsFileResource(1, 0));
+ seqResources.add(generateTsFileResource(2, 0));
+ seqResources.add(generateTsFileResource(6, 0));
+ seqResources.add(generateTsFileResource(6, 2));
+ seqResources.add(generateTsFileResource(10, 0));
+ tsFileManager.addAll(seqResources, true);
+ List<TsFileResource> unseqResources = new ArrayList<>();
+ unseqResources.add(generateTsFileResource(1, 1));
+ unseqResources.add(generateTsFileResource(4, 0));
+ unseqResources.add(generateTsFileResource(6, 1));
+ unseqResources.add(generateTsFileResource(8, 0));
+ unseqResources.add(generateTsFileResource(9, 0));
+ tsFileManager.addAll(unseqResources, false);
+
+ List<TsFileResource> filesToAdd = new ArrayList<>();
+ filesToAdd.add(generateTsFileResource(6, 0));
+ filesToAdd.add(generateTsFileResource(6, 1));
+ tsFileManager.keepOrderAddAllAndRenameAfter(seqResources.get(1),
filesToAdd, true, 0);
+
+ List<TsFileResource> expect = new ArrayList<>();
+ expect.addAll(filesToAdd);
+ expect.add(seqResources.get(2));
+ expect.add(unseqResources.get(2));
+ expect.add(seqResources.get(3));
+ List<TsFileResource> result = new ArrayList<>();
+ TsFileResourceList seqList =
tsFileManager.getSequenceListByTimePartition(0);
+ TsFileResourceList unseqList =
tsFileManager.getUnsequenceListByTimePartition(0);
+ result.add(seqList.get(2));
+ result.add(seqList.get(3));
+ result.add(seqList.get(4));
+ result.add(unseqList.get(2));
+ result.add(seqList.get(5));
+ for (int i = 0; i < result.size(); i++) {
+ assertEquals(expect.get(i), result.get(i));
+ assertEquals(6, result.get(i).getCreatedTime());
+ assertEquals(i, result.get(i).getVersion());
+ }
+ }
+
+ /**
+ * seq: [1-0-0-0, 2-0-0-0, 6-0-0-0, 6-2-0-0, 10-0-0-0] unseq: [1-1-0-0,
4-0-0-0, 6-1-0-0, 8-0-0-0,
+ * 9-0-0-0] add 2 files with time=5 after seq/2-0-0-0
+ */
+ @Test
+ public void testKeepOrderAddAllAndRenameAfter06() throws IOException {
+ List<TsFileResource> seqResources = new ArrayList<>();
+ seqResources.add(generateTsFileResource(1, 0));
+ seqResources.add(generateTsFileResource(2, 0));
+ seqResources.add(generateTsFileResource(6, 0));
+ seqResources.add(generateTsFileResource(6, 2));
+ seqResources.add(generateTsFileResource(10, 0));
+ tsFileManager.addAll(seqResources, true);
+ List<TsFileResource> unseqResources = new ArrayList<>();
+ unseqResources.add(generateTsFileResource(1, 1));
+ unseqResources.add(generateTsFileResource(4, 0));
+ unseqResources.add(generateTsFileResource(6, 1));
+ unseqResources.add(generateTsFileResource(8, 0));
+ unseqResources.add(generateTsFileResource(9, 0));
+ tsFileManager.addAll(unseqResources, false);
+
+ List<TsFileResource> filesToAdd = new ArrayList<>();
+ filesToAdd.add(generateTsFileResource(5, 0));
+ filesToAdd.add(generateTsFileResource(5, 1));
+ tsFileManager.keepOrderAddAllAndRenameAfter(seqResources.get(1),
filesToAdd, true, 0);
+
+ List<TsFileResource> expect = new ArrayList<>();
+ expect.addAll(filesToAdd);
+ List<TsFileResource> result = new ArrayList<>();
+ TsFileResourceList seqList =
tsFileManager.getSequenceListByTimePartition(0);
+ result.add(seqList.get(2));
+ result.add(seqList.get(3));
+ for (int i = 0; i < result.size(); i++) {
+ assertEquals(expect.get(i), result.get(i));
+ assertEquals(5, result.get(i).getCreatedTime());
+ assertEquals(i, result.get(i).getVersion());
+ }
+ }
}
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/FSFactory.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/FSFactory.java
index 804e880090..f8ab622854 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/FSFactory.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/FSFactory.java
@@ -112,6 +112,14 @@ public interface FSFactory {
*/
void moveFile(File srcFile, File destFile);
+ /**
+ * rename file
+ *
+ * @param srcFile src file
+ * @param destFile dest file
+ */
+ void renameTo(File srcFile, File destFile);
+
/**
* list file by suffix
*
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/HDFSFactory.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/HDFSFactory.java
index b1197bffa1..c3cafc5946 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/HDFSFactory.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/HDFSFactory.java
@@ -188,6 +188,11 @@ public class HDFSFactory implements FSFactory {
@Override
public void moveFile(File srcFile, File destFile) {
+ renameTo(srcFile, destFile);
+ }
+
+ @Override
+ public void renameTo(File srcFile, File destFile) {
try {
renameTo.invoke(constructorWithPathname.newInstance(srcFile.getAbsolutePath()),
destFile);
} catch (InstantiationException | InvocationTargetException |
IllegalAccessException e) {
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/LocalFSFactory.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/LocalFSFactory.java
index 365ded1b9d..93ae187d92 100644
---
a/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/LocalFSFactory.java
+++
b/tsfile/src/main/java/org/apache/iotdb/tsfile/fileSystem/fsFactory/LocalFSFactory.java
@@ -123,6 +123,17 @@ public class LocalFSFactory implements FSFactory {
}
}
+ @Override
+ public void renameTo(File srcFile, File destFile) {
+ boolean success = srcFile.renameTo(destFile);
+ if (!success) {
+ logger.error(
+ "Failed to rename file from {} to {}. ",
+ srcFile.getAbsolutePath(),
+ destFile.getAbsolutePath());
+ }
+ }
+
@Override
public File[] listFilesBySuffix(String fileFolder, String suffix) {
return new File(fileFolder).listFiles(file ->
file.getName().endsWith(suffix));
diff --git
a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/TsFileUtils.java
b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/TsFileUtils.java
index 03ba354c82..7953cd893b 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/TsFileUtils.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/TsFileUtils.java
@@ -23,6 +23,7 @@ import java.io.File;
import java.io.IOException;
public class TsFileUtils {
+ private TsFileUtils() {}
/**
* decides whether a TsFile is complete (the head magic and tail magic
string exists.)
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/PerfTest.java
b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/PerfTest.java
index 65fa8d6e3a..c70e38ce74 100755
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/PerfTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/PerfTest.java
@@ -114,7 +114,7 @@ public class PerfTest {
}
}
- private static void write() throws IOException, InterruptedException {
+ private static void write() throws IOException {
File file = new File(outputDataFile);
File errorFile = new File(errorOutputDataFile);
if (file.exists()) {
@@ -148,8 +148,7 @@ public class PerfTest {
}
}
- private static void writeToFile(Schema schema)
- throws InterruptedException, IOException, WriteProcessException {
+ private static void writeToFile(Schema schema) throws IOException,
WriteProcessException {
Scanner in = getDataFile(inputDataFile);
assert in != null;
while (in.hasNextLine()) {
@@ -228,7 +227,7 @@ public class PerfTest {
}
@Test
- public void writeTest() throws IOException, InterruptedException,
WriteProcessException {
+ public void writeTest() throws IOException {
write();
}
}