You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2011/06/01 08:24:20 UTC

svn commit: r1130013 [2/2] - in /lucene/dev/branches/solr2193/solr: example/solr/conf/ src/common/org/apache/solr/common/params/ src/java/org/apache/solr/core/ src/java/org/apache/solr/handler/ src/java/org/apache/solr/handler/component/ src/java/org/a...

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/BasicFunctionalityTest.java Wed Jun  1 06:24:18 2011
@@ -28,9 +28,9 @@ import javax.xml.parsers.DocumentBuilder
 
 import org.apache.lucene.document.Field;
 import org.apache.lucene.document.Fieldable;
+import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.LogMergePolicy;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.AppendedSolrParams;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.DefaultSolrParams;
@@ -49,7 +49,7 @@ import org.apache.solr.schema.IndexSchem
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.DocIterator;
 import org.apache.solr.search.DocList;
-import org.apache.solr.update.SolrIndexWriter;
+import org.apache.solr.update.DirectUpdateHandler2;
 
 
 import org.junit.BeforeClass;
@@ -120,9 +120,8 @@ public class BasicFunctionalityTest exte
     // test merge factor picked up
     SolrCore core = h.getCore();
 
-    SolrIndexWriter writer = new SolrIndexWriter("testWriter",core.getNewIndexDir(), core.getDirectoryFactory(), false, core.getSchema(), core.getSolrConfig().mainIndexConfig, core.getDeletionPolicy(), core.getCodecProvider());
-    assertEquals("Mergefactor was not picked up", ((LogMergePolicy) writer.getConfig().getMergePolicy()).getMergeFactor(), 8);
-    writer.close();
+    IndexWriter writer = ((DirectUpdateHandler2)core.getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+    assertEquals("Mergefactor was not picked up", ((LogMergePolicy)writer.getConfig().getMergePolicy()).getMergeFactor(), 8);
 
     lrf.args.put(CommonParams.VERSION,"2.2");
     assertQ("test query on empty index",

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/cloud/BasicZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/cloud/BasicZkTest.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/cloud/BasicZkTest.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/cloud/BasicZkTest.java Wed Jun  1 06:24:18 2011
@@ -17,11 +17,11 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
+import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.LogMergePolicy;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.core.SolrCore;
-import org.apache.solr.update.SolrIndexWriter;
-
+import org.apache.solr.update.DirectUpdateHandler2;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -45,11 +45,10 @@ public class BasicZkTest extends Abstrac
     
     // test merge factor picked up
     SolrCore core = h.getCore();
-    SolrIndexWriter writer = new SolrIndexWriter("testWriter", core
-        .getNewIndexDir(), core.getDirectoryFactory(), false, core.getSchema(),
-        core.getSolrConfig().mainIndexConfig, core.getDeletionPolicy(), core.getCodecProvider());
+
+    IndexWriter writer = ((DirectUpdateHandler2)core.getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+
     assertEquals("Mergefactor was not picked up", ((LogMergePolicy)writer.getConfig().getMergePolicy()).getMergeFactor(), 8);
-    writer.close();
     
     lrf.args.put(CommonParams.VERSION, "2.2");
     assertQ("test query on empty index", req("qlkciyopsbgzyvkylsjhchghjrdf"),

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/cloud/CloudStateUpdateTest.java Wed Jun  1 06:24:18 2011
@@ -40,7 +40,7 @@ import org.slf4j.LoggerFactory;
 /**
  * TODO: look at hostPort used below
  */
-public class CloudStateUpdateTest extends SolrTestCaseJ4 {
+public class CloudStateUpdateTest extends SolrTestCaseJ4  {
   protected static Logger log = LoggerFactory
       .getLogger(AbstractZkTestCase.class);
 
@@ -68,15 +68,14 @@ public class CloudStateUpdateTest extend
   
   @BeforeClass
   public static void beforeClass() throws Exception {
-    initCore();
   }
 
   @Override
   public void setUp() throws Exception {
     super.setUp();
-    
+    createTempDir();
     System.setProperty("zkClientTimeout", "3000");
-    
+
     zkDir = dataDir.getAbsolutePath() + File.separator
         + "zookeeper/server1/data";
     zkServer = new ZkTestServer(zkDir);
@@ -95,7 +94,7 @@ public class CloudStateUpdateTest extend
     dataDir3 = new File(dataDir + File.separator + "data3");
     dataDir3.mkdirs();
     
-    dataDir4 = new File(dataDir + File.separator + "data3");
+    dataDir4 = new File(dataDir + File.separator + "data4");
     dataDir4.mkdirs();
     
     // set some system properties for use by tests
@@ -103,31 +102,21 @@ public class CloudStateUpdateTest extend
     System.setProperty("solr.test.sys.prop2", "proptwo");
     
     System.setProperty("hostPort", "1661");
-    CoreContainer.Initializer init1 = new CoreContainer.Initializer() {
-      {
-        this.dataDir = CloudStateUpdateTest.this.dataDir1.getAbsolutePath();
-      }
-    };
-    
+    CoreContainer.Initializer init1 = new CoreContainer.Initializer();
+    System.setProperty("solr.data.dir", CloudStateUpdateTest.this.dataDir1.getAbsolutePath());
     container1 = init1.initialize();
     System.clearProperty("hostPort");
     
     System.setProperty("hostPort", "1662");
-    init2 = new CoreContainer.Initializer() {
-      {
-        this.dataDir = CloudStateUpdateTest.this.dataDir2.getAbsolutePath();
-      }
-    };
-    
+    init2 = new CoreContainer.Initializer();
+    System.setProperty("solr.data.dir", CloudStateUpdateTest.this.dataDir2.getAbsolutePath());
     container2 = init2.initialize();
     System.clearProperty("hostPort");
     
     System.setProperty("hostPort", "1663");
-    CoreContainer.Initializer init3 = new CoreContainer.Initializer() {
-      {
-        this.dataDir = CloudStateUpdateTest.this.dataDir3.getAbsolutePath();
-      }
-    };
+    CoreContainer.Initializer init3 = new CoreContainer.Initializer();
+   
+    System.setProperty("solr.data.dir", CloudStateUpdateTest.this.dataDir3.getAbsolutePath());
     container3 = init3.initialize();
     System.clearProperty("hostPort");
     
@@ -153,6 +142,7 @@ public class CloudStateUpdateTest extend
     dcore.setDataDir(dataDir4.getAbsolutePath());
 
     SolrCore core = container1.create(dcore);
+    
     container1.register(core, false);
     
     ZkController zkController2 = container2.getZkController();
@@ -226,7 +216,7 @@ public class CloudStateUpdateTest extend
 
     assertTrue(container1.getZkController().getCloudState().liveNodesContain(
         container2.getZkController().getNodeName()));
-    
+    core.close();
   }
 
   @Override

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/MockEventListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/MockEventListener.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/MockEventListener.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/MockEventListener.java Wed Jun  1 06:24:18 2011
@@ -40,6 +40,11 @@ public class MockEventListener implement
   public void postCommit() {
     /* NOOP */
   }
+  
+  @Override
+  public void postSoftCommit() {
+    /* NOOP */
+  }
 
   public void newSearcher(SolrIndexSearcher newSearcher, 
                           SolrIndexSearcher currentSearcher) {

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestConfig.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestConfig.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestConfig.java Wed Jun  1 06:24:18 2011
@@ -115,22 +115,9 @@ public class TestConfig extends SolrTest
 
   @Test
   public void testTermIndexInterval() throws Exception {
-    class ExposeWriterHandler extends DirectUpdateHandler2 {
-      public ExposeWriterHandler() throws IOException {
-        super(h.getCore());
-      }
-
-      public IndexWriter getWriter() throws IOException {
-        forceOpenWriter();
-        return writer;
-      }
-    }
-
-    ExposeWriterHandler duh = new ExposeWriterHandler();
-    IndexWriter writer = duh.getWriter();
+    IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
     int interval = writer.getConfig().getTermIndexInterval();
     assertEquals(256, interval);
-    duh.close();
   }
 
   @Test

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestLegacyMergeSchedulerPolicyConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestLegacyMergeSchedulerPolicyConfig.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestLegacyMergeSchedulerPolicyConfig.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestLegacyMergeSchedulerPolicyConfig.java Wed Jun  1 06:24:18 2011
@@ -17,8 +17,6 @@ package org.apache.solr.core;
  * limitations under the License.
  */
 
-import java.io.IOException;
-
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.LogDocMergePolicy;
 import org.apache.lucene.index.SerialMergeScheduler;
@@ -35,21 +33,9 @@ public class TestLegacyMergeSchedulerPol
 
   @Test
   public void testLegacy() throws Exception {
-    ExposeWriterHandler duh = new ExposeWriterHandler();
-    IndexWriter writer = duh.getWriter();
+    IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
     assertTrue(writer.getConfig().getMergePolicy().getClass().getName().equals(LogDocMergePolicy.class.getName()));
     assertTrue(writer.getConfig().getMergeScheduler().getClass().getName().equals(SerialMergeScheduler.class.getName()));
-    duh.close();
   }
-  
-  class ExposeWriterHandler extends DirectUpdateHandler2 {
-    public ExposeWriterHandler() throws IOException {
-      super(h.getCore());
-    }
 
-    public IndexWriter getWriter() throws IOException {
-      forceOpenWriter();
-      return writer;
-    }
-  }
 }

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestPropInject.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestPropInject.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestPropInject.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestPropInject.java Wed Jun  1 06:24:18 2011
@@ -35,31 +35,16 @@ public class TestPropInject extends Abst
   public String getSolrConfigFile() {
     return "solrconfig-propinject.xml";
   }
-  
-  class ExposeWriterHandler extends DirectUpdateHandler2 {
-    public ExposeWriterHandler() throws IOException {
-      super(h.getCore());
-    }
-
-    public IndexWriter getWriter() throws IOException {
-      forceOpenWriter();
-      return writer;
-    }
-  }
 
   public void testMergePolicy() throws Exception {
-    ExposeWriterHandler uh = new ExposeWriterHandler();
-    IndexWriter writer = uh.getWriter();
+    IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
     LogByteSizeMergePolicy mp = (LogByteSizeMergePolicy)writer.getConfig().getMergePolicy();
     assertEquals(64.0, mp.getMaxMergeMB(), 0);
-    uh.close();
   }
   
   public void testProps() throws Exception {
-    ExposeWriterHandler uh = new ExposeWriterHandler();
-    IndexWriter writer = uh.getWriter();
+    IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
     ConcurrentMergeScheduler cms = (ConcurrentMergeScheduler)writer.getConfig().getMergeScheduler();
     assertEquals(2, cms.getMaxThreadCount());
-    uh.close();
   }
 }

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestPropInjectDefaults.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestPropInjectDefaults.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestPropInjectDefaults.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/core/TestPropInjectDefaults.java Wed Jun  1 06:24:18 2011
@@ -17,8 +17,6 @@ package org.apache.solr.core;
  * limitations under the License.
  */
 
-import java.io.IOException;
-
 import org.apache.lucene.index.ConcurrentMergeScheduler;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.LogByteSizeMergePolicy;
@@ -32,34 +30,19 @@ public class TestPropInjectDefaults exte
   public static void beforeClass() throws Exception {
     initCore("solrconfig-propinject-indexdefault.xml", "schema.xml");
   }
-  
-  class ExposeWriterHandler extends DirectUpdateHandler2 {
-    public ExposeWriterHandler() throws IOException {
-      super(h.getCore());
-    }
-
-    public IndexWriter getWriter() throws IOException {
-      forceOpenWriter();
-      return writer;
-    }
-  }
 
   @Test
   public void testMergePolicyDefaults() throws Exception {
-    ExposeWriterHandler uh = new ExposeWriterHandler();
-    IndexWriter writer = uh.getWriter();
+    IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
     LogByteSizeMergePolicy mp = (LogByteSizeMergePolicy)writer.getConfig().getMergePolicy();
     assertEquals(32.0, mp.getMaxMergeMB(), 0);
-    uh.close();
   }
   
   @Test
   public void testPropsDefaults() throws Exception {
-    ExposeWriterHandler uh = new ExposeWriterHandler();
-    IndexWriter writer = uh.getWriter();
+    IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
     ConcurrentMergeScheduler cms = (ConcurrentMergeScheduler)writer.getConfig().getMergeScheduler();
     assertEquals(4, cms.getMaxThreadCount());
-    uh.close();
   }
 
 }

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/handler/JsonLoaderTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/handler/JsonLoaderTest.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/handler/JsonLoaderTest.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/handler/JsonLoaderTest.java Wed Jun  1 06:24:18 2011
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.noggit.JSONParser;
-import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
@@ -70,7 +69,7 @@ public class JsonLoaderTest extends Solr
       "},\n" +
       "\n" +
       "'commit': {},\n" +
-      "'optimize': { 'waitFlush':false, 'waitSearcher':false },\n" +
+      "'optimize': { 'waitSearcher':false },\n" +
       "\n" +
       "'delete': { 'id':'ID' },\n" +
       "'delete': { 'query':'QUERY' },\n" +
@@ -109,12 +108,10 @@ public class JsonLoaderTest extends Solr
     assertEquals( 2, p.commitCommands.size() );
     CommitUpdateCommand commit = p.commitCommands.get( 0 );
     assertFalse( commit.optimize );
-    assertTrue( commit.waitFlush );
     assertTrue( commit.waitSearcher );
     
     commit = p.commitCommands.get( 1 );
     assertTrue( commit.optimize );
-    assertFalse( commit.waitFlush );
     assertFalse( commit.waitSearcher );
     
 

Modified: lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/update/AutoCommitTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/update/AutoCommitTest.java?rev=1130013&r1=1130012&r2=1130013&view=diff
==============================================================================
--- lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/update/AutoCommitTest.java (original)
+++ lucene/dev/branches/solr2193/solr/src/test/org/apache/solr/update/AutoCommitTest.java Wed Jun  1 06:24:18 2011
@@ -42,31 +42,45 @@ class CommitListener implements SolrEven
     this.core = core;
   }
 
+  @Override
   public void init(NamedList args) {}
 
+  @Override
   public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {
     this.currentSearcher = currentSearcher;
     triggered = true;
   }
+  
+  @Override
   public void postCommit() {
     triggered = true;
   }
+  
+  @Override
+  public void postSoftCommit() {
+    triggered = true;
+  }
+  
   public void reset() {
     triggered=false;
   }
 
-  public boolean waitForCommit(int timeout) {
+  boolean waitForCommit(int timeout) {
     //triggered = false;
     
     for (int towait=timeout; towait > 0; towait -= 250) {
       try {
         if (triggered) {
-          RefCounted<SolrIndexSearcher> holder = core.getSearcher();
+          RefCounted<SolrIndexSearcher> holder = core.getNewestSearcher(false);
           SolrIndexSearcher s = holder.get();
           holder.decref();
           // since there could be two commits in a row, don't test for a specific new searcher
           // just test that the old one has been replaced.
-          if (s != currentSearcher) return true;
+          if (s != currentSearcher) {
+            // a sleep to make sure the search is fully registered ... ? It helps.
+            Thread.sleep( 250 );
+            return true;
+          }
           // it may be that a commit just happened, but the new searcher hasn't been registered yet.
         }
         Thread.sleep( 250 );
@@ -97,51 +111,49 @@ public class AutoCommitTest extends Abst
     return streams;
   }
 
-  /* This test is causing too many failures on one of the build slaves.
-     Temporarily disabled. -Mike Klaas */
-  public void XXXtestMaxDocs() throws Exception {
+  public void testMaxDocs() throws Exception {
 
     SolrCore core = h.getCore();
     CommitListener trigger = new CommitListener(core);
 
-    DirectUpdateHandler2 updater = (DirectUpdateHandler2)core.getUpdateHandler();
-    DirectUpdateHandler2.CommitTracker tracker = updater.tracker;
-    tracker.timeUpperBound = 100000;
+    DirectUpdateHandler2 updateHandler = (DirectUpdateHandler2)core.getUpdateHandler();
+    CommitTracker tracker = updateHandler.commitTracker;
+    tracker.timeUpperBound = -1;
     tracker.docsUpperBound = 14;
-    // updater.commitCallbacks.add(trigger);
+    updateHandler.commitCallbacks.add(trigger);
     
     XmlUpdateRequestHandler handler = new XmlUpdateRequestHandler();
     handler.init( null );
     
     MapSolrParams params = new MapSolrParams( new HashMap<String, String>() );
     
-    // Add a single document
+    // Add documents
     SolrQueryResponse rsp = new SolrQueryResponse();
     SolrQueryRequestBase req = new SolrQueryRequestBase( core, params ) {};
     for( int i=0; i<14; i++ ) {
       req.setContentStreams( toContentStreams(
-        adoc("id", "A"+i, "subject", "info" ), null ) );
+        adoc("id", Integer.toString(i), "subject", "info" ), null ) );
       handler.handleRequest( req, rsp );
     }
     // It should not be there right away
-    assertQ("shouldn't find any", req("id:A1") ,"//result[@numFound=0]" );
+    assertQ("shouldn't find any", req("id:1") ,"//result[@numFound=0]" );
     assertEquals( 0, tracker.getCommitCount());
 
     req.setContentStreams( toContentStreams(
-        adoc("id", "A14", "subject", "info" ), null ) );
+        adoc("id", "14", "subject", "info" ), null ) );
     handler.handleRequest( req, rsp );
-    // Wait longer than the autocommit time
-    assertTrue(trigger.waitForCommit(20000));
+
+    assertTrue(trigger.waitForCommit(10000));
 
     req.setContentStreams( toContentStreams(
-        adoc("id", "A15", "subject", "info" ), null ) );
+        adoc("id", "15", "subject", "info" ), null ) );
     handler.handleRequest( req, rsp );
       
     // Now make sure we can find it
-    assertQ("should find one", req("id:A14") ,"//result[@numFound=1]" );
+    assertQ("should find one", req("id:14") ,"//result[@numFound=1]" );
     assertEquals( 1, tracker.getCommitCount());
     // But not the one added afterward
-    assertQ("should not find one", req("id:A15") ,"//result[@numFound=0]" );
+    assertQ("should not find one", req("id:15") ,"//result[@numFound=0]" );
     assertEquals( 1, tracker.getCommitCount());
     
   }
@@ -151,7 +163,7 @@ public class AutoCommitTest extends Abst
     CommitListener trigger = new CommitListener(core);    
     core.registerNewSearcherListener(trigger);
     DirectUpdateHandler2 updater = (DirectUpdateHandler2) core.getUpdateHandler();
-    DirectUpdateHandler2.CommitTracker tracker = updater.tracker;
+    CommitTracker tracker = updater.commitTracker;
     // too low of a number can cause a slow host to commit before the test code checks that it
     // isn't there... causing a failure at "shouldn't find any"
     tracker.timeUpperBound = 1000;
@@ -220,4 +232,151 @@ public class AutoCommitTest extends Abst
     assertQ("but not this", req("id:531") ,"//result[@numFound=0]" );
   }
 
