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]

Reply via email to