You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ty...@apache.org on 2016/08/26 17:07:04 UTC

[1/3] cassandra git commit: Fix file handle leak due to transaction logs

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.0 f092f7be2 -> da07130e4
  refs/heads/trunk 708b0534f -> dc1712a81


Fix file handle leak due to transaction logs

Patch by Stefania Alborghetti; reviewed by Tyler Hobbs for
CASSANDRA-11594


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/da07130e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/da07130e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/da07130e

Branch: refs/heads/cassandra-3.0
Commit: da07130e4e08cd8645001c6f7fa9ea2acb2072ca
Parents: f092f7b
Author: Stefania Alborghetti <st...@datastax.com>
Authored: Fri Aug 26 11:58:23 2016 -0500
Committer: Tyler Hobbs <ty...@gmail.com>
Committed: Fri Aug 26 11:58:23 2016 -0500

----------------------------------------------------------------------
 CHANGES.txt                                               |  3 +++
 .../apache/cassandra/db/lifecycle/LogAwareFileLister.java | 10 ++++++----
 src/java/org/apache/cassandra/db/lifecycle/LogFile.java   |  4 ++--
 .../org/apache/cassandra/db/lifecycle/LogReplica.java     |  4 ++--
 .../org/apache/cassandra/db/lifecycle/LogReplicaSet.java  |  5 +++--
 .../org/apache/cassandra/db/lifecycle/LogTransaction.java |  8 ++------
 6 files changed, 18 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 59c8a4b..cf14f67 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,7 @@
 3.0.9
+ * Fix file handle leaks due to simultaneous compaction/repair and
+   listing snapshots, calculating snapshot sizes, or making schema
+   changes (CASSANDRA-11594)
  * Fix nodetool repair exits with 0 for some errors (CASSANDRA-12508)
  * Do not shut down BatchlogManager twice during drain (CASSANDRA-12504)
  * Disk failure policy should not be invoked on out of space (CASSANDRA-12385)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java b/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
index e9072c4..7728f9c 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
@@ -122,10 +122,12 @@ final class LogAwareFileLister
      */
     void classifyFiles(File txnFile)
     {
-        LogFile txn = LogFile.make(txnFile);
-        readTxnLog(txn);
-        classifyFiles(txn);
-        files.put(txnFile, FileType.TXN_LOG);
+        try (LogFile txn = LogFile.make(txnFile))
+        {
+            readTxnLog(txn);
+            classifyFiles(txn);
+            files.put(txnFile, FileType.TXN_LOG);
+        }
     }
 
     void readTxnLog(LogFile txn)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogFile.java b/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
index 6d0c835..8560410 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
@@ -52,7 +52,7 @@ import static org.apache.cassandra.utils.Throwables.merge;
  *
  * @see LogTransaction
  */
-final class LogFile
+final class LogFile implements AutoCloseable
 {
     private static final Logger logger = LoggerFactory.getLogger(LogFile.class);
 
@@ -374,7 +374,7 @@ final class LogFile
         return replicas.exists();
     }
 
