Author: jbellis Date: Wed Dec 22 20:27:43 2010 New Revision: 1052057 URL: http://svn.apache.org/viewvc?rev=1052057&view=rev Log: add FileUtils.closeQuietly and finally-close blocks patch by Dave Brosius; reviewed by jbellis for CASSANDRA-1886
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/auth/SimpleAuthenticator.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/columniterator/SSTableNamesIterator.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLog.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLogHeader.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/FailureDetector.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableReader.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableTracker.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/FileUtils.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/FileStreamTask.java Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/auth/SimpleAuthenticator.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/auth/SimpleAuthenticator.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/auth/SimpleAuthenticator.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/auth/SimpleAuthenticator.java Wed Dec 22 20:27:43 2010 @@ -28,6 +28,7 @@ import java.util.Properties; import java.util.Map; import org.apache.cassandra.config.ConfigurationException; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.thrift.AuthenticationException; import org.apache.cassandra.utils.FBUtilities; @@ -92,12 +93,12 @@ public class SimpleAuthenticator impleme boolean authenticated = false; + InputStream in = null; try { - FileInputStream in = new FileInputStream(pfilename); + in = new BufferedInputStream(new FileInputStream(pfilename)); Properties props = new Properties(); props.load(in); - in.close(); // note we keep the message here and for the wrong password exactly the same to prevent attackers from guessing what users are valid if (null == props.getProperty(username)) throw new AuthenticationException(authenticationErrorMessage(mode, username)); @@ -125,6 +126,10 @@ public class SimpleAuthenticator impleme { throw new RuntimeException("Unexpected authentication problem", e); } + finally + { + FileUtils.closeQuietly(in); + } if (!authenticated) throw new AuthenticationException(authenticationErrorMessage(mode, username)); Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Wed Dec 22 20:27:43 2010 @@ -266,12 +266,13 @@ public class ColumnFamilyStore implement Set<DecoratedKey> keys = new TreeSet<DecoratedKey>(); if (path.exists()) { + ObjectInputStream in = null; try { long start = System.currentTimeMillis(); logger.info(String.format("reading saved cache %s", path)); - ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(path))); + in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(path))); while (in.available() > 0) { int size = in.readInt(); @@ -279,7 +280,6 @@ public class ColumnFamilyStore implement in.readFully(bytes); keys.add(StorageService.getPartitioner().decorateKey(ByteBuffer.wrap(bytes))); } - in.close(); if (logger.isDebugEnabled()) logger.debug(String.format("completed reading (%d ms; %d keys) saved cache %s", System.currentTimeMillis() - start, keys.size(), path)); @@ -288,6 +288,10 @@ public class ColumnFamilyStore implement { logger.warn(String.format("error reading saved cache %s", path.getAbsolutePath()), ioe); } + finally + { + FileUtils.closeQuietly(in); + } } return keys; } Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/columniterator/SSTableNamesIterator.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/columniterator/SSTableNamesIterator.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/columniterator/SSTableNamesIterator.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/columniterator/SSTableNamesIterator.java Wed Dec 22 20:27:43 2010 @@ -39,6 +39,7 @@ import org.apache.cassandra.io.sstable.I import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.io.util.FileMark; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.BloomFilter; import org.apache.cassandra.utils.FBUtilities; import org.slf4j.Logger; @@ -78,14 +79,7 @@ public class SSTableNamesIterator extend } finally { - try - { - file.close(); - } - catch (IOException ioe) - { - logger.warn("error closing " + file.getPath()); - } + FileUtils.closeQuietly(file); } } Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLog.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLog.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLog.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLog.java Wed Dec 22 20:27:43 2010 @@ -339,7 +339,7 @@ public class CommitLog } finally { - reader.close(); + FileUtils.closeQuietly(reader); logger.info("Finished reading " + file); } } Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLogHeader.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLogHeader.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLogHeader.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/commitlog/CommitLogHeader.java Wed Dec 22 20:27:43 2010 @@ -25,8 +25,8 @@ import java.util.Map; import java.util.zip.CRC32; import java.util.zip.Checksum; -import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.io.ICompactSerializer2; +import org.apache.cassandra.io.util.FileUtils; public class CommitLogHeader { @@ -132,13 +132,12 @@ public class CommitLogHeader DataInputStream reader = null; try { - reader = new DataInputStream(new FileInputStream(headerFile)); + reader = new DataInputStream(new BufferedInputStream(new FileInputStream(headerFile))); return serializer.deserialize(reader); } finally { - if (reader != null) - reader.close(); + FileUtils.closeQuietly(reader); } } Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/FailureDetector.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/FailureDetector.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/FailureDetector.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/FailureDetector.java Wed Dec 22 20:27:43 2010 @@ -18,10 +18,12 @@ package org.apache.cassandra.gms; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.IOError; +import java.io.OutputStream; import java.lang.management.ManagementFactory; import java.util.*; import javax.management.MBeanServer; @@ -31,6 +33,7 @@ import org.apache.commons.lang.StringUti import java.net.InetAddress; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.BoundedStatsDeque; import org.slf4j.Logger; @@ -83,17 +86,21 @@ public class FailureDetector implements */ public void dumpInterArrivalTimes() { + OutputStream os = null; try { File file = File.createTempFile("failuredetector-", ".dat"); - FileOutputStream fos = new FileOutputStream(file, true); - fos.write(toString().getBytes()); - fos.close(); + os = new BufferedOutputStream(new FileOutputStream(file, true)); + os.write(toString().getBytes()); } catch (IOException e) { throw new IOError(e); } + finally + { + FileUtils.closeQuietly(os); + } } public void setPhiConvictThreshold(int phi) Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableReader.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableReader.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableReader.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableReader.java Wed Dec 22 20:27:43 2010 @@ -19,6 +19,7 @@ package org.apache.cassandra.io.sstable; +import java.io.BufferedInputStream; import java.io.DataInput; import java.io.DataInputStream; import java.io.File; @@ -53,6 +54,7 @@ import org.apache.cassandra.dht.Range; import org.apache.cassandra.io.ICompactSerializer2; import org.apache.cassandra.io.util.BufferedRandomAccessFile; import org.apache.cassandra.io.util.FileDataInput; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.io.util.SegmentedFile; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.*; @@ -174,11 +176,18 @@ public class SSTableReader extends SSTab File statsFile = new File(descriptor.filenameFor(SSTable.COMPONENT_STATS)); if (statsFile.exists()) { - logger.debug("Load statistics for {}", descriptor); - DataInputStream dis = new DataInputStream(new FileInputStream(statsFile)); - rowSizes = EstimatedHistogram.serializer.deserialize(dis); - columnCounts = EstimatedHistogram.serializer.deserialize(dis); - dis.close(); + DataInputStream dis = null; + try + { + logger.debug("Load statistics for {}", descriptor); + dis = new DataInputStream(new BufferedInputStream(new FileInputStream(statsFile))); + rowSizes = EstimatedHistogram.serializer.deserialize(dis); + columnCounts = EstimatedHistogram.serializer.deserialize(dis); + } + finally + { + FileUtils.closeQuietly(dis); + } } else { @@ -253,14 +262,15 @@ public class SSTableReader extends SSTab void loadBloomFilter() throws IOException { - DataInputStream stream = new DataInputStream(new FileInputStream(descriptor.filenameFor(Component.FILTER))); + DataInputStream stream = null; try { + stream = new DataInputStream(new BufferedInputStream(new FileInputStream(descriptor.filenameFor(Component.FILTER)))); bf = BloomFilter.serializer().deserialize(stream); } finally { - stream.close(); + FileUtils.closeQuietly(stream); } } @@ -316,7 +326,7 @@ public class SSTableReader extends SSTab } finally { - input.close(); + FileUtils.closeQuietly(input); } // finalize the state of the reader @@ -497,14 +507,7 @@ public class SSTableReader extends SSTab } finally { - try - { - input.close(); - } - catch (IOException e) - { - logger.error("error closing file", e); - } + FileUtils.closeQuietly(input); } } Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableTracker.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableTracker.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableTracker.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/sstable/SSTableTracker.java Wed Dec 22 20:27:43 2010 @@ -37,7 +37,9 @@ import org.apache.cassandra.cache.JMXIns import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.DecoratedKey; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.Pair; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,19 +77,29 @@ public class SSTableTracker implements I logger.info("saving " + msgSuffix); int count = 0; File tmpFile = File.createTempFile(savedCachePath.getName(), null, savedCachePath.getParentFile()); - FileOutputStream fout = new FileOutputStream(tmpFile); - ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fout)); - FileDescriptor fd = fout.getFD(); - for (K key : cache.getKeySet()) - { - ByteBuffer bytes = converter.apply(key); - out.writeInt(bytes.remaining()); - out.write(bytes.array(),bytes.position()+bytes.arrayOffset(),bytes.remaining()); - ++count; - } - out.flush(); - fd.sync(); - out.close(); + + FileOutputStream fout = null; + ObjectOutputStream out = null; + try + { + fout = new FileOutputStream(tmpFile); + out = new ObjectOutputStream(new BufferedOutputStream(fout)); + FileDescriptor fd = fout.getFD(); + for (K key : cache.getKeySet()) + { + ByteBuffer bytes = converter.apply(key); + out.writeInt(bytes.remaining()); + out.write(bytes.array(),bytes.position()+bytes.arrayOffset(),bytes.remaining()); + ++count; + } + out.flush(); + fd.sync(); + } + finally + { + FileUtils.closeQuietly(out); + FileUtils.closeQuietly(fout); + } if (!tmpFile.renameTo(savedCachePath)) throw new IOException("Unable to rename cache to " + savedCachePath); if (logger.isDebugEnabled()) Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/FileUtils.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/FileUtils.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/FileUtils.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/FileUtils.java Wed Dec 22 20:27:43 2010 @@ -18,14 +18,12 @@ package org.apache.cassandra.io.util; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; +import java.io.*; import java.text.DecimalFormat; import java.util.Comparator; import java.util.List; +import org.apache.cassandra.utils.FBUtilities; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,6 +83,19 @@ public class FileUtils } } + public static void closeQuietly(Closeable c) + { + try + { + if (c != null) + c.close(); + } + catch (Exception e) + { + logger_.warn("Failed closing stream", e); + } + } + public static class FileComparator implements Comparator<File> { public int compare(File f, File f2) Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/io/util/MmappedSegmentedFile.java Wed Dec 22 20:27:43 2010 @@ -173,14 +173,7 @@ public class MmappedSegmentedFile extend } finally { - try - { - if (raf != null) raf.close(); - } - catch (IOException e) - { - throw new IOError(e); - } + FileUtils.closeQuietly(raf); } return segments; } Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java Wed Dec 22 20:27:43 2010 @@ -18,22 +18,24 @@ package org.apache.cassandra.locator; +import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; +import java.io.Reader; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; import java.util.Properties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import org.apache.cassandra.config.ConfigurationException; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.ResourceWatcher; import org.apache.cassandra.utils.WrappedRunnable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Used to determine if two IP's are in the same datacenter or on the same rack. @@ -112,14 +114,20 @@ public class PropertyFileSnitch extends String rackPropertyFilename = FBUtilities.resourceToFile(RACK_PROPERTY_FILENAME); Properties properties = new Properties(); + Reader reader = null; try { - properties.load(new FileReader(rackPropertyFilename)); + reader = new BufferedReader(new FileReader(rackPropertyFilename)); + properties.load(reader); } catch (IOException e) { throw new ConfigurationException("Unable to read " + RACK_PROPERTY_FILENAME, e); } + finally + { + FileUtils.closeQuietly(reader); + } for (Map.Entry<Object, Object> entry : properties.entrySet()) { Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/FileStreamTask.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/FileStreamTask.java?rev=1052057&r1=1052056&r2=1052057&view=diff ============================================================================== --- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/FileStreamTask.java (original) +++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/streaming/FileStreamTask.java Wed Dec 22 20:27:43 2010 @@ -25,7 +25,7 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.SocketChannel; -import org.apache.cassandra.streaming.StreamHeader; +import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.utils.FBUtilities; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +35,7 @@ import org.apache.cassandra.net.Messagin import org.apache.cassandra.utils.Pair; import org.apache.cassandra.utils.WrappedRunnable; + public class FileStreamTask extends WrappedRunnable { private static Logger logger = LoggerFactory.getLogger( FileStreamTask.class ); @@ -109,14 +110,7 @@ public class FileStreamTask extends Wrap } finally { - try - { - raf.close(); - } - catch (IOException e) - { - throw new AssertionError(e); - } + FileUtils.closeQuietly(raf); } }