[
https://issues.apache.org/jira/browse/LUCENE-3866?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Uwe Schindler updated LUCENE-3866:
----------------------------------
Attachment: LUCENE-3866-step2.patch
This is the final patch, now also moving IndexReaderContext to collections and
make them unmodifiable.
For safety, IRC.leaves() now throws UnsupportedOperationException, if the
context is not top-level (returned null before), this helps to find bugs.
All tests pass, JavaDocs are updated.
Robert suggested to me yesterday, to maybe make getSequentialSubReaders()
protected, as it is no longer used by user code (only tests). All code should
use the topReaderContext returned by the IndexReader to get all *atomic*
IRC.leaves(), or IRC.children() to get the sub-contexts/readers.
For easy use it might be a good idea to add some "easy-use methods" in
ReaderUtil to get a view on all AtomicReader leaves (without docBase, so
returns List<AtomicReader>). Some code not needing the whole info would get
simplier. This is stuff for a new issue.
In my opinion we should also move and hide ReaderSlice and BitSlice to index
package, those classes are solely privately used from there.
I think this is ready to commit to trunk and for backport to 4.x. I will not
wait too long (max 24hrs), as the patch may get outdated very quickly. Maybe
Mike can do some perf benchmarks with beast to show that it does not affect
performance (some parts like creating Multi* should be much more effective now).
> Make CompositeReader.getSequentialSubReaders() and the corresponding
> IndexReaderContext methods return unmodifiable List<R extends IndexReader>
> -----------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: LUCENE-3866
> URL: https://issues.apache.org/jira/browse/LUCENE-3866
> Project: Lucene - Java
> Issue Type: Improvement
> Reporter: Uwe Schindler
> Assignee: Uwe Schindler
> Fix For: 4.0
>
> Attachments: LUCENE-3866-step1.patch, LUCENE-3866-step2.patch
>
>
> Since Lucene 2.9 we have the method getSequentialSubReader() returning
> IndexReader[]. Based on hardly-to-debug errors in user's code, Robert and me
> realized that returning an array from a public API is an anti-pattern. If the
> array is intended to be modifiable (like byte[] in terms,...), it is fine to
> use arrays in public APIs, but not, if the array must be protected from
> modification. As IndexReaders are 100% unmodifiable in trunk code (no
> deletions,...), the only possibility to corrumpt the reader is by modifying
> the array returned by getSequentialSubReaders(). We should prevent this.
> The same theoretically applies to FieldCache, too - but the party that is
> afraid of performance problems is too big to fight against that :(
> For getSequentialSubReaders there is no performance problem at all. The
> binary search of reader-ids inside BaseCompositeReader can still be done with
> the internal protected array, but public APIs should expose only a
> unmodifiable List. The same applies to leaves() and children() in
> IndexReaderContext. This change to list would also allow to make
> CompositeReader and CompositeReaderContext Iterable<R extends IndexReader>,
> so some loops would look nice.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]