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 2013/04/01 04:04:03 UTC
svn commit: r1463076 - in /lucene/dev/branches/branch_4x: ./ dev-tools/
lucene/ lucene/analysis/
lucene/analysis/icu/src/java/org/apache/lucene/collation/ lucene/backwards/
lucene/benchmark/ lucene/classification/ lucene/classification/src/
lucene/code...
Author: erick
Date: Mon Apr 1 02:04:02 2013
New Revision: 1463076
URL: http://svn.apache.org/r1463076
Log:
SOLR-4657 harden OpenCloseCoreStressTest
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/dev-tools/ (props changed)
lucene/dev/branches/branch_4x/lucene/ (props changed)
lucene/dev/branches/branch_4x/lucene/BUILD.txt (props changed)
lucene/dev/branches/branch_4x/lucene/CHANGES.txt (props changed)
lucene/dev/branches/branch_4x/lucene/JRE_VERSION_MIGRATION.txt (props changed)
lucene/dev/branches/branch_4x/lucene/LICENSE.txt (props changed)
lucene/dev/branches/branch_4x/lucene/MIGRATE.txt (props changed)
lucene/dev/branches/branch_4x/lucene/NOTICE.txt (props changed)
lucene/dev/branches/branch_4x/lucene/README.txt (props changed)
lucene/dev/branches/branch_4x/lucene/SYSTEM_REQUIREMENTS.txt (props changed)
lucene/dev/branches/branch_4x/lucene/analysis/ (props changed)
lucene/dev/branches/branch_4x/lucene/analysis/icu/src/java/org/apache/lucene/collation/ICUCollationKeyFilterFactory.java (props changed)
lucene/dev/branches/branch_4x/lucene/backwards/ (props changed)
lucene/dev/branches/branch_4x/lucene/benchmark/ (props changed)
lucene/dev/branches/branch_4x/lucene/build.xml (props changed)
lucene/dev/branches/branch_4x/lucene/classification/ (props changed)
lucene/dev/branches/branch_4x/lucene/classification/build.xml (props changed)
lucene/dev/branches/branch_4x/lucene/classification/ivy.xml (props changed)
lucene/dev/branches/branch_4x/lucene/classification/src/ (props changed)
lucene/dev/branches/branch_4x/lucene/codecs/ (props changed)
lucene/dev/branches/branch_4x/lucene/common-build.xml (props changed)
lucene/dev/branches/branch_4x/lucene/core/ (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/index.40.cfs.zip (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/index.40.nocfs.zip (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/index.40.optimized.cfs.zip (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/index.40.optimized.nocfs.zip (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestSort.java (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestSortDocValues.java (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestSortRandom.java (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java (props changed)
lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/search/TestTotalHitCountCollector.java (props changed)
lucene/dev/branches/branch_4x/lucene/demo/ (props changed)
lucene/dev/branches/branch_4x/lucene/facet/ (props changed)
lucene/dev/branches/branch_4x/lucene/grouping/ (props changed)
lucene/dev/branches/branch_4x/lucene/highlighter/ (props changed)
lucene/dev/branches/branch_4x/lucene/ivy-settings.xml (props changed)
lucene/dev/branches/branch_4x/lucene/join/ (props changed)
lucene/dev/branches/branch_4x/lucene/licenses/ (props changed)
lucene/dev/branches/branch_4x/lucene/memory/ (props changed)
lucene/dev/branches/branch_4x/lucene/misc/ (props changed)
lucene/dev/branches/branch_4x/lucene/module-build.xml (props changed)
lucene/dev/branches/branch_4x/lucene/queries/ (props changed)
lucene/dev/branches/branch_4x/lucene/queryparser/ (props changed)
lucene/dev/branches/branch_4x/lucene/sandbox/ (props changed)
lucene/dev/branches/branch_4x/lucene/site/ (props changed)
lucene/dev/branches/branch_4x/lucene/spatial/ (props changed)
lucene/dev/branches/branch_4x/lucene/suggest/ (props changed)
lucene/dev/branches/branch_4x/lucene/test-framework/ (props changed)
lucene/dev/branches/branch_4x/lucene/tools/ (props changed)
lucene/dev/branches/branch_4x/solr/ (props changed)
lucene/dev/branches/branch_4x/solr/CHANGES.txt (props changed)
lucene/dev/branches/branch_4x/solr/LICENSE.txt (props changed)
lucene/dev/branches/branch_4x/solr/NOTICE.txt (props changed)
lucene/dev/branches/branch_4x/solr/README.txt (props changed)
lucene/dev/branches/branch_4x/solr/SYSTEM_REQUIREMENTS.txt (props changed)
lucene/dev/branches/branch_4x/solr/build.xml (props changed)
lucene/dev/branches/branch_4x/solr/cloud-dev/ (props changed)
lucene/dev/branches/branch_4x/solr/common-build.xml (props changed)
lucene/dev/branches/branch_4x/solr/contrib/ (props changed)
lucene/dev/branches/branch_4x/solr/core/ (props changed)
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
lucene/dev/branches/branch_4x/solr/core/src/test/org/apache/solr/core/TestConfig.java (props changed)
lucene/dev/branches/branch_4x/solr/example/ (props changed)
lucene/dev/branches/branch_4x/solr/licenses/ (props changed)
lucene/dev/branches/branch_4x/solr/licenses/httpclient-LICENSE-ASL.txt (props changed)
lucene/dev/branches/branch_4x/solr/licenses/httpclient-NOTICE.txt (props changed)
lucene/dev/branches/branch_4x/solr/licenses/httpcore-LICENSE-ASL.txt (props changed)
lucene/dev/branches/branch_4x/solr/licenses/httpcore-NOTICE.txt (props changed)
lucene/dev/branches/branch_4x/solr/licenses/httpmime-LICENSE-ASL.txt (props changed)
lucene/dev/branches/branch_4x/solr/licenses/httpmime-NOTICE.txt (props changed)
lucene/dev/branches/branch_4x/solr/scripts/ (props changed)
lucene/dev/branches/branch_4x/solr/site/ (props changed)
lucene/dev/branches/branch_4x/solr/solrj/ (props changed)
lucene/dev/branches/branch_4x/solr/test-framework/ (props changed)
lucene/dev/branches/branch_4x/solr/webapp/ (props changed)
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1463076&r1=1463075&r2=1463076&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/CoreContainer.java Mon Apr 1 02:04:02 2013
@@ -1434,61 +1434,75 @@ class CoreMaps {
}
}
- // We are shutting down. We don't want to risk deadlock, so do this manipulation the expensive way. Note, I've
- // already deadlocked with closing/opening cores while keeping locks here....
+ // We are shutting down. You can't hold the lock on the various lists of cores while they shut down, so we need to
+ // make a temporary copy of the names and shut them down outside the lock.
protected void clearMaps(ConfigSolr cfg) {
List<String> coreNames;
List<String> transientNames;
List<SolrCore> pendingToClose;
- synchronized (locker) {
- coreNames = new ArrayList(cores.keySet());
- transientNames = new ArrayList(transientCores.keySet());
- pendingToClose = new ArrayList(pendingCloses);
- }
- for (String coreName : coreNames) {
- SolrCore core = cores.get(coreName);
- if (core != null) {
- try {
- addPersistOneCore(cfg, core, container.loader);
- core.close();
- } catch (Throwable t) {
- SolrException.log(CoreContainer.log, "Error shutting down core", t);
- } finally {
- synchronized (locker) {
- cores.remove(coreName);
+ // It might be possible for one of the cores to move from one list to another while we're closing them. So
+ // loop through the lists until they're all empty. In particular, the core could have moved from the transient
+ // list to the pendingCloses list.
+
+ while (true) {
+ synchronized (locker) {
+ coreNames = new ArrayList(cores.keySet());
+ transientNames = new ArrayList(transientCores.keySet());
+ pendingToClose = new ArrayList(pendingCloses);
+ }
+
+ if (coreNames.size() == 0 && transientNames.size() == 0 && pendingToClose.size() == 0) break;
+
+ for (String coreName : coreNames) {
+ SolrCore core = cores.get(coreName);
+ if (core == null) {
+ CoreContainer.log.info("Core " + coreName + " moved from core container list before closing.");
+ } else {
+ try {
+ addPersistOneCore(cfg, core, container.loader);
+
+ core.close();
+ } catch (Throwable t) {
+ SolrException.log(CoreContainer.log, "Error shutting down core", t);
+ } finally {
+ synchronized (locker) {
+ cores.remove(coreName);
+ }
}
}
}
- }
- for (String coreName : transientNames) {
- SolrCore core = transientCores.get(coreName);
- if (core != null) {
+ for (String coreName : transientNames) {
+ SolrCore core = transientCores.get(coreName);
+ if (core == null) {
+ CoreContainer.log.info("Core " + coreName + " moved from transient core container list before closing.");
+ } else {
+ try {
+ core.close();
+ } catch (Throwable t) {
+ SolrException.log(CoreContainer.log, "Error shutting down core", t);
+ } finally {
+ synchronized (locker) {
+ transientCores.remove(coreName);
+ }
+ }
+ }
+ }
+
+ // We might have some cores that we were _thinking_ about shutting down, so take care of those too.
+ for (SolrCore core : pendingToClose) {
try {
core.close();
} catch (Throwable t) {
SolrException.log(CoreContainer.log, "Error shutting down core", t);
} finally {
synchronized (locker) {
- transientCores.remove(coreName);
+ pendingCloses.remove(core);
}
}
}
}
-
- // We might have some cores that we were _thinking_ about shutting down, so take care of those too.
- for (SolrCore core : pendingToClose) {
- try {
- core.close();
- } catch (Throwable t) {
- SolrException.log(CoreContainer.log, "Error shutting down core", t);
- } finally {
- synchronized (locker) {
- pendingCloses.remove(core);
- }
- }
- }
}
protected void addCoresToList(ArrayList<SolrCoreState> coreStates) {