+  public void testSoftCommitMaxDocs() throws Exception {
+
+    SolrCore core = h.getCore();
+    CommitListener trigger = new CommitListener(core);
+
+    DirectUpdateHandler2 updateHandler = (DirectUpdateHandler2)core.getUpdateHandler();
+    CommitTracker tracker = updateHandler.commitTracker;
+    tracker.timeUpperBound = -1;
+    tracker.docsUpperBound = 8;
+    updateHandler.commitCallbacks.add(trigger);
+    
+    CommitListener softTrigger = new CommitListener(core);
+
+    CommitTracker softTracker = updateHandler.softCommitTracker;
+    softTracker.timeUpperBound = -1;
+    softTracker.docsUpperBound = 4;
+    updateHandler.softCommitCallbacks.add(softTrigger);
+    
+    XmlUpdateRequestHandler handler = new XmlUpdateRequestHandler();
+    handler.init( null );
+    
+    MapSolrParams params = new MapSolrParams( new HashMap<String, String>() );
+    
+    // Add documents
+    SolrQueryResponse rsp = new SolrQueryResponse();
+    SolrQueryRequestBase req = new SolrQueryRequestBase( core, params ) {};
+    for( int i=0; i<4; i++ ) {
+      req.setContentStreams( toContentStreams(
+        adoc("id", Integer.toString(i), "subject", "info" ), null ) );
+      handler.handleRequest( req, rsp );
+    }
+    // It should not be there right away
+    assertQ("shouldn't find any", req("id:1") ,"//result[@numFound=0]" );
+    assertEquals( 0, tracker.getCommitCount());
+
+    req.setContentStreams( toContentStreams(
+        adoc("id", "4", "subject", "info" ), null ) );
+    handler.handleRequest( req, rsp );
+
+    assertTrue(softTrigger.waitForCommit(10000));
+
+    
+    assertQ("should find 5", req("*:*") ,"//result[@numFound=5]" );
+    assertEquals( 1, softTracker.getCommitCount());
+    assertEquals( 0, tracker.getCommitCount());
+    
+    req.setContentStreams( toContentStreams(
+        adoc("id", "5", "subject", "info" ), null ) );
+    handler.handleRequest( req, rsp );
+      
+    // Now make sure we can find it
+    assertQ("should find one", req("id:4") ,"//result[@numFound=1]" );
+    assertEquals( 1, softTracker.getCommitCount());
+    // But not the one added afterward
+    assertQ("should not find one", req("id:5") ,"//result[@numFound=0]" );
+    assertEquals( 1, softTracker.getCommitCount());
+    
+    for( int i=6; i<10; i++ ) {
+      req.setContentStreams( toContentStreams(
+        adoc("id", Integer.toString(i), "subject", "info" ), null ) );
+      handler.handleRequest( req, rsp );
+    }
+    req.close();
+    
+    
+    assertTrue(trigger.waitForCommit(10000));
+    assertQ("should find 10", req("*:*") ,"//result[@numFound=10]" );
+    assertEquals( 1, softTracker.getCommitCount());
+    assertEquals( 1, tracker.getCommitCount());
+  }
+  
+  public void testSoftCommitMaxTime() throws Exception {
+    SolrCore core = h.getCore();
+    CommitListener trigger = new CommitListener(core);    
+    core.registerNewSearcherListener(trigger);
+    DirectUpdateHandler2 updater = (DirectUpdateHandler2) core.getUpdateHandler();
+    CommitTracker tracker = updater.commitTracker;
+    CommitTracker softTracker = updater.softCommitTracker;
+    
+    // too low of a number can cause a slow host to commit before the test code checks that it
+    // isn't there... causing a failure at "shouldn't find any"
+    softTracker.timeUpperBound = 1000;
+    softTracker.docsUpperBound = -1;
+    // updater.commitCallbacks.add(trigger);
+    
+    XmlUpdateRequestHandler handler = new XmlUpdateRequestHandler();
+    handler.init( null );
+    
+    MapSolrParams params = new MapSolrParams( new HashMap<String, String>() );
+    
+    // Add a single document
+    SolrQueryResponse rsp = new SolrQueryResponse();
+    SolrQueryRequestBase req = new SolrQueryRequestBase( core, params ) {};
+    req.setContentStreams( toContentStreams(
+      adoc("id", "529", "field_t", "what's inside?", "subject", "info"), null ) );
+    trigger.reset();
+    handler.handleRequest( req, rsp );
+
+    // Check it it is in the index
+    assertQ("shouldn't find any", req("id:529") ,"//result[@numFound=0]" );
+
+    // Wait longer than the autocommit time
+    assertTrue(trigger.waitForCommit(30000));
+    trigger.reset();
+    req.setContentStreams( toContentStreams(
+      adoc("id", "530", "field_t", "what's inside?", "subject", "info"), null ) );
+    handler.handleRequest( req, rsp );
+      
+    // Now make sure we can find it
+    assertQ("should find one", req("id:529") ,"//result[@numFound=1]" );
+    // But not this one
+    assertQ("should find none", req("id:530") ,"//result[@numFound=0]" );
+    
+    // Delete the document
+    assertU( delI("529") );
+    assertQ("deleted, but should still be there", req("id:529") ,"//result[@numFound=1]" );
+    // Wait longer than the autocommit time
+    assertTrue(trigger.waitForCommit(30000));
+    trigger.reset();
+    req.setContentStreams( toContentStreams(
+      adoc("id", "550", "field_t", "what's inside?", "subject", "info"), null ) );
+    handler.handleRequest( req, rsp );
+    assertEquals( 2, softTracker.getCommitCount() );
+    assertQ("deleted and time has passed", req("id:529") ,"//result[@numFound=0]" );
+    
+    // now make the call 10 times really fast and make sure it 
+    // only commits once
+    req.setContentStreams( toContentStreams(
+        adoc("id", "500" ), null ) );
+    for( int i=0;i<10; i++ ) {
+      handler.handleRequest( req, rsp );
+    }
+    assertQ("should not be there yet", req("id:500") ,"//result[@numFound=0]" );
+    
+    // Wait longer than the autocommit time
+    assertTrue(trigger.waitForCommit(45000));
+    trigger.reset();
+    
+    req.setContentStreams( toContentStreams(
+      adoc("id", "531", "field_t", "what's inside?", "subject", "info"), null ) );
+    handler.handleRequest( req, rsp );
+    assertEquals( 3, softTracker.getCommitCount() );
+    assertEquals( 0, tracker.getCommitCount() );
+    
+    assertQ("now it should", req("id:500") ,"//result[@numFound=1]" );
+    assertQ("but not this", req("id:531") ,"//result[@numFound=0]" );
+  }
 }