RE: Index Locked For Write

2002-02-25 Thread Hayes, Mark

I am not a Lucene expert but I would like to understand the threading issues
also, and I'm wondering if the following is true when using Lucene in a
multithreaded application.

I understand there are three modes for using IndexReader and IndexWriter:

A- IndexReader for reading only, not deleting
B- IndexReader for deleting (and reading)
C- IndexWriter (for adding and optimizing)

Any number of readers may be used concurrently in mode A.  But for B and C
the reader or writer may not be kept open for long periods.  Write
operations create a lock, and closing the reader or writer is the only way
to release the lock.  In theory a single writer could be kept open, but its
lock will prevent deletions (which are performed with a separate reader).

Therefore for B and C each set of changes should be made inside a
synchronized block where the reader or writer is opened and closed.  This
prevents multiple writers (or readers used for deleting) from being open at
once.  The synchronization should be done on an object that identifies a
particular index, e.g., on a global object if there is only one index.  For
example:

class myindex {
  static final Object INDEX_LOCK = new Object();
  void delete(int[] docs) {
synchronized (INDEX_LOCK) {
  IndexReader reader = IndexReader.open(...);
  try {
for (int i = 0; i  docs.length; i++) {
  reader.delete(docs[i]);
}
  } finally {
reader.close();
  }
}
  }
  void add(Document[] docs) {
synchronized (INDEX_LOCK) {
  IndexWriter writer = new IndexWriter(...);
  try {
for (int i = 0; i  docs.length; i++) {
  writer.add(docs[i]);
}
writer.optimize();
  } finally {
writer.close();
  }
}  
  }
}

Of course there are other techniques for global locking such as 'static
synchronized' methods.  Locking on a separate object per index is the
general case (where multiple indexes are present).

