fanhualta commented on a change in pull request #372: [IOTDB-198]Reimplementation sync module URL: https://github.com/apache/incubator-iotdb/pull/372#discussion_r324492537
########## File path: server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java ########## @@ -950,11 +960,272 @@ protected void mergeEndAction(List<TsFileResource> seqFiles, List<TsFileResource logger.info("{} a merge task ends", storageGroupName); } + /** + * Load a new tsfile to storage group processor + * + * Firstly, determine the loading type of the file, whether it needs to be loaded in sequence list + * or unsequence list. + * + * Secondly, execute the loading process by the type. + * + * Finally, update the latestTimeForEachDevice and latestFlushedTimeForEachDevice. + * + * @param newTsFile new tsfile + * @param newTsFileResource tsfile resource + * @UsedBy sync module. + */ + public void loadNewTsFile(File newTsFile, TsFileResource newTsFileResource) + throws TsFileProcessorException { + writeLock(); + mergeLock.writeLock().lock(); + try { + boolean isOverlap = false; + int preIndex = -1, subsequentIndex = sequenceFileList.size(); + // check new tsfile + outer: + for (int i = 0; i < sequenceFileList.size(); i++) { + if (sequenceFileList.get(i).getFile().getName().equals(newTsFile.getName())) { + return; + } + if (i == sequenceFileList.size() - 1 && sequenceFileList.get(i).getEndTimeMap().isEmpty()) { + continue; + } + int preCnt = 0, subsequenceCnt = 0; + for (String device : newTsFileResource.getStartTimeMap().keySet()) { + if (sequenceFileList.get(i).getStartTimeMap().containsKey(device)) { + long startTime1 = sequenceFileList.get(i).getStartTimeMap().get(device); + long endTime1 = sequenceFileList.get(i).getEndTimeMap().get(device); + long startTime2 = newTsFileResource.getStartTimeMap().get(device); + long endTime2 = newTsFileResource.getEndTimeMap().get(device); + if (startTime1 > endTime2) { + subsequenceCnt++; + } else if (startTime2 > endTime1) { + preCnt++; + } else { + isOverlap = true; + break outer; + } + } + } + if (preCnt != 0 && subsequenceCnt != 0) { + isOverlap = true; + break; + } + if (preCnt == 0 && subsequenceCnt != 0) { + subsequentIndex = i; + break; + } + if (preCnt != 0 && subsequenceCnt == 0) { + preIndex = i; + } + } + + // loading tsfile by type + if (isOverlap) { + loadTsFileByType(-1, newTsFile, newTsFileResource, unSequenceFileList.size()); + } else { + if (subsequentIndex != sequenceFileList.size()) { + loadTsFileByType(1, newTsFile, newTsFileResource, subsequentIndex); + } else { + if (preIndex != -1) { + loadTsFileByType(1, newTsFile, newTsFileResource, preIndex + 1); + } else { + loadTsFileByType(1, newTsFile, newTsFileResource, sequenceFileList.size()); + } Review comment: Do you mean one line like loadTsFileByType(1, newTsFile, newTsFileResource, subsequentIndex == sequenceFileList.size() && preIndex != -1 ? preIndex + 1 : subsequentIndex)? ---------------------------------------------------------------- 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. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services