Skip to content

Commit fbb8ab5

Browse files
author
Marcelo Vanzin
committed
Add locking in loadClass() to avoid deadlocks.
See discussions in SPARK-5358 and related PRs.
1 parent 2e6c4b7 commit fbb8ab5

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

core/src/main/scala/org/apache/spark/executor/ExecutorURLClassLoader.scala

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package org.apache.spark.executor
1919

2020
import java.net.{URLClassLoader, URL}
2121
import java.util.Enumeration
22+
import java.util.concurrent.ConcurrentHashMap
2223

2324
import scala.collection.JavaConversions._
2425

@@ -38,13 +39,25 @@ private[spark] class ChildExecutorURLClassLoader(urls: Array[URL], parent: Class
3839
extends URLClassLoader(urls, null) with MutableURLClassLoader {
3940

4041
private val parentClassLoader = new ParentClassLoader(parent)
42+
private val locks = new ConcurrentHashMap[String, Object]()
4143

4244
override def loadClass(name: String, resolve: Boolean): Class[_] = {
43-
try {
44-
super.loadClass(name, resolve)
45-
} catch {
46-
case e: ClassNotFoundException =>
47-
parentClassLoader.loadClass(name)
45+
var lock = locks.get(name)
46+
if (lock == null) {
47+
val newLock = new Object()
48+
lock = locks.putIfAbsent(name, newLock)
49+
if (lock == null) {
50+
lock = newLock
51+
}
52+
}
53+
54+
lock.synchronized {
55+
try {
56+
super.loadClass(name, resolve)
57+
} catch {
58+
case e: ClassNotFoundException =>
59+
parentClassLoader.loadClass(name)
60+
}
4861
}
4962
}
5063

0 commit comments

Comments
 (0)