📄 testindexwriter.java
字号:
fail(testName + ": method did not throw exception but docFreq('aaa') is " + result + " instead of expected " + START_COUNT + " [autoCommit = false]"); } } else { // On hitting exception we still may have added // all docs: if (result != START_COUNT && result != END_COUNT) { err.printStackTrace(System.out); fail(testName + ": method did throw exception but docFreq('aaa') is " + result + " instead of expected " + START_COUNT + " or " + END_COUNT); } } searcher = new IndexSearcher(reader); try { hits = searcher.search(new TermQuery(searchTerm)); } catch (IOException e) { e.printStackTrace(System.out); fail(testName + ": exception when searching: " + e); } int result2 = hits.length(); if (success) { if (result2 != result) { fail(testName + ": method did not throw exception but hits.length for search on term 'aaa' is " + result2 + " instead of expected " + result); } } else { // On hitting exception we still may have added // all docs: if (result2 != result) { err.printStackTrace(System.out); fail(testName + ": method did throw exception but hits.length for search on term 'aaa' is " + result2 + " instead of expected " + result); } } searcher.close(); reader.close(); if (debug) { System.out.println(" count is " + result); } if (done || result == END_COUNT) { break; } } if (debug) { System.out.println(" start disk = " + startDiskUsage + "; input disk = " + inputDiskUsage + "; max used = " + dir.getMaxUsedSizeInBytes()); } if (done) { // Javadocs state that temp free Directory space // required is at most 2X total input size of // indices so let's make sure: assertTrue("max free Directory space required exceeded 1X the total input index sizes during " + methodName + ": max temp usage = " + (dir.getMaxUsedSizeInBytes()-startDiskUsage) + " bytes; " + "starting disk usage = " + startDiskUsage + " bytes; " + "input index disk usage = " + inputDiskUsage + " bytes", (dir.getMaxUsedSizeInBytes()-startDiskUsage) < 2*(startDiskUsage + inputDiskUsage)); } writer.close(); dir.close(); // Try again with 2000 more bytes of free space: diskFree += 2000; } } startDir.close(); } /* * Make sure IndexWriter cleans up on hitting a disk * full exception in addDocument. */ public void testAddDocumentOnDiskFull() throws IOException { for(int pass=0;pass<3;pass++) { boolean autoCommit = pass == 0; boolean doAbort = pass == 2; long diskFree = 200; while(true) { MockRAMDirectory dir = new MockRAMDirectory(); dir.setMaxSizeInBytes(diskFree); IndexWriter writer = new IndexWriter(dir, autoCommit, new WhitespaceAnalyzer(), true); boolean hitError = false; try { for(int i=0;i<200;i++) { addDoc(writer); } } catch (IOException e) { // e.printStackTrace(); hitError = true; } if (hitError) { if (doAbort) { writer.abort(); } else { try { writer.close(); } catch (IOException e) { // e.printStackTrace(); dir.setMaxSizeInBytes(0); writer.close(); } } assertNoUnreferencedFiles(dir, "after disk full during addDocument with autoCommit=" + autoCommit); // Make sure reader can open the index: IndexReader.open(dir).close(); dir.close(); // Now try again w/ more space: diskFree += 500; } else { dir.close(); break; } } } } public void assertNoUnreferencedFiles(Directory dir, String message) throws IOException { String[] startFiles = dir.list(); SegmentInfos infos = new SegmentInfos(); infos.read(dir); IndexFileDeleter d = new IndexFileDeleter(dir, new KeepOnlyLastCommitDeletionPolicy(), infos, null); String[] endFiles = dir.list(); Arrays.sort(startFiles); Arrays.sort(endFiles); if (!Arrays.equals(startFiles, endFiles)) { fail(message + ": before delete:\n " + arrayToString(startFiles) + "\n after delete:\n " + arrayToString(endFiles)); } } /** * Make sure optimize doesn't use any more than 1X * starting index size as its temporary free space * required. */ public void testOptimizeTempSpaceUsage() throws IOException { MockRAMDirectory dir = new MockRAMDirectory(); IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); for(int j=0;j<500;j++) { addDocWithIndex(writer, j); } writer.close(); long startDiskUsage = 0; String[] files = dir.list(); for(int i=0;i<files.length;i++) { startDiskUsage += dir.fileLength(files[i]); } dir.resetMaxUsedSizeInBytes(); writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false); writer.optimize(); writer.close(); long maxDiskUsage = dir.getMaxUsedSizeInBytes(); assertTrue("optimized used too much temporary space: starting usage was " + startDiskUsage + " bytes; max temp usage was " + maxDiskUsage + " but should have been " + (2*startDiskUsage) + " (= 2X starting usage)", maxDiskUsage <= 2*startDiskUsage); dir.close(); } private String arrayToString(String[] l) { String s = ""; for(int i=0;i<l.length;i++) { if (i > 0) { s += "\n "; } s += l[i]; } return s; } // Make sure we can open an index for create even when a // reader holds it open (this fails pre lock-less // commits on windows): public void testCreateWithReader() throws IOException { String tempDir = System.getProperty("java.io.tmpdir"); if (tempDir == null) throw new IOException("java.io.tmpdir undefined, cannot run test"); File indexDir = new File(tempDir, "lucenetestindexwriter"); try { Directory dir = FSDirectory.getDirectory(indexDir); // add one document & close writer IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); addDoc(writer); writer.close(); // now open reader: IndexReader reader = IndexReader.open(dir); assertEquals("should be one document", reader.numDocs(), 1); // now open index for create: writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); assertEquals("should be zero documents", writer.docCount(), 0); addDoc(writer); writer.close(); assertEquals("should be one document", reader.numDocs(), 1); IndexReader reader2 = IndexReader.open(dir); assertEquals("should be one document", reader2.numDocs(), 1); reader.close(); reader2.close(); } finally { rmDir(indexDir); } } // Same test as above, but use IndexWriter constructor // that takes File: public void testCreateWithReader2() throws IOException { String tempDir = System.getProperty("java.io.tmpdir"); if (tempDir == null) throw new IOException("java.io.tmpdir undefined, cannot run test"); File indexDir = new File(tempDir, "lucenetestindexwriter"); try { // add one document & close writer IndexWriter writer = new IndexWriter(indexDir, new WhitespaceAnalyzer(), true); addDoc(writer); writer.close(); // now open reader: IndexReader reader = IndexReader.open(indexDir); assertEquals("should be one document", reader.numDocs(), 1); // now open index for create: writer = new IndexWriter(indexDir, new WhitespaceAnalyzer(), true); assertEquals("should be zero documents", writer.docCount(), 0); addDoc(writer); writer.close(); assertEquals("should be one document", reader.numDocs(), 1); IndexReader reader2 = IndexReader.open(indexDir); assertEquals("should be one document", reader2.numDocs(), 1); reader.close(); reader2.close(); } finally { rmDir(indexDir); } } // Same test as above, but use IndexWriter constructor // that takes String: public void testCreateWithReader3() throws IOException { String tempDir = System.getProperty("tempDir"); if (tempDir == null) throw new IOException("java.io.tmpdir undefined, cannot run test"); String dirName = tempDir + "/lucenetestindexwriter"; try { // add one document & close writer IndexWriter writer = new IndexWriter(dirName, new WhitespaceAnalyzer(), true); addDoc(writer); writer.close(); // now open reader: IndexReader reader = IndexReader.open(dirName); assertEquals("should be one document", reader.numDocs(), 1); // now open index for create: writer = new IndexWriter(dirName, new WhitespaceAnalyzer(), true); assertEquals("should be zero documents", writer.docCount(), 0); addDoc(writer); writer.close(); assertEquals("should be one document", reader.numDocs(), 1); IndexReader reader2 = IndexReader.open(dirName); assertEquals("should be one document", reader2.numDocs(), 1); reader.close(); reader2.close(); } finally { rmDir(new File(dirName)); } } // Simulate a writer that crashed while writing segments // file: make sure we can still open the index (ie, // gracefully fallback to the previous segments file), // and that we can add to the index: public void testSimulatedCrashedWriter() throws IOException { Directory dir = new RAMDirectory(); IndexWriter writer = null; writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); // add 100 documents for (int i = 0; i < 100; i++) { addDoc(writer); } // close writer.close(); long gen = SegmentInfos.getCurrentSegmentGeneration(dir); assertTrue("segment generation should be > 1 but got " + gen, gen > 1); // Make the next segments file, with last byte // missing, to simulate a writer that crashed while // writing segments file: String fileNameIn = SegmentInfos.getCurrentSegmentFileName(dir); String fileNameOut = IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", 1+gen); IndexInput in = dir.openInput(fileNameIn); IndexOutput out = dir.createOutput(fileNameOut); long length = in.length(); for(int i=0;i<length-1;i++) { out.writeByte(in.readByte()); } in.close(); out.close(); IndexReader reader = null; try { reader = IndexReader.open(dir); } catch (Exception e) { fail("reader failed to open on a crashed index"); } reader.close(); try { writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); } catch (Exception e) { fail("writer failed to open on a crashed index"); } // add 100 documents for (int i = 0; i < 100; i++) { addDoc(writer); } // close writer.close(); } // Simulate a corrupt index by removing last byte of // latest segments file and make sure we get an // IOException trying to open the index: public void testSimulatedCorruptIndex1() throws IOException {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -