Michael,

The exception only occurs when the writer commits. But but the IndexReader can 
keep on reading.
The searches are performed by the IndexSearcher using the IndexReader.
My filesystem is ext2fs.

I give a few details below about the way I use them; the FNF exception occurs 
in the "commitIndexWriter" method.

Thanks,
Tom


// both reader and writer and static
protected static IndexWriter mAdIndexWriter=null;
protected static IndexReader mAdIndexReader=null;
// misc
protected static IndexSearcher mAdIndexSearcher=null;
protected static Analyzer mAdIndexAnalyser=null;


// create the writer once
private void initIndexWriter() throws EncheromaxException {
    Directory adIndexDir=null;
    
    // Where is the index ?
    String 
indexLocation=mConfigProperties.getProperty(PropertiesEnum.ADVERTISEMENT_INDEX_LOCATION);   
         

    // Get the ad's analyser
    Analyzer analyser = getAdvertisementIndexAnalyser(); 
    
    // create the writer
    if(mAdIndexWriter==null){
        try{
            adIndexDir=FSDirectory.getDirectory(indexLocation);                 
            boolean isTheIndexNew=true;                
            mAdIndexWriter = new IndexWriter(adIndexDir, 
analyser,isTheIndexNew,IndexWriter.MaxFieldLength. UNLIMITED) ; 
            
            /* ... */    
        }catch(Exception ex){
            /*...*/
        }
    }    
}    


// get the reader 
private IndexReader getAdvertisementIndexReader() throws EncheromaxException {
    String indexLocation=null;
    Directory adIndexDir=null;
    
    // Where is the index ?
    try{
        
indexLocation=mConfigProperties.getProperty(PropertiesEnum.ADVERTISEMENT_INDEX_LOCATION);   
 
        adIndexDir=FSDirectory.getDirectory(indexLocation);
    }catch(Exception direx){
        /*...*/
    }
    
    // create the reader if it doesn't exist yet
    if(mAdIndexReader==null){
        try{
            mAdIndexReader= IndexReader.open(adIndexDir);             
        }catch(Exception ex){
            /*..*/
        }
    }else{                    
        try{
            /* do we need to re-open it ? */
            if(mAdIndexReader.isCurrent()==false){
                // synchronize on the reader
                synchronized(mAdIndexReader){
                    mAdIndexReader= IndexReader.open(adIndexDir);
                }
            }
        }catch(Exception ioex){
            /*...*/
            throw new 
EncheromaxException(CommonErrorEnum.INDEX_READER_CREATION_ERROR);
        }            
    }
    return mAdIndexReader;
}


// get the searcher when I want to search
private IndexSearcher getAdvertisementIndexSearcher() throws 
EncheromaxException {
    // create the searcher if it doesn't exist yet
    try{
        if(mAdIndexSearcher==null){
            try{
                mAdIndexSearcher= new 
IndexSearcher(getAdvertisementIndexReader()); 
                
            }catch(Exception ex){
                /*...*/
            }
        }

        else if(!mAdIndexSearcher.getIndexReader().isCurrent()){
            synchronized(mAdIndexSearcher){
                mAdIndexSearcher=new 
IndexSearcher(getAdvertisementIndexReader());
            }
        }
    }catch(Exception ioex){
        /*...*/
    }    
    return mAdIndexSearcher;
}



// whenever I need to commit
public synchronized void commitIndexWriter() throws EncheromaxException{
    try{        
        mAdIndexWriter.commit();    
            
    }catch(Exception docex){            
        /* THE FILE NOT FOUND EXCEPTION OCCURS HERE */
    }
}


// add a document
private void addADocument(Document adDoc) throws EncheromaxException{
    try{
        mAdIndexWriter.addDocument(adDoc, getAdvertisementIndexAnalyser());
        commitIndexWriter();    
            
    }catch(Exception docex){            
        /*...*/
    }
}


--- En date de : Ven 8.1.10, Michael McCandless <luc...@mikemccandless.com> a 
écrit :

De: Michael McCandless <luc...@mikemccandless.com>
Objet: Re: Concurrent access IndexReader / IndexWriter -  FileNotFoundException
À: java-user@lucene.apache.org
Date: Vendredi 8 Janvier 2010, 13h00

Normally, this (using an IndexReader, [re-]opening a new IndexReader
while an IndexWriter is committing) is perfectly fine.  The reader
searches the point-in-time snapshot of the index as of when it was
opened.

But: what filesystem are you using?  NFS presents challenges, for example.

Mike

On Fri, Jan 8, 2010 at 5:35 AM, legrand thomas <thomaslegran...@yahoo.fr> wrote:
> Hi,
>
> I often get a FileNotFoundException when my single IndexWriter commits while 
> the IndexReader also tries to read. My application is multithreaded (Tomcat 
> uses the business APIs); I firstly thought the read/write access was 
> thread-safe but I probably forget something.
>
>  Please help me to understand my mistakes:
>
> - When should I close the IndexWriter ? Each time I add/update a document or 
> never ?
> - Should my java commit/read methods be synchronized ?
> - Should I lock the directory and what's the best way to do it ?
>
> I referred to the Lucene FAQ ("why do I sometimes get a FileNotFoundException 
> when I search and update my index at the same time?") but I did not disable 
> any locking for processes searching or updating the index.
>
> I use lucene-2.4.1.
>
> Thanks in advance,
> Tom
>
>
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-user-h...@lucene.apache.org




      

Reply via email to