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 2013/10/11 04:17:57 UTC

svn commit: r1531171 - in /lucene/dev/branches/lucene_solr_4_5: ./ solr/ solr/core/ solr/core/src/java/org/apache/solr/client/solrj/embedded/ solr/core/src/java/org/apache/solr/core/ solr/core/src/java/org/apache/solr/handler/admin/ solr/core/src/test-...

Author: markrmiller
Date: Fri Oct 11 02:17:56 2013
New Revision: 1531171

URL: http://svn.apache.org/r1531171
Log:
SOLR-5317: SolrCore persistence bugs if defining SolrCores in solr.xml
tests: Compare absolute paths 
Fix race  when persisting cores in solr.xml

Added:
    lucene/dev/branches/lucene_solr_4_5/solr/core/src/test-files/solr/solr-no-core-old-style.xml
      - copied unchanged from r1530982, lucene/dev/branches/branch_4x/solr/core/src/test-files/solr/solr-no-core-old-style.xml
Modified:
    lucene/dev/branches/lucene_solr_4_5/   (props changed)
    lucene/dev/branches/lucene_solr_4_5/solr/   (props changed)
    lucene/dev/branches/lucene_solr_4_5/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/lucene_solr_4_5/solr/core/   (props changed)
    lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
    lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/CoreContainer.java
    lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java
    lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
    lucene/dev/branches/lucene_solr_4_5/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java
    lucene/dev/branches/lucene_solr_4_5/solr/test-framework/   (props changed)
    lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
    lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
    lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java

Modified: lucene/dev/branches/lucene_solr_4_5/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/CHANGES.txt?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/CHANGES.txt Fri Oct 11 02:17:56 2013
@@ -62,6 +62,9 @@ Bug Fixes
 
 * SOLR-5327: SOLR-4915, "The root cause should be returned to the user when a SolrCore create
   call fails", was reverted. (Mark Miller)
+
+* SOLR-5317: SolrCore persistence bugs if defining SolrCores in solr.xml.
+  (Mark Miller, Yago Riveiro)
   
 ==================  4.5.0 ==================
 

Modified: lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/client/solrj/embedded/JettySolrRunner.java Fri Oct 11 02:17:56 2013
@@ -356,37 +356,40 @@ public class JettySolrRunner {
       startedBefore = true;
     }
     