-    void close()
+    public void close()
     {
         replicas.close();
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java b/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
index 79b9749..712a22d 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
@@ -34,7 +34,7 @@ import org.apache.cassandra.utils.CLibrary;
  *
  * @see LogFile
  */
-final class LogReplica
+final class LogReplica implements AutoCloseable
 {
     private final File file;
     private int folderDescriptor;
@@ -88,7 +88,7 @@ final class LogReplica
         return file.exists();
     }
 
-    void close()
+    public void close()
     {
         if (folderDescriptor >= 0)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java b/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
index d9d9213..d8b2141 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
@@ -41,7 +41,7 @@ import org.apache.cassandra.utils.Throwables;
  *
  * @see LogReplica, LogFile
  */
-public class LogReplicaSet
+public class LogReplicaSet implements AutoCloseable
 {
     private static final Logger logger = LoggerFactory.getLogger(LogReplicaSet.class);
 
@@ -72,6 +72,7 @@ public class LogReplicaSet
         if (replicasByFile.containsKey(folder))
             return;
 
+        @SuppressWarnings("resource")  // LogReplicas are closed in LogReplicaSet::close
         final LogReplica replica = LogReplica.create(folder, fileName);
 
         records.forEach(replica::append);
@@ -201,7 +202,7 @@ public class LogReplicaSet
                : false;
     }
 
-    void close()
+    public void close()
     {
         Throwables.maybeFail(Throwables.perform(null, replicas().stream().map(r -> r::close)));
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java b/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
index b34ca60..ca644eb 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
@@ -425,8 +425,8 @@ class LogTransaction extends Transactional.AbstractTransactional implements Tran
 
         static void removeUnfinishedLeftovers(String name, List<File> logFiles)
         {
-            LogFile txn = LogFile.make(name, logFiles);
-            try
+
+            try(LogFile txn = LogFile.make(name, logFiles))
             {
                 if (txn.verify())
                 {
@@ -439,10 +439,6 @@ class LogTransaction extends Transactional.AbstractTransactional implements Tran
                     logger.error("Unexpected disk state: failed to read transaction txn {}", txn);
                 }
             }
-            finally
-            {
-                txn.close();
-            }
         }
     }
 }


[2/3] cassandra git commit: Fix file handle leak due to transaction logs

Posted by ty...@apache.org.
Fix file handle leak due to transaction logs

Patch by Stefania Alborghetti; reviewed by Tyler Hobbs for
CASSANDRA-11594


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/da07130e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/da07130e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/da07130e

Branch: refs/heads/trunk
Commit: da07130e4e08cd8645001c6f7fa9ea2acb2072ca
Parents: f092f7b
Author: Stefania Alborghetti <st...@datastax.com>
Authored: Fri Aug 26 11:58:23 2016 -0500
Committer: Tyler Hobbs <ty...@gmail.com>
Committed: Fri Aug 26 11:58:23 2016 -0500

----------------------------------------------------------------------
 CHANGES.txt                                               |  3 +++
 .../apache/cassandra/db/lifecycle/LogAwareFileLister.java | 10 ++++++----
 src/java/org/apache/cassandra/db/lifecycle/LogFile.java   |  4 ++--
 .../org/apache/cassandra/db/lifecycle/LogReplica.java     |  4 ++--
 .../org/apache/cassandra/db/lifecycle/LogReplicaSet.java  |  5 +++--
 .../org/apache/cassandra/db/lifecycle/LogTransaction.java |  8 ++------
 6 files changed, 18 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 59c8a4b..cf14f67 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,7 @@
 3.0.9
+ * Fix file handle leaks due to simultaneous compaction/repair and
+   listing snapshots, calculating snapshot sizes, or making schema
+   changes (CASSANDRA-11594)
  * Fix nodetool repair exits with 0 for some errors (CASSANDRA-12508)
  * Do not shut down BatchlogManager twice during drain (CASSANDRA-12504)
  * Disk failure policy should not be invoked on out of space (CASSANDRA-12385)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java b/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
index e9072c4..7728f9c 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
@@ -122,10 +122,12 @@ final class LogAwareFileLister
      */
     void classifyFiles(File txnFile)
     {
-        LogFile txn = LogFile.make(txnFile);
-        readTxnLog(txn);
-        classifyFiles(txn);
-        files.put(txnFile, FileType.TXN_LOG);
+        try (LogFile txn = LogFile.make(txnFile))
+        {
+            readTxnLog(txn);
+            classifyFiles(txn);
+            files.put(txnFile, FileType.TXN_LOG);
+        }
     }
 
     void readTxnLog(LogFile txn)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogFile.java b/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
index 6d0c835..8560410 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
@@ -52,7 +52,7 @@ import static org.apache.cassandra.utils.Throwables.merge;
  *
  * @see LogTransaction
  */
-final class LogFile
+final class LogFile implements AutoCloseable
 {
     private static final Logger logger = LoggerFactory.getLogger(LogFile.class);
 
@@ -374,7 +374,7 @@ final class LogFile
         return replicas.exists();
     }
 
-    void close()
+    public void close()
     {
         replicas.close();
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java b/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
index 79b9749..712a22d 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
@@ -34,7 +34,7 @@ import org.apache.cassandra.utils.CLibrary;
  *
  * @see LogFile
  */
-final class LogReplica
+final class LogReplica implements AutoCloseable
 {
     private final File file;
     private int folderDescriptor;
@@ -88,7 +88,7 @@ final class LogReplica
         return file.exists();
     }
 
-    void close()
+    public void close()
     {
         if (folderDescriptor >= 0)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java b/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
index d9d9213..d8b2141 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
@@ -41,7 +41,7 @@ import org.apache.cassandra.utils.Throwables;
  *
  * @see LogReplica, LogFile
  */
-public class LogReplicaSet
+public class LogReplicaSet implements AutoCloseable
 {
     private static final Logger logger = LoggerFactory.getLogger(LogReplicaSet.class);
 
@@ -72,6 +72,7 @@ public class LogReplicaSet
         if (replicasByFile.containsKey(folder))
             return;
 
+        @SuppressWarnings("resource")  // LogReplicas are closed in LogReplicaSet::close
         final LogReplica replica = LogReplica.create(folder, fileName);
 
         records.forEach(replica::append);
@@ -201,7 +202,7 @@ public class LogReplicaSet
                : false;
     }
 
-    void close()
+    public void close()
     {
         Throwables.maybeFail(Throwables.perform(null, replicas().stream().map(r -> r::close)));
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/da07130e/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java b/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
index b34ca60..ca644eb 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
@@ -425,8 +425,8 @@ class LogTransaction extends Transactional.AbstractTransactional implements Tran
 
         static void removeUnfinishedLeftovers(String name, List<File> logFiles)
         {
-            LogFile txn = LogFile.make(name, logFiles);
-            try
+
+            try(LogFile txn = LogFile.make(name, logFiles))
             {
                 if (txn.verify())
                 {
@@ -439,10 +439,6 @@ class LogTransaction extends Transactional.AbstractTransactional implements Tran
                     logger.error("Unexpected disk state: failed to read transaction txn {}", txn);
                 }
             }
-            finally
-            {
-                txn.close();
-            }
         }
     }
 }


[3/3] cassandra git commit: Merge branch 'cassandra-3.0' into trunk

Posted by ty...@apache.org.
Merge branch 'cassandra-3.0' into trunk


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/dc1712a8
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/dc1712a8
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/dc1712a8

Branch: refs/heads/trunk
Commit: dc1712a81b3ec03a674d8ba5df8ca7f2fade5cdd
Parents: 708b053 da07130
Author: Tyler Hobbs <ty...@gmail.com>
Authored: Fri Aug 26 12:06:46 2016 -0500
Committer: Tyler Hobbs <ty...@gmail.com>
Committed: Fri Aug 26 12:06:46 2016 -0500

----------------------------------------------------------------------
 CHANGES.txt                                               |  3 +++
 .../apache/cassandra/db/lifecycle/LogAwareFileLister.java | 10 ++++++----
 src/java/org/apache/cassandra/db/lifecycle/LogFile.java   |  4 ++--
 .../org/apache/cassandra/db/lifecycle/LogReplica.java     |  4 ++--
 .../org/apache/cassandra/db/lifecycle/LogReplicaSet.java  |  5 +++--
 .../org/apache/cassandra/db/lifecycle/LogTransaction.java |  7 +------
 6 files changed, 17 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/dc1712a8/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 0635398,cf14f67..b3975da
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,57 -1,7 +1,60 @@@
 -3.0.9
 +3.10
 + * json/yaml output format for nodetool compactionhistory (CASSANDRA-12486)
 + * Retry all internode messages once after a connection is
 +   closed and reopened (CASSANDRA-12192)
 + * Add support to rebuild from targeted replica (CASSANDRA-9875)
 + * Add sequence distribution type to cassandra stress (CASSANDRA-12490)
 + * "SELECT * FROM foo LIMIT ;" does not error out (CASSANDRA-12154)
 + * Define executeLocally() at the ReadQuery Level (CASSANDRA-12474)
 + * Extend read/write failure messages with a map of replica addresses
 +   to error codes in the v5 native protocol (CASSANDRA-12311)
 + * Fix rebuild of SASI indexes with existing index files (CASSANDRA-12374)
 + * Let DatabaseDescriptor not implicitly startup services (CASSANDRA-9054)
 + * Fix clustering indexes in presence of static columns in SASI (CASSANDRA-12378)
 + * Fix queries on columns with reversed type on SASI indexes (CASSANDRA-12223)
 + * Added slow query log (CASSANDRA-12403)
 + * Count full coordinated request against timeout (CASSANDRA-12256)
 + * Allow TTL with null value on insert and update (CASSANDRA-12216)
 + * Make decommission operation resumable (CASSANDRA-12008)
 + * Add support to one-way targeted repair (CASSANDRA-9876)
 + * Remove clientutil jar (CASSANDRA-11635)
 + * Fix compaction throughput throttle (CASSANDRA-12366)
 + * Delay releasing Memtable memory on flush until PostFlush has finished running (CASSANDRA-12358)
 + * Cassandra stress should dump all setting on startup (CASSANDRA-11914)
 + * Make it possible to compact a given token range (CASSANDRA-10643)
 + * Allow updating DynamicEndpointSnitch properties via JMX (CASSANDRA-12179)
 + * Collect metrics on queries by consistency level (CASSANDRA-7384)
 + * Add support for GROUP BY to SELECT statement (CASSANDRA-10707)
 + * Deprecate memtable_cleanup_threshold and update default for memtable_flush_writers (CASSANDRA-12228)
 + * Upgrade to OHC 0.4.4 (CASSANDRA-12133)
 + * Add version command to cassandra-stress (CASSANDRA-12258)
 + * Create compaction-stress tool (CASSANDRA-11844)
 + * Garbage-collecting compaction operation and schema option (CASSANDRA-7019)
 + * Add beta protocol flag for v5 native protocol (CASSANDRA-12142)
 + * Support filtering on non-PRIMARY KEY columns in the CREATE
 +   MATERIALIZED VIEW statement's WHERE clause (CASSANDRA-10368)
 + * Unify STDOUT and SYSTEMLOG logback format (CASSANDRA-12004)
 + * COPY FROM should raise error for non-existing input files (CASSANDRA-12174)
 + * Faster write path (CASSANDRA-12269)
 + * Option to leave omitted columns in INSERT JSON unset (CASSANDRA-11424)
 + * Support json/yaml output in nodetool tpstats (CASSANDRA-12035)
 + * Expose metrics for successful/failed authentication attempts (CASSANDRA-10635)
 + * Prepend snapshot name with "truncated" or "dropped" when a snapshot
 +   is taken before truncating or dropping a table (CASSANDRA-12178)
 + * Optimize RestrictionSet (CASSANDRA-12153)
 + * cqlsh does not automatically downgrade CQL version (CASSANDRA-12150)
 + * Omit (de)serialization of state variable in UDAs (CASSANDRA-9613)
 + * Create a system table to expose prepared statements (CASSANDRA-8831)
 + * Reuse DataOutputBuffer from ColumnIndex (CASSANDRA-11970)
 + * Remove DatabaseDescriptor dependency from SegmentedFile (CASSANDRA-11580)
 + * Add supplied username to authentication error messages (CASSANDRA-12076)
 + * Remove pre-startup check for open JMX port (CASSANDRA-12074)
 + * Remove compaction Severity from DynamicEndpointSnitch (CASSANDRA-11738)
 + * Restore resumable hints delivery (CASSANDRA-11960)
 +Merged from 3.0:
+  * Fix file handle leaks due to simultaneous compaction/repair and
+    listing snapshots, calculating snapshot sizes, or making schema
+    changes (CASSANDRA-11594)
   * Fix nodetool repair exits with 0 for some errors (CASSANDRA-12508)
   * Do not shut down BatchlogManager twice during drain (CASSANDRA-12504)
   * Disk failure policy should not be invoked on out of space (CASSANDRA-12385)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/dc1712a8/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/dc1712a8/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/dc1712a8/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
index da90f88,712a22d..fd65f5b
--- a/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
@@@ -37,15 -34,14 +37,15 @@@ import org.apache.cassandra.utils.CLibr
   *
   * @see LogFile
   */
- final class LogReplica
+ final class LogReplica implements AutoCloseable
  {
      private final File file;
 -    private int folderDescriptor;
 +    private int directoryDescriptor;
 +    private final Map<String, String> errors = new HashMap<>();
  
 -    static LogReplica create(File folder, String fileName)
 +    static LogReplica create(File directory, String fileName)
      {
 -        return new LogReplica(new File(fileName), CLibrary.tryOpenDirectory(folder.getPath()));
 +        return new LogReplica(new File(fileName), CLibrary.tryOpenDirectory(directory.getPath()));
      }
  
      static LogReplica open(File file)
@@@ -107,12 -88,12 +107,12 @@@
          return file.exists();
      }
  
-     void close()
+     public void close()
      {
 -        if (folderDescriptor >= 0)
 +        if (directoryDescriptor >= 0)
          {
 -            CLibrary.tryCloseFD(folderDescriptor);
 -            folderDescriptor = -1;
 +            CLibrary.tryCloseFD(directoryDescriptor);
 +            directoryDescriptor = -1;
          }
      }
  

http://git-wip-us.apache.org/repos/asf/cassandra/blob/dc1712a8/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
index 47a9901,d8b2141..65be285
--- a/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
@@@ -38,10 -39,9 +38,10 @@@ import org.apache.cassandra.utils.Throw
   * A set of log replicas. This class mostly iterates over replicas when writing or reading,
   * ensuring consistency among them and hiding replication details from LogFile.
   *
 - * @see LogReplica, LogFile
 + * @see LogReplica
 + * @see LogFile
   */
- public class LogReplicaSet
+ public class LogReplicaSet implements AutoCloseable
  {
      private static final Logger logger = LoggerFactory.getLogger(LogReplicaSet.class);
  
@@@ -67,15 -67,16 +67,16 @@@
              logger.trace("Added log file replica {} ", file);
      }
  
 -    void maybeCreateReplica(File folder, String fileName, Set<LogRecord> records)
 +    void maybeCreateReplica(File directory, String fileName, Set<LogRecord> records)
      {
 -        if (replicasByFile.containsKey(folder))
 +        if (replicasByFile.containsKey(directory))
              return;
  
+         @SuppressWarnings("resource")  // LogReplicas are closed in LogReplicaSet::close
 -        final LogReplica replica = LogReplica.create(folder, fileName);
 +        final LogReplica replica = LogReplica.create(directory, fileName);
  
          records.forEach(replica::append);
 -        replicasByFile.put(folder, replica);
 +        replicasByFile.put(directory, replica);
  
          if (logger.isTraceEnabled())
              logger.trace("Created new file replica {}", replica);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/dc1712a8/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
index bfd9739,ca644eb..f99f432
--- a/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
@@@ -432,18 -418,15 +432,17 @@@ class LogTransaction extends Transactio
              filesByName.add(file);
          }
  
 -        void removeUnfinishedLeftovers()
 +        boolean removeUnfinishedLeftovers()
          {
 -            files.forEach(LogFilesByName::removeUnfinishedLeftovers);
 +            return files.entrySet()
 +                        .stream()
 +                        .map(LogFilesByName::removeUnfinishedLeftovers)
 +                        .allMatch(Predicate.isEqual(true));
          }
  
 -        static void removeUnfinishedLeftovers(String name, List<File> logFiles)
 +        static boolean removeUnfinishedLeftovers(Map.Entry<String, List<File>> entry)
          {
-             LogFile txn = LogFile.make(entry.getKey(), entry.getValue());
-             try
 -
 -            try(LogFile txn = LogFile.make(name, logFiles))
++            try(LogFile txn = LogFile.make(entry.getKey(), entry.getValue()))
              {
                  if (txn.verify())
                  {
@@@ -459,14 -436,9 +458,10 @@@
                  }
                  else
                  {
 -                    logger.error("Unexpected disk state: failed to read transaction txn {}", txn);
 +                    logger.error("Unexpected disk state: failed to read transaction log {}", txn.toString(true));
 +                    return false;
                  }
              }
-             finally
-             {
-                 txn.close();
-             }
          }
      }
  }