>From src code of DocumentsWriterPerThreadPool, the variable
numThreadStatesActive seems to be always increasing, which explains why
asserting on numThreadStatesActive == 0 before cloning this object
fails. So what should be the most appropriate way of re-opening an
indexwriter if what you have are the index directory plus the
indexWriterConfig that the closed indexWriter has been using?

BTW - I am reasonably sure calling indexWriterConfig.clone() in the middle
of indexing documents used to work for my code(same Lucene 4.7). It is
since recently I had to do faceted indexing as well that this problem
started to emerge. Is it related?


On Mon, Aug 11, 2014 at 11:31 PM, Vitaly Funstein <vfunst...@gmail.com>
wrote:

> I only have the source to 4.6.1, but if you look at the constructor of
> IndexWriter there, it looks like this:
>
>   public IndexWriter(Directory d, IndexWriterConfig conf) throws
> IOException {
>     conf.setIndexWriter(this); // prevent reuse by other instances
>
> The setter throws an exception if the configuration object has already been
> used with another instance of IndexWriter. Therefore, it should be cloned
> before being used in the constructor of IndexWriter.
>
>
> On Mon, Aug 11, 2014 at 7:12 PM, Sheng <sheng...@gmail.com> wrote:
>
> > So the indexWriterConfig.clone() failed at this step:
> > clone.indexerThreadPool = indexerThreadPool
> > <
> >
> http://grepcode.com/file/repo1.maven.org/maven2/org.apache.lucene/lucene-core/4.7.0/org/apache/lucene/index/LiveIndexWriterConfig.java#LiveIndexWriterConfig.0indexerThreadPool
> > >
> > .clone
> > <
> >
> http://grepcode.com/file/repo1.maven.org/maven2/org.apache.lucene/lucene-core/4.7.0/org/apache/lucene/index/DocumentsWriterPerThreadPool.java#DocumentsWriterPerThreadPool.clone%28%29
> > >
> > ();
> >
> > which then failed at this step in the "indexerThreadPool"
> >
> >
> > if (numThreadStatesActive
> > <
> >
> http://grepcode.com/file/repo1.maven.org/maven2/org.apache.lucene/lucene-core/4.7.0/org/apache/lucene/index/DocumentsWriterPerThreadPool.java#DocumentsWriterPerThreadPool.0numThreadStatesActive
> > >
> > != 0) {
> >
> >     throw new IllegalStateException
> > <
> >
> http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b27/java/lang/IllegalStateException.java#IllegalStateException
> > >("clone
> > this object before it is used!");
> >
> > }
> >
> >
> > There is a comment right above this:
> > // We should only be cloned before being used:
> >
> > Does this mean whenever the indexWriter gets called for
> > commit/prepareCommit, etc., the corresponding indexWriterConfig object
> > cannot be called with .clone() at all?
> >
> >
> > On Mon, Aug 11, 2014 at 9:52 PM, Vitaly Funstein <vfunst...@gmail.com>
> > wrote:
> >
> > > Looks like you have to clone it prior to using with any IndexWriter
> > > instances.
> > >
> > >
> > > On Mon, Aug 11, 2014 at 2:49 PM, Sheng <sheng...@gmail.com> wrote:
> > >
> > > > I tried to create a clone of indexwriteconfig with
> > > > "indexWriterConfig.clone()" for re-creating a new indexwriter, but I
> > > then I
> > > > got this very annoying illegalstateexception: "clone this object
> before
> > > it
> > > > is used". Why does this exception happen, and how can I get around
> it?
> > > > Thanks!
> > > >
> > >
> >
>

Reply via email to