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