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/02/09 00:53:25 UTC

svn commit: r1658277 [18/38] - in /lucene/dev/branches/lucene6005: ./ dev-tools/ dev-tools/idea/solr/contrib/dataimporthandler/ dev-tools/idea/solr/contrib/velocity/ dev-tools/maven/lucene/replicator/ dev-tools/maven/solr/ dev-tools/maven/solr/contrib/...

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/cloud/ZkController.java Sun Feb  8 23:53:14 2015
@@ -50,7 +50,6 @@ import org.apache.solr.core.CloseHook;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.handler.component.ShardHandler;
 import org.apache.solr.update.UpdateLog;
 import org.apache.solr.update.UpdateShardHandler;
@@ -614,15 +613,13 @@ public final class ZkController {
 
       ShardHandler shardHandler;
       UpdateShardHandler updateShardHandler;
-      String adminPath;
       shardHandler = cc.getShardHandlerFactory().getShardHandler();
       updateShardHandler = cc.getUpdateShardHandler();
-      adminPath = cc.getAdminPath();
       
       if (!zkRunOnly) {
         overseerElector = new LeaderElector(zkClient);
         this.overseer = new Overseer(shardHandler, updateShardHandler,
-            adminPath, zkStateReader, this, cc.getConfig());
+            CoreContainer.CORES_HANDLER_PATH, zkStateReader, this, cc.getConfig());
         ElectionContext context = new OverseerElectionContext(zkClient,
             overseer, getNodeName());
         overseerElector.setup(context);
@@ -855,12 +852,10 @@ public final class ZkController {
       // Restore the interrupted status
       Thread.currentThread().interrupt();
       throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR, "", e);
-    } catch (KeeperException e) {
-      throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR, "", e);
-    } catch (IOException e) {
+    } catch (KeeperException | IOException e) {
       throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR, "", e);
     }
-    
+
 
     // in this case, we want to wait for the leader as long as the leader might 
     // wait for a vote, at least - but also long enough that a large cluster has
@@ -1636,9 +1631,7 @@ public final class ZkController {
         log.info("Replica "+myCoreNodeName+
             " NOT in leader-initiated recovery, need to wait for leader to see down state.");
             
-        HttpSolrClient client = null;
-        client = new HttpSolrClient(leaderBaseUrl);
-        try {
+        try (HttpSolrClient client = new HttpSolrClient(leaderBaseUrl)) {
           client.setConnectionTimeout(15000);
           client.setSoTimeout(120000);
           WaitForState prepCmd = new WaitForState();
@@ -1689,8 +1682,8 @@ public final class ZkController {
               }
             }
           }
-        } finally {
-          client.shutdown();
+        } catch (IOException e) {
+          SolrException.log(log, "Error closing HttpSolrClient", e);
         }
       }
     }
