Index: solr/core/src/test/org/apache/solr/core/TestSolrXmlPersistor.java =================================================================== --- solr/core/src/test/org/apache/solr/core/TestSolrXmlPersistor.java (revision 1514699) +++ solr/core/src/test/org/apache/solr/core/TestSolrXmlPersistor.java (working copy) @@ -35,7 +35,7 @@ final String solrxml = ""; - SolrXMLCoresLocator persistor = new SolrXMLCoresLocator(new File("testfile.xml"), solrxml, null); + SolrXMLCoresLocator persistor = new SolrXMLCoresLocator(solrxml, null); assertEquals(persistor.buildSolrXML(EMPTY_CD_LIST), ""); @@ -45,7 +45,7 @@ public void emptyCoresTagIsPersisted() { final String solrxml = ""; - SolrXMLCoresLocator persistor = new SolrXMLCoresLocator(new File("testfile.xml"), solrxml, null); + SolrXMLCoresLocator persistor = new SolrXMLCoresLocator(solrxml, null); assertEquals(persistor.buildSolrXML(EMPTY_CD_LIST), ""); } @@ -53,7 +53,7 @@ public void emptySolrXmlIsPersisted() { final String solrxml = ""; - SolrXMLCoresLocator persistor = new SolrXMLCoresLocator(new File("testfile.xml"), solrxml, null); + SolrXMLCoresLocator persistor = new SolrXMLCoresLocator(solrxml, null); assertEquals(persistor.buildSolrXML(EMPTY_CD_LIST), ""); } @@ -68,7 +68,7 @@ final CoreDescriptor cd = new CoreDescriptor(cc, "testcore", "instance/dir/"); List cds = ImmutableList.of(cd); - SolrXMLCoresLocator persistor = new SolrXMLCoresLocator(new File("testfile.xml"), solrxml, null); + SolrXMLCoresLocator persistor = new SolrXMLCoresLocator(solrxml, null); assertEquals(persistor.buildSolrXML(cds), "" + SolrXMLCoresLocator.NEWLINE + " " + SolrXMLCoresLocator.NEWLINE @@ -89,7 +89,7 @@ "" + ""; - SolrXMLCoresLocator locator = new SolrXMLCoresLocator(new File("testfile.xml"), solrxml, null); + SolrXMLCoresLocator locator = new SolrXMLCoresLocator(solrxml, null); assertTrue(locator.getTemplate().contains("{{CORES_PLACEHOLDER}}")); assertTrue(locator.getTemplate().contains("" + ""; - SolrXMLCoresLocator locator = new SolrXMLCoresLocator(new File("testfile.xml"), solrxml, null); + SolrXMLCoresLocator locator = new SolrXMLCoresLocator(solrxml, null); assertTrue(locator.getTemplate().contains("{{CORES_PLACEHOLDER}}")); assertTrue(locator.getTemplate().contains("" + + " " + + " 127.0.0.1" + + " 9045" + + " ${hostContext:solr}" + + " " + + " " + + " ${socketTimeout:120000}" + + " ${connTimeout:15000}" + + " " + + ""; + +} Index: solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java =================================================================== --- solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java (revision 1514699) +++ solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java (working copy) @@ -18,12 +18,14 @@ package org.apache.solr.servlet; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException.ErrorCode; import org.apache.solr.common.cloud.Aliases; import org.apache.solr.common.cloud.ClusterState; import org.apache.solr.common.cloud.Replica; import org.apache.solr.common.cloud.Slice; +import org.apache.solr.common.cloud.SolrZkClient; import org.apache.solr.common.cloud.ZkCoreNodeProps; import org.apache.solr.common.cloud.ZkNodeProps; import org.apache.solr.common.cloud.ZkStateReader; @@ -35,9 +37,11 @@ import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.common.util.StrUtils; +import org.apache.solr.core.ConfigSolr; import org.apache.solr.core.CoreContainer; import org.apache.solr.core.SolrConfig; import org.apache.solr.core.SolrCore; +import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.handler.ContentStreamHandlerBase; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrQueryRequestBase; @@ -60,6 +64,7 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -131,12 +136,44 @@ log.info("SolrDispatchFilter.init() done"); } + private ConfigSolr loadConfigSolr(SolrResourceLoader loader) { + + String solrxmlLocation = System.getProperty("solr.solrxml.location", "solrhome"); + + if (solrxmlLocation == null || "solrhome".equalsIgnoreCase(solrxmlLocation)) + return ConfigSolr.fromSolrHome(loader, loader.getInstanceDir()); + + if ("zookeeper".equalsIgnoreCase(solrxmlLocation)) { + String zkHost = System.getProperty("zkHost"); + log.info("Trying to read solr.xml from " + zkHost); + if (StringUtils.isEmpty(zkHost)) + throw new SolrException(ErrorCode.SERVER_ERROR, + "Could not load solr.xml from zookeeper: zkHost system property not set"); + SolrZkClient zkClient = new SolrZkClient(zkHost, 30000); + try { + if (!zkClient.exists("/solr.xml", true)) + throw new SolrException(ErrorCode.SERVER_ERROR, "Could not load solr.xml from zookeeper: node not found"); + byte[] data = zkClient.getData("/solr.xml", null, null, true); + return ConfigSolr.fromInputStream(loader, new ByteArrayInputStream(data)); + } catch (Exception e) { + throw new SolrException(ErrorCode.SERVER_ERROR, "Could not load solr.xml from zookeeper", e); + } finally { + zkClient.close(); + } + } + + throw new SolrException(ErrorCode.SERVER_ERROR, + "Bad solr.solrxml.location set: " + solrxmlLocation + " - should be 'solrhome' or 'zookeeper'"); + } + /** * Override this to change CoreContainer initialization * @return a CoreContainer to hold this server's cores */ protected CoreContainer createCoreContainer() { - CoreContainer cores = new CoreContainer(); + SolrResourceLoader loader = new SolrResourceLoader(SolrResourceLoader.locateSolrHome()); + ConfigSolr config = loadConfigSolr(loader); + CoreContainer cores = new CoreContainer(loader, config); cores.load(); return cores; } Index: solr/core/src/java/org/apache/solr/core/ConfigSolr.java =================================================================== --- solr/core/src/java/org/apache/solr/core/ConfigSolr.java (revision 1514699) +++ solr/core/src/java/org/apache/solr/core/ConfigSolr.java (working copy) @@ -61,10 +61,7 @@ else { inputStream = new FileInputStream(configFile); } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ByteStreams.copy(inputStream, baos); - String originalXml = IOUtils.toString(new ByteArrayInputStream(baos.toByteArray()), "UTF-8"); - return fromInputStream(loader, new ByteArrayInputStream(baos.toByteArray()), configFile, originalXml); + return fromInputStream(loader, inputStream); } catch (Exception e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, @@ -76,13 +73,17 @@ } public static ConfigSolr fromString(String xml) { - return fromInputStream(null, new ByteArrayInputStream(xml.getBytes(Charsets.UTF_8)), null, xml); + return fromInputStream(null, new ByteArrayInputStream(xml.getBytes(Charsets.UTF_8))); } - public static ConfigSolr fromInputStream(SolrResourceLoader loader, InputStream is, File file, String originalXml) { + public static ConfigSolr fromInputStream(SolrResourceLoader loader, InputStream is) { try { - Config config = new Config(loader, null, new InputSource(is), null, false); - return fromConfig(config, file, originalXml); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ByteStreams.copy(is, baos); + String originalXml = IOUtils.toString(new ByteArrayInputStream(baos.toByteArray()), "UTF-8"); + ByteArrayInputStream dup = new ByteArrayInputStream(baos.toByteArray()); + Config config = new Config(loader, null, new InputSource(dup), null, false); + return fromConfig(config, originalXml); } catch (Exception e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e); @@ -93,9 +94,9 @@ return fromFile(loader, new File(solrHome, SOLR_XML_FILE)); } - public static ConfigSolr fromConfig(Config config, File file, String originalXml) { + public static ConfigSolr fromConfig(Config config, String originalXml) { boolean oldStyle = (config.getNode("solr/cores", false) != null); - return oldStyle ? new ConfigSolrXmlOld(config, file, originalXml) + return oldStyle ? new ConfigSolrXmlOld(config, originalXml) : new ConfigSolrXml(config); } Index: solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java =================================================================== --- solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java (revision 1514699) +++ solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java (working copy) @@ -41,7 +41,6 @@ private static final Logger logger = LoggerFactory.getLogger(SolrXMLCoresLocator.class); - private final File file; private final String solrXmlTemplate; private final ConfigSolrXmlOld cfg; @@ -50,13 +49,11 @@ /** * Create a new SolrXMLCoresLocator - * @param file a File object representing the file to write out to * @param originalXML the original content of the solr.xml file * @param cfg the CoreContainer's config object */ - public SolrXMLCoresLocator(File file, String originalXML, ConfigSolrXmlOld cfg) { + public SolrXMLCoresLocator(String originalXML, ConfigSolrXmlOld cfg) { this.solrXmlTemplate = buildTemplate(originalXML); - this.file = file; this.cfg = cfg; } @@ -147,6 +144,7 @@ } protected void doPersist(String xml) { + File file = new File(cfg.config.getResourceLoader().getInstanceDir(), ConfigSolr.SOLR_XML_FILE); try { Writer writer = new OutputStreamWriter(new FileOutputStream(file), Charsets.UTF_8); writer.write(xml); @@ -204,8 +202,8 @@ public static class NonPersistingLocator extends SolrXMLCoresLocator { - public NonPersistingLocator(File file, String originalXML, ConfigSolrXmlOld cfg) { - super(file, originalXML, cfg); + public NonPersistingLocator(String originalXML, ConfigSolrXmlOld cfg) { + super(originalXML, cfg); this.xml = originalXML; } Index: solr/core/src/java/org/apache/solr/core/ConfigSolrXmlOld.java =================================================================== --- solr/core/src/java/org/apache/solr/core/ConfigSolrXmlOld.java (revision 1514699) +++ solr/core/src/java/org/apache/solr/core/ConfigSolrXmlOld.java (working copy) @@ -55,15 +55,15 @@ return "solr/cores/shardHandlerFactory"; } - public ConfigSolrXmlOld(Config config, File configFile, String originalXML) { + public ConfigSolrXmlOld(Config config, String originalXML) { super(config); try { checkForIllegalConfig(); fillPropMap(); config.substituteProperties(); initCoreList(); - this.persistor = isPersistent() ? new SolrXMLCoresLocator(configFile, originalXML, this) - : new SolrXMLCoresLocator.NonPersistingLocator(configFile, originalXML, this); + this.persistor = isPersistent() ? new SolrXMLCoresLocator(originalXML, this) + : new SolrXMLCoresLocator.NonPersistingLocator(originalXML, this); } catch (IOException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);