lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Busch (JIRA)" <>
Subject [jira] Updated: (LUCENE-743) IndexReader.reopen()
Date Tue, 02 Oct 2007 06:24:50 GMT


Michael Busch updated LUCENE-743:

    Attachment: lucene-743-take2.patch

I'm attaching a new version of the patch that has a lot of changes compared to the last patch:

- I factored most of the reopen logic into the subclasses of IndexReader. Now that we're having
the DirectoryIndexReader layer this was possible in a more elegant way.

- IndexReader.reopen() now does not close the old readers by default. This was somewhat tricky,
because now the IndexReaders must be cloneable. I changed IndexReader to implement the Cloneable
interface and implemented clone() for all Lucene built-in IndexReaders. However, there are
probably custom IndexReader implementations out there that do not implement clone() and reopen()
should throw an exception when an attempt is made to reopen such a reader. But I don't want
to throw an exception in IndexReader.clone() itself, because then it would not be possible
anymore for subclasses to recursively call the native Object.clone() via super.clone(). To
solve this conflict I added the method 
   * Returns true, if this IndexReader instance supports the clone() operation.
  protected boolean isCloneSupported();
to IndexReader which returns false by default. IndexReader.clone() checks if the actual implementation
supports clone() (i. e. the above method returns true). If not, it throws an UnsupportedOperationException,
if yes, it returns super.clone().

I was not sure about whether to throw an (unchecked) UnsupportedOperationException or a CloneNotSupportedException
in this case. I decided to throw UnsupportedOperationException even though it's not really
following the clone() guidelines, because it avoids the necessity to catch the CloneNotSupportedException
every time clone() is called (in the reopen() methods of all IndexReader implementations).

As an example for how the clone() method is used let me describe how MultiReader.reopen()
works: it tries to reopen every of its subreaders. If at least one subreader could be reopened
successfully, then a new MultiReader instance is created and the reopened subreaders are added
to it. Every of the old MultiReader's subreaders, that was not reopened (because of no index
changes) is now cloned() and added to the new MultiReader.

- I also added the new method 
   * In addition to {@link #reopen()} this methods offers the ability to close
   * the old IndexReader instance. This speeds up the reopening process for
   * certain IndexReader implementations and reduces memory consumption, because
   * resources of the old instance can be reused for the reopened IndexReader
   * as it avoids the need of copying the resources.
   * <p>
   * The reopen performance especially benefits if IndexReader instances returned 
   * by one of the <code>open()</code> methods are reopened with 
   * <code>closeOldReader==true</code>.
   * <p>
   * Certain IndexReader implementations ({@link MultiReader}, {@link ParallelReader})
   * require that the subreaders support the clone() operation (see {@link #isCloneSupported()}
   * in order to perform reopen with <code>closeOldReader==false</code>.  
  public synchronized IndexReader reopen(boolean closeOldReader);

As the javadoc says it has two benefits: 1) it speeds up reopening and reduces ressources,
and 2) it allows to reopen readers, that use non-cloneable subreaders.

Please let me know what you think about these changes, especially about the clone() implementation.

> IndexReader.reopen()
> --------------------
>                 Key: LUCENE-743
>                 URL:
>             Project: Lucene - Java
>          Issue Type: Improvement
>          Components: Index
>            Reporter: Otis Gospodnetic
>            Assignee: Michael Busch
>            Priority: Minor
>             Fix For: 2.3
>         Attachments:, lucene-743-take2.patch, lucene-743.patch,
lucene-743.patch, lucene-743.patch,,
> This is Robert Engels' implementation of IndexReader.reopen() functionality, as a set
of 3 new classes (this was easier for him to implement, but should probably be folded into
the core, if this looks good).

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:
For additional commands, e-mail:

View raw message