Were there any exceptions inside Lucene, before the hang? The fact that you're hitting AlreadyClosedException is a spooky sign -- that means IW thinks you had in fact closed the writer, but then used it again.
For increasing indexing throughput, I'd start here: http://wiki.apache.org/lucene-java/ImproveIndexingSpeed Can you whittle down your code to a smaller test that still shows the hang? Mike On Fri, Oct 9, 2009 at 6:05 AM, Jamie Band <ja...@stimulussoft.com> wrote: > Hi Mike > > There are other threads involved but none are simultaneously modifying the > index. > > There is one thread that retrieves the total count every 2 seconds on the > index for GUI display: > > public long getTotalMessageCount(Volume volume) throws > MessageSearchException { > if (volume == null) > throw new MessageSearchException("assertion failure: null > volume",logger); > int count = 0; > File indexDir = new File(volume.getIndexPath()); > if (!indexDir.exists()) > return 0; > IndexReader indexReader = null; > try { > indexReader = IndexReader.open(indexDir); > count += indexReader.numDocs(); > } catch (IOException e ) { > logger.error("failed to close index to calculate total > count",e); > } finally { > try { indexReader.close(); } catch (Exception e) { > logger.error("failed to close index to calculate total > count",e); > } > } > return count; > } > > There are also other threads for performing searches across the various > indexes. > > I will rerun the reindex and send you the log. > > With the availability of Lucene 2.9.0 I changed our indexing routines, so > perhaps its an issue with my code. One thing I've already been curious about > is how it is possible to receive the AlreadyClosedException when there is no > other code writing to the index due to the indexLock. Very occasionally an > AlreadyClosedException is thrown while adding a document to the index. To > ensure that nothing is list, a separate retry queue is maintained. > > Any you spot anything suspect in the below? I would also be interested to > get your thoughts on how to improve indexing speed. Using a thread pool to > addDocuments to the index does not seem to help much. > > > public class IndexProcessor extends Thread { > public IndexProcessor() { > setName("index processor"); > } > public void run() { > boolean exit = false; > //ExecutorService documentPool; > // we abandoned pool as it does not seem to offer any major > performance benefit > IndexInfo indexInfo = null; > LinkedList<IndexInfo> pushbacks = new LinkedList<IndexInfo>(); > while (!exit) { > try { > int maxIndexDocs = > Config.getConfig().getIndex().getMaxSimultaneousDocs(); > //documentPool = > Executors.newFixedThreadPool(Config.getConfig().getArchiver().getArchiveThreads()); > indexInfo = null; indexInfo = > (IndexInfo) queue.take(); > if (indexInfo==EXIT_REQ) { > logger.debug("index exit req received. exiting"); > exit = true; > continue; > } > indexLock.lock(); > try { > openIndex(); > } catch (Exception e) { > logger.error("failed to open > index:"+e.getMessage(),e); > return; > } > if (indexInfo==null) { > logger.debug("index info is null"); > } > int i = 0; > while(indexInfo!=null && i<maxIndexDocs) { > try { > writer.addDocument(indexInfo.getDocument()); > indexInfo.cleanup(); > } catch (IOException io) { > logger.error("failed to add document to > index:"+io.getMessage(),io); > indexInfo.cleanup(); > } catch (AlreadyClosedException e) { > pushbacks.add(indexInfo); > } > //documentPool.execute(new > IndexDocument(indexInfo,pushbacks)); > i++; > if (i<maxIndexDocs) { > indexInfo = (IndexInfo) queue.poll(); > if > (indexInfo==null) { > logger.debug("index info is null"); > } > if > (indexInfo==EXIT_REQ) { > logger.debug("index exit req > received. exiting (2)"); > exit = true; > break; > } > } > } > if (pushbacks.size()>0) { > closeIndex(); > try { > openIndex(); > } catch (Exception e) { > logger.error("failed to open > index:"+e.getMessage(),e); > return; > } > for (IndexInfo pushback : pushbacks) { > try { > > writer.addDocument(pushback.getDocument()); > pushback.cleanup(); > } catch (IOException io) { > logger.error("failed to add document > to index:"+io.getMessage(),io); > pushback.cleanup(); > } catch (AlreadyClosedException e) { > pushbacks.add(pushback); > } > //documentPool.execute(new > IndexDocument(pushback,pushbacks)); > i++; > } > } > //documentPool.shutdown(); > //documentPool.awaitTermination(30,TimeUnit.MINUTES); > } catch (Throwable ie) { > logger.error("index write > interrupted:"+ie.getMessage()); > } finally { > closeIndex(); > indexLock.unlock(); > } > } } > > Many thanks > > Jamie > > Michael McCandless wrote: >> >> Are there other threads involved, besides the one hung in close? Can >> you post their stack traces? >> >> This stack trace seems to indicate that IW believes another thread is >> in the process of closing. >> >> Can you call IndexWriter.setInfoStream and post the output leading to the >> hang? >> >> Mike >> >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org > For additional commands, e-mail: java-user-h...@lucene.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org