[ 
https://issues.apache.org/jira/browse/CASSANDRA-533?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jonathan Ellis resolved CASSANDRA-533.
--------------------------------------

       Resolution: Fixed
    Fix Version/s: 0.5
                   0.4
         Assignee: Tim Freeman

committed to 0.4 branch; will merge to trunk

> Need to close files in loadBloomFilter and loadIndexFile
> --------------------------------------------------------
>
>                 Key: CASSANDRA-533
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-533
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 0.4
>         Environment: Vista, Cassandra 0.4.1
>            Reporter: Tim Freeman
>            Assignee: Tim Freeman
>             Fix For: 0.4, 0.5
>
>
> When starting Cassandra on a Windows system, I intermittently see errors like:
> DEBUG - Expected bloom filter size : 2560
> DEBUG - collecting Generation:false:4...@9
> DEBUG - collecting Token:false:1...@0
> INFO - Saved Token found: 25027551081353517716727338628156823602
> ERROR - Error in ThreadPoolExecutor
> java.util.concurrent.ExecutionException: java.io.IOException: Failed to 
> delete LocationInfo-8-Index.db
>         at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
>         at java.util.concurrent.FutureTask.get(FutureTask.java:83)
>         at 
> org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor.afterExecute(DebuggableThreadPoolExecutor.java:8
> 6)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:888)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>         at java.lang.Thread.run(Thread.java:619)
> Caused by: java.io.IOException: Failed to delete LocationInfo-8-Index.db
>         at 
> org.apache.cassandra.utils.FileUtils.deleteWithConfirm(FileUtils.java:55)
>         at 
> org.apache.cassandra.io.SSTableReader.delete(SSTableReader.java:269)
>         at 
> org.apache.cassandra.db.ColumnFamilyStore.doFileCompaction(ColumnFamilyStore.java:1145)
>         at 
> org.apache.cassandra.db.ColumnFamilyStore.doCompaction(ColumnFamilyStore.java:686)
>         at 
> org.apache.cassandra.db.MinorCompactionManager$1.call(MinorCompactionManager.java:166)
>         at 
> org.apache.cassandra.db.MinorCompactionManager$1.call(MinorCompactionManager.java:163)
>         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>         ... 2 more
> DEBUG - Starting to listen on 127.0.0.1:7001
> DEBUG - Binding thrift service to localhost:9160
> The problem here is that the files are not closed immediately after they are 
> read, and on Windows you can't delete an open file.  In general, failing to 
> close a file causes more subtle problems on a Unix system.  You can run out 
> of file descriptors if files are opened faster than the garbage collector 
> closes them, and you can run out of disk space if the total data in the 
> opened-but-deleted files is enough to fill the disk.
> I see two places to fix, SSTableReader.loadIndexFile and 
> SSTableReader.loadBloomFilter.  Here are revised definitions for those two 
> methods:
>     private void loadBloomFilter() throws IOException
>     {
>         DataInputStream stream = new DataInputStream(new 
> FileInputStream(filterFilename()));
>         try {
>               bf = BloomFilter.serializer().deserialize(stream);
>         } finally {
>               stream.close();
>         }
>     }
>     private void loadIndexFile() throws IOException
>     {
>         BufferedRandomAccessFile input = new 
> BufferedRandomAccessFile(indexFilename(), "r");
>         try {
>               indexPositions = new ArrayList<KeyPosition>();
>               int i = 0;
>               long indexSize = input.length();
>               while (true)
>               {
>                       long indexPosition = input.getFilePointer();
>                       if (indexPosition == indexSize)
>                       {
>                               break;
>                       }
>                       String decoratedKey = input.readUTF();
>                       input.readLong();
>                       if (i++ % INDEX_INTERVAL == 0)
>                       {
>                               indexPositions.add(new 
> KeyPosition(decoratedKey, indexPosition));
>                       }
>               }
>         } finally {
>               input.close();
>         }
>     }   
> I have not yet tested those changes, but they look desirable even if they 
> don't fix the symptom I'm experiencing.  I did not search the code for other 
> places that files are opened but not closed.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to