diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java index 2ba91d042cc26bf086e86d8e50859e27cf1c12c4..b59a8bac6bf3bf7fd562455cff4604376cdc8b02 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/Registry.java @@ -20,8 +20,10 @@ import com.google.common.base.Splitter; import com.google.common.collect.Sets; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.common.JavaUtils; import org.apache.hadoop.hive.ql.exec.FunctionInfo.FunctionResource; import org.apache.hadoop.hive.ql.ErrorMsg; import org.apache.hadoop.hive.ql.metadata.HiveException; @@ -43,9 +45,12 @@ import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; import org.apache.hadoop.util.ReflectionUtils; +import java.io.IOException; +import java.net.URLClassLoader; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -66,6 +71,7 @@ */ private final Map mFunctions = new LinkedHashMap(); private final Set> builtIns = Collections.synchronizedSet(new HashSet>()); + private final Set mSessionUDFLoaders = new LinkedHashSet(); private final boolean isNative; @@ -455,7 +461,6 @@ private FunctionInfo registerToSessionRegistry(String qualifiedName, FunctionInf LOG.error("Unable to load resources for " + qualifiedName + ":" + e, e); return null; } - ClassLoader loader = Utilities.getSessionSpecifiedClassLoader(); Class udfClass = Class.forName(function.getClassName(), true, loader); @@ -463,6 +468,7 @@ private FunctionInfo registerToSessionRegistry(String qualifiedName, FunctionInf if (ret == null) { LOG.error(function.getClassName() + " is not a valid UDF class and was not registered."); } + SessionState.getRegistryForWrite().addToUDFLoaders(loader); } catch (ClassNotFoundException e) { // Lookup of UDf class failed LOG.error("Unable to load UDF class: " + e); @@ -489,6 +495,21 @@ public synchronized void clear() { builtIns.clear(); } + public synchronized void closeCUDFLoaders() { + try { + for(ClassLoader loader: mSessionUDFLoaders) { + JavaUtils.closeClassLoader(loader); + } + } catch (IOException ie) { + LOG.error("Error in close loader: " + ie); + } + mSessionUDFLoaders.clear(); + } + + public synchronized void addToUDFLoaders(ClassLoader loader) { + mSessionUDFLoaders.add(loader); + } + /** * Setup blocked flag for all builtin UDFs as per udf whitelist and blacklist * @param whiteListStr diff --git a/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java b/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java index 66cff87d118ee22f2e8308b0b5c70f87d99d5625..dfcae9ab09e077f10048b0d15dce052239151147 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java @@ -1445,7 +1445,8 @@ public void setCurrentDatabase(String currentDatabase) { } public void close() throws IOException { - registry.clear();; + registry.clear(); + registry.closeCUDFLoaders(); if (txnMgr != null) txnMgr.closeTxnManager(); JavaUtils.closeClassLoadersTo(conf.getClassLoader(), parentLoader); File resourceDir =