I'm looking into it. I guess I goofed up somewhere
2009/8/19 Rafał Kuć <ra...@alud.com.pl>: > 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ć > > -- ----------------------------------------------------- Noble Paul | Principal Engineer| AOL | http://aol.com