1 package org.apache.lucene.index;
4 * Licensed to the Apache Software Foundation (ASF) under one or more
5 * contributor license agreements. See the NOTICE file distributed with
6 * this work for additional information regarding copyright ownership.
7 * The ASF licenses this file to You under the Apache License, Version 2.0
8 * (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
20 import java.io.IOException;
22 import org.apache.lucene.analysis.MockAnalyzer;
23 import org.apache.lucene.document.Document;
24 import org.apache.lucene.document.Field.Index;
25 import org.apache.lucene.document.Field.Store;
26 import org.apache.lucene.index.IndexWriterConfig.OpenMode;
27 import org.apache.lucene.store.Directory;
28 import org.apache.lucene.store.MockDirectoryWrapper;
29 import org.apache.lucene.util.LuceneTestCase;
30 import org.apache.lucene.util._TestUtil;
32 public class TestIndexWriterForceMerge extends LuceneTestCase {
33 public void testPartialMerge() throws IOException {
35 MockDirectoryWrapper dir = newDirectory();
37 final Document doc = new Document();
38 doc.add(newField("content", "aaa", Store.NO, Index.NOT_ANALYZED));
39 final int incrMin = TEST_NIGHTLY ? 15 : 40;
40 for(int numDocs=10;numDocs<500;numDocs += _TestUtil.nextInt(random, incrMin, 5*incrMin)) {
41 LogDocMergePolicy ldmp = new LogDocMergePolicy();
42 ldmp.setMinMergeDocs(1);
43 ldmp.setMergeFactor(5);
44 IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(
45 TEST_VERSION_CURRENT, new MockAnalyzer(random))
46 .setOpenMode(OpenMode.CREATE).setMaxBufferedDocs(2).setMergePolicy(
48 for(int j=0;j<numDocs;j++)
49 writer.addDocument(doc);
52 SegmentInfos sis = new SegmentInfos();
54 final int segCount = sis.size();
56 ldmp = new LogDocMergePolicy();
57 ldmp.setMergeFactor(5);
58 writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT,
59 new MockAnalyzer(random)).setMergePolicy(ldmp));
63 sis = new SegmentInfos();
65 final int optSegCount = sis.size();
68 assertEquals(segCount, optSegCount);
70 assertEquals(3, optSegCount);
75 public void testMaxNumSegments2() throws IOException {
76 MockDirectoryWrapper dir = newDirectory();
78 final Document doc = new Document();
79 doc.add(newField("content", "aaa", Store.NO, Index.NOT_ANALYZED));
81 LogDocMergePolicy ldmp = new LogDocMergePolicy();
82 ldmp.setMinMergeDocs(1);
83 ldmp.setMergeFactor(4);
84 IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(
85 TEST_VERSION_CURRENT, new MockAnalyzer(random))
86 .setMaxBufferedDocs(2).setMergePolicy(ldmp).setMergeScheduler(new ConcurrentMergeScheduler()));
88 for(int iter=0;iter<10;iter++) {
90 writer.addDocument(doc);
93 writer.waitForMerges();
96 SegmentInfos sis = new SegmentInfos();
99 final int segCount = sis.size();
101 writer.forceMerge(7);
103 writer.waitForMerges();
105 sis = new SegmentInfos();
107 final int optSegCount = sis.size();
110 assertEquals(segCount, optSegCount);
112 assertEquals(7, optSegCount);
119 * Make sure forceMerge doesn't use any more than 1X
120 * starting index size as its temporary free space
123 public void testForceMergeTempSpaceUsage() throws IOException {
125 MockDirectoryWrapper dir = newDirectory();
126 IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random)).setMaxBufferedDocs(10).setMergePolicy(newLogMergePolicy()));
128 System.out.println("TEST: config1=" + writer.getConfig());
131 for(int j=0;j<500;j++) {
132 TestIndexWriter.addDocWithIndex(writer, j);
134 final int termIndexInterval = writer.getConfig().getTermIndexInterval();
135 // force one extra segment w/ different doc store so
136 // we see the doc stores get merged
138 TestIndexWriter.addDocWithIndex(writer, 500);
142 System.out.println("TEST: start disk usage");
144 long startDiskUsage = 0;
145 String[] files = dir.listAll();
146 for(int i=0;i<files.length;i++) {
147 startDiskUsage += dir.fileLength(files[i]);
149 System.out.println(files[i] + ": " + dir.fileLength(files[i]));
153 dir.resetMaxUsedSizeInBytes();
154 dir.setTrackDiskUsage(true);
156 // Import to use same term index interval else a
157 // smaller one here could increase the disk usage and
158 // cause a false failure:
159 writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random)).setOpenMode(OpenMode.APPEND).setTermIndexInterval(termIndexInterval).setMergePolicy(newLogMergePolicy()));
160 writer.forceMerge(1);
162 long maxDiskUsage = dir.getMaxUsedSizeInBytes();
163 assertTrue("forceMerge used too much temporary space: starting usage was " + startDiskUsage + " bytes; max temp usage was " + maxDiskUsage + " but should have been " + (4*startDiskUsage) + " (= 4X starting usage)",
164 maxDiskUsage <= 4*startDiskUsage);
168 // Test calling forceMerge(1, false) whereby forceMerge is kicked
169 // off but we don't wait for it to finish (but
170 // writer.close()) does wait
171 public void testBackgroundForceMerge() throws IOException {
173 Directory dir = newDirectory();
174 for(int pass=0;pass<2;pass++) {
175 IndexWriter writer = new IndexWriter(
177 newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)).
178 setOpenMode(OpenMode.CREATE).
179 setMaxBufferedDocs(2).
180 setMergePolicy(newLogMergePolicy(51))
182 Document doc = new Document();
183 doc.add(newField("field", "aaa", Store.NO, Index.NOT_ANALYZED));
184 for(int i=0;i<100;i++)
185 writer.addDocument(doc);
186 writer.forceMerge(1, false);
190 IndexReader reader = IndexReader.open(dir, true);
191 assertEquals(1, reader.getSequentialSubReaders().length);
194 // Get another segment to flush so we can verify it is
195 // NOT included in the merging
196 writer.addDocument(doc);
197 writer.addDocument(doc);
200 IndexReader reader = IndexReader.open(dir, true);
201 assertTrue(reader.getSequentialSubReaders().length > 1);
204 SegmentInfos infos = new SegmentInfos();
206 assertEquals(2, infos.size());