From 7fab2bdd384d5a993b03269e930b60e870a7a71c Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Tue, 1 Oct 2013 12:59:56 +0000 Subject: [PATCH] LUCENE-5189: Check if deletes need to be applied when docvalues are updated and process IW event if needed git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1528076 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/lucene/index/DocumentsWriter.java | 6 ++--- .../org/apache/lucene/index/IndexWriter.java | 4 +++- .../index/TestNumericDocValuesUpdates.java | 24 +++++++++++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java b/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java index 9ff75cee304..def6f1276b2 100644 --- a/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java +++ b/lucene/core/src/java/org/apache/lucene/index/DocumentsWriter.java @@ -158,13 +158,11 @@ final class DocumentsWriter { return applyAllDeletes( deleteQueue); } - synchronized void updateNumericDocValue(Term term, String field, Long value) throws IOException { + synchronized boolean updateNumericDocValue(Term term, String field, Long value) throws IOException { final DocumentsWriterDeleteQueue deleteQueue = this.deleteQueue; deleteQueue.addNumericUpdate(new NumericUpdate(term, field, value)); flushControl.doOnDelete(); - if (flushControl.doApplyAllDeletes()) { - applyAllDeletes(deleteQueue); - } + return applyAllDeletes(deleteQueue); } DocumentsWriterDeleteQueue currentDeleteSession() { diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java index 411740bb770..182bfd8922a 100644 --- a/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java +++ b/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java @@ -1550,7 +1550,9 @@ public class IndexWriter implements Closeable, TwoPhaseCommit{ throw new IllegalArgumentException("can only update existing numeric-docvalues fields!"); } try { - docWriter.updateNumericDocValue(term, field, value); + if (docWriter.updateNumericDocValue(term, field, value)) { + processEvents(true, false); + } } catch (OutOfMemoryError oom) { handleOOM(oom, "updateNumericDocValue"); } diff --git a/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java b/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java index 0211663a85f..14f9056db09 100644 --- a/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java +++ b/lucene/core/src/test/org/apache/lucene/index/TestNumericDocValuesUpdates.java @@ -8,6 +8,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; import org.apache.lucene.analysis.MockAnalyzer; +import org.apache.lucene.analysis.MockTokenizer; import org.apache.lucene.codecs.Codec; import org.apache.lucene.codecs.DocValuesFormat; import org.apache.lucene.codecs.asserting.AssertingDocValuesFormat; @@ -63,6 +64,29 @@ public class TestNumericDocValuesUpdates extends LuceneTestCase { return doc; } + @Test + public void testUpdatesAreFlushed() throws IOException { + Directory dir = newDirectory(); + IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig( + TEST_VERSION_CURRENT, new MockAnalyzer(random(), MockTokenizer.WHITESPACE, false)).setRAMBufferSizeMB(0.00000001)); + writer.addDocument(doc(0)); // val=1 + writer.addDocument(doc(1)); // val=2 + writer.addDocument(doc(3)); // val=2 + writer.commit(); + assertEquals(1, writer.getFlushDeletesCount()); + writer.updateNumericDocValue(new Term("id", "doc-0"), "val", 5L); + assertEquals(2, writer.getFlushDeletesCount()); + writer.updateNumericDocValue(new Term("id", "doc-1"), "val", 6L); + assertEquals(3, writer.getFlushDeletesCount()); + writer.updateNumericDocValue(new Term("id", "doc-2"), "val", 7L); + assertEquals(4, writer.getFlushDeletesCount()); + writer.getConfig().setRAMBufferSizeMB(1000d); + writer.updateNumericDocValue(new Term("id", "doc-2"), "val", 7L); + assertEquals(4, writer.getFlushDeletesCount()); + writer.close(); + dir.close(); + } + @Test public void testSimple() throws Exception { Directory dir = newDirectory();