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/09/15 19:39:29 UTC

svn commit: r1385136 - in /lucene/dev/trunk/solr: ./ core/src/java/org/apache/solr/cloud/ core/src/java/org/apache/solr/update/processor/ core/src/test/org/apache/solr/cloud/ test-framework/src/java/org/apache/solr/ test-framework/src/java/org/apache/s...

Author: markrmiller
Date: Sat Sep 15 17:39:28 2012
New Revision: 1385136

URL: http://svn.apache.org/viewvc?rev=1385136&view=rev
Log:
SOLR-3831: Atomic updates do not distribute correctly to other nodes.

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1385136&r1=1385135&r2=1385136&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Sat Sep 15 17:39:28 2012
@@ -225,6 +225,9 @@ Bug Fixes
 * SOLR-3844: SolrCore reload can fail because it tries to remove the index 
   write lock while already holding it. (Mark Miller)
 
+* SOLR-3831: Atomic updates do not distribute correctly to other nodes.
+  (Jim Musil, Mark Miller)
+
 Other Changes
 ----------------------
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java?rev=1385136&r1=1385135&r2=1385136&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionProcessor.java Sat Sep 15 17:39:28 2012
@@ -266,7 +266,7 @@ public class OverseerCollectionProcessor
           sreq.shards = new String[] {replica};
           sreq.actualShards = sreq.shards;
           sreq.params = params;
