NullPointerException issue with single IndexWriter instance shared among multiple Thread ----------------------------------------------------------------------------------------
Key: LUCENE-1399 URL: https://issues.apache.org/jira/browse/LUCENE-1399 Project: Lucene - Java Issue Type: Bug Components: Index Affects Versions: 2.3.2 Environment: Windows XP, JDK 1.6 Reporter: Rudi Quark NullPointerException is thrown while indexing within multiple threads but using one single IndexWriter instance. According to "Lucene in Action" this should do: "...a single instance of either class can be shared among multiple threads, and all calls to its index-modifying methods will be properly synchronized so that index modifications are executed one after the other." Following my exception trace: java.lang.NullPointerException at org.apache.lucene.index.IndexFileDeleter.decRef(IndexFileDeleter.java:475) at org.apache.lucene.index.IndexWriter.commitTransaction(IndexWriter.java:1986) at org.apache.lucene.index.IndexWriter.addIndexes(IndexWriter.java:2219) at com.shi.marketingspy.test.SHILuceneWritingFromThreadsTest$testthread.run(SHILuceneWritingFromThreadsTest.java:48) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) Following my test program: package com.shi.marketingspy.test; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Store; import org.apache.lucene.index.IndexWriter; public class SHILuceneWritingFromThreadsTest { public static void log(String s, com.shi.jipmisc misc) { misc.__Log(s); } public static class testthread implements Runnable { public org.apache.lucene.index.IndexWriter indexwriter; public int iThread; public boolean bWithOptimize; public com.shi.jipmisc misc; public testthread(org.apache.lucene.index.IndexWriter indexwriter, int iThread, boolean bWithOptimize, com.shi.jipmisc misc) { this.indexwriter = indexwriter; this.iThread = iThread; this.bWithOptimize = bWithOptimize; this.misc = misc; } public void run() { try { Analyzer anal = new com.shi.lucene.index.SHIAnalyser(null,null); org.apache.lucene.store.Directory tmpidxdirectory = new org.apache.lucene.store.RAMDirectory(); org.apache.lucene.index.IndexWriter tempindexwriter = new IndexWriter(tmpidxdirectory, anal, true); Document doc = new Document(); for(int ifld=0; ifld < 9; ifld++) { doc.add(new Field("field_"+ifld, "iThread: "+iThread+" field: "+ifld+" "+System.currentTimeMillis()+" "+misc.getDateString()+" "+misc.getDateString2()+" "+com.shi.jipmisc.getTimeStamp()+" "+misc.getClass()+" "+misc.getDebug(), Store.COMPRESS, Field.Index.UN_TOKENIZED)); } tempindexwriter.addDocument(doc); tempindexwriter.optimize(); org.apache.lucene.store.Directory[] idxs = new org.apache.lucene.store.Directory[1]; idxs[0] = tmpidxdirectory; //todo: del-call... this.indexwriter.addIndexes(idxs); if (this.bWithOptimize) this.indexwriter.optimize(); } catch(Throwable e) { log("testthread:run\tERR:2(bWithOpti:"+bWithOptimize+")(iThread:"+iThread+"):"+e.getMessage()+"\n\t"+com.shi.jipmisc.stack2string(e), misc); } } } public SHILuceneWritingFromThreadsTest() { } public static void main(String[] args) { testluceneconcurrency(false); testluceneconcurrency(true ); } public static java.util.concurrent.ExecutorService threadpool_optimized = java.util.concurrent.Executors.newFixedThreadPool(9999999); public static java.util.concurrent.ExecutorService threadpool_not_optimized = java.util.concurrent.Executors.newFixedThreadPool(9999999); public static void testluceneconcurrency(boolean bWithOptimize) { com.shi.jipmisc.createDir("temp", "c:"); com.shi.jipmisc.createDir("testluceneconcurrency", "c:/temp"); com.shi.jipmisc.createDir(""+bWithOptimize, "c:/temp/testluceneconcurrency"); com.shi.jipmisc misc = new com.shi.jipmisc(); misc.setMyPath("C:/temp/testluceneconcurrency"); misc.setDebug(true); misc.emptyDir("c:/temp/testluceneconcurrency/"+bWithOptimize); Analyzer anal = new com.shi.lucene.index.SHIAnalyser(null,null); org.apache.lucene.index.IndexWriter indexwriter = null; try { indexwriter = new IndexWriter("c:/temp/testluceneconcurrency/"+bWithOptimize, anal, true); } catch(Throwable e) { log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tERR:0("+bWithOptimize+"):"+e.getMessage(), misc); return; } log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tINF:step0("+bWithOptimize+")(BEGIN)-------------------------------------", misc); for(int idoc=0; idoc < 9999; idoc++) { Document doc = new Document(); for(int ifld=0; ifld < 9; ifld++) { doc.add(new Field("field_"+ifld, "doc: "+idoc+" field: "+ifld+" "+System.currentTimeMillis()+" "+misc.getDateString()+" "+misc.getDateString2()+" "+com.shi.jipmisc.getTimeStamp()+" "+misc.getClass()+" "+misc.getDebug(), Store.COMPRESS, Field.Index.UN_TOKENIZED)); } try { indexwriter.addDocument(doc); } catch(Throwable e) { log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tERR:1("+bWithOptimize+"):"+e.getMessage(), misc); return; } } log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tINF:step1("+bWithOptimize+")", misc); try { indexwriter.optimize(); } catch(Throwable e) { log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tERR:2("+bWithOptimize+"):"+e.getMessage(), misc); return; } log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tINF:step2("+bWithOptimize+")", misc); java.util.concurrent.ExecutorService threadpool = bWithOptimize ? threadpool_optimized : threadpool_not_optimized; for(int it=0; it < 999; it++) { threadpool.execute(new testthread(indexwriter, it, bWithOptimize, misc)); } log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tINF:step3("+bWithOptimize+")", misc); threadpool.shutdown(); //=execute threads and wait til all threads finish com.shi.jipmisc.wait(999, misc); log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tINF:step4("+bWithOptimize+")", misc); try { //indexwriter.optimize(); //indexwriter.close(); } catch(Throwable e) { log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tERR:9("+bWithOptimize+"):"+e.getMessage(), misc); return; } log("SHILuceneWritingFromThreadsTest:testluceneconcurrency\tINF:step5("+bWithOptimize+")(END)-----------------------------", misc); } } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]