Thanks for the confirmation! The code I modeled after created a new
CoreAdminHandler in non-static methods so the variable went out of
scope and was cleaned up automatically.

Since I put the admin handler creation in a BeforeClass where it was
static and tripped this check, just setting my static var to null was
the fix.... So it's kind of a test artifact.

One interesting bit is that "ant -Dtestcase=.... test" didn't trip
this, it's only when I run the full test suite that I see it...

Sorry for the noise
Erick

On Sun, Jul 7, 2013 at 4:28 AM, Uwe Schindler <[email protected]> wrote:
> 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]
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to