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();
                     }
                 }

Reply via email to