Yeah, just saw this and starting to look. I might have a clue, we'll see. Erick
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/CoreDescriptor.j >> ava >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java >> >> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/CoreA >> dminHandler.java >> >> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/CoreA >> 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=150 >> 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/CoreDescriptor.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/CoreDescriptor.j >> ava (original) >> +++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDescrip >> +++ 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.java >> 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.java >> (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/CoreA >> 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/CoreA >> 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/CoreA >> 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/CoreA >> 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/CoreA >> 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/CoreA >> 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/SolrTe >> +++ 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]
