We've removed IndexWriterConfig.clone as of 4.9:

    https://issues.apache.org/jira/browse/LUCENE-5708

Cloning of those complex / expert classes was buggy and too hairy to get right.

You just have to make a new IWC every time you make an IW.

Mike McCandless

http://blog.mikemccandless.com


On Tue, Aug 12, 2014 at 2:29 AM, Vitaly Funstein <vfunst...@gmail.com> wrote:
> I honestly don't understand what DWPT pool has to do with IndexWriterConfig
> instances not being reusable for new IndexWriter instances. If you have the
> need to open a new IndexWriter with the same configuration as the one you
> used before, why not save the original config as the "template", then
> simply do this for every IndexWriter instance you're creating:
>
> private final IndexWriterConfig masterCfg = new
> IndexWriterConfig(Version.LUCENE_47, null);
> // set whatever you need on this instance
> .....
>
> IndexWriter writer = new IndexWriter(directory, masterCfg.clone());
>
> Wouldn't this just work? If not, could you paste the stack trace of the
> exception you're getting?
>
>
> On Mon, Aug 11, 2014 at 9:01 PM, Sheng <sheng...@gmail.com> wrote:
>
>> 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!
>> > > > >
>> > > >
>> > >
>> >
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-user-h...@lucene.apache.org

Reply via email to