[
https://issues.apache.org/jira/browse/LUCENE-5553?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13946578#comment-13946578
]
Shai Erera commented on LUCENE-5553:
------------------------------------
bq. As a side-note I think we should never reset the reference here to be
honest.
Didn't see that -- if you say that close() should render the IR closed, no
matter what exception it hit, then you're right -- we should fix the code to
notify the listeners but also mark {{closed=true}}. And I think that's not a
bad idea!
E.g., I looked at SegmentReader.doClose() and I think it too isn't
exception-safe. If any of the CloseableThreadLocals throw an exception (very
unlikely), we fail to decRef SegDocValues.
But what's worse is the whole chain -- IR.close() -> SR.doClose() -- if an
exception is thrown from SegDocValues.decRef(), it happens after
{{core.decRef()}} succeeded. IR.close() hits the exception and doesn't mark
itself as closed. So it doesn't notify the listeners cause it thinks it isn't
closed, but in fact I think if you try to use it you will hit an exception ..
it's in a weird state?
> IndexReader#ReaderClosedListener is not always called on IndexReader#close()
> ----------------------------------------------------------------------------
>
> Key: LUCENE-5553
> URL: https://issues.apache.org/jira/browse/LUCENE-5553
> Project: Lucene - Core
> Issue Type: Bug
> Components: core/index
> Affects Versions: 4.7, 5.0
> Reporter: Simon Willnauer
> Priority: Blocker
> Fix For: 4.7.1
>
>
> Today IndexReader#ReaderClosedListener might not be called if the last
> IndexReader#decRef() call runs into an exception on IndexReader#doClose().
> Today we just reset the refCount and never go and call the listeners. There
> seem to be a bunch of problems here along the same lines but IMO if we close
> a reader it should close all resources no matter what exception it runs into.
> What this should do is call the close listeners in a finally block and then
> rethrow the exception. The real problem here for apps relying on the listener
> to release resources is that you might leak memory or file handles or whatnot
> which I think is a bug how we handle closing the IR. As a side-note I think
> we should never reset the reference here to be honest.
> Along the same lines I think we need to fix the loop in
> IndexReader#notifyReaderClosedListeners() to make sure we call all of them in
> the case any of them throws an exception. It also seems that
> SegmentCoreReaders#decRef() has a similar problem where for instance a
> fieldsReader can throw an exception on close and we never call the core
> listeners.
> IMO we need to fix this for 4.7.1
--
This message was sent by Atlassian JIRA
(v6.2#6252)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]