You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by er...@apache.org on 2017/04/13 04:55:59 UTC

[2/2] lucene-solr:branch_6x: SOLR-10007 Clean up references to CoreContainer and CoreDescriptors

SOLR-10007 Clean up references to CoreContainer and CoreDescriptors


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/acf30220
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/acf30220
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/acf30220

Branch: refs/heads/branch_6x
Commit: acf302202a15426eee148f58346689ff42dd23e4
Parents: 6b8d9fb
Author: Erick Erickson <er...@apache.org>
Authored: Wed Apr 12 21:55:52 2017 -0700
Committer: Erick Erickson <er...@apache.org>
Committed: Wed Apr 12 21:55:52 2017 -0700

----------------------------------------------------------------------
 solr/CHANGES.txt                                |   2 +
 .../solr/handler/dataimport/DataImporter.java   |   3 +-
 .../solr/handler/dataimport/DocBuilder.java     |   2 +-
 .../handler/dataimport/ZKPropertiesWriter.java  |   2 +-
 .../solrj/embedded/EmbeddedSolrServer.java      |   2 +-
 .../java/org/apache/solr/cloud/CloudUtil.java   |   2 +-
 .../org/apache/solr/cloud/ElectionContext.java  |   8 +-
 .../org/apache/solr/cloud/RecoveryStrategy.java |   4 +-
 .../org/apache/solr/cloud/ZkController.java     |   2 +-
 .../apache/solr/cloud/rule/ImplicitSnitch.java  |   2 +-
 .../org/apache/solr/core/CoreContainer.java     | 111 +++++++++----------
 .../org/apache/solr/core/CoreDescriptor.java    |  40 ++++---
 .../apache/solr/core/CorePropertiesLocator.java |  10 +-
 .../java/org/apache/solr/core/CoresLocator.java |   9 ++
 .../apache/solr/core/HdfsDirectoryFactory.java  |   2 +-
 .../java/org/apache/solr/core/PluginBag.java    |   2 +-
 .../src/java/org/apache/solr/core/SolrCore.java |  68 ++++++------
 .../java/org/apache/solr/core/SolrCores.java    |  70 +++++++-----
 .../java/org/apache/solr/core/ZkContainer.java  |   2 +-
 .../solr/handler/CdcrBufferStateManager.java    |   8 +-
 .../solr/handler/CdcrLeaderStateManager.java    |  10 +-
 .../solr/handler/CdcrProcessStateManager.java   |   8 +-
 .../solr/handler/CdcrReplicatorManager.java     |   2 +-
 .../apache/solr/handler/CdcrRequestHandler.java |   8 +-
 .../solr/handler/CdcrUpdateLogSynchronizer.java |   2 +-
 .../org/apache/solr/handler/GraphHandler.java   |   4 +-
 .../org/apache/solr/handler/IndexFetcher.java   |  10 +-
 .../apache/solr/handler/ReplicationHandler.java |   8 +-
 .../org/apache/solr/handler/SQLHandler.java     |   4 +-
 .../apache/solr/handler/SolrConfigHandler.java  |   6 +-
 .../org/apache/solr/handler/StreamHandler.java  |   4 +-
 .../solr/handler/admin/LoggingHandler.java      |   2 +-
 .../solr/handler/admin/PrepRecoveryOp.java      |   2 +-
 .../solr/handler/admin/RequestSyncShardOp.java  |   4 +-
 .../handler/admin/ShowFileRequestHandler.java   |   2 +-
 .../handler/admin/SolrInfoMBeanHandler.java     |   2 +-
 .../solr/handler/admin/SystemInfoHandler.java   |   2 +-
 .../solr/handler/component/DebugComponent.java  |   2 +-
 .../handler/component/HttpShardHandler.java     |   2 +-
 .../component/HttpShardHandlerFactory.java      |   2 +-
 .../component/QueryElevationComponent.java      |   4 +-
 .../handler/component/RealTimeGetComponent.java |   4 +-
 .../solr/handler/component/SearchHandler.java   |   4 +-
 .../apache/solr/logging/MDCLoggingContext.java  |  12 +-
 .../solr/metrics/SolrCoreMetricManager.java     |   4 +-
 .../org/apache/solr/schema/SchemaManager.java   |   2 +-
 .../apache/solr/schema/ZkIndexSchemaReader.java |   2 +-
 .../apache/solr/search/JoinQParserPlugin.java   |   4 +-
 .../search/join/ScoreJoinQParserPlugin.java     |   4 +-
 .../solr/update/DefaultSolrCoreState.java       |   2 +-
 .../solr/update/DirectUpdateHandler2.java       |   4 +-
 .../java/org/apache/solr/update/PeerSync.java   |   8 +-
 .../org/apache/solr/update/SolrIndexWriter.java |   2 +-
 .../processor/DistributedUpdateProcessor.java   |  27 +++--
 .../DocExpirationUpdateProcessorFactory.java    |   2 +-
 .../processor/TolerantUpdateProcessor.java      |   2 +-
 .../org/apache/solr/util/SolrLogLayout.java     |   2 +-
 .../org/apache/solr/core/TestCodecSupport.java  |  10 +-
 .../org/apache/solr/core/TestCoreContainer.java |  30 +++--
 .../org/apache/solr/core/TestCoreDiscovery.java |   2 +-
 .../org/apache/solr/core/TestLazyCores.java     |  17 ++-
 .../solr/metrics/SolrCoreMetricManagerTest.java |   2 +-
 .../metrics/reporters/SolrJmxReporterTest.java  |   2 +-
 .../org/apache/solr/update/VersionInfoTest.java |   2 +-
 .../org/apache/solr/util/MockCoreContainer.java |   2 +-
 .../solrj/MergeIndexesExampleTestBase.java      |   2 +-
 .../apache/solr/util/ReadOnlyCoresLocator.java  |   6 +
 .../java/org/apache/solr/util/TestHarness.java  |   8 +-
 68 files changed, 335 insertions(+), 274 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 9a5b682..2baecad 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -139,6 +139,8 @@ Other Changes
 
 * SOLR-10429: UpdateRequest#getRoutes()should copy the response parser (noble)
 
