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
This commit is contained in:
Simon Willnauer 2013-10-01 12:59:56 +00:00
parent 0a3ac487a1
commit 7fab2bdd38
3 changed files with 29 additions and 5 deletions

View File

@ -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() {

View File

@ -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");
}

View File

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