blob: bf58e5370185ab1edf1992404859fecdd99f1bdf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.index;
import java.nio.file.Path;
import org.apache.lucene.analysis.MockAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.MockDirectoryWrapper;
import org.apache.lucene.util.LuceneTestCase;
public class TestIndexSplitter extends LuceneTestCase {
public void test() throws Exception {
Path dir = createTempDir(LuceneTestCase.getTestClass().getSimpleName());
Path destDir = createTempDir(LuceneTestCase.getTestClass().getSimpleName());
Directory fsDir = newFSDirectory(dir);
// IndexSplitter.split makes its own commit directly with SIPC/SegmentInfos,
// so the unreferenced files are expected.
if (fsDir instanceof MockDirectoryWrapper) {
((MockDirectoryWrapper)fsDir).setAssertNoUnrefencedFilesOnClose(false);
}
MergePolicy mergePolicy = new LogByteSizeMergePolicy();
mergePolicy.setNoCFSRatio(1.0);
mergePolicy.setMaxCFSSegmentSizeMB(Double.POSITIVE_INFINITY);
IndexWriter iw = new IndexWriter(
fsDir,
new IndexWriterConfig(new MockAnalyzer(random())).
setOpenMode(OpenMode.CREATE).
setMergePolicy(mergePolicy)
);
for (int x=0; x < 100; x++) {
Document doc = DocHelper.createDocument(x, "index", 5);
iw.addDocument(doc);
}
iw.commit();
for (int x=100; x < 150; x++) {
Document doc = DocHelper.createDocument(x, "index2", 5);
iw.addDocument(doc);
}
iw.commit();
for (int x=150; x < 200; x++) {
Document doc = DocHelper.createDocument(x, "index3", 5);
iw.addDocument(doc);
}
iw.commit();
DirectoryReader iwReader = iw.getReader();
assertEquals(3, iwReader.leaves().size());
iwReader.close();
iw.close();
// we should have 2 segments now
IndexSplitter is = new IndexSplitter(dir);
String splitSegName = is.infos.info(1).info.name;
is.split(destDir, new String[] {splitSegName});
Directory fsDirDest = newFSDirectory(destDir);
DirectoryReader r = DirectoryReader.open(fsDirDest);
assertEquals(50, r.maxDoc());
r.close();
fsDirDest.close();
// now test cmdline
Path destDir2 = createTempDir(LuceneTestCase.getTestClass().getSimpleName());
IndexSplitter.main(new String[] {dir.toAbsolutePath().toString(), destDir2.toAbsolutePath().toString(), splitSegName});
Directory fsDirDest2 = newFSDirectory(destDir2);
SegmentInfos sis = SegmentInfos.readLatestCommit(fsDirDest2);
assertEquals(1, sis.size());
r = DirectoryReader.open(fsDirDest2);
assertEquals(50, r.maxDoc());
r.close();
fsDirDest2.close();
// now remove the copied segment from src
IndexSplitter.main(new String[] {dir.toAbsolutePath().toString(), "-d", splitSegName});
r = DirectoryReader.open(fsDir);
assertEquals(2, r.leaves().size());
r.close();
fsDir.close();
}
}