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);

Reply via email to