You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by hu...@apache.org on 2017/05/27 08:56:32 UTC

incubator-hawq git commit: HAWQ-1443. Fix bug of HawqClient may connect to different database.

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 <hu...@apache.org>
Authored: Sat May 27 14:47:26 2017 +0800
Committer: hubertzhang <hu...@apache.org>
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);