private void finishCompactionOutputFile(CompactionState compactionState) throws IOException { Preconditions.checkNotNull(compactionState, "compactionState is null"); Preconditions.checkArgument(compactionState.outfile != null); Preconditions.checkArgument(compactionState.builder != null); long outputNumber = compactionState.currentFileNumber; Preconditions.checkArgument(outputNumber != 0); long currentEntries = compactionState.builder.getEntryCount(); compactionState.builder.finish(); long currentBytes = compactionState.builder.getFileSize(); compactionState.currentFileSize = currentBytes; compactionState.totalBytes += currentBytes; FileMetaData currentFileMetaData = new FileMetaData( compactionState.currentFileNumber, compactionState.currentFileSize, compactionState.currentSmallest, compactionState.currentLargest); compactionState.outputs.add(currentFileMetaData); compactionState.builder = null; compactionState.outfile.force(true); compactionState.outfile.close(); compactionState.outfile = null; if (currentEntries > 0) { // Verify that the table is usable tableCache.newIterator(outputNumber); } }
private void openCompactionOutputFile(CompactionState compactionState) throws FileNotFoundException { Preconditions.checkNotNull(compactionState, "compactionState is null"); Preconditions.checkArgument( compactionState.builder == null, "compactionState builder is not null"); mutex.lock(); try { long fileNumber = versions.getNextFileNumber(); pendingOutputs.add(fileNumber); compactionState.currentFileNumber = fileNumber; compactionState.currentFileSize = 0; compactionState.currentSmallest = null; compactionState.currentLargest = null; File file = new File(databaseDir, Filename.tableFileName(fileNumber)); compactionState.outfile = new FileOutputStream(file).getChannel(); compactionState.builder = new TableBuilder( options, compactionState.outfile, new InternalUserComparator(internalKeyComparator)); } finally { mutex.unlock(); } }