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();