You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2017/06/28 15:41:40 UTC

lucene-solr:master: SOLR-10951, HADOOP-14586: Add a hack to make Hadoop's Shell work with Java 9 release

Repository: lucene-solr
Updated Branches:
  refs/heads/master cdc2cc5af -> 1e93367c0


SOLR-10951, HADOOP-14586: Add a hack to make Hadoop's Shell work with Java 9 release


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

Branch: refs/heads/master
Commit: 1e93367c00bc48905ec66754e0143b82b8cdec55
Parents: cdc2cc5
Author: Uwe Schindler <us...@apache.org>
Authored: Wed Jun 28 17:41:28 2017 +0200
Committer: Uwe Schindler <us...@apache.org>
Committed: Wed Jun 28 17:41:28 2017 +0200

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  3 +
 .../org/apache/solr/servlet/BaseSolrFilter.java |  3 +
 .../apache/solr/servlet/BaseSolrServlet.java    |  3 +
 .../org/apache/solr/util/Java9InitHack.java     | 78 ++++++++++++++++++++
 .../java/org/apache/solr/SolrTestCaseJ4.java    |  6 ++
 5 files changed, 93 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1e93367c/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 3f25c26..208512c 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -527,6 +527,9 @@ Other Changes
   with point fields and provides control over dynamic fields used for the raw amount and currency
   code sub-fields.  (hossman, Steve Rowe)
 
+* SOLR-10966: Add workaround for Hadoop-Common 2.7.2 incompatibility with Java 9.
+  (Uwe Schindler)
+
 ==================  6.6.1 ==================
 
 Bug Fixes

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1e93367c/solr/core/src/java/org/apache/solr/servlet/BaseSolrFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/BaseSolrFilter.java b/solr/core/src/java/org/apache/solr/servlet/BaseSolrFilter.java
index 6f9bbe6..40a2df2 100644
--- a/solr/core/src/java/org/apache/solr/servlet/BaseSolrFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/BaseSolrFilter.java
@@ -18,6 +18,8 @@ package org.apache.solr.servlet;
 
 import javax.servlet.Filter;
 
+import org.apache.solr.util.Java9InitHack;
+
 /**
  * All Solr filters available to the user's webapp should
  * extend this class and not just implement {@link Filter}.
@@ -28,6 +30,7 @@ abstract class BaseSolrFilter implements Filter {
   
   static {
     CheckLoggingConfiguration.check();
+    Java9InitHack.initJava9();
   }
   
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1e93367c/solr/core/src/java/org/apache/solr/servlet/BaseSolrServlet.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/BaseSolrServlet.java b/solr/core/src/java/org/apache/solr/servlet/BaseSolrServlet.java
index 5042e93..e175f8e 100644
--- a/solr/core/src/java/org/apache/solr/servlet/BaseSolrServlet.java
+++ b/solr/core/src/java/org/apache/solr/servlet/BaseSolrServlet.java
@@ -18,6 +18,8 @@ package org.apache.solr.servlet;
 
 import javax.servlet.http.HttpServlet;
 
+import org.apache.solr.util.Java9InitHack;
+
 /**
  * All Solr servlets available to the user's webapp should
  * extend this class and not {@link HttpServlet}.
@@ -29,6 +31,7 @@ abstract class BaseSolrServlet extends HttpServlet {
   
   static {
     CheckLoggingConfiguration.check();
+    Java9InitHack.initJava9();
   }
   
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1e93367c/solr/core/src/java/org/apache/solr/util/Java9InitHack.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/util/Java9InitHack.java b/solr/core/src/java/org/apache/solr/util/Java9InitHack.java
new file mode 100644
index 0000000..0565207
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/util/Java9InitHack.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr.util;
+
+import java.lang.invoke.MethodHandles;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Objects;
+
+import org.apache.lucene.util.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class works around a bug in hadoop-common-2.7.2 where the Hadoop Shell class cannot
+ * initialize on Java 9 (due to a bug while parsing Java's version number).
+ * This class does some early checks and fakes the java version for a very short time
+ * during class loading of Solr's web application or Solr's test framework.
+ * <p>
+ * Be sure to run this only in static initializers, as soon as possible after JVM startup!
+ * <p>
+ * Related issues: HADOOP-14586, SOLR-10966
+ * <p>
+ * TODO: <b>Remove this ASAP, once we have upgraded Hadoop (SOLR-10951)!</b>
+ * 
+ * @lucene.internal
+ */
+public final class Java9InitHack {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  
+  private static final String JAVA_VERSION_PROP = "java.version";
+  private static boolean done = false;
+
+  /**
+   * Runs the hack. Should be done as early as possible on JVM startup, from a static initializer
+   * to prevent concurrency issues - because we change temporarily some 'important' system properties.
+   */
+  public static synchronized void initJava9() {
+    if (Constants.JRE_IS_MINIMUM_JAVA9 && done == false) {
+      AccessController.doPrivileged((PrivilegedAction<Void>) Java9InitHack::initPrivileged);
+      done = true;
+    }
+  }
+     
+  private static Void initPrivileged() {
+    log.info("Adding temporary workaround for Hadoop's Shell class to allow running on Java 9 (please ignore any warnings/failures).");
+    String oldVersion = System.getProperty(JAVA_VERSION_PROP);
+    try {
+      System.setProperty(JAVA_VERSION_PROP, "1.9");
+      Class.forName("org.apache.hadoop.util.Shell");
+    } catch (Throwable t) {
+      log.warn("Cannot initialize Hadoop's Shell class on Java 9.", t);
+    } finally {
+      if (!Objects.equals(System.getProperty(JAVA_VERSION_PROP), oldVersion)) {
+        System.setProperty(JAVA_VERSION_PROP, oldVersion);
+      }
+    }
+    return null;
+  }
+  
+  private Java9InitHack() {}
+    
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1e93367c/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
----------------------------------------------------------------------
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
index e9b7043..c8ec6c0 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -115,6 +115,7 @@ import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.servlet.DirectSolrConnection;
 import org.apache.solr.util.AbstractSolrTestCase;
+import org.apache.solr.util.Java9InitHack;
 import org.apache.solr.util.LogLevel;
 import org.apache.solr.util.RandomizeSSL;
 import org.apache.solr.util.RandomizeSSL.SSLRandomizer;
@@ -160,6 +161,11 @@ import static java.util.Objects.requireNonNull;
 public abstract class SolrTestCaseJ4 extends LuceneTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+  
+  // this must be a static init block to be safe!
+  static {
+    Java9InitHack.initJava9();
+  }
 
   private static final List<String> DEFAULT_STACK_FILTERS = Arrays.asList(new String [] {
       "org.junit.",