protected void applyTruncatedFileIfExists(final File logDir) { final List<File> truncatedFiles = Arrays.asList(logDir.listFiles(config::matchesTruncatedFileNamePattern)); final int truncatedApplicableFiles = truncatedFiles.size(); if (truncatedApplicableFiles == 1) { final File truncatedFile = truncatedFiles.get(0); final int truncatedSegmentId = getSegmentId(truncatedFile); if (shouldApplyTruncatedSegment(logDir, truncatedFile, truncatedSegmentId)) { moveFile(truncatedFile.getAbsolutePath(), config.fileName(truncatedSegmentId)); } else { truncatedFiles.forEach(FileUtil::deleteFile); } } else if (truncatedApplicableFiles > 1) { throw new RuntimeException("Cannot open log storage: multiple truncated files detected"); } }
protected void applyTruncatedFileIfExists(final File logDir) { final List<File> truncatedFiles = Arrays.asList(logDir.listFiles(config::matchesTruncatedFileNamePattern)); final int truncatedApplicableFiles = truncatedFiles.size(); if (truncatedApplicableFiles == 1) { final File truncatedFile = truncatedFiles.get(0); final int truncatedSegmentId = getSegmentId(truncatedFile); if (shouldApplyTruncatedSegment(logDir, truncatedFile, truncatedSegmentId)) { moveFile(truncatedFile.getAbsolutePath(), config.fileName(truncatedSegmentId)); } else { truncatedFiles.forEach(FileUtil::deleteFile); } } else if (truncatedApplicableFiles > 1) { throw new RuntimeException("Cannot open log storage: multiple truncated files detected"); } }
@Override public void truncate(final long address) { ensureOpenedStorage(); final int segmentId = partitionId(address); final int segmentOffset = partitionOffset(address); addressCheck(segmentId, segmentOffset); truncateLogSegment(segmentId, segmentOffset); final String source = config.fileName(segmentId); final String backup = config.backupFileName(segmentId); final String truncated = config.truncatedFileName(segmentId); // move: segment.bak -> segment.bak.truncated moveFile(backup, truncated, REPLACE_EXISTING); // delete log segments in reverse order for (int i = currentSegment.getSegmentId(); segmentId <= i; i--) { final FsLogSegment segmentToDelete = logSegments.getSegment(i); segmentToDelete.closeSegment(); segmentToDelete.delete(); } // move: segment.bak.truncated -> segment moveFile(truncated, source, REPLACE_EXISTING); final String path = config.getPath(); final File logDir = new File(path); initLogSegments(logDir); }
@Override public void truncate(final long address) { ensureOpenedStorage(); final int segmentId = partitionId(address); final int segmentOffset = partitionOffset(address); addressCheck(segmentId, segmentOffset); truncateLogSegment(segmentId, segmentOffset); final String source = config.fileName(segmentId); final String backup = config.backupFileName(segmentId); final String truncated = config.truncatedFileName(segmentId); // move: segment.bak -> segment.bak.truncated moveFile(backup, truncated, REPLACE_EXISTING); // delete log segments in reverse order for (int i = currentSegment.getSegmentId(); segmentId <= i; i--) { final FsLogSegment segmentToDelete = logSegments.getSegment(i); segmentToDelete.closeSegment(); segmentToDelete.delete(); } // move: segment.bak.truncated -> segment moveFile(truncated, source, REPLACE_EXISTING); final String path = config.getPath(); final File logDir = new File(path); initLogSegments(logDir); }