lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rudi Quark (JIRA)" <j...@apache.org>
Subject [jira] Created: (LUCENE-1399) NullPointerException issue with single IndexWriter instance shared among multiple Thread
Date Mon, 22 Sep 2008 07:03:44 GMT
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: java-dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-dev-help@lucene.apache.org


Mime
View raw message