From 1c208440f36fc88003b6bdfd546fee6ad3b535a5 Mon Sep 17 00:00:00 2001 From: Michael McCandless Date: Fri, 18 Apr 2014 13:08:40 +0000 Subject: [PATCH] LUCENE-5615: catch invalid per-segment delete counts when writing the segment git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1588459 13f79535-47bb-0310-9956-ffa450edef68 --- lucene/CHANGES.txt | 3 +++ .../org/apache/lucene/index/SegmentCommitInfo.java | 4 +++- .../src/java/org/apache/lucene/index/SegmentInfos.java | 10 ++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 4203ca6f092..2b6059e9916 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -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) diff --git a/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java b/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java index 9b437a2a69e..8b20e9de014 100644 --- a/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java +++ b/lucene/core/src/java/org/apache/lucene/index/SegmentCommitInfo.java @@ -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. */ diff --git a/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java b/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java index 82a9d756d9a..353c91b45a1 100644 --- a/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java +++ b/lucene/core/src/java/org/apache/lucene/index/SegmentInfos.java @@ -346,7 +346,7 @@ public final class SegmentInfos implements Cloneable, Iterable 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 implements Cloneable, Iterable 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> genUpdatesFiles = siPerCommit.getUpdatesFiles(); segnOutput.writeInt(genUpdatesFiles.size()); @@ -447,8 +451,6 @@ public final class SegmentInfos implements Cloneable, Iterable