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