Index: lucene/src/java/org/apache/lucene/index/LogMergePolicy.java =================================================================== --- lucene/src/java/org/apache/lucene/index/LogMergePolicy.java (revision 1102053) +++ lucene/src/java/org/apache/lucene/index/LogMergePolicy.java (working copy) @@ -254,12 +254,12 @@ // unless there is only 1 which is optimized. if (last - start - 1 > 1 || (start != last - 1 && !isOptimized(infos.info(start + 1)))) { // there is more than 1 segment to the right of this one, or an unoptimized single segment. - spec.add(new OneMerge(infos.range(start + 1, last))); + spec.add(new OneMerge(infos.subList(start + 1, last))); } last = start; } else if (last - start == mergeFactor) { // mergeFactor eligible segments were found, add them as a merge. - spec.add(new OneMerge(infos.range(start, last))); + spec.add(new OneMerge(infos.subList(start, last))); last = start; } --start; @@ -267,7 +267,7 @@ // Add any left-over segments, unless there is just 1 already optimized. if (last > 0 && (++start + 1 < last || !isOptimized(infos.info(start)))) { - spec.add(new OneMerge(infos.range(start, last))); + spec.add(new OneMerge(infos.subList(start, last))); } return spec.merges.size() == 0 ? null : spec; @@ -284,7 +284,7 @@ // First, enroll all "full" merges (size // mergeFactor) to potentially be run concurrently: while (last - maxNumSegments + 1 >= mergeFactor) { - spec.add(new OneMerge(infos.range(last - mergeFactor, last))); + spec.add(new OneMerge(infos.subList(last - mergeFactor, last))); last -= mergeFactor; } @@ -296,7 +296,7 @@ // Since we must optimize down to 1 segment, the // choice is simple: if (last > 1 || !isOptimized(infos.info(0))) { - spec.add(new OneMerge(infos.range(0, last))); + spec.add(new OneMerge(infos.subList(0, last))); } } else if (last > maxNumSegments) { @@ -325,7 +325,7 @@ } } - spec.add(new OneMerge(infos.range(bestStart, bestStart + finalMergeSize))); + spec.add(new OneMerge(infos.subList(bestStart, bestStart + finalMergeSize))); } } return spec.merges.size() == 0 ? null : spec; @@ -434,7 +434,7 @@ // deletions, so force a merge now: if (verbose()) message(" add merge " + firstSegmentWithDeletions + " to " + (i-1) + " inclusive"); - spec.add(new OneMerge(segmentInfos.range(firstSegmentWithDeletions, i))); + spec.add(new OneMerge(segmentInfos.subList(firstSegmentWithDeletions, i))); firstSegmentWithDeletions = i; } } else if (firstSegmentWithDeletions != -1) { @@ -443,7 +443,7 @@ // mergeFactor segments if (verbose()) message(" add merge " + firstSegmentWithDeletions + " to " + (i-1) + " inclusive"); - spec.add(new OneMerge(segmentInfos.range(firstSegmentWithDeletions, i))); + spec.add(new OneMerge(segmentInfos.subList(firstSegmentWithDeletions, i))); firstSegmentWithDeletions = -1; } } @@ -451,7 +451,7 @@ if (firstSegmentWithDeletions != -1) { if (verbose()) message(" add merge " + firstSegmentWithDeletions + " to " + (numSegments-1) + " inclusive"); - spec.add(new OneMerge(segmentInfos.range(firstSegmentWithDeletions, numSegments))); + spec.add(new OneMerge(segmentInfos.subList(firstSegmentWithDeletions, numSegments))); } return spec; Index: lucene/src/java/org/apache/lucene/index/MergePolicy.java =================================================================== --- lucene/src/java/org/apache/lucene/index/MergePolicy.java (revision 1102053) +++ lucene/src/java/org/apache/lucene/index/MergePolicy.java (working copy) @@ -84,7 +84,8 @@ public OneMerge(List segments) { if (0 == segments.size()) throw new RuntimeException("segments must include at least one segment"); - this.segments = segments; + // clone the list, as the in list may be based off original SegmentInfos and may be modified + this.segments = new ArrayList(segments); int count = 0; for(SegmentInfo info : segments) { count += info.docCount; Index: lucene/src/java/org/apache/lucene/index/SegmentInfos.java =================================================================== --- lucene/src/java/org/apache/lucene/index/SegmentInfos.java (revision 1102053) +++ lucene/src/java/org/apache/lucene/index/SegmentInfos.java (working copy) @@ -20,13 +20,14 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; -import java.util.Vector; import org.apache.lucene.index.FieldInfos.FieldNumberBiMap; import org.apache.lucene.index.codecs.CodecProvider; @@ -45,7 +46,7 @@ * * @lucene.experimental */ -public final class SegmentInfos extends Vector { +public final class SegmentInfos extends ArrayList { /* * The file format version, a negative number. @@ -742,18 +743,6 @@ protected abstract Object doBody(String segmentFileName) throws CorruptIndexException, IOException; } - /** - * Returns a new SegmentInfos containing the SegmentInfo - * instances in the specified range first (inclusive) to - * last (exclusive), so total number of segments returned - * is last-first. - */ - public SegmentInfos range(int first, int last) { - SegmentInfos infos = new SegmentInfos(codecs); - infos.addAll(super.subList(first, last)); - return infos; - } - // Carry over generation numbers from another SegmentInfos void updateGeneration(SegmentInfos other) { lastGeneration = other.lastGeneration; Index: lucene/src/test-framework/org/apache/lucene/index/MockRandomMergePolicy.java =================================================================== --- lucene/src/test-framework/org/apache/lucene/index/MockRandomMergePolicy.java (revision 1102053) +++ lucene/src/test-framework/org/apache/lucene/index/MockRandomMergePolicy.java (working copy) @@ -49,7 +49,7 @@ // TODO: sometimes make more than 1 merge? mergeSpec = new MergeSpecification(); final int segsToMerge = _TestUtil.nextInt(random, 1, segmentInfos.size()); - mergeSpec.add(new OneMerge(segmentInfos2.range(0, segsToMerge))); + mergeSpec.add(new OneMerge(segmentInfos2.subList(0, segsToMerge))); } return mergeSpec;