-          
+          log.info("Collection Admin sending CoreAdmin cmd to " + replica);
           shardHandler.submit(sreq, replica, sreq.params);
         }
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1385136&r1=1385135&r2=1385136&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Sat Sep 15 17:39:28 2012
@@ -321,10 +321,7 @@ public class DistributedUpdateProcessor 
     
     boolean dropCmd = false;
     if (!forwardToLeader) {
-      // clone the original doc
-      SolrInputDocument clonedDoc = cmd.solrDoc.deepCopy();
-      dropCmd = versionAdd(cmd, clonedDoc);
-      cmd.solrDoc = clonedDoc;
+      dropCmd = versionAdd(cmd);
     }
 
     if (dropCmd) {
@@ -441,11 +438,10 @@ public class DistributedUpdateProcessor 
 
   /**
    * @param cmd
-   * @param cloneDoc needs the version if it's assigned
    * @return whether or not to drop this cmd
    * @throws IOException
    */
-  private boolean versionAdd(AddUpdateCommand cmd, SolrInputDocument cloneDoc) throws IOException {
+  private boolean versionAdd(AddUpdateCommand cmd) throws IOException {
     BytesRef idBytes = cmd.getIndexedId();
 
     if (vinfo == null || idBytes == null) {
@@ -518,7 +514,6 @@ public class DistributedUpdateProcessor 
             long version = vinfo.getNewClock();
             cmd.setVersion(version);
             cmd.getSolrInputDocument().setField(VersionInfo.VERSION_FIELD, version);
-            cloneDoc.setField(VersionInfo.VERSION_FIELD, version);
             bucket.updateHighest(version);
           } else {
             // The leader forwarded us this update.
@@ -550,9 +545,20 @@ public class DistributedUpdateProcessor 
             }
           }
         }
-
+        
+        boolean willDistrib = isLeader && nodes != null && nodes.size() > 0;
+        
+        SolrInputDocument clonedDoc = null;
+        if (willDistrib) {
+          clonedDoc = cmd.solrDoc.deepCopy();
+        }
+        
         // TODO: possibly set checkDeleteByQueries as a flag on the command?
         doLocalAdd(cmd);
+        
+        if (willDistrib) {
+          cmd.solrDoc = clonedDoc;
+        }
 
       }  // end synchronized (bucket)
     } finally {

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=1385136&r1=1385135&r2=1385136&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 Sat Sep 15 17:39:28 2012
@@ -70,13 +70,14 @@ import org.apache.solr.common.params.Upd
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.update.SolrCmdDistributor.Request;
 import org.apache.solr.util.DefaultSolrThreadFactory;
+import org.junit.Before;
 
 /**
  * This test simply does a bunch of basic things in solrcloud mode and asserts things
  * work as expected.
  */
 @Slow
-public class BasicDistributedZkTest extends AbstractDistribZkTestBase {
+public class BasicDistributedZkTest extends AbstractFullDistribZkTestBase {
   
   private static final String DEFAULT_COLLECTION = "collection1";
   private static final boolean DEBUG = false;
@@ -109,8 +110,19 @@ public class BasicDistributedZkTest exte
   CompletionService<Request> completionService;
   Set<Future<Request>> pending;
   
+  
+  @Before
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    System.setProperty("numShards", Integer.toString(sliceCount));
+  }
+
+  
   public BasicDistributedZkTest() {
     fixShardCount = true;
+    
+    sliceCount = 2;
     shardCount = 3;
     completionService = new ExecutorCompletionService<Request>(executor);
     pending = new HashSet<Future<Request>>();
@@ -138,6 +150,14 @@ public class BasicDistributedZkTest exte
   public void doTest() throws Exception {
     // setLoggingLevel(null);
 
+    
+    // make sure we have leaders for each shard
+    for (int j = 1; j < sliceCount; j++) {
+      zkStateReader.getLeaderProps(DEFAULT_COLLECTION, "shard" + j, 10000);
+    }      // make sure we again have leaders for each shard
+    
+    waitForRecoveriesToFinish(false);
+    
     del("*:*");
 
     indexr(id,1, i1, 100, tlong, 100,t1,"now is the time for all good men"
@@ -180,74 +200,74 @@ public class BasicDistributedZkTest exte
 
     // random value sort
     for (String f : fieldNames) {
-      query("q","*:*", "sort",f+" desc");
-      query("q","*:*", "sort",f+" asc");
+      query(false, new String[] {"q","*:*", "sort",f+" desc"});
+      query(false, new String[] {"q","*:*", "sort",f+" asc"});
     }
 
     // these queries should be exactly ordered and scores should exactly match
-    query("q","*:*", "sort",i1+" desc");
-    query("q","*:*", "sort",i1+" asc");
-    query("q","*:*", "sort",i1+" desc", "fl","*,score");
-    query("q","*:*", "sort","n_tl1 asc", "fl","*,score"); 
-    query("q","*:*", "sort","n_tl1 desc");
+    query(false, new String[] {"q","*:*", "sort",i1+" desc"});
+    query(false, new String[] {"q","*:*", "sort",i1+" asc"});
+    query(false, new String[] {"q","*:*", "sort",i1+" desc", "fl","*,score"});
+    query(false, new String[] {"q","*:*", "sort","n_tl1 asc", "fl","*,score"}); 
+    query(false, new String[] {"q","*:*", "sort","n_tl1 desc"});
     handle.put("maxScore", SKIPVAL);
-    query("q","{!func}"+i1);// does not expect maxScore. So if it comes ,ignore it. JavaBinCodec.writeSolrDocumentList()
+    query(false, new String[] {"q","{!func}"+i1});// does not expect maxScore. So if it comes ,ignore it. JavaBinCodec.writeSolrDocumentList()
     //is agnostic of request params.
     handle.remove("maxScore");
-    query("q","{!func}"+i1, "fl","*,score");  // even scores should match exactly here
+    query(false, new String[] {"q","{!func}"+i1, "fl","*,score"});  // even scores should match exactly here
 
     handle.put("highlighting", UNORDERED);
     handle.put("response", UNORDERED);
 
     handle.put("maxScore", SKIPVAL);
-    query("q","quick");
-    query("q","all","fl","id","start","0");
-    query("q","all","fl","foofoofoo","start","0");  // no fields in returned docs
-    query("q","all","fl","id","start","100");
+    query(false, new String[] {"q","quick"});
+    query(false, new String[] {"q","all","fl","id","start","0"});
+    query(false, new String[] {"q","all","fl","foofoofoo","start","0"});  // no fields in returned docs
+    query(false, new String[] {"q","all","fl","id","start","100"});
 
     handle.put("score", SKIPVAL);
-    query("q","quick","fl","*,score");
-    query("q","all","fl","*,score","start","1");
-    query("q","all","fl","*,score","start","100");
-
-    query("q","now their fox sat had put","fl","*,score",
-            "hl","true","hl.fl",t1);
-
-    query("q","now their fox sat had put","fl","foofoofoo",
-            "hl","true","hl.fl",t1);
-
-    query("q","matchesnothing","fl","*,score");  
-
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1);
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","count");
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","count", "facet.mincount",2);
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","index");
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","index", "facet.mincount",2);
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1,"facet.limit",1);
-    query("q","*:*", "rows",100, "facet","true", "facet.query","quick", "facet.query","all", "facet.query","*:*");
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.offset",1);
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.mincount",2);
+    query(false, new String[] {"q","quick","fl","*,score"});
+    query(false, new String[] {"q","all","fl","*,score","start","1"});
+    query(false, new String[] {"q","all","fl","*,score","start","100"});
+
+    query(false, new String[] {"q","now their fox sat had put","fl","*,score",
+            "hl","true","hl.fl",t1});
+
+    query(false, new String[] {"q","now their fox sat had put","fl","foofoofoo",
+            "hl","true","hl.fl",t1});
+
+    query(false, new String[] {"q","matchesnothing","fl","*,score"});  
+
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",t1});
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","count"});
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","count", "facet.mincount",2});
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","index"});
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","index", "facet.mincount",2});
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",t1,"facet.limit",1});
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.query","quick", "facet.query","all", "facet.query","*:*"});
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.offset",1});
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.mincount",2});
 
     // test faceting multiple things at once
-    query("q","*:*", "rows",100, "facet","true", "facet.query","quick", "facet.query","all", "facet.query","*:*"
-    ,"facet.field",t1);
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.query","quick", "facet.query","all", "facet.query","*:*"
+    ,"facet.field",t1});
 
     // test filter tagging, facet exclusion, and naming (multi-select facet support)
-    query("q","*:*", "rows",100, "facet","true", "facet.query","{!key=myquick}quick", "facet.query","{!key=myall ex=a}all", "facet.query","*:*"
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.query","{!key=myquick}quick", "facet.query","{!key=myall ex=a}all", "facet.query","*:*"
     ,"facet.field","{!key=mykey ex=a}"+t1
     ,"facet.field","{!key=other ex=b}"+t1
     ,"facet.field","{!key=again ex=a,b}"+t1
     ,"facet.field",t1
-    ,"fq","{!tag=a}id:[1 TO 7]", "fq","{!tag=b}id:[3 TO 9]"
+    ,"fq","{!tag=a}id:[1 TO 7]", "fq","{!tag=b}id:[3 TO 9]"}
     );
