Repository: incubator-hawq Updated Branches: refs/heads/master 6768af3e0 -> 4068f3ce0
HAWQ-1443. Fix bug of HawqClient may connect to different database. Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/4068f3ce Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/4068f3ce Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/4068f3ce Branch: refs/heads/master Commit: 4068f3ce095c6b65e116ec4e8b7f636e5cf111b0 Parents: 6768af3 Author: hubertzhang <[email protected]> Authored: Sat May 27 14:47:26 2017 +0800 Committer: hubertzhang <[email protected]> Committed: Sat May 27 16:55:25 2017 +0800 ---------------------------------------------------------------------- .../apache/hawq/ranger/service/HawqClient.java | 63 ++++++++++++++++---- .../hawq/ranger/service/HawqResourceMgr.java | 1 + .../hawq/ranger/service/RangerServiceHawq.java | 1 + .../hawq/ranger/service/HawqClientTest.java | 1 + 4 files changed, 54 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/4068f3ce/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java ---------------------------------------------------------------------- diff --git a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java index f8a252b..5d2cd71 100644 --- a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java +++ b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java @@ -29,6 +29,7 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.ResultSet; +import java.sql.*; import java.util.*; import javax.security.auth.Subject; @@ -70,10 +71,12 @@ public class HawqClient extends BaseClient { public static final List<String> INTERNAL_PROTOCOLS = HawqProtocols.getAllProtocols(); private static final String DEFAULT_DATABASE = "postgres"; + private static final String DEFAULT_DATABASE_TEMPLATE = "DBTOBEREPLACEDINJDBCURL"; private static final String JDBC_DRIVER_CLASS = "org.postgresql.Driver"; private boolean isKerberosAuth = false; private Connection con; + private String jdbc_url_template = ""; private Map<String, String> connectionProperties; // we need to load class for the Postgres Driver directly to allow it to register with DriverManager @@ -124,13 +127,13 @@ public class HawqClient extends BaseClient { }}); } else { - LOG.info("Trying to use UnSecure client with username and password"); + LOG.info("Trying to use UnSecure client with username "+ getConfigHolder().getUserName() +" and password"); final String userName = getConfigHolder().getUserName(); final String password = getConfigHolder().getPassword(); initConnection(userName, password); } } - + private void initConnectionKerberos(String serverPricipal, String userPrincipal) throws SQLException{ try { String url = String.format("jdbc:postgresql://%s:%s/%s?kerberosServerName=%s&jaasApplicationName=pgjdbc&user=%s", @@ -142,6 +145,11 @@ public class HawqClient extends BaseClient { LOG.debug("InitConnectionKerberos "+ url); } con = DriverManager.getConnection(url); + jdbc_url_template = String.format("jdbc:postgresql://%s:%s/%s?kerberosServerName=%s&jaasApplicationName=pgjdbc&user=%s", + connectionProperties.get("hostname"), + connectionProperties.get("port"), DEFAULT_DATABASE_TEMPLATE, + serverPricipal, userPrincipal + ); } catch (SQLException e) { e.printStackTrace(); LOG.error("Unable to Connect to Hawq", e); @@ -159,6 +167,7 @@ public class HawqClient extends BaseClient { LOG.debug("InitConnectionKerberos "+ url); } con = DriverManager.getConnection(url, userName, password); + jdbc_url_template = String.format("jdbc:postgresql://%s:%s/%s", connectionProperties.get("hostname"), connectionProperties.get("port"), DEFAULT_DATABASE_TEMPLATE); } catch (SQLException e) { e.printStackTrace(); LOG.error("Unable to Connect to Hawq", e); @@ -171,6 +180,36 @@ public class HawqClient extends BaseClient { public void setConnection(Connection conn) { con = conn; } + + public void resetConnection(String db) throws SQLException{ + try { + if(db == null) { + return; + } + String newdb = db; + LOG.debug("resetconnectionbefore "+ jdbc_url_template + newdb); + String url = jdbc_url_template.replace(DEFAULT_DATABASE_TEMPLATE, newdb); + if (LOG.isDebugEnabled()) { + LOG.debug("resetconnection "+ jdbc_url_template+ url); + } + if(con !=null && !con.isClosed()){ + con.close(); + } + if (isKerberosAuth) { + con = DriverManager.getConnection(url); + } else { + final String userName = getConfigHolder().getUserName(); + final String password = getConfigHolder().getPassword(); + con = DriverManager.getConnection(url, userName, password); + } + } catch (SQLException e) { + e.printStackTrace(); + LOG.error("Unable to Connect to Hawq", e); + throw e; + } catch (SecurityException se) { + se.printStackTrace(); + } + } /** * Uses the connectionProperties and attempts to connect to Hawq. @@ -205,7 +244,6 @@ public class HawqClient extends BaseClient { String message = isConnected ? CONNECTION_SUCCESSFUL_MESSAGE : CONNECTION_FAILURE_MESSAGE; generateResponseDataMap(isConnected, message, description, null, null, result); - return result; } @@ -278,22 +316,22 @@ public class HawqClient extends BaseClient { return new ArrayList<>(uniqueResults); } for (String db: databases) { + resetConnection(db); if (LOG.isDebugEnabled()) { LOG.debug("<== HawqClient.queryHawqPerDbAndSchema: Connecting to db: " + db); } try { preparedStatement = handleWildcardPreparedStatement(userInput, query, con); - + if (LOG.isDebugEnabled()) { - LOG.debug("<== HawqClient.queryHawqPerDbAndSchema Starting query: " + query); + LOG.debug("<== HawqClient.queryHawqPerDbAndSchema Starting query: " + preparedStatement.toString()); } - + resultSet = preparedStatement.executeQuery(); - while(resultSet.next()) { - if(schemas.contains(resultSet.getString(schemaColumnName)) || schemas.contains(WILDCARD)) { - uniqueResults.add(resultSet.getString(resultColumnName)); + if(schemas.contains(resultSet.getString(schemaColumnName)) || schemas.contains(WILDCARD)) { + uniqueResults.add(resultSet.getString(resultColumnName)); } } @@ -317,14 +355,15 @@ public class HawqClient extends BaseClient { ResultSet resultSet = null; try { - if(con == null) { - return result; + resetConnection(database); + if(con == null) { + return result; } preparedStatement = handleWildcardPreparedStatement(userInput, query, con); if (LOG.isDebugEnabled()) { - LOG.debug("<== HawqClient.queryHawq Starting query: " + query); + LOG.debug("<== HawqClient.queryHawq Starting query: " + preparedStatement.toString()); } resultSet = preparedStatement.executeQuery(); http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/4068f3ce/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java ---------------------------------------------------------------------- diff --git a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java index d9f68d7..6dc9cad 100644 --- a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java +++ b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java @@ -132,6 +132,7 @@ public abstract class HawqResourceMgr { Collections.sort(result); + hawqClient.close(); } catch (Exception e) { LOG.error("Unable to get hive resources.", e); throw e; http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/4068f3ce/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java ---------------------------------------------------------------------- diff --git a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java index 24a76ca..9c1ccc8 100644 --- a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java +++ b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java @@ -55,6 +55,7 @@ public class RangerServiceHawq extends RangerBaseService { try { HawqClient hawqClient = new HawqClient(serviceName, configs); result = hawqClient.checkConnection(configs); + hawqClient.close(); } catch (HadoopException e) { LOG.error("<== RangerServiceHawq.validateConfig Error:" + e); throw e; http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/4068f3ce/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java ---------------------------------------------------------------------- diff --git a/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java b/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java index 64bf874..be3be17 100644 --- a/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java +++ b/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java @@ -70,6 +70,7 @@ public class HawqClientTest { suppress(constructor(BaseClient.class, String.class, Map.class)); suppress(method(HawqClient.class, "initHawq")); + suppress(method(HawqClient.class, "resetConnection")); hawqClient = new HawqClient("hawq", connectionProperties); hawqClient.setConnection(conn); hawqClientSpy = PowerMockito.spy(hawqClient);
