Index: src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java =================================================================== --- src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java (revision 956517) +++ src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java (working copy) @@ -606,6 +606,40 @@ } } + public void testDeleteByPercent() throws Exception { + // 1. alg definition (required in every "logic" test) + String algLines[] = { + "# ----- properties ", + "content.source=org.apache.lucene.benchmark.byTask.feeds.LineDocSource", + "docs.file=" + getReuters20LinesFile(), + "ram.flush.mb=-1", + "max.buffered=2", + "content.source.log.step=3", + "doc.term.vector=false", + "content.source.forever=false", + "directory=RAMDirectory", + "doc.stored=false", + "doc.tokenized=false", + "debug.level=1", + "# ----- alg ", + "CreateIndex", + "{ \"AddDocs\" AddDoc > : * ", + "CloseIndex()", + "OpenReader(false)", + "DeleteByPercent(20)", + "CloseReader" + }; + + // 2. execute the algorithm (required in every "logic" test) + Benchmark benchmark = execBenchmark(algLines); + + // 3. test number of docs in the index + IndexReader ir = IndexReader.open(benchmark.getRunData().getDirectory(), true); + int ndocsExpected = 16; // first 20 reuters docs, minus 20% + assertEquals("wrong number of docs in the index!", ndocsExpected, ir.numDocs()); + ir.close(); + } + /** * Test that we can set merge scheduler". */ Index: src/java/org/apache/lucene/benchmark/byTask/tasks/DeleteByPercentTask.java =================================================================== --- src/java/org/apache/lucene/benchmark/byTask/tasks/DeleteByPercentTask.java (revision 956517) +++ src/java/org/apache/lucene/benchmark/byTask/tasks/DeleteByPercentTask.java (working copy) @@ -77,10 +77,15 @@ Bits delDocs = MultiFields.getDeletedDocs(r); int doc = 0; while (doc < maxDoc && numDeleted < numToDelete) { - if (!delDocs.get(doc) && random.nextDouble() <= delRate) { + if ((delDocs == null || !delDocs.get(doc)) && random.nextDouble() <= delRate) { r.deleteDocument(doc); numDeleted++; + if (delDocs == null) { + delDocs = MultiFields.getDeletedDocs(r); + assert delDocs != null; + } } + doc++; } } System.out.println("--> processed (delete) " + numDeleted + " docs");