-    if( dataDir != null) {
+    if (dataDir != null) {
       System.setProperty("solr.data.dir", dataDir);
     }
-    if( solrUlogDir != null) {
+    if (solrUlogDir != null) {
       System.setProperty("solr.ulog.dir", solrUlogDir);
     }
-    if(shards != null) {
+    if (shards != null) {
       System.setProperty("shard", shards);
     }
     if (coreNodeName != null) {
       System.setProperty("coreNodeName", coreNodeName);
     }
-    
-    if (!server.isRunning()) {
-      server.start();
-    }
-    synchronized (JettySolrRunner.this) {
-      int cnt = 0;
-      while (!waitOnSolr) {
-        this.wait(100);
-        if (cnt++ == 5) {
-          throw new RuntimeException("Jetty/Solr unresponsive");
+    try {
+      
+      if (!server.isRunning()) {
+        server.start();
+      }
+      synchronized (JettySolrRunner.this) {
+        int cnt = 0;
+        while (!waitOnSolr) {
+          this.wait(100);
+          if (cnt++ == 5) {
+            throw new RuntimeException("Jetty/Solr unresponsive");
+          }
         }
       }
+    } finally {
+      
+      System.clearProperty("shard");
+      System.clearProperty("solr.data.dir");
+      System.clearProperty("coreNodeName");
+      System.clearProperty("solr.ulog.dir");
     }
     
-    System.clearProperty("shard");
-    System.clearProperty("solr.data.dir");
-    System.clearProperty("coreNodeName");
-    System.clearProperty("solr.ulog.dir");
-
   }
 
   public void stop() throws Exception {

Modified: lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/CoreContainer.java Fri Oct 11 02:17:56 2013
@@ -17,25 +17,7 @@
 
 package org.apache.solr.core;
 
-import com.google.common.collect.Maps;
-import org.apache.solr.cloud.ZkController;
-import org.apache.solr.cloud.ZkSolrResourceLoader;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrException.ErrorCode;
-import org.apache.solr.common.cloud.ZooKeeperException;
-import org.apache.solr.common.util.ExecutorUtil;
-import org.apache.solr.handler.admin.CollectionsHandler;
-import org.apache.solr.handler.admin.CoreAdminHandler;
-import org.apache.solr.handler.admin.InfoHandler;
-import org.apache.solr.handler.component.ShardHandlerFactory;
-import org.apache.solr.logging.LogWatcher;
-import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.IndexSchemaFactory;
-import org.apache.solr.util.DefaultSolrThreadFactory;
-import org.apache.solr.util.FileUtils;
-import org.apache.zookeeper.KeeperException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.File;
 import java.text.SimpleDateFormat;
@@ -57,11 +39,27 @@ import java.util.concurrent.ExecutorComp
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import org.apache.solr.cloud.ZkController;
+import org.apache.solr.cloud.ZkSolrResourceLoader;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrException.ErrorCode;
+import org.apache.solr.common.cloud.ZooKeeperException;
+import org.apache.solr.common.util.ExecutorUtil;
+import org.apache.solr.handler.admin.CollectionsHandler;
+import org.apache.solr.handler.admin.CoreAdminHandler;
+import org.apache.solr.handler.admin.InfoHandler;
+import org.apache.solr.handler.component.ShardHandlerFactory;
+import org.apache.solr.logging.LogWatcher;
+import org.apache.solr.schema.IndexSchema;
+import org.apache.solr.schema.IndexSchemaFactory;
+import org.apache.solr.util.DefaultSolrThreadFactory;
+import org.apache.solr.util.FileUtils;
+import org.apache.zookeeper.KeeperException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.Maps;
 
 
 /**

Modified: lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java Fri Oct 11 02:17:56 2013
@@ -19,6 +19,8 @@ package org.apache.solr.core;
 
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
+
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,6 +30,8 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -139,20 +143,31 @@ public class SolrXMLCoresLocator impleme
   }
 
   @Override
-  public final void persist(CoreContainer cc, CoreDescriptor... coreDescriptors) {
-    doPersist(buildSolrXML(cc.getCoreDescriptors()));
+  public synchronized final void persist(CoreContainer cc, CoreDescriptor... coreDescriptors) {
+    List<CoreDescriptor> cds = new ArrayList<CoreDescriptor>(cc.getCoreDescriptors().size() + coreDescriptors.length);
+    
+    cds.addAll(cc.getCoreDescriptors());
+    cds.addAll(Arrays.asList(coreDescriptors));
+
+    doPersist(buildSolrXML(cds));
   }
 
   protected void doPersist(String xml) {
     File file = new File(cfg.config.getResourceLoader().getInstanceDir(), ConfigSolr.SOLR_XML_FILE);
+    Writer writer = null;
+    FileOutputStream fos = null;
     try {
-      Writer writer = new OutputStreamWriter(new FileOutputStream(file), Charsets.UTF_8);
+      fos = new FileOutputStream(file);
+      writer = new OutputStreamWriter(fos, Charsets.UTF_8);
       writer.write(xml);
       writer.close();
       logger.info("Persisted core descriptions to {}", file.getAbsolutePath());
-    }
-    catch (IOException e) {
-      logger.error("Couldn't persist core descriptions to {} : {}", file.getAbsolutePath(), e);
+    } catch (IOException e) {
+      logger.error("Couldn't persist core descriptions to {} : {}",
+          file.getAbsolutePath(), e);
+    } finally {
+      IOUtils.closeQuietly(writer);
+      IOUtils.closeQuietly(fos);
     }
   }
 
@@ -163,12 +178,14 @@ public class SolrXMLCoresLocator impleme
 
   @Override
   public void delete(CoreContainer cc, CoreDescriptor... coreDescriptors) {
-    this.persist(cc, coreDescriptors);
+    // coreDescriptors is kind of a useless param - we persist the current state off cc
+    this.persist(cc);
   }
 
   @Override
   public void rename(CoreContainer cc, CoreDescriptor oldCD, CoreDescriptor newCD) {
-    this.persist(cc, oldCD, newCD);
+    // we don't need those params, we just write out the current cc state
+    this.persist(cc);
   }
 
   @Override

Modified: lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Fri Oct 11 02:17:56 2013
@@ -19,6 +19,7 @@ package org.apache.solr.handler.admin;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.lucene.index.DirectoryReader;
@@ -48,6 +49,7 @@ import org.apache.solr.core.CoreDescript
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.core.DirectoryFactory.DirContext;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrXMLCoresLocator;
 import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
@@ -461,9 +463,19 @@ public class CoreAdminHandler extends Re
       if (coreContainer.getZkController() != null) {
         coreContainer.preRegisterInZk(dcore);
       }
+
+      // make sure we can write out the descriptor first
       coreContainer.getCoresLocator().create(coreContainer, dcore);
+      
       SolrCore core = coreContainer.create(dcore);
+      
       coreContainer.register(dcore.getName(), core, false);
+      
+      if (coreContainer.getCoresLocator() instanceof SolrXMLCoresLocator) {
+        // hack - in this case we persist once more because a core create race might
+        // have dropped entries.
+        coreContainer.getCoresLocator().create(coreContainer);
+      }
       rsp.add("core", core.getName());
     }
     catch (Exception ex) {

Modified: lucene/dev/branches/lucene_solr_4_5/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java Fri Oct 11 02:17:56 2013
@@ -65,6 +65,7 @@ import org.apache.solr.common.cloud.Clus
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
+import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -99,6 +100,11 @@ public class CollectionsAPIDistributedZk
   
   CompletionService<Request> completionService;
   Set<Future<Request>> pending;
+
+  // we randomly use a second config set rather than just one
+  private boolean secondConfigSet = random().nextBoolean();
+
+  private boolean oldStyleSolrXml = false;
   
   @BeforeClass
   public static void beforeThisClass2() throws Exception {
@@ -109,12 +115,49 @@ public class CollectionsAPIDistributedZk
   @Override
   public void setUp() throws Exception {
     super.setUp();
+    
     System.setProperty("numShards", Integer.toString(sliceCount));
     System.setProperty("solr.xml.persist", "true");
+    useJettyDataDir = false;
+    
+    oldStyleSolrXml = random().nextBoolean();
+    if (oldStyleSolrXml) {
+      System.err.println("Using old style solr.xml");
+    } else {
+      System.err.println("Using new style solr.xml");
+    }
+    if (secondConfigSet ) {
+      String zkHost = zkServer.getZkHost();
+      String zkAddress = zkServer.getZkAddress();
+      SolrZkClient zkClient = new SolrZkClient(zkHost, AbstractZkTestCase.TIMEOUT);
+      zkClient.makePath("/solr", false, true);
+      zkClient.close();
+
+      zkClient = new SolrZkClient(zkAddress, AbstractZkTestCase.TIMEOUT);
+
+      File solrhome = new File(TEST_HOME());
+      
+      // for now, always upload the config and schema to the canonical names
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "solrconfig.xml", "solrconfig.xml");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "schema.xml", "schema.xml");
+
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "solrconfig.snippet.randomindexconfig.xml");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "stopwords.txt");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "protwords.txt");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "currency.xml");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "open-exchange-rates.json");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "mapping-ISOLatin1Accent.txt");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "old_synonyms.txt");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "synonyms.txt");
+      AbstractZkTestCase.putConfig("conf2", zkClient, solrhome, "elevate.xml");
+      zkClient.close();
+    }
+
   }
   
   protected String getSolrXml() {
-    return "solr-no-core.xml";
+    // test old style and new style solr.xml
+    return oldStyleSolrXml ? "solr-no-core-old-style.xml" : "solr-no-core.xml";
   }
 
   
@@ -498,6 +541,27 @@ public class CollectionsAPIDistributedZk
       // poll for a second - it can take a moment before we are ready to serve
       waitForNon403or404or503(collectionClient);
     }
+    
+    // sometimes we restart one of the jetty nodes
+    if (random().nextBoolean()) {
+      JettySolrRunner jetty = jettys.get(random().nextInt(jettys.size()));
+      ChaosMonkey.stop(jetty);
+      ChaosMonkey.start(jetty);
+      
+      for (Entry<String,List<Integer>> entry : collectionInfosEntrySet) {
+        String collection = entry.getKey();
+        List<Integer> list = entry.getValue();
+        checkForCollection(collection, list, null);
+        
+        String url = getUrlFromZk(collection);
+        
+        HttpSolrServer collectionClient = new HttpSolrServer(url);
+        
+        // poll for a second - it can take a moment before we are ready to serve
+        waitForNon403or404or503(collectionClient);
+      }
+    }
+
     ZkStateReader zkStateReader = getCommonCloudSolrServer().getZkStateReader();
     for (int j = 0; j < cnt; j++) {
       waitForRecoveriesToFinish("awholynewcollection_" + j, zkStateReader, false);
@@ -668,16 +732,18 @@ public class CollectionsAPIDistributedZk
         .getFilter()).getCores();
     Collection<SolrCore> theCores = cores.getCores();
     for (SolrCore core : theCores) {
-      // look for core props file
-      assertTrue("Could not find expected core.properties file",
-          new File((String) core.getStatistics().get("instanceDir"),
-              "core.properties").exists());
+      if (!oldStyleSolrXml) {
+        // look for core props file
+        assertTrue("Could not find expected core.properties file",
+            new File((String) core.getStatistics().get("instanceDir"),
+                "core.properties").exists());
+      }
       
       assertEquals(
-          SolrResourceLoader.normalizeDir(jetty.getSolrHome() + File.separator
-              + core.getName()),
-          SolrResourceLoader.normalizeDir((String) core.getStatistics().get(
-              "instanceDir")));
+         new File(SolrResourceLoader.normalizeDir(jetty.getSolrHome() + File.separator
+              + core.getName())).getAbsolutePath(),
+          new File(SolrResourceLoader.normalizeDir((String) core.getStatistics().get(
+              "instanceDir"))).getAbsolutePath());
     }
   }
 

Modified: lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java Fri Oct 11 02:17:56 2013
@@ -148,7 +148,7 @@ public abstract class AbstractDistribZkT
       for (Map.Entry<String,Slice> entry : slices.entrySet()) {
         Map<String,Replica> shards = entry.getValue().getReplicasMap();
         for (Map.Entry<String,Replica> shard : shards.entrySet()) {
-          if (verbose) System.out.println("rstate:"
+          if (verbose) System.out.println("replica:" + shard.getValue().getName() + " rstate:"
               + shard.getValue().getStr(ZkStateReader.STATE_PROP)
               + " live:"
               + clusterState.liveNodesContain(shard.getValue().getNodeName()));

Modified: lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java Fri Oct 11 02:17:56 2013
@@ -121,6 +121,7 @@ public abstract class AbstractFullDistri
   protected Map<String,CloudJettyRunner> shardToLeaderJetty = new HashMap<String,CloudJettyRunner>();
   private boolean cloudInit;
   protected boolean checkCreatedVsState;
+  protected boolean useJettyDataDir = true;
   
   public static class CloudJettyRunner {
     public JettySolrRunner jetty;
@@ -346,8 +347,8 @@ public abstract class AbstractFullDistri
           getClass().getName() + "-jetty" + cnt + "-" + System.currentTimeMillis());
       jettyDir.mkdirs();
       setupJettySolrHome(jettyDir);
-      JettySolrRunner j = createJetty(jettyDir, getDataDir(testDir + "/jetty"
-          + cnt), null, "solrconfig.xml", null);
+      JettySolrRunner j = createJetty(jettyDir, useJettyDataDir ? getDataDir(testDir + "/jetty"
+          + cnt) : null, null, "solrconfig.xml", null);
       jettys.add(j);
       SolrServer client = createNewSolrServer(j.getLocalPort());
       clients.add(client);

Modified: lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java?rev=1531171&r1=1531170&r2=1531171&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java (original)
+++ lucene/dev/branches/lucene_solr_4_5/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java Fri Oct 11 02:17:56 2013
@@ -102,27 +102,26 @@ public abstract class AbstractZkTestCase
     zkClient.makePath("/collections/control_collection/shards", CreateMode.PERSISTENT, true);
 
     // for now, always upload the config and schema to the canonical names
-    putConfig(zkClient, solrhome, config, "solrconfig.xml");
-    putConfig(zkClient, solrhome, schema, "schema.xml");
+    putConfig("conf1", zkClient, solrhome, config, "solrconfig.xml");
+    putConfig("conf1", zkClient, solrhome, schema, "schema.xml");
 
-    putConfig(zkClient, solrhome, "solrconfig.snippet.randomindexconfig.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");
-    
+    putConfig("conf1", zkClient, solrhome, "solrconfig.snippet.randomindexconfig.xml");
+    putConfig("conf1", zkClient, solrhome, "stopwords.txt");
+    putConfig("conf1", zkClient, solrhome, "protwords.txt");
+    putConfig("conf1", zkClient, solrhome, "currency.xml");
+    putConfig("conf1", zkClient, solrhome, "open-exchange-rates.json");
+    putConfig("conf1", zkClient, solrhome, "mapping-ISOLatin1Accent.txt");
+    putConfig("conf1", zkClient, solrhome, "old_synonyms.txt");
+    putConfig("conf1", zkClient, solrhome, "synonyms.txt");
     zkClient.close();
   }
 
-  private static void putConfig(SolrZkClient zkClient, File solrhome, final String name)
+  public static void putConfig(String confName, SolrZkClient zkClient, File solrhome, final String name)
       throws Exception {
-    putConfig(zkClient, solrhome, name, name);
+    putConfig(confName, zkClient, solrhome, name, name);
   }
 
-  private static void putConfig(SolrZkClient zkClient, File solrhome, final String srcName, String destName)
+  public static void putConfig(String confName, SolrZkClient zkClient, File solrhome, final String srcName, String destName)
       throws Exception {
     File file = new File(solrhome, "collection1"
         + File.separator + "conf" + File.separator + srcName);
@@ -131,7 +130,7 @@ public abstract class AbstractZkTestCase
       return;
     }
 
-    String destPath = "/configs/conf1/" + destName;
+    String destPath = "/configs/" + confName + "/" + destName;
     log.info("put " + file.getAbsolutePath() + " to " + destPath);
     zkClient.makePath(destPath, file, false, true);
   }