lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Uwe Schindler" <...@thetaphi.de>
Subject RE: Lucene 2.9.0-rc5 : Reader stays open after IndexWriter.updateDocument(), is that possible?
Date Sun, 27 Sep 2009 08:41:58 GMT
How does your test perform with 2.4.1 ?

-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: uwe@thetaphi.de

> -----Original Message-----
> From: Chris Hostetter [mailto:hossman_lucene@fucit.org]
> Sent: Sunday, September 27, 2009 3:34 AM
> To: Lucene Dev
> Subject: Re: Lucene 2.9.0-rc5 : Reader stays open after
> IndexWriter.updateDocument(), is that possible?
> 
> 
> : Thanks Mark for the pointer, I thought somehow that lucene closed them
> as a
> : convenience, I don't know if it did that in previous releases (aka
> 2.4.1) but
> : I'll close them myself from now on.
> 
> FWIW: As far as i know, Lucene has always closed the Reader for you when
> calling addDocument/updateDocument -- BUT -- the docs never promized
> that Lucene would close any Readers used in Fields.  In fact the Field
> constructor docs say "you may not close the Reader until addDocument has
> been called" suggesting that you should close it yourself.
> (Reader.close() is very clear that there should be no effect on closing a
> Reader multiple times, so this is safe no matter what Lucene does)
> 
> That said: If the behavior has changed in 2.9, this could easily bite lots
> of people in the ass if they haven't been closing their readers and now
> they run out of file handles.  I wrote a quick test to try and reproduce
> the problem you're describing, but as far as i can tell 2.9.0
> (final) still seems to close the Reader for you.
> 
> Can anyone else reproduce this problem of Reader's in Field's not getting
> closed?  (my test is below)
> 
> --BEGIN--
> package org.apache.lucene;
> 
> /**
>  * Licensed to the Apache Software Foundation (ASF) under one or more
>  * contributor license agreements.  See the NOTICE file distributed with
>  * this work for additional information regarding copyright ownership.
>  * The ASF licenses this file to You under the Apache License, Version 2.0
>  * (the "License"); you may not use this file except in compliance with
>  * the License.  You may obtain a copy of the License at
>  *
>  *     http://www.apache.org/licenses/LICENSE-2.0
>  *
>  * Unless required by applicable law or agreed to in writing, software
>  * distributed under the License is distributed on an "AS IS" BASIS,
>  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
>  * See the License for the specific language governing permissions and
>  * limitations under the License.
>  */
> 
> import org.apache.lucene.analysis.KeywordAnalyzer;
> import org.apache.lucene.index.*;
> import org.apache.lucene.document.*;
> import org.apache.lucene.util.LuceneTestCase;
> import org.apache.lucene.store.RAMDirectory;
> 
> import java.io.*;
> 
> public class TestFieldWithReaderClosing extends LuceneTestCase {
> 
>   IndexWriter writer = null;
>   Document d = null;
>   CloseStateReader reader;
>   public void setUp() throws Exception {
>     writer = new IndexWriter(new RAMDirectory(),
>                              new KeywordAnalyzer(), true,
>                              IndexWriter.MaxFieldLength.LIMITED);
>     d = new Document();
>     d.add(new Field("id", "x", Field.Store.YES, Field.Index.ANALYZED));
>     reader = new CloseStateReader("foo");
>     d.add(new Field("contents", reader));
>   }
>   public void tearDown() throws Exception {
>     writer.close();
>     writer = null;
>     reader.close();
>     reader = null;
>   }
> 
>   public void testAdd() throws Exception {
>     writer.addDocument(d);
>     assertEquals("close count should be 1", 1, reader.getCloseCount());
>     writer.close();
>     assertEquals("close count should still be 1", 1,
> reader.getCloseCount());
>   }
>   public void testEmptyUpdate() throws Exception {
>     writer.updateDocument(new Term("id","x"), d);
>     assertEquals("close count should be 1", 1, reader.getCloseCount());
>     writer.close();
>     assertEquals("close count should still be 1", 1,
> reader.getCloseCount());
>   }
>   public void testAddAndUpdate() throws Exception {
>     writer.addDocument(d);
>     assertEquals("close count should be 1", 1, reader.getCloseCount());
>     d = new Document();
>     d.add(new Field("id", "x", Field.Store.YES, Field.Index.ANALYZED));
>     reader = new CloseStateReader("foo");
>     d.add(new Field("contents", reader));
>     writer.updateDocument(new Term("id","x"), d);
>     assertEquals("new close count should be 1", 1,
> reader.getCloseCount());
>     writer.close();
>     assertEquals("new close count should still be 1", 1,
> reader.getCloseCount());
>   }
> 
> 
>   static class CloseStateReader extends StringReader {
>     private int closeCount = 0;
>     public CloseStateReader(String s) {
>       super(s);
>     }
>     public synchronized void close() {
>       closeCount++;
>       super.close();
>     }
>     public int getCloseCount() {
>       return closeCount;
>     }
>   }
> }
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-dev-help@lucene.apache.org



---------------------------------------------------------------------
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