Hi,
In replaceActiveReader() method of SharedReaderProvider.java, we always do
reader = IndexReader.open( directoryProvider.getDirectory() );
in case of new reader & also old reader.
Ideally if outOfDateReader is not null, we should do reader.reopen() instead of opening a reader again.
plz correct me if I am wrong.
private IndexReader replaceActiveReader(IndexReader outOfDateReader, Lock directoryProviderLock, DirectoryProvider directoryProvider, IndexReader[] readers) { boolean trace = log.isTraceEnabled(); IndexReader oldReader; boolean closeOldReader = false; boolean closeOutOfDateReader = false; IndexReader reader; /** * Since out of lock protection, can have multiple readers created in // * not worse than NotShared and limit the locking time, hence scalability */ try { reader = IndexReader.open( directoryProvider.getDirectory() ); } catch (IOException e) { throw new SearchException( "Unable to open Lucene IndexReader", e ); } directoryProviderLock.lock(); try { //since not protected by a lock, other ones can have been added oldReader = activeSearchIndexReaders.put( directoryProvider, reader ); semaphoreIndexReaderLock.lock(); try { searchIndexReaderSemaphores.put( reader, new ReaderData( 1, directoryProvider ) ); if ( trace ) log.trace( "Semaphore: 1 for " + reader ); if ( outOfDateReader != null ) { ReaderData readerData = searchIndexReaderSemaphores.get( outOfDateReader ); if ( readerData == null ) { closeOutOfDateReader = false; //already removed by another prevous thread } else if ( readerData.semaphore == 0 ) { searchIndexReaderSemaphores.remove( outOfDateReader ); closeOutOfDateReader = true; } else { closeOutOfDateReader = false; } }
if ( oldReader != null && oldReader != outOfDateReader ) { ReaderData readerData = searchIndexReaderSemaphores.get( oldReader ); if ( readerData == null ) { log.warn( "Semaphore should not be null" ); closeOldReader = true; //TODO should be true or false? } else if ( readerData.semaphore == 0 ) { searchIndexReaderSemaphores.remove( oldReader ); closeOldReader = true; } else { closeOldReader = false; } } } finally { semaphoreIndexReaderLock.unlock(); } } finally { directoryProviderLock.unlock(); } if ( closeOutOfDateReader ) { if ( trace ) log.trace( "Closing out of date IndexReader " + outOfDateReader ); try { outOfDateReader.close(); } catch (IOException e) { clean( new SearchException( "Unable to close Lucene IndexReader", e ), readers ); } } if ( closeOldReader ) { if ( trace ) log.trace( "Closing old IndexReader " + oldReader ); try { oldReader.close(); } catch (IOException e) { clean( new SearchException( "Unable to close Lucene IndexReader", e ), readers ); } } return reader; }
_________________ sourabh
|