mirror of https://github.com/apache/cloudstack.git
CLOUDSTACK-6859:Management Server PermGen run out of memory after some
time due to class leak.
(cherry picked from commit 25580c7cd1)
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
Conflicts:
framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallbackDispatcher.java
This commit is contained in:
parent
122332b326
commit
4e3ac55a0e
|
|
@ -21,10 +21,11 @@ package org.apache.cloudstack.framework.async;
|
|||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import net.sf.cglib.proxy.Callback;
|
||||
import net.sf.cglib.proxy.CallbackFilter;
|
||||
import net.sf.cglib.proxy.Enhancer;
|
||||
import net.sf.cglib.proxy.Factory;
|
||||
import net.sf.cglib.proxy.MethodInterceptor;
|
||||
import net.sf.cglib.proxy.MethodProxy;
|
||||
|
||||
|
|
@ -35,53 +36,72 @@ public class AsyncCallbackDispatcher<T, R> implements AsyncCompletionCallback {
|
|||
private static final Logger s_logger = Logger.getLogger(AsyncCallbackDispatcher.class);
|
||||
|
||||
private Method _callbackMethod;
|
||||
private final T _targetObject;
|
||||
private Object _contextObject;
|
||||
private Object _resultObject;
|
||||
private AsyncCallbackDriver _driver = new InplaceAsyncCallbackDriver();
|
||||
private final T _targetObject;
|
||||
private Object _contextObject;
|
||||
private Object _resultObject;
|
||||
private AsyncCallbackDriver _driver = new InplaceAsyncCallbackDriver();
|
||||
private static Map<Class, Enhancer> enMap = new HashMap<Class, Enhancer>();
|
||||
|
||||
private AsyncCallbackDispatcher(T target) {
|
||||
assert(target != null);
|
||||
_targetObject = target;
|
||||
}
|
||||
private AsyncCallbackDispatcher(T target) {
|
||||
assert (target != null);
|
||||
_targetObject = target;
|
||||
}
|
||||
|
||||
public AsyncCallbackDispatcher<T, R> attachDriver(AsyncCallbackDriver driver) {
|
||||
assert(driver != null);
|
||||
_driver = driver;
|
||||
public AsyncCallbackDispatcher<T, R> attachDriver(AsyncCallbackDriver driver) {
|
||||
assert (driver != null);
|
||||
_driver = driver;
|
||||
|
||||
return this;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Method getCallbackMethod() {
|
||||
return _callbackMethod;
|
||||
}
|
||||
public Method getCallbackMethod() {
|
||||
return _callbackMethod;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public T getTarget() {
|
||||
Enhancer en = new Enhancer();
|
||||
@SuppressWarnings("unchecked")
|
||||
public T getTarget() {
|
||||
Class<?> clz = _targetObject.getClass();
|
||||
String clzName = clz.getName();
|
||||
if (clzName.contains("EnhancerByCloudStack"))
|
||||
clz = clz.getSuperclass();
|
||||
|
||||
Class<?> clz = _targetObject.getClass();
|
||||
String clzName = clz.getName();
|
||||
if(clzName.contains("EnhancerByCloudStack"))
|
||||
clz = clz.getSuperclass();
|
||||
|
||||
en.setSuperclass(clz);
|
||||
en.setCallbacks(new Callback[]{new MethodInterceptor() {
|
||||
@Override
|
||||
public Object intercept(Object arg0, Method arg1, Object[] arg2,
|
||||
MethodProxy arg3) throws Throwable {
|
||||
_callbackMethod = arg1;
|
||||
_callbackMethod.setAccessible(true);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
new MethodInterceptor() {
|
||||
@Override
|
||||
public Object intercept(Object arg0, Method arg1, Object[] arg2,
|
||||
MethodProxy arg3) throws Throwable {
|
||||
return null;
|
||||
Enhancer en = null;
|
||||
synchronized (enMap) {
|
||||
en = enMap.get(clz);
|
||||
if (en == null) {
|
||||
en = new Enhancer();
|
||||
|
||||
en.setSuperclass(clz);
|
||||
en.setCallback(new MethodInterceptor() {
|
||||
@Override
|
||||
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
enMap.put(clz, en);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
T t = (T)en.create();
|
||||
Factory factory = (Factory)t;
|
||||
factory.setCallback(0, new MethodInterceptor() {
|
||||
@Override
|
||||
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
|
||||
if (arg1.getParameterTypes().length == 0 && arg1.getName().equals("finalize")) {
|
||||
return null;
|
||||
} else {
|
||||
_callbackMethod = arg1;
|
||||
_callbackMethod.setAccessible(true);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
});
|
||||
return t;
|
||||
} catch (Throwable e) {
|
||||
s_logger.error("Unexpected exception", e);
|
||||
}
|
||||
});
|
||||
en.setCallbackFilter(new CallbackFilter() {
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Reference in New Issue