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¶m",
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]