You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by am...@apache.org on 2014/12/29 09:02:26 UTC

incubator-lens git commit: LENS-161 : LDAP backed user config loader should handle the case when ldap server closes the connection. (Rajat Khandelwal via amareshwari)

Repository: incubator-lens
Updated Branches:
  refs/heads/master c7bb16615 -> f2fe73fd3


LENS-161 : LDAP backed user config loader should handle the case when ldap server closes the connection. (Rajat Khandelwal via amareshwari)


Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/f2fe73fd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/f2fe73fd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/f2fe73fd

Branch: refs/heads/master
Commit: f2fe73fd3e383c41544a8da6592d98e8f4271065
Parents: c7bb166
Author: Amareshwari Sriramdasu <am...@inmobi.com>
Authored: Mon Dec 29 13:32:16 2014 +0530
Committer: Amareshwari Sriramdasu <am...@inmobi.com>
Committed: Mon Dec 29 13:32:16 2014 +0530

----------------------------------------------------------------------
 .../server/user/DatabaseUserConfigLoader.java   | 21 ++++--
 .../LDAPBackedDatabaseUserConfigLoader.java     | 69 +++++++++-----------
 .../apache/lens/server/util/UtilityMethods.java |  3 +-
 3 files changed, 47 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/f2fe73fd/lens-server/src/main/java/org/apache/lens/server/user/DatabaseUserConfigLoader.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/user/DatabaseUserConfigLoader.java b/lens-server/src/main/java/org/apache/lens/server/user/DatabaseUserConfigLoader.java
index dc85566..3d27241 100644
--- a/lens-server/src/main/java/org/apache/lens/server/user/DatabaseUserConfigLoader.java
+++ b/lens-server/src/main/java/org/apache/lens/server/user/DatabaseUserConfigLoader.java
@@ -18,6 +18,7 @@
  */
 package org.apache.lens.server.user;
 
+import org.apache.commons.dbcp.BasicDataSource;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.lens.server.api.LensConfConstants;
 import org.apache.lens.server.util.UtilityMethods;
