Looks good - and works. No failures caused by this test anymore! Uwe
----- Uwe Schindler H.-H.-Meier-Allee 63, D-28213 Bremen http://www.thetaphi.de eMail: [email protected] > -----Original Message----- > From: Erick Erickson [mailto:[email protected]] > Sent: Sunday, July 07, 2013 4:41 AM > To: [email protected] > Subject: Re: svn commit: r1500284 - in /lucene/dev/trunk/solr: ./ > core/src/java/org/apache/solr/core/ > core/src/java/org/apache/solr/handler/admin/ > core/src/test/org/apache/solr/handler/admin/ test- > framework/src/java/org/apache/solr/ > > OK, I was able to reproduce this on my machine and checked in what appears > to be a fix. But then I thought I'd handled this case before, so we'll see > what > happens overnight. > > On Sat, Jul 6, 2013 at 7:10 PM, Uwe Schindler <[email protected]> wrote: > > This seems to cause a memory leak, see recently failing Jenkins tests! > > > > ----- > > Uwe Schindler > > H.-H.-Meier-Allee 63, D-28213 Bremen > > http://www.thetaphi.de > > eMail: [email protected] > > > > > >> -----Original Message----- > >> From: [email protected] [mailto:[email protected]] > >> Sent: Saturday, July 06, 2013 4:46 PM > >> To: [email protected] > >> Subject: svn commit: r1500284 - in /lucene/dev/trunk/solr: ./ > >> core/src/java/org/apache/solr/core/ > >> core/src/java/org/apache/solr/handler/admin/ > >> core/src/test/org/apache/solr/handler/admin/ test- > >> framework/src/java/org/apache/solr/ > >> > >> Author: erick > >> Date: Sat Jul 6 14:45:47 2013 > >> New Revision: 1500284 > >> > >> URL: http://svn.apache.org/r1500284 > >> Log: > >> Fix for SOLR-4982, creating cores with sysprops does not dereference > >> them properly > >> > >> Added: > >> > >> > lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/CoreA > >> dminCreateDiscoverTest.java (with props) > >> Modified: > >> lucene/dev/trunk/solr/CHANGES.txt > >> > >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDescript > >> or.j > >> ava > >> > >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.jav > >> a > >> > >> > lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/Cor > >> eA > >> dminHandler.java > >> > >> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Cor > >> eA > >> dminHandlerTest.java > >> lucene/dev/trunk/solr/test- > >> framework/src/java/org/apache/solr/SolrTestCaseJ4.java > >> > >> Modified: lucene/dev/trunk/solr/CHANGES.txt > >> URL: > >> > http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=15 > >> 0 > >> 0284&r1=1500283&r2=1500284&view=diff > >> > ========================================================== > >> ==================== > >> --- lucene/dev/trunk/solr/CHANGES.txt (original) > >> +++ lucene/dev/trunk/solr/CHANGES.txt Sat Jul 6 14:45:47 2013 > >> @@ -253,6 +253,12 @@ Bug Fixes > >> > >> * SOLR-5000: ManagedIndexSchema doesn't persist uniqueKey tag after > >> calling addFields > >> method. (Jun Ohtani, Steve Rowe) > >> + > >> +* SOLR-4982: Creating a core while referencing system properties > >> +looks like it loses files > >> + Actually, instanceDir, config, dataDir and schema are not > >> +dereferenced properly > >> + when creating cores that reference sys vars (e.g. &dataDir=${dir}). > >> +In the dataDir > >> + case in particular this leads to the index being put in a > >> +directory literally named > >> + ${dir} but on restart the sysvar will be properly dereferenced. > >> > >> Optimizations > >> ---------------------- > >> > >> Modified: > >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDescript > >> or.j > >> ava > >> URL: > >> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/ > >> apa > >> > che/solr/core/CoreDescriptor.java?rev=1500284&r1=1500283&r2=1500284&v > >> iew=diff > >> > ========================================================== > >> ==================== > >> --- > >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDescript > >> or.j > >> ava (original) > >> +++ > lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDesc > >> +++ rip tor.java Sat Jul 6 14:45:47 2013 > >> @@ -46,7 +46,7 @@ public class CoreDescriptor { > >> public static final String CORE_TRANSIENT = "transient"; > >> public static final String CORE_NODE_NAME = "coreNodeName"; > >> > >> - static final String[] standardPropNames = { > >> + public static final String[] standardPropNames = { > >> CORE_NAME, > >> CORE_CONFIG, > >> CORE_INSTDIR, > >> @@ -65,7 +65,7 @@ public class CoreDescriptor { > >> // them individually. > >> private Properties coreProperties = new Properties(); > >> > >> - //TODO: 5.0 remove this, this is solely a hack for persistence. > >> + //TODO: 5.0 remove this, this is solely a hack for persistence. > >> + And perhaps > >> creating cores in discovery mode? > >> private Properties createdProperties = new Properties(); > >> > >> private boolean loadedImplicit = false; > >> > >> Modified: > >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.jav > >> a > >> URL: > >> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/ > >> apa > >> > che/solr/core/SolrCore.java?rev=1500284&r1=1500283&r2=1500284&view=di > >> ff > >> > ========================================================== > >> ==================== > >> --- > >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.jav > >> a > >> (original) > >> +++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore > >> +++ .ja > >> +++ va Sat Jul 6 14:45:47 2013 > >> @@ -26,6 +26,7 @@ import java.io.Writer; import > >> java.lang.reflect.Constructor; import java.net.URL; import > >> java.util.ArrayList; > >> +import java.util.Arrays; > >> import java.util.Collection; > >> import java.util.Collections; > >> import java.util.Date; > >> @@ -873,6 +874,18 @@ public final class SolrCore implements S > >> propFile.getParentFile().mkdirs(); > >> Properties props = new Properties(); > >> props.put("name", cd.getName()); > >> + > >> + // This must be being created since there's no file here > >> + already. So write > >> out all of the params we were > >> + // created with. This _may_ overwrite the name above, but that's OK. > >> + Collection<String> stds = new > >> HashSet(Arrays.asList(CoreDescriptor.standardPropNames)); > >> + for (String prop : cd.getCreatedProperties().stringPropertyNames()) > >> { > >> + // Only preserve things that are legal, and let's just keep > >> + instDir right out > >> of the persisted file even > >> + // though it's part of the create properties on the URL. > >> + if (! CoreDescriptor.CORE_INSTDIR.equals(prop) && > >> stds.contains(prop)) { > >> + props.put(prop, cd.getCreatedProperties().getProperty(prop)); > >> + } > >> + } > >> + > >> if (cc.isZooKeeperAware()) { > >> String collection = cd.getCloudDescriptor().getCollectionName(); > >> if (collection != null) { > >> > >> Modified: > >> > lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/Cor > >> eA > >> dminHandler.java > >> URL: > >> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/ > >> apa > >> > che/solr/handler/admin/CoreAdminHandler.java?rev=1500284&r1=1500283 > >> &r2=1500284&view=diff > >> > ========================================================== > >> ==================== > >> --- > >> > lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/Cor > >> eA > >> dminHandler.java (original) > >> +++ > >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/Co > >> +++ reAdminHandler.java Sat Jul 6 14:45:47 2013 > >> @@ -57,6 +57,7 @@ import org.apache.solr.update.UpdateLog; import > >> org.apache.solr.update.processor.UpdateRequestProcessor; > >> import > org.apache.solr.update.processor.UpdateRequestProcessorChain; > >> import org.apache.solr.util.NumberUtils; > >> +import org.apache.solr.util.PropertiesUtil; > >> import org.apache.solr.util.RefCounted; import > >> org.apache.zookeeper.KeeperException; > >> import org.slf4j.Logger; > >> @@ -414,6 +415,7 @@ public class CoreAdminHandler extends Re > >> throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, > >> "Core name is mandatory to CREATE a > >> SolrCore"); > >> } > >> + > >> CoreDescriptor dcore = null; > >> try { > >> > >> @@ -427,22 +429,30 @@ public class CoreAdminHandler extends Re > >> if (instanceDir == null) { > >> // instanceDir = coreContainer.getSolrHome() + "/" + name; > >> instanceDir = name; // bare name is already relative to solr > >> home > >> + } else { > >> + instanceDir = PropertiesUtil.substituteProperty(instanceDir, > >> + null); > >> } > >> > >> dcore = new CoreDescriptor(coreContainer, name, instanceDir); > >> > >> // fillup optional parameters > >> String opts = params.get(CoreAdminParams.CONFIG); > >> - if (opts != null) > >> + if (opts != null) { > >> + opts = PropertiesUtil.substituteProperty(opts, null); > >> dcore.setConfigName(opts); > >> + } > >> > >> opts = params.get(CoreAdminParams.SCHEMA); > >> - if (opts != null) > >> + if (opts != null) { > >> + opts = PropertiesUtil.substituteProperty(opts, null); > >> dcore.setSchemaName(opts); > >> + } > >> > >> opts = params.get(CoreAdminParams.DATA_DIR); > >> - if (opts != null) > >> + if (opts != null) { > >> + opts = PropertiesUtil.substituteProperty(opts, null); > >> dcore.setDataDir(opts); > >> + } > >> > >> opts = params.get(CoreAdminParams.ULOG_DIR); > >> if (opts != null) > >> > >> Added: > >> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Cor > >> eA > >> dminCreateDiscoverTest.java > >> URL: > >> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/ > >> apa > >> > che/solr/handler/admin/CoreAdminCreateDiscoverTest.java?rev=1500284& > >> view=auto > >> > ========================================================== > >> ==================== > >> --- > >> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Cor > >> eA > >> dminCreateDiscoverTest.java (added) > >> +++ > >> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Co > >> +++ reAdminCreateDiscoverTest.java Sat Jul 6 14:45:47 2013 > >> @@ -0,0 +1,228 @@ > >> +/* > >> + * 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. > >> + */ > >> + > >> +package org.apache.solr.handler.admin; > >> + > >> +import org.apache.commons.io.FileUtils; import > >> +org.apache.solr.SolrTestCaseJ4; import > >> +org.apache.solr.common.params.CoreAdminParams; > >> +import org.apache.solr.core.CoreDescriptor; > >> +import org.apache.solr.core.SolrCoreDiscoverer; > >> +import org.apache.solr.response.SolrQueryResponse; > >> +import org.junit.AfterClass; > >> +import org.junit.BeforeClass; > >> +import org.junit.Test; > >> + > >> +import java.io.File; > >> +import java.io.FileInputStream; > >> +import java.io.IOException; > >> +import java.util.Arrays; > >> +import java.util.Collection; > >> +import java.util.HashSet; > >> +import java.util.Properties; > >> + > >> +public class CoreAdminCreateDiscoverTest extends SolrTestCaseJ4 { > >> + > >> + private static File solrHomeDirectory = null; > >> + > >> + private static CoreAdminHandler admin = null; // private static > >> +CoreContainer cc = null; > >> + > >> + private static String coreNormal = "normal"; private static > >> + String coreSysProps = "sys_props"; > >> + > >> + @BeforeClass > >> + public static void before() throws Exception { > >> + useFactory(null); // I require FS-based indexes for this test. > >> + > >> + solrHomeDirectory = new File(TEMP_DIR, "solrHome/" + > >> CoreAdminCreateDiscoverTest.getClassName()); > >> + if (solrHomeDirectory.exists()) { > >> + FileUtils.deleteDirectory(solrHomeDirectory); > >> + } > >> + assertTrue("Failed to mkdirs workDir", > >> + solrHomeDirectory.mkdirs()); > >> + > >> + setupNoCoreTest(solrHomeDirectory, null); > >> + > >> + admin = new CoreAdminHandler(h.getCoreContainer()); > >> + } > >> + > >> + @AfterClass > >> + public static void after() throws Exception { > >> + h.close(); > >> + if (solrHomeDirectory.exists()) { > >> + FileUtils.deleteDirectory(solrHomeDirectory); > >> + } > >> + } > >> + > >> + private static void setupCore(String coreName, boolean blivet) > >> + throws > >> IOException { > >> + File instDir = new File(solrHomeDirectory, coreName); > >> + File subHome = new File(instDir, "conf"); > >> + assertTrue("Failed to make subdirectory ", subHome.mkdirs()); > >> + > >> + // Be sure we pick up sysvars when we create this > >> + String srcDir = SolrTestCaseJ4.TEST_HOME() + "/collection1/conf"; > >> + FileUtils.copyFile(new File(srcDir, "schema-tiny.xml"), new > >> + File(subHome, > >> "schema_ren.xml")); > >> + FileUtils.copyFile(new File(srcDir, "solrconfig-minimal.xml"), > >> + new File(subHome, "solrconfig_ren.xml")); > >> + > >> + FileUtils.copyFile(new File(srcDir, > >> "solrconfig.snippet.randomindexconfig.xml"), > >> + new File(subHome, > >> + "solrconfig.snippet.randomindexconfig.xml")); > >> + } > >> + > >> + @Test > >> + public void testCreateSavesSysProps() throws Exception { > >> + > >> + setupCore(coreSysProps, true); > >> + > >> + // create a new core (using CoreAdminHandler) w/ properties > >> + // Just to be sure its NOT written to the core.properties file > >> + File workDir = new File(solrHomeDirectory, coreSysProps); > >> + System.setProperty("INSTDIR_TEST", workDir.getAbsolutePath()); > >> + System.setProperty("CONFIG_TEST", "solrconfig_ren.xml"); > >> + System.setProperty("SCHEMA_TEST", "schema_ren.xml"); > >> + > >> + File dataDir = new File(workDir.getAbsolutePath(), "data_diff"); > >> + System.setProperty("DATA_TEST", "data_diff"); > >> + > >> + SolrQueryResponse resp = new SolrQueryResponse(); > >> + admin.handleRequestBody > >> + (req(CoreAdminParams.ACTION, > >> + CoreAdminParams.CoreAdminAction.CREATE.toString(), > >> + CoreAdminParams.NAME, coreSysProps, > >> + CoreAdminParams.INSTANCE_DIR, "${INSTDIR_TEST}", > >> + CoreAdminParams.CONFIG, "${CONFIG_TEST}", > >> + CoreAdminParams.SCHEMA, "${SCHEMA_TEST}", > >> + CoreAdminParams.DATA_DIR, "${DATA_TEST}"), > >> + resp); > >> + assertNull("Exception on create", resp.getException()); > >> + > >> + // verify props are in persisted file > >> + > >> + Properties props = new Properties(); > >> + File propFile = new File(solrHomeDirectory, coreSysProps + "/" + > >> SolrCoreDiscoverer.CORE_PROP_FILE); > >> + FileInputStream is = new FileInputStream(propFile); > >> + try { > >> + props.load(is); > >> + } finally { > >> + org.apache.commons.io.IOUtils.closeQuietly(is); > >> + } > >> + > >> + assertEquals("Unexpected value preserved in properties file " + > >> propFile.getAbsolutePath(), > >> + props.getProperty(CoreAdminParams.NAME), coreSysProps); > >> + > >> + assertEquals("Unexpected value preserved in properties file " + > >> propFile.getAbsolutePath(), > >> + props.getProperty(CoreAdminParams.CONFIG), > >> + "${CONFIG_TEST}"); > >> + > >> + assertEquals("Unexpected value preserved in properties file " + > >> propFile.getAbsolutePath(), > >> + props.getProperty(CoreAdminParams.SCHEMA), > >> + "${SCHEMA_TEST}"); > >> + > >> + assertEquals("Unexpected value preserved in properties file " + > >> propFile.getAbsolutePath(), > >> + props.getProperty(CoreAdminParams.DATA_DIR), > >> + "${DATA_TEST}"); > >> + > >> + checkOnlyKnown(propFile); > >> + > >> + // Now assert that certain values are properly dereferenced in > >> + the > >> process of creating the core, see > >> + // SOLR-4982. Really, we should be able to just verify that the > >> + index files > >> exist. > >> + > >> + // Should NOT be a datadir named ${DATA_TEST} (literal). > >> + File badDir = new File(workDir, "${DATA_TEST}"); > >> + assertFalse("Should have substituted the sys var, found file " + > >> + badDir.getAbsolutePath(), badDir.exists()); > >> + > >> + // For the other 3 vars, we couldn't get past creating the core > >> + if > >> dereferencing didn't work correctly. > >> + > >> + // Should have segments in the directory pointed to by the > >> ${DATA_TEST}. > >> + File test = new File(dataDir, "index"); > >> + assertTrue("Should have found index dir at " + > >> + test.getAbsolutePath(), > >> test.exists()); > >> + File gen = new File(test, "segments.gen"); > >> + assertTrue("Should be segments.gen in the dir at " + > >> + gen.getAbsolutePath(), gen.exists()); > >> + > >> + } > >> + > >> + @Test > >> + public void testCreateSavesRegProps() throws Exception { > >> + > >> + setupCore(coreNormal, true); > >> + > >> + // create a new core (using CoreAdminHandler) w/ properties > >> + // Just to be sure its NOT written to the core.properties file > >> + File workDir = new File(solrHomeDirectory, coreNormal); > >> + File data = new File(workDir, "data"); > >> + > >> + SolrQueryResponse resp = new SolrQueryResponse(); > >> + admin.handleRequestBody > >> + (req(CoreAdminParams.ACTION, > >> + CoreAdminParams.CoreAdminAction.CREATE.toString(), > >> + CoreAdminParams.NAME, coreNormal, > >> + CoreAdminParams.INSTANCE_DIR, workDir.getAbsolutePath(), > >> + CoreAdminParams.CONFIG, "solrconfig_ren.xml", > >> + CoreAdminParams.SCHEMA, "schema_ren.xml", > >> + CoreAdminParams.DATA_DIR, data.getAbsolutePath()), > >> + resp); > >> + assertNull("Exception on create", resp.getException()); > >> + > >> + // verify props are in persisted file > >> + Properties props = new Properties(); > >> + File propFile = new File(solrHomeDirectory, coreNormal + "/" + > >> SolrCoreDiscoverer.CORE_PROP_FILE); > >> + FileInputStream is = new FileInputStream(propFile); > >> + try { > >> + props.load(is); > >> + } finally { > >> + org.apache.commons.io.IOUtils.closeQuietly(is); > >> + } > >> + > >> + assertEquals("Unexpected value preserved in properties file " + > >> propFile.getAbsolutePath(), > >> + props.getProperty(CoreAdminParams.NAME), coreNormal); > >> + > >> + assertEquals("Unexpected value preserved in properties file " + > >> propFile.getAbsolutePath(), > >> + props.getProperty(CoreAdminParams.CONFIG), > >> + "solrconfig_ren.xml"); > >> + > >> + assertEquals("Unexpected value preserved in properties file " + > >> propFile.getAbsolutePath(), > >> + props.getProperty(CoreAdminParams.SCHEMA), > >> + "schema_ren.xml"); > >> + > >> + assertEquals("Unexpected value preserved in properties file " + > >> propFile.getAbsolutePath(), > >> + props.getProperty(CoreAdminParams.DATA_DIR), > >> + data.getAbsolutePath()); > >> + > >> + checkOnlyKnown(propFile); > >> + // For the other 3 vars, we couldn't get past creating the core > >> + if > >> dereferencing didn't work correctly. > >> + > >> + // Should have segments in the directory pointed to by the > >> ${DATA_TEST}. > >> + File test = new File(data, "index"); > >> + assertTrue("Should have found index dir at " + > >> + test.getAbsolutePath(), > >> test.exists()); > >> + File gen = new File(test, "segments.gen"); > >> + assertTrue("Should be segments.gen in the dir at " + > >> + gen.getAbsolutePath(), gen.exists()); > >> + > >> + } > >> + > >> + // Insure that all the props we've preserved are ones that > >> + _should_ be in the properties file private void > >> + checkOnlyKnown(File propFile) throws IOException { > >> + > >> + Properties props = new Properties(); > >> + FileInputStream is = new FileInputStream(propFile); > >> + try { > >> + props.load(is); > >> + } finally { > >> + org.apache.commons.io.IOUtils.closeQuietly(is); > >> + } > >> + > >> + // Should never be preserving instanceDir in a core.properties file. > >> + assertFalse("Should not be preserving instanceDir!", > >> + props.containsKey(CoreAdminParams.INSTANCE_DIR)); > >> + > >> + Collection<String> stds = new > >> HashSet(Arrays.asList(CoreDescriptor.standardPropNames)); > >> + for (String key : props.stringPropertyNames()) { > >> + assertTrue("Property '" + key + "' should NOT be preserved in > >> + the > >> properties file", stds.contains(key)); > >> + } > >> + } > >> +} > >> > >> Modified: > >> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Cor > >> eA > >> dminHandlerTest.java > >> URL: > >> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/ > >> apa > >> > che/solr/handler/admin/CoreAdminHandlerTest.java?rev=1500284&r1=1500 > >> 283&r2=1500284&view=diff > >> > ========================================================== > >> ==================== > >> --- > >> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Cor > >> eA > >> dminHandlerTest.java (original) > >> +++ > >> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Co > >> +++ reAdminHandlerTest.java Sat Jul 6 14:45:47 2013 > >> @@ -17,9 +17,9 @@ > >> > >> package org.apache.solr.handler.admin; > >> > >> +import > >> > +com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule > >> +; > >> import org.apache.solr.core.CoreContainer; > >> import org.apache.solr.core.SolrCore; -import > >> org.apache.solr.handler.admin.CoreAdminHandler; > >> import org.apache.solr.common.SolrException; > >> import org.apache.solr.common.params.CoreAdminParams; > >> import org.apache.solr.common.util.NamedList; > >> @@ -28,15 +28,14 @@ import org.apache.solr.SolrTestCaseJ4; > >> > >> import java.util.Map; > >> import java.io.File; > >> -import java.io.IOException; > >> - > >> -import javax.xml.xpath.XPathExpressionException; > >> > >> import org.apache.commons.io.FileUtils; > >> > >> import org.junit.BeforeClass; > >> +import org.junit.Rule; > >> import org.junit.Test; > >> -import org.xml.sax.SAXException; > >> +import org.junit.rules.RuleChain; > >> +import org.junit.rules.TestRule; > >> > >> public class CoreAdminHandlerTest extends SolrTestCaseJ4 { > >> > >> @@ -44,7 +43,93 @@ public class CoreAdminHandlerTest extend > >> public static void beforeClass() throws Exception { > >> initCore("solrconfig.xml", "schema.xml"); > >> } > >> - > >> + > >> + @Rule > >> + public TestRule solrTestRules = RuleChain.outerRule(new > >> + SystemPropertiesRestoreRule()); > >> + > >> + public String getCoreName() { return this.getClass().getName() + > >> + "_sys_vars"; } > >> + > >> + @Test > >> + public void testCreateWithSysVars() throws Exception { > >> + useFactory(null); // I require FS-based indexes for this test. > >> + > >> + final File workDir = new File(TEMP_DIR, getCoreName()); > >> + > >> + if (workDir.exists()) { > >> + FileUtils.deleteDirectory(workDir); > >> + } > >> + assertTrue("Failed to mkdirs workDir", workDir.mkdirs()); > >> + String coreName = "with_sys_vars"; > >> + File instDir = new File(workDir, coreName); > >> + File subHome = new File(instDir, "conf"); > >> + assertTrue("Failed to make subdirectory ", subHome.mkdirs()); > >> + > >> + // Be sure we pick up sysvars when we create this > >> + String srcDir = SolrTestCaseJ4.TEST_HOME() + "/collection1/conf"; > >> + FileUtils.copyFile(new File(srcDir, "schema-tiny.xml"), new > >> + File(subHome, > >> "schema_ren.xml")); > >> + FileUtils.copyFile(new File(srcDir, "solrconfig-minimal.xml"), > >> + new > >> File(subHome, "solrconfig_ren.xml")); > >> + FileUtils.copyFile(new File(srcDir, > >> "solrconfig.snippet.randomindexconfig.xml"), > >> + new File(subHome, > >> + "solrconfig.snippet.randomindexconfig.xml")); > >> + > >> + final CoreContainer cores = h.getCoreContainer(); > >> + cores.setPersistent(false); // we'll do this explicitly as > >> + needed > >> + > >> + final CoreAdminHandler admin = new CoreAdminHandler(cores); > >> + > >> + // create a new core (using CoreAdminHandler) w/ properties > >> + System.setProperty("INSTDIR_TEST", instDir.getAbsolutePath()); > >> + System.setProperty("CONFIG_TEST", "solrconfig_ren.xml"); > >> + System.setProperty("SCHEMA_TEST", "schema_ren.xml"); > >> + > >> + File dataDir = new File(workDir.getAbsolutePath(), "data_diff"); > >> + System.setProperty("DATA_TEST", dataDir.getAbsolutePath()); > >> + > >> + SolrQueryResponse resp = new SolrQueryResponse(); > >> + admin.handleRequestBody > >> + (req(CoreAdminParams.ACTION, > >> + CoreAdminParams.CoreAdminAction.CREATE.toString(), > >> + CoreAdminParams.NAME, getCoreName(), > >> + CoreAdminParams.INSTANCE_DIR, "${INSTDIR_TEST}", > >> + CoreAdminParams.CONFIG, "${CONFIG_TEST}", > >> + CoreAdminParams.SCHEMA, "${SCHEMA_TEST}", > >> + CoreAdminParams.DATA_DIR, "${DATA_TEST}"), > >> + resp); > >> + assertNull("Exception on create", resp.getException()); > >> + > >> + // verify props are in persisted file > >> + > >> + final File xml = new File(workDir, "persist-solr.xml"); > >> + cores.persistFile(xml); > >> + > >> + // First assert that these values are persisted. > >> + assertXmlFile > >> + (xml > >> + ,"/solr/cores/core[@name='" + getCoreName() + "' and > >> @instanceDir='${INSTDIR_TEST}']" > >> + ,"/solr/cores/core[@name='" + getCoreName() + "' and > >> @dataDir='${DATA_TEST}']" > >> + ,"/solr/cores/core[@name='" + getCoreName() + "' and > >> @schema='${SCHEMA_TEST}']" > >> + ,"/solr/cores/core[@name='" + getCoreName() + "' and > >> @config='${CONFIG_TEST}']" > >> + ); > >> + > >> + // Now assert that certain values are properly dereferenced in > >> + the > >> process of creating the core, see > >> + // SOLR-4982. > >> + > >> + // Should NOT be a datadir named ${DATA_TEST} (literal). This is > >> + the bug > >> after all > >> + File badDir = new File(instDir, "${DATA_TEST}"); > >> + assertFalse("Should have substituted the sys var, found file " + > >> + badDir.getAbsolutePath(), badDir.exists()); > >> + > >> + // For the other 3 vars, we couldn't get past creating the core > >> + fi > >> dereferencing didn't work correctly. > >> + > >> + // Should have segments in the directory pointed to by the > >> ${DATA_TEST}. > >> + File test = new File(dataDir, "index"); > >> + assertTrue("Should have found index dir at " + > >> + test.getAbsolutePath(), > >> test.exists()); > >> + test = new File(test,"segments.gen"); > >> + assertTrue("Should have found segments.gen at " + > >> + test.getAbsolutePath(), test.exists()); > >> + > >> + // Cleanup > >> + FileUtils.deleteDirectory(workDir); > >> + > >> + } > >> + > >> @Test > >> public void testCoreAdminHandler() throws Exception { > >> final File workDir = new File(TEMP_DIR, > >> this.getClass().getName()); @@ - > >> 141,6 +226,8 @@ public class CoreAdminHandlerTest extend > >> > >> // :TODO: because of SOLR-3665 we can't ask for status from all > >> cores > >> > >> - } > >> + // cleanup > >> + FileUtils.deleteDirectory(workDir); > >> > >> + } > >> } > >> > >> 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=1500284&r1 > >> = > >> 1500283&r2=1500284&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/Sol > >> +++ rTe stCaseJ4.java Sat Jul 6 14:45:47 2013 > >> @@ -21,6 +21,7 @@ import com.carrotsearch.randomizedtestin import > >> com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters; > >> import > >> com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule; > >> import org.apache.commons.io.FileUtils; > >> +import org.apache.lucene.util.IOUtils; > >> import org.apache.lucene.util.LuceneTestCase; > >> import org.apache.lucene.util.QuickPatchThreadsFilter; > >> import org.apache.solr.client.solrj.util.ClientUtils; > >> @@ -32,9 +33,11 @@ import org.apache.solr.common.params.Com > import > >> org.apache.solr.common.params.ModifiableSolrParams; > >> import org.apache.solr.common.params.SolrParams; > >> import org.apache.solr.common.util.XML; > >> +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.JsonUpdateRequestHandler; > >> import org.apache.solr.request.LocalSolrQueryRequest; > >> import org.apache.solr.request.SolrQueryRequest; > >> @@ -155,6 +158,25 @@ public abstract class SolrTestCaseJ4 ext > >> } > >> } > >> > >> + /** > >> + * Call this from @BeforeClass to set up the test harness and > >> + update > >> handler with no cores. > >> + * > >> + * @param solrHome The solr home directory. > >> + * @param xmlStr - the text of an XML file to use. If null, use > >> + the what's the > >> absolute minimal file. > >> + * @throws Exception Lost of file-type things can go wrong. > >> + */ > >> + public static void setupNoCoreTest(File solrHome, String xmlStr) > >> + throws Exception { > >> + > >> + File tmpFile = new File(solrHome, ConfigSolr.SOLR_XML_FILE); > >> + if (xmlStr == null) { > >> + xmlStr = "<solr></solr>"; > >> + } > >> + FileUtils.write(tmpFile, xmlStr, > >> + IOUtils.CHARSET_UTF_8.toString()); > >> + > >> + SolrResourceLoader loader = new > >> SolrResourceLoader(solrHome.getAbsolutePath()); > >> + h = new TestHarness(loader, ConfigSolr.fromFile(loader, new > >> File(solrHome, "solr.xml"))); > >> + lrf = h.getRequestFactory("standard", 0, 20, > >> + CommonParams.VERSION, "2.2"); } > >> > >> @Override > >> public void setUp() throws Exception { > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] For > > additional commands, e-mail: [email protected] > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] For additional > commands, e-mail: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