Is this correct?  Or should Lucene be waiting on the write lock instead of
throwing an exception?
mark

 -Original Message-
 From: Otis Gospodnetic [mailto:[EMAIL PROTECTED]]
 Sent: Sunday, February 24, 2002 9:22 PM
 To: Lucene Users List
 Subject: RE: Index Locked For Write
 
 
 
 --- Howk, Michael [EMAIL PROTECTED] wrote:
  Out of curiosity, why didn't we need to close the writer in rc2 or
  rc3?
  
  When you suggest a synchronized keyword, are you suggesting that
  the
  writer is not inherently thread-safe? Do we need to write our own
  thread
  management on top of Lucene?
 
 Sorry, that might have been a wrong suggestion, IndexWriter (at least
 the add method) is supposed to be thread safe.
 
 Otis
 
 
  -Original Message-
  From: Otis Gospodnetic [mailto:[EMAIL PROTECTED]]
  Sent: Thursday, February 21, 2002 4:07 PM
  To: Lucene Users List
  Subject: RE: Index Locked For Write
  
  
  You could use synchronized keyword and use IndexReader.isLocked() or
  something like that, no?
  
  Otis
  
  --- Howk, Michael [EMAIL PROTECTED] wrote:
   Thank you for your quick responses. But in our application, we're
   working in
   a transactional environment where multiple threads are accessing a
   single
   writer using the recommended singleton pattern. Since no 
 thread has
   exclusive access to the writer, how can we have one thread
   arbitrarily
   decide to close the writer?
   
   Michael
   
   -Original Message-
   From: Mark Tucker [mailto:[EMAIL PROTECTED]]
   Sent: Thursday, February 21, 2002 3:51 PM
   To: Lucene Users List
   Subject: RE: Index Locked For Write
   
   
   You forgot to close your writer after the call to optimize.
   
   -Original Message-
   From: Howk, Michael [mailto:[EMAIL PROTECTED]]
   Sent: Thursday, February 21, 2002 2:49 PM
   To: Lucene Mailing List (E-mail)
   Subject: Index Locked For Write
   
   
   We just got the newest daily build (to try to fix some NullPointer
   errors
   with ? and _ characters), and we're getting the same problem
  that
   Daniel
   Calvo mentioned: Index Locked for Write. Here's basically what our
   code is
   doing:
 IndexWriter writer = new IndexWriter(path, 
 analyzer, create);
 try {
 Document doc = new Document();
 doc.add(Field.Keyword(DOC_ID, 14));
 doc.add(Field.UnStored(ANY, mushu));
 writer.addDocument(doc);
 writer.optimize();
   
 // Search the document for our keyword
 {   
 IndexReader reader = IndexReader.open(path);
 IndexSearcher searcher = new IndexSearcher(reader);
 Vector returnStuff = searcher.search(mushu);
 }
   
 // Verify that we got one record back
 assertNotNull(returnStuff);
 assertEquals(1, returnStuff.size());
 }
 finally {
 // Clean up after ourselves
 IndexReader reader = IndexReader.open(path

RE: Index Locked For Write

2002-02-24 Thread Otis Gospodnetic


--- Howk, Michael [EMAIL PROTECTED] wrote:
 Out of curiosity, why didn't we need to close the writer in rc2 or
 rc3?
 
 When you suggest a synchronized keyword, are you suggesting that
 the
 writer is not inherently thread-safe? Do we need to write our own
 thread
 management on top of Lucene?

Sorry, that might have been a wrong suggestion, IndexWriter (at least
the add method) is supposed to be thread safe.

Otis


 -Original Message-
 From: Otis Gospodnetic [mailto:[EMAIL PROTECTED]]
 Sent: Thursday, February 21, 2002 4:07 PM
 To: Lucene Users List
 Subject: RE: Index Locked For Write
 
 
 You could use synchronized keyword and use IndexReader.isLocked() or
 something like that, no?
 
 Otis
 
 --- Howk, Michael [EMAIL PROTECTED] wrote:
  Thank you for your quick responses. But in our application, we're
  working in
  a transactional environment where multiple threads are accessing a
  single
  writer using the recommended singleton pattern. Since no thread has
  exclusive access to the writer, how can we have one thread
  arbitrarily
  decide to close the writer?
  
  Michael
  
  -Original Message-
  From: Mark Tucker [mailto:[EMAIL PROTECTED]]
  Sent: Thursday, February 21, 2002 3:51 PM
  To: Lucene Users List
  Subject: RE: Index Locked For Write
  
  
  You forgot to close your writer after the call to optimize.
  
  -Original Message-
  From: Howk, Michael [mailto:[EMAIL PROTECTED]]
  Sent: Thursday, February 21, 2002 2:49 PM
  To: Lucene Mailing List (E-mail)
  Subject: Index Locked For Write
  
  
  We just got the newest daily build (to try to fix some NullPointer
  errors
  with ? and _ characters), and we're getting the same problem
 that
  Daniel
  Calvo mentioned: Index Locked for Write. Here's basically what our
  code is
  doing:
IndexWriter writer = new IndexWriter(path, analyzer, create);
  try {
  Document doc = new Document();
  doc.add(Field.Keyword(DOC_ID, 14));
doc.add(Field.UnStored(ANY, mushu));
writer.addDocument(doc);
writer.optimize();
  
// Search the document for our keyword
{   
IndexReader reader = IndexReader.open(path);
IndexSearcher searcher = new IndexSearcher(reader);
Vector returnStuff = searcher.search(mushu);
}
  
// Verify that we got one record back
assertNotNull(returnStuff);
assertEquals(1, returnStuff.size());
}
finally {
// Clean up after ourselves
IndexReader reader = IndexReader.open(path);
reader.delete(new Term(DOC_ID, 14));
reader.close();
}
  
  And the exception we're getting on the reader.delete line in the
  finally
  clause:
  
  java.io.IOException: Index locked for write:
  Lock@C:\devtools\JBossTomcat\jboss\indexes\marc\write.lock at
 

sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteC
  all.java:245) at
 

sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:220)
  at
  sun.rmi.server.UnicastRef.invoke(UnicastRef.java:122) at
 

org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker_Stub.invoke(Unknown
  Source) at
 

org.jboss.ejb.plugins.jrmp.interfaces.GenericProxy.invokeContainer(GenericPr
  oxy.java:357) at
 

org.jboss.ejb.plugins.jrmp.interfaces.StatelessSessionProxy.invoke(Stateless
  SessionProxy.java:123) at
  $Proxy5.deleteDocument(Unknown Source)
  
  Are we using the right approach? Any suggestions? Thank you.
  
  Michael Howk
  
  --
  To unsubscribe, e-mail:
  mailto:[EMAIL PROTECTED]
  For additional commands, e-mail:
  mailto:[EMAIL PROTECTED]
  
  
  --
  To unsubscribe, e-mail:
  mailto:[EMAIL PROTECTED]
  For additional commands, e-mail:
  mailto:[EMAIL PROTECTED]
  
  --
  To unsubscribe, e-mail:  
  mailto:[EMAIL PROTECTED]
  For additional commands, e-mail:
  mailto:[EMAIL PROTECTED]
  
 
 
 __
 Do You Yahoo!?
 Yahoo! Sports - Coverage of the 2002 Olympic Games
 http://sports.yahoo.com
 
 --
 To unsubscribe, e-mail:
 mailto:[EMAIL PROTECTED]
 For additional commands, e-mail:
 mailto:[EMAIL PROTECTED]
 
 --
 To unsubscribe, e-mail:  
 mailto:[EMAIL PROTECTED]
 For additional commands, e-mail:
 mailto:[EMAIL PROTECTED]
 


__
Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games
http://sports.yahoo.com

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