You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by "Michael McCandless (JIRA)" <ji...@apache.org> on 2008/09/22 10:48:44 UTC

[jira] Commented: (LUCENE-1399) NullPointerException issue with single IndexWriter instance shared among multiple Thread

    [ https://issues.apache.org/jira/browse/LUCENE-1399?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12633177#action_12633177 ] 

Michael McCandless commented on LUCENE-1399:
--------------------------------------------

Thanks for reporting this!

It should already be fixed on 2.4 (this is a dup of LUCENE-1335).  Could you run your test program on 2.4 to confirm?

> 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