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

svn commit: r1370864 - in /lucene/dev/trunk/solr: core/src/test/org/apache/solr/cloud/ solrj/src/java/org/apache/solr/client/solrj/impl/ solrj/src/test-files/solrj/solr/ solrj/src/test-files/solrj/solr/collection1/ solrj/src/test-files/solrj/solr/colle...

Author: markrmiller
Date: Wed Aug  8 18:01:11 2012
New Revision: 1370864

URL: http://svn.apache.org/viewvc?rev=1370864&view=rev
Log:
still favor leaders with CloudSolrServer, but also fall back to replicas after leaders

Added:
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java
    lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/
    lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/
      - copied from r1370367, lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/conf/
    lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig.xml
    lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/solr.xml
    lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
      - copied, changed from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
      - copied, changed from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java
      - copied, changed from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java
      - copied, changed from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
      - copied unchanged from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkTestServer.java
Removed:
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ZkTestServer.java
    lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/conf/
Modified:
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrServer.java
    lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/schema.xml
    lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java

Added: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java?rev=1370864&view=auto
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java (added)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java Wed Aug  8 18:01:11 2012
@@ -0,0 +1,355 @@
+package org.apache.solr.cloud;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrServer;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner;
+import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.cloud.ZkNodeProps;
+import org.apache.solr.common.cloud.ZkStateReader;
+import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.servlet.SolrDispatchFilter;
+
+/**
+ * This test simply does a bunch of basic things in solrcloud mode and asserts things
+ * work as expected.
+ */
+public class BasicDistributedZk2Test extends AbstractFullDistribZkTestBase {
+  
+  public BasicDistributedZk2Test() {
+    super();
+  }
+  
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.apache.solr.BaseDistributedSearchTestCase#doTest()
+   * 
+   * Create 3 shards, each with one replica
+   */
+  @Override
+  public void doTest() throws Exception {
+    boolean testFinished = false;
+    try {
+      handle.clear();
+      handle.put("QTime", SKIPVAL);
+      handle.put("timestamp", SKIPVAL);
+      
+      indexr(id, 1, i1, 100, tlong, 100, t1,
+          "now is the time for all good men", "foo_f", 1.414f, "foo_b", "true",
+          "foo_d", 1.414d);
+      
+      // make sure we are in a steady state...
+      waitForRecoveriesToFinish(false);
+      
+      commit();
+      
+      assertDocCounts(false);
+      
+      indexAbunchOfDocs();
+      
+      // check again 
+      waitForRecoveriesToFinish(false);
+      
+      commit();
+      
+      assertDocCounts(VERBOSE);
+      checkQueries();
+      
+      assertDocCounts(VERBOSE);
+      
+      query("q", "*:*", "sort", "n_tl1 desc");
+      
+      brindDownShardIndexSomeDocsAndRecover();
+      
+      query("q", "*:*", "sort", "n_tl1 desc");
+      
+      // test adding another replica to a shard - it should do a
+      // recovery/replication to pick up the index from the leader
+      addNewReplica();
+      
+      long docId = testUpdateAndDelete();
+      
+      // index a bad doc...
+      try {
+        indexr(t1, "a doc with no id");
+        fail("this should fail");
+      } catch (SolrException e) {
+        // expected
+      }
+      
+      // TODO: bring this to it's own method?
+      // try indexing to a leader that has no replicas up
+      ZkNodeProps leaderProps = zkStateReader.getLeaderProps(
+          DEFAULT_COLLECTION, SHARD2);
+      
+      String nodeName = leaderProps.get(ZkStateReader.NODE_NAME_PROP);
+      chaosMonkey.stopShardExcept(SHARD2, nodeName);
+      
+      SolrServer client = getClient(nodeName);
+      
+      index_specific(client, "id", docId + 1, t1, "what happens here?");
+      
+      // expire a session...
+      CloudJettyRunner cloudJetty = shardToJetty.get("shard1").get(0);
+      chaosMonkey.expireSession(cloudJetty.jetty);
+      
+      indexr("id", docId + 1, t1, "slip this doc in");
+      
+      waitForRecoveriesToFinish(false);
+      
+      checkShardConsistency("shard1");
+      
+      testFinished = true;
+    } finally {
+      if (!testFinished) {
+        printLayoutOnTearDown = true;
+      }
+    }
+    
+  }
+  
+  private long testUpdateAndDelete() throws Exception {
+    long docId = 99999999L;
+    indexr("id", docId, t1, "originalcontent");
+    
+    commit();
+    
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.add("q", t1 + ":originalcontent");
+    QueryResponse results = clients.get(0).query(params);
+    assertEquals(1, results.getResults().getNumFound());
+    
+    // update doc
+    indexr("id", docId, t1, "updatedcontent");
+    
+    commit();
+    
+    results = clients.get(0).query(params);
+    assertEquals(0, results.getResults().getNumFound());
+    
+    params.set("q", t1 + ":updatedcontent");
+    
+    results = clients.get(0).query(params);
+    assertEquals(1, results.getResults().getNumFound());
+    
+    UpdateRequest uReq = new UpdateRequest();
+    // uReq.setParam(UpdateParams.UPDATE_CHAIN, DISTRIB_UPDATE_CHAIN);
+    uReq.deleteById(Long.toString(docId)).process(clients.get(0));
+    
+    commit();
+    
+    results = clients.get(0).query(params);
+    assertEquals(0, results.getResults().getNumFound());
+    return docId;
+  }
+  
+  private void brindDownShardIndexSomeDocsAndRecover() throws Exception {
+    SolrQuery query = new SolrQuery("*:*");
+    query.set("distrib", false);
+    
+    commit();
+    
+    long deadShardCount = shardToJetty.get(SHARD2).get(0).client.solrClient
+        .query(query).getResults().getNumFound();
+
+    query("q", "*:*", "sort", "n_tl1 desc");
+    
+    // kill a shard
+    CloudJettyRunner deadShard = chaosMonkey.stopShard(SHARD2, 0);
+    cloudClient.connect();
+
+    // we are careful to make sure the downed node is no longer in the state,
+    // because on some systems (especially freebsd w/ blackhole enabled), trying
+    // to talk to a downed node causes grief
+    Set<CloudJettyRunner> jetties = new HashSet<CloudJettyRunner>();
+    jetties.addAll(shardToJetty.get(SHARD2));
+    jetties.remove(deadShard);
+    
+    for (CloudJettyRunner cjetty : jetties) {
+      waitToSeeNotLive(((SolrDispatchFilter) cjetty.jetty.getDispatchFilter()
+          .getFilter()).getCores().getZkController().getZkStateReader(),
+          deadShard);
+    }
+    waitToSeeNotLive(cloudClient.getZkStateReader(), deadShard);
+
+    // ensure shard is dead
+    try {
+      index_specific(deadShard.client.solrClient, id, 999, i1, 107, t1,
+          "specific doc!");
+      fail("This server should be down and this update should have failed");
+    } catch (SolrServerException e) {
+      // expected..
+    }
+    
+    commit();
+    query("q", "*:*", "sort", "n_tl1 desc");
+    
+    // long cloudClientDocs = cloudClient.query(new
+    // SolrQuery("*:*")).getResults().getNumFound();
+    // System.out.println("clouddocs:" + cloudClientDocs);
+    
+    // try to index to a living shard at shard2
+
+  
+    long numFound1 = cloudClient.query(new SolrQuery("*:*")).getResults().getNumFound();
+    
+    index_specific(shardToJetty.get(SHARD2).get(1).client.solrClient, id, 1000, i1, 108, t1,
+        "specific doc!");
+    
+    commit();
+    
+    checkShardConsistency(true, false);
+    
+    query("q", "*:*", "sort", "n_tl1 desc");
+    
+    // try adding a doc with CloudSolrServer
+    cloudClient.setDefaultCollection(DEFAULT_COLLECTION);
+
+    long numFound2 = cloudClient.query(new SolrQuery("*:*")).getResults().getNumFound();
+    
+    assertEquals(numFound1 + 1, numFound2);
+    
+    SolrInputDocument doc = new SolrInputDocument();
+    doc.addField("id", 1001);
+    
+    controlClient.add(doc);
+    
+    UpdateRequest ureq = new UpdateRequest();
+    ureq.add(doc);
+    // ureq.setParam("update.chain", DISTRIB_UPDATE_CHAIN);
+    ureq.process(cloudClient);
+    
+    commit();
+    
+    query("q", "*:*", "sort", "n_tl1 desc");
+    
+    long numFound3 = cloudClient.query(new SolrQuery("*:*")).getResults().getNumFound();
+    
+    // lets just check that the one doc since last commit made it in...
+    assertEquals(numFound2 + 1, numFound3);
+    
+    // test debugging
+    testDebugQueries();
+    
+    if (VERBOSE) {
+      System.err.println(controlClient.query(new SolrQuery("*:*")).getResults()
+          .getNumFound());
+      
+      for (SolrServer client : clients) {
+        try {
+          SolrQuery q = new SolrQuery("*:*");
+          q.set("distrib", false);
+          System.err.println(client.query(q).getResults()
+              .getNumFound());
+        } catch (Exception e) {
+          
+        }
+      }
+    }
+    // TODO: This test currently fails because debug info is obtained only
+    // on shards with matches.
+    // query("q","matchesnothing","fl","*,score", "debugQuery", "true");
+    
+    // this should trigger a recovery phase on deadShard
+    ChaosMonkey.start(deadShard.jetty);
+    
+    // make sure we have published we are recovering
+    Thread.sleep(1500);
+    
+    waitForRecoveriesToFinish(false);
+    
+    deadShardCount = shardToJetty.get(SHARD2).get(0).client.solrClient
+        .query(query).getResults().getNumFound();
+    // if we properly recovered, we should now have the couple missing docs that
+    // came in while shard was down
+    checkShardConsistency(true, false);
+    
+    
+    // recover over 100 docs so we do more than just peer sync (replicate recovery)
+    chaosMonkey.stopJetty(deadShard);
+    
+    for (CloudJettyRunner cjetty : jetties) {
+      waitToSeeNotLive(((SolrDispatchFilter) cjetty.jetty.getDispatchFilter()
+          .getFilter()).getCores().getZkController().getZkStateReader(),
+          deadShard);
+    }
+    waitToSeeNotLive(cloudClient.getZkStateReader(), deadShard);
+    
+    for (int i = 0; i < 226; i++) {
+      doc = new SolrInputDocument();
+      doc.addField("id", 2000 + i);
+      controlClient.add(doc);
+      ureq = new UpdateRequest();
+      ureq.add(doc);
+      // ureq.setParam("update.chain", DISTRIB_UPDATE_CHAIN);
+      ureq.process(cloudClient);
+    }
+    commit();
+    
+    Thread.sleep(1500);
+    
+    ChaosMonkey.start(deadShard.jetty);
+    
+    // make sure we have published we are recovering
+    Thread.sleep(1500);
+    
+    waitForRecoveriesToFinish(false);
+    
+    checkShardConsistency(true, false);
+  }
+  
+  private void addNewReplica() throws Exception {
+    JettySolrRunner newReplica = createJettys(1).get(0);
+    
+    waitForRecoveriesToFinish(false);
+    
+    // new server should be part of first shard
+    // how many docs are on the new shard?
+    for (CloudJettyRunner cjetty : shardToJetty.get("shard1")) {
+      if (VERBOSE) System.err.println("total:"
+          + cjetty.client.solrClient.query(new SolrQuery("*:*")).getResults().getNumFound());
+    }
+    
+    checkShardConsistency("shard1");
+    
+    assertDocCounts(VERBOSE);
+  }
+  
+  private void testDebugQueries() throws Exception {
+    handle.put("explain", SKIPVAL);
+    handle.put("debug", UNORDERED);
+    handle.put("time", SKIPVAL);
+    query("q", "now their fox sat had put", "fl", "*,score",
+        CommonParams.DEBUG_QUERY, "true");
+    query("q", "id:[1 TO 5]", CommonParams.DEBUG_QUERY, "true");
+    query("q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.TIMING);
+    query("q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.RESULTS);
+    query("q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.QUERY);
+  }
+  
+}

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java Wed Aug  8 18:01:11 2012
@@ -71,10 +71,11 @@ import org.apache.solr.update.SolrCmdDis
 import org.apache.solr.util.DefaultSolrThreadFactory;
 
 /**
- *
+ * This test simply does a bunch of basic things in solrcloud mode and asserts things
+ * work as expected.
  */
 @Slow
-public class BasicDistributedZkTest extends AbstractDistributedZkTestCase {
+public class BasicDistributedZkTest extends AbstractDistribZkTestBase {
   
   private static final String DEFAULT_COLLECTION = "collection1";
   private static final boolean DEBUG = false;

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java Wed Aug  8 18:01:11 2012
@@ -39,7 +39,7 @@ import org.slf4j.LoggerFactory;
 
 @Slow
 @Ignore("ignore while investigating jenkins fails")
-public class ChaosMonkeyNothingIsSafeTest extends FullSolrCloudTest {
+public class ChaosMonkeyNothingIsSafeTest extends AbstractFullDistribZkTestBase {
   public static Logger log = LoggerFactory.getLogger(ChaosMonkeyNothingIsSafeTest.class);
   
   private static final int BASE_RUN_LENGTH = 180000;

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java Wed Aug  8 18:01:11 2012
@@ -32,7 +32,7 @@ import org.junit.BeforeClass;
 import org.junit.Ignore;
 
 @Ignore("SOLR-3126")
-public class ChaosMonkeySafeLeaderTest extends FullSolrCloudTest {
+public class ChaosMonkeySafeLeaderTest extends AbstractFullDistribZkTestBase {
   
   private static final int BASE_RUN_LENGTH = 120000;
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java Wed Aug  8 18:01:11 2012
@@ -23,8 +23,8 @@ import org.apache.lucene.util.LuceneTest
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpSolrServer;
 import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrServer;
+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.common.SolrDocument;
@@ -37,14 +37,13 @@ import org.apache.solr.common.params.Mod
 import org.apache.solr.update.VersionInfo;
 import org.apache.solr.update.processor.DistributedUpdateProcessor;
 import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.KeeperException;
 import org.junit.BeforeClass;
 
 /**
  * Super basic testing, no shard restarting or anything.
  */
 @Slow
-public class FullSolrCloudDistribCmdsTest extends FullSolrCloudTest {
+public class FullSolrCloudDistribCmdsTest extends AbstractFullDistribZkTestBase {
   
   
   @BeforeClass

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java Wed Aug  8 18:01:11 2012
@@ -26,12 +26,11 @@ import org.apache.solr.client.solrj.embe
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Slow
-public class RecoveryZkTest extends FullSolrCloudTest {
+public class RecoveryZkTest extends AbstractFullDistribZkTestBase {
 
   //private static final String DISTRIB_UPDATE_CHAIN = "distrib-update-chain";
   private static Logger log = LoggerFactory.getLogger(RecoveryZkTest.class);

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java Wed Aug  8 18:01:11 2012
@@ -38,15 +38,13 @@ import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 
 /**
  * Test sync phase that occurs when Leader goes down and a new Leader is
  * elected.
  */
 @Slow
-@Ignore("ignore while i look into")
-public class SyncSliceTest extends FullSolrCloudTest {
+public class SyncSliceTest extends AbstractFullDistribZkTestBase {
   
   @BeforeClass
   public static void beforeSuperClass() {
@@ -88,7 +86,7 @@ public class SyncSliceTest extends FullS
     handle.put("QTime", SKIPVAL);
     handle.put("timestamp", SKIPVAL);
     
-    waitForThingsToLevelOut();
+    waitForThingsToLevelOut(15);
 
     del("*:*");
     List<String> skipServers = new ArrayList<String>();
@@ -131,7 +129,7 @@ public class SyncSliceTest extends FullS
     HttpSolrServer baseServer = new HttpSolrServer(baseUrl);
     baseServer.request(request);
     
-    waitForThingsToLevelOut();
+    waitForThingsToLevelOut(15);
     
     checkShardConsistency(false, true);
     
@@ -161,7 +159,7 @@ public class SyncSliceTest extends FullS
     // to talk to a downed node causes grief
     waitToSeeDownInClusterState(leaderJetty, jetties);
 
-    waitForThingsToLevelOut();
+    waitForThingsToLevelOut(15);
     
     checkShardConsistency(false, true);
     
@@ -182,7 +180,7 @@ public class SyncSliceTest extends FullS
     // give a moment to be sure it has started recovering
     Thread.sleep(2000);
     
-    waitForThingsToLevelOut();
+    waitForThingsToLevelOut(15);
     waitForRecoveriesToFinish(false);
     
     skipServers = getRandomOtherJetty(leaderJetty, null);
@@ -226,6 +224,7 @@ public class SyncSliceTest extends FullS
     waitForRecoveriesToFinish(false);
 
     checkShardConsistency(true, true);
+    
   }
 
   private List<String> getRandomJetty() {
@@ -260,34 +259,6 @@ public class SyncSliceTest extends FullS
     }
     waitToSeeNotLive(cloudClient.getZkStateReader(), leaderJetty);
   }
-
-  private void waitForThingsToLevelOut() throws Exception {
-    int cnt = 0;
-    boolean retry = false;
-    do {
-      waitForRecoveriesToFinish(false);
-      
-      commit();
-      
-      updateMappingsFromZk(jettys, clients);
-      
-      Set<String> theShards = shardToJetty.keySet();
-      String failMessage = null;
-      for (String shard : theShards) {
-        failMessage = checkShardConsistency(shard, false);
-      }
-      
-      if (failMessage != null) {
-        retry = true;
-      } else {
-        retry = false;
-      }
-      
-      cnt++;
-      if (cnt > 10) break;
-      Thread.sleep(2000);
-    } while (retry);
-  }
   
   protected void indexDoc(List<String> skipServers, Object... fields) throws IOException,
       SolrServerException {

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrServer.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrServer.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrServer.java Wed Aug  8 18:01:11 2012
@@ -65,10 +65,14 @@ public class CloudSolrServer extends Sol
   
   // since the state shouldn't change often, should be very cheap reads
   private volatile List<String> urlList;
+  
   private volatile List<String> leaderUrlList;
+  private volatile List<String> replicasList;
+  
   private volatile int lastClusterStateHashCode;
   
   private final boolean updatesToLeaders;
+
   
   /**
    * @param zkHost The client endpoint of the zookeeper quorum containing the cloud state,
@@ -164,9 +168,11 @@ public class CloudSolrServer extends Sol
     
     ClusterState clusterState = zkStateReader.getClusterState();
     boolean sendToLeaders = false;
+    List<String> replicas = null;
     
     if (request instanceof IsUpdateRequest && updatesToLeaders) {
       sendToLeaders = true;
+      replicas = new ArrayList<String>();
     }
 
     SolrParams reqParams = request.getParams();
@@ -211,17 +217,22 @@ public class CloudSolrServer extends Sol
             if (!sendToLeaders || (sendToLeaders && coreNodeProps.isLeader())) {
               String url = coreNodeProps.getCoreUrl();
               urlList.add(url);
+            } else if (sendToLeaders) {
+              String url = coreNodeProps.getCoreUrl();
+              replicas.add(url);
             }
           }
         }
       }
       if (sendToLeaders) {
         this.leaderUrlList = urlList; 
+        this.replicasList = replicas;
       } else {
         this.urlList = urlList;
       }
       this.lastClusterStateHashCode = clusterState.hashCode();
     }
+    
     List<String> theUrlList;
     if (sendToLeaders) {
       theUrlList = new ArrayList<String>(leaderUrlList.size());
@@ -231,7 +242,14 @@ public class CloudSolrServer extends Sol
       theUrlList.addAll(urlList);
     }
     Collections.shuffle(theUrlList, rand);
-    //System.out.println("########################## MAKING REQUEST TO " + urlList);
+    if (replicas != null) {
+      ArrayList<String> theReplicas = new ArrayList<String>(replicasList.size());
+      theReplicas.addAll(replicasList);
+      Collections.shuffle(theReplicas, rand);
+
+      theUrlList.addAll(theReplicas);
+    }
+    //System.out.println("########################## MAKING REQUEST TO " + theUrlList);
  
     LBHttpSolrServer.Req req = new LBHttpSolrServer.Req(request, theUrlList);
     LBHttpSolrServer.Rsp rsp = lbServer.request(req);
@@ -255,4 +273,16 @@ public class CloudSolrServer extends Sol
   public LBHttpSolrServer getLbServer() {
     return lbServer;
   }
+
+  List<String> getUrlList() {
+    return urlList;
+  }
+
+  List<String> getLeaderUrlList() {
+    return leaderUrlList;
+  }
+
+  List<String> getReplicasList() {
+    return replicasList;
+  }
 }

Modified: lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/schema.xml?rev=1370864&r1=1370367&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/schema.xml (original)
+++ lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/schema.xml Wed Aug  8 18:01:11 2012
@@ -28,7 +28,7 @@
      $Name:  $
   -->
 
-<schema name="test" version="1.0">
+<schema name="test" version="1.5">
   <types>
 
     <!-- field type definitions... note that the "name" attribute is
@@ -110,9 +110,6 @@
     </fieldtype>
 
 
-    <!-- HighlitText optimizes storage for (long) columns which will be highlit -->
-    <fieldtype name="highlittext" class="solr.TextField" compressThreshold="345" />
-
     <fieldtype name="boolean" class="solr.BoolField" sortMissingLast="true"/>
     <fieldtype name="string" class="solr.StrField" sortMissingLast="true"/>
 
@@ -147,7 +144,6 @@
        <analyzer>
         <tokenizer class="solr.LowerCaseTokenizerFactory"/>
         <filter class="solr.StandardFilterFactory"/>
-        <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
       </analyzer>
     </fieldtype>
 
@@ -200,7 +196,6 @@
     <fieldtype name="lowerpunctfilt" class="solr.TextField">
       <analyzer>
         <tokenizer class="solr.MockTokenizerFactory"/>
-        <filter name="syn" class="solr.SynonymFilterFactory" synonyms="synonyms.txt" expand="true"/>
         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"/>
         <filter class="solr.LowerCaseFilterFactory"/>
       </analyzer>
@@ -242,7 +237,6 @@
     <fieldtype name="custengporterfilt" class="solr.TextField">
       <analyzer>
         <tokenizer class="solr.MockTokenizerFactory"/>
-        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
         <filter class="solr.PorterStemFilterFactory"/>
       </analyzer>
     </fieldtype>
@@ -255,7 +249,6 @@
     <fieldtype name="custstopfilt" class="solr.TextField">
       <analyzer>
         <tokenizer class="solr.MockTokenizerFactory"/>
-        <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
       </analyzer>
     </fieldtype>
     <fieldtype name="lengthfilt" class="solr.TextField">
@@ -267,7 +260,6 @@
     <fieldType name="charfilthtmlmap" class="solr.TextField">
       <analyzer>
         <charFilter class="solr.HTMLStripCharFilterFactory"/>
-        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
         <tokenizer class="solr.MockTokenizerFactory"/>
       </analyzer>
     </fieldType>
@@ -293,14 +285,14 @@
       <analyzer type="index">
           <tokenizer class="solr.MockTokenizerFactory"/>
           <filter class="solr.LowerCaseFilterFactory"/>
-          <filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt" splitOnNumerics="0" splitOnCaseChange="0" generateWordParts="1" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
+          <filter class="solr.WordDelimiterFilterFactory" splitOnNumerics="0" splitOnCaseChange="0" generateWordParts="1" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
           <filter class="solr.StopFilterFactory"/>
           <filter class="solr.PorterStemFilterFactory"/>
       </analyzer>
       <analyzer type="query">
           <tokenizer class="solr.MockTokenizerFactory"/>
           <filter class="solr.LowerCaseFilterFactory"/>
-          <filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt" splitOnNumerics="0" splitOnCaseChange="0" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+          <filter class="solr.WordDelimiterFilterFactory" splitOnNumerics="0" splitOnCaseChange="0" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
           <filter class="solr.StopFilterFactory"/>
           <filter class="solr.PorterStemFilterFactory"/>
       </analyzer>
@@ -310,7 +302,7 @@
       <analyzer type="index">
           <tokenizer class="solr.MockTokenizerFactory"/>
           <filter class="solr.LowerCaseFilterFactory"/>
-          <filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt" splitOnNumerics="0" splitOnCaseChange="0" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
+          <filter class="solr.WordDelimiterFilterFactory"  splitOnNumerics="0" splitOnCaseChange="0" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
       </analyzer>
       <analyzer type="query">
           <tokenizer class="solr.MockTokenizerFactory"/>
@@ -351,22 +343,9 @@
     <fieldtype name="syn" class="solr.TextField">
       <analyzer>
           <tokenizer class="solr.MockTokenizerFactory"/>
-          <filter name="syn" class="solr.SynonymFilterFactory" synonyms="old_synonyms.txt"/>
       </analyzer>
     </fieldtype>
 
-    <!-- Demonstrates How RemoveDuplicatesTokenFilter makes stemmed
-         synonyms "better"
-      -->
-    <fieldtype name="dedup" class="solr.TextField">
-      <analyzer>
-          <tokenizer class="solr.MockTokenizerFactory"/>
-          <filter class="solr.SynonymFilterFactory"
-                  synonyms="old_synonyms.txt" expand="true" />
-          <filter class="solr.PorterStemFilterFactory"/>
-          <filter class="solr.RemoveDuplicatesTokenFilterFactory" />
-      </analyzer>
-    </fieldtype>
 
     <fieldtype  name="unstored" class="solr.StrField" indexed="true" stored="false"/>
 
@@ -394,29 +373,33 @@
   <!--  some per-field similarity examples -->
   
   <!--  specify a Similarity classname directly -->
+  <!--
   <fieldType name="sim1" class="solr.TextField">
     <analyzer>
       <tokenizer class="solr.MockTokenizerFactory"/>
     </analyzer>
     <similarity class="org.apache.lucene.misc.SweetSpotSimilarity"/>
   </fieldType>
-
+  -->
   <!--  specify a Similarity factory -->  
+  <!--
   <fieldType name="sim2" class="solr.TextField">
     <analyzer>
       <tokenizer class="solr.MockTokenizerFactory"/>
     </analyzer>
-    <similarity class="org.apache.solr.schema.CustomSimilarityFactory">
+    <similarity class="org.apache.solr.search.similarities.CustomSimilarityFactory">
       <str name="echo">is there an echo?</str>
     </similarity>
   </fieldType>
-  
+  -->
   <!-- don't specify any sim at all: get the default  -->
+  <!--
   <fieldType name="sim3" class="solr.TextField">
     <analyzer>
       <tokenizer class="solr.MockTokenizerFactory"/>
     </analyzer>
   </fieldType>
+  -->
  </types>
 
 
@@ -474,10 +457,6 @@
    <field name="test_posofftv" type="text" termVectors="true"
      termPositions="true" termOffsets="true"/>
 
-   <!-- test highlit field settings -->
-   <field name="test_hlt" type="highlittext" indexed="true" compressed="true"/>
-   <field name="test_hlt_off" type="highlittext" indexed="true" compressed="false"/>
-
    <!-- fields to test individual tokenizers and tokenfilters -->
    <field name="teststop" type="teststop" indexed="true" stored="true"/>
    <field name="lowertok" type="lowertok" indexed="true" stored="true"/>
@@ -500,7 +479,6 @@
    <field name="stopfilt" type="stopfilt" indexed="true" stored="true"/>
    <field name="custstopfilt" type="custstopfilt" indexed="true" stored="true"/>
    <field name="lengthfilt" type="lengthfilt" indexed="true" stored="true"/>
-   <field name="dedup" type="dedup" indexed="true" stored="true"/>
    <field name="wdf_nocase" type="wdf_nocase" indexed="true" stored="true"/>
    <field name="wdf_preserve" type="wdf_preserve" indexed="true" stored="true"/>
 
@@ -522,11 +500,15 @@
    <field name="multiDefault" type="string" indexed="true" stored="true" default="muLti-Default" multiValued="true"/>
    <field name="intDefault" type="int" indexed="true" stored="true" default="42" multiValued="false"/>
 
+   <!--
    <field name="sim1text" type="sim1" indexed="true" stored="true"/>
    <field name="sim2text" type="sim2" indexed="true" stored="true"/>
    <field name="sim3text" type="sim3" indexed="true" stored="true"/>
-
+   -->
+   
    <field name="tlong" type="tlong" indexed="true" stored="true" />
+   
+   <field name="_version_" type="long" indexed="true" stored="true"/>
 
    <!-- Dynamic field definitions.  If a field name is not found, dynamicFields
         will be used if the name matches any of the patterns.
@@ -604,9 +586,11 @@
    <dynamicField name="*_mfacet" type="string" indexed="true" stored="false" multiValued="true" />
 
    <!-- make sure custom sims work with dynamic fields -->
+   <!--
    <dynamicField name="*_sim1" type="sim1" indexed="true" stored="true"/>
    <dynamicField name="*_sim2" type="sim2" indexed="true" stored="true"/>
    <dynamicField name="*_sim3" type="sim3" indexed="true" stored="true"/>
+   -->
  </fields>
 
  <defaultSearchField>text</defaultSearchField>
@@ -640,8 +624,4 @@
    <!-- dynamic destination -->
    <copyField source="*_dynamic" dest="dynamic_*"/>
 
- <!-- example of a custom similarity -->
- <similarity class="org.apache.solr.schema.CustomSimilarityFactory">
-   <str name="echo">I am your default sim</str>
- </similarity>
 </schema>

Added: lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig.xml?rev=1370864&view=auto
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig.xml (added)
+++ lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig.xml Wed Aug  8 18:01:11 2012
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ This is a stripped down config file used for a simple example...  
+ It is *not* a good example to work from. 
+-->
+<config>
+  <luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
+   <dataDir>${solr.data.dir:}</dataDir>
+  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
+
+  <updateHandler class="solr.DirectUpdateHandler2">
+    <updateLog>
+      <str name="dir">${solr.data.dir:}</str>
+    </updateLog>
+  </updateHandler>
+
+  <!-- realtime get handler, guaranteed to return the latest stored fields 
+    of any document, without the need to commit or open a new searcher. The current 
+    implementation relies on the updateLog feature being enabled. -->
+  <requestHandler name="/get" class="solr.RealTimeGetHandler">
+    <lst name="defaults">
+      <str name="omitHeader">true</str>
+    </lst>
+  </requestHandler>  
+
+  <requestDispatcher handleSelect="true" >
+    <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
+  </requestDispatcher>
+  
+  <requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" /> 
+  
+  <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
+  <requestHandler name="/update" class="solr.UpdateRequestHandler"  />
+  <requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
+      
+  <!-- config for the admin interface --> 
+  <admin>
+    <defaultQuery>solr</defaultQuery>
+  </admin>
+
+</config>
+

Added: lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/solr.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/solr.xml?rev=1370864&view=auto
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/solr.xml (added)
+++ lucene/dev/trunk/solr/solrj/src/test-files/solrj/solr/solr.xml Wed Aug  8 18:01:11 2012
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ All (relative) paths are relative to the installation path
+  
+  persistent: Save changes made via the API to this file
+  sharedLib: path to a lib directory that will be shared across all cores
+-->
+<solr persistent="false">
+
+  <!--
+  adminPath: RequestHandler path to manage cores.  
+    If 'null' (or absent), cores will not be manageable via request handler
+  -->
+  <cores adminPath="/admin/cores" defaultCoreName="collection1" host="127.0.0.1" hostPort="${hostPort:8983}" hostContext="solr" zkClientTimeout="8000" numShards="${numShards:3}">
+    <core name="collection1" instanceDir="collection1" shard="${shard:}" collection="${collection:collection1}" config="${solrconfig:solrconfig.xml}" schema="${schema:schema.xml}"/>
+  </cores>
+</solr>

Modified: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java (original)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrServer.java Wed Aug  8 18:01:11 2012
@@ -237,7 +237,7 @@ public class TestLBHttpSolrServer extend
     }
 
     public String getSchemaFile() {
-      return "solrj/solr/conf/schema-replication1.xml";
+      return "solrj/solr/collection1/conf/schema-replication1.xml";
     }
 
     public String getConfDir() {
@@ -249,7 +249,7 @@ public class TestLBHttpSolrServer extend
     }
 
     public String getSolrConfigFile() {
-      return "solrj/solr/conf/solrconfig-slave1.xml";
+      return "solrj/solr/collection1/conf/solrconfig-slave1.xml";
     }
 
     public void setUp() throws Exception {

Added: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java?rev=1370864&view=auto
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java (added)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java Wed Aug  8 18:01:11 2012
@@ -0,0 +1,139 @@
+package org.apache.solr.client.solrj.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.lucene.util.LuceneTestCase.Slow;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
+import org.apache.solr.cloud.AbstractZkTestCase;
+import org.apache.solr.util.ExternalPaths;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+/**
+ * This test would be faster if we simulated the zk state instead.
+ */
+@Slow
+public class CloudSolrServerTest extends AbstractFullDistribZkTestBase {
+  
+  private static final String SOLR_HOME = ExternalPaths.SOURCE_HOME + File.separator + "solrj"
+      + File.separator + "src" + File.separator + "test-files"
+      + File.separator + "solrj" + File.separator + "solr";
+
+  @BeforeClass
+  public static void beforeSuperClass() {
+      AbstractZkTestCase.SOLRHOME = new File(SOLR_HOME());
+  }
+  
+  @AfterClass
+  public static void afterSuperClass() {
+    
+  }
+  
+  @Override
+  public String getSolrHome() {
+    return SOLR_HOME;
+  }
+  
+  public static String SOLR_HOME() {
+    return SOLR_HOME;
+  }
+  
+  @Before
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    // we expect this time of exception as shards go up and down...
+    //ignoreException(".*");
+    
+    System.setProperty("numShards", Integer.toString(sliceCount));
+  }
+  
+  @Override
+  @After
+  public void tearDown() throws Exception {
+    super.tearDown();
+    resetExceptionIgnores();
+  }
+  
+  public CloudSolrServerTest() {
+    super();
+    sliceCount = 2;
+    shardCount = 6;
+  }
+  
+  @Override
+  public void doTest() throws Exception {
+    
+    handle.clear();
+    handle.put("QTime", SKIPVAL);
+    handle.put("timestamp", SKIPVAL);
+    
+    waitForThingsToLevelOut(15);
+
+    del("*:*");
+
+    indexr(id, 0, "a_t", "to come to the aid of their country.");
+    
+    // compare leaders list
+    CloudJettyRunner shard1Leader = shardToLeaderJetty.get("shard1");
+    CloudJettyRunner shard2Leader = shardToLeaderJetty.get("shard2");
+    assertEquals(2, cloudClient.getLeaderUrlList().size());
+    HashSet<String> leaderUrlSet = new HashSet<String>();
+    leaderUrlSet.addAll(cloudClient.getLeaderUrlList());
+    assertTrue("fail check for leader:" + shard1Leader.url + " in "
+        + leaderUrlSet, leaderUrlSet.contains(shard1Leader.url + "/"));
+    assertTrue("fail check for leader:" + shard2Leader.url + " in "
+        + leaderUrlSet, leaderUrlSet.contains(shard2Leader.url + "/"));
+
+    // compare replicas list
+    Set<String> replicas = new HashSet<String>();
+    List<CloudJettyRunner> jetties = shardToJetty.get("shard1");
+    for (CloudJettyRunner cjetty : jetties) {
+      replicas.add(cjetty.url);
+    }
+    jetties = shardToJetty.get("shard2");
+    for (CloudJettyRunner cjetty : jetties) {
+      replicas.add(cjetty.url);
+    }
+    replicas.remove(shard1Leader.url);
+    replicas.remove(shard2Leader.url);
+    
+    assertEquals(replicas.size(), cloudClient.getReplicasList().size());
+    
+    for (String url : cloudClient.getReplicasList()) {
+      assertTrue("fail check for replica:" + url + " in " + replicas,
+          replicas.contains(stripTrailingSlash(url)));
+    }
+    
+  }
+
+  private String stripTrailingSlash(String url) {
+    if (url.endsWith("/")) {
+      return url.substring(0, url.length() - 1);
+    }
+    return url;
+  }
+
+}

Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java Wed Aug  8 18:01:11 2012
@@ -1388,11 +1388,10 @@ public abstract class SolrTestCaseJ4 ext
       return file;
     } catch (Exception e) {
       /* more friendly than NPE */
-      throw new RuntimeException("Cannot find resource: " + name);
+      throw new RuntimeException("Cannot find resource: " + new File(name).getAbsolutePath());
     }
   }
   
-  // TODO: use solr rather than solr/collection1
   public static String TEST_HOME() {
     return getFile("solr/collection1").getParent();
   }

Copied: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java (from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java?p2=lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java&p1=lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java&r1=1370367&r2=1370864&rev=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractDistributedZkTestCase.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java Wed Aug  8 18:01:11 2012
@@ -24,6 +24,7 @@ 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.Slice;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -35,7 +36,7 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
 
-public abstract class AbstractDistributedZkTestCase extends BaseDistributedSearchTestCase {
+public abstract class AbstractDistribZkTestBase extends BaseDistributedSearchTestCase {
   
   protected static final String DEFAULT_COLLECTION = "collection1";
   private static final boolean DEBUG = false;

Copied: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java (from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java?p2=lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java&p1=lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java&r1=1370367&r2=1370864&rev=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudTest.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java Wed Aug  8 18:01:11 2012
@@ -40,6 +40,7 @@ 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;
@@ -49,9 +50,7 @@ import org.apache.solr.common.cloud.Slic
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
-import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
-import org.apache.solr.servlet.SolrDispatchFilter;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -66,18 +65,19 @@ import org.slf4j.LoggerFactory;
  * 
  */
 @Slow
-public class FullSolrCloudTest extends AbstractDistributedZkTestCase {
-  static Logger log = LoggerFactory.getLogger(FullSolrCloudTest.class);
+public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTestBase {
+  static Logger log = LoggerFactory.getLogger(AbstractFullDistribZkTestBase.class);
   
   @BeforeClass
   public static void beforeFullSolrCloudTest() {
     // shorten the log output more for this test type
     if (formatter != null) formatter.setShorterFormat();
   }
-
-  private static final String SHARD2 = "shard2";
   
-  private boolean printLayoutOnTearDown = false;
+  public static final String SHARD1 = "shard1";
+  public static final String SHARD2 = "shard2";
+  
+  protected boolean printLayoutOnTearDown = false;
   
   String t1 = "a_t";
   String i1 = "a_si";
@@ -107,12 +107,12 @@ public class FullSolrCloudTest extends A
   
   protected Map<String,CloudJettyRunner> shardToLeaderJetty = new HashMap<String,CloudJettyRunner>();
   
-  static class CloudJettyRunner {
-    JettySolrRunner jetty;
-    String nodeName;
-    String coreNodeName;
-    String url;
-    CloudSolrServerClient client;
+  public static class CloudJettyRunner {
+    public JettySolrRunner jetty;
+    public String nodeName;
+    public String coreNodeName;
+    public String url;
+    public CloudSolrServerClient client;
     public ZkNodeProps info;
     @Override
     public int hashCode() {
@@ -186,7 +186,7 @@ public class FullSolrCloudTest extends A
     System.clearProperty("solrcloud.update.delay");
   }
   
-  public FullSolrCloudTest() {
+  public AbstractFullDistribZkTestBase() {
     fixShardCount = true;
     
     shardCount = 4;
@@ -214,11 +214,21 @@ public class FullSolrCloudTest extends A
     }
     
     // wait until shards have started registering...
+    int cnt = 30;
     while (!zkStateReader.getClusterState().getCollections()
         .contains(DEFAULT_COLLECTION)) {
+      if (cnt == 0) {
+        throw new RuntimeException("timeout waiting for collection1 in cluster state");
+      }
+      cnt--;
       Thread.sleep(500);
     }
+    cnt = 30;
     while (zkStateReader.getClusterState().getSlices(DEFAULT_COLLECTION).size() != sliceCount) {
+      if (cnt == 0) {
+        throw new RuntimeException("timeout waiting for collection shards to come up");
+      }
+      cnt--;
       Thread.sleep(500);
     }
     
@@ -261,7 +271,7 @@ public class FullSolrCloudTest extends A
     
   }
   
-  private List<JettySolrRunner> createJettys(int numJettys) throws Exception {
+  protected List<JettySolrRunner> createJettys(int numJettys) throws Exception {
     return createJettys(numJettys, false);
   }
   
@@ -275,7 +285,7 @@ public class FullSolrCloudTest extends A
    * @return
    * @throws Exception
    */
-  private List<JettySolrRunner> createJettys(int numJettys, boolean checkCreatedVsState) throws Exception {
+  protected List<JettySolrRunner> createJettys(int numJettys, boolean checkCreatedVsState) throws Exception {
     List<JettySolrRunner> jettys = new ArrayList<JettySolrRunner>();
     List<SolrServer> clients = new ArrayList<SolrServer>();
     StringBuilder sb = new StringBuilder();
@@ -330,7 +340,7 @@ public class FullSolrCloudTest extends A
     return jettys;
   }
 
-  private int getNumShards(String defaultCollection) {
+  protected int getNumShards(String defaultCollection) {
     Map<String,Slice> slices = this.zkStateReader.getClusterState().getSlices(defaultCollection);
     int cnt = 0;
     for (Map.Entry<String,Slice> entry : slices.entrySet()) {
@@ -538,147 +548,6 @@ public class FullSolrCloudTest extends A
      ***/
   }// serial commit...
   
-  /*
-   * (non-Javadoc)
-   * 
-   * @see org.apache.solr.BaseDistributedSearchTestCase#doTest()
-   * 
-   * Create 3 shards, each with one replica
-   */
-  @Override
-  public void doTest() throws Exception {
-    boolean testFinished = false;
-    try {
-      handle.clear();
-      handle.put("QTime", SKIPVAL);
-      handle.put("timestamp", SKIPVAL);
-      
-      indexr(id, 1, i1, 100, tlong, 100, t1,
-          "now is the time for all good men", "foo_f", 1.414f, "foo_b", "true",
-          "foo_d", 1.414d);
-      
-      // make sure we are in a steady state...
-      waitForRecoveriesToFinish(false);
-      
-      commit();
-      
-      assertDocCounts(false);
-      
-      indexAbunchOfDocs();
-      
-      // check again 
-      waitForRecoveriesToFinish(false);
-      
-      commit();
-      
-      assertDocCounts(VERBOSE);
-      checkQueries();
-      
-      assertDocCounts(VERBOSE);
-      
-      query("q", "*:*", "sort", "n_tl1 desc");
-      
-      brindDownShardIndexSomeDocsAndRecover();
-      
-      query("q", "*:*", "sort", "n_tl1 desc");
-      
-      // test adding another replica to a shard - it should do a
-      // recovery/replication to pick up the index from the leader
-      addNewReplica();
-      
-      long docId = testUpdateAndDelete();
-      
-      // index a bad doc...
-      try {
-        indexr(t1, "a doc with no id");
-        fail("this should fail");
-      } catch (SolrException e) {
-        // expected
-      }
-      
-      // TODO: bring this to it's own method?
-      // try indexing to a leader that has no replicas up
-      ZkNodeProps leaderProps = zkStateReader.getLeaderProps(
-          DEFAULT_COLLECTION, SHARD2);
-      
-      String nodeName = leaderProps.get(ZkStateReader.NODE_NAME_PROP);
-      chaosMonkey.stopShardExcept(SHARD2, nodeName);
-      
-      SolrServer client = getClient(nodeName);
-      
-      index_specific(client, "id", docId + 1, t1, "what happens here?");
-      
-      // expire a session...
-      CloudJettyRunner cloudJetty = shardToJetty.get("shard1").get(0);
-      chaosMonkey.expireSession(cloudJetty.jetty);
-      
-      indexr("id", docId + 1, t1, "slip this doc in");
-      
-      waitForRecoveriesToFinish(false);
-      
-      checkShardConsistency("shard1");
-      
-      testFinished = true;
-    } finally {
-      if (!testFinished) {
-        printLayoutOnTearDown = true;
-      }
-    }
-    
-  }
-  
-  private long testUpdateAndDelete() throws Exception {
-    long docId = 99999999L;
-    indexr("id", docId, t1, "originalcontent");
-    
-    commit();
-    
-    ModifiableSolrParams params = new ModifiableSolrParams();
-    params.add("q", t1 + ":originalcontent");
-    QueryResponse results = clients.get(0).query(params);
-    assertEquals(1, results.getResults().getNumFound());
-    
-    // update doc
-    indexr("id", docId, t1, "updatedcontent");
-    
-    commit();
-    
-    results = clients.get(0).query(params);
-    assertEquals(0, results.getResults().getNumFound());
-    
-    params.set("q", t1 + ":updatedcontent");
-    
-    results = clients.get(0).query(params);
-    assertEquals(1, results.getResults().getNumFound());
-    
-    UpdateRequest uReq = new UpdateRequest();
-    // uReq.setParam(UpdateParams.UPDATE_CHAIN, DISTRIB_UPDATE_CHAIN);
-    uReq.deleteById(Long.toString(docId)).process(clients.get(0));
-    
-    commit();
-    
-    results = clients.get(0).query(params);
-    assertEquals(0, results.getResults().getNumFound());
-    return docId;
-  }
-  
-  private void addNewReplica() throws Exception {
-    JettySolrRunner newReplica = createJettys(1).get(0);
-    
-    waitForRecoveriesToFinish(false);
-    
-    // new server should be part of first shard
-    // how many docs are on the new shard?
-    for (CloudJettyRunner cjetty : shardToJetty.get("shard1")) {
-      if (VERBOSE) System.err.println("total:"
-          + cjetty.client.solrClient.query(new SolrQuery("*:*")).getResults().getNumFound());
-    }
-    
-    checkShardConsistency("shard1");
-    
-    assertDocCounts(VERBOSE);
-  }
-  
   protected void waitForRecoveriesToFinish(boolean verbose)
       throws Exception {
     super.waitForRecoveriesToFinish(DEFAULT_COLLECTION, zkStateReader, verbose);
@@ -689,174 +558,7 @@ public class FullSolrCloudTest extends A
     super.waitForRecoveriesToFinish(DEFAULT_COLLECTION, zkStateReader, verbose, true, timeoutSeconds);
   }
   
-  private void brindDownShardIndexSomeDocsAndRecover() throws Exception {
-    SolrQuery query = new SolrQuery("*:*");
-    query.set("distrib", false);
-    
-    commit();
-    
-    long deadShardCount = shardToJetty.get(SHARD2).get(0).client.solrClient
-        .query(query).getResults().getNumFound();
-
-    query("q", "*:*", "sort", "n_tl1 desc");
-    
-    // kill a shard
-    CloudJettyRunner deadShard = chaosMonkey.stopShard(SHARD2, 0);
-    cloudClient.connect();
-
-    // we are careful to make sure the downed node is no longer in the state,
-    // because on some systems (especially freebsd w/ blackhole enabled), trying
-    // to talk to a downed node causes grief
-    Set<CloudJettyRunner> jetties = new HashSet<CloudJettyRunner>();
-    jetties.addAll(shardToJetty.get(SHARD2));
-    jetties.remove(deadShard);
-    
-    for (CloudJettyRunner cjetty : jetties) {
-      waitToSeeNotLive(((SolrDispatchFilter) cjetty.jetty.getDispatchFilter()
-          .getFilter()).getCores().getZkController().getZkStateReader(),
-          deadShard);
-    }
-    waitToSeeNotLive(cloudClient.getZkStateReader(), deadShard);
-
-    // ensure shard is dead
-    try {
-      index_specific(deadShard.client.solrClient, id, 999, i1, 107, t1,
-          "specific doc!");
-      fail("This server should be down and this update should have failed");
-    } catch (SolrServerException e) {
-      // expected..
-    }
-    
-    commit();
-    query("q", "*:*", "sort", "n_tl1 desc");
-    
-    // long cloudClientDocs = cloudClient.query(new
-    // SolrQuery("*:*")).getResults().getNumFound();
-    // System.out.println("clouddocs:" + cloudClientDocs);
-    
-    // try to index to a living shard at shard2
-
-	
-    long numFound1 = cloudClient.query(new SolrQuery("*:*")).getResults().getNumFound();
-    
-    index_specific(shardToJetty.get(SHARD2).get(1).client.solrClient, id, 1000, i1, 108, t1,
-        "specific doc!");
-    
-    commit();
-    
-    checkShardConsistency(true, false);
-    
-    query("q", "*:*", "sort", "n_tl1 desc");
-    
-    // try adding a doc with CloudSolrServer
-    cloudClient.setDefaultCollection(DEFAULT_COLLECTION);
-
-    long numFound2 = cloudClient.query(new SolrQuery("*:*")).getResults().getNumFound();
-    
-    assertEquals(numFound1 + 1, numFound2);
-    
-    SolrInputDocument doc = new SolrInputDocument();
-    doc.addField("id", 1001);
-    
-    controlClient.add(doc);
-    
-    UpdateRequest ureq = new UpdateRequest();
-    ureq.add(doc);
-    // ureq.setParam("update.chain", DISTRIB_UPDATE_CHAIN);
-    ureq.process(cloudClient);
-    
-    commit();
-    
-    query("q", "*:*", "sort", "n_tl1 desc");
-    
-    long numFound3 = cloudClient.query(new SolrQuery("*:*")).getResults().getNumFound();
-    
-    // lets just check that the one doc since last commit made it in...
-    assertEquals(numFound2 + 1, numFound3);
-    
-    // test debugging
-    testDebugQueries();
-    
-    if (VERBOSE) {
-      System.err.println(controlClient.query(new SolrQuery("*:*")).getResults()
-          .getNumFound());
-      
-      for (SolrServer client : clients) {
-        try {
-          SolrQuery q = new SolrQuery("*:*");
-          q.set("distrib", false);
-          System.err.println(client.query(q).getResults()
-              .getNumFound());
-        } catch (Exception e) {
-          
-        }
-      }
-    }
-    // TODO: This test currently fails because debug info is obtained only
-    // on shards with matches.
-    // query("q","matchesnothing","fl","*,score", "debugQuery", "true");
-    
-    // this should trigger a recovery phase on deadShard
-    ChaosMonkey.start(deadShard.jetty);
-    
-    // make sure we have published we are recovering
-    Thread.sleep(1500);
-    
-    waitForRecoveriesToFinish(false);
-    
-    deadShardCount = shardToJetty.get(SHARD2).get(0).client.solrClient
-        .query(query).getResults().getNumFound();
-    // if we properly recovered, we should now have the couple missing docs that
-    // came in while shard was down
-    checkShardConsistency(true, false);
-    
-    
-    // recover over 100 docs so we do more than just peer sync (replicate recovery)
-    chaosMonkey.stopJetty(deadShard);
-    
-    for (CloudJettyRunner cjetty : jetties) {
-      waitToSeeNotLive(((SolrDispatchFilter) cjetty.jetty.getDispatchFilter()
-          .getFilter()).getCores().getZkController().getZkStateReader(),
-          deadShard);
-    }
-    waitToSeeNotLive(cloudClient.getZkStateReader(), deadShard);
-    
-    for (int i = 0; i < 226; i++) {
-      doc = new SolrInputDocument();
-      doc.addField("id", 2000 + i);
-      controlClient.add(doc);
-      ureq = new UpdateRequest();
-      ureq.add(doc);
-      // ureq.setParam("update.chain", DISTRIB_UPDATE_CHAIN);
-      ureq.process(cloudClient);
-    }
-    commit();
-    
-    Thread.sleep(1500);
-    
-    ChaosMonkey.start(deadShard.jetty);
-    
-    // make sure we have published we are recovering
-    Thread.sleep(1500);
-    
-    waitForRecoveriesToFinish(false);
-    
-    checkShardConsistency(true, false);
-  }
-  
-  private void testDebugQueries() throws Exception {
-    handle.put("explain", SKIPVAL);
-    handle.put("debug", UNORDERED);
-    handle.put("time", SKIPVAL);
-    query("q", "now their fox sat had put", "fl", "*,score",
-        CommonParams.DEBUG_QUERY, "true");
-    query("q", "id:[1 TO 5]", CommonParams.DEBUG_QUERY, "true");
-    query("q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.TIMING);
-    query("q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.RESULTS);
-    query("q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.QUERY);
-  }
-  
-  private void checkQueries() throws Exception {
+  protected void checkQueries() throws Exception {
 
     handle.put("_version_", SKIPVAL);
 
@@ -995,7 +697,7 @@ public class FullSolrCloudTest extends A
     }
   }
   
-  private void indexAbunchOfDocs() throws Exception {
+  protected void indexAbunchOfDocs() throws Exception {
     indexr(id, 2, i1, 50, tlong, 50, t1, "to come to the aid of their country.");
     indexr(id, 3, i1, 2, tlong, 2, t1, "how now brown cow");
     indexr(id, 4, i1, -100, tlong, 101, t1,
@@ -1209,7 +911,7 @@ public class FullSolrCloudTest extends A
     }
   }
   
-  private SolrServer getClient(String nodeName) {
+  protected SolrServer getClient(String nodeName) {
     for (CloudJettyRunner cjetty : cloudJettys) {
       CloudSolrServerClient client = cjetty.client;
       if (client.shardName.equals(nodeName)) {
@@ -1423,7 +1125,7 @@ public class FullSolrCloudTest extends A
     
   };
   
-  protected void waitForThingsToLevelOut(int waitForRecTimeSeconds) throws Exception {
+  public void waitForThingsToLevelOut(int waitForRecTimeSeconds) throws Exception {
     log.info("Wait for recoveries to finish - wait " + waitForRecTimeSeconds + " for each attempt");
     int cnt = 0;
     boolean retry = false;

Copied: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java (from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java?p2=lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java&p1=lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java&r1=1370367&r2=1370864&rev=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/AbstractZkTestCase.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java Wed Aug  8 18:01:11 2012
@@ -19,7 +19,6 @@ package org.apache.solr.cloud;
 
 import java.io.File;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
@@ -44,6 +43,18 @@ public abstract class AbstractZkTestCase
   protected static Logger log = LoggerFactory
       .getLogger(AbstractZkTestCase.class);
 
+  
+  public static File SOLRHOME;
+  static {
+    try {
+      SOLRHOME = new File(TEST_HOME());
+    } catch (RuntimeException e) {
+      log.warn("TEST_HOME() does not exist - solrj test?");
+      // solrj tests not working with TEST_HOME()
+      // must override getSolrHome
+    }
+  }
+  
   protected static ZkTestServer zkServer;
 
   protected static String zkDir;
@@ -51,6 +62,7 @@ public abstract class AbstractZkTestCase
 
   @BeforeClass
   public static void azt_beforeClass() throws Exception {
+    System.out.println("azt beforeclass");
     createTempDir();
     zkDir = dataDir.getAbsolutePath() + File.separator
         + "zookeeper/server1/data";
@@ -61,15 +73,20 @@ public abstract class AbstractZkTestCase
     System.setProperty("zkHost", zkServer.getZkAddress());
     System.setProperty("jetty.port", "0000");
     
-    buildZooKeeper(zkServer.getZkHost(), zkServer.getZkAddress(),
+    buildZooKeeper(zkServer.getZkHost(), zkServer.getZkAddress(), SOLRHOME,
         "solrconfig.xml", "schema.xml");
     
     initCore("solrconfig.xml", "schema.xml");
   }
 
-  // static to share with distrib test
   static void buildZooKeeper(String zkHost, String zkAddress, String config,
       String schema) throws Exception {
+    buildZooKeeper(zkHost, zkAddress, SOLRHOME, config, schema);
+  }
+  
+  // static to share with distrib test
+  static void buildZooKeeper(String zkHost, String zkAddress, File solrhome, String config,
+      String schema) throws Exception {
     SolrZkClient zkClient = new SolrZkClient(zkHost, AbstractZkTestCase.TIMEOUT);
     zkClient.makePath("/solr", false, true);
     zkClient.close();
@@ -85,24 +102,32 @@ public abstract class AbstractZkTestCase
     zkClient.makePath("/collections/control_collection", ZkStateReader.toJSON(zkProps), CreateMode.PERSISTENT, true);
     zkClient.makePath("/collections/control_collection/shards", CreateMode.PERSISTENT, true);
 
-    putConfig(zkClient, config);
-    putConfig(zkClient, schema);
-    putConfig(zkClient, "solrconfig.xml");
-    putConfig(zkClient, "stopwords.txt");
-    putConfig(zkClient, "protwords.txt");
-    putConfig(zkClient, "currency.xml");
-    putConfig(zkClient, "open-exchange-rates.json");
-    putConfig(zkClient, "mapping-ISOLatin1Accent.txt");
-    putConfig(zkClient, "old_synonyms.txt");
-    putConfig(zkClient, "synonyms.txt");
+    putConfig(zkClient, solrhome, config);
+    putConfig(zkClient, solrhome, schema);
+    putConfig(zkClient, solrhome, "solrconfig.xml");
+    putConfig(zkClient, solrhome, "stopwords.txt");
+    putConfig(zkClient, solrhome, "protwords.txt");
+    putConfig(zkClient, solrhome, "currency.xml");
+    putConfig(zkClient, solrhome, "open-exchange-rates.json");
+    putConfig(zkClient, solrhome, "mapping-ISOLatin1Accent.txt");
+    putConfig(zkClient, solrhome, "old_synonyms.txt");
+    putConfig(zkClient, solrhome, "synonyms.txt");
     
     zkClient.close();
   }
 
-  private static void putConfig(SolrZkClient zkClient, final String name)
+  private static void putConfig(SolrZkClient zkClient, File solrhome, final String name)
       throws Exception {
-    zkClient.makePath("/configs/conf1/" + name, getFile("solr" + File.separator + "collection1"
-        + File.separator + "conf" + File.separator + name), false, true);  
+    String path = "/configs/conf1/" + name;
+    File file = new File(solrhome, "collection1"
+        + File.separator + "conf" + File.separator + name);
+    if (!file.exists()) {
+      log.info("skipping " + file.getAbsolutePath() + " because it doesn't exist");
+      return;
+    }
+    
+    log.info("put " + file.getAbsolutePath() + " to " + path);
+    zkClient.makePath(path, file, false, true);  
   }
 
   @Override

Copied: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java (from r1370367, lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java?p2=lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java&p1=lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java&r1=1370367&r2=1370864&rev=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ChaosMonkey.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java Wed Aug  8 18:01:11 2012
@@ -27,7 +27,7 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrServer;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
-import org.apache.solr.cloud.FullSolrCloudTest.CloudJettyRunner;
+import org.apache.solr.cloud.AbstractFullDistribZkTestBase.CloudJettyRunner;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;

Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java?rev=1370864&r1=1370863&r2=1370864&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java Wed Aug  8 18:01:11 2012
@@ -25,7 +25,7 @@ import java.io.File;
  * @lucene.internal
  */
 public class ExternalPaths {
-  private static final String SOURCE_HOME = determineSourceHome();
+  public static final String SOURCE_HOME = determineSourceHome();
   public static String WEBAPP_HOME = new File(SOURCE_HOME, "webapp/web").getAbsolutePath();
   public static String EXAMPLE_HOME = new File(SOURCE_HOME, "example/solr").getAbsolutePath();
   public static String EXAMPLE_MULTICORE_HOME = new File(SOURCE_HOME, "example/multicore").getAbsolutePath();