This is an automated email from the ASF dual-hosted git repository.

frankchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 92fb0ff718c upgrade mysql:mysql-connector-java to 8.2.0 (#16024)
92fb0ff718c is described below

commit 92fb0ff718c19c1a683e609d4334b06adab30a68
Author: Alberic Liu <[email protected]>
AuthorDate: Mon May 6 06:58:37 2024 -0700

    upgrade mysql:mysql-connector-java to 8.2.0 (#16024)
    
    * upgrade mysql:mysql-connector-java to 8.2.0
    
    * fix the check errors
    
    * remove unused comment
---
 distribution/docker/Dockerfile.mysql               |  8 +--
 docs/configuration/index.md                        | 10 +--
 docs/development/extensions-core/mysql.md          |  4 +-
 docs/operations/use_sbt_to_build_fat_jar.md        |  2 +-
 extensions-core/lookups-cached-global/pom.xml      |  4 +-
 .../JdbcExtractionNamespaceUrlCheckTest.java       | 40 ------------
 extensions-core/lookups-cached-single/pom.xml      |  4 +-
 .../lookup/jdbc/JdbcDataFetcherUrlCheckTest.java   | 35 ----------
 extensions-core/mysql-metadata-storage/pom.xml     |  4 +-
 .../metadata/storage/mysql/MySQLConnector.java     |  4 +-
 .../sql/MySQLFirehoseDatabaseConnectorTest.java    | 24 -------
 .../metadata/storage/mysql/MySQLConnectorTest.java | 11 +---
 integration-tests-ex/cases/pom.xml                 |  6 +-
 integration-tests-ex/image/docker/Dockerfile       |  2 +-
 integration-tests-ex/image/pom.xml                 |  8 +--
 integration-tests/docker/Dockerfile                |  6 +-
 .../docker/environment-configs/common              |  2 +-
 .../docker/environment-configs/common-ldap         |  2 +-
 pom.xml                                            |  2 +-
 processing/pom.xml                                 |  4 +-
 .../org/apache/druid/utils/ConnectionUriUtils.java | 74 ++++++++++++++++++----
 .../apache/druid/utils/ConnectionUriUtilsTest.java | 11 +---
 .../initialization/JdbcAccessSecurityConfig.java   |  2 +-
 23 files changed, 103 insertions(+), 166 deletions(-)

diff --git a/distribution/docker/Dockerfile.mysql 
b/distribution/docker/Dockerfile.mysql
index 7a5209674f3..66fb9e90a71 100644
--- a/distribution/docker/Dockerfile.mysql
+++ b/distribution/docker/Dockerfile.mysql
@@ -22,10 +22,10 @@ FROM $DRUID_RELEASE
 
 WORKDIR /opt/druid/extensions/mysql-metadata-storage
 
-ARG 
MYSQL_URL=https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar
-ARG MYSQL_JAR=mysql-connector-java-5.1.49.jar
-# 
https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar.sha1
-ARG MYSQL_SHA=cf76d2e4c9c3782a85c15c87bec5772b34ffd0e5
+ARG 
MYSQL_URL=https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar
+ARG MYSQL_JAR=mysql-connector-j-8.2.0.jar
+# 
https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar.sha1
+ARG MYSQL_SHA=56d34aea30915904b1c883f1cfae731dd2df6029
 
 RUN wget -q ${MYSQL_URL} \
  && echo "${MYSQL_SHA}  ${MYSQL_JAR}" | sha1sum -c \
diff --git a/docs/configuration/index.md b/docs/configuration/index.md
index 91f4db60e69..c618e196dbc 100644
--- a/docs/configuration/index.md
+++ b/docs/configuration/index.md
@@ -631,11 +631,11 @@ You can use the following properties to specify 
permissible JDBC options for:
 
 These properties do not apply to metadata storage connections.
 
-|Property|Possible values|Description|Default|
-|--------|---------------|-----------|-------|
-|`druid.access.jdbc.enforceAllowedProperties`|Boolean|When true, Druid applies 
`druid.access.jdbc.allowedProperties` to JDBC connections starting with 
`jdbc:postgresql:`, `jdbc:mysql:`, or `jdbc:mariadb:`. When false, Druid allows 
any kind of JDBC connections without JDBC property validation. This config is 
for backward compatibility especially during upgrades since enforcing allow 
list can break existing ingestion jobs or lookups based on JDBC. This config is 
deprecated and will be remo [...]
-|`druid.access.jdbc.allowedProperties`|List of JDBC properties|Defines a list 
of allowed JDBC properties. Druid always enforces the list for all JDBC 
connections starting with `jdbc:postgresql:`, `jdbc:mysql:`, and 
`jdbc:mariadb:` if `druid.access.jdbc.enforceAllowedProperties` is set to 
true.<br/><br/>This option is tested against MySQL connector 5.1.49, MariaDB 
connector 2.7.4, and PostgreSQL connector 42.2.14. Other connector versions 
might not work.|`["useSSL", "requireSSL", "ssl", " [...]
-|`druid.access.jdbc.allowUnknownJdbcUrlFormat`|Boolean|When false, Druid only 
accepts JDBC connections starting with `jdbc:postgresql:` or `jdbc:mysql:`. 
When true, Druid allows JDBC connections to any kind of database, but only 
enforces `druid.access.jdbc.allowedProperties` for PostgreSQL and 
MySQL/MariaDB.|true|
+|Property|Possible values| Description                                         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
           |Default|
+|--------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|
+|`druid.access.jdbc.enforceAllowedProperties`|Boolean| When true, Druid 
applies `druid.access.jdbc.allowedProperties` to JDBC connections starting with 
`jdbc:postgresql:`, `jdbc:mysql:`, or `jdbc:mariadb:`. When false, Druid allows 
any kind of JDBC connections without JDBC property validation. This config is 
for backward compatibility especially during upgrades since enforcing allow 
list can break existing ingestion jobs or lookups based on JDBC. This config is 
deprecated and will be rem [...]
+|`druid.access.jdbc.allowedProperties`|List of JDBC properties| Defines a list 
of allowed JDBC properties. Druid always enforces the list for all JDBC 
connections starting with `jdbc:postgresql:`, `jdbc:mysql:`, and 
`jdbc:mariadb:` if `druid.access.jdbc.enforceAllowedProperties` is set to 
true.<br/><br/>This option is tested against MySQL connector 8.2.0, MariaDB 
connector 2.7.4, and PostgreSQL connector 42.2.14. Other connector versions 
might not work.                                    [...]
+|`druid.access.jdbc.allowUnknownJdbcUrlFormat`|Boolean| When false, Druid only 
accepts JDBC connections starting with `jdbc:postgresql:` or `jdbc:mysql:`. 
When true, Druid allows JDBC connections to any kind of database, but only 
enforces `druid.access.jdbc.allowedProperties` for PostgreSQL and 
MySQL/MariaDB.                                                                  
                                                                                
                                     [...]
 
 ### Task logging
 
diff --git a/docs/development/extensions-core/mysql.md 
b/docs/development/extensions-core/mysql.md
index 1a0d3d04a83..bc6012dbb5a 100644
--- a/docs/development/extensions-core/mysql.md
+++ b/docs/development/extensions-core/mysql.md
@@ -36,10 +36,10 @@ This extension can use Oracle's MySQL JDBC driver which is 
not included in the D
 install it separately. There are a few ways to obtain this library:
 
 - It can be downloaded from the MySQL site at: 
https://dev.mysql.com/downloads/connector/j/
-- It can be fetched from Maven Central at: 
https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar
+- It can be fetched from Maven Central at: 
https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar
 - It may be available through your package manager, e.g. as `libmysql-java` on 
APT for a Debian-based OS
 
-This fetches the MySQL connector JAR file with a name like 
`mysql-connector-java-5.1.49.jar`.
+This fetches the MySQL connector JAR file with a name like 
`mysql-connector-j-8.2.0.jar`.
 
 Copy or symlink this file inside the folder 
`extensions/mysql-metadata-storage` under the distribution root directory.
 
diff --git a/docs/operations/use_sbt_to_build_fat_jar.md 
b/docs/operations/use_sbt_to_build_fat_jar.md
index 055ddd236c4..eeb58c9734e 100644
--- a/docs/operations/use_sbt_to_build_fat_jar.md
+++ b/docs/operations/use_sbt_to_build_fat_jar.md
@@ -102,7 +102,7 @@ libraryDependencies ++= Seq(
   "com.fasterxml.jackson.jaxrs" % "jackson-jaxrs-smile-provider" % "2.3.0",
   "com.fasterxml.jackson.module" % "jackson-module-jaxb-annotations" % "2.3.0",
   "com.sun.jersey" % "jersey-servlet" % "1.17.1",
-  "mysql" % "mysql-connector-java" % "5.1.34",
+  "mysql" % "mysql-connector-java" % "8.2.0",
   "org.scalatest" %% "scalatest" % "2.2.3" % "test",
   "org.mockito" % "mockito-core" % "1.10.19" % "test"
 )
diff --git a/extensions-core/lookups-cached-global/pom.xml 
b/extensions-core/lookups-cached-global/pom.xml
index 2b7522445f4..d4e09011df9 100644
--- a/extensions-core/lookups-cached-global/pom.xml
+++ b/extensions-core/lookups-cached-global/pom.xml
@@ -158,8 +158,8 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
+      <groupId>com.mysql</groupId>
+      <artifactId>mysql-connector-j</artifactId>
       <version>${mysql.version}</version>
       <scope>test</scope>
     </dependency>
diff --git 
a/extensions-core/lookups-cached-global/src/test/java/org/apache/druid/query/lookup/namespace/JdbcExtractionNamespaceUrlCheckTest.java
 
b/extensions-core/lookups-cached-global/src/test/java/org/apache/druid/query/lookup/namespace/JdbcExtractionNamespaceUrlCheckTest.java
index d2ba30b4946..2b49877c997 100644
--- 
a/extensions-core/lookups-cached-global/src/test/java/org/apache/druid/query/lookup/namespace/JdbcExtractionNamespaceUrlCheckTest.java
+++ 
b/extensions-core/lookups-cached-global/src/test/java/org/apache/druid/query/lookup/namespace/JdbcExtractionNamespaceUrlCheckTest.java
@@ -156,46 +156,6 @@ public class JdbcExtractionNamespaceUrlCheckTest
           }
       );
     }
-
-    @Test
-    public void testWhenInvalidUrlFormat()
-    {
-      expectedException.expect(IllegalArgumentException.class);
-      expectedException.expectMessage("Invalid URL format for MySQL: 
[jdbc:mysql:/invalid-url::3006]");
-      new JdbcExtractionNamespace(
-          new MetadataStorageConnectorConfig()
-          {
-            @Override
-            public String getConnectURI()
-            {
-              return "jdbc:mysql:/invalid-url::3006";
-            }
-          },
-          TABLE_NAME,
-          KEY_NAME,
-          VAL_NAME,
-          TS_COLUMN,
-          "some filter",
-          new Period(10),
-          null,
-          0,
-          null,
-          new JdbcAccessSecurityConfig()
-          {
-            @Override
-            public Set<String> getAllowedProperties()
-            {
-              return ImmutableSet.of("valid_key1", "valid_key2");
-            }
-
-            @Override
-            public boolean isEnforceAllowedProperties()
-            {
-              return true;
-            }
-          }
-      );
-    }
   }
 
   public static class PostgreSqlTest
diff --git a/extensions-core/lookups-cached-single/pom.xml 
b/extensions-core/lookups-cached-single/pom.xml
index 2bb114d5083..62d84bf20ef 100644
--- a/extensions-core/lookups-cached-single/pom.xml
+++ b/extensions-core/lookups-cached-single/pom.xml
@@ -117,8 +117,8 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
+      <groupId>com.mysql</groupId>
+      <artifactId>mysql-connector-j</artifactId>
       <version>${mysql.version}</version>
       <scope>test</scope>
     </dependency>
diff --git 
a/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/jdbc/JdbcDataFetcherUrlCheckTest.java
 
b/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/jdbc/JdbcDataFetcherUrlCheckTest.java
index b38875b5189..c2279438626 100644
--- 
a/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/jdbc/JdbcDataFetcherUrlCheckTest.java
+++ 
b/extensions-core/lookups-cached-single/src/test/java/org/apache/druid/server/lookup/jdbc/JdbcDataFetcherUrlCheckTest.java
@@ -139,41 +139,6 @@ public class JdbcDataFetcherUrlCheckTest
           }
       );
     }
-
-    @Test
-    public void testWhenInvalidUrlFormat()
-    {
-      expectedException.expect(IllegalArgumentException.class);
-      expectedException.expectMessage("Invalid URL format for MySQL: 
[jdbc:mysql:/invalid-url::3006]");
-      new JdbcDataFetcher(
-          new MetadataStorageConnectorConfig()
-          {
-            @Override
-            public String getConnectURI()
-            {
-              return "jdbc:mysql:/invalid-url::3006";
-            }
-          },
-          TABLE_NAME,
-          KEY_COLUMN,
-          VALUE_COLUMN,
-          100,
-          new JdbcAccessSecurityConfig()
-          {
-            @Override
-            public Set<String> getAllowedProperties()
-            {
-              return ImmutableSet.of("valid_key1", "valid_key2");
-            }
-
-            @Override
-            public boolean isEnforceAllowedProperties()
-            {
-              return true;
-            }
-          }
-      );
-    }
   }
 
   public static class PostgreSqlTest
diff --git a/extensions-core/mysql-metadata-storage/pom.xml 
b/extensions-core/mysql-metadata-storage/pom.xml
index b26cc3279f7..7c2bad187f5 100644
--- a/extensions-core/mysql-metadata-storage/pom.xml
+++ b/extensions-core/mysql-metadata-storage/pom.xml
@@ -48,8 +48,8 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
             <version>${mysql.version}</version>
             <scope>provided</scope>
         </dependency>
diff --git 
a/extensions-core/mysql-metadata-storage/src/main/java/org/apache/druid/metadata/storage/mysql/MySQLConnector.java
 
b/extensions-core/mysql-metadata-storage/src/main/java/org/apache/druid/metadata/storage/mysql/MySQLConnector.java
index 5c4be5b084c..b6a05b300f0 100644
--- 
a/extensions-core/mysql-metadata-storage/src/main/java/org/apache/druid/metadata/storage/mysql/MySQLConnector.java
+++ 
b/extensions-core/mysql-metadata-storage/src/main/java/org/apache/druid/metadata/storage/mysql/MySQLConnector.java
@@ -48,7 +48,7 @@ public class MySQLConnector extends SQLMetadataConnector
   private static final String QUOTE_STRING = "`";
   private static final String COLLATION = "CHARACTER SET utf8mb4 COLLATE 
utf8mb4_bin";
   private static final String MYSQL_TRANSIENT_EXCEPTION_CLASS_NAME
-      = "com.mysql.jdbc.exceptions.MySQLTransientException";
+      = "java.sql.SQLTransientException";
   private static final String MARIA_DB_PACKET_EXCEPTION_CLASS_NAME
       = "org.mariadb.jdbc.internal.util.exceptions.MaxAllowedPacketException";
   private static final String MYSQL_PACKET_EXCEPTION_CLASS_NAME
@@ -281,7 +281,7 @@ public class MySQLConnector extends SQLMetadataConnector
       if (failIfNotFound) {
         throw new ISE(e, "Could not find %s on the classpath. The MySQL 
Connector library is not included in the Druid "
                          + "distribution but is required to use MySQL. Please 
download a compatible library (for example "
-                         + "'mysql-connector-java-5.1.49.jar') and place it 
under 'extensions/mysql-metadata-storage/'. See "
+                         + "'mysql-connector-j-8.2.0.jar') and place it under 
'extensions/mysql-metadata-storage/'. See "
                          + "https://druid.apache.org/downloads for more 
details.",
                       className
         );
diff --git 
a/extensions-core/mysql-metadata-storage/src/test/java/org/apache/druid/firehose/sql/MySQLFirehoseDatabaseConnectorTest.java
 
b/extensions-core/mysql-metadata-storage/src/test/java/org/apache/druid/firehose/sql/MySQLFirehoseDatabaseConnectorTest.java
index 035aec7d6aa..43d96961c1b 100644
--- 
a/extensions-core/mysql-metadata-storage/src/test/java/org/apache/druid/firehose/sql/MySQLFirehoseDatabaseConnectorTest.java
+++ 
b/extensions-core/mysql-metadata-storage/src/test/java/org/apache/druid/firehose/sql/MySQLFirehoseDatabaseConnectorTest.java
@@ -25,7 +25,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableSet;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import org.apache.druid.jackson.DefaultObjectMapper;
-import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.metadata.MetadataStorageConnectorConfig;
 import org.apache.druid.metadata.storage.mysql.MySQLConnectorDriverConfig;
 import org.apache.druid.metadata.storage.mysql.MySQLMetadataStorageModule;
@@ -338,29 +337,6 @@ public class MySQLFirehoseDatabaseConnectorTest
     );
   }
 
-  @Test
-  public void testFindPropertyKeysFromInvalidConnectUrl()
-  {
-    final String url = "jdbc:mysql:/invalid-url::3006";
-    MetadataStorageConnectorConfig connectorConfig = new 
MetadataStorageConnectorConfig()
-    {
-      @Override
-      public String getConnectURI()
-      {
-        return url;
-      }
-    };
-
-    expectedException.expect(RuntimeException.class);
-    expectedException.expectMessage(StringUtils.format("Invalid URL format for 
MySQL: [%s]", url));
-    new MySQLFirehoseDatabaseConnector(
-        connectorConfig,
-        null,
-        new JdbcAccessSecurityConfig(),
-        mySQLConnectorDriverConfig
-    );
-  }
-
   private static JdbcAccessSecurityConfig 
newSecurityConfigEnforcingAllowList(Set<String> allowedProperties)
   {
     return new JdbcAccessSecurityConfig()
diff --git 
a/extensions-core/mysql-metadata-storage/src/test/java/org/apache/druid/metadata/storage/mysql/MySQLConnectorTest.java
 
b/extensions-core/mysql-metadata-storage/src/test/java/org/apache/druid/metadata/storage/mysql/MySQLConnectorTest.java
index 2fa0dbd6ffa..083c3372cfc 100644
--- 
a/extensions-core/mysql-metadata-storage/src/test/java/org/apache/druid/metadata/storage/mysql/MySQLConnectorTest.java
+++ 
b/extensions-core/mysql-metadata-storage/src/test/java/org/apache/druid/metadata/storage/mysql/MySQLConnectorTest.java
@@ -20,8 +20,6 @@
 package org.apache.druid.metadata.storage.mysql;
 
 import com.google.common.base.Supplier;
-import com.mysql.jdbc.exceptions.MySQLTransactionRollbackException;
-import com.mysql.jdbc.exceptions.MySQLTransientException;
 import org.apache.druid.metadata.MetadataStorageConnectorConfig;
 import org.apache.druid.metadata.MetadataStorageTablesConfig;
 import org.apache.druid.segment.metadata.CentralizedDatasourceSchemaConfig;
@@ -82,16 +80,13 @@ public class MySQLConnectorTest
         MYSQL_DRIVER_CONFIG,
         centralizedDatasourceSchemaConfig
     );
-    Assert.assertTrue(connector.connectorIsTransientException(new 
MySQLTransientException()));
-    Assert.assertTrue(connector.connectorIsTransientException(new 
MySQLTransactionRollbackException()));
     Assert.assertTrue(
         connector.connectorIsTransientException(new SQLException("some 
transient failure", "s0", 1317))
     );
     Assert.assertFalse(
         connector.connectorIsTransientException(new SQLException("totally 
realistic test data", "s0", 1337))
     );
-    // this method does not specially handle normal transient exceptions 
either, since it is not vendor specific
-    Assert.assertFalse(
+    Assert.assertTrue(
         connector.connectorIsTransientException(new 
SQLTransientConnectionException("transient"))
     );
   }
@@ -107,7 +102,7 @@ public class MySQLConnectorTest
         centralizedDatasourceSchemaConfig
     );
     // no vendor specific for MariaDb, so should always be false
-    Assert.assertFalse(connector.connectorIsTransientException(new 
MySQLTransientException()));
+    Assert.assertFalse(connector.connectorIsTransientException(new 
SQLTransientException()));
     Assert.assertFalse(
         connector.connectorIsTransientException(new SQLException("some 
transient failure", "s0", 1317))
     );
@@ -143,7 +138,7 @@ public class MySQLConnectorTest
         connector.isRootCausePacketTooBigException(new SQLTransientException())
     );
     Assert.assertFalse(
-        connector.isRootCausePacketTooBigException(new 
MySQLTransientException())
+        connector.isRootCausePacketTooBigException(new SQLTransientException())
     );
   }
 
diff --git a/integration-tests-ex/cases/pom.xml 
b/integration-tests-ex/cases/pom.xml
index d6ab677cf81..9880c14c070 100644
--- a/integration-tests-ex/cases/pom.xml
+++ b/integration-tests-ex/cases/pom.xml
@@ -182,8 +182,8 @@
         </dependency>
         <!-- Tests can choose either the MySQL or MariaDB driver. -->
         <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
             <version>${mysql.version}</version>
             <scope>runtime</scope>
         </dependency>
@@ -340,7 +340,7 @@
                     </ignoredUsedUndeclaredDependencies>
                     <!-- Dynamically loaded. -->
                     <ignoredUnusedDeclaredDependencies>
-                        
<ignoredUnusedDeclaredDependency>mysql:mysql-connector-java:jar</ignoredUnusedDeclaredDependency>
+                        
<ignoredUnusedDeclaredDependency>com.mysql:mysql-connector-j:jar</ignoredUnusedDeclaredDependency>
                     </ignoredUnusedDeclaredDependencies>
                 </configuration>
             </plugin>
diff --git a/integration-tests-ex/image/docker/Dockerfile 
b/integration-tests-ex/image/docker/Dockerfile
index 962562d6676..a77a5c2d023 100644
--- a/integration-tests-ex/image/docker/Dockerfile
+++ b/integration-tests-ex/image/docker/Dockerfile
@@ -54,7 +54,7 @@ ENV DRUID_HOME=/usr/local/druid
 COPY apache-druid-${DRUID_VERSION}-bin.tar.gz /usr/local/
 COPY druid-it-tools-${DRUID_VERSION}.jar /tmp/druid/extensions/druid-it-tools/
 COPY kafka-protobuf-provider-${CONFLUENT_VERSION}.jar /tmp/druid/lib/
-COPY mysql-connector-java-${MYSQL_VERSION}.jar /tmp/druid/lib/
+COPY mysql-connector-j-${MYSQL_VERSION}.jar /tmp/druid/lib/
 COPY mariadb-java-client-${MARIADB_VERSION}.jar /tmp/druid/lib/
 COPY test-setup.sh /
 COPY druid.sh /
diff --git a/integration-tests-ex/image/pom.xml 
b/integration-tests-ex/image/pom.xml
index bca16ccfba6..600501edb92 100644
--- a/integration-tests-ex/image/pom.xml
+++ b/integration-tests-ex/image/pom.xml
@@ -102,8 +102,8 @@ Reference: 
https://dzone.com/articles/build-docker-image-from-maven
                 </dependency>
                 <!-- Tests can choose either the MySQL or MariaDB driver. -->
                 <dependency>
-                    <groupId>mysql</groupId>
-                    <artifactId>mysql-connector-java</artifactId>
+                    <groupId>com.mysql</groupId>
+                    <artifactId>mysql-connector-j</artifactId>
                     <version>${mysql.version}</version>
                 </dependency>
                 <dependency>
@@ -131,8 +131,8 @@ Reference: 
https://dzone.com/articles/build-docker-image-from-maven
                                 <configuration>
                                     <artifactItems>
                                         <artifactItem>
-                                            <groupId>mysql</groupId>
-                                            
<artifactId>mysql-connector-java</artifactId>
+                                            <groupId>com.mysql</groupId>
+                                            
<artifactId>mysql-connector-j</artifactId>
                                             <version>${mysql.version}</version>
                                             <type>jar</type>
                                             <overWrite>true</overWrite>
diff --git a/integration-tests/docker/Dockerfile 
b/integration-tests/docker/Dockerfile
index 85eb624cbb5..40b1cee4f9b 100644
--- a/integration-tests/docker/Dockerfile
+++ b/integration-tests/docker/Dockerfile
@@ -53,11 +53,11 @@ COPY extensions/ /usr/local/druid/extensions/
 # target path must match the exact path referenced in 
environment-configs/common
 # alternatively: Download the MariaDB Java connector, and pretend it is the 
mysql connector
 RUN if [ "$MYSQL_DRIVER_CLASSNAME" = "com.mysql.jdbc.Driver" ] ; \
-    then wget -q 
"https://repo1.maven.org/maven2/mysql/mysql-connector-java/$MYSQL_VERSION/mysql-connector-java-$MYSQL_VERSION.jar";
 \
-    -O /usr/local/druid/lib/mysql-connector-java.jar; \
+    then wget -q 
"https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/$MYSQL_VERSION/mysql-connector-j-$MYSQL_VERSION.jar";
 \
+    -O /usr/local/druid/lib/mysql-connector-j.jar; \
     elif [ "$MYSQL_DRIVER_CLASSNAME" = "org.mariadb.jdbc.Driver" ] ; \
     then wget -q 
"https://repo1.maven.org/maven2/org/mariadb/jdbc/mariadb-java-client/$MARIA_VERSION/mariadb-java-client-$MARIA_VERSION.jar";
 \
-    -O /usr/local/druid/lib/mysql-connector-java.jar; \
+    -O /usr/local/druid/lib/mysql-connector-j.jar; \
     fi
 
 # download kafka protobuf provider
diff --git a/integration-tests/docker/environment-configs/common 
b/integration-tests/docker/environment-configs/common
index e4bc11b7ce4..3ce06d90ea2 100644
--- a/integration-tests/docker/environment-configs/common
+++ b/integration-tests/docker/environment-configs/common
@@ -24,7 +24,7 @@ LC_ALL=C.UTF-8
 # JAVA OPTS
 COMMON_DRUID_JAVA_OPTS=-Duser.timezone=UTC -Dfile.encoding=UTF-8 
-Dlog4j.configurationFile=/shared/docker/lib/log4j2.xml 
-XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError 
-XX:OnOutOfMemoryError='chmod 644 /shared/logs/*.hprof' 
-XX:HeapDumpPath=/shared/logs
 DRUID_DEP_BIN_DIR=/shared/docker/bin
-DRUID_DEP_LIB_DIR=/shared/hadoop_xml:/shared/docker/lib/*:/usr/local/druid/lib/mysql-connector-java.jar
+DRUID_DEP_LIB_DIR=/shared/hadoop_xml:/shared/docker/lib/*:/usr/local/druid/lib/mysql-connector-j.jar
 
 # Druid configs
 # If you are making a change in load list below, make the necessary changes in 
github actions too
diff --git a/integration-tests/docker/environment-configs/common-ldap 
b/integration-tests/docker/environment-configs/common-ldap
index 021c9192927..fae9b18c341 100644
--- a/integration-tests/docker/environment-configs/common-ldap
+++ b/integration-tests/docker/environment-configs/common-ldap
@@ -25,7 +25,7 @@ AWS_REGION=us-east-1
 # JAVA OPTS
 COMMON_DRUID_JAVA_OPTS=-Duser.timezone=UTC -Dfile.encoding=UTF-8 
-Dlog4j.configurationFile=/shared/docker/lib/log4j2.xml 
-XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError 
-XX:OnOutOfMemoryError='chmod 644 /shared/logs/*.hprof'  
-XX:HeapDumpPath=/shared/logs
 DRUID_DEP_BIN_DIR=/shared/docker/bin
-DRUID_DEP_LIB_DIR=/shared/hadoop_xml:/shared/docker/lib/*:/usr/local/druid/lib/mysql-connector-java.jar
+DRUID_DEP_LIB_DIR=/shared/hadoop_xml:/shared/docker/lib/*:/usr/local/druid/lib/mysql-connector-j.jar
 
 # Druid configs
 # If you are making a change in load list below, make the necessary changes in 
github actions too
diff --git a/pom.xml b/pom.xml
index db1026b4032..0a20ee973c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -104,7 +104,7 @@
         <jackson.version>2.12.7.20221012</jackson.version>
         <codehaus.jackson.version>1.9.13</codehaus.jackson.version>
         <log4j.version>2.22.1</log4j.version>
-        <mysql.version>5.1.49</mysql.version>
+        <mysql.version>8.2.0</mysql.version>
         <mariadb.version>2.7.3</mariadb.version>
         <netty3.version>3.10.6.Final</netty3.version>
         <netty4.version>4.1.108.Final</netty4.version>
diff --git a/processing/pom.xml b/processing/pom.xml
index 5b1c7f629df..df0ca6fd464 100644
--- a/processing/pom.xml
+++ b/processing/pom.xml
@@ -449,8 +449,8 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
+      <groupId>com.mysql</groupId>
+      <artifactId>mysql-connector-j</artifactId>
       <version>${mysql.version}</version>
       <scope>test</scope>
     </dependency>
diff --git 
a/processing/src/main/java/org/apache/druid/utils/ConnectionUriUtils.java 
b/processing/src/main/java/org/apache/druid/utils/ConnectionUriUtils.java
index bc3700ead0b..80c296ef653 100644
--- a/processing/src/main/java/org/apache/druid/utils/ConnectionUriUtils.java
+++ b/processing/src/main/java/org/apache/druid/utils/ConnectionUriUtils.java
@@ -28,6 +28,8 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
@@ -43,7 +45,8 @@ public final class ConnectionUriUtils
   public static final String MARIADB_PREFIX = "jdbc:mariadb:";
 
   public static final String POSTGRES_DRIVER = "org.postgresql.Driver";
-  public static final String MYSQL_NON_REGISTERING_DRIVER = 
"com.mysql.jdbc.NonRegisteringDriver";
+  public static final String MYSQL_CONNECTION_URL = 
"com.mysql.cj.conf.ConnectionUrl";
+  public static final String MYSQL_HOST_INFO = "com.mysql.cj.conf.HostInfo";
 
   /**
    * This method checks {@param actualProperties} against {@param 
allowedProperties} if they are not system properties.
@@ -99,7 +102,7 @@ public final class ConnectionUriUtils
         }
         catch (ClassNotFoundException notFoundMaria2x) {
           throw new RuntimeException(
-              "Failed to find MySQL driver class. Please check the MySQL 
connector version 5.1.49 is in the classpath",
+              "Failed to find MySQL driver class. Please check the MySQL 
connector version 8.2.0 is in the classpath",
               notFoundMysql
           );
         }
@@ -177,21 +180,66 @@ public final class ConnectionUriUtils
   }
 
   public static Set<String> tryParseMySqlConnectionUri(String connectionUri)
-      throws ClassNotFoundException, NoSuchMethodException, 
InstantiationException, IllegalAccessException,
+      throws ClassNotFoundException, NoSuchMethodException, 
IllegalAccessException,
              InvocationTargetException
   {
-    Class<?> driverClass = Class.forName(MYSQL_NON_REGISTERING_DRIVER);
-    Method parseUrl = driverClass.getMethod("parseURL", String.class, 
Properties.class);
-    // almost the same as postgres, but is an instance level method
-    Properties properties = (Properties) parseUrl.invoke(
-        driverClass.getConstructor().newInstance(),
-        connectionUri,
-        null
-    );
-
-    if (properties == null) {
+    Class<?> connectionUrlClass = Class.forName(MYSQL_CONNECTION_URL);
+    Method isConnectionStringSupported = 
connectionUrlClass.getMethod("acceptsUrl", String.class);
+    if (!(boolean) isConnectionStringSupported.invoke(connectionUrlClass, 
connectionUri)) {
       throw new IAE("Invalid URL format for MySQL: [%s]", connectionUri);
     }
+    Method getConnectionUrlInstanceMethod = 
connectionUrlClass.getMethod("getConnectionUrlInstance", String.class, 
Properties.class);
+    Object conUrl = getConnectionUrlInstanceMethod.invoke(connectionUrlClass, 
connectionUri, null);
+    Method getHostsList = connectionUrlClass.getMethod("getHostsList");
+    return getKeysFromOptions(getPropertiesFromHosts((List<?>) 
getHostsList.invoke(conUrl)));
+  }
+
+  private static Properties getPropertiesFromHosts(List<?> hostsList)
+      throws NoSuchMethodException, InvocationTargetException, 
IllegalAccessException, ClassNotFoundException
+  {
+    Properties properties = new Properties();
+    Class<?> hostInfoClass = Class.forName(MYSQL_HOST_INFO);
+    for (Object host : hostsList) {
+      Method getHostMethod = hostInfoClass.getMethod("getHost");
+      String hostName = (String) getHostMethod.invoke(host);
+      if (hostName != null) {
+        properties.setProperty("HOST", hostName);
+      }
+
+      Method getPortMethod = hostInfoClass.getMethod("getPort");
+      Integer port = (Integer) getPortMethod.invoke(host);
+      if (port != null) {
+        properties.setProperty("PORT", String.valueOf(port));
+      }
+
+      Method getUserMethod = hostInfoClass.getMethod("getUser");
+      String user = (String) getUserMethod.invoke(host);
+      if (user != null) {
+        properties.setProperty("user", user);
+      }
+
+      Method getPasswordMethod = hostInfoClass.getMethod("getPassword");
+      String password = (String) getPasswordMethod.invoke(host);
+      if (password != null) {
+        properties.setProperty("password", password);
+      }
+
+      Method getHostPropertiesMethod = 
hostInfoClass.getMethod("getHostProperties");
+      Map<String, String> hostProperties =
+          (Map<String, String>) getHostPropertiesMethod.invoke(host);
+      if (hostProperties != null) {
+        for (Map.Entry<String, String> entry : hostProperties.entrySet()) {
+          if (entry.getKey() != null && entry.getValue() != null) {
+            properties.setProperty(entry.getKey(), entry.getValue());
+          }
+        }
+      }
+    }
+    return properties;
+  }
+
+  private static Set<String> getKeysFromOptions(Properties properties)
+  {
     Set<String> keys = Sets.newHashSetWithExpectedSize(properties.size());
     properties.forEach((k, v) -> keys.add((String) k));
     return keys;
diff --git 
a/processing/src/test/java/org/apache/druid/utils/ConnectionUriUtilsTest.java 
b/processing/src/test/java/org/apache/druid/utils/ConnectionUriUtilsTest.java
index 754eb05b305..bb783157309 100644
--- 
a/processing/src/test/java/org/apache/druid/utils/ConnectionUriUtilsTest.java
+++ 
b/processing/src/test/java/org/apache/druid/utils/ConnectionUriUtilsTest.java
@@ -103,7 +103,7 @@ public class ConnectionUriUtilsTest
 
       props = ConnectionUriUtils.tryParseJdbcUriParameters(MYSQL_URI, false);
       // though this would be 4 if mysql wasn't loaded in classpath because it 
would fall back to mariadb
-      Assert.assertEquals(9, props.size());
+      Assert.assertEquals(6, props.size());
 
       props = ConnectionUriUtils.tryParseJdbcUriParameters(MARIA_URI, false);
       Assert.assertEquals(4, props.size());
@@ -126,13 +126,6 @@ public class ConnectionUriUtilsTest
       
ConnectionUriUtils.tryParseJdbcUriParameters("jdbc:postgresql://bad:1234&param",
 true);
     }
 
-    @Test
-    public void tryParseInvalidMySql()
-    {
-      expectedException.expect(IAE.class);
-      ConnectionUriUtils.tryParseJdbcUriParameters("jdbc:mysql:/bad", true);
-    }
-
     @Test
     public void testMySqlFallbackMySqlMaria2x()
     {
@@ -202,7 +195,7 @@ public class ConnectionUriUtilsTest
       Set<String> props = 
ConnectionUriUtils.tryParseMySqlConnectionUri(MYSQL_URI);
       // mysql actually misses 'keyonly', but spits out several keys that are 
not actually uri parameters
       // DBNAME, HOST, PORT, HOST.1, PORT.1, NUM_HOSTS
-      Assert.assertEquals(9, props.size());
+      Assert.assertEquals(6, props.size());
       Assert.assertTrue(props.contains("user"));
       Assert.assertTrue(props.contains("password"));
       Assert.assertTrue(props.contains("otherOptions"));
diff --git 
a/server/src/main/java/org/apache/druid/server/initialization/JdbcAccessSecurityConfig.java
 
b/server/src/main/java/org/apache/druid/server/initialization/JdbcAccessSecurityConfig.java
index f2eda2cf34a..42b0044b1d0 100644
--- 
a/server/src/main/java/org/apache/druid/server/initialization/JdbcAccessSecurityConfig.java
+++ 
b/server/src/main/java/org/apache/druid/server/initialization/JdbcAccessSecurityConfig.java
@@ -55,7 +55,7 @@ public class JdbcAccessSecurityConfig
       "HOST",
       "PORT",
       "NUM_HOSTS",
-      "DBNAME",
+      "dbname",
 
       // PostgreSQL
       "PGHOST",


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to