You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2015/12/21 12:40:14 UTC

svn commit: r1721134 [23/48] - in /lucene/dev/branches/lucene6835: ./ dev-tools/ dev-tools/eclipse/dot.settings/ dev-tools/idea/.idea/libraries/ dev-tools/maven/ dev-tools/maven/lucene/analysis/morfologik/ dev-tools/scripts/ lucene/ lucene/analysis/ lu...

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java Mon Dec 21 11:39:57 2015
@@ -17,25 +17,28 @@
 
 package org.apache.solr.core;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.apache.commons.lang.StringUtils;
-import org.apache.solr.cloud.CloudDescriptor;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.util.IOUtils;
-import org.apache.solr.util.PropertiesUtil;
-
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
-import java.nio.file.Paths;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Properties;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.apache.commons.lang.StringUtils;
+import org.apache.solr.cloud.CloudDescriptor;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.util.PropertiesUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A Solr core descriptor
@@ -43,12 +46,10 @@ import static com.google.common.base.Pre
  * @since solr 1.3
  */
 public class CoreDescriptor {
-
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   // Properties file name constants
   public static final String CORE_NAME = "name";
   public static final String CORE_CONFIG = "config";
-  public static final String CORE_INSTDIR = "instanceDir";
-  public static final String CORE_ABS_INSTDIR = "absoluteInstDir";
   public static final String CORE_DATADIR = "dataDir";
   public static final String CORE_ULOGDIR = "ulogDir";
   public static final String CORE_SCHEMA = "schema";
@@ -91,13 +92,12 @@ public class CoreDescriptor {
       .build();
 
   private static ImmutableList<String> requiredProperties = ImmutableList.of(
-      CORE_NAME, CORE_INSTDIR, CORE_ABS_INSTDIR
+      CORE_NAME
   );
 
   public static ImmutableList<String> standardPropNames = ImmutableList.of(
       CORE_NAME,
       CORE_CONFIG,
-      CORE_INSTDIR,
       CORE_DATADIR,
       CORE_ULOGDIR,
       CORE_SCHEMA,
@@ -118,6 +118,8 @@ public class CoreDescriptor {
 
   private final CloudDescriptor cloudDesc;
 
+  private final Path instanceDir;
+
   /** The original standard core properties, before substitution */
   protected final Properties originalCoreProperties = new Properties();
 
@@ -130,61 +132,72 @@ public class CoreDescriptor {
   /** The properties for this core, substitutable by resource loaders */
   protected final Properties substitutableProperties = new Properties();
 
-  /**
-   * Create a new CoreDescriptor.
-   * @param container       the CoreDescriptor's container
-   * @param name            the CoreDescriptor's name
-   * @param instanceDir     a String containing the instanceDir
-   * @param coreProps       a Properties object of the properties for this core
-   */
-  public CoreDescriptor(CoreContainer container, String name, String instanceDir,
-                        Properties coreProps) {
-    this(container, name, instanceDir, coreProps, null);
+  public CoreDescriptor(CoreContainer container, String name, Path instanceDir, String... properties) {
+    this(container, name, instanceDir, toMap(properties));
   }
 
-  public CoreDescriptor(CoreContainer container, String name, String instanceDir, String... properties) {
-    this(container, name, instanceDir, toProperties(properties));
-  }
-
-  private static Properties toProperties(String... properties) {
-    Properties props = new Properties();
+  private static Map<String, String> toMap(String... properties) {
+    Map<String, String> props = new HashMap<>();
     assert properties.length % 2 == 0;
     for (int i = 0; i < properties.length; i += 2) {
-      props.setProperty(properties[i], properties[i+1]);
+      props.put(properties[i], properties[i+1]);
     }
     return props;
   }
-  
+
+  /**
+   * Create a new CoreDescriptor with a given name and instancedir
+   * @param container     the CoreDescriptor's container
+   * @param name          the CoreDescriptor's name
+   * @param instanceDir   the CoreDescriptor's instancedir
+   */
+  public CoreDescriptor(CoreContainer container, String name, Path instanceDir) {
+    this(container, name, instanceDir, Collections.emptyMap());
+  }
+
+  /**
+   * Create a new CoreDescriptor using the properties of an existing one
+   * @param coreName the new CoreDescriptor's name
+   * @param other    the CoreDescriptor to copy
+   */
+  public CoreDescriptor(String coreName, CoreDescriptor other) {
+    this.coreContainer = other.coreContainer;
+    this.cloudDesc = other.cloudDesc;
+    this.instanceDir = other.instanceDir;
+    this.originalExtraProperties.putAll(other.originalExtraProperties);
+    this.originalCoreProperties.putAll(other.originalCoreProperties);
+    this.coreProperties.putAll(other.coreProperties);
+    this.substitutableProperties.putAll(other.substitutableProperties);
+    this.coreProperties.setProperty(CORE_NAME, coreName);
+    this.originalCoreProperties.setProperty(CORE_NAME, coreName);
+    this.substitutableProperties.setProperty(SOLR_CORE_PROP_PREFIX + CORE_NAME, coreName);
+  }
+
   /**
    * Create a new CoreDescriptor.
    * @param container       the CoreDescriptor's container
    * @param name            the CoreDescriptor's name
-   * @param instanceDir     a String containing the instanceDir
-   * @param coreProps       a Properties object of the properties for this core
-   * @param params          additional params
+   * @param instanceDir     a Path resolving to the instanceDir
+   * @param coreProps       a Map of the properties for this core
    */
-  public CoreDescriptor(CoreContainer container, String name, String instanceDir,
-                        Properties coreProps, SolrParams params) {
+  public CoreDescriptor(CoreContainer container, String name, Path instanceDir,
+                        Map<String, String> coreProps) {
 
     this.coreContainer = container;
+    this.instanceDir = instanceDir;
 
     originalCoreProperties.setProperty(CORE_NAME, name);
-    originalCoreProperties.setProperty(CORE_INSTDIR, instanceDir);
 
     Properties containerProperties = container.getContainerProperties();
     name = PropertiesUtil.substituteProperty(checkPropertyIsNotEmpty(name, CORE_NAME),
                                              containerProperties);
-    instanceDir = PropertiesUtil.substituteProperty(checkPropertyIsNotEmpty(instanceDir, CORE_INSTDIR),
-                                                    containerProperties);
 
     coreProperties.putAll(defaultProperties);
     coreProperties.put(CORE_NAME, name);
-    coreProperties.put(CORE_INSTDIR, instanceDir);
-    coreProperties.put(CORE_ABS_INSTDIR, convertToAbsolute(instanceDir, container.getCoreRootDirectory()));
 
-    for (String propname : coreProps.stringPropertyNames()) {
+    for (String propname : coreProps.keySet()) {
 
-      String propvalue = coreProps.getProperty(propname);
+      String propvalue = coreProps.get(propname);
 
       if (isUserDefinedProperty(propname))
         originalExtraProperties.put(propname, propvalue);
@@ -202,15 +215,12 @@ public class CoreDescriptor {
     // TODO maybe make this a CloudCoreDescriptor subclass?
     if (container.isZooKeeperAware()) {
       cloudDesc = new CloudDescriptor(name, coreProperties, this);
-      if (params != null) {
-        cloudDesc.setParams(params);
-      }
     }
     else {
       cloudDesc = null;
     }
 
-    SolrCore.log.info("Created CoreDescriptor: " + coreProperties);
+    log.info("Created CoreDescriptor: " + coreProperties);
   }
 
   /**
@@ -226,20 +236,16 @@ public class CoreDescriptor {
    */
   protected void loadExtraProperties() {
     String filename = coreProperties.getProperty(CORE_PROPERTIES, DEFAULT_EXTERNAL_PROPERTIES_FILE);
-    File propertiesFile = resolvePaths(filename);
-    if (propertiesFile.exists()) {
-      FileInputStream in = null;
-      try {
-        in = new FileInputStream(propertiesFile);
+    Path propertiesFile = instanceDir.resolve(filename);
+    if (Files.exists(propertiesFile)) {
+      try (InputStream is = Files.newInputStream(propertiesFile)) {
         Properties externalProps = new Properties();
-        externalProps.load(new InputStreamReader(in, StandardCharsets.UTF_8));
+        externalProps.load(new InputStreamReader(is, StandardCharsets.UTF_8));
         coreProperties.putAll(externalProps);
       } catch (IOException e) {
         String message = String.format(Locale.ROOT, "Could not load properties from %s: %s:",
-            propertiesFile.getAbsoluteFile(), e.toString());
+            propertiesFile.toString(), e.toString());
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, message);
-      } finally {
-        IOUtils.closeQuietly(in);
       }
     }
   }
@@ -258,13 +264,6 @@ public class CoreDescriptor {
     }
   }
 
-  protected File resolvePaths(String filepath) {
-    File file = new File(filepath);
-    if (file.isAbsolute())
-      return file;
-    return new File(getInstanceDir(), filepath);
-  }
-
   /**
    * Is this property a Solr-standard property, or is it an extra property
    * defined per-core by the user?
@@ -283,33 +282,6 @@ public class CoreDescriptor {
     return value;
   }
 
-  /**
-   * Create a new CoreDescriptor with a given name and instancedir
-   * @param container     the CoreDescriptor's container
-   * @param name          the CoreDescriptor's name
-   * @param instanceDir   the CoreDescriptor's instancedir
-   */
-  public CoreDescriptor(CoreContainer container, String name, String instanceDir) {
-    this(container, name, instanceDir, new Properties());
-  }
-
-  /**
-   * Create a new CoreDescriptor using the properties of an existing one
-   * @param coreName the new CoreDescriptor's name
-   * @param other    the CoreDescriptor to copy
-   */
-  public CoreDescriptor(String coreName, CoreDescriptor other) {
-    this.coreContainer = other.coreContainer;
-    this.cloudDesc = other.cloudDesc;
-    this.originalExtraProperties.putAll(other.originalExtraProperties);
-    this.originalCoreProperties.putAll(other.originalCoreProperties);
-    this.coreProperties.putAll(other.coreProperties);
-    this.substitutableProperties.putAll(other.substitutableProperties);
-    this.coreProperties.setProperty(CORE_NAME, coreName);
-    this.originalCoreProperties.setProperty(CORE_NAME, coreName);
-    this.substitutableProperties.setProperty(SOLR_CORE_PROP_PREFIX + CORE_NAME, coreName);
-  }
-
   public String getPropertiesName() {
     return coreProperties.getProperty(CORE_PROPERTIES);
   }
@@ -322,22 +294,11 @@ public class CoreDescriptor {
     return defaultProperties.get(CORE_DATADIR).equals(coreProperties.getProperty(CORE_DATADIR));
   }
 
-  /**@return the core instance directory. */
-  public String getRawInstanceDir() {
-    return coreProperties.getProperty(CORE_INSTDIR);
-  }
-
-  private static String convertToAbsolute(String instDir, String solrHome) {
-    checkNotNull(instDir);
-    return SolrResourceLoader.normalizeDir(Paths.get(solrHome).resolve(instDir).toString());
-  }
-
   /**
-   *
-   * @return the core instance directory, prepended with solr_home if not an absolute path.
+   * @return the core instance directory
    */
-  public String getInstanceDir() {
-    return coreProperties.getProperty(CORE_ABS_INSTDIR);
+  public Path getInstanceDir() {
+    return instanceDir;
   }
 
   /**@return the core configuration resource name. */
@@ -401,12 +362,7 @@ public class CoreDescriptor {
 
   @Override
   public String toString() {
-    return new StringBuilder("CoreDescriptor[name=")
-        .append(this.getName())
-        .append(";instanceDir=")
-        .append(this.getInstanceDir())
-        .append("]")
-        .toString();
+    return "CoreDescriptor[name=" + this.getName() + ";instanceDir=" + this.getInstanceDir() + "]";
   }
 
   public String getConfigSet() {

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java Mon Dec 21 11:39:57 2015
@@ -17,24 +17,28 @@ package org.apache.solr.core;
  * limitations under the License.
  */
 
-import com.google.common.collect.Lists;
-
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
+import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
+import com.google.common.collect.Lists;
+import org.apache.solr.common.SolrException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * Persists CoreDescriptors as properties files
  */
@@ -42,24 +46,24 @@ public class CorePropertiesLocator imple
 
   public static final String PROPERTIES_FILENAME = "core.properties";
 
-  private static final Logger logger = LoggerFactory.getLogger(CoresLocator.class);
+  private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private final File rootDirectory;
+  private final Path rootDirectory;
 
-  public CorePropertiesLocator(String coreDiscoveryRoot) {
-    this.rootDirectory = new File(coreDiscoveryRoot);
-    logger.info("Config-defined core root directory: {}", this.rootDirectory.getAbsolutePath());
+  public CorePropertiesLocator(Path coreDiscoveryRoot) {
+    this.rootDirectory = coreDiscoveryRoot;
+    logger.info("Config-defined core root directory: {}", this.rootDirectory);
   }
 
   @Override
   public void create(CoreContainer cc, CoreDescriptor... coreDescriptors) {
     for (CoreDescriptor cd : coreDescriptors) {
-      File propFile = new File(new File(cd.getInstanceDir()), PROPERTIES_FILENAME);
-      if (propFile.exists())
+      Path propertiesFile = this.rootDirectory.resolve(cd.getInstanceDir()).resolve(PROPERTIES_FILENAME);
+      if (Files.exists(propertiesFile))
         throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                                 "Could not create a new core in " + cd.getInstanceDir()
                               + "as another core is already defined there");
-      writePropertiesFile(cd, propFile);
+      writePropertiesFile(cd, propertiesFile);
     }
   }
 
@@ -70,24 +74,21 @@ public class CorePropertiesLocator imple
   @Override
   public void persist(CoreContainer cc, CoreDescriptor... coreDescriptors) {
     for (CoreDescriptor cd : coreDescriptors) {
-      File propFile = new File(new File(cd.getInstanceDir()), PROPERTIES_FILENAME);
+      Path propFile = this.rootDirectory.resolve(cd.getInstanceDir()).resolve(PROPERTIES_FILENAME);
       writePropertiesFile(cd, propFile);
     }
   }
 
-  private void writePropertiesFile(CoreDescriptor cd, File propfile)  {
+  private void writePropertiesFile(CoreDescriptor cd, Path propfile)  {
     Properties p = buildCoreProperties(cd);
-    Writer os = null;
     try {
-      propfile.getParentFile().mkdirs();
-      os = new OutputStreamWriter(new FileOutputStream(propfile), StandardCharsets.UTF_8);
-      p.store(os, "Written by CorePropertiesLocator");
+      Files.createDirectories(propfile.getParent());
+      try (Writer os = new OutputStreamWriter(Files.newOutputStream(propfile), StandardCharsets.UTF_8)) {
+        p.store(os, "Written by CorePropertiesLocator");
+      }
     }
     catch (IOException e) {
-      logger.error("Couldn't persist core properties to {}: {}", propfile.getAbsolutePath(), e);
-    }
-    finally {
-      IOUtils.closeQuietly(os);
+      logger.error("Couldn't persist core properties to {}: {}", propfile, e.getMessage());
     }
   }
 
@@ -98,12 +99,12 @@ public class CorePropertiesLocator imple
     }
     for (CoreDescriptor cd : coreDescriptors) {
       if (cd == null) continue;
-      File instanceDir = new File(cd.getInstanceDir());
-      File propertiesFile = new File(instanceDir, PROPERTIES_FILENAME);
-      propertiesFile.renameTo(new File(instanceDir, PROPERTIES_FILENAME + ".unloaded"));
-      // This is a best-effort: the core.properties file may already have been
-      // deleted by the core unload, so we don't worry about checking if the
-      // rename has succeeded.
+      Path propfile = this.rootDirectory.resolve(cd.getInstanceDir()).resolve(PROPERTIES_FILENAME);
+      try {
+        Files.deleteIfExists(propfile);
+      } catch (IOException e) {
+        logger.warn("Couldn't delete core properties file {}: {}", propfile, e.getMessage());
+      }
     }
   }
 
@@ -118,65 +119,69 @@ public class CorePropertiesLocator imple
   }
 
   @Override
-  public List<CoreDescriptor> discover(CoreContainer cc) {
-    logger.info("Looking for core definitions underneath {}", rootDirectory.getAbsolutePath());
-    List<CoreDescriptor> cds = Lists.newArrayList();
-    if (rootDirectory.canRead() == false) {
-      throw new RuntimeException("Solr home '" + rootDirectory.getAbsolutePath() + "' doesn't have read permissions");
+  public List<CoreDescriptor> discover(final CoreContainer cc) {
+    logger.info("Looking for core definitions underneath {}", rootDirectory);
+    final List<CoreDescriptor> cds = Lists.newArrayList();
+    try {
+      Files.walkFileTree(this.rootDirectory, new SimpleFileVisitor<Path>() {
+        @Override
+        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+          if (file.getFileName().toString().equals(PROPERTIES_FILENAME)) {
+            CoreDescriptor cd = buildCoreDescriptor(file, cc);
+            logger.info("Found core {} in {}", cd.getName(), cd.getInstanceDir());
+            cds.add(cd);
+            return FileVisitResult.SKIP_SIBLINGS;
+          }
+          return FileVisitResult.CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+          // if we get an error on the root, then fail the whole thing
+          // otherwise, log a warning and continue to try and load other cores
+          if (file.equals(rootDirectory)) {
+            logger.error("Error reading core root directory {}: {}", file, exc);
+            throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error reading core root directory");
+          }
+          logger.warn("Error visiting {}: {}", file, exc);
+          return FileVisitResult.CONTINUE;
+        }
+      });
+    } catch (IOException e) {
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Couldn't walk file tree under " + this.rootDirectory, e);
     }
-    discoverUnder(rootDirectory, cds, cc);
     logger.info("Found {} core definitions", cds.size());
     return cds;
   }
 
-  private void discoverUnder(File root, List<CoreDescriptor> cds, CoreContainer cc) {
-    for (File child : root.listFiles()) {
-      if (child.canRead() == false) {
-        logger.warn("Cannot read directory or file during core discovery '" +  child.getAbsolutePath() + "' during core discovery. Skipping");
-        continue;
-      }
-      File propertiesFile = new File(child, PROPERTIES_FILENAME);
-      if (propertiesFile.exists()) {
-        CoreDescriptor cd = buildCoreDescriptor(propertiesFile, cc);
-        logger.info("Found core {} in {}", cd.getName(), cd.getInstanceDir());
-        cds.add(cd);
-        continue;
-      }
-      if (child.isDirectory())
-        discoverUnder(child, cds, cc);
-    }
-  }
+  protected CoreDescriptor buildCoreDescriptor(Path propertiesFile, CoreContainer cc) {
 
-  protected CoreDescriptor buildCoreDescriptor(File propertiesFile, CoreContainer cc) {
-    FileInputStream fis = null;
-    try {
-      File instanceDir = propertiesFile.getParentFile();
-      Properties coreProperties = new Properties();
-      fis = new FileInputStream(propertiesFile);
+    Path instanceDir = propertiesFile.getParent();
+    Properties coreProperties = new Properties();
+    try (InputStream fis = Files.newInputStream(propertiesFile)) {
       coreProperties.load(new InputStreamReader(fis, StandardCharsets.UTF_8));
       String name = createName(coreProperties, instanceDir);
-      return new CoreDescriptor(cc, name, instanceDir.getAbsolutePath(), coreProperties);
+      Map<String, String> propMap = new HashMap<>();
+      for (String key : coreProperties.stringPropertyNames()) {
+        propMap.put(key, coreProperties.getProperty(key));
+      }
+      return new CoreDescriptor(cc, name, instanceDir, propMap);
     }
     catch (IOException e) {
-      logger.error("Couldn't load core descriptor from {}:{}", propertiesFile.getAbsolutePath(), e.toString());
+      logger.error("Couldn't load core descriptor from {}:{}", propertiesFile, e.toString());
       return null;
     }
-    finally {
-      IOUtils.closeQuietly(fis);
-    }
+
   }
 
-  protected static String createName(Properties p, File instanceDir) {
-    return p.getProperty(CoreDescriptor.CORE_NAME, instanceDir.getName());
+  protected static String createName(Properties p, Path instanceDir) {
+    return p.getProperty(CoreDescriptor.CORE_NAME, instanceDir.getFileName().toString());
   }
 
   protected Properties buildCoreProperties(CoreDescriptor cd) {
     Properties p = new Properties();
     p.putAll(cd.getPersistableStandardProperties());
     p.putAll(cd.getPersistableUserProperties());
-    // We don't persist the instance directory, as that's defined by the location
-    // of the properties file.
-    p.remove(CoreDescriptor.CORE_INSTDIR);
     return p;
   }
 

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/Diagnostics.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/Diagnostics.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/Diagnostics.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/Diagnostics.java Mon Dec 21 11:39:57 2015
@@ -20,11 +20,12 @@ package org.apache.solr.core;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.lang.invoke.MethodHandles;
 import java.lang.management.ManagementFactory;
 import java.lang.management.ThreadInfo;
 
 public class Diagnostics {
-  protected static Logger log = LoggerFactory.getLogger(Diagnostics.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public interface Callable {
     public void call(Object... data);  // data depends on the context

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/DirectoryFactory.java Mon Dec 21 11:39:57 2015
@@ -21,6 +21,7 @@ import java.io.Closeable;
 import java.io.File;
 import java.io.FileFilter;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.Collection;
 import java.util.Collections;
 
@@ -52,7 +53,7 @@ public abstract class DirectoryFactory i
   // hint about what the directory contains - default is index directory
   public enum DirContext {DEFAULT, META_DATA}
 
-  private static final Logger log = LoggerFactory.getLogger(DirectoryFactory.class.getName());
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   /**
    * Indicates a Directory will no longer be used, and when its ref count
@@ -265,8 +266,7 @@ public abstract class DirectoryFactory i
 
   public String getDataHome(CoreDescriptor cd) throws IOException {
     // by default, we go off the instance directory
-    String instanceDir = new File(cd.getInstanceDir()).getAbsolutePath();
-    return normalize(SolrResourceLoader.normalizeDir(instanceDir) + cd.getDataDir());
+    return cd.getInstanceDir().resolve(cd.getDataDir()).toAbsolutePath().toString();
   }
 
   /**

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java Mon Dec 21 11:39:57 2015
@@ -20,6 +20,7 @@ package org.apache.solr.core;
 import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.net.URLEncoder;
 import java.util.Arrays;
 import java.util.Collection;
@@ -66,8 +67,7 @@ import com.google.common.cache.RemovalLi
 import com.google.common.cache.RemovalNotification;
 
 public class HdfsDirectoryFactory extends CachingDirectoryFactory implements SolrCoreAware {
-  public static Logger LOG = LoggerFactory
-      .getLogger(HdfsDirectoryFactory.class);
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   public static final String BLOCKCACHE_SLAB_COUNT = "solr.hdfs.blockcache.slab.count";
   public static final String BLOCKCACHE_DIRECT_MEMORY_ALLOCATION = "solr.hdfs.blockcache.direct.memory.allocation";

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/ImplicitPlugins.java Mon Dec 21 11:39:57 2015
@@ -20,6 +20,7 @@ package org.apache.solr.core;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -27,8 +28,10 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.handler.PingRequestHandler;
 import org.apache.solr.handler.RealTimeGetHandler;
 import org.apache.solr.handler.ReplicationHandler;
+import org.apache.solr.handler.SQLHandler;
 import org.apache.solr.handler.SchemaHandler;
 import org.apache.solr.handler.SolrConfigHandler;
+import org.apache.solr.handler.StreamHandler;
 import org.apache.solr.handler.UpdateRequestHandler;
 import org.apache.solr.handler.admin.LoggingHandler;
 import org.apache.solr.handler.admin.LukeRequestHandler;
@@ -39,13 +42,15 @@ import org.apache.solr.handler.admin.Sho
 import org.apache.solr.handler.admin.SolrInfoMBeanHandler;
 import org.apache.solr.handler.admin.SystemInfoHandler;
 import org.apache.solr.handler.admin.ThreadDumpHandler;
+import org.apache.solr.handler.component.SearchHandler;
 import org.apache.solr.request.SolrRequestHandler;
 
 import static java.util.Collections.singletonMap;
-import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.common.params.CommonParams.JSON;
 import static org.apache.solr.common.params.CommonParams.NAME;
 import static org.apache.solr.common.params.CommonParams.WT;
+import static org.apache.solr.common.util.Utils.makeMap;
+import static org.apache.solr.core.PluginInfo.APPENDS;
 import static org.apache.solr.core.PluginInfo.DEFAULTS;
 import static org.apache.solr.core.PluginInfo.INVARIANTS;
 
@@ -55,51 +60,95 @@ public class ImplicitPlugins {
     List<PluginInfo> implicits = new ArrayList<>();
 
     //update handle implicits
-    implicits.add(getReqHandlerInfo("/update", UpdateRequestHandler.class, null));
-    implicits.add(getReqHandlerInfo(UpdateRequestHandler.JSON_PATH, UpdateRequestHandler.class, singletonMap("update.contentType", "application/json")));
-    implicits.add(getReqHandlerInfo(UpdateRequestHandler.CSV_PATH, UpdateRequestHandler.class, singletonMap("update.contentType", "application/csv")));
-    implicits.add(getReqHandlerInfo(UpdateRequestHandler.DOC_PATH, UpdateRequestHandler.class, makeMap("update.contentType", "application/json", "json.command", "false")));
+    implicits.add(createPluginInfoWithDefaults("/update", UpdateRequestHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults(UpdateRequestHandler.JSON_PATH, UpdateRequestHandler.class, singletonMap("update.contentType", "application/json")));
+    implicits.add(createPluginInfoWithDefaults(UpdateRequestHandler.CSV_PATH, UpdateRequestHandler.class, singletonMap("update.contentType", "application/csv")));
+    implicits.add(createPluginInfoWithDefaults(UpdateRequestHandler.DOC_PATH, UpdateRequestHandler.class, makeMap("update.contentType", "application/json", "json.command", "false")));
 
     //solrconfighandler
-    PluginInfo config = getReqHandlerInfo("/config", SolrConfigHandler.class, null);
+    PluginInfo config = createPluginInfoWithDefaults("/config", SolrConfigHandler.class, null);
     if (solrCore.getConfigSetProperties() != null) {
       config.initArgs.addAll(solrCore.getConfigSetProperties());
     }
     implicits.add(config);
     //schemahandler
-    PluginInfo schema = getReqHandlerInfo("/schema", SchemaHandler.class, null);
+    PluginInfo schema = createPluginInfoWithDefaults("/schema", SchemaHandler.class, null);
     if (solrCore.getConfigSetProperties() != null) {
       schema.initArgs.addAll(solrCore.getConfigSetProperties());
     }
     implicits.add(schema);
     //register replicationhandler always for SolrCloud
-    implicits.add(getReqHandlerInfo("/replication", ReplicationHandler.class,null));
+    implicits.add(createPluginInfoWithDefaults("/replication", ReplicationHandler.class,null));
 
-    implicits.add(getReqHandlerInfo("/get", RealTimeGetHandler.class,
+    implicits.add(createPluginInfoWithDefaults("/get", RealTimeGetHandler.class,
         makeMap(
             "omitHeader", "true",
             WT, JSON,
             "indent", "true")));
+
+    PluginInfo exportInitArgs = createPluginInfo("/export", SearchHandler.class,
+        null, // defaults
+        null, // appends
+        // we need invariants here
+        makeMap(
+            "rq", "{!xport}",
+            "wt", "xsort",
+            "distrib", "false"
+        ));
+    exportInitArgs.initArgs.add("components", Collections.singletonList("query"));
+    implicits.add(exportInitArgs);
+
+    implicits.add(createPluginInfo("/stream", StreamHandler.class,
+        null, // defaults
+        null, // appends
+        // we need invariants here
+        makeMap(
+            "wt", "json",
+            "distrib", "false"
+        )));
+
+    implicits.add(createPluginInfo("/sql", SQLHandler.class,
+        null, // defaults
+        null, // appends
+        // we need invariants here
+        makeMap(
+            "wt", "json",
+            "distrib", "false"
+        )));
+
     //register adminHandlers
-    implicits.add(getReqHandlerInfo("/admin/luke", LukeRequestHandler.class, null));
-    implicits.add(getReqHandlerInfo("/admin/system", SystemInfoHandler.class, null));
-    implicits.add(getReqHandlerInfo("/admin/mbeans", SolrInfoMBeanHandler.class, null));
-    implicits.add(getReqHandlerInfo("/admin/plugins", PluginInfoHandler.class, null));
-    implicits.add(getReqHandlerInfo("/admin/threads", ThreadDumpHandler.class, null));
-    implicits.add(getReqHandlerInfo("/admin/properties", PropertiesRequestHandler.class, null));
-    implicits.add(getReqHandlerInfo("/admin/logging", LoggingHandler.class, null));
-    implicits.add(getReqHandlerInfo("/admin/file", ShowFileRequestHandler.class, null));
-    PluginInfo ping = getReqHandlerInfo("/admin/ping", PingRequestHandler.class, null);
-    ping.initArgs.add(INVARIANTS, new NamedList<>(makeMap("echoParams", "all", "q", "{!lucene}*:*")));
-    implicits.add(ping);
-    implicits.add(getReqHandlerInfo("/admin/segments", SegmentsInfoRequestHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults("/admin/luke", LukeRequestHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults("/admin/system", SystemInfoHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults("/admin/mbeans", SolrInfoMBeanHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults("/admin/plugins", PluginInfoHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults("/admin/threads", ThreadDumpHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults("/admin/properties", PropertiesRequestHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults("/admin/logging", LoggingHandler.class, null));
+    implicits.add(createPluginInfoWithDefaults("/admin/file", ShowFileRequestHandler.class, null));
+    implicits.add(createPluginInfo("/admin/ping", PingRequestHandler.class,
+        null, // defaults
+        null, // appends
+        // invariants
+        makeMap("echoParams", "all", "q", "{!lucene}*:*")));
+    implicits.add(createPluginInfoWithDefaults("/admin/segments", SegmentsInfoRequestHandler.class, null));
     return implicits;
   }
 
-  public static PluginInfo getReqHandlerInfo(String name, Class clz, Map defaults){
-    if(defaults == null) defaults= Collections.emptyMap();
+  public static PluginInfo createPluginInfoWithDefaults(String name, Class clz, Map defaults) {
+    return createPluginInfo(name, clz, defaults, null, null);
+  }
+
+  public static PluginInfo createPluginInfo(String name, Class clz, Map defaults, Map appends, Map invariants) {
+    if (defaults == null) defaults = Collections.emptyMap();
     Map m = makeMap(NAME, name, "class", clz.getName());
-    // be explicit with generics, because Java 9 fails to compile otherwise (type inference: Map.Entry[] vs. singletonMap):
-    return new PluginInfo(SolrRequestHandler.TYPE, m, new NamedList<>(Collections.<String,Object>singletonMap(DEFAULTS, new NamedList<>(defaults))),null);
+    Map<String, Object> args = new HashMap<>(1);
+    args.put(DEFAULTS, new NamedList<>(defaults));
+    if (appends != null)  {
+      args.put(APPENDS, new NamedList<>(appends));
+    }
+    if (invariants != null) {
+      args.put(INVARIANTS, new NamedList<>(invariants));
+    }
+    return new PluginInfo(SolrRequestHandler.TYPE, m, new NamedList<>(args), null);
   }
 }

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/IndexDeletionPolicyWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/IndexDeletionPolicyWrapper.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/IndexDeletionPolicyWrapper.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/IndexDeletionPolicyWrapper.java Mon Dec 21 11:39:57 2015
@@ -25,6 +25,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
@@ -45,8 +46,8 @@ import java.util.concurrent.atomic.Atomi
  * @see org.apache.lucene.index.IndexDeletionPolicy
  */
 public final class IndexDeletionPolicyWrapper extends IndexDeletionPolicy {
-  private static final Logger LOG = LoggerFactory.getLogger(IndexDeletionPolicyWrapper.class.getName());
-
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  
   private final IndexDeletionPolicy deletionPolicy;
   private volatile Map<Long, IndexCommit> solrVersionVsCommits = new ConcurrentHashMap<>();
   private final Map<Long, Long> reserves = new ConcurrentHashMap<>();

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/JarRepository.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/JarRepository.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/JarRepository.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/JarRepository.java Mon Dec 21 11:39:57 2015
@@ -22,6 +22,7 @@ import static org.apache.solr.common.clo
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -53,7 +54,7 @@ import org.slf4j.LoggerFactory;
  * The purpose of this class is to store the Jars loaded in memory and to keep only one copy of the Jar in a single node.
  */
 public class JarRepository {
-  public static Logger log = LoggerFactory.getLogger(JarRepository.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   static final Random RANDOM;
 
   static {

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java Mon Dec 21 11:39:57 2015
@@ -37,6 +37,8 @@ import javax.management.openmbean.Simple
 import javax.management.remote.JMXConnectorServer;
 import javax.management.remote.JMXConnectorServerFactory;
 import javax.management.remote.JMXServiceURL;
+
+import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -71,8 +73,7 @@ import static org.apache.solr.common.par
  */
 public class JmxMonitoredMap<K, V> extends
         ConcurrentHashMap<String, SolrInfoMBean> {
-  private static final Logger LOG = LoggerFactory.getLogger(JmxMonitoredMap.class
-          .getName());
+  private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   // set to true to use cached statistics NamedLists between getMBeanInfo calls to work
   // around over calling getStatistics on MBeanInfos when iterating over all attributes (SOLR-6586)

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/MMapDirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/MMapDirectoryFactory.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/MMapDirectoryFactory.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/MMapDirectoryFactory.java Mon Dec 21 11:39:57 2015
@@ -19,6 +19,7 @@ package org.apache.solr.core;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.nio.file.Path;
 
 import org.apache.lucene.store.Directory;
@@ -41,7 +42,7 @@ import org.slf4j.LoggerFactory;
  *
  **/
 public class MMapDirectoryFactory extends StandardDirectoryFactory {
-  private transient static Logger log = LoggerFactory.getLogger(MMapDirectoryFactory.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   boolean unmapHack;
   private int maxChunk;
 

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/MemClassLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/MemClassLoader.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/MemClassLoader.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/MemClassLoader.java Mon Dec 21 11:39:57 2015
@@ -19,6 +19,7 @@ package org.apache.solr.core;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.invoke.MethodHandles;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.nio.ByteBuffer;
@@ -38,7 +39,7 @@ import org.slf4j.LoggerFactory;
 
 
 public class MemClassLoader extends ClassLoader implements AutoCloseable, ResourceLoader {
-  static final Logger log =  LoggerFactory.getLogger(MemClassLoader.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private boolean allJarsLoaded = false;
   private final SolrResourceLoader parentLoader;
   private List<PluginBag.RuntimeLib> libs = new ArrayList<>();

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/NodeConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/NodeConfig.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/NodeConfig.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/NodeConfig.java Mon Dec 21 11:39:57 2015
@@ -17,20 +17,21 @@ package org.apache.solr.core;
  * limitations under the License.
  */
 
+import java.nio.file.Path;
+import java.util.Properties;
+
 import org.apache.solr.common.SolrException;
 import org.apache.solr.logging.LogWatcherConfig;
 import org.apache.solr.update.UpdateShardHandlerConfig;
 
-import java.util.Properties;
-
 
 public class NodeConfig {
 
   private final String nodeName;
 
-  private final String coreRootDirectory;
+  private final Path coreRootDirectory;
 
-  private final String configSetBaseDirectory;
+  private final Path configSetBaseDirectory;
 
   private final String sharedLibDirectory;
 
@@ -58,7 +59,7 @@ public class NodeConfig {
 
   private final String managementPath;
 
-  private NodeConfig(String nodeName, String coreRootDirectory, String configSetBaseDirectory, String sharedLibDirectory,
+  private NodeConfig(String nodeName, Path coreRootDirectory, Path configSetBaseDirectory, String sharedLibDirectory,
                      PluginInfo shardHandlerFactoryConfig, UpdateShardHandlerConfig updateShardHandlerConfig,
                      String coreAdminHandlerClass, String collectionsAdminHandlerClass,
                      String infoHandlerClass, String configSetsHandlerClass,
@@ -94,7 +95,7 @@ public class NodeConfig {
     return nodeName;
   }
 
-  public String getCoreRootDirectory() {
+  public Path getCoreRootDirectory() {
     return coreRootDirectory;
   }
 
@@ -158,7 +159,7 @@ public class NodeConfig {
     return managementPath;
   }
 
-  public String getConfigSetBaseDirectory() {
+  public Path getConfigSetBaseDirectory() {
     return configSetBaseDirectory;
   }
 
@@ -187,8 +188,8 @@ public class NodeConfig {
 
   public static class NodeConfigBuilder {
 
-    private String coreRootDirectory = "";
-    private String configSetBaseDirectory = "configsets";
+    private Path coreRootDirectory;
+    private Path configSetBaseDirectory;
     private String sharedLibDirectory = "lib";
     private PluginInfo shardHandlerFactoryConfig;
     private UpdateShardHandlerConfig updateShardHandlerConfig = UpdateShardHandlerConfig.DEFAULT;
@@ -219,16 +220,17 @@ public class NodeConfig {
     public NodeConfigBuilder(String nodeName, SolrResourceLoader loader) {
       this.nodeName = nodeName;
       this.loader = loader;
-      this.coreRootDirectory = loader.getInstanceDir();
+      this.coreRootDirectory = loader.getInstancePath();
+      this.configSetBaseDirectory = loader.getInstancePath().resolve("configsets");
     }
 
     public NodeConfigBuilder setCoreRootDirectory(String coreRootDirectory) {
-      this.coreRootDirectory = loader.resolve(coreRootDirectory);
+      this.coreRootDirectory = loader.getInstancePath().resolve(coreRootDirectory);
       return this;
     }
 
     public NodeConfigBuilder setConfigSetBaseDirectory(String configSetBaseDirectory) {
-      this.configSetBaseDirectory = configSetBaseDirectory;
+      this.configSetBaseDirectory = loader.getInstancePath().resolve(configSetBaseDirectory);
       return this;
     }
 

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/PluginBag.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/PluginBag.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/PluginBag.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/PluginBag.java Mon Dec 21 11:39:57 2015
@@ -19,6 +19,7 @@ package org.apache.solr.core;
 
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -51,7 +52,7 @@ import static org.apache.solr.common.par
  * This manages the lifecycle of a set of plugin of the same type .
  */
 public class PluginBag<T> implements AutoCloseable {
-  public static Logger log = LoggerFactory.getLogger(PluginBag.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final Map<String, PluginHolder<T>> registry;
   private final Map<String, PluginHolder<T>> immutableRegistry;
@@ -125,6 +126,11 @@ public class PluginBag<T> implements Aut
     }
   }
 
+  /** make a plugin available in an alternate name. This is an internal API and not for public use
+   * @param src key in which the plugin is already registered
+   * @param target the new key in which the plugin should be aliased to. If target exists already, the alias fails
+   * @return flag if the operation is successful or not
+   */
   boolean alias(String src, String target) {
     if (src == null) return false;
     PluginHolder<T> a = registry.get(src);

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java Mon Dec 21 11:39:57 2015
@@ -21,6 +21,8 @@ import org.apache.solr.request.SolrQuery
 import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.response.ResultContext;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.apache.solr.search.DocList;
 import org.apache.solr.search.DocIterator;
 import org.apache.solr.common.params.CommonParams;
@@ -28,12 +30,15 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 
+import java.lang.invoke.MethodHandles;
 import java.util.List;
 
 /**
  *
  */
 public class QuerySenderListener extends AbstractSolrEventListener {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  
   public QuerySenderListener(SolrCore core) {
     super(core);
   }

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RAMDirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RAMDirectoryFactory.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RAMDirectoryFactory.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RAMDirectoryFactory.java Mon Dec 21 11:39:57 2015
@@ -25,16 +25,12 @@ import org.apache.lucene.store.RAMDirect
 import org.apache.lucene.store.SingleInstanceLockFactory;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Factory to instantiate {@link org.apache.lucene.store.RAMDirectory}
  */
 public class RAMDirectoryFactory extends EphemeralDirectoryFactory {
 
-  public static Logger LOG = LoggerFactory.getLogger(RAMDirectoryFactory.class);
-  
   @Override
   protected LockFactory createLockFactory(String rawLockType) throws IOException {
     if (!(rawLockType == null || "single".equalsIgnoreCase(rawLockType.trim()))) {

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RequestHandlers.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RequestHandlers.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RequestHandlers.java Mon Dec 21 11:39:57 2015
@@ -17,6 +17,7 @@
 
 package org.apache.solr.core;
 
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -31,7 +32,7 @@ import org.slf4j.LoggerFactory;
 /**
  */
 public final class RequestHandlers {
-  public static Logger log = LoggerFactory.getLogger(RequestHandlers.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   protected final SolrCore core;
 

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RequestParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RequestParams.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RequestParams.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RequestParams.java Mon Dec 21 11:39:57 2015
@@ -20,6 +20,7 @@ package org.apache.solr.core;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -42,7 +43,7 @@ import org.slf4j.LoggerFactory;
  * returns a copy of the Object with the changed values
  */
 public class RequestParams implements MapSerializable {
-  public static final Logger log = LoggerFactory.getLogger(RequestParams.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final Map data;
   private final Map<String, VersionedParams> paramsets = new LinkedHashMap<>();

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RunExecutableListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RunExecutableListener.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RunExecutableListener.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/RunExecutableListener.java Mon Dec 21 11:39:57 2015
@@ -20,15 +20,20 @@ package org.apache.solr.core;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.ArrayList;
 
 /**
  */
 class RunExecutableListener extends AbstractSolrEventListener {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  
   public RunExecutableListener(SolrCore core) {
     super(core);
   }

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java Mon Dec 21 11:39:57 2015
@@ -3,7 +3,7 @@ package org.apache.solr.core;
 import org.apache.lucene.codecs.Codec;
 import org.apache.lucene.codecs.DocValuesFormat;
 import org.apache.lucene.codecs.PostingsFormat;
-import org.apache.lucene.codecs.lucene53.Lucene53Codec;
+import org.apache.lucene.codecs.lucene60.Lucene60Codec;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.util.plugin.SolrCoreAware;
@@ -51,7 +51,7 @@ public class SchemaCodecFactory extends
   @Override
   public void init(NamedList args) {
     super.init(args);
-    codec = new Lucene53Codec() {
+    codec = new Lucene60Codec() {
       @Override
       public PostingsFormat getPostingsFormatForField(String field) {
         final SchemaField schemaField = core.getLatestSchema().getFieldOrNull(field);

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrConfig.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrConfig.java Mon Dec 21 11:39:57 2015
@@ -20,29 +20,20 @@ package org.apache.solr.core;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.xpath.XPathConstants;
-
-import java.io.File;
-import java.io.FileFilter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.lang.invoke.MethodHandles;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.UUID;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import com.google.common.collect.ImmutableList;
-
 import org.apache.lucene.index.IndexDeletionPolicy;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.util.Version;
@@ -68,8 +59,6 @@ import org.apache.solr.update.UpdateLog;
 import org.apache.solr.update.processor.UpdateRequestProcessorChain;
 import org.apache.solr.update.processor.UpdateRequestProcessorFactory;
 import org.apache.solr.util.DOMUtil;
-import org.apache.solr.util.FileUtils;
-import org.apache.solr.util.RegexFileFilter;
 import org.noggit.JSONParser;
 import org.noggit.ObjectBuilder;
 import org.slf4j.Logger;
@@ -79,9 +68,9 @@ import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
-import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.common.params.CommonParams.NAME;
 import static org.apache.solr.common.params.CommonParams.PATH;
+import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.core.ConfigOverlay.ZNODEVER;
 import static org.apache.solr.core.SolrConfig.PluginOpts.LAZY;
 import static org.apache.solr.core.SolrConfig.PluginOpts.MULTI_OK;
@@ -98,7 +87,7 @@ import static org.apache.solr.core.SolrC
  */
 public class SolrConfig extends Config implements MapSerializable {
 
-  public static final Logger log = LoggerFactory.getLogger(SolrConfig.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public static final String DEFAULT_CONF_FILE = "solrconfig.xml";
   private RequestParams requestParams;
@@ -166,7 +155,7 @@ public class SolrConfig extends Config i
    * @param name        the configuration name used by the loader if the stream is null
    * @param is          the configuration stream
    */
-  public SolrConfig(String instanceDir, String name, InputSource is)
+  public SolrConfig(Path instanceDir, String name, InputSource is)
       throws ParserConfigurationException, IOException, SAXException {
     this(new SolrResourceLoader(instanceDir), name, is);
   }
@@ -179,7 +168,7 @@ public class SolrConfig extends Config i
       if (loader instanceof ZkSolrResourceLoader) {
         resource = name;
       } else {
-        resource = loader.getConfigDir() + name;
+        resource = Paths.get(loader.getConfigDir()).resolve(name).toString();
       }
       throw new SolrException(ErrorCode.SERVER_ERROR, "Error loading solr config from " + resource, e);
     }
@@ -318,7 +307,7 @@ public class SolrConfig extends Config i
     }
 
     solrRequestParsers = new SolrRequestParsers(this);
-    Config.log.info("Loaded SolrConfig: " + name);
+    log.info("Loaded SolrConfig: " + name);
   }
 
   public static final List<SolrPluginInfo> plugins = ImmutableList.<SolrPluginInfo>builder()
@@ -745,32 +734,38 @@ public class SolrConfig extends Config i
 
     log.info("Adding specified lib dirs to ClassLoader");
     SolrResourceLoader loader = getResourceLoader();
+    List<URL> urls = new ArrayList<>();
 
-    try {
-      for (int i = 0; i < nodes.getLength(); i++) {
-        Node node = nodes.item(i);
-
-        String baseDir = DOMUtil.getAttr(node, "dir");
-        String path = DOMUtil.getAttr(node, PATH);
-        if (null != baseDir) {
-          // :TODO: add support for a simpler 'glob' mutually exclusive of regex
-          String regex = DOMUtil.getAttr(node, "regex");
-          FileFilter filter = (null == regex) ? null : new RegexFileFilter(regex);
-          loader.addToClassLoader(baseDir, filter, false);
-        } else if (null != path) {
-          final File file = FileUtils.resolvePath(new File(loader.getInstanceDir()), path);
-          loader.addToClassLoader(file.getParent(), new FileFilter() {
-            @Override
-            public boolean accept(File pathname) {
-              return pathname.equals(file);
-            }
-          }, false);
-        } else {
-          throw new RuntimeException(
-              "lib: missing mandatory attributes: 'dir' or 'path'");
+    for (int i = 0; i < nodes.getLength(); i++) {
+      Node node = nodes.item(i);
+      String baseDir = DOMUtil.getAttr(node, "dir");
+      String path = DOMUtil.getAttr(node, PATH);
+      if (null != baseDir) {
+        // :TODO: add support for a simpler 'glob' mutually exclusive of regex
+        Path dir = loader.getInstancePath().resolve(baseDir);
+        String regex = DOMUtil.getAttr(node, "regex");
+        try {
+          if (regex == null)
+            urls.addAll(SolrResourceLoader.getURLs(dir));
+          else
+            urls.addAll(SolrResourceLoader.getFilteredURLs(dir, regex));
+        } catch (IOException e) {
+          log.warn("Couldn't add files from {} filtered by {} to classpath: {}", dir, regex, e.getMessage());
+        }
+      } else if (null != path) {
+        final Path dir = loader.getInstancePath().resolve(path);
+        try {
+          urls.add(dir.toUri().toURL());
+        } catch (MalformedURLException e) {
+          log.warn("Couldn't add file {} to classpath: {}", dir, e.getMessage());
         }
+      } else {
+        throw new RuntimeException("lib: missing mandatory attributes: 'dir' or 'path'");
       }
-    } finally {
+    }
+
+    if (urls.size() > 0) {
+      loader.addToClassLoader(urls);
       loader.reloadLuceneSPI();
     }
   }

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrCore.java Mon Dec 21 11:39:57 2015
@@ -17,9 +17,6 @@
 
 package org.apache.solr.core;
 
-import static com.google.common.base.Preconditions.*;
-import static org.apache.solr.common.params.CommonParams.*;
-
 import java.io.Closeable;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -27,26 +24,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
+import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Constructor;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.NoSuchFileException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.StringTokenizer;
+import java.util.*;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -55,7 +38,6 @@ import java.util.concurrent.ExecutorServ
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.commons.io.FileUtils;
@@ -83,6 +65,7 @@ import org.apache.solr.common.params.Upd
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.DirectoryFactory.DirContext;
 import org.apache.solr.handler.IndexFetcher;
@@ -94,20 +77,7 @@ import org.apache.solr.handler.component
 import org.apache.solr.logging.MDCLoggingContext;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
-import org.apache.solr.response.BinaryResponseWriter;
-import org.apache.solr.response.CSVResponseWriter;
-import org.apache.solr.response.JSONResponseWriter;
-import org.apache.solr.response.PHPResponseWriter;
-import org.apache.solr.response.PHPSerializedResponseWriter;
-import org.apache.solr.response.PythonResponseWriter;
-import org.apache.solr.response.QueryResponseWriter;
-import org.apache.solr.response.RawResponseWriter;
-import org.apache.solr.response.RubyResponseWriter;
-import org.apache.solr.response.SchemaXmlResponseWriter;
-import org.apache.solr.response.SmileResponseWriter;
-import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.response.SortingResponseWriter;
-import org.apache.solr.response.XMLResponseWriter;
+import org.apache.solr.response.*;
 import org.apache.solr.response.transform.TransformerFactory;
 import org.apache.solr.rest.ManagedResourceStorage;
 import org.apache.solr.rest.ManagedResourceStorage.StorageIO;
@@ -147,20 +117,17 @@ import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.solr.common.params.CommonParams.PATH;
+
 /**
  *
  */
 public final class SolrCore implements SolrInfoMBean, Closeable {
   public static final String version="1.0";
 
-  // These should *only* be used for debugging or monitoring purposes
-  public static final AtomicLong numOpens = new AtomicLong();
-  public static final AtomicLong numCloses = new AtomicLong();
-  public static Map<SolrCore,Exception> openHandles = Collections.synchronizedMap(new IdentityHashMap<SolrCore, Exception>());
-
-
-  public static final Logger log = LoggerFactory.getLogger(SolrCore.class);
-  public static final Logger requestLog = LoggerFactory.getLogger(SolrCore.class.getName() + ".Request");
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  public static final Logger requestLog = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass().getName() + ".Request");
 
   private String name;
   private String logid; // used to show what name is set
@@ -259,17 +226,37 @@ public final class SolrCore implements S
   public String getSchemaResource() {
     return getLatestSchema().getResourceName();
   }
-
-  /** @return the latest snapshot of the schema used by this core instance. */
+  
+  /** 
+   * @return the latest snapshot of the schema used by this core instance. 
+   * @see #setLatestSchema 
+   */
   public IndexSchema getLatestSchema() {
     return schema;
   }
-
-  /** Sets the latest schema snapshot to be used by this core instance. */
+  
+  /** 
+   * Sets the latest schema snapshot to be used by this core instance. 
+   * If the specified <code>replacementSchema</code> uses a {@link SimilarityFactory} which is 
+   * {@link SolrCoreAware} then this method will {@link SolrCoreAware#inform} that factory about 
+   * this SolrCore prior to using the <code>replacementSchema</code>
+   * @see #getLatestSchema
+   */
   public void setLatestSchema(IndexSchema replacementSchema) {
-    schema = replacementSchema;
+    // 1) For a newly instantiated core, the Similarity needs SolrCore before inform() is called on
+    // any registered SolrCoreAware listeners (which will likeley need to use the SolrIndexSearcher.
+    //
+    // 2) If a new IndexSchema is assigned to an existing live SolrCore (ie: managed schema
+    // replacement via SolrCloud) then we need to explicitly inform() the similarity because
+    // we can't rely on the normal SolrResourceLoader lifecycle because the sim was instantiated
+    // after the SolrCore was already live (see: SOLR-8311 + SOLR-8280)
+    final SimilarityFactory similarityFactory = replacementSchema.getSimilarityFactory();
+    if (similarityFactory instanceof SolrCoreAware) {
+      ((SolrCoreAware) similarityFactory).inform(this);
+    }
+    this.schema = replacementSchema;
   }
-
+  
   public NamedList getConfigSetProperties() {
     return configSetProperties;
   }
@@ -721,6 +708,9 @@ public final class SolrCore implements S
       IndexSchema schema, NamedList configSetProperties,
       CoreDescriptor coreDescriptor, UpdateHandler updateHandler,
       IndexDeletionPolicyWrapper delPolicy, SolrCore prev) {
+    
+    assert ObjectReleaseTracker.track(searcherExecutor); // ensure that in unclean shutdown tests we still close this
+    
     checkNotNull(coreDescriptor, "coreDescriptor cannot be null");
     
     this.coreDescriptor = coreDescriptor;
@@ -743,7 +733,7 @@ public final class SolrCore implements S
     this.dataDir = initDataDir(dataDir, config, coreDescriptor);
     this.ulogDir = initUpdateLogDir(coreDescriptor);
 
-    log.info("[{}] Opening new SolrCore at [{}], dataDir=[{}]", logid, resourceLoader.getInstanceDir(), dataDir);
+    log.info("[{}] Opening new SolrCore at [{}], dataDir=[{}]", logid, resourceLoader.getInstancePath(), this.dataDir);
 
     checkVersionFieldExistsInSchema(schema, coreDescriptor);
 
@@ -751,7 +741,7 @@ public final class SolrCore implements S
     this.infoRegistry = initInfoRegistry(name, config);
     infoRegistry.put("fieldCache", new SolrFieldCacheMBean());
 
-    this.schema = initSchema(config, schema);
+    initSchema(config, schema);
 
     this.maxWarmingSearchers = config.maxWarmingSearchers;
     this.slowQueryThresholdMillis = config.slowQueryThresholdMillis;
@@ -859,13 +849,11 @@ public final class SolrCore implements S
     seedVersionBuckets();
 
     bufferUpdatesIfConstructing(coreDescriptor);
-    
-    // For debugging   
-//    numOpens.incrementAndGet();
-//    openHandles.put(this, new RuntimeException("unclosed core - name:" + getName() + " refs: " + refCount.get()));
 
     this.ruleExpiryLock = new ReentrantLock();
     registerConfListener();
+    
+    assert ObjectReleaseTracker.track(this);
   }
 
   public void seedVersionBuckets() {
@@ -948,17 +936,18 @@ public final class SolrCore implements S
     infoRegistry.put("updateHandler", newUpdateHandler);
     return newUpdateHandler;
   }
-
-  private IndexSchema initSchema(SolrConfig config, IndexSchema schema) {
+  
+  /**
+   * Initializes the "Latest Schema" for this SolrCore using either the provided <code>schema</code> 
+   * if non-null, or a new instance build via the factory identified in the specified <code>config</code>
+   * @see IndexSchemaFactory
+   * @see #setLatestSchema
+   */
+  private void initSchema(SolrConfig config, IndexSchema schema) {
     if (schema == null) {
       schema = IndexSchemaFactory.buildIndexSchema(IndexSchema.DEFAULT_SCHEMA_FILE, config);
     }
-    final SimilarityFactory similarityFactory = schema.getSimilarityFactory();
-    if (similarityFactory instanceof SolrCoreAware) {
-      // Similarity needs SolrCore before inform() is called on all registered SolrCoreAware listeners below
-      ((SolrCoreAware) similarityFactory).inform(this);
-    }
-    return schema;
+    setLatestSchema(schema);
   }
 
   private Map<String,SolrInfoMBean> initInfoRegistry(String name, SolrConfig config) {
@@ -1013,10 +1002,7 @@ public final class SolrCore implements S
   private String initUpdateLogDir(CoreDescriptor coreDescriptor) {
     String updateLogDir = coreDescriptor.getUlogDir();
     if (updateLogDir == null) {
-      updateLogDir = dataDir;
-      if (new File(updateLogDir).isAbsolute() == false) {
-        updateLogDir = SolrResourceLoader.normalizeDir(coreDescriptor.getInstanceDir()) + updateLogDir;
-      }
+      updateLogDir = coreDescriptor.getInstanceDir().resolve(dataDir).normalize().toAbsolutePath().toString();
     }
     return updateLogDir;
   }
@@ -1236,6 +1222,7 @@ public final class SolrCore implements S
         throw (Error) e;
       }
     }
+    assert ObjectReleaseTracker.release(searcherExecutor);
 
     try {
       // Since we waited for the searcherExecutor to shut down,
@@ -1275,7 +1262,6 @@ public final class SolrCore implements S
 
     }
 
-
     if( closeHooks != null ) {
        for( CloseHook hook : closeHooks ) {
          try {
@@ -1288,10 +1274,7 @@ public final class SolrCore implements S
          }
       }
     }
-
-    // For debugging 
-//    numCloses.incrementAndGet();
-//    openHandles.remove(this);
+    assert ObjectReleaseTracker.release(this);
   }
 
   /** Current core usage count. */
@@ -2169,7 +2152,7 @@ public final class SolrCore implements S
   private final PluginBag<QueryResponseWriter> responseWriters = new PluginBag<>(QueryResponseWriter.class, this);
   public static final Map<String ,QueryResponseWriter> DEFAULT_RESPONSE_WRITERS ;
   static{
-    HashMap<String, QueryResponseWriter> m= new HashMap<>();
+    HashMap<String, QueryResponseWriter> m= new HashMap<>(14, 1);
     m.put("xml", new XMLResponseWriter());
     m.put("standard", m.get("xml"));
     m.put(CommonParams.JSON, new JSONResponseWriter());
@@ -2243,14 +2226,14 @@ public final class SolrCore implements S
   private final PluginBag<TransformerFactory> transformerFactories = new PluginBag<>(TransformerFactory.class, this);
 
   <T> Map<String, T> createInstances(Map<String, Class<? extends T>> map) {
-    Map<String, T> result = new LinkedHashMap<>();
+    Map<String, T> result = new LinkedHashMap<>(map.size(), 1);
     for (Map.Entry<String, Class<? extends T>> e : map.entrySet()) {
       try {
         Object o = getResourceLoader().newInstance(e.getValue().getName(), e.getValue());
         result.put(e.getKey(), (T) o);
       } catch (Exception exp) {
         //should never happen
-        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unbale to instantiate class", exp);
+        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unable to instantiate class", exp);
       }
     }
     return result;
@@ -2293,7 +2276,7 @@ public final class SolrCore implements S
    */
   public <T> List<T> initPlugins(List<PluginInfo> pluginInfos, Class<T> type, String defClassName) {
     if(pluginInfos.isEmpty()) return Collections.emptyList();
-    List<T> result = new ArrayList<>();
+    List<T> result = new ArrayList<>(pluginInfos.size());
     for (PluginInfo info : pluginInfos) result.add(createInitInstance(info,type, type.getSimpleName(), defClassName));
     return result;
   }
@@ -2440,11 +2423,11 @@ public final class SolrCore implements S
 
   @Override
   public NamedList getStatistics() {
-    NamedList<Object> lst = new SimpleOrderedMap<>();
+    NamedList<Object> lst = new SimpleOrderedMap<>(8);
     lst.add("coreName", name==null ? "(null)" : name);
     lst.add("startTime", startTime);
     lst.add("refCount", getOpenCount());
-    lst.add("instanceDir", resourceLoader.getInstanceDir());
+    lst.add("instanceDir", resourceLoader.getInstancePath());
     lst.add("indexDir", getIndexDir());
 
     CoreDescriptor cd = getCoreDescriptor();
@@ -2499,12 +2482,11 @@ public final class SolrCore implements S
         public void postClose(SolrCore core) {
           CoreDescriptor cd = core.getCoreDescriptor();
           if (cd != null) {
-            File instanceDir = new File(cd.getInstanceDir());
             try {
-              FileUtils.deleteDirectory(instanceDir);
+              FileUtils.deleteDirectory(cd.getInstanceDir().toFile());
             } catch (IOException e) {
               SolrException.log(log, "Failed to delete instance dir for core:"
-                  + core.getName() + " dir:" + instanceDir.getAbsolutePath());
+                  + core.getName() + " dir:" + cd.getInstanceDir());
             }
           }
         }
@@ -2523,12 +2505,11 @@ public final class SolrCore implements S
       }
     }
     if (deleteInstanceDir) {
-      File instanceDir = new File(cd.getInstanceDir());
       try {
-        FileUtils.deleteDirectory(instanceDir);
+        FileUtils.deleteDirectory(cd.getInstanceDir().toFile());
       } catch (IOException e) {
         SolrException.log(log, "Failed to delete instance dir for unloaded core:" + cd.getName()
-            + " dir:" + instanceDir.getAbsolutePath());
+            + " dir:" + cd.getInstanceDir());
       }
     }
   }

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrCores.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrCores.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrCores.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrCores.java Mon Dec 21 11:39:57 2015
@@ -23,6 +23,7 @@ import org.apache.solr.logging.MDCLoggin
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -52,7 +53,7 @@ class SolrCores {
   
   private Set<String> currentlyLoadingCores = Collections.newSetFromMap(new ConcurrentHashMap<String,Boolean>());
 
-  private static final Logger log = LoggerFactory.getLogger(SolrCores.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   // This map will hold objects that are being currently operated on. The core (value) may be null in the case of
   // initial load. The rule is, never to any operation on a core that is currently being operated upon.
@@ -70,7 +71,7 @@ class SolrCores {
   // there is no setting for max size, nothing is done and all cores go in the regular "cores" list
   protected void allocateLazyCores(final int cacheSize, final SolrResourceLoader loader) {
     if (cacheSize != Integer.MAX_VALUE) {
-      CoreContainer.log.info("Allocating transient cache for {} transient cores", cacheSize);
+      log.info("Allocating transient cache for {} transient cores", cacheSize);
       transientCores = new LinkedHashMap<String, SolrCore>(cacheSize, 0.75f, true) {
         @Override
         protected boolean removeEldestEntry(Map.Entry<String, SolrCore> eldest) {
@@ -123,7 +124,7 @@ class SolrCores {
         try {
           core.close();
         } catch (Throwable e) {
-          SolrException.log(CoreContainer.log, "Error shutting down core", e);
+          SolrException.log(log, "Error shutting down core", e);
           if (e instanceof Error) {
             throw (Error) e;
           }
@@ -137,7 +138,7 @@ class SolrCores {
   //WARNING! This should be the _only_ place you put anything into the list of transient cores!
   protected SolrCore putTransientCore(NodeConfig cfg, String name, SolrCore core, SolrResourceLoader loader) {
     SolrCore retCore;
-    CoreContainer.log.info("Opening transient core {}", name);
+    log.info("Opening transient core {}", name);
     synchronized (modifyLock) {
       retCore = transientCores.put(name, core);
     }
@@ -352,7 +353,7 @@ class SolrCores {
       // We _really_ need to do this within the synchronized block!
       if (! container.isShutDown()) {
         if (! pendingCoreOps.add(name)) {
-          CoreContainer.log.warn("Replaced an entry in pendingCoreOps {}, we should not be doing this", name);
+          log.warn("Replaced an entry in pendingCoreOps {}, we should not be doing this", name);
         }
         return getCoreFromAnyList(name, false); // we might have been _unloading_ the core, so return the core if it was loaded.
       }
@@ -365,7 +366,7 @@ class SolrCores {
   protected void removeFromPendingOps(String name) {
     synchronized (modifyLock) {
       if (! pendingCoreOps.remove(name)) {
-        CoreContainer.log.warn("Tried to remove core {} from pendingCoreOps and it wasn't there. ", name);
+        log.warn("Tried to remove core {} from pendingCoreOps and it wasn't there. ", name);
       }
       modifyLock.notifyAll();
     }

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrDeletionPolicy.java Mon Dec 21 11:39:57 2015
@@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Locale;
 
@@ -42,7 +43,7 @@ import java.util.Locale;
  * @see org.apache.lucene.index.IndexDeletionPolicy
  */
 public class SolrDeletionPolicy extends IndexDeletionPolicy implements NamedListInitializedPlugin {
-  public static Logger log = LoggerFactory.getLogger(SolrCore.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private String maxCommitAge = null;
   private int maxCommitsToKeep = 1;

Modified: lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrEventListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrEventListener.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrEventListener.java (original)
+++ lucene/dev/branches/lucene6835/solr/core/src/java/org/apache/solr/core/SolrEventListener.java Mon Dec 21 11:39:57 2015
@@ -20,15 +20,10 @@ package org.apache.solr.core;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.util.plugin.NamedListInitializedPlugin;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  *
  */
 public interface SolrEventListener extends NamedListInitializedPlugin{
-  static final Logger log = LoggerFactory.getLogger(SolrCore.class);
-
 
   public void postCommit();