-    query("q", "*:*", "facet", "true", "facet.field", "{!ex=t1}SubjectTerms_mfacet", "fq", "{!tag=t1}SubjectTerms_mfacet:(test 1)", "facet.limit", "10", "facet.mincount", "1");
+    query(false, new Object[] {"q", "*:*", "facet", "true", "facet.field", "{!ex=t1}SubjectTerms_mfacet", "fq", "{!tag=t1}SubjectTerms_mfacet:(test 1)", "facet.limit", "10", "facet.mincount", "1"});
 
     // test field that is valid in schema but missing in all shards
-    query("q","*:*", "rows",100, "facet","true", "facet.field",missingField, "facet.mincount",2);
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",missingField, "facet.mincount",2});
     // test field that is valid in schema and missing in some shards
-    query("q","*:*", "rows",100, "facet","true", "facet.field",oddField, "facet.mincount",2);
+    query(false, new Object[] {"q","*:*", "rows",100, "facet","true", "facet.field",oddField, "facet.mincount",2});
 
-    query("q","*:*", "sort",i1+" desc", "stats", "true", "stats.field", i1);
+    query(false, new Object[] {"q","*:*", "sort",i1+" desc", "stats", "true", "stats.field", i1});
 
     /*** TODO: the failure may come back in "exception"
     try {
@@ -263,9 +283,9 @@ public class BasicDistributedZkTest exte
     // This makes it much more likely that we may not get the top facet values and hence
     // we turn of that checking.
     handle.put("facet_fields", SKIPVAL);    
-    query("q","*:*", "rows",0, "facet","true", "facet.field",t1,"facet.limit",5, "facet.shard.limit",5);
+    query(false, new Object[] {"q","*:*", "rows",0, "facet","true", "facet.field",t1,"facet.limit",5, "facet.shard.limit",5});
     // check a complex key name
-    query("q","*:*", "rows",0, "facet","true", "facet.field","{!key='a b/c \\' \\} foo'}"+t1,"facet.limit",5, "facet.shard.limit",5);
+    query(false, new Object[] {"q","*:*", "rows",0, "facet","true", "facet.field","{!key='a b/c \\' \\} foo'}"+t1,"facet.limit",5, "facet.shard.limit",5});
     handle.remove("facet_fields");
 
 
@@ -277,20 +297,20 @@ public class BasicDistributedZkTest exte
         index_specific(i, id,100, i1, 107 ,t1,"oh no, a duplicate!");
       }
       commit();
-      query("q","duplicate", "hl","true", "hl.fl", t1);
-      query("q","fox duplicate horses", "hl","true", "hl.fl", t1);
-      query("q","*:*", "rows",100);
+      query(false, new Object[] {"q","duplicate", "hl","true", "hl.fl", t1});
+      query(false, new Object[] {"q","fox duplicate horses", "hl","true", "hl.fl", t1});
+      query(false, new Object[] {"q","*:*", "rows",100});
     }
 
     // test debugging
     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);
+    query(false, new Object[] {"q","now their fox sat had put","fl","*,score",CommonParams.DEBUG_QUERY, "true"});
+    query(false, new Object[] {"q", "id:[1 TO 5]", CommonParams.DEBUG_QUERY, "true"});
+    query(false, new Object[] {"q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.TIMING});
+    query(false, new Object[] {"q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.RESULTS});
+    query(false, new Object[] {"q", "id:[1 TO 5]", CommonParams.DEBUG, CommonParams.QUERY});
 
     // TODO: This test currently fails because debug info is obtained only
     // on shards with matches.
@@ -343,9 +363,15 @@ public class BasicDistributedZkTest exte
       SolrRequest request = new QueryRequest(params);
       request.setPath("/admin/collections");
    
-      clients.get(clientIndex).request(request);
+      final String baseUrl = ((HttpSolrServer) clients.get(clientIndex)).getBaseURL().substring(
+          0,
+          ((HttpSolrServer) clients.get(clientIndex)).getBaseURL().length()
+              - DEFAULT_COLLECTION.length() - 1);
+      
+      createNewSolrServer("", baseUrl).request(request);
     }
     
+    
     Set<Entry<String,List<Integer>>> collectionInfosEntrySet = collectionInfos.entrySet();
     for (Entry<String,List<Integer>> entry : collectionInfosEntrySet) {
       String collection = entry.getKey();
@@ -357,7 +383,11 @@ public class BasicDistributedZkTest exte
       HttpSolrServer collectionClient = new HttpSolrServer(url);
       
       // poll for a second - it can take a moment before we are ready to serve
-      waitForNon404or503(collectionClient);
+      waitForNon403or404or503(collectionClient);
+    }
+    
+    for (int i = 0; i < cnt; i++) {
+      waitForRecoveriesToFinish("awholynewcollection_" + i, zkStateReader, false);
     }
     
     List<String> collectionNameList = new ArrayList<String>();
@@ -400,7 +430,12 @@ public class BasicDistributedZkTest exte
     request.setPath("/admin/collections");
     
     // we can use this client because we just want base url
-    clients.get(0).request(request);
+    final String baseUrl = ((HttpSolrServer) clients.get(0)).getBaseURL().substring(
+        0,
+        ((HttpSolrServer) clients.get(0)).getBaseURL().length()
+            - DEFAULT_COLLECTION.length() - 1);
+    
+    createNewSolrServer("", baseUrl).request(request);
 
     // reloads make take a short while
     boolean allTimesAreCorrect = waitForReloads(collectionName, urlToTimeBefore);
@@ -413,7 +448,7 @@ public class BasicDistributedZkTest exte
     request = new QueryRequest(params);
     request.setPath("/admin/collections");
  
-    clients.get(0).request(request);
+    createNewSolrServer("", baseUrl).request(request);
     
     // ensure its out of the state
     checkForMissingCollection(collectionName);
@@ -502,7 +537,7 @@ public class BasicDistributedZkTest exte
     throw new RuntimeException("Could not find a live node for collection:" + collection);
   }
 
-  private void waitForNon404or503(HttpSolrServer collectionClient)
+  private void waitForNon403or404or503(HttpSolrServer collectionClient)
       throws Exception {
     SolrException exp = null;
     long timeoutAt = System.currentTimeMillis() + 30000;
@@ -513,7 +548,7 @@ public class BasicDistributedZkTest exte
       try {
         collectionClient.query(new SolrQuery("*:*"));
       } catch (SolrException e) {
-        if (!(e.code() == 403 || e.code() == 503)) {
+        if (!(e.code() == 403 || e.code() == 503 || e.code() == 404)) {
           throw e;
         }
         exp = e;
@@ -535,7 +570,6 @@ public class BasicDistributedZkTest exte
     boolean found = false;
     boolean sliceMatch = false;
     while (System.currentTimeMillis() < timeoutAt) {
-      solrj.getZkStateReader().updateClusterState(true);
       ClusterState clusterState = solrj.getZkStateReader().getClusterState();
       Map<String,Map<String,Slice>> collections = clusterState
           .getCollectionStates();
@@ -544,35 +578,16 @@ public class BasicDistributedZkTest exte
         // did we find expectedSlices slices/shards?
         if (slices.size() == expectedSlices) {
           sliceMatch = true;
-          found = true;
-          // also make sure each are active
-          Iterator<Entry<String,Slice>> it = slices.entrySet().iterator();
-          while (it.hasNext()) {
-            Entry<String,Slice> sliceEntry = it.next();
-            Map<String,Replica> sliceShards = sliceEntry.getValue()
-                .getReplicasMap();
-            Iterator<Entry<String,Replica>> shardIt = sliceShards
-                .entrySet().iterator();
-            while (shardIt.hasNext()) {
-              Entry<String,Replica> shardEntry = shardIt.next();
-              if (!shardEntry.getValue().getStr(ZkStateReader.STATE_PROP)
-                  .equals(ZkStateReader.ACTIVE)) {
-                found = false;
-                break;
-              }
-            }
-          }
-          if (found) break;
+
         }
+        found = true;
+        break;
       }
-      Thread.sleep(100);
+      Thread.sleep(500);
     }
     if (!found) {
-      printLayout();
       if (!sliceMatch) {
         fail("Could not find new " + expectedSlices + " slice collection called " + collectionName);
-      } else {
-        fail("Found expected # of slices, but some nodes are not active for collection called " + collectionName);
       }
     }
   }
@@ -648,6 +663,8 @@ public class BasicDistributedZkTest exte
 
   // cloud level test mainly needed just to make sure that versions and errors are propagated correctly
   private void doOptimisticLockingAndUpdating() throws Exception {
+    printLayout();
+    
     SolrInputDocument sd =  sdoc("id", 1000, "_version_", -1);
     indexDoc(sd);
 
@@ -717,10 +734,14 @@ public class BasicDistributedZkTest exte
   }
 
   private void testANewCollectionInOneInstanceWithManualShardAssignement() throws Exception {
+    System.clearProperty("numShards");
     List<SolrServer> collectionClients = new ArrayList<SolrServer>();
     SolrServer client = clients.get(0);
     otherCollectionClients.put(oneInstanceCollection2, collectionClients);
-    String baseUrl = ((HttpSolrServer) client).getBaseURL();
+    final String baseUrl = ((HttpSolrServer) client).getBaseURL().substring(
+        0,
+        ((HttpSolrServer) client).getBaseURL().length()
+            - DEFAULT_COLLECTION.length() - 1);
     createCollection(oneInstanceCollection2, collectionClients, baseUrl, 1, "slice1");
     createCollection(oneInstanceCollection2, collectionClients, baseUrl, 2, "slice2");
     createCollection(oneInstanceCollection2, collectionClients, baseUrl, 3, "slice2");
@@ -743,6 +764,8 @@ public class BasicDistributedZkTest exte
     
     assertAllActive(oneInstanceCollection2, solrj.getZkStateReader());
     
+    printLayout();
+    
    // TODO: enable when we don't falsely get slice1...
    // solrj.getZkStateReader().getLeaderUrl(oneInstanceCollection2, "slice1", 30000);
    // solrj.getZkStateReader().getLeaderUrl(oneInstanceCollection2, "slice2", 30000);
@@ -784,7 +807,10 @@ public class BasicDistributedZkTest exte
 
   private void testSearchByCollectionName() throws SolrServerException {
     SolrServer client = clients.get(0);
-    String baseUrl = ((HttpSolrServer) client).getBaseURL();
+    final String baseUrl = ((HttpSolrServer) client).getBaseURL().substring(
+        0,
+        ((HttpSolrServer) client).getBaseURL().length()
+            - DEFAULT_COLLECTION.length() - 1);
     
     // the cores each have different names, but if we add the collection name to the url
     // we should get mapped to the right core
@@ -798,7 +824,10 @@ public class BasicDistributedZkTest exte
     List<SolrServer> collectionClients = new ArrayList<SolrServer>();
     SolrServer client = clients.get(0);
     otherCollectionClients.put(oneInstanceCollection , collectionClients);
-    String baseUrl = ((HttpSolrServer) client).getBaseURL();
+    final String baseUrl = ((HttpSolrServer) client).getBaseURL().substring(
+        0,
+        ((HttpSolrServer) client).getBaseURL().length()
+            - DEFAULT_COLLECTION.length() - 1);
     createCollection(oneInstanceCollection, collectionClients, baseUrl, 1);
     createCollection(oneInstanceCollection, collectionClients, baseUrl, 2);
     createCollection(oneInstanceCollection, collectionClients, baseUrl, 3);
@@ -961,13 +990,17 @@ public class BasicDistributedZkTest exte
     int unique = 0;
     for (final SolrServer client : clients) {
       unique++;
+      final String baseUrl = ((HttpSolrServer) client).getBaseURL()
+          .substring(
+              0,
+              ((HttpSolrServer) client).getBaseURL().length()
+                  - DEFAULT_COLLECTION.length() -1);
       final int frozeUnique = unique;
       Callable call = new Callable() {
         public Object call() {
           HttpSolrServer server;
           try {
-            server = new HttpSolrServer(
-                ((HttpSolrServer) client).getBaseURL());
+            server = new HttpSolrServer(baseUrl);
             
             Create createCmd = new Create();
             createCmd.setCoreName(collection);
@@ -983,8 +1016,7 @@ public class BasicDistributedZkTest exte
         }
       };
      
-      collectionClients.add(createNewSolrServer(collection,
-          ((HttpSolrServer) client).getBaseURL()));
+      collectionClients.add(createNewSolrServer(collection, baseUrl));
       pending.add(completionService.submit(call));
       while (pending != null && pending.size() > 0) {
         
@@ -1043,6 +1075,7 @@ public class BasicDistributedZkTest exte
     if (solrj != null) {
       solrj.shutdown();
     }
+    System.clearProperty("numShards");
     System.clearProperty("zkHost");
   }
 }

Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java?rev=1385136&r1=1385135&r2=1385136&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java Sat Sep 15 17:39:28 2012
@@ -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/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java?rev=1385136&r1=1385135&r2=1385136&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java Sat Sep 15 17:39:28 2012
@@ -128,6 +128,7 @@ 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,Replica> shards = entry.getValue().getReplicasMap();
         for (Map.Entry<String,Replica> shard : shards.entrySet()) {

Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java?rev=1385136&r1=1385135&r2=1385136&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java Sat Sep 15 17:39:28 2012
@@ -288,8 +288,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,
+          "solrtest-" + "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);