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 2014/04/18 15:08:40 UTC
svn commit: r1588459 - in /lucene/dev/trunk/lucene: CHANGES.txt
core/src/java/org/apache/lucene/index/SegmentCommitInfo.java
core/src/java/org/apache/lucene/index/SegmentInfos.java
Author: mikemccand
Date: Fri Apr 18 13:08:40 2014
New Revision: 1588459
URL: http://svn.apache.org/r1588459
Log:
LUCENE-5615: catch invalid per-segment delete counts when writing the segment
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1588459&r1=1588458&r2=1588459&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Fri Apr 18 13:08:40 2014
@@ -293,6 +293,9 @@ Bug fixes
* SOLR-5983: HTMLStripCharFilter is treating CDATA sections incorrectly.
(Dan Funk, Steve Rowe)
+* LUCENE-5615: Validate per-segment delete counts at write time, to
+ help catch bugs that might otherwise cause corruption (Mike McCandless)
+
Test Framework
* LUCENE-5592: Incorrectly reported uncloseable files. (Dawid Weiss)
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java?rev=1588459&r1=1588458&r2=1588459&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java Fri Apr 18 13:08:40 2014
@@ -224,8 +224,10 @@ public class SegmentCommitInfo {
}
void setDelCount(int delCount) {
+ if (delCount < 0 || delCount > info.getDocCount()) {
+ throw new IllegalArgumentException("invalid delCount=" + delCount + " (docCount=" + info.getDocCount() + ")");
+ }
this.delCount = delCount;
- assert delCount <= info.getDocCount();
}
/** Returns a description of this segment. */
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=1588459&r1=1588458&r2=1588459&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 Fri Apr 18 13:08:40 2014
@@ -346,7 +346,7 @@ public final class SegmentInfos implemen
long delGen = input.readLong();
int delCount = input.readInt();
if (delCount < 0 || delCount > info.getDocCount()) {
- throw new CorruptIndexException("invalid deletion count: " + delCount + " (resource: " + input + ")");
+ throw new CorruptIndexException("invalid deletion count: " + delCount + " vs docCount=" + info.getDocCount() + " (resource: " + input + ")");
}
long fieldInfosGen = -1;
if (format >= VERSION_46) {
@@ -438,7 +438,11 @@ public final class SegmentInfos implemen
segnOutput.writeString(si.name);
segnOutput.writeString(si.getCodec().getName());
segnOutput.writeLong(siPerCommit.getDelGen());
- segnOutput.writeInt(siPerCommit.getDelCount());
+ int delCount = siPerCommit.getDelCount();
+ if (delCount < 0 || delCount > si.getDocCount()) {
+ throw new IllegalStateException("cannot write segment: invalid docCount segment=" + si.name + " docCount=" + si.getDocCount() + " delCount=" + delCount);
+ }
+ segnOutput.writeInt(delCount);
segnOutput.writeLong(siPerCommit.getFieldInfosGen());
final Map<Long,Set<String>> genUpdatesFiles = siPerCommit.getUpdatesFiles();
segnOutput.writeInt(genUpdatesFiles.size());
@@ -447,8 +451,6 @@ public final class SegmentInfos implemen
segnOutput.writeStringSet(e.getValue());
}
assert si.dir == directory;
-
- assert siPerCommit.getDelCount() <= si.getDocCount();
}
segnOutput.writeStringStringMap(userData);
pendingSegnOutput = segnOutput;