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

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 9ef9ecc946e614405de5d7a7773ad33537684bb2
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Mon Mar 10 17:09:45 2025 +0400

    CAY-2876 Memory leak in the ObjectStore
     - clean up tracked paths when corresponding object is removed
---
 cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java 
b/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java
index 8800fd5e8..00309af49 100644
--- a/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java
+++ b/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java
@@ -423,6 +423,9 @@ public class ObjectStore implements Serializable, 
SnapshotEventListener, GraphMa
             switch (object.getPersistenceState()) {
                 case PersistenceState.DELETED:
                     objectMap.remove(id);
+                    if(trackedFlattenedPaths != null) {
+                        trackedFlattenedPaths.remove(id);
+                    }
                     object.setObjectContext(null);
                     object.setPersistenceState(PersistenceState.TRANSIENT);
                     break;
@@ -642,9 +645,11 @@ public class ObjectStore implements Serializable, 
SnapshotEventListener, GraphMa
                     if (delegate.shouldProcessDelete(object)) {
                         objectMap.remove(nodeId);
                         changes.remove(nodeId);
+                        if(trackedFlattenedPaths != null) {
+                            trackedFlattenedPaths.remove(nodeId);
+                        }
 
-                        // setting DataContext to null will also set
-                        // state to transient
+                        // setting DataContext to null will also set state to 
transient
                         object.setObjectContext(null);
                         delegate.finishedProcessDelete(object);
                     }

Reply via email to