Hi, experts, 

I am new to Lucene. I am trying to fix bugs in
existing code. I read Lucene final 1.3 Doc (some of
API) and searched the related thread on the mailing
list archive. But I still couldn't solve problem even
though I know 
the problem might be related to synchronization
issues. Typically I encountered 3 types of problem:
couldn't delete, file not found, lock obtain timeout.
Here are some exception stacks: (Sorry for the long
post.)
java.io.IOException: couldn't delete _17.fdt
        at
org.apache.lucene.store.FSDirectory.create(FSDirectory.java:166)
        at
org.apache.lucene.store.FSDirectory.<init>(FSDirectory.java:151)
        at
org.apache.lucene.store.FSDirectory.getDirectory(FSDirectory.java:132)
        at
org.apache.lucene.store.FSDirectory.getDirectory(FSDirectory.java:113)
        at
org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:151)
        at
com.panva.lucene.ProfileIndexer.<init>(ProfileIndexer.java:47)
        at
com.panva.lucene.ProfileDBIndexer.createIndex(ProfileDBIndexer.java:67)
        at
com.panva.lucene.MainIndexScheduler.createMainSearchIndex(MainIndexScheduler.java:99)
        at
com.panva.lucene.MainIndexScheduler.run(MainIndexScheduler.java:60)

java.io.FileNotFoundException:
C:\lucenesource\index\_17.f1 (The system cannot find
the file specified)
        at java.io.RandomAccessFile.open(Native
Method)
        at
java.io.RandomAccessFile.<init>(RandomAccessFile.java:200)
        at
org.apache.lucene.store.FSInputStream$Descriptor.<init>(FSDirectory.java:389)
        at
org.apache.lucene.store.FSInputStream.<init>(FSDirectory.java:418)
        at
org.apache.lucene.store.FSDirectory.openFile(FSDirectory.java:291)
        at
org.apache.lucene.index.SegmentReader.openNorms(SegmentReader.java:388)
        at
org.apache.lucene.index.SegmentReader.<init>(SegmentReader.java:151)
        at
org.apache.lucene.index.IndexWriter.mergeSegments(IndexWriter.java:423)
        at
org.apache.lucene.index.IndexWriter.maybeMergeSegments(IndexWriter.java:401)
        at
org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:260)
        at
org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:244)
        at
com.panva.lucene.ProfileIndexer.addProfile(ProfileIndexer.java:89)
        at
com.panva.lucene.ProfileDBIndexer.createIndex(ProfileDBIndexer.java:72)
        at
com.panva.lucene.MainIndexScheduler.createMainSearchIndex(MainIndexScheduler.java:99)
        at
com.panva.lucene.MainIndexScheduler.run(MainIndexScheduler.java:60)

java.io.IOException: Lock obtain timed out
        at
org.apache.lucene.store.Lock.obtain(Lock.java:97)
        at
org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:173)
        at
org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:151)
        at
com.panva.lucene.ProfileIndexer.<init>(ProfileIndexer.java:47)
        at
com.panva.lucene.ProfileDBIndexer.createIndex(ProfileDBIndexer.java:67)
        at
com.panva.lucene.IndexScheduler.createRealTimeSearchIndex(IndexScheduler.java:103)
        at
com.panva.lucene.IndexScheduler.run(IndexScheduler.java:63)


In my application, mutilple threads are writing and
searching. Here is the code snippet (not complete, but
should be enough):

// ProfileDBIndexer.java
public class ProfileDBIndexer
{

  public static void createIndex(String path, String
sqlStmt) throws Throwable
  {  // blah, blah
    try
    {
      // DB code
      rs = stmt.executeQuery(sqlStmt);

      indexer = new ProfileIndexer(path, true);

      while (rs.next())
      {

        Profile profile = getProfileFromResultSet(rs);
        indexer.addProfile(profile);  // if I do
synchronize(indexer) here and use writer.close() in
tbe following addProfile() method,
NullPointerException is thrown. Looks like    
writeLock.release() in close() of IndexWriter throws
this. 
        noOfRecordsProcessed++ ;
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    finally
    {
     // close DB connection
    }
  }
}

// ProfileIndexer.java
public class ProfileIndexer {
  IndexWriter writer;

  public ProfileIndexer(String path, boolean create)
throws IOException {
    Analyzer analyzer = new AlphanumStopAnalyzer();
    writer = new IndexWriter(path, analyzer, create);
  }

  public void addProfile(Profile profile) throws
IOException {
   Document document = new Document();

    document.add(Field.Keyword("Username",
profile.getUsername()));
    ...... //many document.add() here

    writer.addDocument(document);
    // writer.optimize();
    // writer.close();
 }
}


In the thread class, the following method is called
frequently:
ProfileDBIndexer.createIndex( indexPath, indexQuery )
;

In my application, index searcher is driven by client
request, not multi-threaded, it doesn't delete index
file, and no synchronization is used.

I tried to use synchronization for some methods, but
it didn't work out. I know I didn't realize the real
problem. I am lost.

Could you help me or give any suggestion?  Thanks a
lot in advance!

Ardor Wei

__________________________________
Do you Yahoo!?
Yahoo! Hotjobs: Enter the "Signing Bonus" Sweepstakes
http://hotjobs.sweepstakes.yahoo.com/signingbonus

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to