shuwenwei opened a new pull request, #11855:
URL: https://github.com/apache/iotdb/pull/11855
## Description
Fix compaction log is not deleted after exception.
```
protected boolean doCompaction() {
long startTime = System.currentTimeMillis();
// get resource of target file
recoverMemoryStatus = true;
LOGGER.info(
"{}-{} [Compaction] {} InnerSpaceCompaction task starts with {}
files, "
+ "total file size is {} MB, memory cost is {} MB",
storageGroupName,
dataRegionId,
sequence ? "Sequence" : "Unsequence",
selectedTsFileResourceList.size(),
selectedFileSize / 1024 / 1024,
memoryCost == 0 ? 0 : (double) memoryCost / 1024 / 1024);
boolean isSuccess = true;
try {
prepare();
try (SimpleCompactionLogger compactionLogger = new
SimpleCompactionLogger(logFile)) {
// Here is tmpTargetFile, which is xxx.target
targetTsFileList = new
ArrayList<>(Collections.singletonList(targetTsFileResource));
compactionLogger.logSourceFiles(selectedTsFileResourceList);
compactionLogger.logTargetFile(targetTsFileResource);
compactionLogger.force();
LOGGER.info(
"{}-{} [Compaction] compaction with {}",
storageGroupName,
dataRegionId,
selectedTsFileResourceList);
// carry out the compaction
performer.setSourceFiles(selectedTsFileResourceList);
// As elements in targetFiles may be removed in
ReadPointCompactionPerformer, we should use
// a
// mutable list instead of Collections.singletonList()
performer.setTargetFiles(targetTsFileList);
performer.setSummary(summary);
performer.perform();
CompactionUtils.updateProgressIndex(
targetTsFileList, selectedTsFileResourceList,
Collections.emptyList());
CompactionUtils.moveTargetFile(
targetTsFileList, true, storageGroupName + "-" + dataRegionId);
LOGGER.info(
"{}-{} [InnerSpaceCompactionTask] start to rename mods file",
storageGroupName,
dataRegionId);
CompactionUtils.combineModsInInnerCompaction(
selectedTsFileResourceList, targetTsFileResource);
if (Thread.currentThread().isInterrupted() || summary.isCancel()) {
throw new InterruptedException(
String.format("%s-%s [Compaction] abort", storageGroupName,
dataRegionId));
}
validateCompactionResult(
sequence ? selectedTsFileResourceList : Collections.emptyList(),
sequence ? Collections.emptyList() : selectedTsFileResourceList,
targetTsFileList);
// replace the old files with new file, the new is in same position
as the old
tsFileManager.replace(
sequence ? selectedTsFileResourceList : Collections.emptyList(),
sequence ? Collections.emptyList() : selectedTsFileResourceList,
targetTsFileList,
timePartition,
sequence);
if (targetTsFileResource.isDeleted()) {
compactionLogger.logEmptyTargetFile(targetTsFileResource);
isTargetTsFileEmpty = true;
compactionLogger.force();
}
LOGGER.info(
"{}-{} [Compaction] Compacted target files, try to get the write
lock of source files",
storageGroupName,
dataRegionId);
// release the read lock of all source files, and get the write lock
of them to delete them
for (int i = 0; i < selectedTsFileResourceList.size(); ++i) {
selectedTsFileResourceList.get(i).writeLock();
isHoldingWriteLock[i] = true;
}
if (targetTsFileResource.getTsFile().exists()
&& targetTsFileResource.getTsFile().length()
< TSFileConfig.MAGIC_STRING.getBytes().length * 2L +
Byte.BYTES) {
// the file size is smaller than magic string and version number
throw new TsFileNotCompleteException(
String.format(
"target file %s is smaller than magic string and version
number size",
targetTsFileResource));
}
LOGGER.info(
"{}-{} [Compaction] compaction finish, start to delete old
files",
storageGroupName,
dataRegionId);
CompactionUtils.deleteSourceTsFileAndUpdateFileMetrics(
selectedTsFileResourceList, sequence);
CompactionUtils.deleteModificationForSourceFile(
selectedTsFileResourceList, storageGroupName + "-" +
dataRegionId);
// inner space compaction task has only one target file
if (!targetTsFileResource.isDeleted()) {
FileMetrics.getInstance()
.addTsFile(
targetTsFileResource.getDatabaseName(),
targetTsFileResource.getDataRegionId(),
targetTsFileResource.getTsFile().length(),
sequence,
targetTsFileResource.getTsFile().getName());
// set target resource to CLOSED, so that it can be selected to
compact
targetTsFileResource.setStatus(TsFileResourceStatus.NORMAL);
} else {
// target resource is empty after compaction, then delete it
targetTsFileResource.remove();
}
CompactionMetrics.getInstance().recordSummaryInfo(summary);
double costTime = (System.currentTimeMillis() - startTime) / 1000.0d;
LOGGER.info(
"{}-{} [Compaction] {} InnerSpaceCompaction task finishes
successfully, "
+ "target file is {},"
+ "time cost is {} s, "
+ "compaction speed is {} MB/s, {}",
storageGroupName,
dataRegionId,
sequence ? "Sequence" : "Unsequence",
targetTsFileResource.getTsFile().getName(),
String.format("%.2f", costTime),
String.format("%.2f", selectedFileSize / 1024.0d / 1024.0d /
costTime),
summary);
}
Files.deleteIfExists(logFile.toPath());
} catch (Exception e) {
isSuccess = false;
printLogWhenException(LOGGER, e);
recover();
} finally {
releaseAllLocks();
}
return isSuccess;
}
```
The log file is not deleted if an exception occured in try block.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]