[ 
https://issues.apache.org/jira/browse/LUCENE-1314?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12608039#action_12608039
 ] 

Jason Rutherglen commented on LUCENE-1314:
------------------------------------------

Here is the code of the SegmentReader subclass.  Using the clone terminology 
would work as well, inside of SegmentReader the clone would most likely reuse 
SegmentReader.reopenSegment.  The subclass turns off locking by overriding 
acquireWriteLock and having it do nothing.  I do not know a general fix for the 
locking issue mentioned "it holds a lock and then you can't do deletions in the 
second object".  Perhaps there is a way using lock less commits.  It is 
possible to have SegmentReader implement if deletes occur to an earlier 
IndexReader and a flush is tried it fails, rather than fail in a newer 
IndexReader like it would now.  This would require keeping track of later 
IndexReaders which is something Ocean does outside of IndexReader.  

As far as the FieldsReader, given how many SegmentReaders Ocean creates (up to 
one per update), a shallow clone threadlocal would still potentially create 
many file descriptors.  I would rather see a synchronized FieldsReader, or 
simply use the approach in the code below.  The external lock used seems ok 
because there is little competition for reading Documents, no more than normal 
a Lucene application using a single IndexReader loading documents for N 
results.  

{code}
public class OceanSegmentReader extends SegmentReader {
  protected ReentrantLock fieldsReaderLock;
  
  public OceanSegmentReader() {
    openNewFieldsReader = false;
  }
  
  protected void doInitialize() {
    fieldsReaderLock = new ReentrantLock();
  }
  
  protected void acquireWriteLock() throws IOException {
  }
  
  protected synchronized DirectoryIndexReader doReopen(SegmentInfos infos, 
boolean force) throws CorruptIndexException, IOException {
    OceanSegmentReader segmentReader = 
(OceanSegmentReader)super.doReopen(infos, force);
    segmentReader.fieldsReaderLock = fieldsReaderLock;
    return segmentReader;
  }
  
  /**
   * @throws CorruptIndexException
   *           if the index is corrupt
   * @throws IOException
   *           if there is a low-level IO error
   */
  public synchronized Document document(int n, FieldSelector fieldSelector) 
throws CorruptIndexException, IOException {
    ensureOpen();
    if (isDeleted(n))
      throw new IllegalArgumentException("attempt to access a deleted 
document");
    fieldsReaderLock.lock();
    try {
      return getFieldsReader().doc(n, fieldSelector);
    } finally {
      fieldsReaderLock.unlock();
    }
  }
}
{code}

> IndexReader.reopen(boolean force)
> ---------------------------------
>
>                 Key: LUCENE-1314
>                 URL: https://issues.apache.org/jira/browse/LUCENE-1314
>             Project: Lucene - Java
>          Issue Type: New Feature
>          Components: Index
>    Affects Versions: 2.3.1
>            Reporter: Jason Rutherglen
>            Assignee: Michael McCandless
>            Priority: Minor
>         Attachments: lucene-1314.patch, lucene-1314.patch, lucene-1314.patch
>
>
> Based on discussion 
> http://www.nabble.com/IndexReader.reopen-issue-td18070256.html.  The problem 
> is reopen returns the same reader if there are no changes, so if docs are 
> deleted from the new reader, they are also reflected in the previous reader 
> which is not always desired behavior.

-- 
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to