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/02/24 17:54:15 UTC
svn commit: r1662024 - in /lucene/dev/branches/lucene_solr_4_10/lucene:
CHANGES.txt core/src/java/org/apache/lucene/index/SegmentInfos.java
core/src/test/org/apache/lucene/index/TestBackwardsCompatibility3x.java
Author: mikemccand
Date: Tue Feb 24 16:54:14 2015
New Revision: 1662024
URL: http://svn.apache.org/r1662024
Log:
LUCENE-6279: don't let a leftover _N_upgraded.si file corrupt a 3.x index on first kiss from 4.x
Modified:
lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt
lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestBackwardsCompatibility3x.java
Modified: lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt?rev=1662024&r1=1662023&r2=1662024&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_4_10/lucene/CHANGES.txt Tue Feb 24 16:54:14 2015
@@ -26,6 +26,10 @@ Bug fixes
BlendedInfixSuggester for lookups that do not end in a prefix
token. (jane chang via Mike McCandless)
+* LUCENE-6279: Don't let an abusive leftover _N_upgraded.si in the
+ index directory cause index corruption on upgrade (Robert Muir, Mike
+ McCandless)
+
API Changes
* LUCENE-6212: Deprecate IndexWriter APIs that accept per-document Analyzer.
Modified: lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java?rev=1662024&r1=1662023&r2=1662024&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java (original)
+++ lucene/dev/branches/lucene_solr_4_10/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java Tue Feb 24 16:54:14 2015
@@ -566,6 +566,14 @@ public final class SegmentInfos implemen
private static boolean segmentWasUpgraded(Directory directory, SegmentInfo si) {
// Check marker file:
String markerFileName = IndexFileNames.segmentFileName(si.name, "upgraded", Lucene3xSegmentInfoFormat.UPGRADED_SI_EXTENSION);
+
+ // LUCENE-6279: don't rely solely on existence of the marker file; also require that we see the marker
+ // file in our si.files(), which means we did previously at least attempt to write it:
+ if (si.files().contains(markerFileName) == false) {
+ return false;
+ }
+
+ // Also verify the marker file exists and has the proper header:
IndexInput in = null;
try {
in = directory.openInput(markerFileName, IOContext.READONCE);
@@ -580,6 +588,7 @@ public final class SegmentInfos implemen
IOUtils.closeWhileHandlingException(in);
}
}
+
return false;
}
Modified: lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestBackwardsCompatibility3x.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestBackwardsCompatibility3x.java?rev=1662024&r1=1662023&r2=1662024&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestBackwardsCompatibility3x.java (original)
+++ lucene/dev/branches/lucene_solr_4_10/lucene/core/src/test/org/apache/lucene/index/TestBackwardsCompatibility3x.java Tue Feb 24 16:54:14 2015
@@ -29,6 +29,7 @@ import java.util.Map;
import java.util.Random;
import org.apache.lucene.analysis.MockAnalyzer;
+import org.apache.lucene.codecs.CodecUtil;
import org.apache.lucene.document.BinaryDocValuesField;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.DoubleDocValuesField;
@@ -53,6 +54,9 @@ import org.apache.lucene.search.TermQuer
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.BaseDirectoryWrapper;
import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.IOContext;
+import org.apache.lucene.store.IndexOutput;
+import org.apache.lucene.store.MockDirectoryWrapper;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
@@ -1015,4 +1019,25 @@ public class TestBackwardsCompatibility3
dir.close();
}
}
+
+ // LUCENE-6279
+ public void testLeftoverUpgradedFile() throws Exception {
+ Directory dir = newDirectory(random(), oldIndexDirs.get("362.cfs"));
+ if (dir instanceof MockDirectoryWrapper) {
+ // We intentionally double-write the upgrade marker file:
+ ((MockDirectoryWrapper) dir).setPreventDoubleWrite(false);
+ }
+ IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
+
+ // Create errant leftover file, after opening IW but before closing IW:
+ IndexOutput out = dir.createOutput("_0_upgraded.si", IOContext.DEFAULT);
+ CodecUtil.writeHeader(out, "SegmentInfo3xUpgrade", 0);
+ out.close();
+
+ writer.addDocument(new Document());
+ writer.close();
+
+ // Causes FNFE on _0.si during check index before the fix:
+ dir.close();
+ }
}