On Montag 13 März 2006 22:24, Bill Janssen wrote:

> The default value isn't magic.  The appropriate value is
> context-specific.  I've got some people using Lucene on machines with
> slow disks, and we need to be able to increase the WRITE_LOCK_TIMEOUT
> to prevent entirely random lossage.

Here's a patch (I hope it gets through). Let me know if it's okay, I will 
commit it then.

Regards
 Daniel

-- 
http://www.danielnaber.de
Index: /home/dnaber/workspace/LuceneSVN/src/java/org/apache/lucene/index/IndexWriter.java
===================================================================
--- /home/dnaber/workspace/LuceneSVN/src/java/org/apache/lucene/index/IndexWriter.java	(revision 382146)
+++ /home/dnaber/workspace/LuceneSVN/src/java/org/apache/lucene/index/IndexWriter.java	(working copy)
@@ -63,6 +63,8 @@
    */
   public final static long WRITE_LOCK_TIMEOUT = 1000;
 
+  private long writeLockTimeout = WRITE_LOCK_TIMEOUT;
+
   /**
    * Default value is 10,000.
    */
@@ -68,6 +70,8 @@
    */
   public final static long COMMIT_LOCK_TIMEOUT = 10000;
 
+  private long commitLockTimeout = COMMIT_LOCK_TIMEOUT;
+
   public static final String WRITE_LOCK_NAME = "write.lock";
   public static final String COMMIT_LOCK_NAME = "commit.lock";
 
@@ -252,7 +256,7 @@
       analyzer = a;
 
       Lock writeLock = directory.makeLock(IndexWriter.WRITE_LOCK_NAME);
-      if (!writeLock.obtain(WRITE_LOCK_TIMEOUT)) // obtain write lock
+      if (!writeLock.obtain(writeLockTimeout)) // obtain write lock
         throw new IOException("Index locked for write: " + writeLock);
       this.writeLock = writeLock;                   // save it
 
@@ -257,7 +261,7 @@
       this.writeLock = writeLock;                   // save it
 
       synchronized (directory) {        // in- & inter-process sync
-        new Lock.With(directory.makeLock(IndexWriter.COMMIT_LOCK_NAME), COMMIT_LOCK_TIMEOUT) {
+        new Lock.With(directory.makeLock(IndexWriter.COMMIT_LOCK_NAME), commitLockTimeout) {
             public Object doBody() throws IOException {
               if (create)
                 segmentInfos.write(directory);
@@ -370,6 +374,23 @@
     return infoStream;
   }
 
+  
+  public void setCommitLockTimeout(long commitLockTimeout) {
+    this.commitLockTimeout = commitLockTimeout;
+  }
+
+  public long getCommitLockTimeout() {
+    return commitLockTimeout;
+  }
+
+  public void setWriteLockTimeout(long writeLockTimeout) {
+    this.writeLockTimeout = writeLockTimeout;
+  }
+
+  public long getWriteLockTimeout() {
+    return writeLockTimeout;
+  }
+
   /** Flushes all changes to an index and closes all associated files. */
   public synchronized void close() throws IOException {
     flushRamSegments();
@@ -585,7 +606,7 @@
         sReader.close();
 
     synchronized (directory) {			  // in- & inter-process sync
-      new Lock.With(directory.makeLock(COMMIT_LOCK_NAME), COMMIT_LOCK_TIMEOUT) {
+      new Lock.With(directory.makeLock(COMMIT_LOCK_NAME), commitLockTimeout) {
 	  public Object doBody() throws IOException {
 	    segmentInfos.write(directory);	  // commit changes
 	    deleteSegments(segmentsToDelete);  // delete now-unused segments
@@ -597,7 +618,7 @@
     if (useCompoundFile) {
       final Vector filesToDelete = merger.createCompoundFile(mergedName + ".tmp");
       synchronized (directory) { // in- & inter-process sync
-        new Lock.With(directory.makeLock(COMMIT_LOCK_NAME), COMMIT_LOCK_TIMEOUT) {
+        new Lock.With(directory.makeLock(COMMIT_LOCK_NAME), commitLockTimeout) {
           public Object doBody() throws IOException {
             // make compound file visible for SegmentReaders
             directory.renameFile(mergedName + ".tmp", mergedName + ".cfs");
@@ -693,7 +714,7 @@
     merger.closeReaders();
 
     synchronized (directory) {                 // in- & inter-process sync
-      new Lock.With(directory.makeLock(COMMIT_LOCK_NAME), COMMIT_LOCK_TIMEOUT) {
+      new Lock.With(directory.makeLock(COMMIT_LOCK_NAME), commitLockTimeout) {
           public Object doBody() throws IOException {
             segmentInfos.write(directory);     // commit before deleting
             deleteSegments(segmentsToDelete);  // delete now-unused segments
@@ -705,7 +726,7 @@
     if (useCompoundFile) {
       final Vector filesToDelete = merger.createCompoundFile(mergedName + ".tmp");
       synchronized (directory) { // in- & inter-process sync
-        new Lock.With(directory.makeLock(COMMIT_LOCK_NAME), COMMIT_LOCK_TIMEOUT) {
+        new Lock.With(directory.makeLock(COMMIT_LOCK_NAME), commitLockTimeout) {
           public Object doBody() throws IOException {
             // make compound file visible for SegmentReaders
             directory.renameFile(mergedName + ".tmp", mergedName + ".cfs");

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

Reply via email to