From e7af3eb3138393a6280e808bfe7035e79b18eb86 Mon Sep 17 00:00:00 2001 From: michael h Date: Sun, 8 May 2022 11:44:43 +1000 Subject: [PATCH] Fixing memory leak in SpanStore --- apm-mule3-agent/pom.xml | 4 +- .../co/elastic/apm/mule/utils/SpanStore.java | 29 ++++++++----- apm-mule3.8-agent/pom.xml | 4 +- .../co/elastic/apm/mule/utils/SpanStore.java | 41 +++++++++++-------- example-app/component1/.classpath | 7 +--- example-app/component1/mule-project.xml | 2 +- example-app/component1/pom.xml | 5 +-- .../src/main/app/mule-app.properties | 1 + example-app/component2/.classpath | 7 +--- example-app/component2/mule-project.xml | 2 +- example-app/component2/pom.xml | 7 ++-- .../src/main/app/mule-app.properties | 2 + 12 files changed, 60 insertions(+), 51 deletions(-) diff --git a/apm-mule3-agent/pom.xml b/apm-mule3-agent/pom.xml index 81bc723..1897a4b 100644 --- a/apm-mule3-agent/pom.xml +++ b/apm-mule3-agent/pom.xml @@ -5,7 +5,7 @@ co.elastic.apm apm-mule3-agent - 1.19.1 + 1.21.1 ${packaging} Mule apm-mule3-agent Application @@ -34,7 +34,7 @@ 3.9.0 1.2 - 1.19.0 + 1.21.0 1.10.8 1.8 diff --git a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/SpanStore.java b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/SpanStore.java index 3b23c32..b9590a3 100644 --- a/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/SpanStore.java +++ b/apm-mule3-agent/src/main/java/co/elastic/apm/mule/utils/SpanStore.java @@ -9,6 +9,7 @@ import org.mule.api.context.notification.ServerNotification; import org.mule.api.processor.MessageProcessor; import org.mule.context.notification.MessageProcessorNotification; +import org.python.modules.synchronize; import co.elastic.apm.api.Span; @@ -22,7 +23,7 @@ */ public class SpanStore { - private Map, Span>> map = Collections.synchronizedMap(new WeakHashMap<>()); + private static Map, Span>> map = Collections.synchronizedMap(new WeakHashMap, Span>>()); /** * Store a {@link co.elastic.apm.api.Span} or a @@ -38,13 +39,15 @@ public void storeTransactionOrSpan(String key, ServerNotification notification, Optional key2 = getKey2(notification); - Map, Span> innerMap = map.get(key); + synchronized(map) { + Map, Span> innerMap = map.get(key); - if (innerMap == null) - innerMap = new HashMap<>(); + if (innerMap == null) + innerMap = new HashMap<>(); - innerMap.put(key2, span); - map.put(key, innerMap); + innerMap.put(key2, span); + map.put(key, innerMap); + } } /** @@ -59,11 +62,17 @@ public Span getTransactionOrSpan(String key, ServerNotification notification) { Optional key2 = getKey2(notification); - Map, Span> stack = map.get(key); - Span span = stack.remove(key2); + Span span = null; + + synchronized(map) { + Map, Span> stack = map.get(key); + span = stack.remove(key2); - if (stack.size() == 0) - map.remove(key); + if (stack.size() == 0) + map.remove(key); + else + map.put(key, stack); + } return span; } diff --git a/apm-mule3.8-agent/pom.xml b/apm-mule3.8-agent/pom.xml index a9d0be7..6fa4828 100644 --- a/apm-mule3.8-agent/pom.xml +++ b/apm-mule3.8-agent/pom.xml @@ -5,7 +5,7 @@ 4.0.0 co.elastic.apm apm-mule3.8-agent - 1.19.1 + 1.21.1 ${packaging} Mule apm-mule3-agent Application built for Mule 3.8 @@ -34,7 +34,7 @@ 3.8.1 1.2 - 1.19.0 + 1.21.0 1.10.8 1.8 diff --git a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/SpanStore.java b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/SpanStore.java index ec3ae3d..b9590a3 100644 --- a/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/SpanStore.java +++ b/apm-mule3.8-agent/src/main/java/co/elastic/apm/mule/utils/SpanStore.java @@ -9,6 +9,7 @@ import org.mule.api.context.notification.ServerNotification; import org.mule.api.processor.MessageProcessor; import org.mule.context.notification.MessageProcessorNotification; +import org.python.modules.synchronize; import co.elastic.apm.api.Span; @@ -22,7 +23,7 @@ */ public class SpanStore { - private Map, Span>> map = Collections.synchronizedMap(new WeakHashMap<>()); + private static Map, Span>> map = Collections.synchronizedMap(new WeakHashMap, Span>>()); /** * Store a {@link co.elastic.apm.api.Span} or a @@ -30,21 +31,23 @@ public class SpanStore { * {@link String} key * * @param key - * rootMessageId from MuleMessage + * rootMessageId from MuleMessage * @param span - * Span or Transaction object to store + * Span or Transaction object to store */ public void storeTransactionOrSpan(String key, ServerNotification notification, Span span) { Optional key2 = getKey2(notification); - Map, Span> innerMap = map.get(key); + synchronized(map) { + Map, Span> innerMap = map.get(key); - if (innerMap == null) - innerMap = new HashMap<>(); + if (innerMap == null) + innerMap = new HashMap<>(); - innerMap.put(key2, span); - map.put(key, innerMap); + innerMap.put(key2, span); + map.put(key, innerMap); + } } /** @@ -59,12 +62,18 @@ public Span getTransactionOrSpan(String key, ServerNotification notification) { Optional key2 = getKey2(notification); - Map, Span> stack = map.get(key); - Span span = stack.remove(key2); - - if (stack.size() == 0) - map.remove(key); - + Span span = null; + + synchronized(map) { + Map, Span> stack = map.get(key); + span = stack.remove(key2); + + if (stack.size() == 0) + map.remove(key); + else + map.put(key, stack); + } + return span; } @@ -74,7 +83,7 @@ public Span getTransactionOrSpan(String key, ServerNotification notification) { * can throw NullPointerException, if called on an empty map. * * @param notification - * typically, rootMessageId from MuleMessage + * typically, rootMessageId from MuleMessage * @return */ public int depth(String key) { @@ -99,7 +108,7 @@ public Span getTopLevelTransaction(String key) { private Optional getKey2(ServerNotification notification) { Optional key2 = Optional.empty(); - + if (notification instanceof MessageProcessorNotification) { MessageProcessor processor = ((MessageProcessorNotification) notification).getProcessor(); key2 = Optional.of(processor); diff --git a/example-app/component1/.classpath b/example-app/component1/.classpath index b1ed2f6..dc551f4 100644 --- a/example-app/component1/.classpath +++ b/example-app/component1/.classpath @@ -6,12 +6,7 @@ - - - - - - + \ No newline at end of file diff --git a/example-app/component1/mule-project.xml b/example-app/component1/mule-project.xml index 91f9d7a..6899bc8 100644 --- a/example-app/component1/mule-project.xml +++ b/example-app/component1/mule-project.xml @@ -1,5 +1,5 @@ - + component1 diff --git a/example-app/component1/pom.xml b/example-app/component1/pom.xml index 8a7becf..a4fdf54 100644 --- a/example-app/component1/pom.xml +++ b/example-app/component1/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 com.mycompany @@ -16,7 +15,7 @@ 3.9.0 1.7 - 1.19.1 + 1.21.1 true diff --git a/example-app/component1/src/main/app/mule-app.properties b/example-app/component1/src/main/app/mule-app.properties index 5153f7b..ade8425 100644 --- a/example-app/component1/src/main/app/mule-app.properties +++ b/example-app/component1/src/main/app/mule-app.properties @@ -19,6 +19,7 @@ elastic.apm.service_name=component1 elastic.apm.service_version=v1.0.0 elastic.apm.stack_trace_limit=3 elastic.apm.span_frames_min_duration=0ms +elastic.apm.cloud_provider=NONE # Mule apm specific properties elastic.apm.mule.capture_input_properties=true diff --git a/example-app/component2/.classpath b/example-app/component2/.classpath index b1ed2f6..dc551f4 100644 --- a/example-app/component2/.classpath +++ b/example-app/component2/.classpath @@ -6,12 +6,7 @@ - - - - - - + \ No newline at end of file diff --git a/example-app/component2/mule-project.xml b/example-app/component2/mule-project.xml index d2870b9..764fc7d 100644 --- a/example-app/component2/mule-project.xml +++ b/example-app/component2/mule-project.xml @@ -1,5 +1,5 @@ - + component2 diff --git a/example-app/component2/pom.xml b/example-app/component2/pom.xml index cb7a1df..37b296e 100644 --- a/example-app/component2/pom.xml +++ b/example-app/component2/pom.xml @@ -1,6 +1,5 @@ - - + + 4.0.0 com.mycompany @@ -16,7 +15,7 @@ 3.9.0 1.7 - 1.19.1 + 1.21.1 true diff --git a/example-app/component2/src/main/app/mule-app.properties b/example-app/component2/src/main/app/mule-app.properties index 8e4d9de..6f224b3 100644 --- a/example-app/component2/src/main/app/mule-app.properties +++ b/example-app/component2/src/main/app/mule-app.properties @@ -10,6 +10,8 @@ elastic.apm.service_name=component2 elastic.apm.service_version=v1.0.0 elastic.apm.stack_trace_limit=3 elastic.apm.span_frames_min_duration=0ms +elastic.apm.cloud_provider=NONE + # Mule apm specific properties elastic.apm.mule.capture_input_properties=true