Hello! Same here, assertion fails on our hudson.
> On Wed, Aug 19, 2009 at 10:07 PM, Koji > Sekiguchi<k...@r.email.ne.jp> wrote: >> Noble, >> >> testExpungeDeletes fails: > oh . It passed twice in my box.is any one else noticing this failure? >> >> <failure message="null" type="junit.framework.AssertionFailedError"> >> junit.framework.AssertionFailedError: null >> at >> org.apache.solr.update.DirectUpdateHandlerTest.testExpungeDeletes(DirectUpdateHandlerTest.java:303) >> </failure> >> >> Koji >> >> no...@apache.org wrote: >>> >>> Author: noble >>> Date: Wed Aug 19 12:21:22 2009 >>> New Revision: 805774 >>> >>> URL: http://svn.apache.org/viewvc?rev=805774&view=rev >>> Log: >>> SOLR-1275: Add expungeDeletes to DirectUpdateHandler2 >>> >>> Modified: >>> lucene/solr/trunk/CHANGES.txt >>> >>> lucene/solr/trunk/src/common/org/apache/solr/common/params/UpdateParams.java >>> >>> lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java >>> lucene/solr/trunk/src/java/org/apache/solr/handler/XMLLoader.java >>> >>> lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java >>> >>> lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java >>> >>> lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java >>> >>> lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/request/UpdateRequest.java >>> >>> lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java >>> >>> Modified: lucene/solr/trunk/CHANGES.txt >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- lucene/solr/trunk/CHANGES.txt (original) >>> +++ lucene/solr/trunk/CHANGES.txt Wed Aug 19 12:21:22 2009 >>> @@ -267,7 +267,9 @@ >>> HTMLStripStandardTokenizerFactory deprecated. To strip HTML tags, >>> HTMLStripCharFilter can be used >>> with an arbitrary Tokenizer. (koji) >>> -68. SOLR-1367: Added callback mechanism for converting DocList to >>> SolrDocumentList in SolrPluginUtils (gsingers) +68. SOLR-1367: Added >>> callback mechanism for converting DocList to SolrDocumentList in >>> SolrPluginUtils (gsingers) >>> + >>> +68. SOLR-1275: Add expungeDeletes to DirectUpdateHandler2 (noble) >>> Optimizations >>> >>> Modified: >>> lucene/solr/trunk/src/common/org/apache/solr/common/params/UpdateParams.java >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/src/common/org/apache/solr/common/params/UpdateParams.java?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- >>> lucene/solr/trunk/src/common/org/apache/solr/common/params/UpdateParams.java >>> (original) >>> +++ >>> lucene/solr/trunk/src/common/org/apache/solr/common/params/UpdateParams.java >>> Wed Aug 19 12:21:22 2009 >>> @@ -49,4 +49,6 @@ >>> * If optimizing, set the maximum number of segments left in the index >>> after optimization. 1 is the default (and is equivalent to calling >>> IndexWriter.optimize() in Lucene). >>> */ >>> public static final String MAX_OPTIMIZE_SEGMENTS = "maxSegments"; >>> + >>> + public static final String EXPUNGE_DELETES = "expungeDeletes"; >>> } >>> >>> Modified: >>> lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- >>> lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java >>> (original) >>> +++ >>> lucene/solr/trunk/src/java/org/apache/solr/handler/RequestHandlerUtils.java >>> Wed Aug 19 12:21:22 2009 >>> @@ -68,6 +68,7 @@ >>> CommitUpdateCommand cmd = new CommitUpdateCommand( optimize ); >>> cmd.waitFlush = params.getBool( UpdateParams.WAIT_FLUSH, >>> cmd.waitFlush ); >>> cmd.waitSearcher = params.getBool( UpdateParams.WAIT_SEARCHER, >>> cmd.waitSearcher ); >>> + cmd.expungeDeletes = params.getBool( UpdateParams.EXPUNGE_DELETES, >>> cmd.expungeDeletes); >>> cmd.maxOptimizeSegments = >>> params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments); >>> req.getCore().getUpdateHandler().commit( cmd ); >>> @@ -101,6 +102,7 @@ >>> CommitUpdateCommand cmd = new CommitUpdateCommand( optimize ); >>> cmd.waitFlush = params.getBool( UpdateParams.WAIT_FLUSH, >>> cmd.waitFlush ); >>> cmd.waitSearcher = params.getBool( UpdateParams.WAIT_SEARCHER, >>> cmd.waitSearcher ); >>> + cmd.expungeDeletes = params.getBool( UpdateParams.EXPUNGE_DELETES, >>> cmd.expungeDeletes); cmd.maxOptimizeSegments = >>> params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments); >>> processor.processCommit( cmd ); >>> return true; >>> >>> Modified: >>> lucene/solr/trunk/src/java/org/apache/solr/handler/XMLLoader.java >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/XMLLoader.java?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- lucene/solr/trunk/src/java/org/apache/solr/handler/XMLLoader.java >>> (original) >>> +++ lucene/solr/trunk/src/java/org/apache/solr/handler/XMLLoader.java Wed >>> Aug 19 12:21:22 2009 >>> @@ -155,6 +155,8 @@ >>> sawWaitSearcher = true; >>> } else if >>> (UpdateParams.MAX_OPTIMIZE_SEGMENTS.equals(attrName)) { >>> cmd.maxOptimizeSegments = Integer.parseInt(attrVal); >>> + } else if (UpdateParams.EXPUNGE_DELETES.equals(attrName)) { >>> + cmd.expungeDeletes = StrUtils.parseBoolean(attrVal); >>> } else { >>> XmlUpdateRequestHandler.log.warn("unexpected attribute >>> commit/@" + attrName); >>> } >>> >>> Modified: >>> lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- >>> lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java >>> (original) >>> +++ >>> lucene/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java >>> Wed Aug 19 12:21:22 2009 >>> @@ -23,6 +23,7 @@ >>> public boolean optimize; >>> public boolean waitFlush; >>> public boolean waitSearcher=true; >>> + public boolean expungeDeletes = false; >>> /** >>> * During optimize, optimize down to <= this many segments. Must be >= >>> 1 >>> @@ -39,6 +40,7 @@ >>> return "commit(optimize="+optimize >>> +",waitFlush="+waitFlush >>> +",waitSearcher="+waitSearcher >>> + +",expungeDeletes="+expungeDeletes >>> +')'; >>> } >>> } >>> >>> Modified: >>> lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- >>> lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java >>> (original) >>> +++ >>> lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java >>> Wed Aug 19 12:21:22 2009 >>> @@ -241,9 +241,10 @@ >>> synchronized (this) { >>> pset.clear(); >>> closeSearcher(); // flush any deletes >>> - if (cmd.optimize) { >>> + if (cmd.optimize || cmd.expungeDeletes) { >>> openWriter(); // writer needs to be open to optimize >>> - writer.optimize(cmd.maxOptimizeSegments); >>> + if(cmd.optimize) writer.optimize(cmd.maxOptimizeSegments); >>> + if(cmd.expungeDeletes) writer.expungeDeletes(cmd.expungeDeletes); >>> } >>> closeWriter(); >>> >>> Modified: >>> lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- >>> lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java >>> (original) >>> +++ >>> lucene/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java >>> Wed Aug 19 12:21:22 2009 >>> @@ -130,6 +130,7 @@ >>> AtomicLong deleteByIdCommandsCumulative= new AtomicLong(); >>> AtomicLong deleteByQueryCommands= new AtomicLong(); >>> AtomicLong deleteByQueryCommandsCumulative= new AtomicLong(); >>> + AtomicLong expungeDeleteCommands = new AtomicLong(); >>> AtomicLong mergeIndexesCommands = new AtomicLong(); >>> AtomicLong commitCommands= new AtomicLong(); >>> AtomicLong optimizeCommands= new AtomicLong(); >>> @@ -382,6 +383,8 @@ >>> if (cmd.optimize) { >>> optimizeCommands.incrementAndGet(); >>> + } else if (cmd.expungeDeletes) { >>> + expungeDeleteCommands.incrementAndGet(); >>> } else { >>> commitCommands.incrementAndGet(); >>> } >>> @@ -402,6 +405,10 @@ >>> } >>> closeWriter(); >>> + if (!cmd.optimize && cmd.expungeDeletes) { >>> + openWriter(); >>> + writer.expungeDeletes(); >>> + } >>> callPostCommitCallbacks(); >>> if (cmd.optimize) { >>> >>> Modified: >>> lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/request/UpdateRequest.java >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/request/UpdateRequest.java?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- >>> lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/request/UpdateRequest.java >>> (original) >>> +++ >>> lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/request/UpdateRequest.java >>> Wed Aug 19 12:21:22 2009 >>> @@ -153,6 +153,12 @@ >>> return this; >>> } >>> + public UpdateRequest setAction(ACTION action, boolean waitFlush, >>> boolean waitSearcher, int maxSegments , boolean expungeDeletes) { >>> + setAction(action, waitFlush, waitSearcher,maxSegments) ; >>> + params.set(UpdateParams.EXPUNGE_DELETES,""+expungeDeletes); >>> + return this; >>> + } >>> + >>> /** >>> * @since Solr 1.4 >>> */ >>> >>> Modified: >>> lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java >>> URL: >>> http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java?rev=805774&r1=805773&r2=805774&view=diff >>> >>> ============================================================================== >>> --- >>> lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java >>> (original) >>> +++ >>> lucene/solr/trunk/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java >>> Wed Aug 19 12:21:22 2009 >>> @@ -17,20 +17,32 @@ >>> package org.apache.solr.update; >>> +import java.io.IOException; >>> +import java.util.ArrayList; >>> import java.util.HashMap; >>> +import java.util.HashSet; >>> +import java.util.List; >>> import java.util.Map; >>> +import java.util.Set; >>> import org.apache.lucene.document.Document; >>> import org.apache.lucene.document.Field; >>> import org.apache.lucene.document.Field.Index; >>> import org.apache.lucene.document.Field.Store; >>> +import org.apache.lucene.index.IndexReader; >>> +import org.apache.lucene.index.SegmentReader; >>> +import org.apache.lucene.index.Term; >>> +import org.apache.lucene.index.TermEnum; >>> import org.apache.solr.common.SolrException; >>> import org.apache.solr.common.params.CommonParams; >>> import org.apache.solr.common.params.MapSolrParams; >>> import org.apache.solr.core.SolrCore; >>> import org.apache.solr.request.LocalSolrQueryRequest; >>> import org.apache.solr.request.SolrQueryRequest; >>> +import org.apache.solr.search.SolrIndexReader; >>> +import org.apache.solr.search.SolrIndexSearcher; >>> import org.apache.solr.util.AbstractSolrTestCase; >>> +import org.apache.solr.util.RefCounted; >>> /** >>> * @@ -247,6 +259,90 @@ >>> ); >>> } >>> + public void testExpungeDeletes() throws Exception { >>> + for (int x = 0; x < 3000; x++) { >>> + addSimpleDoc(x + ""); >>> + } >>> + SolrCore core = h.getCore(); >>> + UpdateHandler updater = core.getUpdateHandler(); >>> + CommitUpdateCommand cmtCmd = new CommitUpdateCommand(false); >>> + cmtCmd.waitSearcher = true; >>> + updater.commit(cmtCmd); >>> + >>> + List<String> todelete = new ArrayList<String>(); >>> + >>> + Set<String> segsdel = new HashSet<String>(); >>> + >>> + SegmentReader[] sirs = getSegmentReaders(core); >>> + assertTrue(sirs.length > 6); >>> + todelete.add(getNthIDTerm(2, sirs[0])); >>> + segsdel.add(sirs[0].getSegmentName()); >>> + + todelete.add(getNthIDTerm(7, sirs[2])); >>> + segsdel.add(sirs[2].getSegmentName()); >>> + + todelete.add(getNthIDTerm(4, sirs[5])); >>> + segsdel.add(sirs[5].getSegmentName()); >>> + + for (String id : todelete) { >>> + deleteSimpleDoc(id); >>> + } >>> + // commit the deletes >>> + cmtCmd = new CommitUpdateCommand(false); >>> + cmtCmd.waitSearcher = true; >>> + updater.commit(cmtCmd); >>> + + // expunge deletes >>> + cmtCmd = new CommitUpdateCommand(false); >>> + cmtCmd.waitSearcher = true; >>> + cmtCmd.expungeDeletes = true; >>> + updater.commit(cmtCmd); >>> + + // we'll have fewer segments >>> + SegmentReader[] sirs2 = getSegmentReaders(core); >>> + assertTrue(sirs.length > sirs2.length); >>> + // check the actual segment names >>> + for (SegmentReader sr : sirs2) { >>> + assertTrue(!segsdel.contains(sr.getSegmentName())); >>> + } >>> + } >>> + >>> + SegmentReader[] getSegmentReaders(SolrCore core) throws IOException { >>> + RefCounted<SolrIndexSearcher> ref = core.getSearcher(true, true, >>> null); >>> + SolrIndexSearcher is = ref.get(); >>> + SegmentReader[] segmentReaders = null; >>> + try { >>> + SolrIndexReader reader = is.getReader(); >>> + IndexReader[] subreaders = reader.getSequentialSubReaders(); >>> + segmentReaders = new SegmentReader[subreaders.length]; >>> + for (int x = 0; x < subreaders.length; x++) { >>> + assert subreaders[x] instanceof SolrIndexReader; >>> + SolrIndexReader sir = (SolrIndexReader) subreaders[x]; >>> + SegmentReader sr = (SegmentReader) sir.getWrappedReader(); >>> + segmentReaders[x] = sr; >>> + } >>> + } finally { >>> + ref.decref(); >>> + } >>> + return segmentReaders; >>> + } >>> + >>> + private String getNthIDTerm(int n, IndexReader r) throws IOException { >>> + TermEnum te = r.terms(new Term("id", "")); >>> + try { >>> + int x = 0; >>> + do { >>> + if (x >= n) { >>> + return te.term().text(); >>> + } >>> + x++; >>> + } while (te.next()); >>> + } finally { >>> + te.close(); >>> + } >>> + return null; >>> + } >>> + private void addSimpleDoc(String id) throws Exception { >>> SolrCore core = h.getCore(); >>> >>> >>> >>> >> >> -- Regards, Rafał Kuć