+* SOLR-10007: Clean up references to CoreContainer and CoreDescriptors (Erick Erickson)
+
 ==================  6.5.1 ==================
 
 Bug Fixes

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java
----------------------------------------------------------------------
diff --git a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java
index 2f5e9b0..a49b4f6 100644
--- a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java
+++ b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java
@@ -288,8 +288,7 @@ public class DataImporter {
     if (propertyWriterTags.isEmpty()) {
       boolean zookeeper = false;
       if (this.core != null
-          && this.core.getCoreDescriptor().getCoreContainer()
-              .isZooKeeperAware()) {
+          && this.core.getCoreContainer().isZooKeeperAware()) {
         zookeeper = true;
       }
       pw = new PropertyWriter(zookeeper ? "ZKPropertiesWriter"

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
----------------------------------------------------------------------
diff --git a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
index c80d275..91fd7a4 100644
--- a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
+++ b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
@@ -313,7 +313,7 @@ public class DocBuilder {
   }
 
   void handleError(String message, Exception e) {
-    if (!dataImporter.getCore().getCoreDescriptor().getCoreContainer().isZooKeeperAware()) {
+    if (!dataImporter.getCore().getCoreContainer().isZooKeeperAware()) {
       writer.rollback();
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ZKPropertiesWriter.java
----------------------------------------------------------------------
diff --git a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ZKPropertiesWriter.java b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ZKPropertiesWriter.java
index 2d54872..64a776c 100644
--- a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ZKPropertiesWriter.java
+++ b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ZKPropertiesWriter.java
@@ -44,7 +44,7 @@ public class ZKPropertiesWriter extends SimplePropertiesWriter {
   @Override
   public void init(DataImporter dataImporter, Map<String, String> params) {
     super.init(dataImporter, params);    
-    zkClient = dataImporter.getCore().getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+    zkClient = dataImporter.getCore().getCoreContainer().getZkController().getZkClient();
   }
   
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
index 8de5fc9..948452e 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
@@ -89,7 +89,7 @@ public class EmbeddedSolrServer extends SolrClient {
    * Create an EmbeddedSolrServer wrapping a particular SolrCore
    */
   public EmbeddedSolrServer(SolrCore core) {
-    this(core.getCoreDescriptor().getCoreContainer(), core.getName());
+    this(core.getCoreContainer(), core.getName());
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java b/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
index c62efa6..ac09621 100644
--- a/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
+++ b/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
@@ -68,7 +68,7 @@ public class CloudUtil {
           
           if (thisCnn != null && thisCnn.equals(cnn)
               && !thisBaseUrl.equals(baseUrl)) {
-            if (cc.getCoreNames().contains(desc.getName())) {
+            if (cc.getLoadedCoreNames().contains(desc.getName())) {
               cc.unload(desc.getName());
             }
             

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java b/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java
index c45699b..b2ca7cf 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java
@@ -291,7 +291,7 @@ final class ShardLeaderElectionContext extends ShardLeaderElectionContextBase {
         if (cc.isShutDown()) {
           return;
         } else {
-          throw new SolrException(ErrorCode.SERVER_ERROR, "SolrCore not found:" + coreName + " in " + cc.getCoreNames());
+          throw new SolrException(ErrorCode.SERVER_ERROR, "SolrCore not found:" + coreName + " in " + cc.getLoadedCoreNames());
         }
       }
       MDCLoggingContext.setCore(core);
@@ -331,7 +331,7 @@ final class ShardLeaderElectionContext extends ShardLeaderElectionContextBase {
           if (!zkController.getCoreContainer().isShutDown())  {
             cancelElection();
             throw new SolrException(ErrorCode.SERVER_ERROR,
-                "SolrCore not found:" + coreName + " in " + cc.getCoreNames());
+                "SolrCore not found:" + coreName + " in " + cc.getLoadedCoreNames());
           } else  {
             return;
           }
@@ -401,7 +401,7 @@ final class ShardLeaderElectionContext extends ShardLeaderElectionContextBase {
             RefCounted<SolrIndexSearcher> searchHolder = core.getNewestSearcher(false);
             SolrIndexSearcher searcher = searchHolder.get();
             try {
-              log.debug(core.getCoreDescriptor().getCoreContainer().getZkController().getNodeName() + " synched "
+              log.debug(core.getCoreContainer().getZkController().getNodeName() + " synched "
                   + searcher.search(new MatchAllDocsQuery(), 1).totalHits);
             } finally {
               searchHolder.decref();
@@ -444,7 +444,7 @@ final class ShardLeaderElectionContext extends ShardLeaderElectionContextBase {
           try (SolrCore core = cc.getCore(coreName)) {
             
             if (core == null) {
-              log.debug("SolrCore not found:" + coreName + " in " + cc.getCoreNames());
+              log.debug("SolrCore not found:" + coreName + " in " + cc.getLoadedCoreNames());
               return;
             }
             

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
index 1c1a080..0df55b8 100644
--- a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
+++ b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
@@ -230,7 +230,7 @@ public class RecoveryStrategy extends Thread implements Closeable {
         SolrIndexSearcher searcher = searchHolder.get();
         Directory dir = core.getDirectoryFactory().get(core.getIndexDir(), DirContext.META_DATA, null);
         try {
-          LOG.debug(core.getCoreDescriptor().getCoreContainer()
+          LOG.debug(core.getCoreContainer()
               .getZkController().getNodeName()
               + " replicated "
               + searcher.search(new MatchAllDocsQuery(), 1).totalHits
@@ -618,7 +618,7 @@ public class RecoveryStrategy extends Thread implements Closeable {
       SolrIndexSearcher searcher = searchHolder.get();
       try {
         final int totalHits = searcher.search(new MatchAllDocsQuery(), 1).totalHits;
-        final String nodeName = core.getCoreDescriptor().getCoreContainer().getZkController().getNodeName();
+        final String nodeName = core.getCoreContainer().getZkController().getNodeName();
         LOG.debug("[{}] {} [{} total hits]", nodeName, op, totalHits);
       } finally {
         searchHolder.decref();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/cloud/ZkController.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index fe32d58..0e04637 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -1143,7 +1143,7 @@ public class ZkController {
         MDCLoggingContext.setCore(core);
       }
     } else {
-      MDCLoggingContext.setCoreDescriptor(cd);
+      MDCLoggingContext.setCoreDescriptor(cc, cd);
     }
     try {
       String collection = cd.getCloudDescriptor().getCollectionName();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/cloud/rule/ImplicitSnitch.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/rule/ImplicitSnitch.java b/solr/core/src/java/org/apache/solr/cloud/rule/ImplicitSnitch.java
index 00e27c3..a4e998d 100644
--- a/solr/core/src/java/org/apache/solr/cloud/rule/ImplicitSnitch.java
+++ b/solr/core/src/java/org/apache/solr/cloud/rule/ImplicitSnitch.java
@@ -45,7 +45,7 @@ public class ImplicitSnitch implements CoreAdminHandler.Invocable {
     Map<String, Object> result = new HashMap<>();
     CoreContainer cc = (CoreContainer) req.getContext().get(CoreContainer.class.getName());
     if (req.getParams().getInt(CORES, -1) == 1) {
-      result.put(CORES, cc.getCoreNames().size());
+      result.put(CORES, cc.getLoadedCoreNames().size());
     }
     if (req.getParams().getInt(DISK, -1) == 1) {
       try {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/CoreContainer.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index d66e7ad..016844f 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -117,7 +117,7 @@ public class CoreContainer {
     public final Exception exception;
 
     public CoreLoadFailure(CoreDescriptor cd, Exception loadFailure) {
-      this.cd = cd;
+      this.cd = new CoreDescriptor(cd.getName(), cd);
       this.exception = loadFailure;
     }
   }
@@ -207,8 +207,6 @@ public class CoreContainer {
     return this.containerHandlers;
   }
 
- // private ClientConnectionManager clientConnectionManager = new PoolingClientConnectionManager();
-
   {
     log.debug("New CoreContainer " + System.identityHashCode(this));
   }
@@ -541,7 +539,7 @@ public class CoreContainer {
 
       for (final CoreDescriptor cd : cds) {
         if (cd.isTransient() || !cd.isLoadOnStartup()) {
-          solrCores.putDynamicDescriptor(cd.getName(), cd);
+          getTransientCacheHandler().addTransientDescriptor(cd.getName(), cd);
         } else if (asyncSolrCoreLoad) {
           solrCores.markCoreAsLoading(cd);
         }
@@ -772,50 +770,35 @@ public class CoreContainer {
     return coresLocator;
   }
 
-  protected SolrCore registerCore(String name, SolrCore core, boolean registerInZk, boolean skipRecovery) {
+  protected SolrCore registerCore(CoreDescriptor cd, SolrCore core, boolean registerInZk, boolean skipRecovery) {
     if( core == null ) {
       throw new RuntimeException( "Can not register a null core." );
     }
-
-    // We can register a core when creating them via the admin UI, so we need to ensure that the dynamic descriptors
-    // are up to date
-    CoreDescriptor cd = core.getCoreDescriptor();
-    if ((cd.isTransient() || ! cd.isLoadOnStartup())
-        && solrCores.getDynamicDescriptor(name) == null) {
-      // Store it away for later use. includes non-transient but not
-      // loaded at startup cores.
-      solrCores.putDynamicDescriptor(name, cd);
-    }
-
-    SolrCore old;
-
+    
     if (isShutDown) {
       core.close();
       throw new IllegalStateException("This CoreContainer has been closed");
     }
-    if (cd.isTransient()) {
-      old = solrCores.putTransientCore(cfg, name, core, loader);
-    } else {
-      old = solrCores.putCore(name, core);
-    }
+    SolrCore old = solrCores.putCore(cd, core);
       /*
       * set both the name of the descriptor and the name of the
       * core, since the descriptors name is used for persisting.
       */
 
-    core.setName(name);
+    solrCores.addCoreDescriptor(new CoreDescriptor(cd.getName(), cd));
+    core.setName(cd.getName());
 
-    coreInitFailures.remove(name);
+    coreInitFailures.remove(cd.getName());
 
     if( old == null || old == core) {
-      log.debug( "registering core: "+name );
+      log.debug( "registering core: " + cd.getName() );
       if (registerInZk) {
         zkSys.registerInZk(core, false, skipRecovery);
       }
       return null;
     }
     else {
-      log.debug( "replacing core: "+name );
+      log.debug( "replacing core: " + cd.getName() );
       old.close();
       if (registerInZk) {
         zkSys.registerInZk(core, false, skipRecovery);
@@ -843,10 +826,10 @@ public class CoreContainer {
    */
   public SolrCore create(String coreName, Path instancePath, Map<String, String> parameters, boolean newCollection) {
 
-    CoreDescriptor cd = new CoreDescriptor(this, coreName, instancePath, parameters);
+    CoreDescriptor cd = new CoreDescriptor(coreName, instancePath, parameters, getContainerProperties(), isZooKeeperAware());
 
     // TODO: There's a race here, isn't there?
-    if (getAllCoreNames().contains(coreName)) {
+    if (getLoadedCoreNames().contains(coreName)) {
       log.warn("Creating a core with existing name is not allowed");
       // TODO: Shouldn't this be a BAD_REQUEST?
       throw new SolrException(ErrorCode.SERVER_ERROR, "Core with name '" + coreName + "' already exists.");
@@ -919,7 +902,7 @@ public class CoreContainer {
 
     SolrCore core = null;
     try {
-      MDCLoggingContext.setCoreDescriptor(dcore);
+      MDCLoggingContext.setCoreDescriptor(this, dcore);
       SolrIdentifierValidator.validateCoreName(dcore.getName());
       if (zkSys.getZkController() != null) {
         zkSys.getZkController().preRegister(dcore);
@@ -929,7 +912,7 @@ public class CoreContainer {
       dcore.setConfigSetTrusted(coreConfig.isTrusted());
       log.info("Creating SolrCore '{}' using configuration from {}, trusted={}", dcore.getName(), coreConfig.getName(), dcore.isConfigSetTrusted());
       try {
-        core = new SolrCore(dcore, coreConfig);
+        core = new SolrCore(this, dcore, coreConfig);
       } catch (SolrException e) {
         core = processCoreCreateException(e, dcore, coreConfig);
       }
@@ -939,7 +922,7 @@ public class CoreContainer {
         core.getUpdateHandler().getUpdateLog().recoverFromLog();
       }
 
-      registerCore(dcore.getName(), core, publishState, newCollection);
+      registerCore(dcore, core, publishState, newCollection);
 
       return core;
     } catch (Exception e) {
@@ -1003,7 +986,7 @@ public class CoreContainer {
             if (leader != null && leader.getState() == State.ACTIVE) {
               log.info("Found active leader, will attempt to create fresh core and recover.");
               resetIndexDirectory(dcore, coreConfig);
-              return new SolrCore(dcore, coreConfig);
+              return new SolrCore(this, dcore, coreConfig);
             }
           } catch (SolrException se) {
             se.addSuppressed(original);
@@ -1059,7 +1042,7 @@ public class CoreContainer {
   /**
    * @return a Collection of the names that loaded cores are mapped to
    */
-  public Collection<String> getCoreNames() {
+  public Collection<String> getLoadedCoreNames() {
     return solrCores.getLoadedCoreNames();
   }
 
@@ -1115,13 +1098,18 @@ public class CoreContainer {
   public void reload(String name) {
     SolrCore core = solrCores.getCoreFromAnyList(name, false);
     if (core != null) {
-      CoreDescriptor cd = core.getCoreDescriptor();
+      // The underlying core properties files may have changed, we don't really know. So we have a (perhaps) stale
+      // CoreDescriptor we need to reload it if it's out there. 
+      CorePropertiesLocator cpl = new CorePropertiesLocator(null);
+      CoreDescriptor cd = cpl.reload(this, core.getCoreDescriptor());
+      if (cd == null) cd = core.getCoreDescriptor();
+      solrCores.addCoreDescriptor(cd);
       try {
         solrCores.waitAddPendingCoreOps(cd.getName());
         ConfigSet coreConfig = coreConfigService.getConfig(cd);
         log.info("Reloading SolrCore '{}' using configuration from {}", cd.getName(), coreConfig.getName());
         SolrCore newCore = core.reload(coreConfig);
-        registerCore(cd.getName(), newCore, false, false);
+        registerCore(cd, newCore, false, false);
       } catch (SolrCoreState.CoreIsClosedException e) {
         throw e;
       } catch (Exception e) {
@@ -1193,7 +1181,6 @@ public class CoreContainer {
     boolean close = solrCores.isLoadedNotPendingClose(name);
     SolrCore core = solrCores.remove(name);
     coresLocator.delete(this, cd);
-
     if (core == null) {
       // transient core
       SolrCore.deleteUnloadedCore(cd, deleteDataDir, deleteInstanceDir);
@@ -1208,7 +1195,7 @@ public class CoreContainer {
       core.getSolrCoreState().cancelRecovery();
     }
     
-    core.unloadOnClose(deleteIndexDir, deleteDataDir, deleteInstanceDir);
+    core.unloadOnClose(cd, deleteIndexDir, deleteDataDir, deleteInstanceDir);
     if (close)
       core.closeAndWait();
 
@@ -1222,6 +1209,9 @@ public class CoreContainer {
         throw new SolrException(ErrorCode.SERVER_ERROR, "Error unregistering core [" + name + "] from cloud state", e);
       }
     }
+    if (deleteInstanceDir) { // we aren't going to reload this if we delete the instance dir.
+      solrCores.removeCoreDescriptor(cd);
+    }
   }
 
   public void rename(String name, String toName) {
@@ -1231,8 +1221,15 @@ public class CoreContainer {
         String oldRegistryName = core.getCoreMetricManager().getRegistryName();
         String newRegistryName = SolrCoreMetricManager.createRegistryName(core.getCoreDescriptor().getCollectionName(), toName);
         metricManager.swapRegistries(oldRegistryName, newRegistryName);
-        registerCore(toName, core, true, false);
+        // The old coreDescriptor is obsolete, so remove it. registerCore will put it back.
+        CoreDescriptor cd = core.getCoreDescriptor();
+        solrCores.removeCoreDescriptor(cd);
+        cd.setProperty("name", toName);
+        solrCores.addCoreDescriptor(cd);
+        core.setName(toName);
+        registerCore(cd, core, true, false);
         SolrCore old = solrCores.remove(name);
+
         coresLocator.rename(this, old.getCoreDescriptor(), core.getCoreDescriptor());
       }
     }
@@ -1247,12 +1244,7 @@ public class CoreContainer {
   }
 
   public CoreDescriptor getCoreDescriptor(String coreName) {
-    // TODO make this less hideous!
-    for (CoreDescriptor cd : getCoreDescriptors()) {
-      if (cd.getName().equals(coreName))
-        return cd;
-    }
-    return null;
+    return solrCores.getCoreDescriptor(coreName);
   }
 
   public Path getCoreRootDirectory() {
@@ -1272,29 +1264,32 @@ public class CoreContainer {
     // 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);
 
+    // If a core is loaded, we're done just return it.
     if (core != null) {
       return core;
     }
 
-    // OK, it's not presently in any list, is it in the list of dynamic cores but not loaded yet? If so, load it.
-    CoreDescriptor desc = solrCores.getDynamicDescriptor(name);
-    if (desc == null) { //Nope, no transient core with this name
+    // If it's not yet loaded, we can check if it's had a core init failure and "do the right thing"
+    CoreDescriptor desc = solrCores.getCoreDescriptor(name);
 
-      // if there was an error initializing this core, throw a 500
-      // error with the details for clients attempting to access it.
-      CoreLoadFailure loadFailure = getCoreInitFailures().get(name);
-      if (null != loadFailure) {
-        throw new SolrCoreInitializationException(name, loadFailure.exception);
-      }
-      // otherwise the user is simply asking for something that doesn't exist.
-      return null;
+    // if there was an error initializing this core, throw a 500
+    // error with the details for clients attempting to access it.
+    CoreLoadFailure loadFailure = getCoreInitFailures().get(name);
+    if (null != loadFailure) {
+      throw new SolrCoreInitializationException(name, loadFailure.exception);
     }
-
+    // This is a bit of awkwardness where SolrCloud and transient cores don't play nice together. For transient cores,
+    // we have to allow them to be created at any time there hasn't been a core load failure (use reload to cure that).
+    // But for TestConfigSetsAPI.testUploadWithScriptUpdateProcessor, this needs to _not_ try to load the core if
+    // the core is null and there was an error. If you change this, be sure to run both TestConfiSetsAPI and 
+    // TestLazyCores
+    if (desc == null || zkSys.getZkController() != null) return null;
+    
     // This will put an entry in pending core ops if the core isn't loaded
     core = solrCores.waitAddPendingCoreOps(name);
 
     if (isShutDown) return null; // We're quitting, so stop. This needs to be after the wait above since we may come off
-                                 // the wait as a consequence of shutting down.
+    // the wait as a consequence of shutting down.
     try {
       if (core == null) {
         if (zkSys.getZkController() != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java b/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
index 0dc2c71..1747fa2 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreDescriptor.java
@@ -121,8 +121,6 @@ public class CoreDescriptor {
       CloudDescriptor.NUM_SHARDS
   );
 
-  private final CoreContainer coreContainer;
-
   private final CloudDescriptor cloudDesc;
 
   private final Path instanceDir;
@@ -139,8 +137,9 @@ public class CoreDescriptor {
   /** The properties for this core, substitutable by resource loaders */
   protected final Properties substitutableProperties = new Properties();
 
-  public CoreDescriptor(CoreContainer container, String name, Path instanceDir, String... properties) {
-    this(container, name, instanceDir, toMap(properties));
+  public CoreDescriptor(String name, Path instanceDir, Properties containerProperties,
+                        boolean isZooKeeperAware, String... properties) {
+    this(name, instanceDir, toMap(properties), containerProperties, isZooKeeperAware);
   }
 
   private static Map<String, String> toMap(String... properties) {
@@ -154,12 +153,14 @@ public class CoreDescriptor {
 
   /**
    * 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
+   * @param containerProperties the enclosing container properties for variable resolution
+   * @param isZooKeeperAware whether we are part of SolrCloud or not. 
    */
-  public CoreDescriptor(CoreContainer container, String name, Path instanceDir) {
-    this(container, name, instanceDir, Collections.emptyMap());
+  public CoreDescriptor(String name, Path instanceDir,
+                        Properties containerProperties, boolean isZooKeeperAware) {
+    this(name, instanceDir, Collections.emptyMap(), containerProperties, isZooKeeperAware);
   }
 
   /**
@@ -168,7 +169,6 @@ public class CoreDescriptor {
    * @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);
@@ -183,20 +183,20 @@ public class CoreDescriptor {
 
   /**
    * Create a new CoreDescriptor.
-   * @param container       the CoreDescriptor's container
    * @param name            the CoreDescriptor's name
    * @param instanceDir     a Path resolving to the instanceDir
    * @param coreProps       a Map of the properties for this core
+   * @param containerProperties the properties from the enclosing container.
+   * @param isZooKeeperAware if true, we ar in SolrCloud mode.
    */
-  public CoreDescriptor(CoreContainer container, String name, Path instanceDir,
-                        Map<String, String> coreProps) {
 
-    this.coreContainer = container;
+
+  public CoreDescriptor(String name, Path instanceDir, Map<String, String> coreProps,
+                        Properties containerProperties, boolean isZooKeeperAware) {
     this.instanceDir = instanceDir;
 
     originalCoreProperties.setProperty(CORE_NAME, name);
 
-    Properties containerProperties = container.getContainerProperties();
     name = PropertiesUtil.substituteProperty(checkPropertyIsNotEmpty(name, CORE_NAME),
                                              containerProperties);
 
@@ -221,7 +221,7 @@ public class CoreDescriptor {
     buildSubstitutableProperties();
 
     // TODO maybe make this a CloudCoreDescriptor subclass?
-    if (container.isZooKeeperAware()) {
+    if (isZooKeeperAware) {
       cloudDesc = new CloudDescriptor(name, coreProperties, this);
     }
     else {
@@ -324,15 +324,19 @@ public class CoreDescriptor {
   public String getName() {
     return coreProperties.getProperty(CORE_NAME);
   }
+  
+  public void setProperty(String prop, String val) {
+    if (substitutableProperties.containsKey(prop)) {
+      substitutableProperties.setProperty(prop, val);
+      return;
+    }
+    coreProperties.setProperty(prop, val);
+  }
 
   public String getCollectionName() {
     return cloudDesc == null ? null : cloudDesc.getCollectionName();
   }
 
-  public CoreContainer getCoreContainer() {
-    return coreContainer;
-  }
-
   public CloudDescriptor getCloudDescriptor() {
     return cloudDesc;
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java b/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java
index b37402b..385d11b 100644
--- a/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java
+++ b/solr/core/src/java/org/apache/solr/core/CorePropertiesLocator.java
@@ -163,6 +163,14 @@ public class CorePropertiesLocator implements CoresLocator {
     return cds;
   }
 
+  @Override
+  public CoreDescriptor reload(CoreContainer cc, CoreDescriptor cd) {
+    if (cd == null) return null;
+    
+    Path coreProps = cd.getInstanceDir().resolve(CoreDescriptor.DEFAULT_EXTERNAL_PROPERTIES_FILE);
+    return buildCoreDescriptor(coreProps, cc);
+  }
+
   protected CoreDescriptor buildCoreDescriptor(Path propertiesFile, CoreContainer cc) {
 
     Path instanceDir = propertiesFile.getParent();
@@ -174,7 +182,7 @@ public class CorePropertiesLocator implements CoresLocator {
       for (String key : coreProperties.stringPropertyNames()) {
         propMap.put(key, coreProperties.getProperty(key));
       }
-      return new CoreDescriptor(cc, name, instanceDir, propMap);
+      return new CoreDescriptor(name, instanceDir, propMap, cc.getContainerProperties(), cc.isZooKeeperAware());
     }
     catch (IOException e) {
       logger.error("Couldn't load core descriptor from {}:{}", propertiesFile, e.toString());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/CoresLocator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CoresLocator.java b/solr/core/src/java/org/apache/solr/core/CoresLocator.java
index d4f40cd..beaa690 100644
--- a/solr/core/src/java/org/apache/solr/core/CoresLocator.java
+++ b/solr/core/src/java/org/apache/solr/core/CoresLocator.java
@@ -69,4 +69,13 @@ public interface CoresLocator {
    */
   public List<CoreDescriptor> discover(CoreContainer cc);
 
+  /**
+   * reload an existing CoreDescriptor, that is read it from disk.
+   * 
+   * @param cc the CoreContainer
+   * @param cd the old CoreDescriptor. If null, this is a no-op
+   * @return the reloaded coreDescriptor or null          
+   */
+  public CoreDescriptor reload(CoreContainer cc, CoreDescriptor cd);
+
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java b/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java
index db953d3..15f398a 100644
--- a/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/HdfsDirectoryFactory.java
@@ -499,7 +499,7 @@ public class HdfsDirectoryFactory extends CachingDirectoryFactory implements Sol
 
   @Override
   public void inform(SolrCore core) {
-    setHost(core.getCoreDescriptor().getCoreContainer().getHostName());
+    setHost(core.getCoreContainer().getHostName());
   }
 
   @VisibleForTesting

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/PluginBag.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/PluginBag.java b/solr/core/src/java/org/apache/solr/core/PluginBag.java
index 65978f3..2b283cd 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -455,7 +455,7 @@ public class PluginBag<T> implements AutoCloseable {
     }
 
     public RuntimeLib(SolrCore core) {
-      coreContainer = core.getCoreDescriptor().getCoreContainer();
+      coreContainer = core.getCoreContainer();
     }
 
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/SolrCore.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index eb3ac06..9040685 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -179,7 +179,6 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
 
   private String name;
   private String logid; // used to show what name is set
-  private CoreDescriptor coreDescriptor;
 
   private boolean isReloaded = false;
 
@@ -220,6 +219,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
   private Counter newSearcherCounter;
   private Counter newSearcherMaxReachedCounter;
   private Counter newSearcherOtherErrorsCounter;
+  private final CoreContainer coreContainer;
 
   public Date getStartTimeStamp() { return startTime; }
 
@@ -423,10 +423,8 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
   }
 
   public void setName(String v) {
-    String oldName = this.name;
     this.name = v;
     this.logid = (v==null)?"":("["+v+"] ");
-    this.coreDescriptor = new CoreDescriptor(v, this.coreDescriptor);
     if (coreMetricManager != null) {
       coreMetricManager.afterCoreSetName();
     }
@@ -635,9 +633,9 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
       boolean success = false;
       SolrCore core = null;
       try {
-        CoreDescriptor cd = new CoreDescriptor(coreDescriptor.getName(), coreDescriptor);
+        CoreDescriptor cd = new CoreDescriptor(name, getCoreDescriptor());
         cd.loadExtraProperties(); //Reload the extra properties
-        core = new SolrCore(getName(), getDataDir(), coreConfig.getSolrConfig(),
+        core = new SolrCore(coreContainer, getName(), getDataDir(), coreConfig.getSolrConfig(),
             coreConfig.getIndexSchema(), coreConfig.getProperties(),
             cd, updateHandler, solrDelPolicy, currentCore, true);
         
@@ -657,7 +655,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
   }
 
   private DirectoryFactory initDirectoryFactory() {
-    return DirectoryFactory.loadDirectoryFactory(solrConfig, getCoreDescriptor().getCoreContainer(), coreMetricManager.getRegistryName());
+    return DirectoryFactory.loadDirectoryFactory(solrConfig, coreContainer, coreMetricManager.getRegistryName());
   }
 
   private RecoveryStrategy.Builder initRecoveryStrategyBuilder() {
@@ -827,12 +825,16 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
     return createReloadedUpdateHandler(className, "Update Handler", updateHandler);
   }
 
-  public SolrCore(CoreDescriptor cd, ConfigSet coreConfig) {
-    this(cd.getName(), null, coreConfig.getSolrConfig(), coreConfig.getIndexSchema(), coreConfig.getProperties(),
+  public SolrCore(CoreContainer coreContainer, CoreDescriptor cd, ConfigSet coreConfig) {
+    this(coreContainer, cd.getName(), null, coreConfig.getSolrConfig(), coreConfig.getIndexSchema(), coreConfig.getProperties(),
         cd, null, null, null, false);
   }
 
-  
+  public CoreContainer getCoreContainer() {
+    return coreContainer;
+  }
+
+
   /**
    * Creates a new core and register it in the list of cores. If a core with the
    * same name already exists, it will be stopped and replaced by this one.
@@ -846,14 +848,18 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
    *
    * @since solr 1.3
    */
-  public SolrCore(String name, String dataDir, SolrConfig config,
-      IndexSchema schema, NamedList configSetProperties,
-      CoreDescriptor coreDescriptor, UpdateHandler updateHandler,
-      IndexDeletionPolicyWrapper delPolicy, SolrCore prev, boolean reload) {
+  public SolrCore(CoreContainer coreContainer, String name, String dataDir, SolrConfig config,
+                  IndexSchema schema, NamedList configSetProperties,
+                  CoreDescriptor coreDescriptor, UpdateHandler updateHandler,
+                  IndexDeletionPolicyWrapper delPolicy, SolrCore prev, boolean reload) {
+
+    this.coreContainer = coreContainer;
     
     assert ObjectReleaseTracker.track(searcherExecutor); // ensure that in unclean shutdown tests we still close this
-    
-    this.coreDescriptor = Objects.requireNonNull(coreDescriptor, "coreDescriptor cannot be null");
+
+    CoreDescriptor cd = Objects.requireNonNull(coreDescriptor, "coreDescriptor cannot be null");
+    coreContainer.solrCores.addCoreDescriptor(cd);
+
     setName(name);
     MDCLoggingContext.setCore(this);
     
@@ -881,7 +887,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
 
     checkVersionFieldExistsInSchema(schema, coreDescriptor);
 
-    SolrMetricManager metricManager = this.coreDescriptor.getCoreContainer().getMetricManager();
+    SolrMetricManager metricManager = coreContainer.getMetricManager();
 
     // initialize searcher-related metrics
     initializeMetrics(metricManager, coreMetricManager.getRegistryName(), null);
@@ -1021,15 +1027,15 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
 
   /** Set UpdateLog to buffer updates if the slice is in construction. */
   private void bufferUpdatesIfConstructing(CoreDescriptor coreDescriptor) {
-    final CoreContainer cc = coreDescriptor.getCoreContainer();
-    if (cc != null && cc.isZooKeeperAware()) {
+    
+    if (coreContainer != null && coreContainer.isZooKeeperAware()) {
       if (reqHandlers.get("/get") == null) {
         log.warn("WARNING: RealTimeGetHandler is not registered at /get. " +
             "SolrCloud will always use full index replication instead of the more efficient PeerSync method.");
       }
 
       // ZK pre-register would have already happened so we read slice properties now
-      final ClusterState clusterState = cc.getZkController().getClusterState();
+      final ClusterState clusterState = coreContainer.getZkController().getClusterState();
       final DocCollection collection = clusterState.getCollection(coreDescriptor.getCloudDescriptor().getCollectionName());
       final Slice slice = collection.getSlice(coreDescriptor.getCloudDescriptor().getShardId());
       if (slice.getState() == Slice.State.CONSTRUCTION) {
@@ -1121,7 +1127,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
     manager.registerGauge(registry, () -> getIndexDir(), true, "indexDir", Category.CORE.toString());
     manager.registerGauge(registry, () -> getIndexSize(), true, "sizeInBytes", Category.INDEX.toString());
     manager.registerGauge(registry, () -> NumberUtils.readableSize(getIndexSize()), true, "size", Category.INDEX.toString());
-    manager.registerGauge(registry, () -> coreDescriptor.getCoreContainer().getCoreNames(this), true, "aliases", Category.CORE.toString());
+    manager.registerGauge(registry, () -> coreContainer.getCoreNames(this), true, "aliases", Category.CORE.toString());
     // initialize disk total / free metrics
     Path dataDirPath = Paths.get(dataDir);
     File dataDirFile = dataDirPath.toFile();
@@ -2722,7 +2728,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
     if (initArgs == null)
       initArgs = new NamedList<>();
 
-    String collection = coreDescriptor.getCollectionName();
+    String collection = getCoreDescriptor().getCollectionName();
     StorageIO storageIO =
         ManagedResourceStorage.newStorageIO(collection, resourceLoader, initArgs);
     mgr.init(resourceLoader, initArgs, storageIO);
@@ -2731,7 +2737,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
   }
 
   public CoreDescriptor getCoreDescriptor() {
-    return coreDescriptor;
+    return coreContainer.getCoreDescriptor(name);
   }
 
   public IndexDeletionPolicyWrapper getDeletionPolicy(){
@@ -2793,8 +2799,8 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
 
     CoreDescriptor cd = getCoreDescriptor();
     if (cd != null) {
-      if (null != cd && cd.getCoreContainer() != null) {
-        lst.add("aliases", getCoreDescriptor().getCoreContainer().getCoreNames(this));
+      if (coreContainer != null) {
+        lst.add("aliases", coreContainer.getCoreNames(this));
       }
       CloudDescriptor cloudDesc = cd.getCloudDescriptor();
       if (cloudDesc != null) {
@@ -2818,7 +2824,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
     return codec;
   }
 
-  public void unloadOnClose(boolean deleteIndexDir, boolean deleteDataDir, boolean deleteInstanceDir) {
+  public void unloadOnClose(final CoreDescriptor desc, boolean deleteIndexDir, boolean deleteDataDir, boolean deleteInstanceDir) {
     if (deleteIndexDir) {
       try {
         directoryFactory.remove(getIndexDir());
@@ -2841,13 +2847,12 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
 
         @Override
         public void postClose(SolrCore core) {
-          CoreDescriptor cd = core.getCoreDescriptor();
-          if (cd != null) {
+          if (desc != null) {
             try {
-              FileUtils.deleteDirectory(cd.getInstanceDir().toFile());
+              FileUtils.deleteDirectory(desc.getInstanceDir().toFile());
             } catch (IOException e) {
               SolrException.log(log, "Failed to delete instance dir for core:"
-                  + core.getName() + " dir:" + cd.getInstanceDir());
+                  + core.getName() + " dir:" + desc.getInstanceDir());
             }
           }
         }
@@ -2906,7 +2911,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
 
   public static Runnable getConfListener(SolrCore core, ZkSolrResourceLoader zkSolrResourceLoader) {
     final String coreName = core.getName();
-    final CoreContainer cc = core.getCoreDescriptor().getCoreContainer();
+    final CoreContainer cc = core.getCoreContainer();
     final String overlayPath = zkSolrResourceLoader.getConfigSetZkPath() + "/" + ConfigOverlay.RESOURCE_NAME;
     final String solrConfigPath = zkSolrResourceLoader.getConfigSetZkPath() + "/" + core.getSolrConfig().getName();
     String schemaRes = null;
@@ -3040,7 +3045,6 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
     if (!BlobRepository.BLOB_KEY_PATTERN_CHECKER.matcher(key).matches()) {
       throw new IllegalArgumentException("invalid key format, must end in /N where N is the version number");
     }
-    CoreContainer coreContainer = getCoreDescriptor().getCoreContainer();
     // define the blob
     BlobRepository.BlobContentRef blobRef = coreContainer.getBlobRepository().getBlobIncRef(key, decoder);
     addCloseHook(new CloseHook() {
@@ -3050,7 +3054,7 @@ public final class SolrCore implements SolrInfoMBean, SolrMetricProducer, Closea
 
       @Override
       public void postClose(SolrCore core) {
-        core.getCoreDescriptor().getCoreContainer().getBlobRepository().decrementBlobRefCount(blobRef);
+        coreContainer.getBlobRepository().decrementBlobRefCount(blobRef);
       }
     });
     return blobRef;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/SolrCores.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCores.java b/solr/core/src/java/org/apache/solr/core/SolrCores.java
index 40d5115..ef6fca5 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCores.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCores.java
@@ -47,7 +47,8 @@ class SolrCores implements Observer {
   private static Object modifyLock = new Object(); // for locking around manipulating any of the core maps.
   private final Map<String, SolrCore> cores = new LinkedHashMap<>(); // For "permanent" cores
 
-  private final Map<String, CoreDescriptor> lazyDescriptors = new LinkedHashMap<>();
+  // These descriptors, once loaded, will _not_ be unloaded, i.e. they are not "transient".
+  private final Map<String, CoreDescriptor> residentDesciptors = new LinkedHashMap<>();
 
   private final CoreContainer container;
   
@@ -67,17 +68,26 @@ class SolrCores implements Observer {
     this.container = container;
   }
   
-  protected void putDynamicDescriptor(String rawName, CoreDescriptor cd) {
+  protected void addCoreDescriptor(CoreDescriptor p) {
     synchronized (modifyLock) {
-      if (cd.isTransient()) {
+      if (p.isTransient()) {
+        if (container.getTransientCacheHandler() != null) {
+          container.getTransientCacheHandler().addTransientDescriptor(p.getName(), p);
+        }
+      } else {
+        residentDesciptors.put(p.getName(), p);
+      }
+    }
+  }
+
+  protected void removeCoreDescriptor(CoreDescriptor p) {
+    synchronized (modifyLock) {
+      if (p.isTransient()) {
         if (container.getTransientCacheHandler() != null) {
-          container.getTransientCacheHandler().addTransientDescriptor(rawName, cd);
-        } else {
-          log.error("Tried to add transient core to transient handler, but no transient core handler has been found. "
-              + " Descriptor: " + cd.toString());
+          container.getTransientCacheHandler().removeTransientDescriptor(p.getName());
         }
       } else {
-        lazyDescriptors.put(rawName, cd);
+        residentDesciptors.remove(p.getName());
       }
     }
   }
@@ -149,10 +159,18 @@ class SolrCores implements Observer {
     return retCore;
   }
 
-  protected SolrCore putCore(String name, SolrCore core) {
+  // Returns the old core if there was a core of the same name.
+  protected SolrCore putCore(CoreDescriptor cd, SolrCore core) {
     synchronized (modifyLock) {
-      return cores.put(name, core);
+      if (cd.isTransient()) {
+        if (container.getTransientCacheHandler() != null) {
+          return container.getTransientCacheHandler().addCore(cd.getName(), core);
+        }
+      } else {
+        return cores.put(cd.getName(), core);
+      }
     }
+    return null;
   }
 
   /**
@@ -231,7 +249,7 @@ class SolrCores implements Observer {
       if (container.getTransientCacheHandler() != null) {
         set.addAll(container.getTransientCacheHandler().getAllCoreNames());
       }
-      set.addAll(lazyDescriptors.keySet());
+      set.addAll(residentDesciptors.keySet());
     }
     return set;
   }
@@ -260,13 +278,19 @@ class SolrCores implements Observer {
           throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No such core: " + n1);
         }
       }
+      // When we swap the cores, we also need to swap the associated core descriptors. Note, this changes the 
+      // name of the coreDescriptor by virtue of the c-tor
+      CoreDescriptor cd1 = c1.getCoreDescriptor(); 
+      addCoreDescriptor(new CoreDescriptor(n1, c0.getCoreDescriptor()));
+      addCoreDescriptor(new CoreDescriptor(n0, cd1));
       cores.put(n0, c1);
       cores.put(n1, c0);
+      c0.setName(n1);
+      c1.setName(n0);
+      
       container.getMetricManager().swapRegistries(
           c0.getCoreMetricManager().getRegistryName(),
           c1.getCoreMetricManager().getRegistryName());
-      c0.setName(n1);
-      c1.setName(n0);
     }
 
   }
@@ -277,12 +301,10 @@ class SolrCores implements Observer {
       SolrCore ret = cores.remove(name);
       // It could have been a newly-created core. It could have been a transient core. The newly-created cores
       // in particular should be checked. It could have been a dynamic core.
-      TransientSolrCoreCache transientHandler = container.getTransientCacheHandler(); 
+      TransientSolrCoreCache transientHandler = container.getTransientCacheHandler();
       if (ret == null && transientHandler != null) {
         ret = transientHandler.removeCore(name);
-        transientHandler.removeTransientDescriptor(name);
       }
-      lazyDescriptors.remove(name);
       return ret;
     }
   }
@@ -304,14 +326,6 @@ class SolrCores implements Observer {
     }
   }
 
-  protected CoreDescriptor getDynamicDescriptor(String name) {
-    synchronized (modifyLock) {
-      CoreDescriptor cd = lazyDescriptors.get(name);
-      if (cd != null || container.getTransientCacheHandler() == null) return cd;
-      return container.getTransientCacheHandler().getTransientDescriptor(name);
-    }
-  }
-
   // See SOLR-5366 for why the UNLOAD command needs to know whether a core is actually loaded or not, it might have
   // to close the core. However, there's a race condition. If the core happens to be in the pending "to close" queue,
   // we should NOT close it in unload core.
@@ -350,7 +364,7 @@ class SolrCores implements Observer {
 
   protected CoreDescriptor getUnloadedCoreDescriptor(String cname) {
     synchronized (modifyLock) {
-      CoreDescriptor desc = lazyDescriptors.get(cname);
+      CoreDescriptor desc = residentDesciptors.get(cname);
       if (desc == null) {
         if (container.getTransientCacheHandler() == null) return null;
         desc = container.getTransientCacheHandler().getTransientDescriptor(cname);
@@ -439,10 +453,8 @@ class SolrCores implements Observer {
    */
   public CoreDescriptor getCoreDescriptor(String coreName) {
     synchronized (modifyLock) {
-      if (cores.containsKey(coreName))
-        return cores.get(coreName).getCoreDescriptor();
-      if (lazyDescriptors.containsKey(coreName) || container.getTransientCacheHandler() == null)
-        return lazyDescriptors.get(coreName);
+      if (residentDesciptors.containsKey(coreName))
+        return residentDesciptors.get(coreName);
       return container.getTransientCacheHandler().getTransientDescriptor(coreName);
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/core/ZkContainer.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/ZkContainer.java b/solr/core/src/java/org/apache/solr/core/ZkContainer.java
index 6665c4e..16ba4d8 100644
--- a/solr/core/src/java/org/apache/solr/core/ZkContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/ZkContainer.java
@@ -115,7 +115,7 @@ public class ZkContainer {
               @Override
               public List<CoreDescriptor> getCurrentDescriptors() {
                 List<CoreDescriptor> descriptors = new ArrayList<>(
-                    cc.getCoreNames().size());
+                    cc.getLoadedCoreNames().size());
                 Collection<SolrCore> cores = cc.getCores();
                 for (SolrCore core : cores) {
                   descriptors.add(core.getCoreDescriptor());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java b/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java
index 713d6fc..fd8d4bb 100644
--- a/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java
+++ b/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java
@@ -62,7 +62,7 @@ class CdcrBufferStateManager extends CdcrStateManager {
 
     // Startup and register the watcher at startup
     try {
-      SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+      SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
       watcher = this.initWatcher(zkClient);
       this.setState(CdcrParams.BufferState.get(zkClient.getData(this.getZnodePath(), watcher, null, true)));
     } catch (KeeperException | InterruptedException e) {
@@ -103,7 +103,7 @@ class CdcrBufferStateManager extends CdcrStateManager {
    * action.
    */
   void synchronize() {
-    SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+    SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
     try {
       zkClient.setData(this.getZnodePath(), this.getState().getBytes(), true);
       // check if nobody changed it in the meantime, and set a new watcher
@@ -114,7 +114,7 @@ class CdcrBufferStateManager extends CdcrStateManager {
   }
 
   private void createStateNode() {
-    SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+    SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
     try {
       if (!zkClient.exists(this.getZnodePath(), true)) {
         if (!zkClient.exists(this.getZnodeBase(), true)) {
@@ -158,7 +158,7 @@ class CdcrBufferStateManager extends CdcrStateManager {
       if (Event.EventType.None.equals(event.getType())) {
         return;
       }
-      SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+      SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
       try {
         CdcrParams.BufferState state = CdcrParams.BufferState.get(zkClient.getData(CdcrBufferStateManager.this.getZnodePath(), watcher, null, true));
         log.info("Received new CDCR buffer state from watcher: {} @ {}:{}", state, collectionName, shard);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java b/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java
index 7d8ddc4..1b4d8af 100644
--- a/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java
+++ b/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java
@@ -53,8 +53,8 @@ class CdcrLeaderStateManager extends CdcrStateManager {
 
     // Fetch leader state and register the watcher at startup
     try {
-      SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
-      ClusterState clusterState = core.getCoreDescriptor().getCoreContainer().getZkController().getClusterState();
+      SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
+      ClusterState clusterState = core.getCoreContainer().getZkController().getClusterState();
 
       watcher = this.initWatcher(zkClient);
       // if the node does not exist, it means that the leader was not yet registered. This can happen
@@ -89,7 +89,7 @@ class CdcrLeaderStateManager extends CdcrStateManager {
   }
 
   private void checkIfIAmLeader() throws KeeperException, InterruptedException {
-    SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+    SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
     ZkNodeProps props = ZkNodeProps.load(zkClient.getData(CdcrLeaderStateManager.this.getZnodePath(), null, null, true));
     if (props != null) {
       CdcrLeaderStateManager.this.setAmILeader(props.get("core").equals(core.getName()));
@@ -144,8 +144,8 @@ class CdcrLeaderStateManager extends CdcrStateManager {
 
       try {
         log.info("Received new leader state @ {}:{}", collectionName, shard);
-        SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
-        ClusterState clusterState = core.getCoreDescriptor().getCoreContainer().getZkController().getClusterState();
+        SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
+        ClusterState clusterState = core.getCoreContainer().getZkController().getClusterState();
         if (CdcrLeaderStateManager.this.isLeaderRegistered(zkClient, clusterState)) {
           CdcrLeaderStateManager.this.checkIfIAmLeader();
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java b/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java
index b1c8dda..05be077 100644
--- a/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java
+++ b/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java
@@ -62,7 +62,7 @@ class CdcrProcessStateManager extends CdcrStateManager {
 
     // Register the watcher at startup
     try {
-      SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+      SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
       watcher = this.initWatcher(zkClient);
       this.setState(CdcrParams.ProcessState.get(zkClient.getData(this.getZnodePath(), watcher, null, true)));
     } catch (KeeperException | InterruptedException e) {
@@ -103,7 +103,7 @@ class CdcrProcessStateManager extends CdcrStateManager {
    * action.
    */
   void synchronize() {
-    SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+    SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
     try {
       zkClient.setData(this.getZnodePath(), this.getState().getBytes(), true);
       // check if nobody changed it in the meantime, and set a new watcher
@@ -114,7 +114,7 @@ class CdcrProcessStateManager extends CdcrStateManager {
   }
 
   private void createStateNode() {
-    SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+    SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
     try {
       if (!zkClient.exists(this.getZnodePath(), true)) {
         if (!zkClient.exists(this.getZnodeBase(), true)) { // Should be a no-op if the node exists
@@ -158,7 +158,7 @@ class CdcrProcessStateManager extends CdcrStateManager {
       if (Event.EventType.None.equals(event.getType())) {
         return;
       }
-      SolrZkClient zkClient = core.getCoreDescriptor().getCoreContainer().getZkController().getZkClient();
+      SolrZkClient zkClient = core.getCoreContainer().getZkController().getZkClient();
       try {
         CdcrParams.ProcessState state = CdcrParams.ProcessState.get(zkClient.getData(CdcrProcessStateManager.this.getZnodePath(), watcher, null, true));
         log.info("Received new CDCR process state from watcher: {} @ {}:{}", state, collectionName, shard);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorManager.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorManager.java b/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorManager.java
index 528e0b7..6f0d704 100644
--- a/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorManager.java
+++ b/solr/core/src/java/org/apache/solr/handler/CdcrReplicatorManager.java
@@ -236,7 +236,7 @@ class CdcrReplicatorManager implements CdcrStateManager.CdcrStateObserver {
       this.ulog = (CdcrUpdateLog) core.getUpdateHandler().getUpdateLog();
       this.state = state;
       this.targetCollection = state.getTargetCollection();
-      String baseUrl = core.getCoreDescriptor().getCoreContainer().getZkController().getBaseUrl();
+      String baseUrl = core.getCoreContainer().getZkController().getBaseUrl();
       this.myCoreUrl = ZkCoreNodeProps.getCoreUrl(baseUrl, core.getName());
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java
index ba174f9..44c8646 100644
--- a/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/CdcrRequestHandler.java
@@ -244,7 +244,7 @@ public class CdcrRequestHandler extends RequestHandlerBase implements SolrCoreAw
     collection = core.getCoreDescriptor().getCloudDescriptor().getCollectionName();
 
     // Make sure that the core is ZKAware
-    if (!core.getCoreDescriptor().getCoreContainer().isZooKeeperAware()) {
+    if (!core.getCoreContainer().isZooKeeperAware()) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
           "Solr instance is not running in SolrCloud mode.");
     }
@@ -390,7 +390,7 @@ public class CdcrRequestHandler extends RequestHandlerBase implements SolrCoreAw
    */
   private void handleCollectionCheckpointAction(SolrQueryRequest req, SolrQueryResponse rsp)
       throws IOException, SolrServerException {
-    ZkController zkController = core.getCoreDescriptor().getCoreContainer().getZkController();
+    ZkController zkController = core.getCoreContainer().getZkController();
     try {
       zkController.getZkStateReader().forceUpdateCollection(collection);
     } catch (Exception e) {
@@ -638,7 +638,7 @@ public class CdcrRequestHandler extends RequestHandlerBase implements SolrCoreAw
           running.set(true);
           String masterUrl = req.getParams().get(ReplicationHandler.MASTER_URL);
           bootstrapCallable = new BootstrapCallable(masterUrl, core);
-          bootstrapFuture = core.getCoreDescriptor().getCoreContainer().getUpdateShardHandler().getRecoveryExecutor().submit(bootstrapCallable);
+          bootstrapFuture = core.getCoreContainer().getUpdateShardHandler().getRecoveryExecutor().submit(bootstrapCallable);
           try {
             bootstrapFuture.get();
           } catch (InterruptedException e) {
@@ -659,7 +659,7 @@ public class CdcrRequestHandler extends RequestHandlerBase implements SolrCoreAw
     };
 
     try {
-      core.getCoreDescriptor().getCoreContainer().getUpdateShardHandler().getUpdateExecutor().submit(runnable);
+      core.getCoreContainer().getUpdateShardHandler().getUpdateExecutor().submit(runnable);
       rsp.add(RESPONSE_STATUS, "submitted");
     } catch (RejectedExecutionException ree)  {
       // no problem, we're probably shutting down

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/CdcrUpdateLogSynchronizer.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrUpdateLogSynchronizer.java b/solr/core/src/java/org/apache/solr/handler/CdcrUpdateLogSynchronizer.java
index 48bfec0..7ce060c 100644
--- a/solr/core/src/java/org/apache/solr/handler/CdcrUpdateLogSynchronizer.java
+++ b/solr/core/src/java/org/apache/solr/handler/CdcrUpdateLogSynchronizer.java
@@ -112,7 +112,7 @@ class CdcrUpdateLogSynchronizer implements CdcrStateManager.CdcrStateObserver {
   private class UpdateLogSynchronisation implements Runnable {
 
     private String getLeaderUrl() {
-      ZkController zkController = core.getCoreDescriptor().getCoreContainer().getZkController();
+      ZkController zkController = core.getCoreContainer().getZkController();
       ClusterState cstate = zkController.getClusterState();
       DocCollection docCollection = cstate.getCollection(collection);
       ZkNodeProps leaderProps = docCollection.getLeader(shardId);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/GraphHandler.java b/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
index 6d41d83..c843e0a 100644
--- a/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
@@ -84,12 +84,12 @@ public class GraphHandler extends RequestHandlerBase implements SolrCoreAware, P
 
     String defaultCollection;
     String defaultZkhost;
-    CoreContainer coreContainer = core.getCoreDescriptor().getCoreContainer();
+    CoreContainer coreContainer = core.getCoreContainer();
     this.coreName = core.getName();
 
     if(coreContainer.isZooKeeperAware()) {
       defaultCollection = core.getCoreDescriptor().getCollectionName();
-      defaultZkhost = core.getCoreDescriptor().getCoreContainer().getZkController().getZkServerAddress();
+      defaultZkhost = core.getCoreContainer().getZkController().getZkServerAddress();
       streamFactory.withCollectionZkHost(defaultCollection, defaultZkhost);
       streamFactory.withDefaultZkHost(defaultZkhost);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
index 6c3da83..89bd1e0 100644
--- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
+++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
@@ -206,7 +206,7 @@ public class IndexFetcher {
     httpClientParams.set(HttpClientUtil.PROP_BASIC_AUTH_PASS, httpBasicAuthPassword);
     httpClientParams.set(HttpClientUtil.PROP_ALLOW_COMPRESSION, useCompression);
 
-    return HttpClientUtil.createClient(httpClientParams, core.getCoreDescriptor().getCoreContainer().getUpdateShardHandler().getConnectionManager());
+    return HttpClientUtil.createClient(httpClientParams, core.getCoreContainer().getUpdateShardHandler().getConnectionManager());
   }
 
   public IndexFetcher(final NamedList initArgs, final ReplicationHandler handler, final SolrCore sc) {
@@ -448,7 +448,7 @@ public class IndexFetcher {
           // because of soft commits (which open a searcher on IW's data)
           // so we need to close the existing searcher on the last commit
           // and wait until we are able to clean up all unused lucene files
-          if (solrCore.getCoreDescriptor().getCoreContainer().isZooKeeperAware()) {
+          if (solrCore.getCoreContainer().isZooKeeperAware()) {
             solrCore.closeSearcher();
           }
 
@@ -616,7 +616,7 @@ public class IndexFetcher {
         }
       }
 
-      if (core.getCoreDescriptor().getCoreContainer().isZooKeeperAware()) {
+      if (core.getCoreContainer().isZooKeeperAware()) {
         // we only track replication success in SolrCloud mode
         core.getUpdateHandler().getSolrCoreState().setLastReplicateIndexSuccess(successfulInstall);
       }
@@ -804,7 +804,7 @@ public class IndexFetcher {
     IndexCommit commitPoint;
     // must get the latest solrCore object because the one we have might be closed because of a reload
     // todo stop keeping solrCore around
-    SolrCore core = solrCore.getCoreDescriptor().getCoreContainer().getCore(solrCore.getName());
+    SolrCore core = solrCore.getCoreContainer().getCore(solrCore.getName());
     try {
       Future[] waitSearcher = new Future[1];
       searcher = core.getSearcher(true, true, waitSearcher, true);
@@ -832,7 +832,7 @@ public class IndexFetcher {
     final CountDownLatch latch = new CountDownLatch(1);
     new Thread(() -> {
       try {
-        solrCore.getCoreDescriptor().getCoreContainer().reload(solrCore.getName());
+        solrCore.getCoreContainer().reload(solrCore.getName());
       } catch (Exception e) {
         LOG.error("Could not reload core ", e);
       } finally {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
index ddf6b6a..34b32a2 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -422,7 +422,7 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
     String location = params.get(CoreAdminParams.BACKUP_LOCATION);
 
     String repoName = params.get(CoreAdminParams.BACKUP_REPOSITORY);
-    CoreContainer cc = core.getCoreDescriptor().getCoreContainer();
+    CoreContainer cc = core.getCoreContainer();
     BackupRepository repo = null;
     if (repoName != null) {
       repo = cc.newBackupRepository(Optional.of(repoName));
@@ -540,7 +540,7 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
 
       String location = params.get(CoreAdminParams.BACKUP_LOCATION);
       String repoName = params.get(CoreAdminParams.BACKUP_REPOSITORY);
-      CoreContainer cc = core.getCoreDescriptor().getCoreContainer();
+      CoreContainer cc = core.getCoreContainer();
       BackupRepository repo = null;
       if (repoName != null) {
         repo = cc.newBackupRepository(Optional.of(repoName));
@@ -678,7 +678,7 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
       }
     }
 
-    if (confFileNameAlias.size() < 1 || core.getCoreDescriptor().getCoreContainer().isZooKeeperAware())
+    if (confFileNameAlias.size() < 1 || core.getCoreContainer().isZooKeeperAware())
       return;
     LOG.debug("Adding config files to list: " + includeConfFiles);
     //if configuration files need to be included get their details
@@ -1173,7 +1173,7 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
     boolean enableMaster = isEnabled( master );
 
     if (enableMaster || enableSlave) {
-      if (core.getCoreDescriptor().getCoreContainer().getZkController() != null) {
+      if (core.getCoreContainer().getZkController() != null) {
         LOG.warn("SolrCloud is enabled for core " + core.getName() + " but so is old-style replication. Make sure you" +
             " intend this behavior, it usually indicates a mis-configuration. Master setting is " +
             Boolean.toString(enableMaster) + " and slave setting is " + Boolean.toString(enableSlave));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
index f307baa..c80d0d7 100644
--- a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
@@ -60,10 +60,10 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
   private boolean isCloud = false;
 
   public void inform(SolrCore core) {
-    CoreContainer coreContainer = core.getCoreDescriptor().getCoreContainer();
+    CoreContainer coreContainer = core.getCoreContainer();
 
     if(coreContainer.isZooKeeperAware()) {
-      defaultZkhost = core.getCoreDescriptor().getCoreContainer().getZkController().getZkServerAddress();
+      defaultZkhost = core.getCoreContainer().getZkController().getZkServerAddress();
       defaultWorkerCollection = core.getCoreDescriptor().getCollectionName();
       isCloud = true;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
index 2660cba..2409e4b 100644
--- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
@@ -436,7 +436,7 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
 
           log.debug("persisted to version : {} ", latestVersion);
           waitForAllReplicasState(req.getCore().getCoreDescriptor().getCloudDescriptor().getCollectionName(),
-              req.getCore().getCoreDescriptor().getCoreContainer().getZkController(), RequestParams.NAME, latestVersion, 30);
+              req.getCore().getCoreContainer().getZkController(), RequestParams.NAME, latestVersion, 30);
         }
 
       } else {
@@ -495,12 +495,12 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
             ConfigOverlay.RESOURCE_NAME, overlay.toByteArray(), true);
         log.info("Executed config commands successfully and persisted to ZK {}", ops);
         waitForAllReplicasState(req.getCore().getCoreDescriptor().getCloudDescriptor().getCollectionName(),
-            req.getCore().getCoreDescriptor().getCoreContainer().getZkController(),
+            req.getCore().getCoreContainer().getZkController(),
             ConfigOverlay.NAME,
             latestVersion, 30);
       } else {
         SolrResourceLoader.persistConfLocally(loader, ConfigOverlay.RESOURCE_NAME, overlay.toByteArray());
-        req.getCore().getCoreDescriptor().getCoreContainer().reload(req.getCore().getName());
+        req.getCore().getCoreContainer().reload(req.getCore().getName());
         log.info("Executed config commands successfully and persited to File System {}", ops);
       }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
index 8a18b89..c7aae20 100644
--- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
@@ -133,12 +133,12 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
 
     String defaultCollection;
     String defaultZkhost;
-    CoreContainer coreContainer = core.getCoreDescriptor().getCoreContainer();
+    CoreContainer coreContainer = core.getCoreContainer();
     this.coreName = core.getName();
 
     if(coreContainer.isZooKeeperAware()) {
       defaultCollection = core.getCoreDescriptor().getCollectionName();
-      defaultZkhost = core.getCoreDescriptor().getCoreContainer().getZkController().getZkServerAddress();
+      defaultZkhost = core.getCoreContainer().getZkController().getZkServerAddress();
       streamFactory.withCollectionZkHost(defaultCollection, defaultZkhost);
       streamFactory.withDefaultZkHost(defaultZkhost);
       modelCache = new ModelCache(250,

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java
index b10aed1..122d2cb 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/LoggingHandler.java
@@ -60,7 +60,7 @@ public class LoggingHandler extends RequestHandlerBase implements SolrCoreAware
   @Override
   public void inform(SolrCore core) {
     if (watcher == null) {
-      watcher = core.getCoreDescriptor().getCoreContainer().getLogging();
+      watcher = core.getCoreContainer().getLogging();
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java b/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java
index d370bef..0c2c903 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/PrepRecoveryOp.java
@@ -196,7 +196,7 @@ class PrepRecoveryOp implements CoreAdminHandler.CoreAdminOp {
                 .getNewestSearcher(false);
             SolrIndexSearcher searcher = searchHolder.get();
             try {
-              log.debug(core.getCoreDescriptor().getCoreContainer()
+              log.debug(core.getCoreContainer()
                   .getZkController().getNodeName()
                   + " to replicate "
                   + searcher.search(new MatchAllDocsQuery(), 1).totalHits

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/admin/RequestSyncShardOp.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/RequestSyncShardOp.java b/solr/core/src/java/org/apache/solr/handler/admin/RequestSyncShardOp.java
index 584a7ca..dd4ae38 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/RequestSyncShardOp.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/RequestSyncShardOp.java
@@ -58,7 +58,7 @@ class RequestSyncShardOp implements CoreAdminHandler.CoreAdminOp {
     try (SolrCore core = it.handler.coreContainer.getCore(cname)) {
 
       if (core != null) {
-        syncStrategy = new SyncStrategy(core.getCoreDescriptor().getCoreContainer());
+        syncStrategy = new SyncStrategy(core.getCoreContainer());
 
         Map<String, Object> props = new HashMap<>();
         props.put(ZkStateReader.BASE_URL_PROP, zkController.getBaseUrl());
@@ -73,7 +73,7 @@ class RequestSyncShardOp implements CoreAdminHandler.CoreAdminOp {
                 .getNewestSearcher(false);
             SolrIndexSearcher searcher = searchHolder.get();
             try {
-              log.debug(core.getCoreDescriptor().getCoreContainer()
+              log.debug(core.getCoreContainer()
                   .getZkController().getNodeName()
                   + " synched "
                   + searcher.search(new MatchAllDocsQuery(), 1).totalHits);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java
index 805a690..02577f1 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java
@@ -127,7 +127,7 @@ public class ShowFileRequestHandler extends RequestHandlerBase
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp)
       throws InterruptedException, KeeperException, IOException {
 
-    CoreContainer coreContainer = req.getCore().getCoreDescriptor().getCoreContainer();
+    CoreContainer coreContainer = req.getCore().getCoreContainer();
     if (coreContainer.isZooKeeperAware()) {
       showFromZooKeeper(req, rsp, coreContainer);
     } else {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
index 297cdbf..c02cfe2 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
@@ -167,7 +167,7 @@ public class SolrInfoMBeanHandler extends RequestHandlerBase {
       }
     }
 
-    for (SolrInfoMBean infoMBean : req.getCore().getCoreDescriptor().getCoreContainer().getResourceLoader().getInfoMBeans()) {
+    for (SolrInfoMBean infoMBean : req.getCore().getCoreContainer().getResourceLoader().getInfoMBeans()) {
       String cat = infoMBean.getCategory().name();
       addMBean(req,cat, cats,requestedKeys,infoMBean.getName(),infoMBean);
       // add it also under back-compat name

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
index fc1679f..8b74491 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
@@ -154,7 +154,7 @@ public class SystemInfoHandler extends RequestHandlerBase
   private CoreContainer getCoreContainer(SolrQueryRequest req, SolrCore core) {
     CoreContainer coreContainer;
     if (core != null) {
-       coreContainer = req.getCore().getCoreDescriptor().getCoreContainer();
+       coreContainer = req.getCore().getCoreContainer();
     } else {
       coreContainer = cc;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java b/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java
index be21733..6466d34 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/DebugComponent.java
@@ -161,7 +161,7 @@ public class DebugComponent extends SearchComponent
 
   @SuppressForbidden(reason = "Need currentTimeMillis, only used for naming")
   private String generateRid(ResponseBuilder rb) {
-    String hostName = rb.req.getCore().getCoreDescriptor().getCoreContainer().getHostName();
+    String hostName = rb.req.getCore().getCoreContainer().getHostName();
     return hostName + "-" + rb.req.getCore().getName() + "-" + System.currentTimeMillis() + "-" + ridCounter.getAndIncrement();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/acf30220/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java b/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
index 40e17a9..8c0a9cb 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
@@ -279,7 +279,7 @@ public class HttpShardHandler extends ShardHandler {
     Map<String,Slice> slices = null;
     CoreDescriptor coreDescriptor = req.getCore().getCoreDescriptor();
     CloudDescriptor cloudDescriptor = coreDescriptor.getCloudDescriptor();
-    ZkController zkController = coreDescriptor.getCoreContainer().getZkController();
+    ZkController zkController = req.getCore().getCoreContainer().getZkController();
 
     final ReplicaListTransformer replicaListTransformer = httpShardHandlerFactory.getReplicaListTransformer(req);