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[]>() {