You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2015/05/28 20:11:48 UTC
svn commit: r1682296 - in /lucene/dev/trunk: lucene/
lucene/core/src/java/org/apache/lucene/index/
lucene/core/src/test/org/apache/lucene/index/
solr/core/src/test/org/apache/solr/search/
Author: mikemccand
Date: Thu May 28 18:11:48 2015
New Revision: 1682296
URL: http://svn.apache.org/r1682296
Log:
LUCENE-6505: NRT readers now reflect prior commit metadata
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSearcherReuse.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1682296&r1=1682295&r2=1682296&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Thu May 28 18:11:48 2015
@@ -218,6 +218,9 @@ Bug Fixes
documents with no payloads and now returns an empty BytesRef instead
(Marius Grama via Michael McCandless)
+* LUCENE-6505: NRT readers now reflect segments_N filename and commit
+ user data from previous commits (Mike McCandless)
+
API Changes
* LUCENE-6377: SearcherFactory#newSearcher now accepts the previous reader
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java?rev=1682296&r1=1682295&r2=1682296&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java Thu May 28 18:11:48 2015
@@ -2880,10 +2880,17 @@ public class IndexWriter implements Clos
// we committed, if anything goes wrong after this, we are screwed and it's a tragedy:
commitCompleted = true;
+ if (infoStream.isEnabled("IW")) {
+ infoStream.message("IW", "commit: done writing segments file \"" + committedSegmentsFileName + "\"");
+ }
+
// NOTE: don't use this.checkpoint() here, because
// we do not want to increment changeCount:
deleter.checkpoint(pendingCommit, true);
+ // Carry over generation to our master SegmentInfos:
+ segmentInfos.updateGeneration(pendingCommit);
+
lastCommitChangeCount = pendingCommitChangeCount;
rollbackSegments = pendingCommit.createBackupSegmentInfos();
@@ -2922,7 +2929,6 @@ public class IndexWriter implements Clos
}
if (infoStream.isEnabled("IW")) {
- infoStream.message("IW", "commit: wrote segments file \"" + committedSegmentsFileName + "\"");
infoStream.message("IW", String.format(Locale.ROOT, "commit: took %.1f msec", (System.nanoTime()-startCommitTime)/1000000.0));
infoStream.message("IW", "commit: done");
}
@@ -4297,6 +4303,10 @@ public class IndexWriter implements Clos
// (this method unwinds everything it did on
// an exception)
toSync.prepareCommit(directory);
+ if (infoStream.isEnabled("IW")) {
+ infoStream.message("IW", "startCommit: wrote pending segments file \"" + IndexFileNames.fileNameFromGeneration(IndexFileNames.PENDING_SEGMENTS, "", toSync.getGeneration()) + "\"");
+ }
+
//System.out.println("DONE prepareCommit");
pendingCommitSet = true;
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java?rev=1682296&r1=1682295&r2=1682296&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java Thu May 28 18:11:48 2015
@@ -757,6 +757,8 @@ public final class SegmentInfos implemen
} else {
userData = data;
}
+
+ changed();
}
/** Replaces all segments in this instance, but keeps
Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java?rev=1682296&r1=1682295&r2=1682296&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java Thu May 28 18:11:48 2015
@@ -28,6 +28,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -2721,5 +2722,103 @@ public class TestIndexWriter extends Luc
r.close();
dir.close();
}
+
+ // LUCENE-6505
+ public void testNRTSegmentsFile() throws Exception {
+ Directory dir = newDirectory();
+ IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random()));
+ IndexWriter w = new IndexWriter(dir, iwc);
+ // creates segments_1
+ w.commit();
+
+ // newly opened NRT reader should see gen=1 segments file
+ DirectoryReader r = DirectoryReader.open(w, true);
+ assertEquals(1, r.getIndexCommit().getGeneration());
+ assertEquals("segments_1", r.getIndexCommit().getSegmentsFileName());
+
+ // newly opened non-NRT reader should see gen=1 segments file
+ DirectoryReader r2 = DirectoryReader.open(dir);
+ assertEquals(1, r2.getIndexCommit().getGeneration());
+ assertEquals("segments_1", r2.getIndexCommit().getSegmentsFileName());
+ r2.close();
+
+ // make a change and another commit
+ w.addDocument(new Document());
+ w.commit();
+ DirectoryReader r3 = DirectoryReader.openIfChanged(r);
+ r.close();
+ assertNotNull(r3);
+
+ // reopened NRT reader should see gen=2 segments file
+ assertEquals(2, r3.getIndexCommit().getGeneration());
+ assertEquals("segments_2", r3.getIndexCommit().getSegmentsFileName());
+ r3.close();
+
+ // newly opened non-NRT reader should see gen=2 segments file
+ DirectoryReader r4 = DirectoryReader.open(dir);
+ assertEquals(2, r4.getIndexCommit().getGeneration());
+ assertEquals("segments_2", r4.getIndexCommit().getSegmentsFileName());
+ r4.close();
+
+ w.close();
+ dir.close();
+ }
+
+ // LUCENE-6505
+ public void testNRTAfterCommit() throws Exception {
+ Directory dir = newDirectory();
+ IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random()));
+ IndexWriter w = new IndexWriter(dir, iwc);
+ w.commit();
+
+ w.addDocument(new Document());
+ DirectoryReader r = DirectoryReader.open(w, true);
+ w.commit();
+
+ // commit even with no other changes counts as a "change" that NRT reader reopen will see:
+ DirectoryReader r2 = DirectoryReader.open(dir);
+ assertNotNull(r2);
+ assertEquals(2, r2.getIndexCommit().getGeneration());
+ assertEquals("segments_2", r2.getIndexCommit().getSegmentsFileName());
+
+ IOUtils.close(r, r2, w, dir);
+ }
+
+ // LUCENE-6505
+ public void testNRTAfterSetUserDataWithoutCommit() throws Exception {
+ Directory dir = newDirectory();
+ IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random()));
+ IndexWriter w = new IndexWriter(dir, iwc);
+ w.commit();
+
+ DirectoryReader r = DirectoryReader.open(w, true);
+ Map<String,String> m = new HashMap<>();
+ m.put("foo", "bar");
+ w.setCommitData(m);
+
+ // setCommitData with no other changes should count as an NRT change:
+ DirectoryReader r2 = DirectoryReader.openIfChanged(r);
+ assertNotNull(r2);
+
+ IOUtils.close(r2, r, w, dir);
+ }
+
+ // LUCENE-6505
+ public void testNRTAfterSetUserDataWithCommit() throws Exception {
+ Directory dir = newDirectory();
+ IndexWriterConfig iwc = new IndexWriterConfig(new MockAnalyzer(random()));
+ IndexWriter w = new IndexWriter(dir, iwc);
+ w.commit();
+
+ DirectoryReader r = DirectoryReader.open(w, true);
+ Map<String,String> m = new HashMap<>();
+ m.put("foo", "bar");
+ w.setCommitData(m);
+ w.commit();
+ // setCommitData and also commit, with no other changes, should count as an NRT change:
+ DirectoryReader r2 = DirectoryReader.openIfChanged(r);
+ assertNotNull(r2);
+ IOUtils.close(r, r2, w, dir);
+ }
}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSearcherReuse.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSearcherReuse.java?rev=1682296&r1=1682295&r2=1682296&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSearcherReuse.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestSearcherReuse.java Thu May 28 18:11:48 2015
@@ -117,7 +117,7 @@ public class TestSearcherReuse extends S
assertSearcherHasNotChanged(expectedSearcher);
assertU(delI("0")); // no doc has this id, yet
- assertU(commit());
+ assertU(commit("softCommit","true"));
assertSearcherHasNotChanged(expectedSearcher);
} finally {