From 234a637085451b27c7f7c5ca18d94d46c0815d9d Mon Sep 17 00:00:00 2001 From: Dongjoon Hyun Date: Mon, 22 Jan 2018 20:59:31 -0800 Subject: [PATCH 1/2] [SPARK-23186][SQL] Initialize DriverManager first before loading Drivers --- .../spark/sql/execution/datasources/jdbc/DriverRegistry.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/DriverRegistry.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/DriverRegistry.scala index 7a6c0f9fed2f9..f7b070d5f34ad 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/DriverRegistry.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/DriverRegistry.scala @@ -32,6 +32,9 @@ import org.apache.spark.util.Utils */ object DriverRegistry extends Logging { + // Initialize DriverManager first to prevent potential deadlocks between DriverManager and Driver + DriverManager.getDrivers + private val wrapperMap: mutable.Map[String, DriverWrapper] = mutable.Map.empty def register(className: String): Unit = { From 52e6f19a660be4d6a1589d42a452884a8caf26ac Mon Sep 17 00:00:00 2001 From: Dongjoon Hyun Date: Fri, 2 Feb 2018 18:22:10 -0800 Subject: [PATCH 2/2] Update comments. --- .../sql/execution/datasources/jdbc/DriverRegistry.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/DriverRegistry.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/DriverRegistry.scala index f7b070d5f34ad..1723596de1db2 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/DriverRegistry.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/DriverRegistry.scala @@ -32,7 +32,11 @@ import org.apache.spark.util.Utils */ object DriverRegistry extends Logging { - // Initialize DriverManager first to prevent potential deadlocks between DriverManager and Driver + /** + * Load DriverManager first to avoid any race condition between + * DriverManager static initialization block and specific driver class's + * static initialization block. e.g. PhoenixDriver + */ DriverManager.getDrivers private val wrapperMap: mutable.Map[String, DriverWrapper] = mutable.Map.empty