pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / src / test / org / apache / lucene / index / TestIndexWriterForceMerge.java
1 package org.apache.lucene.index;
2
3 /**
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
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  */
19
20 import java.io.IOException;
21
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;
31
32 public class TestIndexWriterForceMerge extends LuceneTestCase {
33   public void testPartialMerge() throws IOException {
34
35     MockDirectoryWrapper dir = newDirectory();
36
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(
47             ldmp));
48       for(int j=0;j<numDocs;j++)
49         writer.addDocument(doc);
50       writer.close();
51
52       SegmentInfos sis = new SegmentInfos();
53       sis.read(dir);
54       final int segCount = sis.size();
55
56       ldmp = new LogDocMergePolicy();
57       ldmp.setMergeFactor(5);
58       writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT,
59         new MockAnalyzer(random)).setMergePolicy(ldmp));
60       writer.forceMerge(3);
61       writer.close();
62
63       sis = new SegmentInfos();
64       sis.read(dir);
65       final int optSegCount = sis.size();
66
67       if (segCount < 3)
68         assertEquals(segCount, optSegCount);
69       else
70         assertEquals(3, optSegCount);
71     }
72     dir.close();
73   }
74
75   public void testMaxNumSegments2() throws IOException {
76     MockDirectoryWrapper dir = newDirectory();
77
78     final Document doc = new Document();
79     doc.add(newField("content", "aaa", Store.NO, Index.NOT_ANALYZED));
80
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()));
87
88     for(int iter=0;iter<10;iter++) {
89       for(int i=0;i<19;i++)
90         writer.addDocument(doc);
91
92       writer.commit();
93       writer.waitForMerges();
94       writer.commit();
95
96       SegmentInfos sis = new SegmentInfos();
97       sis.read(dir);
98
99       final int segCount = sis.size();
100
101       writer.forceMerge(7);
102       writer.commit();
103       writer.waitForMerges();
104
105       sis = new SegmentInfos();
106       sis.read(dir);
107       final int optSegCount = sis.size();
108
109       if (segCount < 7)
110         assertEquals(segCount, optSegCount);
111       else
112         assertEquals(7, optSegCount);
113     }
114     writer.close();
115     dir.close();
116   }
117
118   /**
119    * Make sure forceMerge doesn't use any more than 1X
120    * starting index size as its temporary free space
121    * required.
122    */
123   public void testForceMergeTempSpaceUsage() throws IOException {
124
125     MockDirectoryWrapper dir = newDirectory();
126     IndexWriter writer  = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random)).setMaxBufferedDocs(10).setMergePolicy(newLogMergePolicy()));
127     if (VERBOSE) {
128       System.out.println("TEST: config1=" + writer.getConfig());
129     }
130
131     for(int j=0;j<500;j++) {
132       TestIndexWriter.addDocWithIndex(writer, j);
133     }
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
137     writer.commit();
138     TestIndexWriter.addDocWithIndex(writer, 500);
139     writer.close();
140
141     if (VERBOSE) {
142       System.out.println("TEST: start disk usage");
143     }
144     long startDiskUsage = 0;
145     String[] files = dir.listAll();
146     for(int i=0;i<files.length;i++) {
147       startDiskUsage += dir.fileLength(files[i]);
148       if (VERBOSE) {
149         System.out.println(files[i] + ": " + dir.fileLength(files[i]));
150       }
151     }
152
153     dir.resetMaxUsedSizeInBytes();
154     dir.setTrackDiskUsage(true);
155
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);
161     writer.close();
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);
165     dir.close();
166   }
167   
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 {
172
173     Directory dir = newDirectory();
174     for(int pass=0;pass<2;pass++) {
175       IndexWriter writer = new IndexWriter(
176           dir,
177           newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random)).
178               setOpenMode(OpenMode.CREATE).
179               setMaxBufferedDocs(2).
180               setMergePolicy(newLogMergePolicy(51))
181       );
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);
187
188       if (0 == pass) {
189         writer.close();
190         IndexReader reader = IndexReader.open(dir, true);
191         assertEquals(1, reader.getSequentialSubReaders().length);
192         reader.close();
193       } else {
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);
198         writer.close();
199
200         IndexReader reader = IndexReader.open(dir, true);
201         assertTrue(reader.getSequentialSubReaders().length > 1);
202         reader.close();
203
204         SegmentInfos infos = new SegmentInfos();
205         infos.read(dir);
206         assertEquals(2, infos.size());
207       }
208     }
209
210     dir.close();
211   }
212 }