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

Reply via email to