/* * @(#) CompactionWriterIterator.java * Created May 18, 2012 by oleg * (C) ONE, SIA */ package org.apache.cassandra.io; import java.io.IOException; import java.util.Iterator; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.FSWriteError; import org.apache.cassandra.db.proc.IRowProcessor; import org.apache.cassandra.service.StorageService; /** * * Compacts row to sstablewriter * * @author Oleg Anastasyev<oa@hq.one.lv> * */ public class CompactionWriterIterator extends CompactionIterator { private final String newFilename; private final long expectedBloomFilterSize; protected SSTableWriter writer; /** * @param cfs * @param sstables * @param gcBefore * @param major * @param columnNameObserver * @throws IOException */ public CompactionWriterIterator(ColumnFamilyStore cfs, Iterable<SSTableReader> sstables, IRowProcessor rowp, boolean major, String newFilename, long expectedBloomFilterSize ) throws IOException { super(cfs, sstables, rowp, major); this.newFilename = newFilename; this.expectedBloomFilterSize = expectedBloomFilterSize; } protected CompactionWriterIterator(ColumnFamilyStore cfs, Iterator iter,IRowProcessor rowp, boolean major, String newFilename, long expectedBloomFilterSize) { super(cfs,iter,rowp,major); this.newFilename = newFilename; this.expectedBloomFilterSize = expectedBloomFilterSize; } private SSTableWriter getWriter() { if (writer!=null) return writer; try { writer = new SSTableWriter(newFilename, expectedBloomFilterSize, 0, StorageService.getPartitioner(),cfs.metadata.bloomColumns); if (cfs.metadata.bloomColumns) setColumnNameObserver(writer.getBloomFilterWriter()); return writer; } catch (IOException e) { throw new FSWriteError(e); } } /* (non-Javadoc) * @see org.apache.cassandra.io.CompactionIterator#startRowWrite(org.apache.cassandra.db.DecoratedKey, int) */ @Override protected CompactedRow startRowWrite(DecoratedKey key, int cfSize) { try { SSTableWriter tableWriter = getWriter(); long startRowPosition = tableWriter.startAppend(key, cfSize); return new CompactedRow(key, tableWriter.getRowOutput(), startRowPosition ); } catch (IOException e) { throw new FSWriteError(e); } } /* (non-Javadoc) * @see org.apache.cassandra.io.CompactionIterator#finishRowWrite(org.apache.cassandra.db.DecoratedKey) */ @Override protected void finishRowWrite(CompactedRow compactedRow) { try { long rowSize = getWriter().afterAppend(compactedRow.key, compactedRow.rowPosition); compactedRow.setRowSize(rowSize); } catch (IOException e) { throw new FSWriteError(e); } } public SSTableReader closeAndOpenReader() throws IOException { assert writer != null; return writer.closeAndOpenReader(); } }