@@ -25,7 +26,6 @@ import org.apache.lens.server.util.UtilityMethods;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 
-import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.Map;
@@ -48,7 +48,7 @@ public class DatabaseUserConfigLoader extends UserConfigLoader {
   protected final Cache<String, Map<String, String>> cache;
 
   /** The ds. */
-  protected DataSource ds;
+  protected BasicDataSource ds;
 
   /**
    * Instantiates a new database user config loader.
@@ -62,7 +62,6 @@ public class DatabaseUserConfigLoader extends UserConfigLoader {
     super(conf);
     querySql = conf.get(LensConfConstants.USER_RESOLVER_DB_QUERY);
     keys = conf.get(LensConfConstants.USER_RESOLVER_DB_KEYS).split("\\s*,\\s*", -1);
-    ds = UtilityMethods.getDataSourceFromConf(conf);
     cache = CacheBuilder.newBuilder()
         .expireAfterWrite(conf.getInt(LensConfConstants.USER_RESOLVER_CACHE_EXPIRY, 2), TimeUnit.HOURS)
         .maximumSize(conf.getInt(LensConfConstants.USER_RESOLVER_CACHE_MAX_SIZE, 100)).build();
@@ -70,7 +69,7 @@ public class DatabaseUserConfigLoader extends UserConfigLoader {
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.apache.lens.server.user.UserConfigLoader#getUserConfig(java.lang.String)
    */
   @Override
@@ -79,9 +78,8 @@ public class DatabaseUserConfigLoader extends UserConfigLoader {
       return cache.get(loggedInUser, new Callable<Map<String, String>>() {
         @Override
         public Map<String, String> call() throws Exception {
-
           try {
-            final String[] config = UtilityMethods.queryDatabase(ds, querySql, false, loggedInUser);
+            final String[] config = queryDatabase(querySql, false, loggedInUser);
             if (config.length != keys.length) {
               throw new UserConfigLoaderException("size of columns retrieved by db query(" + config.length + ") "
                   + "is not equal to the number of keys required(" + keys.length + ").");
@@ -102,4 +100,15 @@ public class DatabaseUserConfigLoader extends UserConfigLoader {
       throw new UserConfigLoaderException(e);
     }
   }
+
+  private BasicDataSource refreshDataSource() {
+    if(ds == null || ds.isClosed()) {
+      ds = UtilityMethods.getDataSourceFromConf(hiveConf);
+    }
+    return ds;
+  }
+
+  String[] queryDatabase(String querySql, boolean allowNull, Object... args) throws SQLException {
+    return UtilityMethods.queryDatabase(refreshDataSource(), querySql, allowNull, args);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/f2fe73fd/lens-server/src/main/java/org/apache/lens/server/user/LDAPBackedDatabaseUserConfigLoader.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/user/LDAPBackedDatabaseUserConfigLoader.java b/lens-server/src/main/java/org/apache/lens/server/user/LDAPBackedDatabaseUserConfigLoader.java
index 3ce70e9..ba0da3e 100644
--- a/lens-server/src/main/java/org/apache/lens/server/user/LDAPBackedDatabaseUserConfigLoader.java
+++ b/lens-server/src/main/java/org/apache/lens/server/user/LDAPBackedDatabaseUserConfigLoader.java
@@ -23,7 +23,6 @@ import com.google.common.cache.CacheBuilder;
 import org.apache.commons.dbutils.QueryRunner;
 import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.lens.server.api.LensConfConstants;
-import org.apache.lens.server.util.UtilityMethods;
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
@@ -67,7 +66,7 @@ public class LDAPBackedDatabaseUserConfigLoader extends DatabaseUserConfigLoader
 
   /** The Constant outputFormatter. */
   private final static DateTimeFormatter outputFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:SS")
-      .withZoneUTC();
+    .withZoneUTC();
 
   /** The expiry hours. */
   private final int expiryHours;
@@ -78,16 +77,14 @@ public class LDAPBackedDatabaseUserConfigLoader extends DatabaseUserConfigLoader
   /** The search filter pattern. */
   private final String searchFilterPattern;
 
-  /** The ctx. */
-  private final InitialLdapContext ctx;
+  /** The environment to connect to ldap. picked from conf. */
+  private final Hashtable<String, Object> env;
 
   /**
    * Instantiates a new LDAP backed database user config loader.
    *
-   * @param conf
-   *          the conf
-   * @throws UserConfigLoaderException
-   *           the user config loader exception
+   * @param conf the conf
+   * @throws UserConfigLoaderException the user config loader exception
    */
   public LDAPBackedDatabaseUserConfigLoader(final HiveConf conf) throws UserConfigLoaderException {
     super(conf);
@@ -99,11 +96,11 @@ public class LDAPBackedDatabaseUserConfigLoader extends DatabaseUserConfigLoader
     searchBase = conf.get(LensConfConstants.USER_RESOLVER_LDAP_SEARCH_BASE);
     searchFilterPattern = conf.get(LensConfConstants.USER_RESOLVER_LDAP_SEARCH_FILTER);
     intermediateCache = CacheBuilder.newBuilder().expireAfterWrite(expiryHours, TimeUnit.HOURS)
-        .maximumSize(conf.getInt(LensConfConstants.USER_RESOLVER_CACHE_MAX_SIZE, 100)).build();
+      .maximumSize(conf.getInt(LensConfConstants.USER_RESOLVER_CACHE_MAX_SIZE, 100)).build();
     cache = CacheBuilder.newBuilder().expireAfterWrite(expiryHours, TimeUnit.HOURS)
-        .maximumSize(conf.getInt(LensConfConstants.USER_RESOLVER_CACHE_MAX_SIZE, 100)).build();
+      .maximumSize(conf.getInt(LensConfConstants.USER_RESOLVER_CACHE_MAX_SIZE, 100)).build();
 
-    Hashtable<String, Object> env = new Hashtable<String, Object>() {
+    env = new Hashtable<String, Object>() {
       {
         put(Context.SECURITY_AUTHENTICATION, "simple");
         put(Context.SECURITY_PRINCIPAL, conf.get(LensConfConstants.USER_RESOLVER_LDAP_BIND_DN));
@@ -113,45 +110,41 @@ public class LDAPBackedDatabaseUserConfigLoader extends DatabaseUserConfigLoader
         put("java.naming.ldap.attributes.binary", "objectSID");
       }
     };
-    try {
-      ctx = new InitialLdapContext(env, null);
-    } catch (NamingException e) {
-      throw new UserConfigLoaderException(e);
-    }
   }
 
   /**
    * Find account by account name.
    *
-   * @param accountName
-   *          the account name
+   * @param accountName the account name
    * @return the search result
-   * @throws NamingException
-   *           the naming exception
+   * @throws NamingException the naming exception
    */
   protected SearchResult findAccountByAccountName(String accountName) throws NamingException {
     String searchFilter = String.format(searchFilterPattern, accountName);
     SearchControls searchControls = new SearchControls();
     searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
-    NamingEnumeration<SearchResult> results = ctx.search(searchBase, searchFilter, searchControls);
-    if (!results.hasMoreElements()) {
-      throw new UserConfigLoaderException("LDAP Search returned no accounts");
-    }
-    SearchResult searchResult = results.nextElement();
-    if (results.hasMoreElements()) {
-      throw new UserConfigLoaderException("More than one account found in ldap search");
+    InitialLdapContext ctx = new InitialLdapContext(env, null);
+    try {
+      NamingEnumeration<SearchResult> results = ctx.search(searchBase, searchFilter, searchControls);
+      if (!results.hasMoreElements()) {
+        throw new UserConfigLoaderException("LDAP Search returned no accounts");
+      }
+      SearchResult searchResult = results.nextElement();
+      if (results.hasMoreElements()) {
+        throw new UserConfigLoaderException("More than one account found in ldap search");
+      }
+      return searchResult;
+    } finally {
+      ctx.close();
     }
-    return searchResult;
   }
 
   /**
    * Gets the attributes.
    *
-   * @param user
-   *          the user
+   * @param user the user
    * @return the attributes
-   * @throws NamingException
-   *           the naming exception
+   * @throws NamingException the naming exception
    */
   public String[] getAttributes(String user) throws NamingException {
     String[] attributes = new String[ldapFields.length];
@@ -164,7 +157,7 @@ public class LDAPBackedDatabaseUserConfigLoader extends DatabaseUserConfigLoader
 
   /*
    * (non-Javadoc)
-   * 
+   *
    * @see org.apache.lens.server.user.DatabaseUserConfigLoader#getUserConfig(java.lang.String)
    */
   @Override
@@ -173,8 +166,8 @@ public class LDAPBackedDatabaseUserConfigLoader extends DatabaseUserConfigLoader
       final String[] intermediateKey = intermediateCache.get(loggedInUser, new Callable<String[]>() {
         @Override
         public String[] call() throws Exception {
-          String[] config = UtilityMethods.queryDatabase(ds, intermediateQuerySql, true, loggedInUser,
-              Timestamp.valueOf(DateTime.now().toString(outputFormatter)));
+          String[] config = queryDatabase(intermediateQuerySql, true, loggedInUser,
+            Timestamp.valueOf(DateTime.now().toString(outputFormatter)));
           if (config == null) {
             config = getAttributes(loggedInUser);
             Object[] updateArray = new Object[config.length + 2];
@@ -183,7 +176,7 @@ public class LDAPBackedDatabaseUserConfigLoader extends DatabaseUserConfigLoader
             }
             updateArray[0] = loggedInUser;
             updateArray[config.length + 1] = Timestamp.valueOf(DateTime.now().plusHours(expiryHours)
-                .toString(outputFormatter));
+              .toString(outputFormatter));
             QueryRunner runner = new QueryRunner(ds);
             runner.update(intermediateDeleteSql, loggedInUser);
             runner.update(intermediateInsertSql, updateArray);
@@ -194,10 +187,10 @@ public class LDAPBackedDatabaseUserConfigLoader extends DatabaseUserConfigLoader
       return cache.get(intermediateKey, new Callable<Map<String, String>>() {
         @Override
         public Map<String, String> call() throws Exception {
-          final String[] argsAsArray = UtilityMethods.queryDatabase(ds, querySql, false, intermediateKey);
+          final String[] argsAsArray = queryDatabase(querySql, false, intermediateKey);
           if (argsAsArray.length != keys.length) {
             throw new UserConfigLoaderException("size of columns retrieved by db query(" + argsAsArray.length + ") "
-                + "is not equal to the number of keys required(" + keys.length + ").");
+              + "is not equal to the number of keys required(" + keys.length + ").");
           }
           return new HashMap<String, String>() {
             {

http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/f2fe73fd/lens-server/src/main/java/org/apache/lens/server/util/UtilityMethods.java
----------------------------------------------------------------------
diff --git a/lens-server/src/main/java/org/apache/lens/server/util/UtilityMethods.java b/lens-server/src/main/java/org/apache/lens/server/util/UtilityMethods.java
index f34b06a..c282b3d 100644
--- a/lens-server/src/main/java/org/apache/lens/server/util/UtilityMethods.java
+++ b/lens-server/src/main/java/org/apache/lens/server/util/UtilityMethods.java
@@ -24,7 +24,6 @@ import org.apache.commons.dbutils.ResultSetHandler;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.lens.server.api.LensConfConstants;
 
-import javax.sql.DataSource;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Map;
@@ -101,7 +100,7 @@ public class UtilityMethods {
    * @throws SQLException
    *           the SQL exception
    */
-  public static String[] queryDatabase(DataSource ds, String querySql, final boolean allowNull, Object... args)
+  public static String[] queryDatabase(BasicDataSource ds, String querySql, final boolean allowNull, Object... args)
       throws SQLException {
     QueryRunner runner = new QueryRunner(ds);
     return runner.query(querySql, new ResultSetHandler<String[]>() {