This is an automated email from the ASF dual-hosted git repository.
rzo1 pushed a commit to branch tomee-8.x
in repository https://gitbox.apache.org/repos/asf/tomee.git
The following commit(s) were added to refs/heads/tomee-8.x by this push:
new 04c1d609c6 TOMEE-4120 (#999)
04c1d609c6 is described below
commit 04c1d609c6fb35eb4562ef1d381a1f6c54e939ca
Author: tlien3 <[email protected]>
AuthorDate: Fri Jan 13 03:03:07 2023 -0600
TOMEE-4120 (#999)
* TOMEE-4120 - Fix for memory link in bmp entity finder registration,
eliminated double registration of the same handler
---
.../openejb/client/EJBInvocationHandler.java | 50 ++++++++++++++--------
.../openejb/client/EntityEJBHomeHandler.java | 3 --
2 files changed, 31 insertions(+), 22 deletions(-)
diff --git
a/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java
b/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java
index d9519286b7..56c0566844 100644
---
a/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java
+++
b/server/openejb-client/src/main/java/org/apache/openejb/client/EJBInvocationHandler.java
@@ -37,6 +37,8 @@ import java.rmi.NoSuchObjectException;
import java.rmi.RemoteException;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -202,25 +204,35 @@ public abstract class EJBInvocationHandler implements
InvocationHandler, Seriali
}
protected static void registerHandler(final Object key, final
EJBInvocationHandler handler) {
- Set<WeakReference<EJBInvocationHandler>> set =
liveHandleRegistry.get(key);
-
- if (set == null) {
- set = new HashSet<WeakReference<EJBInvocationHandler>>();
- final Set<WeakReference<EJBInvocationHandler>> current =
liveHandleRegistry.putIfAbsent(key, set);
- // someone else added the set
- if (current != null) {
- set = current;
- }
- }
-
- final ReentrantLock l = lock;
- l.lock();
-
- try {
- set.add(new WeakReference<EJBInvocationHandler>(handler));
- } finally {
- l.unlock();
- }
+ final ReentrantLock l = lock;
+ l.lock();
+
+ try {
+ // this map lookup must be synchronized even though it is a
ConcurrentHashMap to avoid race condition with the clean up below
+ final Set<WeakReference<EJBInvocationHandler>> set =
liveHandleRegistry.get(key);
+ if (set == null) {
+ set = new
HashSet<WeakReference<EJBInvocationHandler>>();
+ liveHandleRegistry.put(key, set);
+ }
+ set.add(new WeakReference<EJBInvocationHandler>(handler));
+
+ // loop through and remove old references that have been
garbage collected
+ for
(Iterator<Map.Entry<Object,Set<WeakReference<EJBInvocationHandler>>>> i =
liveHandleRegistry.entrySet().iterator(); i.hasNext(); ) {
+ final
Map.Entry<Object,Set<WeakReference<EJBInvocationHandler>>> entry = i.next();
+ final Set<WeakReference<EJBInvocationHandler>> s =
entry.getValue();
+ for (Iterator<WeakReference<EJBInvocationHandler>> j =
s.iterator(); j.hasNext(); ) {
+ final WeakReference<EJBInvocationHandler> ref = j.next();
+ if (ref.get() == null) {
+ j.remove(); // clean up old
WeakReference
+ }
+ }
+ if (s.isEmpty()) {
+ i.remove(); // no more handlers for this
primary key, remove map entry
+ }
+ }
+ } finally {
+ l.unlock();
+ }
}
/**
diff --git
a/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
b/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
index 1ea71dbbff..6bef0af72d 100644
---
a/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
+++
b/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
@@ -56,7 +56,6 @@ public class EntityEJBHomeHandler extends EJBHomeHandler {
} else {
handler =
EJBObjectHandler.createEJBObjectHandler(executor, ejb, server, client, primKey,
authenticationInfo);
handler.setEJBHomeProxy((EJBHomeProxy) proxy);
- registerHandler(ejb.deploymentID + ":" + primKey, handler);
return handler.createEJBObjectProxy();
}
@@ -69,7 +68,6 @@ public class EntityEJBHomeHandler extends EJBHomeHandler {
if (primKey != null) {
handler =
EJBObjectHandler.createEJBObjectHandler(executor, ejb, server, client, primKey,
authenticationInfo);
handler.setEJBHomeProxy((EJBHomeProxy) proxy);
- registerHandler(ejb.deploymentID + ":" + primKey,
handler);
primaryKeys[i] = handler.createEJBObjectProxy();
}
}
@@ -83,7 +81,6 @@ public class EntityEJBHomeHandler extends EJBHomeHandler {
if (primKey != null) {
handler =
EJBObjectHandler.createEJBObjectHandler(executor, ejb, server, client, primKey,
authenticationInfo);
handler.setEJBHomeProxy((EJBHomeProxy) proxy);
- registerHandler(ejb.deploymentID + ":" + primKey,
handler);
primaryKeys[i] = handler.createEJBObjectProxy();
}
}