This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit 99147f8789855ce2aa14f855f5d032522cce26e4
Author: Guillaume Nodet <[email protected]>
AuthorDate: Sun Jun 7 06:46:34 2026 +0000

    Fix IpcServer Lock memory leak — remove empty locks from map
    
    F-19: Remove Lock entries from the locks ConcurrentHashMap when
    holders and waiters are both empty after unlock, preventing
    unbounded accumulation over the server's lifetime.
---
 .../src/main/java/org/eclipse/aether/named/ipc/IpcServer.java | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git 
a/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcServer.java
 
b/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcServer.java
index 99e49a124..9f58fb7e2 100644
--- 
a/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcServer.java
+++ 
b/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcServer.java
@@ -461,6 +461,10 @@ public class IpcServer {
                 }
             }
         }
+
+        public synchronized boolean isEmpty() {
+            return (holders == null || holders.isEmpty()) && (waiters == null 
|| waiters.isEmpty());
+        }
     }
 
     class Context {
@@ -486,7 +490,12 @@ public class IpcServer {
         public void unlock() {
             locks.stream()
                     .map(k -> IpcServer.this.locks.computeIfAbsent(k, 
Lock::new))
-                    .forEach(l -> l.unlock(this));
+                    .forEach(l -> {
+                        l.unlock(this);
+                        if (l.isEmpty()) {
+                            IpcServer.this.locks.remove(l.key, l);
+                        }
+                    });
         }
     }
 }

Reply via email to