You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by si...@apache.org on 2012/09/21 19:22:27 UTC

svn commit: r1388574 [44/45] - in /lucene/dev/branches/LUCENE-2878: ./ dev-tools/ dev-tools/eclipse/ dev-tools/eclipse/dot.settings/ dev-tools/idea/ dev-tools/idea/.idea/ dev-tools/idea/.idea/libraries/ dev-tools/idea/lucene/ dev-tools/idea/lucene/anal...

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java Fri Sep 21 17:21:34 2012
@@ -939,8 +939,15 @@ abstract public class SolrExampleTests e
   }
 
   @Test
-  public void testPivotFacet() throws Exception
-  {    
+  public void testPivotFacets() throws Exception {
+    doPivotFacetTest(false);
+  }
+    
+  public void testPivotFacetsMissing() throws Exception {
+    doPivotFacetTest(true);
+  }
+    
+  private void doPivotFacetTest(boolean missing) throws Exception {
     SolrServer server = getSolrServer();
     
     // Empty the database...
@@ -961,13 +968,14 @@ abstract public class SolrExampleTests e
     docs.add( makeTestDoc( "id", id++, "features", "bbb",  "cat", "b", "inStock", true ) );
     docs.add( makeTestDoc( "id", id++, "features", "bbb",  "cat", "b", "inStock", false ) );
     docs.add( makeTestDoc( "id", id++, "features", "bbb",  "cat", "b", "inStock", true ) );
-    docs.add( makeTestDoc( "id", id++ ) ); // something not matching
+    docs.add( makeTestDoc( "id", id++,  "cat", "b" ) ); // something not matching all fields
     server.add( docs );
     server.commit();
     
     SolrQuery query = new SolrQuery( "*:*" );
     query.addFacetPivotField("features,cat", "cat,features", "features,cat,inStock" );
     query.setFacetMinCount( 0 );
+    query.setFacetMissing( missing );
     query.setRows( 0 );
     
     QueryResponse rsp = server.query( query );
@@ -991,10 +999,12 @@ abstract public class SolrExampleTests e
     //  features=aaa (5)
     //    cat=a (3)
     //    cat=b (2)
-    
-    List<PivotField> pivot = pivots.getVal( 0 );
+    //  features missing (1)
+    //    cat=b (1)
+
     assertEquals( "features,cat", pivots.getName( 0 ) );
-    assertEquals( 2, pivot.size() );
+    List<PivotField> pivot = pivots.getVal( 0 );
+    assertEquals( missing ? 3 : 2, pivot.size() );
     
     PivotField ff = pivot.get( 0 );
     assertEquals( "features", ff.getField() );
@@ -1007,27 +1017,72 @@ abstract public class SolrExampleTests e
     assertEquals(   4, counts.get(0).getCount() );
     assertEquals( "a", counts.get(1).getValue() );
     assertEquals(   2, counts.get(1).getCount() );
-    
 
-    //  PIVOT: cat,features
-    //  cat=b (6)
-    //    features=bbb (4)
-    //    features=aaa (2)
-    //  cat=a (5)
-    //    features=aaa (3)
-    //    features=bbb (2)
-    
     ff = pivot.get( 1 );
     assertEquals( "features", ff.getField() );
     assertEquals( "aaa", ff.getValue() );
     assertEquals( 5, ff.getCount() );
     counts = ff.getPivot();
     assertEquals( 2, counts.size() );
+    assertEquals( "cat", counts.get(0).getField() );
     assertEquals( "a", counts.get(0).getValue() );
     assertEquals(   3, counts.get(0).getCount() );
     assertEquals( "b", counts.get(1).getValue() );
     assertEquals(   2, counts.get(1).getCount() );
-    
+
+    if (missing) {
+      ff = pivot.get( 2 );
+      assertEquals( "features", ff.getField() );
+      assertEquals( null, ff.getValue() );
+      assertEquals( 1, ff.getCount() );
+      counts = ff.getPivot();
+      assertEquals( 1, counts.size() );
+      assertEquals( "cat", counts.get(0).getField() );
+      assertEquals( "b", counts.get(0).getValue() );
+      assertEquals( 1, counts.get(0).getCount() );
+    }
+
+    //  PIVOT: cat,features
+    //  cat=b (7)
+    //    features=bbb (4)
+    //    features=aaa (2)
+    //    features missing (1)
+    //  cat=a (5)
+    //    features=aaa (3)
+    //    features=bbb (2)
+
+    assertEquals( "cat,features", pivots.getName( 1 ) );
+    pivot = pivots.getVal( 1 );
+    assertEquals( 2, pivot.size() );
+
+    ff = pivot.get( 0 );
+    assertEquals( "cat", ff.getField() );
+    assertEquals( "b", ff.getValue() );
+    assertEquals( 7, ff.getCount() );
+    counts = ff.getPivot();
+    assertEquals( missing ? 3 : 2, counts.size() );
+    assertEquals( "features", counts.get(0).getField() );
+    assertEquals( "bbb", counts.get(0).getValue() );
+    assertEquals( 4, counts.get(0).getCount() );
+    assertEquals( "aaa", counts.get(1).getValue() );
+    assertEquals( 2, counts.get(1).getCount() );
+    if ( missing ) {
+      assertEquals( null, counts.get(2).getValue() );
+      assertEquals( 1, counts.get(2).getCount() );
+    }
+
+    ff = pivot.get( 1 );
+    assertEquals( "cat", ff.getField() );
+    assertEquals( "a", ff.getValue() );
+    assertEquals( 5, ff.getCount() );
+    counts = ff.getPivot();
+    assertEquals( 2, counts.size() );
+    assertEquals( "features", counts.get(0).getField() );
+    assertEquals( "aaa", counts.get(0).getValue() );
+    assertEquals( 3, counts.get(0).getCount() );
+    assertEquals( "bbb", counts.get(1).getValue() );
+    assertEquals( 2, counts.get(1).getCount() );
+
     // Three deep:
     //  PIVOT: features,cat,inStock
     //  features=bbb (6)
@@ -1044,10 +1099,13 @@ abstract public class SolrExampleTests e
     //    cat=b (2)
     //      inStock=false (1)
     //      inStock=true (1)
-    
-    pivot = pivots.getVal( 2 );
+    //  features missing (1)
+    //    cat=b (1)
+    //      inStock missing (1)
+
     assertEquals( "features,cat,inStock", pivots.getName( 2 ) );
-    assertEquals( 2, pivot.size() );
+    pivot = pivots.getVal( 2 );
+    assertEquals( missing ? 3 : 2, pivot.size() );
     PivotField p = pivot.get( 1 ).getPivot().get(0);     // get(1) should be features=AAAA, then get(0) should be cat=a
     assertEquals( "cat", p.getField() );
     assertEquals( "a", p.getValue() );
@@ -1057,6 +1115,25 @@ abstract public class SolrExampleTests e
     assertEquals( "inStock",    counts.get(0).getField() );
     assertEquals( Boolean.TRUE, counts.get(0).getValue() );
     assertEquals(  2,           counts.get(0).getCount() );
+
+    if (missing) {
+      p = pivot.get( 2 );
+      assertEquals( "features", p.getField() );
+      assertEquals( null, p.getValue() );
+      assertEquals( 1, p.getCount() );
+      assertEquals( 1, p.getPivot().size() );
+      p = p.getPivot().get(0);
+      assertEquals( "cat", p.getField() );
+      assertEquals( "b", p.getValue() );
+      assertEquals( 1, p.getCount() );
+      assertEquals( 1, p.getPivot().size() );
+      p = p.getPivot().get(0);
+      assertEquals( "inStock", p.getField() );
+      assertEquals( null, p.getValue() );
+      assertEquals( 1, p.getCount() );
+      assertEquals( null, p.getPivot() );
+    }
+
   }
   
   public static SolrInputDocument makeTestDoc( Object ... kvp )

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleXMLTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleXMLTest.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleXMLTest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleXMLTest.java Fri Sep 21 17:21:34 2012
@@ -36,7 +36,7 @@ public class SolrExampleXMLTest extends 
   @Override
   public SolrServer createNewSolrServer() {
     try {
-      String url = "http://localhost:" + port + context;
+      String url = "http://127.0.0.1:" + port + context;
       HttpSolrServer s = new HttpSolrServer(url);
       s.setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT);
       s.setDefaultMaxConnectionsPerHost(100);

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java Fri Sep 21 17:21:34 2012
@@ -241,7 +241,7 @@ public class TestLBHttpSolrServer extend
     }
 
     public String getUrl() {
-      return "http://localhost:" + port + "/solr";
+      return "http://127.0.0.1:" + port + "/solr";
     }
 
     public String getSchemaFile() {

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/JettyWebappTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/JettyWebappTest.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/JettyWebappTest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/JettyWebappTest.java Fri Sep 21 17:21:34 2012
@@ -92,7 +92,7 @@ public class JettyWebappTest extends Luc
     // Currently not an extensive test, but it does fire up the JSP pages and make 
     // sure they compile ok
     
-    String adminPath = "http://localhost:"+port+context+"/";
+    String adminPath = "http://127.0.0.1:"+port+context+"/";
     byte[] bytes = IOUtils.toByteArray( new URL(adminPath).openStream() );
     assertNotNull( bytes ); // real error will be an exception
   }

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/MultiCoreExampleJettyTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/MultiCoreExampleJettyTest.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/MultiCoreExampleJettyTest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/MultiCoreExampleJettyTest.java Fri Sep 21 17:21:34 2012
@@ -94,7 +94,7 @@ public class MultiCoreExampleJettyTest e
   {
     try {
       // setup the server...
-      String url = "http://localhost:"+port+context+"/"+name;
+      String url = "http://127.0.0.1:"+port+context+"/"+name;
       HttpSolrServer s = new HttpSolrServer( url );
       s.setConnectionTimeout(SolrTestCaseJ4.DEFAULT_CONNECTION_TIMEOUT);
       s.setDefaultMaxConnectionsPerHost(100);
@@ -139,7 +139,7 @@ public class MultiCoreExampleJettyTest e
     assertEquals( 1, r.process( getSolrCore1() ).getResults().size() );
     
     // Distributed
-    String baseURL = "localhost:"+port+context+"/";
+    String baseURL = "127.0.0.1:"+port+context+"/";
     q = new SolrQuery( "*:*" );
     q.set( ShardParams.SHARDS, baseURL+"core0,"+baseURL+"core1" );
     q.set( "fl", "id,s:[shard]" );

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java Fri Sep 21 17:21:34 2012
@@ -42,7 +42,7 @@ public class SolrExampleJettyTest extend
   {
     try {
       // setup the server...
-      String url = "http://localhost/?core=xxx";
+      String url = "http://127.0.0.1/?core=xxx";
       HttpSolrServer s = new HttpSolrServer( url );
       Assert.fail( "CommonsHttpSolrServer should not allow a path with a parameter: "+s.getBaseURL() );
     }

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java Fri Sep 21 17:21:34 2012
@@ -44,7 +44,7 @@ public class SolrExampleStreamingTest ex
   {
     try {
       // setup the server...
-      String url = "http://localhost:"+port+context;       // smaller queue size hits locks more often
+      String url = "http://127.0.0.1:"+port+context;       // smaller queue size hits locks more often
       ConcurrentUpdateSolrServer s = new ConcurrentUpdateSolrServer( url, 2, 5 ) {
         
         public Throwable lastError = null;

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpClientUtilTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpClientUtilTest.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpClientUtilTest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpClientUtilTest.java Fri Sep 21 17:21:34 2012
@@ -18,6 +18,8 @@ package org.apache.solr.client.solrj.imp
 
 import static org.junit.Assert.assertEquals;
 
+import java.util.concurrent.atomic.AtomicInteger;
+
 import org.apache.http.auth.AuthScope;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.params.ClientPNames;
@@ -25,6 +27,7 @@ import org.apache.http.impl.client.Defau
 import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
 import org.apache.http.params.HttpConnectionParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.params.SolrParams;
 import org.junit.Test;
 
 public class HttpClientUtilTest {
@@ -60,4 +63,31 @@ public class HttpClientUtilTest {
     client.getConnectionManager().shutdown();
   }
   
+  @Test
+  public void testReplaceConfigurer(){
+    
+    try {
+    final AtomicInteger counter = new AtomicInteger();
+    HttpClientConfigurer custom = new HttpClientConfigurer(){
+      @Override
+      protected void configure(DefaultHttpClient httpClient, SolrParams config) {
+        super.configure(httpClient, config);
+        counter.set(config.getInt("custom-param", -1));
+      }
+      
+    };
+    
+    HttpClientUtil.setConfigurer(custom);
+    
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.set("custom-param", 5);
+    HttpClientUtil.createClient(params).getConnectionManager().shutdown();
+    assertEquals(5, counter.get());
+    } finally {
+      //restore default configurer
+      HttpClientUtil.setConfigurer(new HttpClientConfigurer());
+    }
+
+  }
+  
 }

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestSpellCheckResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestSpellCheckResponse.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestSpellCheckResponse.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestSpellCheckResponse.java Fri Sep 21 17:21:34 2012
@@ -108,7 +108,7 @@ public class TestSpellCheckResponse exte
   
   @Test
   public void testSpellCheckCollationResponse() throws Exception {
-  	getSolrServer();
+    getSolrServer();
     server.deleteByQuery("*:*");
     server.commit(true, true);
     SolrInputDocument doc = new SolrInputDocument();
@@ -156,27 +156,27 @@ public class TestSpellCheckResponse exte
     assertEquals(2, collations.size());
     for(Collation collation : collations)
     {
-    	assertTrue("name:(+faith +hope +love)".equals(collation.getCollationQueryString()) || "name:(+faith +hope +loaves)".equals(collation.getCollationQueryString()));
+      assertTrue("name:(+faith +hope +love)".equals(collation.getCollationQueryString()) || "name:(+faith +hope +loaves)".equals(collation.getCollationQueryString()));
       assertTrue(collation.getNumberOfHits()==1);
-    	
-    	List<Correction> misspellingsAndCorrections = collation.getMisspellingsAndCorrections();
-    	assertTrue(misspellingsAndCorrections.size()==3);
-    	for(Correction correction : misspellingsAndCorrections)
-    	{    	
-    		if("fauth".equals(correction.getOriginal()))
-    		{
-    			assertTrue("faith".equals(correction.getCorrection()));
-    		} else if("home".equals(correction.getOriginal()))
-    		{
-    			assertTrue("hope".equals(correction.getCorrection()));
-    		} else if("loane".equals(correction.getOriginal()))
-    		{
-    			assertTrue("love".equals(correction.getCorrection()) || "loaves".equals(correction.getCorrection()));
-    		} else
-    		{
-    			fail("Original Word Should have been either fauth, home or loane.");
-    		}	    	
-    	}
+
+      List<Correction> misspellingsAndCorrections = collation.getMisspellingsAndCorrections();
+      assertTrue(misspellingsAndCorrections.size()==3);
+      for(Correction correction : misspellingsAndCorrections)
+      {
+        if("fauth".equals(correction.getOriginal()))
+        {
+          assertTrue("faith".equals(correction.getCorrection()));
+        } else if("home".equals(correction.getOriginal()))
+        {
+          assertTrue("hope".equals(correction.getCorrection()));
+        } else if("loane".equals(correction.getOriginal()))
+        {
+          assertTrue("love".equals(correction.getCorrection()) || "loaves".equals(correction.getCorrection()));
+        } else
+        {
+          fail("Original Word Should have been either fauth, home or loane.");
+        }
+      }
     }
     
     query.set(SpellingParams.SPELLCHECK_COLLATE_EXTENDED_RESULTS, false);

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/common/SolrDocumentTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/common/SolrDocumentTest.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/common/SolrDocumentTest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/common/SolrDocumentTest.java Fri Sep 21 17:21:34 2012
@@ -158,6 +158,28 @@ public class SolrDocumentTest extends Lu
     assertFalse( doc.getFieldValuesMap().containsKey( "g" ) );
     assertFalse( doc.getFieldValueMap().keySet().contains( "g" ) );
     assertFalse( doc.getFieldValuesMap().keySet().contains( "g" ) );
+
+    // A read-only list shouldn't break addField("v", ...).
+    List<String> ro = Collections.unmodifiableList(c0);
+    doc = new SolrDocument();
+    doc.addField( "v", ro );
+
+    // This should NOT throw an UnsupportedOperationException.
+    doc.addField( "v", "asdf" );
+
+    // set field using a collection is documented to be backed by 
+    // that collection, so changes should affect it.
+    Collection<String> tmp = new ArrayList<String>(3);
+    tmp.add("one");
+    doc.setField( "collection_backed", tmp );
+    assertEquals("collection not the same", 
+                 tmp, doc.getFieldValues( "collection_backed" ));
+    tmp.add("two");
+    assertEquals("wrong size", 
+                 2, doc.getFieldValues( "collection_backed" ).size());
+    assertEquals("collection not the same", 
+                 tmp, doc.getFieldValues( "collection_backed" ));
+    
   }
    
   public void testDuplicate() 

Modified: lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java Fri Sep 21 17:21:34 2012
@@ -17,22 +17,16 @@
 
 package org.apache.solr.common.util;
 
-import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.net.ConnectException;
-import java.net.HttpURLConnection;
 import java.net.URL;
-import java.net.URLConnection;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
-import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.core.SolrResourceLoader;
 
 /**
@@ -66,50 +60,17 @@ public class ContentStreamTest extends L
 
   public void testURLStream() throws IOException 
   {
-    byte[] content = null;
-    String contentType = null;
-    URL url = new URL( "http://svn.apache.org/repos/asf/lucene/dev/trunk/" );
-    InputStream in = null;
-    try {
-      HttpURLConnection conn = (HttpURLConnection)url.openConnection();
-      conn.setConnectTimeout(1000);
-      conn.setReadTimeout(1000);
-      conn.connect();
-      int code = conn.getResponseCode();
-      assumeTrue("wrong response code from server: " + code, 200 == code);
-      in = conn.getInputStream();
-      contentType = conn.getContentType();
-      content = IOUtils.toByteArray(in);
-
-      assumeTrue("not enough content for test to be useful",
-                 content.length > 10 ); 
-
-    } catch (IOException ex) {
-      assumeNoException("Unable to connect to " + url + " to run the test.", ex);
-    }finally {
-      if (in != null) {
-        IOUtils.closeQuietly(in);
-      }
-    }
-    
-    
-    ContentStreamBase stream = new ContentStreamBase.URLStream( url );
-    in = stream.getStream();  // getStream is needed before getSize is valid
-    assertEquals( content.length, stream.getSize().intValue() );
+    InputStream is = new SolrResourceLoader(null, null).openResource( "solrj/README" );
+    assertNotNull( is );
+    File file = new File(TEMP_DIR, "README");
+    FileOutputStream os = new FileOutputStream(file);
+    IOUtils.copy(is, os);
+    os.close();
     
-    try {
-      assertTrue( IOUtils.contentEquals( 
-          new ByteArrayInputStream(content), in ) );
-    } 
-    finally {
-      IOUtils.closeQuietly(in);
-    }
-
-    String charset = ContentStreamBase.getCharsetFromContentType(contentType);
-    if (charset == null)
-      charset = ContentStreamBase.DEFAULT_CHARSET;
-    // Re-open the stream and this time use a reader
-    stream = new ContentStreamBase.URLStream( url );
-    assertTrue( IOUtils.contentEquals( new StringReader(new String(content, charset)), stream.getReader() ) );
+    ContentStreamBase stream = new ContentStreamBase.URLStream( new URL(file.toURI().toASCIIString()) );
+    assertTrue( IOUtils.contentEquals( new FileInputStream( file ), stream.getStream() ) );
+    assertEquals( file.length(), stream.getSize().intValue() );
+    assertTrue( IOUtils.contentEquals( new InputStreamReader(new FileInputStream(file), "UTF-8"), stream.getReader() ) );
+    assertEquals( file.length(), stream.getSize().intValue() );
   }
 }

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/build.xml?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/build.xml (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/build.xml Fri Sep 21 17:21:34 2012
@@ -20,10 +20,14 @@
 
   <import file="../common-build.xml"/>
 
-  <path id="javadoc.classpath">
-    <path refid="test.classpath"/>
-    <pathelement location="${common.dir}/build/test-framework/classes/java"/>
-    <pathelement location="${build.dir}/classes/java"/>
+  <path id="solr.test.framework.lucene.libs">
+    <pathelement location="${test-framework.jar}"/>
+  </path>
+
+  <path id="classpath">
+    <fileset dir="lib" excludes="${common.classpath.excludes}"/>
+    <path refid="solr.test.framework.lucene.libs" />
+    <path refid="solr.base.classpath"/>
   </path>
 
   <!-- Redefine Lucene test-framework compilation here to avoid circular dependency on compile-core -->
@@ -33,32 +37,58 @@
     </ant>
   </target>
 
-  <target name="compile-core" depends="compile-solr-core, compile-test-framework">
+  <target name="compile-core" depends="resolve, compile-solr-core, compile-test-framework">
     <compile srcdir="${src.dir}" destdir="${build.dir}/classes/java">
       <classpath refid="test.base.classpath"/>
     </compile>
   </target>
 
-  <!-- Override common-solr.javadocs to include JUnit,test-framework links -->
+  <!-- Override common-solr.javadocs to include JUnit links -->
   <!-- and to copy the built javadocs to ${dest}/docs/api/test-framework -->
   <target name="javadocs"
-          depends="compile-core,lucene-javadocs,javadocs-test-framework,define-lucene-javadoc-url">
+          depends="compile-core,jar-test-framework,lucene-javadocs,javadocs-test-framework,define-lucene-javadoc-url">
     <sequential>
-      <mkdir dir="${javadoc.dir}"/>
-      <invoke-javadoc destdir="${javadoc.dir}" 
-                      title="${Name}" overview="${src.dir}/overview.html">
-        <sources>
-          <link offline="true" href="${javadoc.link.junit}"
-                packagelistLoc="${javadoc.packagelist.dir}/junit"/>
-          <packageset dir="${src.dir}"/>
-        </sources>
+      <mkdir dir="${javadoc.dir}/${name}"/>
+      <!-- NOTE: explicitly not using solr-invoke-javadoc, or attempting to 
+	   link to lucene-test-framework because if we did javadoc would 
+	   attempt to link class refs in in org.apache.lucene, causing 
+	   broken links. (either broken links to things like "Directory" if 
+	   lucene-test-framework was first, or broken links to things like 
+	   LuceneTestCase if lucene-core was first)
+      -->
+      <invoke-javadoc destdir="${javadoc.dir}/${name}" 
+		      title="${Name} ${version} Test Framework API">
+	<sources>
+	  <link offline="true" href="${javadoc.link.junit}"
+		packagelistLoc="${javadoc.packagelist.dir}/junit"/>
+	  <packageset dir="${src.dir}"/>
+	</sources>
       </invoke-javadoc>
-      <solr-jarify basedir="${javadoc.dir}" destfile="${build.dir}/${final.name}-javadoc.jar"/>
-      <mkdir dir="${dest}/docs/api/test-framework"/>
-      <copy todir="${dest}/docs/api/test-framework">
-        <fileset dir="${javadoc.dir}"/>
-      </copy>
+      <solr-jarify basedir="${javadoc.dir}/${name}" destfile="${build.dir}/${final.name}-javadoc.jar"/>
     </sequential>
   </target>
+
+  <target name="module-jars-to-solr"
+          depends="jar-test-framework">
+    <mkdir dir="${build.dir}/lucene-libs"/>
+    <copy todir="${build.dir}/lucene-libs" preservelastmodified="true" flatten="true" failonerror="true" overwrite="true">
+      <path refid="solr.test.framework.lucene.libs" />
+    </copy>
+  </target>
+
+  <target name="dist" depends="module-jars-to-solr, common-solr.dist">
+    <!-- we're not a contrib, our lucene-libs and go in a special place -->
+    <mkdir  dir="${dist}/test-framework" />
+    <copy todir="${dist}/test-framework">
+      <fileset dir="${build.dir}">
+	<include name="lucene-libs/*.jar" />
+      </fileset>
+      <fileset dir=".">
+	<include name="lib/*" />
+	<include name="README.txt" />
+      </fileset>
+    </copy>
+  </target>
+
 </project>
 

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/ivy.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/ivy.xml?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/ivy.xml (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/ivy.xml Fri Sep 21 17:21:34 2012
@@ -17,5 +17,24 @@
    under the License.    
 -->
 <ivy-module version="2.0">
-    <info organisation="org.apache.solr" module="core-test-framework"/>
+    <info organisation="org.apache.solr" module="solr-test-framework"/>
+
+    <configurations>
+      <conf name="default" />
+      <!-- 
+      JUnit4 ANT task only, no ANT.
+      This is used from build scripts for taskdefs.
+      -->
+      <conf name="junit4-stdalone" />
+    </configurations>
+
+    <dependencies defaultconf="default">
+      <dependency org="org.apache.ant" name="ant" rev="1.8.2" transitive="false" />
+
+      <dependency org="junit" name="junit" rev="4.10" transitive="false" conf="default->*;junit4-stdalone->*" />
+      <dependency org="com.carrotsearch.randomizedtesting" name="junit4-ant" rev="2.0.1" transitive="false" conf="default->*;junit4-stdalone->*" />
+      <dependency org="com.carrotsearch.randomizedtesting" name="randomizedtesting-runner" rev="2.0.1" transitive="false" conf="default->*;junit4-stdalone->*" />
+
+      <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
+    </dependencies>
 </ivy-module>

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java Fri Sep 21 17:21:34 2012
@@ -86,8 +86,8 @@ public abstract class BaseDistributedSea
   protected String shards;
   protected String[] shardsArr;
   // Some ISPs redirect to their own web site for domains that don't exist, causing this to fail
-  // protected String[] deadServers = {"does_not_exist_54321.com:33331/solr","localhost:33332/solr"};
-  protected String[] deadServers = {"[::1]:33332/solr"};
+  // protected String[] deadServers = {"does_not_exist_54321.com:33331/solr","127.0.0.1:33332/solr"};
+  protected String[] deadServers = {"[ff01::114]:33332/solr", "[ff01::083]:33332/solr", "[ff01::213]:33332/solr"};
   protected File testDir;
   protected SolrServer controlClient;
 
@@ -201,7 +201,7 @@ public abstract class BaseDistributedSea
           getSchemaFile());
       jettys.add(j);
       clients.add(createNewSolrServer(j.getLocalPort()));
-      String shardStr = "localhost:" + j.getLocalPort() + context;
+      String shardStr = "127.0.0.1:" + j.getLocalPort() + context;
       shardsArr[i] = shardStr;
       sb.append(shardStr);
     }
@@ -267,7 +267,7 @@ public abstract class BaseDistributedSea
   protected SolrServer createNewSolrServer(int port) {
     try {
       // setup the server...
-      String url = "http://localhost:" + port + context;
+      String url = "http://127.0.0.1:" + port + context;
       HttpSolrServer s = new HttpSolrServer(url);
       s.setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT);
       s.setDefaultMaxConnectionsPerHost(100);
@@ -373,6 +373,10 @@ public abstract class BaseDistributedSea
   }
 
   protected void query(Object... q) throws Exception {
+    query(true, q);
+  }
+  
+  protected void query(boolean setDistribParams, Object[] q) throws Exception {
     
     final ModifiableSolrParams params = new ModifiableSolrParams();
 
@@ -385,7 +389,7 @@ public abstract class BaseDistributedSea
     validateControlData(controlRsp);
 
     params.remove("distrib");
-    setDistributedParams(params);
+    if (setDistribParams) setDistributedParams(params);
 
     QueryResponse rsp = queryServer(params);
 

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrIgnoredThreadsFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrIgnoredThreadsFilter.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrIgnoredThreadsFilter.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrIgnoredThreadsFilter.java Fri Sep 21 17:21:34 2012
@@ -47,6 +47,12 @@ public class SolrIgnoredThreadsFilter im
         threadName.startsWith("httpShardExecutor-")) {
       return true;
     }
+    
+    // This is a bug in ZooKeeper where they call System.exit(11) when
+    // this thread receives an interrupt signal.
+    if (threadName.startsWith("SyncThread")) {
+      return true;
+    }
 
     // THESE ARE LIKELY BUGS - these threads should be closed!
     if (threadName.startsWith("Overseer-") ||

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java Fri Sep 21 17:21:34 2012
@@ -86,7 +86,7 @@ abstract public class SolrJettyTestBase 
     if (jetty != null) {
       try {
         // setup the server...
-        String url = "http://localhost:"+port+context;
+        String url = "http://127.0.0.1:"+port+context;
         HttpSolrServer s = new HttpSolrServer( url );
         s.setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT);
         s.setDefaultMaxConnectionsPerHost(100);

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java Fri Sep 21 17:21:34 2012
@@ -23,6 +23,7 @@ import java.util.logging.*;
 
 import javax.xml.xpath.XPathExpressionException;
 
+import org.apache.lucene.util.Constants;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.QuickPatchThreadsFilter;
 import org.apache.noggit.*;
@@ -30,6 +31,7 @@ import org.apache.solr.common.*;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.params.*;
 import org.apache.solr.common.util.XML;
+import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.JsonUpdateRequestHandler;
@@ -48,11 +50,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
 
+import com.carrotsearch.randomizedtesting.RandomizedContext;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
 
 /**
- * A junit4 Solr test harness that extends LuceneTestCaseJ4.
+ * A junit4 Solr test harness that extends LuceneTestCaseJ4. To change which core is used when loading the schema and solrconfig.xml, simply
+ * invoke the {@link #initCore(String, String, String, String)} method.
+ * 
  * Unlike {@link AbstractSolrTestCase}, a new core is not created for each test method.
  */
 @ThreadLeakFilters(defaultFilters = true, filters = {
@@ -60,6 +65,7 @@ import com.carrotsearch.randomizedtestin
     QuickPatchThreadsFilter.class
 })
 public abstract class SolrTestCaseJ4 extends LuceneTestCase {
+  private static String coreName = CoreContainer.DEFAULT_DEFAULT_CORE_NAME;
   public static int DEFAULT_CONNECTION_TIMEOUT = 1000;  // default socket connection timeout in ms
 
 
@@ -178,7 +184,13 @@ public abstract class SolrTestCaseJ4 ext
     initCore();
   }
 
-
+  /** Call initCore in @BeforeClass to instantiate a solr core in your test class.
+   * deleteCore will be called for you via SolrTestCaseJ4 @AfterClass */
+  public static void initCore(String config, String schema, String solrHome, String pCoreName) throws Exception {
+    coreName=pCoreName;
+    initCore(config,schema,solrHome);
+  }
+  
   static long numOpens;
   static long numCloses;
   public static void startTrackingSearchers() {
@@ -220,7 +232,12 @@ public abstract class SolrTestCaseJ4 ext
      if (endNumOpens-numOpens != endNumCloses-numCloses) {
        String msg = "ERROR: SolrIndexSearcher opens=" + (endNumOpens-numOpens) + " closes=" + (endNumCloses-numCloses);
        log.error(msg);
-       fail(msg);
+       // if its TestReplicationHandler on freebsd, ignore it
+       if ("FreeBSD".equals(Constants.OS_NAME) && "TestReplicationHandler".equals(RandomizedContext.current().getTargetClass().getSimpleName())) {
+         log.warn("TestReplicationHandler wants to fail!: " + msg);
+       } else {
+         fail(msg);
+       }
      }
   }
   
@@ -358,7 +375,7 @@ public abstract class SolrTestCaseJ4 ext
   }
 
   public static void createCore() {
-    solrConfig = TestHarness.createConfig(testSolrHome, getSolrConfigFile());
+    solrConfig = TestHarness.createConfig(testSolrHome, coreName, getSolrConfigFile());
     h = new TestHarness( dataDir.getAbsolutePath(),
             solrConfig,
             getSchemaFile());

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java Fri Sep 21 17:21:34 2012
@@ -24,11 +24,10 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.BaseDistributedSearchTestCase;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
-import org.apache.solr.cloud.ZkTestServer;
 import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.servlet.SolrDispatchFilter;
 import org.apache.zookeeper.KeeperException;
@@ -92,7 +91,7 @@ public abstract class AbstractDistribZkT
       JettySolrRunner j = createJetty(jettyHome, null, "shard" + (i + 2));
       jettys.add(j);
       clients.add(createNewSolrServer(j.getLocalPort()));
-      sb.append("localhost:").append(j.getLocalPort()).append(context);
+      sb.append("127.0.0.1:").append(j.getLocalPort()).append(context);
     }
 
     shards = sb.toString();
@@ -113,7 +112,7 @@ public abstract class AbstractDistribZkT
   
   protected void waitForRecoveriesToFinish(String collection, ZkStateReader zkStateReader, boolean verbose, boolean failOnTimeout)
       throws Exception {
-    waitForRecoveriesToFinish(collection, zkStateReader, verbose, failOnTimeout, 120 * (TEST_NIGHTLY ? 2 : 1) * RANDOM_MULTIPLIER);
+    waitForRecoveriesToFinish(collection, zkStateReader, verbose, failOnTimeout, 600 * (TEST_NIGHTLY ? 2 : 1) * RANDOM_MULTIPLIER);
   }
   
   protected void waitForRecoveriesToFinish(String collection,
@@ -129,19 +128,20 @@ public abstract class AbstractDistribZkT
       zkStateReader.updateClusterState(true);
       ClusterState clusterState = zkStateReader.getClusterState();
       Map<String,Slice> slices = clusterState.getSlices(collection);
+      assertNotNull("Could not find collection:" + collection, slices);
       for (Map.Entry<String,Slice> entry : slices.entrySet()) {
-        Map<String,ZkNodeProps> shards = entry.getValue().getShards();
-        for (Map.Entry<String,ZkNodeProps> shard : shards.entrySet()) {
+        Map<String,Replica> shards = entry.getValue().getReplicasMap();
+        for (Map.Entry<String,Replica> shard : shards.entrySet()) {
           if (verbose) System.out.println("rstate:"
-              + shard.getValue().get(ZkStateReader.STATE_PROP)
+              + shard.getValue().getStr(ZkStateReader.STATE_PROP)
               + " live:"
-              + clusterState.liveNodesContain(shard.getValue().get(
-                  ZkStateReader.NODE_NAME_PROP)));
-          String state = shard.getValue().get(ZkStateReader.STATE_PROP);
+              + clusterState.liveNodesContain(shard.getValue().getStr(
+              ZkStateReader.NODE_NAME_PROP)));
+          String state = shard.getValue().getStr(ZkStateReader.STATE_PROP);
           if ((state.equals(ZkStateReader.RECOVERING) || state
               .equals(ZkStateReader.SYNC) || state.equals(ZkStateReader.DOWN))
-              && clusterState.liveNodesContain(shard.getValue().get(
-                  ZkStateReader.NODE_NAME_PROP))) {
+              && clusterState.liveNodesContain(shard.getValue().getStr(
+              ZkStateReader.NODE_NAME_PROP))) {
             sawLiveRecovering = true;
           }
         }
@@ -176,10 +176,10 @@ public abstract class AbstractDistribZkT
         throw new IllegalArgumentException("Cannot find collection:" + collection);
       }
       for (Map.Entry<String,Slice> entry : slices.entrySet()) {
-        Map<String,ZkNodeProps> shards = entry.getValue().getShards();
-        for (Map.Entry<String,ZkNodeProps> shard : shards.entrySet()) {
+        Map<String,Replica> shards = entry.getValue().getReplicasMap();
+        for (Map.Entry<String,Replica> shard : shards.entrySet()) {
 
-          String state = shard.getValue().get(ZkStateReader.STATE_PROP);
+          String state = shard.getValue().getStr(ZkStateReader.STATE_PROP);
           if (!state.equals(ZkStateReader.ACTIVE)) {
             fail("Not all shards are ACTIVE - found a shard that is: " + state);
           }

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java Fri Sep 21 17:21:34 2012
@@ -31,9 +31,7 @@ import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.http.params.CoreConnectionPNames;
-import org.apache.lucene.util.LuceneTestCase.BadApple;
 import org.apache.lucene.util.LuceneTestCase.Slow;
-import org.apache.lucene.util.LuceneTestCase.AwaitsFix;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -42,12 +40,12 @@ import org.apache.solr.client.solrj.impl
 import org.apache.solr.client.solrj.impl.HttpSolrServer;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.cloud.ChaosMonkey;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.cloud.ZkNodeProps;
@@ -65,8 +63,6 @@ import org.slf4j.LoggerFactory;
  * what we test now - the default update chain
  */
 @Slow
-@BadApple
-@AwaitsFix(bugUrl = "SOLR-3727 (leak threads)") 
 public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTestBase {
   static Logger log = LoggerFactory.getLogger(AbstractFullDistribZkTestBase.class);
   
@@ -246,7 +242,7 @@ public abstract class AbstractFullDistri
           server.getLbServer().getHttpClient().getParams()
               .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);
           server.getLbServer().getHttpClient().getParams()
-              .setParameter(CoreConnectionPNames.SO_TIMEOUT, 15000);
+              .setParameter(CoreConnectionPNames.SO_TIMEOUT, 20000);
           cloudClient = server;
         } catch (MalformedURLException e) {
           throw new RuntimeException(e);
@@ -261,7 +257,12 @@ public abstract class AbstractFullDistri
     System.setProperty("collection", "control_collection");
     String numShards = System.getProperty(ZkStateReader.NUM_SHARDS_PROP);
     System.clearProperty(ZkStateReader.NUM_SHARDS_PROP);
-    controlJetty = createJetty(new File(getSolrHome()), testDir + "/control/data",
+    
+    File controlJettyDir = new File(TEMP_DIR,
+            getClass().getName() + "-controljetty-" + System.currentTimeMillis());
+    org.apache.commons.io.FileUtils.copyDirectory(new File(getSolrHome()), controlJettyDir);
+
+    controlJetty = createJetty(controlJettyDir, testDir + "/control/data",
         "control_shard");
     System.clearProperty("collection");
     if(numShards != null) {
@@ -292,8 +293,13 @@ public abstract class AbstractFullDistri
     StringBuilder sb = new StringBuilder();
     for (int i = 1; i <= numJettys; i++) {
       if (sb.length() > 0) sb.append(',');
-      JettySolrRunner j = createJetty(new File(getSolrHome()), testDir + "/jetty"
-          + this.jettyIntCntr.incrementAndGet(), null, "solrconfig.xml", null);
+      int cnt = this.jettyIntCntr.incrementAndGet();
+      File jettyDir = new File(TEMP_DIR,
+          getClass().getName() + "-jetty" + cnt + "-" + System.currentTimeMillis());
+      jettyDir.mkdirs();
+      org.apache.commons.io.FileUtils.copyDirectory(new File(getSolrHome()), jettyDir);
+      JettySolrRunner j = createJetty(jettyDir, testDir + "/jetty"
+          + cnt, null, "solrconfig.xml", null);
       jettys.add(j);
       SolrServer client = createNewSolrServer(j.getLocalPort());
       clients.add(client);
@@ -333,8 +339,8 @@ public abstract class AbstractFullDistri
       JettySolrRunner j = this.jettys.get(i);
       JettySolrRunner j2 = this.jettys.get(i + (numJettys / 2 - 1));
       if (sb.length() > 0) sb.append(',');
-      sb.append("localhost:").append(j.getLocalPort()).append(context);
-      sb.append("|localhost:").append(j2.getLocalPort()).append(context);
+      sb.append("127.0.0.1:").append(j.getLocalPort()).append(context);
+      sb.append("|127.0.0.1:").append(j2.getLocalPort()).append(context);
     }
     shards = sb.toString();
     
@@ -345,7 +351,7 @@ public abstract class AbstractFullDistri
     Map<String,Slice> slices = this.zkStateReader.getClusterState().getSlices(defaultCollection);
     int cnt = 0;
     for (Map.Entry<String,Slice> entry : slices.entrySet()) {
-      cnt += entry.getValue().getShards().size();
+      cnt += entry.getValue().getReplicasMap().size();
     }
     
     return cnt;
@@ -383,8 +389,8 @@ public abstract class AbstractFullDistri
       nextClient:
       // we find ou state by simply matching ports...
       for (Map.Entry<String,Slice> slice : slices.entrySet()) {
-        Map<String,ZkNodeProps> theShards = slice.getValue().getShards();
-        for (Map.Entry<String,ZkNodeProps> shard : theShards.entrySet()) {
+        Map<String,Replica> theShards = slice.getValue().getReplicasMap();
+        for (Map.Entry<String,Replica> shard : theShards.entrySet()) {
           int port = new URI(((HttpSolrServer) client).getBaseURL())
               .getPort();
           
@@ -392,7 +398,7 @@ public abstract class AbstractFullDistri
             CloudSolrServerClient csc = new CloudSolrServerClient();
             csc.solrClient = client;
             csc.port = port;
-            csc.shardName = shard.getValue().get(ZkStateReader.NODE_NAME_PROP);
+            csc.shardName = shard.getValue().getStr(ZkStateReader.NODE_NAME_PROP);
             csc.info = shard.getValue();
             
             theClients .add(csc);
@@ -411,8 +417,8 @@ public abstract class AbstractFullDistri
       
       nextJetty:
       for (Map.Entry<String,Slice> slice : slices.entrySet()) {
-        Map<String,ZkNodeProps> theShards = slice.getValue().getShards();
-        for (Map.Entry<String,ZkNodeProps> shard : theShards.entrySet()) {
+        Map<String,Replica> theShards = slice.getValue().getReplicasMap();
+        for (Map.Entry<String,Replica> shard : theShards.entrySet()) {
           if (shard.getKey().contains(":" + port + "_")) {
             List<CloudJettyRunner> list = shardToJetty.get(slice.getKey());
             if (list == null) {
@@ -424,9 +430,9 @@ public abstract class AbstractFullDistri
             CloudJettyRunner cjr = new CloudJettyRunner();
             cjr.jetty = jetty;
             cjr.info = shard.getValue();
-            cjr.nodeName = shard.getValue().get(ZkStateReader.NODE_NAME_PROP);
+            cjr.nodeName = shard.getValue().getStr(ZkStateReader.NODE_NAME_PROP);
             cjr.coreNodeName = shard.getKey();
-            cjr.url = shard.getValue().get(ZkStateReader.BASE_URL_PROP) + "/" + shard.getValue().get(ZkStateReader.CORE_NAME_PROP);
+            cjr.url = shard.getValue().getStr(ZkStateReader.BASE_URL_PROP) + "/" + shard.getValue().getStr(ZkStateReader.CORE_NAME_PROP);
             cjr.client = findClientByPort(port, theClients);
             list.add(cjr);
             if (isLeader) {
@@ -447,7 +453,7 @@ public abstract class AbstractFullDistri
       List<CloudJettyRunner> jetties = shardToJetty.get(slice.getKey());
       assertNotNull("Test setup problem: We found no jetties for shard: " + slice.getKey()
           + " just:" + shardToJetty.keySet(), jetties);
-      assertEquals(slice.getValue().getShards().size(), jetties.size());
+      assertEquals(slice.getValue().getReplicasMap().size(), jetties.size());
     }
   }
   
@@ -757,7 +763,7 @@ public abstract class AbstractFullDistri
         "The client count does not match up with the shard count for slice:"
             + shard,
         zkStateReader.getClusterState().getSlice(DEFAULT_COLLECTION, shard)
-            .getShards().size(), solrJetties.size());
+            .getReplicasMap().size(), solrJetties.size());
 
     CloudJettyRunner lastJetty = null;
     for (CloudJettyRunner cjetty : solrJetties) {
@@ -780,7 +786,7 @@ public abstract class AbstractFullDistri
       }
       
       boolean live = false;
-      String nodeName = props.get(ZkStateReader.NODE_NAME_PROP);
+      String nodeName = props.getStr(ZkStateReader.NODE_NAME_PROP);
       if (zkStateReader.getClusterState().liveNodesContain(nodeName)) {
         live = true;
       }
@@ -788,7 +794,7 @@ public abstract class AbstractFullDistri
       
       if (verbose) System.err.println(" num:" + num + "\n");
       
-      boolean active = props.get(ZkStateReader.STATE_PROP).equals(
+      boolean active = props.getStr(ZkStateReader.STATE_PROP).equals(
           ZkStateReader.ACTIVE);
       if (active && live) {
         if (lastNum > -1 && lastNum != num && failMessage == null) {
@@ -806,7 +812,7 @@ public abstract class AbstractFullDistri
             SolrDocumentList lst1 = lastJetty.client.solrClient.query(query).getResults();
             SolrDocumentList lst2 = cjetty.client.solrClient.query(query).getResults();
 
-            showDiff(lst1, lst2, lastJetty.toString(), cjetty.client.solrClient.toString());
+            showDiff(lst1, lst2, lastJetty.url, cjetty.url);
           }
 
         }
@@ -882,7 +888,7 @@ public abstract class AbstractFullDistri
             CloudJettyRunner cjetty = shardToJetty.get(s).get(i);
             ZkNodeProps props = cjetty.info;
             SolrServer client = cjetty.client.solrClient;
-            boolean active = props.get(ZkStateReader.STATE_PROP).equals(
+            boolean active = props.getStr(ZkStateReader.STATE_PROP).equals(
                 ZkStateReader.ACTIVE);
             if (active) {
               SolrQuery query = new SolrQuery("*:*");
@@ -891,11 +897,11 @@ public abstract class AbstractFullDistri
               if (verbose) System.err.println(new ZkCoreNodeProps(props)
                   .getCoreUrl() + " : " + results);
               if (verbose) System.err.println("shard:"
-                  + props.get(ZkStateReader.SHARD_ID_PROP));
+                  + props.getStr(ZkStateReader.SHARD_ID_PROP));
               cnt += results;
               break;
             }
-          } catch (SolrServerException e) {
+          } catch (Exception e) {
             // if we have a problem, try the next one
             if (i == times - 1) {
               throw e;
@@ -953,8 +959,8 @@ public abstract class AbstractFullDistri
     for (CloudJettyRunner cjetty : cloudJettys) {
       CloudSolrServerClient client = cjetty.client;
       for (Map.Entry<String,Slice> slice : slices.entrySet()) {
-        Map<String,ZkNodeProps> theShards = slice.getValue().getShards();
-        for (Map.Entry<String,ZkNodeProps> shard : theShards.entrySet()) {
+        Map<String,Replica> theShards = slice.getValue().getReplicasMap();
+        for (Map.Entry<String,Replica> shard : theShards.entrySet()) {
           String shardName = new URI(
               ((HttpSolrServer) client.solrClient).getBaseURL()).getPort()
               + "_solr_";
@@ -966,11 +972,11 @@ public abstract class AbstractFullDistri
       }
       
       long count = 0;
-      String currentState = cjetty.info.get(ZkStateReader.STATE_PROP);
+      String currentState = cjetty.info.getStr(ZkStateReader.STATE_PROP);
       if (currentState != null
           && currentState.equals(ZkStateReader.ACTIVE)
           && zkStateReader.getClusterState().liveNodesContain(
-              cjetty.info.get(ZkStateReader.NODE_NAME_PROP))) {
+              cjetty.info.getStr(ZkStateReader.NODE_NAME_PROP))) {
         SolrQuery query = new SolrQuery("*:*");
         query.set("distrib", false);
         count = client.solrClient.query(query).getResults().getNumFound();
@@ -1135,7 +1141,8 @@ public abstract class AbstractFullDistri
       
       try {
         commit();
-      } catch (Exception e) {
+      } catch (Throwable t) {
+        t.printStackTrace();
         // we don't care if this commit fails on some nodes
       }
       
@@ -1151,8 +1158,8 @@ public abstract class AbstractFullDistri
         retry  = true;
       }
       cnt++;
-      if (cnt > 2) break;
-      Thread.sleep(4000);
+      if (cnt > 4) break;
+      Thread.sleep(2000);
     } while (retry);
   }
   
@@ -1196,11 +1203,11 @@ public abstract class AbstractFullDistri
   protected SolrServer createNewSolrServer(int port) {
     try {
       // setup the server...
-      String url = "http://localhost:" + port + context + "/"
+      String url = "http://127.0.0.1:" + port + context + "/"
           + DEFAULT_COLLECTION;
       HttpSolrServer s = new HttpSolrServer(url);
       s.setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT);
-      s.setSoTimeout(20000);
+      s.setSoTimeout(40000);
       s.setDefaultMaxConnectionsPerHost(100);
       s.setMaxTotalConnections(100);
       return s;
@@ -1213,8 +1220,8 @@ public abstract class AbstractFullDistri
       CloudJettyRunner cjetty) throws InterruptedException {
     int tries = 0;
     while (zkStateReader.getClusterState()
-        .liveNodesContain(cjetty.info.get(ZkStateReader.NODE_NAME_PROP))) {
-      if (tries++ == 120) {
+        .liveNodesContain(cjetty.info.getStr(ZkStateReader.NODE_NAME_PROP))) {
+      if (tries++ == 220) {
         fail("Shard still reported as live in zk");
       }
       Thread.sleep(1000);

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java Fri Sep 21 17:21:34 2012
@@ -93,7 +93,7 @@ public abstract class AbstractZkTestCase
 
     zkClient = new SolrZkClient(zkAddress, AbstractZkTestCase.TIMEOUT);
 
-    Map<String,String> props = new HashMap<String,String>();
+    Map<String,Object> props = new HashMap<String,Object>();
     props.put("configName", "conf1");
     final ZkNodeProps zkProps = new ZkNodeProps(props);
     

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java Fri Sep 21 17:21:34 2012
@@ -17,7 +17,6 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
-import java.net.BindException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -33,6 +32,7 @@ import org.apache.solr.common.cloud.Solr
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.servlet.SolrDispatchFilter;
 import org.apache.zookeeper.KeeperException;
 import org.eclipse.jetty.servlet.FilterHolder;
@@ -44,13 +44,16 @@ import org.slf4j.LoggerFactory;
  * 
  * It can also run in a background thread and start and stop jetties
  * randomly.
- *
+ * TODO: expire multiple sessions / connectionloss at once
+ * TODO: kill multiple jetties at once
+ * TODO: ? add random headhunter mode that always kills the leader
+ * TODO: chaosmonkey should be able to do cluster stop/start tests
  */
 public class ChaosMonkey {
   private static Logger log = LoggerFactory.getLogger(ChaosMonkey.class);
   
-  private static final int CONLOSS_PERCENT = 3; //30%
-  private static final int EXPIRE_PERCENT = 4; //40%
+  private static final int CONLOSS_PERCENT = 10; // 0 - 10 = 0 - 100%
+  private static final int EXPIRE_PERCENT = 10; // 0 - 10 = 0 - 100%
   private Map<String,List<CloudJettyRunner>> shardToJetty;
   
   private ZkTestServer zkServer;
@@ -68,6 +71,8 @@ public class ChaosMonkey {
   private boolean aggressivelyKillLeaders;
   private Map<String,CloudJettyRunner> shardToLeaderJetty;
   private long startTime;
+
+  private Thread monkeyThread;
   
   public ChaosMonkey(ZkTestServer zkServer, ZkStateReader zkStateReader,
       String collection, Map<String,List<CloudJettyRunner>> shardToJetty,
@@ -78,22 +83,50 @@ public class ChaosMonkey {
     this.zkStateReader = zkStateReader;
     this.collection = collection;
     Random random = LuceneTestCase.random();
-    expireSessions = random.nextBoolean();
-    causeConnectionLoss = random.nextBoolean();
+    expireSessions = true; //= random.nextBoolean();
+    
+    causeConnectionLoss = true;//= random.nextBoolean();
     monkeyLog("init - expire sessions:" + expireSessions
         + " cause connection loss:" + causeConnectionLoss);
   }
   
-  public void expireSession(JettySolrRunner jetty) {
+  // TODO: expire all clients at once?
+  public void expireSession(final JettySolrRunner jetty) {
     monkeyLog("expire session for " + jetty.getLocalPort() + " !");
-    SolrDispatchFilter solrDispatchFilter = (SolrDispatchFilter) jetty.getDispatchFilter().getFilter();
+    
+    SolrDispatchFilter solrDispatchFilter = (SolrDispatchFilter) jetty
+        .getDispatchFilter().getFilter();
     if (solrDispatchFilter != null) {
       CoreContainer cores = solrDispatchFilter.getCores();
       if (cores != null) {
-        long sessionId = cores.getZkController().getZkClient().getSolrZooKeeper().getSessionId();
-        zkServer.expire(sessionId);
+        causeConnectionLoss(jetty, cores.getZkController().getClientTimeout() + 200);
       }
     }
+    
+
+//    Thread thread = new Thread() {
+//      {
+//        setDaemon(true);
+//      }
+//      public void run() {
+//        SolrDispatchFilter solrDispatchFilter = (SolrDispatchFilter) jetty.getDispatchFilter().getFilter();
+//        if (solrDispatchFilter != null) {
+//          CoreContainer cores = solrDispatchFilter.getCores();
+//          if (cores != null) {
+//            try {
+//              Thread.sleep(ZkTestServer.TICK_TIME * 2 + 800);
+//            } catch (InterruptedException e) {
+//              // we act as only connection loss
+//              return;
+//            }
+//            long sessionId = cores.getZkController().getZkClient().getSolrZooKeeper().getSessionId();
+//            zkServer.expire(sessionId);
+//          }
+//        }
+//      }
+//    };
+//    thread.start();
+
   }
   
   public void expireRandomSession() throws KeeperException, InterruptedException {
@@ -118,6 +151,10 @@ public class ChaosMonkey {
   }
   
   private void causeConnectionLoss(JettySolrRunner jetty) {
+    causeConnectionLoss(jetty, ZkTestServer.TICK_TIME * 2 + 200);
+  }
+  
+  private void causeConnectionLoss(JettySolrRunner jetty, int pauseTime) {
     SolrDispatchFilter solrDispatchFilter = (SolrDispatchFilter) jetty
         .getDispatchFilter().getFilter();
     if (solrDispatchFilter != null) {
@@ -125,7 +162,7 @@ public class ChaosMonkey {
       if (cores != null) {
         SolrZkClient zkClient = cores.getZkController().getZkClient();
         // must be at least double tick time...
-        zkClient.getSolrZooKeeper().pauseCnxn(ZkTestServer.TICK_TIME * 2);
+        zkClient.getSolrZooKeeper().pauseCnxn(pauseTime);
       }
     }
   }
@@ -172,16 +209,10 @@ public class ChaosMonkey {
   public static void kill(CloudJettyRunner cjetty) throws Exception {
     JettySolrRunner jetty = cjetty.jetty;
     monkeyLog("kill shard! " + jetty.getLocalPort());
-    FilterHolder fh = jetty.getDispatchFilter();
-    SolrDispatchFilter sdf = null;
-    if (fh != null) {
-      sdf = (SolrDispatchFilter) fh.getFilter();
-    }
+    
     jetty.stop();
     
-    if (sdf != null) {
-      sdf.destroy();
-    }
+    stop(jetty);
     
     if (!jetty.isStopped()) {
       throw new RuntimeException("could not kill jetty");
@@ -264,13 +295,13 @@ public class ChaosMonkey {
       Slice theShards = zkStateReader.getClusterState().getSlices(collection)
           .get(slice);
       
-      ZkNodeProps props = theShards.getShards().get(cloudJetty.coreNodeName);
+      ZkNodeProps props = theShards.getReplicasMap().get(cloudJetty.coreNodeName);
       if (props == null) {
-        throw new RuntimeException("shard name " + cloudJetty.coreNodeName + " not found in " + theShards.getShards().keySet());
+        throw new RuntimeException("shard name " + cloudJetty.coreNodeName + " not found in " + theShards.getReplicasMap().keySet());
       }
       
-      String state = props.get(ZkStateReader.STATE_PROP);
-      String nodeName = props.get(ZkStateReader.NODE_NAME_PROP);
+      String state = props.getStr(ZkStateReader.STATE_PROP);
+      String nodeName = props.getStr(ZkStateReader.NODE_NAME_PROP);
       
       
       if (!cloudJetty.jetty.isRunning()
@@ -296,6 +327,7 @@ public class ChaosMonkey {
       }
     }
     
+    // TODO: stale state makes this a tough call
     if (numActive < 2) {
       // we cannot kill anyone
       monkeyLog("only one active node in shard - monkey cannot kill :(");
@@ -313,8 +345,44 @@ public class ChaosMonkey {
       int index = random.nextInt(jetties.size());
       cjetty = jetties.get(index);
       
-      ZkNodeProps leader = zkStateReader.getLeaderProps(collection, slice);
-      boolean isLeader = leader.get(ZkStateReader.NODE_NAME_PROP).equals(jetties.get(index).nodeName);
+      ZkNodeProps leader = null;
+      try {
+        leader = zkStateReader.getLeaderProps(collection, slice);
+      } catch (Throwable t) {
+        log.error("Could not get leader", t);
+        return null;
+      }
+      
+      FilterHolder fh = cjetty.jetty.getDispatchFilter();
+      if (fh == null) {
+        monkeyLog("selected jetty not running correctly - skip");
+        return null;
+      }
+      SolrDispatchFilter df = ((SolrDispatchFilter) fh.getFilter());
+      if (df == null) {
+        monkeyLog("selected jetty not running correctly - skip");
+        return null;
+      }
+      CoreContainer cores = df.getCores();
+      if (cores == null) {
+        monkeyLog("selected jetty not running correctly - skip");
+        return null;
+      }
+      SolrCore core = cores.getCore(leader.getStr(ZkStateReader.CORE_NAME_PROP));
+      if (core == null) {
+        monkeyLog("selected jetty not running correctly - skip");
+        return null;
+      }
+      // cluster state can be stale - also go by our 'near real-time' is leader prop
+      boolean rtIsLeader;
+      try {
+        rtIsLeader = core.getCoreDescriptor().getCloudDescriptor().isLeader();
+      } finally {
+        core.close();
+      }
+      
+      boolean isLeader = leader.getStr(ZkStateReader.NODE_NAME_PROP).equals(jetties.get(index).nodeName)
+          || rtIsLeader;
       if (!aggressivelyKillLeaders && isLeader) {
         // we don't kill leaders...
         monkeyLog("abort! I don't kill leaders");
@@ -348,22 +416,23 @@ public class ChaosMonkey {
   
   // synchronously starts and stops shards randomly, unless there is only one
   // active shard up for a slice or if there is one active and others recovering
-  public void startTheMonkey(boolean killLeaders, final int roundPause) {
+  public void startTheMonkey(boolean killLeaders, final int roundPauseUpperLimit) {
     monkeyLog("starting");
     this.aggressivelyKillLeaders = killLeaders;
     startTime = System.currentTimeMillis();
     // TODO: when kill leaders is on, lets kill a higher percentage of leaders
     
     stop = false;
-    new Thread() {
+    monkeyThread = new Thread() {
       private List<CloudJettyRunner> deadPool = new ArrayList<CloudJettyRunner>();
 
       @Override
       public void run() {
         while (!stop) {
           try {
-            Thread.sleep(roundPause);
+    
             Random random = LuceneTestCase.random();
+            Thread.sleep(random.nextInt(roundPauseUpperLimit));
             if (random.nextBoolean()) {
              if (!deadPool.isEmpty()) {
                int index = random.nextInt(deadPool.size());
@@ -386,7 +455,6 @@ public class ChaosMonkey {
             
             if (causeConnectionLoss && rnd < CONLOSS_PERCENT) {
               randomConnectionLoss();
-              randomConnectionLoss();
             }
             
             CloudJettyRunner cjetty;
@@ -413,7 +481,8 @@ public class ChaosMonkey {
             + ". I also expired " + expires.get() + " and caused " + connloss
             + " connection losses");
       }
-    }.start();
+    };
+    monkeyThread.start();
   }
   
   public static void monkeyLog(String msg) {
@@ -422,6 +491,11 @@ public class ChaosMonkey {
   
   public void stopTheMonkey() {
     stop = true;
+    try {
+      monkeyThread.join();
+    } catch (InterruptedException e) {
+      Thread.currentThread().interrupt();
+    }
   }
 
   public int getStarts() {
@@ -433,19 +507,21 @@ public class ChaosMonkey {
   }
   
   public static boolean start(JettySolrRunner jetty) throws Exception {
+    
     try {
       jetty.start();
-    } catch (BindException e) {
+    } catch (Exception e) {
       jetty.stop();
       Thread.sleep(2000);
       try {
         jetty.start();
-      } catch (BindException e2) {
+      } catch (Exception e2) {
         jetty.stop();
         Thread.sleep(5000);
         try {
           jetty.start();
-        } catch (BindException e3) {
+        } catch (Exception e3) {
+          log.error("Could not get the port to start jetty again", e3);
           // we coud not get the port
           jetty.stop();
           return false;

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java Fri Sep 21 17:21:34 2012
@@ -43,7 +43,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class ZkTestServer {
-  public static final int TICK_TIME = 3000;
+  public static final int TICK_TIME = 1000;
 
   private static Logger log = LoggerFactory.getLogger(ZkTestServer.class);
   
@@ -240,6 +240,7 @@ public class ZkTestServer {
       }
       cnt++;
     }
+    log.info("start zk server on port:" + port);
   }
 
   @SuppressWarnings("deprecation")

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java Fri Sep 21 17:21:34 2012
@@ -32,10 +32,12 @@ public class MockDirectoryFactory extend
   @Override
   protected Directory create(String path) throws IOException {
     Directory dir = LuceneTestCase.newDirectory();
-    // Somehow removing unref'd files in Solr tests causes
-    // problems... there's some interaction w/
-    // CachingDirectoryFactory.  Once we track down where Solr
-    // isn't closing an IW, we can re-enable this:
+    // we can't currently do this check because of how
+    // Solr has to reboot a new Directory sometimes when replicating
+    // or rolling back - the old directory is closed and the following
+    // test assumes it can open an IndexWriter when that happens - we
+    // have a new Directory for the same dir and still an open IW at 
+    // this point
     if (dir instanceof MockDirectoryWrapper) {
       ((MockDirectoryWrapper)dir).setAssertNoUnrefencedFilesOnClose(false);
     }

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/core/MockFSDirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/core/MockFSDirectoryFactory.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/core/MockFSDirectoryFactory.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/core/MockFSDirectoryFactory.java Fri Sep 21 17:21:34 2012
@@ -32,10 +32,12 @@ public class MockFSDirectoryFactory exte
   @Override
   public Directory create(String path) throws IOException {
     Directory dir = LuceneTestCase.newFSDirectory(new File(path));
-    // Somehow removing unref'd files in Solr tests causes
-    // problems... there's some interaction w/
-    // CachingDirectoryFactory.  Once we track down where Solr
-    // isn't closing an IW, we can re-enable this:
+    // we can't currently do this check because of how
+    // Solr has to reboot a new Directory sometimes when replicating
+    // or rolling back - the old directory is closed and the following
+    // test assumes it can open an IndexWriter when that happens - we
+    // have a new Directory for the same dir and still an open IW at 
+    // this point
     if (dir instanceof MockDirectoryWrapper) {
       ((MockDirectoryWrapper)dir).setAssertNoUnrefencedFilesOnClose(false);
     }

Modified: lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java (original)
+++ lucene/dev/branches/LUCENE-2878/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java Fri Sep 21 17:21:34 2012
@@ -76,17 +76,30 @@ public class TestHarness {
   private final ThreadLocal<DocumentBuilder> builderTL = new ThreadLocal<DocumentBuilder>();
   private final ThreadLocal<XPath> xpathTL = new ThreadLocal<XPath>();
   public UpdateRequestHandler updater;
-        
-  public static SolrConfig createConfig(String solrHome, String confFile) {
+ 
+  /**
+   * Creates a SolrConfig object for the specified coreName assuming it 
+   * follows the basic conventions of being a relative path in the solrHome 
+   * dir. (ie: <code>${solrHome}/${coreName}/conf/${confFile}</code>
+   */
+  public static SolrConfig createConfig(String solrHome, String coreName, String confFile) {
     // set some system properties for use by tests
     System.setProperty("solr.test.sys.prop1", "propone");
     System.setProperty("solr.test.sys.prop2", "proptwo");
     try {
-      return new SolrConfig(solrHome + File.separator + "collection1", confFile, null);
+      return new SolrConfig(solrHome + File.separator + coreName, confFile, null);
     } catch (Exception xany) {
       throw new RuntimeException(xany);
     }
   }
+  
+  /**
+   * Creates a SolrConfig object for the 
+   * {@link CoreContainer#DEFAULT_DEFAULT_CORE_NAME} core using {@link #createConfig(String,String,String)}
+   */
+  public static SolrConfig createConfig(String solrHome, String confFile) {
+    return createConfig(solrHome, CoreContainer.DEFAULT_DEFAULT_CORE_NAME, confFile);
+  }
 
    /**
     * @param dataDirectory path for index data, will not be cleaned up
@@ -176,7 +189,7 @@ public class TestHarness {
         {
           hostPort = System.getProperty("hostPort");
           hostContext = "solr";
-          defaultCoreName = "collection1";
+          defaultCoreName = CoreContainer.DEFAULT_DEFAULT_CORE_NAME;
           initZooKeeper(System.getProperty("zkHost"), 10000);
         }
       };

Modified: lucene/dev/branches/LUCENE-2878/solr/testlogging.properties
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/testlogging.properties?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/testlogging.properties (original)
+++ lucene/dev/branches/LUCENE-2878/solr/testlogging.properties Fri Sep 21 17:21:34 2012
@@ -10,7 +10,13 @@ java.util.logging.ConsoleHandler.formatt
 #org.apache.solr.update.processor.LogUpdateProcessor=FINEST
 #org.apache.solr.update.processor.DistributedUpdateProcessor=FINEST
 #org.apache.solr.update.PeerSync.level=FINEST
+#org.apache.solr.core.CoreContainer.level=FINEST
 #org.apache.solr.cloud.RecoveryStrategy.level=FINEST
+#org.apache.solr.cloud.SyncStrategy.level=FINEST
+#org.apache.solr.cloud.ZkController.level=FINEST
+#org.apache.solr.update.DefaultSolrCoreState.level=FINEST
+#org.apache.solr.common.cloud.ConnectionManager.level=FINEST
 #org.apache.solr.update.UpdateLog.level=FINE
+#org.apache.solr.cloud.ChaosMonkey.level=FINEST
 #org.apache.solr.update.TransactionLog.level=FINEST
 

Modified: lucene/dev/branches/LUCENE-2878/solr/webapp/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/webapp/build.xml?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/webapp/build.xml (original)
+++ lucene/dev/branches/LUCENE-2878/solr/webapp/build.xml Fri Sep 21 17:21:34 2012
@@ -40,10 +40,6 @@
   <target name="dist"
           description="Creates the Solr WAR Distribution file."
           depends="test, init-dist, dist-core, dist-solrj, lucene-jars-to-solr">
-    <exec dir="." executable="${svnversion.exe}"
-          outputproperty="svnversion" failifexecutionfails="false">
-      <arg line="."/>
-    </exec>
     <build-manifest title="Apache Solr Search Server"
                     implementation.title="org.apache.solr"
                     spec.version="${solr.spec.version}"/>
@@ -51,11 +47,11 @@
     <war destfile="${dist}/apache-solr-${version}${solr.war.suffix}.war"
          webxml="web/WEB-INF/web.xml"
          manifest="${manifest.file}">
-      <lib dir="${common-solr.dir}/lib" excludes="${exclude.from.war},${common.classpath.excludes}">
+      <lib dir="${common-solr.dir}/core/lib" excludes="${exclude.from.war},${common.classpath.excludes}">
         <exclude name="servlet-api*.jar" />
         <exclude name="easymock-*.jar" />
-        <exclude name="junit-*.jar" />
       </lib>
+      <lib dir="${common-solr.dir}/solrj/lib" excludes="${exclude.from.war},${common.classpath.excludes}"/>
       <lib dir="${lucene-libs}" excludes="${exclude.from.war},${common.classpath.excludes}" />
       <lib dir="${dist}" excludes="${exclude.from.war},${common.classpath.excludes}">
         <include name="apache-solr-solrj-${version}.jar" />

Modified: lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/common.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/common.css?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/common.css (original)
+++ lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/common.css Fri Sep 21 17:21:34 2012
@@ -163,6 +163,7 @@ ul
 
 #wrapper
 {
+  position: relative;
   margin: 0 auto;
   margin-bottom: 30px;
   text-align: left;
@@ -171,7 +172,8 @@ ul
 #header
 {
   padding-bottom: 10px;
-  position: relative;
+  position: absolute;
+  z-index: 42;
 }
 
 #header #solr
@@ -207,6 +209,7 @@ ul
   background-position: 10px 50%;
   color: #fff;
   font-weight: bold;
+  margin-left: 150px;
   margin-bottom: 20px;
   padding: 10px;
   padding-left: 35px;
@@ -254,34 +257,33 @@ ul
 #environment
 {
   background-image: url( ../../img/ico/box.png );
-  background-position: 10px 50%;
-  border: 1px solid #c0c0c0;
+  background-position: 5px 50%;
   display: none;
   font-weight: bold;
+  margin-top: 10px;
   padding: 5px 10px;
-  padding-left: 31px;
-  position: absolute;
-  top: 0;
-  right: 0;
+  padding-left: 26px;
+}
+
+.has-environment #environment
+{
+  display: block;
 }
 
 #environment.prod
 {
   background-color: #c37f7f;
-  border-color: #b15757;
   color: #fff;
 }
 
 #environment.test
 {
   background-color: #f5f5b2;
-  border-color: #e4e433;
 }
 
 #environment.dev
 {
   background-color: #cce7cc;
-  border-color: #66b866;
 }
 
 #init-failures
@@ -292,11 +294,6 @@ ul
   margin-bottom: 20px;
 }
 
-#main.error #init-failures
-{
-  margin-left: 0;
-}
-
 #init-failures h2,
 #init-failures ul,
 #init-failures p

Modified: lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/cores.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/cores.css?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/cores.css (original)
+++ lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/cores.css Fri Sep 21 17:21:34 2012
@@ -46,6 +46,12 @@
   display: none;
 }
 
+#content #cores .actions form .error
+{
+  color: #800;
+  display: none;
+}
+
 #content #cores .actions form p
 {
   padding-bottom: 8px;
@@ -62,7 +68,8 @@
 
 #content #cores .actions form input,
 #content #cores .actions form select,
-#content #cores .actions form .buttons
+#content #cores .actions form .buttons,
+#content #cores .actions form .error span
 {
   float: right;
   width: 73%;

Modified: lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/menu.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/menu.css?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/menu.css (original)
+++ lucene/dev/branches/LUCENE-2878/solr/webapp/web/css/styles/menu.css Fri Sep 21 17:21:34 2012
@@ -1,10 +1,15 @@
 #menu-wrapper
 {
   position: absolute;
-  top: 0;
+  top: 90px;
   width: 150px;
 }
 
+.has-environment #menu-wrapper
+{
+  top: 130px;
+}
+
 #menu-wrapper a
 {
   display: block;

Modified: lucene/dev/branches/LUCENE-2878/solr/webapp/web/js/scripts/analysis.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/webapp/web/js/scripts/analysis.js?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/webapp/web/js/scripts/analysis.js (original)
+++ lucene/dev/branches/LUCENE-2878/solr/webapp/web/js/scripts/analysis.js Fri Sep 21 17:21:34 2012
@@ -15,8 +15,6 @@
  limitations under the License.
 */
 
-var cookie_analysis_verbose = 'analysis_verbose';
-
 // #/:core/analysis
 sammy.get
 (
@@ -26,7 +24,7 @@ sammy.get
     var active_core = this.active_core;
     var core_basepath = active_core.attr( 'data-basepath' );
     var content_element = $( '#content' );
-        
+ 
     $.get
     (
       'tpl/analysis.html',
@@ -40,6 +38,8 @@ sammy.get
         var analysis_result = $( '#analysis-result', analysis_element );
         analysis_result.hide();
 
+        var verbose_link = $( '.verbose_output a', analysis_element );
+
         var type_or_name = $( '#type_or_name', analysis_form );
         var schema_browser_element = $( '#tor_schema' );
         var schema_browser_path = $( 'p > a', active_core ).attr( 'href' ) + '/schema-browser'
@@ -133,6 +133,11 @@ sammy.get
                 }
               }
 
+              if( 'undefined' !== typeof context.params.verbose_output )
+              {
+                verbose_link.trigger( 'toggle', !!context.params.verbose_output.match( /^(1|true)$/ ) );
+              }
+
               if( 0 !== fields )
               {
                 analysis_form
@@ -193,20 +198,18 @@ sammy.get
             );
         }
                         
-        var verbose_link = $( '.verbose_output a', analysis_element );
-
         verbose_link
           .die( 'toggle' )
           .live
           (
             'toggle',
-            function( event )
+            function( event, state )
             {
               $( this ).parent()
-                .toggleClass( 'active' );
+                .toggleClass( 'active', state );
                             
               analysis_result
-                .toggleClass( 'verbose_output' );
+                .toggleClass( 'verbose_output', state );
                             
               check_empty_spacer();
             }
@@ -217,19 +220,13 @@ sammy.get
             'click',
             function( event )
             {
-              $.cookie( cookie_analysis_verbose, $.cookie( cookie_analysis_verbose ) ? null : true );
+              $( this ).parent()
+                .toggleClass( 'active' );
 
-              $( this )
-                .trigger( 'toggle' );
+              analysis_form.trigger( 'submit' );
             }
           );
 
-        if( $.cookie( cookie_analysis_verbose ) )
-        {
-          verbose_link
-            .trigger( 'toggle' );
-        }
-
         var button = $( 'button', analysis_form )
 
         var compute_analysis_params = function()
@@ -238,6 +235,7 @@ sammy.get
                           
           var type_or_name = $( '#type_or_name', analysis_form ).val().split( '=' );
           params.push( { name: 'analysis.' + type_or_name[0], value: type_or_name[1] } );
+          params.push( { name: 'verbose_output', value: $( '.verbose_output', analysis_element ).hasClass( 'active' ) ? 1 : 0 } );
 
           return params;
         }
@@ -261,10 +259,13 @@ sammy.get
             'execute',
             function( event )
             {
+              var url = core_basepath + '/analysis/field?wt=json&analysis.showmatch=true&' + context.path.split( '?' ).pop();
+              url = url.replace( /&verbose_output=\d/, '' );
+
               $.ajax
               (
                 {
-                  url : core_basepath + '/analysis/field?wt=json&analysis.showmatch=true&' + context.path.split( '?' ).pop(),
+                  url : url,
                   dataType : 'json',
                   beforeSend : function( xhr, settings )
                   {

Modified: lucene/dev/branches/LUCENE-2878/solr/webapp/web/js/scripts/app.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/LUCENE-2878/solr/webapp/web/js/scripts/app.js?rev=1388574&r1=1388573&r2=1388574&view=diff
==============================================================================
--- lucene/dev/branches/LUCENE-2878/solr/webapp/web/js/scripts/app.js (original)
+++ lucene/dev/branches/LUCENE-2878/solr/webapp/web/js/scripts/app.js Fri Sep 21 17:21:34 2012
@@ -258,8 +258,7 @@ var solr_admin = function( app_config )
           {
             show_global_error
             (
-              '<div class="message">There are no SolrCores running — for the current functionality ' +
-              'we require at least one SolrCore, sorry :)</div>'
+              '<div class="message">There are no SolrCores running. <br/> Using the Solr Admin UI currently requires at least one SolrCore.</div>'
             );
             return;
           } // else: we have at least one core....
@@ -295,11 +294,12 @@ var solr_admin = function( app_config )
 
                 // environment
 
+                var wrapper = $( '#wrapper' );
                 var environment_element = $( '#environment' );
                 if( environment_args )
                 {
-                  environment_element
-                    .show();
+                  wrapper
+                    .addClass( 'has-environment' );
 
                   if( environment_args[1] )
                   {
@@ -315,8 +315,8 @@ var solr_admin = function( app_config )
                 }
                 else
                 {
-                  environment_element
-                    .remove();
+                  wrapper
+                    .removeClass( 'has-environment' );
                 }
 
                 // cloud