You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2015/01/08 20:52:57 UTC
svn commit: r1650367 - in /lucene/dev/branches/branch_5x: ./ dev-tools/
lucene/ lucene/analysis/
lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/
lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/
lucene...
Author: hossman
Date: Thu Jan 8 19:52:56 2015
New Revision: 1650367
URL: http://svn.apache.org/r1650367
Log:
SOLR-6643: Fix error reporting & logging of low level JVM Errors that occur when loading/reloading a SolrCore (merge r1650350)
Added:
lucene/dev/branches/branch_5x/solr/core/src/test-files/solr/collection1/conf/bad-error-solrconfig.xml
- copied unchanged from r1650350, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/bad-error-solrconfig.xml
lucene/dev/branches/branch_5x/solr/core/src/test-files/solr/collection1/conf/bad-schema-init-error.xml
- copied unchanged from r1650350, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/bad-schema-init-error.xml
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/handler/ThrowErrorOnInitRequestHandler.java
- copied unchanged from r1650350, lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/ThrowErrorOnInitRequestHandler.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/schema/ThrowErrorOnInitFieldType.java
- copied unchanged from r1650350, lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/ThrowErrorOnInitFieldType.java
Modified:
lucene/dev/branches/branch_5x/ (props changed)
lucene/dev/branches/branch_5x/dev-tools/ (props changed)
lucene/dev/branches/branch_5x/lucene/ (props changed)
lucene/dev/branches/branch_5x/lucene/BUILD.txt (props changed)
lucene/dev/branches/branch_5x/lucene/CHANGES.txt (props changed)
lucene/dev/branches/branch_5x/lucene/JRE_VERSION_MIGRATION.txt (props changed)
lucene/dev/branches/branch_5x/lucene/LICENSE.txt (props changed)
lucene/dev/branches/branch_5x/lucene/MIGRATE.txt (props changed)
lucene/dev/branches/branch_5x/lucene/NOTICE.txt (props changed)
lucene/dev/branches/branch_5x/lucene/README.txt (props changed)
lucene/dev/branches/branch_5x/lucene/SYSTEM_REQUIREMENTS.txt (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/ (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/Lucene47WordDelimiterFilter.java (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/ASCIITLD.jflex-macro (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/SUPPLEMENTARY.jflex-macro (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/StandardTokenizerImpl40.java (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/StandardTokenizerImpl40.jflex (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/UAX29URLEmailTokenizerImpl40.java (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/UAX29URLEmailTokenizerImpl40.jflex (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std40/package.html (props changed)
lucene/dev/branches/branch_5x/lucene/analysis/common/src/test/org/apache/lucene/analysis/miscellaneous/TestLucene47WordDelimiterFilter.java (props changed)
lucene/dev/branches/branch_5x/lucene/backward-codecs/ (props changed)
lucene/dev/branches/branch_5x/lucene/benchmark/ (props changed)
lucene/dev/branches/branch_5x/lucene/build.xml (props changed)
lucene/dev/branches/branch_5x/lucene/classification/ (props changed)
lucene/dev/branches/branch_5x/lucene/classification/build.xml (props changed)
lucene/dev/branches/branch_5x/lucene/classification/ivy.xml (props changed)
lucene/dev/branches/branch_5x/lucene/classification/src/ (props changed)
lucene/dev/branches/branch_5x/lucene/codecs/ (props changed)
lucene/dev/branches/branch_5x/lucene/common-build.xml (props changed)
lucene/dev/branches/branch_5x/lucene/core/ (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions2.java (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSort.java (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestSortRandom.java (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java (props changed)
lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/search/TestTotalHitCountCollector.java (props changed)
lucene/dev/branches/branch_5x/lucene/demo/ (props changed)
lucene/dev/branches/branch_5x/lucene/expressions/ (props changed)
lucene/dev/branches/branch_5x/lucene/facet/ (props changed)
lucene/dev/branches/branch_5x/lucene/grouping/ (props changed)
lucene/dev/branches/branch_5x/lucene/highlighter/ (props changed)
lucene/dev/branches/branch_5x/lucene/ivy-ignore-conflicts.properties (props changed)
lucene/dev/branches/branch_5x/lucene/ivy-settings.xml (props changed)
lucene/dev/branches/branch_5x/lucene/ivy-versions.properties (props changed)
lucene/dev/branches/branch_5x/lucene/join/ (props changed)
lucene/dev/branches/branch_5x/lucene/licenses/ (props changed)
lucene/dev/branches/branch_5x/lucene/memory/ (props changed)
lucene/dev/branches/branch_5x/lucene/misc/ (props changed)
lucene/dev/branches/branch_5x/lucene/module-build.xml (props changed)
lucene/dev/branches/branch_5x/lucene/queries/ (props changed)
lucene/dev/branches/branch_5x/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionQuerySort.java (props changed)
lucene/dev/branches/branch_5x/lucene/queryparser/ (props changed)
lucene/dev/branches/branch_5x/lucene/replicator/ (props changed)
lucene/dev/branches/branch_5x/lucene/sandbox/ (props changed)
lucene/dev/branches/branch_5x/lucene/site/ (props changed)
lucene/dev/branches/branch_5x/lucene/spatial/ (props changed)
lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/bbox/ (props changed)
lucene/dev/branches/branch_5x/lucene/spatial/src/java/org/apache/lucene/spatial/util/ShapeAreaValueSource.java (props changed)
lucene/dev/branches/branch_5x/lucene/spatial/src/test-files/data/simple-bbox.txt (props changed)
lucene/dev/branches/branch_5x/lucene/spatial/src/test-files/simple-Queries-BBox.txt (props changed)
lucene/dev/branches/branch_5x/lucene/spatial/src/test/org/apache/lucene/spatial/bbox/ (props changed)
lucene/dev/branches/branch_5x/lucene/suggest/ (props changed)
lucene/dev/branches/branch_5x/lucene/test-framework/ (props changed)
lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/codecs/cranky/ (props changed)
lucene/dev/branches/branch_5x/lucene/tools/ (props changed)
lucene/dev/branches/branch_5x/lucene/version.properties (props changed)
lucene/dev/branches/branch_5x/solr/ (props changed)
lucene/dev/branches/branch_5x/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_5x/solr/LICENSE.txt (props changed)
lucene/dev/branches/branch_5x/solr/NOTICE.txt (props changed)
lucene/dev/branches/branch_5x/solr/README.txt (props changed)
lucene/dev/branches/branch_5x/solr/SYSTEM_REQUIREMENTS.txt (props changed)
lucene/dev/branches/branch_5x/solr/bin/ (props changed)
lucene/dev/branches/branch_5x/solr/build.xml (props changed)
lucene/dev/branches/branch_5x/solr/cloud-dev/ (props changed)
lucene/dev/branches/branch_5x/solr/common-build.xml (props changed)
lucene/dev/branches/branch_5x/solr/contrib/ (props changed)
lucene/dev/branches/branch_5x/solr/core/ (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/request/DocValuesStats.java (props changed)
lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/SchemaManager.java (props changed)
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/CoreContainerCoreInitFailuresTest.java
lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestConfig.java (props changed)
lucene/dev/branches/branch_5x/solr/example/ (props changed)
lucene/dev/branches/branch_5x/solr/licenses/ (props changed)
lucene/dev/branches/branch_5x/solr/licenses/httpclient-LICENSE-ASL.txt (props changed)
lucene/dev/branches/branch_5x/solr/licenses/httpclient-NOTICE.txt (props changed)
lucene/dev/branches/branch_5x/solr/licenses/httpcore-LICENSE-ASL.txt (props changed)
lucene/dev/branches/branch_5x/solr/licenses/httpcore-NOTICE.txt (props changed)
lucene/dev/branches/branch_5x/solr/licenses/httpmime-LICENSE-ASL.txt (props changed)
lucene/dev/branches/branch_5x/solr/licenses/httpmime-NOTICE.txt (props changed)
lucene/dev/branches/branch_5x/solr/scripts/ (props changed)
lucene/dev/branches/branch_5x/solr/server/ (props changed)
lucene/dev/branches/branch_5x/solr/site/ (props changed)
lucene/dev/branches/branch_5x/solr/solrj/ (props changed)
lucene/dev/branches/branch_5x/solr/test-framework/ (props changed)
lucene/dev/branches/branch_5x/solr/webapp/ (props changed)
Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1650367&r1=1650366&r2=1650367&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Thu Jan 8 19:52:56 2015
@@ -364,6 +364,9 @@ Bug Fixes
* SOLR-6880: Harden ZkStateReader to expect that getCollectionLive may return null
as it's contract states. (Mark Miller, shalin)
+* SOLR-6643: Fix error reporting & logging of low level JVM Errors that occur when
+ loading/reloading a SolrCore (hossman)
+
Optimizations
----------------------
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1650367&r1=1650366&r2=1650367&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java Thu Jan 8 19:52:56 2015
@@ -519,11 +519,15 @@ public class CoreContainer {
return core;
- }
- catch (Exception e) {
+ } catch (Exception e) {
coreInitFailures.put(dcore.getName(), new CoreLoadFailure(dcore, e));
log.error("Error creating core [{}]: {}", dcore.getName(), e.getMessage(), e);
throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to create core [" + dcore.getName() + "]", e);
+ } catch (Throwable t) {
+ SolrException e = new SolrException(ErrorCode.SERVER_ERROR, "JVM Error creating core [" + dcore.getName() + "]: " + t.getMessage(), t);
+ log.error("Error creating core [{}]: {}", dcore.getName(), t.getMessage(), t);
+ coreInitFailures.put(dcore.getName(), new CoreLoadFailure(dcore, e));
+ throw t;
}
}
Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=1650367&r1=1650366&r2=1650367&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java Thu Jan 8 19:52:56 2015
@@ -519,41 +519,11 @@ public class SolrResourceLoader implemen
return newInstance(name, expectedType, empty);
}
- public <T> T newInstance(String cname, Class<T> expectedType, String ... subpackages) {
- Class<? extends T> clazz = findClass(cname, expectedType, subpackages);
- if( clazz == null ) {
- throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
- "Can not find class: "+cname + " in " + classLoader);
- }
-
- T obj = null;
- try {
- obj = clazz.newInstance();
- }
- catch (Exception e) {
- throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
- "Error instantiating class: '" + clazz.getName()+"'", e);
- }
+ private static final Class[] NO_CLASSES = new Class[0];
+ private static final Object[] NO_OBJECTS = new Object[0];
- if (!live) {
- if( obj instanceof SolrCoreAware ) {
- assertAwareCompatibility( SolrCoreAware.class, obj );
- waitingForCore.add( (SolrCoreAware)obj );
- }
- if (org.apache.solr.util.plugin.ResourceLoaderAware.class.isInstance(obj)) {
- log.warn("Class [{}] uses org.apache.solr.util.plugin.ResourceLoaderAware " +
- "which is deprecated. Change to org.apache.lucene.analysis.util.ResourceLoaderAware.", cname);
- }
- if( obj instanceof ResourceLoaderAware ) {
- assertAwareCompatibility( ResourceLoaderAware.class, obj );
- waitingForResources.add( (ResourceLoaderAware)obj );
- }
- if (obj instanceof SolrInfoMBean){
- //TODO: Assert here?
- infoMBeans.add((SolrInfoMBean) obj);
- }
- }
- return obj;
+ public <T> T newInstance(String cname, Class<T> expectedType, String ... subpackages) {
+ return newInstance(cname, expectedType, subpackages, NO_CLASSES, NO_OBJECTS);
}
public CoreAdminHandler newAdminHandlerInstance(final CoreContainer coreContainer, String cname, String ... subpackages) {
@@ -603,8 +573,13 @@ public class SolrResourceLoader implemen
Constructor<? extends T> constructor = clazz.getConstructor(params);
obj = constructor.newInstance(args);
- }
- catch (Exception e) {
+
+ } catch (Error err) {
+ log.error("Loading Class " + cName + " ("+clazz.getName() + ") triggered serious java error: "
+ + err.getClass().getName(), err);
+ throw err;
+
+ } catch (Exception e) {
throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,
"Error instantiating class: '" + clazz.getName()+"'", e);
}
Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/CoreContainerCoreInitFailuresTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/CoreContainerCoreInitFailuresTest.java?rev=1650367&r1=1650366&r2=1650367&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/CoreContainerCoreInitFailuresTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/CoreContainerCoreInitFailuresTest.java Thu Jan 8 19:52:56 2015
@@ -315,6 +315,103 @@ public class CoreContainerCoreInitFailur
}
+ public void testJavaLangErrorFromHandlerOnStartup() throws Exception {
+
+ // reused state
+ Map<String,CoreContainer.CoreLoadFailure> failures = null;
+ Collection<String> cores = null;
+ Exception fail = null;
+
+ init("java_lang_error_handler");
+
+ // start with two collections: 1 ok, and 1 that throws java.lang.Error on startup
+ File solrXml = new File(solrHome, "solr.xml");
+ FileUtils.write(solrXml, BAD_SOLR_XML, IOUtils.UTF_8);
+
+ // our "ok" collection
+ FileUtils.copyFile(getFile("solr/collection1/conf/solrconfig-defaults.xml"),
+ FileUtils.getFile(solrHome, "col_ok", "conf", "solrconfig.xml"));
+ FileUtils.copyFile(getFile("solr/collection1/conf/schema-minimal.xml"),
+ FileUtils.getFile(solrHome, "col_ok", "conf", "schema.xml"));
+
+ // our "bad" collection
+ ignoreException(Pattern.quote("my_error_handler"));
+ FileUtils.copyFile(getFile("solr/collection1/conf/bad-error-solrconfig.xml"),
+ FileUtils.getFile(solrHome, "col_bad", "conf", "solrconfig.xml"));
+ FileUtils.copyFile(getFile("solr/collection1/conf/schema-minimal.xml"),
+ FileUtils.getFile(solrHome, "col_bad", "conf", "schema.xml"));
+
+
+ // -----
+ // init the CoreContainer with the mix of ok/bad cores
+ cc = new CoreContainer(solrHome.getAbsolutePath());
+ cc.load();
+
+ // check that we have the cores we expect
+ cores = cc.getCoreNames();
+ assertNotNull("core names is null", cores);
+ assertEquals("wrong number of cores", 1, cores.size());
+ assertTrue("col_ok not found", cores.contains("col_ok"));
+
+ // check that we have the failures we expect
+ failures = cc.getCoreInitFailures();
+ assertNotNull("core failures is a null map", failures);
+ assertEquals("wrong number of core failures", 1, failures.size());
+ fail = failures.get("col_bad").exception;
+ assertNotNull("null failure for test core", fail);
+ assertTrue("init failure doesn't mention root problem: " + fail.getMessage(),
+ 0 < fail.getMessage().indexOf("throwing a java.lang.Error"));
+ }
+
+ public void testJavaLangErrorFromSchemaOnStartup() throws Exception {
+
+ // reused state
+ Map<String,CoreContainer.CoreLoadFailure> failures = null;
+ Collection<String> cores = null;
+ Exception fail = null;
+
+ init("java_lang_error_schema");
+
+ // start with two collections: 1 ok, and 1 that throws java.lang.Error on startup
+ File solrXml = new File(solrHome, "solr.xml");
+ FileUtils.write(solrXml, BAD_SOLR_XML, IOUtils.UTF_8);
+
+ // our "ok" collection
+ FileUtils.copyFile(getFile("solr/collection1/conf/solrconfig-defaults.xml"),
+ FileUtils.getFile(solrHome, "col_ok", "conf", "solrconfig.xml"));
+ FileUtils.copyFile(getFile("solr/collection1/conf/schema-minimal.xml"),
+ FileUtils.getFile(solrHome, "col_ok", "conf", "schema.xml"));
+
+ // our "bad" collection
+ ignoreException(Pattern.quote("error_ft"));
+ FileUtils.copyFile(getFile("solr/collection1/conf/solrconfig-defaults.xml"),
+ FileUtils.getFile(solrHome, "col_bad", "conf", "solrconfig.xml"));
+ FileUtils.copyFile(getFile("solr/collection1/conf/bad-schema-init-error.xml"),
+ FileUtils.getFile(solrHome, "col_bad", "conf", "schema.xml"));
+
+
+ // -----
+ // init the CoreContainer with the mix of ok/bad cores
+ cc = new CoreContainer(solrHome.getAbsolutePath());
+ cc.load();
+
+ // check that we have the cores we expect
+ cores = cc.getCoreNames();
+ assertNotNull("core names is null", cores);
+ assertEquals("wrong number of cores", 1, cores.size());
+ assertTrue("col_ok not found", cores.contains("col_ok"));
+
+ // check that we have the failures we expect
+ failures = cc.getCoreInitFailures();
+ assertNotNull("core failures is a null map", failures);
+ assertEquals("wrong number of core failures", 1, failures.size());
+ fail = failures.get("col_bad").exception;
+ assertNotNull("null failure for test core", fail);
+ assertTrue("init failure doesn't mention root problem: " + fail.getMessage(),
+ 0 < fail.getMessage().indexOf("throwing java.lang.Error"));
+
+ }
+
private long getCoreStartTime(final CoreContainer cc, final String name) {
try (SolrCore tmp = cc.getCore(name)) {
return tmp.getStartTime();