@@ -2023,14 +2016,10 @@ public final class ZkController {
       stateData = zkClient.getData(znodePath, null, new Stat(), false);
     } catch (NoNodeException ignoreMe) {
       // safe to ignore as this znode will only exist if the leader initiated recovery
-    } catch (ConnectionLossException cle) {
+    } catch (ConnectionLossException | SessionExpiredException cle) {
       // sort of safe to ignore ??? Usually these are seen when the core is going down
       // or there are bigger issues to deal with than reading this znode
       log.warn("Unable to read "+znodePath+" due to: "+cle);
-    } catch (SessionExpiredException see) {
-      // sort of safe to ignore ??? Usually these are seen when the core is going down
-      // or there are bigger issues to deal with than reading this znode
-      log.warn("Unable to read "+znodePath+" due to: "+see);
     } catch (Exception exc) {
       log.error("Failed to read data from znode "+znodePath+" due to: "+exc);
       if (exc instanceof SolrException) {
@@ -2151,10 +2140,9 @@ public final class ZkController {
    *
    * @return true on success
    */
-  public static boolean persistConfigResourceToZooKeeper( SolrResourceLoader loader, int znodeVersion ,
+  public static boolean persistConfigResourceToZooKeeper( ZkSolrResourceLoader zkLoader, int znodeVersion ,
                                                           String resourceName, byte[] content,
                                                           boolean createIfNotExists) {
-    final ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)loader;
     final ZkController zkController = zkLoader.getZkController();
     final SolrZkClient zkClient = zkController.getZkClient();
     final String resourceLocation = zkLoader.getConfigSetZkPath() + "/" + resourceName;
@@ -2162,12 +2150,12 @@ public final class ZkController {
     try {
       try {
         zkClient.setData(resourceLocation , content,znodeVersion, true);
-        zkClient.setData(zkLoader.getConfigSetZkPath(),new byte[]{0},true);
+        touchConfDir(zkLoader);
       } catch (NoNodeException e) {
         if(createIfNotExists){
           try {
             zkClient.create(resourceLocation,content, CreateMode.PERSISTENT,true);
-            zkClient.setData(zkLoader.getConfigSetZkPath(), new byte[]{0}, true);
+            touchConfDir(zkLoader);
           } catch (KeeperException.NodeExistsException nee) {
             try {
               Stat stat = zkClient.exists(resourceLocation, null, true);
@@ -2206,6 +2194,21 @@ public final class ZkController {
     return true;
   }
 
+  public static void touchConfDir(ZkSolrResourceLoader zkLoader)  {
+    SolrZkClient zkClient = zkLoader.getZkController().getZkClient();
+    try {
+      zkClient.setData(zkLoader.getConfigSetZkPath(),new byte[]{0},true);
+    } catch (Exception e) {
+      if (e instanceof InterruptedException) {
+        Thread.currentThread().interrupt(); // Restore the interrupted status
+      }
+      final String msg = "Error 'touching' conf location " + zkLoader.getConfigSetZkPath();
+      log.error(msg, e);
+      throw new SolrException(ErrorCode.SERVER_ERROR, msg, e);
+
+    }
+  }
+
   public static  class ResourceModifiedInZkException extends SolrException {
     public ResourceModifiedInZkException(ErrorCode code, String msg) {
       super(code, msg);

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java Sun Feb  8 23:53:14 2015
@@ -17,7 +17,6 @@ package org.apache.solr.cloud.overseer;
  * limitations under the License.
  */
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -151,7 +150,7 @@ public class ZkStateWriter {
             // let's clean up the collections path for this collection
             reader.getZkClient().clean("/collections/" + name);
           } else if (c.getStateFormat() > 1) {
-            byte[] data = ZkStateReader.toJSON(new ClusterState(-1, Collections.<String>emptySet(), singletonMap(c.getName(), c)));
+            byte[] data = ZkStateReader.toJSON(singletonMap(c.getName(),c));
             if (reader.getZkClient().exists(path, true)) {
               assert c.getZNodeVersion() >= 0;
               log.info("going to update_collection {} version: {}", path, c.getZNodeVersion());

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java Sun Feb  8 23:53:14 2015
@@ -36,7 +36,6 @@ import org.apache.lucene.store.LockFacto
 import org.apache.lucene.store.NRTCachingDirectory;
 import org.apache.lucene.store.NativeFSLockFactory;
 import org.apache.lucene.store.NoLockFactory;
-import org.apache.lucene.store.RateLimitedDirectoryWrapper;
 import org.apache.lucene.store.SimpleFSLockFactory;
 import org.apache.lucene.store.SingleInstanceLockFactory;
 import org.apache.lucene.util.IOUtils;
@@ -350,7 +349,6 @@ public abstract class CachingDirectoryFa
         directory = create(fullPath, createLockFactory(rawLockType), dirContext);
         boolean success = false;
         try {
-          directory = rateLimit(directory);
           CacheValue newCacheValue = new CacheValue(fullPath, directory);
           byDirectoryCache.put(directory, newCacheValue);
           byPathCache.put(fullPath, newCacheValue);
@@ -370,25 +368,6 @@ public abstract class CachingDirectoryFa
     }
   }
 
-  private Directory rateLimit(Directory directory) {
-    if (maxWriteMBPerSecDefault != null || maxWriteMBPerSecFlush != null || maxWriteMBPerSecMerge != null || maxWriteMBPerSecRead != null) {
-      directory = new RateLimitedDirectoryWrapper(directory);
-      if (maxWriteMBPerSecDefault != null) {
-        ((RateLimitedDirectoryWrapper)directory).setMaxWriteMBPerSec(maxWriteMBPerSecDefault, Context.DEFAULT);
-      }
-      if (maxWriteMBPerSecFlush != null) {
-        ((RateLimitedDirectoryWrapper)directory).setMaxWriteMBPerSec(maxWriteMBPerSecFlush, Context.FLUSH);
-      }
-      if (maxWriteMBPerSecMerge != null) {
-        ((RateLimitedDirectoryWrapper)directory).setMaxWriteMBPerSec(maxWriteMBPerSecMerge, Context.MERGE);
-      }
-      if (maxWriteMBPerSecRead != null) {
-        ((RateLimitedDirectoryWrapper)directory).setMaxWriteMBPerSec(maxWriteMBPerSecRead, Context.READ);
-      }
-    }
-    return directory;
-  }
-  
   /*
    * (non-Javadoc)
    * 

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/Config.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/Config.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/Config.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/Config.java Sun Feb  8 23:53:14 2015
@@ -20,6 +20,7 @@ package org.apache.solr.core;
 import org.apache.lucene.util.Version;
 import org.apache.solr.cloud.ZkSolrResourceLoader;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.update.SolrIndexConfig;
 import org.apache.solr.util.DOMUtil;
 import org.apache.solr.util.SystemIdResolver;
 import org.apache.solr.common.util.XMLErrorLogger;
@@ -150,18 +151,27 @@ public class Config {
       if (substituteProps) {
         DOMUtil.substituteProperties(doc, getSubstituteProperties());
       }
-    } catch (ParserConfigurationException e)  {
-      SolrException.log(log, "Exception during parsing file: " + name, e);
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
-    } catch (SAXException e)  {
-      SolrException.log(log, "Exception during parsing file: " + name, e);
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
-    } catch (TransformerException e) {
+    } catch (ParserConfigurationException | SAXException | TransformerException e)  {
       SolrException.log(log, "Exception during parsing file: " + name, e);
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
     }
   }
 
+  /*
+     * Assert that assertCondition is true.
+     * If not, prints reason as log warning.
+     * If failCondition is true, then throw exception instead of warning
+     */
+  public static void assertWarnOrFail(String reason, boolean assertCondition, boolean failCondition) {
+    if (assertCondition) {
+      return;
+    } else if (failCondition) {
+      throw new SolrException(SolrException.ErrorCode.FORBIDDEN, reason);
+    } else {
+      log.warn(reason);
+    }
+  }
+
   protected Properties getSubstituteProperties() {
     return loader.getCoreProperties();
   }

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java Sun Feb  8 23:53:14 2015
@@ -75,6 +75,7 @@ public class ConfigOverlay implements Ma
     for (int i = 0; i < hierarchy.size(); i++) {
       String s = hierarchy.get(i);
       if(i < hierarchy.size()-1){
+        if (!(obj.get(s) instanceof Map)) return null;
         obj = (Map) obj.get(s);
         if(obj == null) return null;
       } else {

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigSolr.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigSolr.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigSolr.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigSolr.java Sun Feb  8 23:53:14 2015
@@ -22,24 +22,15 @@ import org.apache.solr.cloud.CloudConfig
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.logging.LogWatcherConfig;
-import org.apache.solr.util.DOMUtil;
-import org.apache.solr.util.PropertiesUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Properties;
 
 
@@ -73,10 +64,9 @@ public abstract class ConfigSolr {
   public static ConfigSolr fromInputStream(SolrResourceLoader loader, InputStream is) {
     try {
       byte[] buf = IOUtils.toByteArray(is);
-      String originalXml = new String(buf, StandardCharsets.UTF_8);
       try (ByteArrayInputStream dup = new ByteArrayInputStream(buf)) {
         Config config = new Config(loader, null, new InputSource(dup), null, false);
-        return fromConfig(config, originalXml);
+        return new ConfigSolrXml(config);
       }
     } catch (SolrException exc) {
       throw exc;
@@ -88,12 +78,6 @@ public abstract class ConfigSolr {
   public static ConfigSolr fromSolrHome(SolrResourceLoader loader, String solrHome) {
     return fromFile(loader, new File(solrHome, SOLR_XML_FILE));
   }
-
-  public static ConfigSolr fromConfig(Config config, String originalXml) {
-    boolean oldStyle = (config.getNode("solr/cores", false) != null);
-    return oldStyle ? new ConfigSolrXmlOld(config, originalXml)
-                    : new ConfigSolrXml(config);
-  }
   
   public abstract CoresLocator getCoresLocator();
 
@@ -105,32 +89,26 @@ public abstract class ConfigSolr {
    * @return core root directory
    */
   public String getCoreRootDirectory() {
-    SolrResourceLoader loader = config.getResourceLoader();
-    String relativeDir = get(CfgProp.SOLR_COREROOTDIRECTORY, null);
+    String relativeDir = getString(CfgProp.SOLR_COREROOTDIRECTORY, null);
     if (relativeDir != null)
       return loader.resolve(relativeDir);
     return loader.getInstanceDir();
   }
 
-  public PluginInfo getShardHandlerFactoryPluginInfo() {
-    Node node = config.getNode(getShardHandlerFactoryConfigPath(), false);
-    return (node == null) ? null : new PluginInfo(node, "shardHandlerFactory", false, true);
-  }
-
-  protected abstract String getShardHandlerFactoryConfigPath();
+  public abstract PluginInfo getShardHandlerFactoryPluginInfo();
 
   public String getZkHost() {
     String sysZkHost = System.getProperty("zkHost");
     if (sysZkHost != null)
       return sysZkHost;
-    return get(CfgProp.SOLR_ZKHOST, null);
+    return getString(CfgProp.SOLR_ZKHOST, null);
   }
 
   public int getZkClientTimeout() {
     String sysProp = System.getProperty("zkClientTimeout");
     if (sysProp != null)
       return Integer.parseInt(sysProp);
-    return get(CfgProp.SOLR_ZKCLIENTTIMEOUT, DEFAULT_ZK_CLIENT_TIMEOUT);
+    return getInt(CfgProp.SOLR_ZKCLIENTTIMEOUT, DEFAULT_ZK_CLIENT_TIMEOUT);
   }
 
   private static final int DEFAULT_ZK_CLIENT_TIMEOUT = 15000;
@@ -142,124 +120,117 @@ public abstract class ConfigSolr {
   private static final int DEFAULT_AUTO_REPLICA_FAILOVER_WAIT_AFTER_EXPIRATION = 30000;
   private static final int DEFAULT_AUTO_REPLICA_FAILOVER_WORKLOOP_DELAY = 10000;
   private static final int DEFAULT_AUTO_REPLICA_FAILOVER_BAD_NODE_EXPIRATION = 60000;
+  
+  public static final int DEFAULT_DISTRIBUPDATECONNTIMEOUT = 60000;
+  public static final int DEFAULT_DISTRIBUPDATESOTIMEOUT = 600000;
 
   protected static final String DEFAULT_CORE_ADMIN_PATH = "/admin/cores";
 
   public String getSolrHostPort() {
-    return get(CfgProp.SOLR_HOSTPORT, null);
+    return getString(CfgProp.SOLR_HOSTPORT, null);
   }
 
   public String getZkHostContext() {
-    return get(CfgProp.SOLR_HOSTCONTEXT, null);
+    return getString(CfgProp.SOLR_HOSTCONTEXT, null);
   }
 
   public String getHost() {
-    return get(CfgProp.SOLR_HOST, null);
+    return getString(CfgProp.SOLR_HOST, null);
   }
 
   public int getLeaderVoteWait() {
-    return get(CfgProp.SOLR_LEADERVOTEWAIT, DEFAULT_LEADER_VOTE_WAIT);
+    return getInt(CfgProp.SOLR_LEADERVOTEWAIT, DEFAULT_LEADER_VOTE_WAIT);
   }
   
   public int getLeaderConflictResolveWait() {
-    return get(CfgProp.SOLR_LEADERCONFLICTRESOLVEWAIT, DEFAULT_LEADER_CONFLICT_RESOLVE_WAIT);
+    return getInt(CfgProp.SOLR_LEADERCONFLICTRESOLVEWAIT, DEFAULT_LEADER_CONFLICT_RESOLVE_WAIT);
   }
   
   public int getAutoReplicaFailoverWaitAfterExpiration() {
-    return get(CfgProp.SOLR_AUTOREPLICAFAILOVERWAITAFTEREXPIRATION, DEFAULT_AUTO_REPLICA_FAILOVER_WAIT_AFTER_EXPIRATION);
+    return getInt(CfgProp.SOLR_AUTOREPLICAFAILOVERWAITAFTEREXPIRATION, DEFAULT_AUTO_REPLICA_FAILOVER_WAIT_AFTER_EXPIRATION);
   }
   
   public int getAutoReplicaFailoverWorkLoopDelay() {
-    return get(CfgProp.SOLR_AUTOREPLICAFAILOVERWORKLOOPDELAY, DEFAULT_AUTO_REPLICA_FAILOVER_WORKLOOP_DELAY);
+    return getInt(CfgProp.SOLR_AUTOREPLICAFAILOVERWORKLOOPDELAY, DEFAULT_AUTO_REPLICA_FAILOVER_WORKLOOP_DELAY);
   }
   
   public int getAutoReplicaFailoverBadNodeExpiration() {
-    return get(CfgProp.SOLR_AUTOREPLICAFAILOVERBADNODEEXPIRATION, DEFAULT_AUTO_REPLICA_FAILOVER_BAD_NODE_EXPIRATION);
+    return getInt(CfgProp.SOLR_AUTOREPLICAFAILOVERBADNODEEXPIRATION, DEFAULT_AUTO_REPLICA_FAILOVER_BAD_NODE_EXPIRATION);
   }
 
   public boolean getGenericCoreNodeNames() {
-    return get(CfgProp.SOLR_GENERICCORENODENAMES, false);
+    return getBoolean(CfgProp.SOLR_GENERICCORENODENAMES, false);
   }
 
   public int getDistributedConnectionTimeout() {
-    return get(CfgProp.SOLR_DISTRIBUPDATECONNTIMEOUT, 0);
+    return getInt(CfgProp.SOLR_DISTRIBUPDATECONNTIMEOUT, DEFAULT_DISTRIBUPDATECONNTIMEOUT);
   }
 
   public int getDistributedSocketTimeout() {
-    return get(CfgProp.SOLR_DISTRIBUPDATESOTIMEOUT, 0);
+    return getInt(CfgProp.SOLR_DISTRIBUPDATESOTIMEOUT, DEFAULT_DISTRIBUPDATESOTIMEOUT);
   }
   
   public int getMaxUpdateConnections() {
-    return get(CfgProp.SOLR_MAXUPDATECONNECTIONS, 10000);
+    return getInt(CfgProp.SOLR_MAXUPDATECONNECTIONS, 10000);
   }
 
   public int getMaxUpdateConnectionsPerHost() {
-    return get(CfgProp.SOLR_MAXUPDATECONNECTIONSPERHOST, 100);
+    return getInt(CfgProp.SOLR_MAXUPDATECONNECTIONSPERHOST, 100);
   }
 
   public int getCoreLoadThreadCount() {
-    return get(ConfigSolr.CfgProp.SOLR_CORELOADTHREADS, DEFAULT_CORE_LOAD_THREADS);
+    return getInt(ConfigSolr.CfgProp.SOLR_CORELOADTHREADS, DEFAULT_CORE_LOAD_THREADS);
   }
 
   public String getSharedLibDirectory() {
-    return get(ConfigSolr.CfgProp.SOLR_SHAREDLIB , null);
-  }
-
-  public String getDefaultCoreName() {
-    return get(CfgProp.SOLR_CORES_DEFAULT_CORE_NAME, null);
-  }
-
-  public abstract boolean isPersistent();
-
-  public String getAdminPath() {
-    return get(CfgProp.SOLR_ADMINPATH, DEFAULT_CORE_ADMIN_PATH);
+    return getString(ConfigSolr.CfgProp.SOLR_SHAREDLIB, null);
   }
 
   public String getCoreAdminHandlerClass() {
-    return get(CfgProp.SOLR_ADMINHANDLER, "org.apache.solr.handler.admin.CoreAdminHandler");
+    return getString(CfgProp.SOLR_ADMINHANDLER, "org.apache.solr.handler.admin.CoreAdminHandler");
   }
   
   public String getZkCredentialsProviderClass() {
-    return get(CfgProp.SOLR_ZKCREDENTIALSPROVIDER, null);
+    return getString(CfgProp.SOLR_ZKCREDENTIALSPROVIDER, null);
   }
 
   public String getZkACLProviderClass() {
-    return get(CfgProp.SOLR_ZKACLPROVIDER, null);
+    return getString(CfgProp.SOLR_ZKACLPROVIDER, null);
   }
   
   public String getCollectionsHandlerClass() {
-    return get(CfgProp.SOLR_COLLECTIONSHANDLER, "org.apache.solr.handler.admin.CollectionsHandler");
+    return getString(CfgProp.SOLR_COLLECTIONSHANDLER, "org.apache.solr.handler.admin.CollectionsHandler");
   }
 
   public String getInfoHandlerClass() {
-    return get(CfgProp.SOLR_INFOHANDLER, "org.apache.solr.handler.admin.InfoHandler");
+    return getString(CfgProp.SOLR_INFOHANDLER, "org.apache.solr.handler.admin.InfoHandler");
   }
 
   public boolean hasSchemaCache() {
-    return get(ConfigSolr.CfgProp.SOLR_SHARESCHEMA, false);
+    return getBoolean(ConfigSolr.CfgProp.SOLR_SHARESCHEMA, false);
   }
 
   public String getManagementPath() {
-    return get(CfgProp.SOLR_MANAGEMENTPATH, null);
+    return getString(CfgProp.SOLR_MANAGEMENTPATH, null);
   }
 
   public String getConfigSetBaseDirectory() {
-    return get(CfgProp.SOLR_CONFIGSETBASEDIR, "configsets");
+    return getString(CfgProp.SOLR_CONFIGSETBASEDIR, "configsets");
   }
 
   public LogWatcherConfig getLogWatcherConfig() {
-    String loggingClass = get(CfgProp.SOLR_LOGGING_CLASS, null);
-    String loggingWatcherThreshold = get(CfgProp.SOLR_LOGGING_WATCHER_THRESHOLD, null);
+    String loggingClass = getString(CfgProp.SOLR_LOGGING_CLASS, null);
+    String loggingWatcherThreshold = getString(CfgProp.SOLR_LOGGING_WATCHER_THRESHOLD, null);
     return new LogWatcherConfig(
-        get(CfgProp.SOLR_LOGGING_ENABLED, true),
+        getBoolean(CfgProp.SOLR_LOGGING_ENABLED, true),
         loggingClass,
         loggingWatcherThreshold,
-        get(CfgProp.SOLR_LOGGING_WATCHER_SIZE, 50)
+        getInt(CfgProp.SOLR_LOGGING_WATCHER_SIZE, 50)
     );
   }
 
   public int getTransientCacheSize() {
-    return get(CfgProp.SOLR_TRANSIENTCACHESIZE, Integer.MAX_VALUE);
+    return getInt(CfgProp.SOLR_TRANSIENTCACHESIZE, Integer.MAX_VALUE);
   }
 
   public ConfigSetService createCoreConfigService(SolrResourceLoader loader, ZkController zkController) {
@@ -271,7 +242,7 @@ public abstract class ConfigSolr {
   }
 
   // Ugly for now, but we'll at least be able to centralize all of the differences between 4x and 5x.
-  protected static enum CfgProp {
+  public static enum CfgProp {
     SOLR_ADMINHANDLER,
     SOLR_COLLECTIONSHANDLER,
     SOLR_CORELOADTHREADS,
@@ -305,59 +276,44 @@ public abstract class ConfigSolr {
     
     SOLR_ZKCREDENTIALSPROVIDER,
     SOLR_ZKACLPROVIDER,
-    
-    //TODO: Remove all of these elements for 5.0
-    SOLR_PERSISTENT,
-    SOLR_CORES_DEFAULT_CORE_NAME,
-    SOLR_ADMINPATH
+
   }
 
-  protected Config config;
-  protected Map<CfgProp, Object> propMap = new HashMap<>();
+  protected final SolrResourceLoader loader;
+  protected final Properties solrProperties;
 
-  public ConfigSolr(Config config) {
-    this.config = config;
-    config.substituteProperties();
+  public ConfigSolr(SolrResourceLoader loader, Properties solrProperties) {
+    this.loader = loader;
+    this.solrProperties = solrProperties;
   }
 
-  // for extension & testing.
-  protected ConfigSolr() {
-
+  public ConfigSolr(SolrResourceLoader loader) {
+    this(loader, new Properties());
   }
-  
-  public Config getConfig() {
-    return config;
+
+  protected abstract String getProperty(CfgProp key);
+
+  private String getString(CfgProp key, String defaultValue) {
+    String v = getProperty(key);
+    return v == null ? defaultValue : v;
   }
 
-  @SuppressWarnings("unchecked")
-  public <T> T get(CfgProp key, T defaultValue) {
-    if (propMap.containsKey(key) && propMap.get(key) != null) {
-      return (T) propMap.get(key);
-    }
-    return defaultValue;
+  private int getInt(CfgProp key, int defaultValue) {
+    String v = getProperty(key);
+    return v == null ? defaultValue : Integer.parseInt(v);
   }
 
-  public Properties getSolrProperties(String path) {
-    try {
-      return readProperties(((NodeList) config.evaluate(
-          path, XPathConstants.NODESET)).item(0));
-    } catch (Exception e) {
-      SolrException.log(log, null, e);
-    }
-    return null;
+  private boolean getBoolean(CfgProp key, boolean defaultValue) {
+    String v = getProperty(key);
+    return v == null ? defaultValue : Boolean.parseBoolean(v);
+  }
 
+  public Properties getSolrProperties() {
+    return solrProperties;
   }
-  
-  protected Properties readProperties(Node node) throws XPathExpressionException {
-    XPath xpath = config.getXPath();
-    NodeList props = (NodeList) xpath.evaluate("property", node, XPathConstants.NODESET);
-    Properties properties = new Properties();
-    for (int i = 0; i < props.getLength(); i++) {
-      Node prop = props.item(i);
-      properties.setProperty(DOMUtil.getAttr(prop, "name"),
-          PropertiesUtil.substituteProperty(DOMUtil.getAttr(prop, "value"), null));
-    }
-    return properties;
+
+  public SolrResourceLoader getSolrResourceLoader() {
+    return loader;
   }
 
 }

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java Sun Feb  8 23:53:14 2015
@@ -17,24 +17,26 @@ package org.apache.solr.core;
  * limitations under the License.
  */
 
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.util.DOMUtil;
-
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
+import org.apache.solr.util.PropertiesUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
-import java.io.IOException;
-import java.util.List;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
 import java.util.ArrayList;
-import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
 
 
 /**
@@ -45,51 +47,28 @@ public class ConfigSolrXml extends Confi
   protected static Logger log = LoggerFactory.getLogger(ConfigSolrXml.class);
 
   private final CoresLocator coresLocator;
+  private final Config config;
+  private final Map<CfgProp, Object> propMap = new HashMap<>();
 
   public ConfigSolrXml(Config config) {
-    super(config);
-    try {
-      checkForIllegalConfig();
-      fillPropMap();
-      coresLocator = new CorePropertiesLocator(getCoreRootDirectory());
-    } catch (IOException e) {
-      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
-    }
+    super(config.getResourceLoader(), loadProperties(config));
+    this.config = config;
+    this.config.substituteProperties();
+    checkForIllegalConfig();
+    fillPropMap();
+    coresLocator = new CorePropertiesLocator(getCoreRootDirectory());
   }
 
-  private void checkForIllegalConfig() throws IOException {
+  private void checkForIllegalConfig() {
 
-    // Do sanity checks - we don't want to find old style config
     failIfFound("solr/@coreLoadThreads");
     failIfFound("solr/@persistent");
     failIfFound("solr/@sharedLib");
     failIfFound("solr/@zkHost");
 
-    failIfFound("solr/logging/@class");
-    failIfFound("solr/logging/@enabled");
-    failIfFound("solr/logging/watcher/@size");
-    failIfFound("solr/logging/watcher/@threshold");
-
-    failIfFound("solr/cores/@adminHandler");
-    failIfFound("solr/cores/@distribUpdateConnTimeout");
-    failIfFound("solr/cores/@distribUpdateSoTimeout");
-    failIfFound("solr/cores/@host");
-    failIfFound("solr/cores/@hostContext");
-    failIfFound("solr/cores/@hostPort");
-    failIfFound("solr/cores/@leaderVoteWait");
-    failIfFound("solr/cores/@leaderConflictResolveWait");
-    failIfFound("solr/cores/@genericCoreNodeNames");
-    failIfFound("solr/cores/@managementPath");
-    failIfFound("solr/cores/@shareSchema");
-    failIfFound("solr/cores/@transientCacheSize");
-    failIfFound("solr/cores/@zkClientTimeout");
-
-    // These have no counterpart in 5.0, asking for any of these in Solr 5.0
-    // will result in an error being
-    // thrown.
-    failIfFound("solr/cores/@defaultCoreName");
+    failIfFound("solr/cores");
+
     failIfFound("solr/@persistent");
-    failIfFound("solr/cores/@adminPath");
 
   }
 
@@ -97,7 +76,32 @@ public class ConfigSolrXml extends Confi
 
     if (config.getVal(xPath, false) != null) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Should not have found " + xPath +
-          " solr.xml may be a mix of old and new style formats.");
+          "\n. Please upgrade your solr.xml: https://cwiki.apache.org/confluence/display/solr/Format+of+solr.xml");
+    }
+  }
+
+  protected String getProperty(CfgProp key) {
+    if (!propMap.containsKey(key) || propMap.get(key) == null)
+      return null;
+    return propMap.get(key).toString();
+  }
+
+  private static Properties loadProperties(Config config) {
+    try {
+      Node node = ((NodeList) config.evaluate("solr", XPathConstants.NODESET)).item(0);
+      XPath xpath = config.getXPath();
+      NodeList props = (NodeList) xpath.evaluate("property", node, XPathConstants.NODESET);
+      Properties properties = new Properties();
+      for (int i = 0; i < props.getLength(); i++) {
+        Node prop = props.item(i);
+        properties.setProperty(DOMUtil.getAttr(prop, "name"),
+            PropertiesUtil.substituteProperty(DOMUtil.getAttr(prop, "value"), null));
+      }
+      return properties;
+    }
+    catch (XPathExpressionException e) {
+      log.warn("Error parsing solr.xml: " + e.getMessage());
+      return null;
     }
   }
 
@@ -247,24 +251,9 @@ public class ConfigSolrXml extends Confi
     }
   }
 
-  @Override
-  public String getDefaultCoreName() {
-    return "collection1";
-  }
-
-  @Override
-  public boolean isPersistent() {
-    return true;
-  }
-
-  @Override
-  protected String getShardHandlerFactoryConfigPath() {
-    return "solr/shardHandlerFactory";
-  }
-
-  @Override
-  public String getAdminPath() {
-    return DEFAULT_CORE_ADMIN_PATH;
+  public PluginInfo getShardHandlerFactoryPluginInfo() {
+    Node node = config.getNode("solr/shardHandlerFactory", false);
+    return (node == null) ? null : new PluginInfo(node, "shardHandlerFactory", false, true);
   }
 
   @Override

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CoreContainer.java Sun Feb  8 23:53:14 2015
@@ -17,21 +17,8 @@
 
 package org.apache.solr.core;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.cloud.ZkSolrResourceLoader;
 import org.apache.solr.common.SolrException;
@@ -51,8 +38,20 @@ import org.apache.zookeeper.KeeperExcept
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 
 /**
@@ -102,9 +101,14 @@ public class CoreContainer {
   protected final CoresLocator coresLocator;
   
   private String hostName;
+
   private final JarRepository jarRepository = new JarRepository(this);
-  
-  private Map<String ,SolrRequestHandler> containerHandlers = new HashMap<>();
+
+  public static final String CORES_HANDLER_PATH = "/admin/cores";
+  public static final String COLLECTIONS_HANDLER_PATH = "/admin/collections";
+  public static final String INFO_HANDLER_PATH = "/admin/info";
+
+  private Map<String, SolrRequestHandler> containerHandlers = new HashMap<>();
 
   public SolrRequestHandler getRequestHandler(String path) {
     return RequestHandlerBase.getRequestHandler(path, containerHandlers);
@@ -112,7 +116,6 @@ public class CoreContainer {
 
   public Map<String, SolrRequestHandler> getRequestHandlers(){
     return this.containerHandlers;
-
   }
 
  // private ClientConnectionManager clientConnectionManager = new PoolingClientConnectionManager();
@@ -137,7 +140,7 @@ public class CoreContainer {
    * @see #load()
    */
   public CoreContainer(SolrResourceLoader loader) {
-    this(loader, ConfigSolr.fromSolrHome(loader, loader.getInstanceDir()));
+    this(ConfigSolr.fromSolrHome(loader, loader.getInstanceDir()));
   }
 
   /**
@@ -154,19 +157,15 @@ public class CoreContainer {
    * Create a new CoreContainer using the given SolrResourceLoader,
    * configuration and CoresLocator.  The container's cores are
    * not loaded.
-   * @param loader the SolrResourceLoader
    * @param config a ConfigSolr representation of this container's configuration
    * @see #load()
    */
-  public CoreContainer(SolrResourceLoader loader, ConfigSolr config) {
-    this.loader = checkNotNull(loader);
-    this.solrHome = loader.getInstanceDir();
-    this.cfg = checkNotNull(config);
-    this.coresLocator = config.getCoresLocator();
+  public CoreContainer(ConfigSolr config) {
+    this(config, config.getCoresLocator());
   }
 
-  public CoreContainer(SolrResourceLoader loader, ConfigSolr config, CoresLocator locator) {
-    this.loader = checkNotNull(loader);
+  public CoreContainer(ConfigSolr config, CoresLocator locator) {
+    this.loader = config.getSolrResourceLoader();
     this.solrHome = loader.getInstanceDir();
     this.cfg = checkNotNull(config);
     this.coresLocator = locator;
@@ -194,8 +193,13 @@ public class CoreContainer {
    */
   public static CoreContainer createAndLoad(String solrHome, File configFile) {
     SolrResourceLoader loader = new SolrResourceLoader(solrHome);
-    CoreContainer cc = new CoreContainer(loader, ConfigSolr.fromFile(loader, configFile));
-    cc.load();
+    CoreContainer cc = new CoreContainer(ConfigSolr.fromFile(loader, configFile));
+    try {
+      cc.load();
+    } catch (Exception e) {
+      cc.shutdown();
+      throw e;
+    }
     return cc;
   }
   
@@ -238,15 +242,15 @@ public class CoreContainer {
     zkSys.initZooKeeper(this, solrHome, cfg);
 
     collectionsHandler = createHandler(cfg.getCollectionsHandlerClass(), CollectionsHandler.class);
-    containerHandlers.put("/admin/collections" , collectionsHandler);
+    containerHandlers.put(COLLECTIONS_HANDLER_PATH, collectionsHandler);
     infoHandler        = createHandler(cfg.getInfoHandlerClass(), InfoHandler.class);
-    containerHandlers.put("/admin/info" , infoHandler);
+    containerHandlers.put(INFO_HANDLER_PATH, infoHandler);
     coreAdminHandler   = createHandler(cfg.getCoreAdminHandlerClass(), CoreAdminHandler.class);
-    containerHandlers.put(cfg.getAdminPath() , coreAdminHandler);
+    containerHandlers.put(CORES_HANDLER_PATH, coreAdminHandler);
 
     coreConfigService = cfg.createCoreConfigService(loader, zkSys.getZkController());
 
-    containerProperties = cfg.getSolrProperties("solr");
+    containerProperties = cfg.getSolrProperties();
 
     // setup executor to load cores in parallel
     // do not limit the size of the executor in zk mode since cores may try and wait for each other.
@@ -341,10 +345,9 @@ public class CoreContainer {
     }
 
     try {
-      coreAdminHandler.shutdown();
+      if (coreAdminHandler != null) coreAdminHandler.shutdown();
     } catch (Exception e) {
-      log.warn("Error shutting down CoreAdminHandler. Continuing to close CoreContainer.");
-      e.printStackTrace();
+      log.warn("Error shutting down CoreAdminHandler. Continuing to close CoreContainer.", e);
     }
 
     try {
@@ -519,11 +522,15 @@ public class CoreContainer {
 
       return core;
 
-    }
-    catch (Exception e) {
+    } catch (Exception e) {
       coreInitFailures.put(dcore.getName(), new CoreLoadFailure(dcore, e));
       log.error("Error creating core [{}]: {}", dcore.getName(), e.getMessage(), e);
       throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to create core [" + dcore.getName() + "]", e);
+    } catch (Throwable t) {
+      SolrException e = new SolrException(ErrorCode.SERVER_ERROR, "JVM Error creating core [" + dcore.getName() + "]: " + t.getMessage(), t);
+      log.error("Error creating core [{}]: {}", dcore.getName(), t.getMessage(), t);
+      coreInitFailures.put(dcore.getName(), new CoreLoadFailure(dcore, e));
+      throw t;
     }
 
   }
@@ -591,8 +598,6 @@ public class CoreContainer {
    */
   public void reload(String name) {
 
-    name = checkDefault(name);
-
     SolrCore core = solrCores.getCoreFromAnyList(name, false);
     if (core == null)
       throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name );
@@ -615,11 +620,6 @@ public class CoreContainer {
 
   }
 
-  //5.0 remove all checkDefaults?
-  private String checkDefault(String name) {
-    return (null == name || name.isEmpty()) ? getDefaultCoreName() : name;
-  } 
-
   /**
    * Swaps two SolrCore descriptors.
    */
@@ -627,8 +627,6 @@ public class CoreContainer {
     if( n0 == null || n1 == null ) {
       throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Can not swap unnamed cores." );
     }
-    n0 = checkDefault(n0);
-    n1 = checkDefault(n1);
     solrCores.swap(n0, n1);
 
     coresLocator.swap(this, solrCores.getCoreDescriptor(n0), solrCores.getCoreDescriptor(n1));
@@ -654,8 +652,6 @@ public class CoreContainer {
    */
   public void unload(String name, boolean deleteIndexDir, boolean deleteDataDir, boolean deleteInstanceDir) {
 
-    name = checkDefault(name);
-
     // check for core-init errors first
     CoreLoadFailure loadFailure = coreInitFailures.remove(name);
     if (loadFailure != null) {
@@ -707,7 +703,6 @@ public class CoreContainer {
     try (SolrCore core = getCore(name)) {
       if (core != null) {
         registerCore(toName, core, true);
-        name = checkDefault(name);
         SolrCore old = solrCores.remove(name);
         coresLocator.rename(this, old.getCoreDescriptor(), core.getCoreDescriptor());
       }
@@ -745,8 +740,6 @@ public class CoreContainer {
    */
   public SolrCore getCore(String name) {
 
-    name = checkDefault(name);
-
     // Do this in two phases since we don't want to lock access to the cores over a load.
     SolrCore core = solrCores.getCoreFromAnyList(name, true);
 
@@ -813,26 +806,6 @@ public class CoreContainer {
     return infoHandler;
   }
 
-  // ---------------- Multicore self related methods ---------------
-
-  /**
-   * the default core name, or null if there is no default core name
-   */
-  public String getDefaultCoreName() {
-    return cfg.getDefaultCoreName();
-  }
-
-  // all of the following properties aren't synchronized
-  // but this should be OK since they normally won't be changed rapidly
-  @Deprecated
-  public boolean isPersistent() {
-    return cfg.isPersistent();
-  }
-  
-  public String getAdminPath() {
-    return cfg.getAdminPath();
-  }
-  
   public String getHostName() {
     return this.hostName;
   }

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java Sun Feb  8 23:53:14 2015
@@ -23,7 +23,7 @@ import org.apache.commons.lang.StringUti
 import org.apache.solr.cloud.CloudDescriptor;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.util.IOUtils;
+import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.util.PropertiesUtil;
 
 import java.io.File;

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java Sun Feb  8 23:53:14 2015
@@ -18,8 +18,9 @@ package org.apache.solr.core;
  */
 
 import com.google.common.collect.Lists;
+
 import org.apache.solr.common.SolrException;
-import org.apache.solr.util.IOUtils;
+import org.apache.solr.common.util.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java Sun Feb  8 23:53:14 2015
@@ -21,6 +21,7 @@ import static org.apache.hadoop.fs.Commo
 
 import java.io.IOException;
 import java.net.URI;
+import java.net.URL;
 import java.net.URLEncoder;
 import java.util.Locale;
 
@@ -37,6 +38,7 @@ import org.apache.solr.cloud.ZkControlle
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.store.blockcache.BlockCache;
 import org.apache.solr.store.blockcache.BlockDirectory;
@@ -47,11 +49,10 @@ import org.apache.solr.store.blockcache.
 import org.apache.solr.store.hdfs.HdfsDirectory;
 import org.apache.solr.store.hdfs.HdfsLockFactory;
 import org.apache.solr.util.HdfsUtil;
-import org.apache.solr.util.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class HdfsDirectoryFactory extends CachingDirectoryFactory {
+public class HdfsDirectoryFactory extends CachingDirectoryFactory implements SolrInfoMBean {
   public static Logger LOG = LoggerFactory
       .getLogger(HdfsDirectoryFactory.class);
   
@@ -60,7 +61,7 @@ public class HdfsDirectoryFactory extend
   public static final String BLOCKCACHE_ENABLED = "solr.hdfs.blockcache.enabled";
   public static final String BLOCKCACHE_GLOBAL = "solr.hdfs.blockcache.global";
   public static final String BLOCKCACHE_READ_ENABLED = "solr.hdfs.blockcache.read.enabled";
-  public static final String BLOCKCACHE_WRITE_ENABLED = "solr.hdfs.blockcache.write.enabled";
+  public static final String BLOCKCACHE_WRITE_ENABLED = "solr.hdfs.blockcache.write.enabled"; // currently buggy and disabled
   
   public static final String NRTCACHINGDIRECTORY_ENABLE = "solr.hdfs.nrtcachingdirectory.enable";
   public static final String NRTCACHINGDIRECTORY_MAXMERGESIZEMB = "solr.hdfs.nrtcachingdirectory.maxmergesizemb";
@@ -86,16 +87,22 @@ public class HdfsDirectoryFactory extend
   public static Metrics metrics;
   private static Boolean kerberosInit;
   
+  private final static class MetricsHolder {
+    // [JCIP SE, Goetz, 16.6] Lazy initialization
+    // Won't load until MetricsHolder is referenced
+    public static final Metrics metrics = new Metrics();
+  }
+
   @Override
   public void init(NamedList args) {
     params = SolrParams.toSolrParams(args);
-    this.hdfsDataDir = params.get(HDFS_HOME);
+    this.hdfsDataDir = getConfig(HDFS_HOME, null);
     if (this.hdfsDataDir != null && this.hdfsDataDir.length() == 0) {
       this.hdfsDataDir = null;
     } else {
       LOG.info(HDFS_HOME + "=" + this.hdfsDataDir);
     }
-    boolean kerberosEnabled = params.getBool(KERBEROS_ENABLED, false);
+    boolean kerberosEnabled = getConfig(KERBEROS_ENABLED, false);
     LOG.info("Solr Kerberos Authentication "
         + (kerberosEnabled ? "enabled" : "disabled"));
     if (kerberosEnabled) {
@@ -125,32 +132,27 @@ public class HdfsDirectoryFactory extend
 
   @Override
   protected Directory create(String path, LockFactory lockFactory, DirContext dirContext) throws IOException {
+    assert params != null : "init must be called before create";
     LOG.info("creating directory factory for path {}", path);
     Configuration conf = getConf();
     
     if (metrics == null) {
-      metrics = new Metrics(conf);
+      metrics = MetricsHolder.metrics;
     }
     
-    boolean blockCacheEnabled = params.getBool(BLOCKCACHE_ENABLED, true);
-    boolean blockCacheGlobal = params.getBool(BLOCKCACHE_GLOBAL, false); // default to false for back compat
-    boolean blockCacheReadEnabled = params.getBool(BLOCKCACHE_READ_ENABLED, true);
-    boolean blockCacheWriteEnabled = params.getBool(BLOCKCACHE_WRITE_ENABLED, false);
-    
-    if (blockCacheWriteEnabled) {
-      LOG.warn("Using " + BLOCKCACHE_WRITE_ENABLED + " is currently buggy and can result in readers seeing a corrupted view of the index.");
-    }
+    boolean blockCacheEnabled = getConfig(BLOCKCACHE_ENABLED, true);
+    boolean blockCacheGlobal = getConfig(BLOCKCACHE_GLOBAL, false); // default to false for back compat
+    boolean blockCacheReadEnabled = getConfig(BLOCKCACHE_READ_ENABLED, true);
     
     final Directory dir;
     if (blockCacheEnabled && dirContext != DirContext.META_DATA) {
-      int numberOfBlocksPerBank = params.getInt(NUMBEROFBLOCKSPERBANK, 16384);
+      int numberOfBlocksPerBank = getConfig(NUMBEROFBLOCKSPERBANK, 16384);
       
       int blockSize = BlockDirectory.BLOCK_SIZE;
       
-      int bankCount = params.getInt(BLOCKCACHE_SLAB_COUNT, 1);
+      int bankCount = getConfig(BLOCKCACHE_SLAB_COUNT, 1);
       
-      boolean directAllocation = params.getBool(
-          BLOCKCACHE_DIRECT_MEMORY_ALLOCATION, true);
+      boolean directAllocation = getConfig(BLOCKCACHE_DIRECT_MEMORY_ALLOCATION, true);
       
       int slabSize = numberOfBlocksPerBank * blockSize;
       LOG.info(
@@ -161,8 +163,8 @@ public class HdfsDirectoryFactory extend
           new Object[] {slabSize, bankCount,
               ((long) bankCount * (long) slabSize)});
       
-      int bufferSize = params.getInt("solr.hdfs.blockcache.bufferstore.buffersize", 128);
-      int bufferCount = params.getInt("solr.hdfs.blockcache.bufferstore.buffercount", 128 * 128);
+      int bufferSize = getConfig("solr.hdfs.blockcache.bufferstore.buffersize", 128);
+      int bufferCount = getConfig("solr.hdfs.blockcache.bufferstore.buffercount", 128 * 128);
       
       BlockCache blockCache = getBlockDirectoryCache(numberOfBlocksPerBank,
           blockSize, bankCount, directAllocation, slabSize,
@@ -170,25 +172,51 @@ public class HdfsDirectoryFactory extend
       
       Cache cache = new BlockDirectoryCache(blockCache, path, metrics, blockCacheGlobal);
       HdfsDirectory hdfsDirectory = new HdfsDirectory(new Path(path), lockFactory, conf);
-      dir = new BlockDirectory(path, hdfsDirectory, cache, null,
-          blockCacheReadEnabled, blockCacheWriteEnabled);
+      dir = new BlockDirectory(path, hdfsDirectory, cache, null, blockCacheReadEnabled, false);
     } else {
       dir = new HdfsDirectory(new Path(path), lockFactory, conf);
     }
     
-    boolean nrtCachingDirectory = params.getBool(NRTCACHINGDIRECTORY_ENABLE, true);
+    boolean nrtCachingDirectory = getConfig(NRTCACHINGDIRECTORY_ENABLE, true);
     if (nrtCachingDirectory) {
-      double nrtCacheMaxMergeSizeMB = params.getInt(
-          NRTCACHINGDIRECTORY_MAXMERGESIZEMB, 16);
-      double nrtCacheMaxCacheMB = params.getInt(NRTCACHINGDIRECTORY_MAXCACHEMB,
-          192);
+      double nrtCacheMaxMergeSizeMB = getConfig(NRTCACHINGDIRECTORY_MAXMERGESIZEMB, 16);
+      double nrtCacheMaxCacheMB = getConfig(NRTCACHINGDIRECTORY_MAXCACHEMB, 192);
       
-      return new NRTCachingDirectory(dir, nrtCacheMaxMergeSizeMB,
-          nrtCacheMaxCacheMB);
+      return new NRTCachingDirectory(dir, nrtCacheMaxMergeSizeMB, nrtCacheMaxCacheMB);
     }
     return dir;
   }
 
+  boolean getConfig(String name, boolean defaultValue) {
+    Boolean value = params.getBool(name);
+    if (value == null) {
+      String sysValue = System.getProperty(name);
+      if (sysValue != null) {
+        value = Boolean.valueOf(sysValue);
+      }
+    }
+    return value == null ? defaultValue : value;
+  }
+  
+  int getConfig(String name, int defaultValue) {
+    Integer value = params.getInt(name);
+    if (value == null) {
+      String sysValue = System.getProperty(name);
+      if (sysValue != null) {
+        value = Integer.parseInt(sysValue);
+      }
+    }
+    return value == null ? defaultValue : value;
+  }
+
+  String getConfig(String name, String defaultValue) {
+    String value = params.get(name);
+    if (value == null) {
+      value = System.getProperty(name);
+    }
+    return value == null ? defaultValue : value;
+  }
+  
   private BlockCache getBlockDirectoryCache(int numberOfBlocksPerBank, int blockSize, int bankCount,
       boolean directAllocation, int slabSize, int bufferSize, int bufferCount, boolean staticBlockCache) {
     if (!staticBlockCache) {
@@ -245,7 +273,7 @@ public class HdfsDirectoryFactory extend
   
   private Configuration getConf() {
     Configuration conf = new Configuration();
-    confDir = params.get(CONFIG_DIRECTORY, null);
+    confDir = getConfig(CONFIG_DIRECTORY, null);
     HdfsUtil.addHdfsResources(conf, confDir);
     return conf;
   }
@@ -322,12 +350,12 @@ public class HdfsDirectoryFactory extend
   }
   
   private void initKerberos() {
-    String keytabFile = params.get(KERBEROS_KEYTAB, "").trim();
+    String keytabFile = getConfig(KERBEROS_KEYTAB, "").trim();
     if (keytabFile.length() == 0) {
       throw new IllegalArgumentException(KERBEROS_KEYTAB + " required because "
           + KERBEROS_ENABLED + " set to true");
     }
-    String principal = params.get(KERBEROS_PRINCIPAL, "");
+    String principal = getConfig(KERBEROS_PRINCIPAL, "");
     if (principal.length() == 0) {
       throw new IllegalArgumentException(KERBEROS_PRINCIPAL
           + " required because " + KERBEROS_ENABLED + " set to true");
@@ -359,4 +387,45 @@ public class HdfsDirectoryFactory extend
       }
     }
   }
+
+  // SolrInfoMBean methods
+
+  @Override
+  public String getName() {
+    return getClass().getSimpleName() + "BlockCache";
+  }
+
+  @Override
+  public String getVersion() {
+    return SolrCore.version;
+  }
+
+  @Override
+  public String getDescription() {
+    return "Provides metrics for the HdfsDirectoryFactory BlockCache.";
+  }
+
+  @Override
+  public Category getCategory() {
+    return Category.CACHE;
+  }
+
+  @Override
+  public String getSource() {
+    return null;
+  }
+
+  @Override
+  public URL[] getDocs() {
+    return null;
+  }
+
+  @Override
+  public NamedList<?> getStatistics() {
+    if (metrics == null) {
+      return new NamedList<Object>();
+    }
+
+    return metrics.getStatistics();
+  }
 }

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/IndexDeletionPolicyWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/IndexDeletionPolicyWrapper.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/IndexDeletionPolicyWrapper.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/IndexDeletionPolicyWrapper.java Sun Feb  8 23:53:14 2015
@@ -21,6 +21,8 @@ import org.apache.lucene.index.IndexDele
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.store.Directory;
 import org.apache.solr.update.SolrIndexWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.*;
@@ -43,6 +45,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 final IndexDeletionPolicy deletionPolicy;
   private volatile Map<Long, IndexCommit> solrVersionVsCommits = new ConcurrentHashMap<>();
   private final Map<Long, Long> reserves = new ConcurrentHashMap<>();
@@ -82,7 +86,11 @@ public final class IndexDeletionPolicyWr
 
       // this is the common success case: the older time didn't exist, or
       // came before the new time.
-      if (previousTime == null || previousTime <= timeToSet) break;
+      if (previousTime == null || previousTime <= timeToSet) {
+        LOG.debug("Commit point reservation for generation {} set to {} (requested reserve time of {})",
+            indexGen, timeToSet, reserveTime);
+        break;
+      }
 
       // At this point, we overwrote a longer reservation, so we want to restore the older one.
       // the problem is that an even longer reservation may come in concurrently

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java Sun Feb  8 23:53:14 2015
@@ -60,9 +60,8 @@ public abstract class IndexReaderFactory
   /**
    * Creates a new IndexReader instance using the given IndexWriter.
    * <p>
-   * This is used for opening the initial reader in NRT mode ({@code nrtMode=true}
-   * in solrconfig.xml)
-   * 
+   * This is used for opening the initial reader in NRT mode
+   *
    * @param writer IndexWriter
    * @param core {@link SolrCore} instance where this reader will be used. NOTE:
    * this SolrCore instance may not be fully configured yet, but basic things like

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/InitParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/InitParams.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/InitParams.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/InitParams.java Sun Feb  8 23:53:14 2015
@@ -65,7 +65,8 @@ public class InitParams {
   private static boolean matchPath(String path, String name){
     List<String> pathSplit = StrUtils.splitSmart(path, '/');
     List<String> nameSplit = StrUtils.splitSmart(name, '/');
-    for (int i = 0; i < nameSplit.size(); i++) {
+    int i = 0;
+    for (;i < nameSplit.size(); i++) {
       String s = nameSplit.get(i);
       String ps = pathSplit.size()>i ?  pathSplit.get(i) :null;
       if(ps == null) return false;
@@ -74,7 +75,8 @@ public class InitParams {
       if("**".equals(ps)) return true;
       return false;
     }
-    return true;
+    String ps = pathSplit.size()>i ?  pathSplit.get(i) :null;
+    return "*".equals(ps) || "**".equals(ps);
 
   }
 

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/JarRepository.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/JarRepository.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/JarRepository.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/JarRepository.java Sun Feb  8 23:53:14 2015
@@ -23,8 +23,11 @@ import static org.apache.solr.common.clo
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.zip.ZipEntry;
@@ -48,6 +51,18 @@ import org.slf4j.LoggerFactory;
  */
 public class JarRepository {
   public static Logger log = LoggerFactory.getLogger(JarRepository.class);
+
+  static final Random RANDOM;
+  static {
+    // We try to make things reproducible in the context of our tests by initializing the random instance
+    // based on the current seed
+    String seed = System.getProperty("tests.seed");
+    if (seed == null) {
+      RANDOM = new Random();
+    } else {
+      RANDOM = new Random(seed.hashCode());
+    }
+  }
   
   private final CoreContainer coreContainer;
   
@@ -71,8 +86,10 @@ public class JarRepository {
         ClusterState cs = this.coreContainer.getZkController().getZkStateReader().getClusterState();
         DocCollection coll = cs.getCollectionOrNull(CollectionsHandler.SYSTEM_COLL);
         if (coll == null) throw new SolrException(SERVICE_UNAVAILABLE, ".system collection not available");
-        Slice slice = coll.getActiveSlices().iterator().next();
-        if (slice == null) throw new SolrException(SERVICE_UNAVAILABLE, ".no active slices for .system collection");
+        ArrayList<Slice> slices = new ArrayList<>(coll.getActiveSlices());
+        if (slices.isEmpty()) throw new SolrException(SERVICE_UNAVAILABLE, ".no active slices for .system collection");
+        Collections.shuffle(slices, RANDOM); //do load balancing
+        Slice slice = slices.get(0) ;
         Replica replica = slice.getReplicas().iterator().next();
         if (replica == null) throw new SolrException(SERVICE_UNAVAILABLE, ".no active replica available for .system collection");
         String url = replica.getStr(BASE_URL_PROP) + "/.system/blob/" + key + "?wt=filestream";

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/JmxMonitoredMap.java Sun Feb  8 23:53:14 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.core;
 
+import org.apache.lucene.store.AlreadyClosedException;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrConfig.JmxConfiguration;
@@ -279,7 +280,9 @@ public class JmxMonitoredMap<K, V> exten
           }
         }
       } catch (Exception e) {
-        LOG.warn("Could not getStatistics on info bean {}", infoBean.getName(), e);
+        // don't log issue if the core is closing
+        if (!(SolrException.getRootCause(e) instanceof AlreadyClosedException))
+          LOG.warn("Could not getStatistics on info bean {}", infoBean.getName(), e);
       }
 
       MBeanAttributeInfo[] attrInfoArr = attrInfoList

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/PluginInfo.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/PluginInfo.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/PluginInfo.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/PluginInfo.java Sun Feb  8 23:53:14 2015
@@ -40,7 +40,7 @@ public class PluginInfo implements MapSe
   public final List<PluginInfo> children;
   private boolean isFromSolrConfig;
 
-  public PluginInfo(String type, Map<String, String> attrs ,NamedList initArgs, List<PluginInfo> children) {
+  public PluginInfo(String type, Map<String, String> attrs, NamedList initArgs, List<PluginInfo> children) {
     this.type = type;
     this.name = attrs.get(NAME);
     this.className = attrs.get(CLASS_NAME);
@@ -63,12 +63,15 @@ public class PluginInfo implements MapSe
 
   public PluginInfo(String type, Map<String,Object> map) {
     LinkedHashMap m = new LinkedHashMap<>(map);
-    NamedList nl = new NamedList();
-    for (String s : asList(DEFAULTS, APPENDS, INVARIANTS)) if (m.get(s) != null) nl.add(s, map.remove(s));
+    initArgs = new NamedList();
+    for (Map.Entry<String, Object> entry : map.entrySet()) {
+      Object value = entry.getValue();
+      if (value instanceof Map) value = new NamedList((Map) value);
+      initArgs.add(entry.getKey(), value);
+    }
     this.type = type;
     this.name = (String) m.get(NAME);
     this.className = (String) m.get(CLASS_NAME);
-    this.initArgs = nl;
     attributes = unmodifiableMap(m);
     this.children =  Collections.<PluginInfo>emptyList();
     isFromSolrConfig = true;

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/RequestHandlers.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/RequestHandlers.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/RequestHandlers.java Sun Feb  8 23:53:14 2015
@@ -433,14 +433,14 @@ public final class RequestHandlers {
         return;
       }
 
-      version = _pluginInfo.attributes.get("version");
-      if (version == null) {
+      if (_pluginInfo.attributes.get("version") == null ){
         errMsg = "ERROR 'lib' attribute must be accompanied with version also";
         unrecoverable = true;
         _handler = this;
         log.error(errMsg);
         return;
       }
+      version = String.valueOf(_pluginInfo.attributes.get("version"));
       classLoader = new MemClassLoader(this);
     }
 
@@ -494,7 +494,7 @@ public final class RequestHandlers {
     public void close() throws Exception {
       super.close();
       if (_closed) return;
-      classLoader.releaseJar();
+      if(classLoader != null) classLoader.releaseJar();
       _closed = true;
     }
   }

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/RequestParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/RequestParams.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/RequestParams.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/RequestParams.java Sun Feb  8 23:53:14 2015
@@ -23,6 +23,7 @@ import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.solr.cloud.ZkSolrResourceLoader;
@@ -58,7 +59,7 @@ public class RequestParams implements Ma
         Map.Entry e = (Map.Entry) o;
         if (e.getValue() instanceof Map) {
           Map value = (Map) e.getValue();
-          Map copy = new LinkedHashMap<>(value);
+          Map copy = getMapCopy(value);
           Map meta = (Map) copy.remove("");
           this.paramsets.put((String) e.getKey(), new VersionedParams(Collections.unmodifiableMap(copy) ,meta));
         }
@@ -67,6 +68,32 @@ public class RequestParams implements Ma
     this.znodeVersion = znodeVersion;
   }
 
+  private static Map getMapCopy(Map value) {
+    Map copy = new LinkedHashMap<>();
+    for (Object o1 : value.entrySet()) {
+      Map.Entry entry = (Map.Entry) o1;
+      if("".equals( entry.getKey())){
+        copy.put(entry.getKey(),entry.getValue());
+        continue;
+      }
+      if (entry.getValue() != null) {
+        if (entry.getValue() instanceof List) {
+          List l = (List) entry.getValue();
+          String[] sarr = new String[l.size()];
+          for (int i = 0; i < l.size(); i++) {
+            if( l.get(i) != null)  sarr[i]= String.valueOf(l.get(i));
+          }
+          copy.put(entry.getKey(), sarr);
+        } else {
+          copy.put(entry.getKey(), String.valueOf(entry.getValue()));
+        }
+      } else {
+        copy.put(entry.getKey(), entry.getValue());
+      }
+    }
+    return copy;
+  }
+
   public VersionedParams getParams(String name){
     return paramsets.get(name);
   }
@@ -77,7 +104,7 @@ public class RequestParams implements Ma
 
   @Override
   public Map<String, Object> toMap() {
-    return getMapWithVersion(data,znodeVersion);
+    return getMapWithVersion(data, znodeVersion);
   }
 
   public static Map<String, Object> getMapWithVersion(Map<String, Object> data, int znodeVersion) {
@@ -135,9 +162,9 @@ public class RequestParams implements Ma
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
       }
 
-    } else if(requestParams == null) {
+    } else  {
       Object[] o = getMapAndVersion(loader, RequestParams.RESOURCE);
-      requestParams = new RequestParams((Map) o[0],(Integer)o[1]);
+      requestParams = new RequestParams((Map) o[0], (Integer) o[1]);
     }
 
     return requestParams;

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrConfig.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrConfig.java Sun Feb  8 23:53:14 2015
@@ -193,7 +193,11 @@ public class SolrConfig extends Config i
       defaultIndexConfig = mainIndexConfig = null;
       indexConfigPrefix = "indexConfig";
     }
-    nrtMode = getBool(indexConfigPrefix+"/nrtMode", true);
+    assertWarnOrFail("The <nrtMode> config has been discontinued and NRT mode is always used by Solr." +
+            " This config will be removed in future versions.", getNode(indexConfigPrefix + "/nrtMode", false) == null,
+        true
+    );
+
     // Parse indexConfig section, using mainIndex as backup in case old config is used
     indexConfig = new SolrIndexConfig(this, "indexConfig", mainIndexConfig);
 
@@ -419,7 +423,6 @@ public class SolrConfig extends Config i
   public final int queryResultWindowSize;
   public final int queryResultMaxDocsCached;
   public final boolean enableLazyFieldLoading;
-  public final boolean nrtMode;
   // DocSet
   public final float hashSetInverseLoadFactor;
   public final int hashDocSetMaxSize;

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrCore.java Sun Feb  8 23:53:14 2015
@@ -17,6 +17,47 @@
 
 package org.apache.solr.core;
 
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Writer;
+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.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.xml.parsers.ParserConfigurationException;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.codecs.Codec;
 import org.apache.lucene.index.DirectoryReader;
@@ -38,6 +79,7 @@ import org.apache.solr.common.params.Com
 import org.apache.solr.common.params.CommonParams.EchoParamStyle;
 import org.apache.solr.common.params.SolrParams;
 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.SimpleOrderedMap;
 import org.apache.solr.core.DirectoryFactory.DirContext;
@@ -97,7 +139,6 @@ import org.apache.solr.update.processor.
 import org.apache.solr.update.processor.UpdateRequestProcessorChain;
 import org.apache.solr.update.processor.UpdateRequestProcessorFactory;
 import org.apache.solr.util.DefaultSolrThreadFactory;
-import org.apache.solr.util.IOUtils;
 import org.apache.solr.util.PropertiesInputStream;
 import org.apache.solr.util.RefCounted;
 import org.apache.solr.util.plugin.NamedListInitializedPlugin;
@@ -109,46 +150,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
 
-import javax.xml.parsers.ParserConfigurationException;
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Writer;
-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.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.ReentrantLock;
-
 /**
  *
  */
@@ -441,7 +442,7 @@ public final class SolrCore implements S
     solrCoreState.increfSolrCoreState();
     SolrCore currentCore;
     boolean indexDirChange = !getNewIndexDir().equals(getIndexDir());
-    if (indexDirChange || !coreConfig.getSolrConfig().nrtMode) {
+    if (indexDirChange) {
       // the directory is changing, don't pass on state
       currentCore = null;
     } else {
@@ -462,13 +463,6 @@ public final class SolrCore implements S
   }
 
 
-  // gets a non-caching searcher
-  public SolrIndexSearcher newSearcher(String name) throws IOException {
-    return new SolrIndexSearcher(this, getNewIndexDir(), getLatestSchema(), getSolrConfig().indexConfig, 
-                                 name, false, directoryFactory);
-  }
-
-
    private void initDirectoryFactory() {
     DirectoryFactory dirFactory;
     PluginInfo info = solrConfig.getPluginInfo(DirectoryFactory.class.getName());
@@ -542,7 +536,7 @@ public final class SolrCore implements S
         log.warn(logid+"Solr index directory '" + new File(indexDir) + "' doesn't exist."
                 + " Creating new index...");
 
-        SolrIndexWriter writer = SolrIndexWriter.create("SolrCore.initIndex", indexDir, getDirectoryFactory(), true, 
+        SolrIndexWriter writer = SolrIndexWriter.create(this, "SolrCore.initIndex", indexDir, getDirectoryFactory(), true, 
                                                         getLatestSchema(), solrConfig.indexConfig, solrDelPolicy, codec);
         writer.close();
       }
@@ -852,13 +846,7 @@ public final class SolrCore implements S
 
             @Override
             public DirectoryReader call() throws Exception {
-              if(getSolrConfig().nrtMode) {
-                // if in NRT mode, need to open from the previous writer
-                return indexReaderFactory.newReader(iw, core);
-              } else {
-                // if not NRT, need to create a new reader from the directory
-                return indexReaderFactory.newReader(iw.getDirectory(), core);
-              }
+              return indexReaderFactory.newReader(iw, core);
             }
           };
         }
@@ -1500,7 +1488,6 @@ public final class SolrCore implements S
 
     SolrIndexSearcher tmp;
     RefCounted<SolrIndexSearcher> newestSearcher = null;
-    boolean nrt = solrConfig.nrtMode && updateHandlerReopens;
 
     openSearcherLock.lock();
     try {
@@ -1509,7 +1496,7 @@ public final class SolrCore implements S
       String newIndexDirFile = null;
 
       // if it's not a normal near-realtime update, check that paths haven't changed.
-      if (!nrt) {
+      if (!updateHandlerReopens) {
         indexDirFile = getDirectoryFactory().normalize(getIndexDir());
         newIndexDirFile = getDirectoryFactory().normalize(newIndexDir);
       }
@@ -1521,7 +1508,7 @@ public final class SolrCore implements S
         }
       }
 
-      if (newestSearcher != null && (nrt || indexDirFile.equals(newIndexDirFile))) {
+      if (newestSearcher != null && (updateHandlerReopens || indexDirFile.equals(newIndexDirFile))) {
 
         DirectoryReader newReader;
         DirectoryReader currentReader = newestSearcher.get().getRawReader();
@@ -1531,12 +1518,11 @@ public final class SolrCore implements S
         RefCounted<IndexWriter> writer = getUpdateHandler().getSolrCoreState()
             .getIndexWriter(null);
         try {
-          if (writer != null && solrConfig.nrtMode) {
+          if (writer != null) {
             // if in NRT mode, open from the writer
             newReader = DirectoryReader.openIfChanged(currentReader, writer.get(), true);
           } else {
             // verbose("start reopen without writer, reader=", currentReader);
-            // if not in NRT mode, just re-open the reader
             newReader = DirectoryReader.openIfChanged(currentReader);
             // verbose("reopen result", newReader);
           }
@@ -1583,7 +1569,7 @@ public final class SolrCore implements S
           DirectoryReader newReader = newReaderCreator.call();
           tmp = new SolrIndexSearcher(this, newIndexDir, getLatestSchema(), 
               (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
-        } else if (solrConfig.nrtMode) {
+        } else  {
           RefCounted<IndexWriter> writer = getUpdateHandler().getSolrCoreState().getIndexWriter(this);
           DirectoryReader newReader = null;
           try {
@@ -1593,12 +1579,6 @@ public final class SolrCore implements S
           }
           tmp = new SolrIndexSearcher(this, newIndexDir, getLatestSchema(),
               (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
-        } else {
-         // normal open that happens at startup
-        // verbose("non-reopen START:");
-        tmp = new SolrIndexSearcher(this, newIndexDir, getLatestSchema(), getSolrConfig().indexConfig,
-                                    "main", true, directoryFactory);
-        // verbose("non-reopen DONE: searcher=",tmp);
         }
       }
 

Modified: lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=1658277&r1=1658276&r2=1658277&view=diff
==============================================================================
--- lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/dev/branches/lucene6005/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java Sun Feb  8 23:53:14 2015
@@ -18,6 +18,7 @@
 package org.apache.solr.core;
 
 import org.apache.lucene.analysis.util.CharFilterFactory;
+import org.apache.lucene.analysis.util.ResourceLoader;
 import org.apache.lucene.analysis.util.ResourceLoaderAware;
 import org.apache.lucene.analysis.util.TokenFilterFactory;
 import org.apache.lucene.analysis.util.TokenizerFactory;
@@ -26,7 +27,6 @@ import org.apache.lucene.codecs.Codec;
 import org.apache.lucene.codecs.DocValuesFormat;
 import org.apache.lucene.codecs.PostingsFormat;
 import org.apache.lucene.util.IOUtils;
-import org.apache.solr.common.ResourceLoader;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.handler.admin.CoreAdminHandler;
 import org.apache.solr.handler.component.SearchComponent;
@@ -519,41 +519,11 @@ public class SolrResourceLoader implemen
     return newInstance(name, expectedType, empty);
   }
 
-  public <T> T newInstance(String cname, Class<T> expectedType, String ... subpackages) {
-    Class<? extends T> clazz = findClass(cname, expectedType, subpackages);
-    if( clazz == null ) {
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
-          "Can not find class: "+cname + " in " + classLoader);
-    }
-    
-    T obj = null;
-    try {
-      obj = clazz.newInstance();
-    } 
-    catch (Exception e) {
-      throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
-          "Error instantiating class: '" + clazz.getName()+"'", e);
-    }
+  private static final Class[] NO_CLASSES = new Class[0];
+  private static final Object[] NO_OBJECTS = new Object[0];
 
-    if (!live) {
-      if( obj instanceof SolrCoreAware ) {
-        assertAwareCompatibility( SolrCoreAware.class, obj );
-        waitingForCore.add( (SolrCoreAware)obj );
-      }
-      if (org.apache.solr.util.plugin.ResourceLoaderAware.class.isInstance(obj)) {
-        log.warn("Class [{}] uses org.apache.solr.util.plugin.ResourceLoaderAware " +
-            "which is deprecated. Change to org.apache.lucene.analysis.util.ResourceLoaderAware.", cname);
-      }
-      if( obj instanceof ResourceLoaderAware ) {
-        assertAwareCompatibility( ResourceLoaderAware.class, obj );
-        waitingForResources.add( (ResourceLoaderAware)obj );
-      }
-      if (obj instanceof SolrInfoMBean){
-        //TODO: Assert here?
-        infoMBeans.add((SolrInfoMBean) obj);
-      }
-    }
-    return obj;
+  public <T> T newInstance(String cname, Class<T> expectedType, String ... subpackages) {
+    return newInstance(cname, expectedType, subpackages, NO_CLASSES, NO_OBJECTS);
   }
 
   public CoreAdminHandler newAdminHandlerInstance(final CoreContainer coreContainer, String cname, String ... subpackages) {
@@ -576,10 +546,6 @@ public class SolrResourceLoader implemen
     if (!live) {
       //TODO: Does SolrCoreAware make sense here since in a multi-core context
       // which core are we talking about ?
-      if (org.apache.solr.util.plugin.ResourceLoaderAware.class.isInstance(obj)) {
-        log.warn("Class [{}] uses org.apache.solr.util.plugin.ResourceLoaderAware " +
-            "which is deprecated. Change to org.apache.lucene.analysis.util.ResourceLoaderAware.", cname);
-      }
       if( obj instanceof ResourceLoaderAware ) {
         assertAwareCompatibility( ResourceLoaderAware.class, obj );
         waitingForResources.add( (ResourceLoaderAware)obj );
@@ -603,8 +569,13 @@ public class SolrResourceLoader implemen
 
       Constructor<? extends T> constructor = clazz.getConstructor(params);
       obj = constructor.newInstance(args);
-    }
-    catch (Exception e) {
+
+    } catch (Error err) {
+      log.error("Loading Class " + cName + " ("+clazz.getName() + ") triggered serious java error: "
+                + err.getClass().getName(), err);
+      throw err;
+
+    } catch (Exception e) {
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
           "Error instantiating class: '" + clazz.getName()+"'", e);
     }
@@ -614,10 +585,6 @@ public class SolrResourceLoader implemen
         assertAwareCompatibility( SolrCoreAware.class, obj );
         waitingForCore.add( (SolrCoreAware)obj );
       }
-      if (org.apache.solr.util.plugin.ResourceLoaderAware.class.isInstance(obj)) {
-        log.warn("Class [{}] uses org.apache.solr.util.plugin.ResourceLoaderAware " +
-            "which is deprecated. Change to org.apache.lucene.analysis.util.ResourceLoaderAware.", cName);
-      }
       if( obj instanceof ResourceLoaderAware ) {
         assertAwareCompatibility( ResourceLoaderAware.class, obj );
         waitingForResources.add( (ResourceLoaderAware)obj );
@@ -829,10 +796,10 @@ public class SolrResourceLoader implemen
 
   public static void persistConfLocally(SolrResourceLoader loader, String resourceName, byte[] content) {
     // Persist locally
-    File managedSchemaFile = new File(loader.getConfigDir(), resourceName);
+    File confFile = new File(loader.getConfigDir(), resourceName);
     OutputStreamWriter writer = null;
     try {
-      File parentDir = managedSchemaFile.getParentFile();
+      File parentDir = confFile.getParentFile();
       if ( ! parentDir.isDirectory()) {
         if ( ! parentDir.mkdirs()) {
           final String msg = "Can't create managed schema directory " + parentDir.getAbsolutePath();
@@ -840,19 +807,19 @@ public class SolrResourceLoader implemen
           throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg);
         }
       }
-      final FileOutputStream out = new FileOutputStream(managedSchemaFile);
+      final FileOutputStream out = new FileOutputStream(confFile);
       out.write(content);
-      log.info("Upgraded to managed schema at " + managedSchemaFile.getPath());
+      log.info("Written confile " + resourceName);
     } catch (IOException e) {
-      final String msg = "Error persisting managed schema " + managedSchemaFile;
+      final String msg = "Error persisting conf file " + resourceName;
       log.error(msg, e);
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, msg, e);
     } finally {
       org.apache.commons.io.IOUtils.closeQuietly(writer);
       try {
-        FileUtils.sync(managedSchemaFile);
+        FileUtils.sync(confFile);
       } catch (IOException e) {
-        final String msg = "Error syncing the managed schema file " + managedSchemaFile;
+        final String msg = "Error syncing conf file " + resourceName;
         log.error(msg, e);
       }
     }