aboutsummaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorZheng Tan <zheng.tan@hulu.com>2016-05-03 12:22:52 -0700
committerShixiong Zhu <shixiong@databricks.com>2016-05-03 12:22:52 -0700
commitf5623b460224ce363316c63f5d28947215078fc5 (patch)
tree5ed669971191c6e7dde17d065d2f6afba6c2bafa /core/src
parent84b3a4a873de8444eda1bd162ed52f79941ec864 (diff)
downloadspark-f5623b460224ce363316c63f5d28947215078fc5.tar.gz
spark-f5623b460224ce363316c63f5d28947215078fc5.tar.bz2
spark-f5623b460224ce363316c63f5d28947215078fc5.zip
[SPARK-15059][CORE] Remove fine-grained lock in ChildFirstURLClassLoader to avoid dead lock
## What changes were proposed in this pull request? In some cases, fine-grained lock have race condition with class-loader lock and have caused dead lock issue. It is safe to drop this fine grained lock and load all classes by single class-loader lock. Author: Zheng Tan <zheng.tan@hulu.com> Closes #12857 from tankkyo/master.
Diffstat (limited to 'core/src')
-rw-r--r--core/src/main/scala/org/apache/spark/util/MutableURLClassLoader.scala31
1 files changed, 5 insertions, 26 deletions
diff --git a/core/src/main/scala/org/apache/spark/util/MutableURLClassLoader.scala b/core/src/main/scala/org/apache/spark/util/MutableURLClassLoader.scala
index 0a3180da87..034826c57e 100644
--- a/core/src/main/scala/org/apache/spark/util/MutableURLClassLoader.scala
+++ b/core/src/main/scala/org/apache/spark/util/MutableURLClassLoader.scala
@@ -19,7 +19,6 @@ package org.apache.spark.util
import java.net.{URL, URLClassLoader}
import java.util.Enumeration
-import java.util.concurrent.ConcurrentHashMap
import scala.collection.JavaConverters._
@@ -48,32 +47,12 @@ private[spark] class ChildFirstURLClassLoader(urls: Array[URL], parent: ClassLoa
private val parentClassLoader = new ParentClassLoader(parent)
- /**
- * Used to implement fine-grained class loading locks similar to what is done by Java 7. This
- * prevents deadlock issues when using non-hierarchical class loaders.
- *
- * Note that due to some issues with implementing class loaders in
- * Scala, Java 7's `ClassLoader.registerAsParallelCapable` method is not called.
- */
- private val locks = new ConcurrentHashMap[String, Object]()
-
override def loadClass(name: String, resolve: Boolean): Class[_] = {
- var lock = locks.get(name)
- if (lock == null) {
- val newLock = new Object()
- lock = locks.putIfAbsent(name, newLock)
- if (lock == null) {
- lock = newLock
- }
- }
-
- lock.synchronized {
- try {
- super.loadClass(name, resolve)
- } catch {
- case e: ClassNotFoundException =>
- parentClassLoader.loadClass(name, resolve)
- }
+ try {
+ super.loadClass(name, resolve)
+ } catch {
+ case e: ClassNotFoundException =>
+ parentClassLoader.loadClass(name, resolve)
}
}