This is an automated email from the ASF dual-hosted git repository. michaelsmith pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/impala.git
commit 8fe471d4698180e1b8b726c278b8a066fe06e416 Author: gaurav1086 <[email protected]> AuthorDate: Tue Nov 14 10:06:21 2023 -0800 IMPALA-12470 (PART-3): delete temporary jar file in GenericJdbcDatabaseAccessor close() function The earlier change had a bug where we are deleting the temporary jdbc jar file too early from the /tmp directory before it can be loaded. The GenericJdbcDatabaseAccessor class loader works by OnDemand loading. Hence move the delete file logic to the GenericJdbcDatabaseAccessor close() function instead. Testing: 1. Make sure the Impala cluster has been started. 2. Copy the jar files of JDBC drivers and the data source library into HDFS. ${IMPALA_HOME}/testdata/bin/copy-ext-data-sources.sh Verify that the mysql-jdbc.jar is present in the hdfs path: hadoop fs -ls /test-warehouse/data-sources/jdbc-drivers 3. Create an `alltypes` table in the mysql database. ${IMPALA_HOME}/testdata/bin/load-ext-data-sources.sh 4. Create mysql data source tables (alltypes_jdbc_datasource and alltypes_jdbc_datasource_2). ${IMPALA_HOME}/bin/impala-shell.sh -f\ ${IMPALA_HOME}/testdata/bin/create-ext-data-source-table.sql 5. Make sure that the mysql jar file is not present in the classpath grep 'mysql' /home/gsingh/Impala/fe/target/build-classpath.txt \ /home/gsingh/Impala/fe/target/test-classpath.txt \ /home/gsingh/Impala/java/executor-deps/target/build-executor-\ deps-classpath.txt | wc -l returns 0 6. Run the impala-shell query: use functional; select count(*) from alltypes_jdbc_mysql_datasource; executes successfully and returns the row count. Change-Id: I1becc01a9d93a99be8f47dfe99258dea3a8abeb3 Reviewed-on: http://gerrit.cloudera.org:8080/20706 Reviewed-by: Wenzhe Zhou <[email protected]> Tested-by: Impala Public Jenkins <[email protected]> --- .../extdatasource/jdbc/dao/GenericJdbcDatabaseAccessor.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/java/ext-data-source/jdbc/src/main/java/org/apache/impala/extdatasource/jdbc/dao/GenericJdbcDatabaseAccessor.java b/java/ext-data-source/jdbc/src/main/java/org/apache/impala/extdatasource/jdbc/dao/GenericJdbcDatabaseAccessor.java index 7e106f6b3..1da58fbbe 100644 --- a/java/ext-data-source/jdbc/src/main/java/org/apache/impala/extdatasource/jdbc/dao/GenericJdbcDatabaseAccessor.java +++ b/java/ext-data-source/jdbc/src/main/java/org/apache/impala/extdatasource/jdbc/dao/GenericJdbcDatabaseAccessor.java @@ -64,6 +64,7 @@ public class GenericJdbcDatabaseAccessor implements DatabaseAccessor { protected static final int DEFAULT_FETCH_SIZE = 1000; protected static final int CACHE_EXPIRE_TIMEOUT_S = 1800; protected static final int CACHE_SIZE = 100; + protected String jdbcDriverLocalPath = null; protected DataSource dbcpDataSource = null; // Cache datasource for sharing @@ -159,6 +160,11 @@ public class GenericJdbcDatabaseAccessor implements DatabaseAccessor { dataSourceCache.invalidateAll(); dataSourceCache = null; } + if (jdbcDriverLocalPath != null) { + // Delete the jar file of jdbc driver. + Path localJarPath = new Path("file://" + jdbcDriverLocalPath); + FileSystemUtil.deleteIfExists(localJarPath); + } } /** @@ -245,14 +251,12 @@ public class GenericJdbcDatabaseAccessor implements DatabaseAccessor { // Create class loader for jdbc driver and set it for the // BasicDataSource object so that the driver class could be loaded // from jar file without searching classpath. + jdbcDriverLocalPath = driverLocalPath; URL driverJarUrl = new File(driverLocalPath).toURI().toURL(); URLClassLoader driverLoader = URLClassLoader.newInstance( new URL[] { driverJarUrl }, getClass().getClassLoader()); basicDataSource.setDriverClassLoader(driverLoader); - // Delete the jar file once its loaded - Path localJarPath = new Path("file://" + driverLocalPath); - FileSystemUtil.deleteIfExists(localJarPath); return basicDataSource; }); }
