You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2011/11/01 20:03:04 UTC

svn commit: r1196211 - in /lucene/dev/trunk/lucene/src: java/org/apache/lucene/index/DocumentsWriter.java java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java

Author: simonw
Date: Tue Nov  1 19:03:04 2011
New Revision: 1196211

URL: http://svn.apache.org/viewvc?rev=1196211&view=rev
Log:
LUCENE-3546: IW#nrtIsCurrent retruns true if changes are in del queue but not in bufferedDeleteStream yet

Modified:
    lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java
    lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
    lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java

Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java?rev=1196211&r1=1196210&r2=1196211&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java Tue Nov  1 19:03:04 2011
@@ -578,6 +578,7 @@ final class DocumentsWriter {
         }
         applyFlushTickets();
       }
+      assert !flushingDeleteQueue.anyChanges();
     } finally {
       assert flushingDeleteQueue == currentFullFlushDelQueue;
     }

Modified: lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java?rev=1196211&r1=1196210&r2=1196211&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java (original)
+++ lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java Tue Nov  1 19:03:04 2011
@@ -169,7 +169,13 @@ final class DocumentsWriterDeleteQueue {
   boolean anyChanges() {
     globalBufferLock.lock();
     try {
-      return !globalSlice.isEmpty() || globalBufferedDeletes.any();
+      /*
+       * check if all items in the global slice were applied 
+       * and if the global slice is up-to-date
+       * and if globalBufferedDeletes has changes
+       */
+      return globalBufferedDeletes.any() || !globalSlice.isEmpty() || globalSlice.sliceTail != tail
+          || tail.next != null;
     } finally {
       globalBufferLock.unlock();
     }

Modified: lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java?rev=1196211&r1=1196210&r2=1196211&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java (original)
+++ lucene/dev/trunk/lucene/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java Tue Nov  1 19:03:04 2011
@@ -16,10 +16,12 @@ package org.apache.lucene.index;
  * License for the specific language governing permissions and limitations under
  * the License.
  */
+import java.lang.reflect.Field;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.lucene.index.DocumentsWriterDeleteQueue.DeleteSlice;
 import org.apache.lucene.search.TermQuery;
@@ -142,6 +144,32 @@ public class TestDocumentsWriterDeleteQu
       }
     }
   }
+  
+  public void testPartiallyAppliedGlobalSlice() throws SecurityException,
+      NoSuchFieldException, IllegalArgumentException, IllegalAccessException,
+      InterruptedException {
+    final DocumentsWriterDeleteQueue queue = new DocumentsWriterDeleteQueue();
+    Field field = DocumentsWriterDeleteQueue.class
+        .getDeclaredField("globalBufferLock");
+    field.setAccessible(true);
+    ReentrantLock lock = (ReentrantLock) field.get(queue);
+    lock.lock();
+    Thread t = new Thread() {
+      public void run() {
+        queue.addDelete(new Term("foo", "bar"));
+      }
+    };
+    t.start();
+    t.join();
+    lock.unlock();
+    assertTrue("changes in del queue but not in slice yet", queue.anyChanges());
+    queue.tryApplyGlobalSlice();
+    assertTrue("changes in global buffer", queue.anyChanges());
+    FrozenBufferedDeletes freezeGlobalBuffer = queue.freezeGlobalBuffer(null);
+    assertTrue(freezeGlobalBuffer.any());
+    assertEquals(1, freezeGlobalBuffer.termCount);
+    assertFalse("all changes applied", queue.anyChanges());
+  }
 
   public void testStressDeleteQueue() throws InterruptedException {
     DocumentsWriterDeleteQueue queue = new DocumentsWriterDeleteQueue();