Lucene and "Bad file descriptor" exception while retrieving hits

Just came across this stack trace while trying to retrieve a document from a hits object in lucene:

java.io.IOException: Bad file descriptor
        at java.io.RandomAccessFile.seek(Native Method)
        at org.apache.lucene.store.FSIndexInput.readInternal(FSDirectory.java:449)
        at org.apache.lucene.store.BufferedIndexInput.refill(BufferedIndexInput.java:64)
        at org.apache.lucene.store.BufferedIndexInput.readByte(BufferedIndexInput.java:33)
        at org.apache.lucene.store.BufferedIndexInput.readBytes(BufferedIndexInput.java:41)
        at org.apache.lucene.index.CompoundFileReader$CSIndexInput.readInternal(CompoundFileReader.java:219)
        at org.apache.lucene.store.BufferedIndexInput.refill(BufferedIndexInput.java:64)
        at org.apache.lucene.store.BufferedIndexInput.readByte(BufferedIndexInput.java:33)
        at org.apache.lucene.store.IndexInput.readInt(IndexInput.java:46)
        at org.apache.lucene.store.IndexInput.readLong(IndexInput.java:69)
        at org.apache.lucene.index.FieldsReader.doc(FieldsReader.java:62)
        at org.apache.lucene.index.SegmentReader.document(SegmentReader.java:284)
        at org.apache.lucene.search.IndexSearcher.doc(IndexSearcher.java:83)
        at org.apache.lucene.search.Hits.doc(Hits.java:103)
        at nz.co.dymanic.lucene.searchers.ICTCanterburySearcher.getResults(ICTCanterburySearcher.java:90)
        at nz.co.dymanic.lucene.searchers.ICTCanterburySearcher.doSearch(ICTCanterburySearcher.java:71)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.apache.xmlrpc.Invoker.execute(Invoker.java:130)
        at org.apache.xmlrpc.XmlRpcWorker.invokeHandler(XmlRpcWorker.java:84)
        at org.apache.xmlrpc.XmlRpcWorker.execute(XmlRpcWorker.java:146)
        at org.apache.xmlrpc.XmlRpcServer.execute(XmlRpcServer.java:139)
        at org.apache.xmlrpc.XmlRpcServer.execute(XmlRpcServer.java:114)
        at nz.co.dymanic.lucene.LuceneSearch.doPost(LuceneSearch.java:84)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)

 

The cause? I was closing the IndexSearcher object after getting the hits, but before processing them. This invalidates some of the index file descriptors, hence the problem. Simply delay closing the IndexSearcher until after you're done with the hits, and problem solved!