Skip to content

Commit 7cb0c44

Browse files
committed
child first classpath first has no regular parent
1 parent a6fc300 commit 7cb0c44

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveUtils.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import org.apache.spark.sql.internal.SQLConf
4747
import org.apache.spark.sql.internal.SQLConf._
4848
import org.apache.spark.sql.internal.StaticSQLConf.{CATALOG_IMPLEMENTATION, WAREHOUSE_PATH}
4949
import org.apache.spark.sql.types._
50-
import org.apache.spark.util.Utils
50+
import org.apache.spark.util.{ChildFirstURLClassLoader, Utils}
5151

5252

5353
private[spark] object HiveUtils extends Logging {
@@ -312,6 +312,8 @@ private[spark] object HiveUtils extends Logging {
312312
// starting from the given classLoader.
313313
def allJars(classLoader: ClassLoader): Array[URL] = classLoader match {
314314
case null => Array.empty[URL]
315+
case childFirst: ChildFirstURLClassLoader =>
316+
childFirst.getURLs() ++ allJars(Utils.getSparkClassLoader)
315317
case urlClassLoader: URLClassLoader =>
316318
urlClassLoader.getURLs ++ allJars(urlClassLoader.getParent)
317319
case other => allJars(other.getParent)

sql/hive/src/test/scala/org/apache/spark/sql/hive/HiveUtilsSuite.scala

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,16 @@
1717

1818
package org.apache.spark.sql.hive
1919

20+
import java.net.URL
21+
2022
import org.apache.hadoop.hive.conf.HiveConf.ConfVars
2123

24+
import org.apache.spark.SparkConf
25+
import org.apache.spark.deploy.SparkHadoopUtil
2226
import org.apache.spark.sql.QueryTest
2327
import org.apache.spark.sql.hive.test.TestHiveSingleton
2428
import org.apache.spark.sql.test.SQLTestUtils
29+
import org.apache.spark.util.{ChildFirstURLClassLoader, MutableURLClassLoader}
2530

2631
class HiveUtilsSuite extends QueryTest with SQLTestUtils with TestHiveSingleton {
2732

@@ -42,4 +47,31 @@ class HiveUtilsSuite extends QueryTest with SQLTestUtils with TestHiveSingleton
4247
assert(hiveConf("foo") === "bar")
4348
}
4449
}
50+
51+
test("ChildFirstURLClassLoader's parent is null") {
52+
val conf = new SparkConf
53+
val contextClassLoader = Thread.currentThread().getContextClassLoader
54+
val loader = new FakeChildFirstURLClassLoader(Array(), contextClassLoader)
55+
Thread.currentThread().setContextClassLoader(loader)
56+
intercept[IllegalArgumentException](
57+
HiveUtils.newClientForMetadata(conf, SparkHadoopUtil.newConfiguration(conf)))
58+
Thread.currentThread().setContextClassLoader(contextClassLoader)
59+
}
60+
61+
test("ChildFirstURLClassLoader's parent is null, get spark classloader instead") {
62+
val conf = new SparkConf
63+
val contextClassLoader = Thread.currentThread().getContextClassLoader
64+
val loader = new ChildFirstURLClassLoader(Array(), contextClassLoader)
65+
Thread.currentThread().setContextClassLoader(loader)
66+
HiveUtils.newClientForMetadata(conf, SparkHadoopUtil.newConfiguration(conf))
67+
Thread.currentThread().setContextClassLoader(contextClassLoader)
68+
}
4569
}
70+
71+
/**
72+
* A Fake [[ChildFirstURLClassLoader]] used for test
73+
* @param urls
74+
* @param parent
75+
*/
76+
class FakeChildFirstURLClassLoader(urls: Array[URL], parent: ClassLoader)
77+
extends MutableURLClassLoader(urls, null)

0 commit comments

Comments
 (0)