Author: jbellis Date: Wed May 25 17:26:16 2011 New Revision: 1127589 URL: http://svn.apache.org/viewvc?rev=1127589&view=rev Log: close scrub file handles patch by jbellis; reviewed by slebresne for CASSANDRA-2669
Modified: cassandra/branches/cassandra-0.7/CHANGES.txt cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/CompactionManager.java Modified: cassandra/branches/cassandra-0.7/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1127589&r1=1127588&r2=1127589&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/CHANGES.txt (original) +++ cassandra/branches/cassandra-0.7/CHANGES.txt Wed May 25 17:26:16 2011 @@ -9,6 +9,7 @@ * add placeholders for missing rows in range query pseudo-RR (CASSANDRA-2680) * remove no-op HHOM.renameHints (CASSANDRA-2693) * clone super columns to avoid modifying them during flush (CASSANDRA-2675) + * close scrub file handles (CASSANDRA-2669) 0.7.6 Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/CompactionManager.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/CompactionManager.java?rev=1127589&r1=1127588&r2=1127589&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/CompactionManager.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/CompactionManager.java Wed May 25 17:26:16 2011 @@ -505,25 +505,29 @@ public class CompactionManager implement private void doScrub(ColumnFamilyStore cfs) throws IOException { assert !cfs.isIndex(); - for (final SSTableReader sstable : cfs.getSSTables()) - { - logger.info("Scrubbing " + sstable); - - // Calculate the expected compacted filesize - String compactionFileLocation = cfs.table.getDataFileLocation(sstable.length()); - if (compactionFileLocation == null) - throw new IOException("disk full"); - int expectedBloomFilterSize = Math.max(DatabaseDescriptor.getIndexInterval(), - (int)(SSTableReader.getApproximateKeyCount(Arrays.asList(sstable)))); + scrubOne(cfs, sstable); + } - // loop through each row, deserializing to check for damage. - // we'll also loop through the index at the same time, using the position from the index to recover if the - // row header (key or data size) is corrupt. (This means our position in the index file will be one row - // "ahead" of the data file.) - final BufferedRandomAccessFile dataFile = BufferedRandomAccessFile.getUncachingReader(sstable.getFilename()); - String indexFilename = sstable.descriptor.filenameFor(Component.PRIMARY_INDEX); - BufferedRandomAccessFile indexFile = BufferedRandomAccessFile.getUncachingReader(indexFilename); + private void scrubOne(ColumnFamilyStore cfs, SSTableReader sstable) throws IOException + { + logger.info("Scrubbing " + sstable); + // Calculate the expected compacted filesize + String compactionFileLocation = cfs.table.getDataFileLocation(sstable.length()); + if (compactionFileLocation == null) + throw new IOException("disk full"); + int expectedBloomFilterSize = Math.max(DatabaseDescriptor.getIndexInterval(), + (int)(SSTableReader.getApproximateKeyCount(Arrays.asList(sstable)))); + + // loop through each row, deserializing to check for damage. + // we'll also loop through the index at the same time, using the position from the index to recover if the + // row header (key or data size) is corrupt. (This means our position in the index file will be one row + // "ahead" of the data file.) + final BufferedRandomAccessFile dataFile = BufferedRandomAccessFile.getUncachingReader(sstable.getFilename()); + String indexFilename = sstable.descriptor.filenameFor(Component.PRIMARY_INDEX); + BufferedRandomAccessFile indexFile = BufferedRandomAccessFile.getUncachingReader(indexFilename); + try + { ByteBuffer nextIndexKey = ByteBufferUtil.readWithShortLength(indexFile); { // throw away variable so we don't have a side effect in the assert @@ -662,6 +666,11 @@ public class CompactionManager implement logger.info("Scrub of " + sstable + " complete; looks like all " + emptyRows + " rows were tombstoned"); } } + finally + { + FileUtils.closeQuietly(dataFile); + FileUtils.closeQuietly(indexFile); + } } private void throwIfFatal(Throwable th)