10000 Reduce footprint of SourceFile tracking (#8524) · DataDog/dd-trace-java@04b1afd · GitHub
[go: up one dir, main page]

Skip to content

Commit 04b1afd

Browse files
authored
Reduce footprint of SourceFile tracking (#8524)
classNamesBySourceFile map used for SourceFile tracking can have a lot of entries (different SourceFiles) and for each entry we have a list (If any inner classe or non-public top-level classes). Compacting to a comma-separated list reduce the footprint of this map. As the usage is very unfrequent we can pay the price to "deserialize" the list to go through the classname that we need to retransform as a dependency
1 parent 0666be6 commit 04b1afd

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ClassesToRetransformFinder.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,32 @@
99
import com.datadog.debugger.instrumentation.InstrumentationResult;
1010
import com.datadog.debugger.probe.ProbeDefinition;
1111
import java.util.ArrayList;
12+
import java.util.Arrays;
1213
import java.util.List;
1314
import java.util.concurrent.ConcurrentHashMap;
1415
import java.util.concurrent.ConcurrentMap;
16+
import java.util.regex.Pattern;
1517
import java.util.stream.Collectors;
1618
import java.util.stream.Stream;
1719
import org.slf4j.Logger;
1820
import org.slf4j.LoggerFactory;
1921

2022
public class ClassesToRetransformFinder {
2123
private static final Logger LOGGER = LoggerFactory.getLogger(ClassesToRetransformFinder.class);
24+
private static final Pattern COMMA_PATTERN = Pattern.compile(",");
2225

23-
private final ConcurrentMap<String, List<String>> classNamesBySourceFile =
24-
new ConcurrentHashMap<>();
26+
private final ConcurrentMap<String, String> classNamesBySourceFile = new ConcurrentHashMap<>();
2527

2628
public void register(String sourceFile, String className) {
2729
// store only the class name that are different from SourceFile name
2830
// (Inner or non-public Top-Level classes)
2931
classNamesBySourceFile.compute(
3032
sourceFile,
31-
(key, list) -> {
32-
if (list == null) {
33-
list = new ArrayList<>();
33+
(key, classNames) -> {
34+
if (classNames == null) {
35+
return className;
3436
}
35-
list.add(className);
36-
return list;
37+
return classNames + "," + className;
3738
});
3839
}
3940

@@ -89,13 +90,11 @@ Trie getAllChangedClasses(ConfigurationComparer comparer) {
8990

9091
private void processAdditionalClasses(String sourceFile, Trie changedClasses) {
9192
sourceFile = stripPackagePath(sourceFile);
92-
// need to clone the list to avoid concurrent modification during iteration
93-
List<String> additionalClasses =
94-
classNamesBySourceFile.computeIfPresent(
95-
sourceFile, (k, classNames) -> new ArrayList<>(classNames));
96-
if (additionalClasses == null) {
93+
String classNames = classNamesBySourceFile.get(sourceFile);
94+
if (classNames == null) {
9795
return;
9896
}
97+
List<String> additionalClasses = Arrays.asList(COMMA_PATTERN.split(classNames));
9998
for (String additionalClass : additionalClasses) {
10099
additionalClass = normalizeFilePath(additionalClass);
101100
changedClasses.insert(reverseStr(additionalClass));

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/InnerHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33
public class InnerHelper {
44

55
public static class MyInner {}
6+
7+
public static class MySecondInner {}
68
}

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/SourceFileTrackingTransformerTest.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,22 @@ void transformInner() throws IllegalClassFormatException {
5858
null,
5959
null,
6060
getClassFileBytes(InnerHelper.MyInner.class));
61+
sourceFileTrackingTransformer.transform(
62+
null,
63+
getInternalName(InnerHelper.MySecondInner.class),
64+
null,
65+
null,
66+
getClassFileBytes(InnerHelper.MySecondInner.class));
6167
changedClasses =
6268
finder.getAllLoadedChangedClasses(
63-
new Class[] {InnerHelper.class, InnerHelper.MyInner.class}, comparer);
64-
assertEquals(2, changedClasses.size());
69+
new Class[] {
70+
InnerHelper.class, InnerHelper.MyInner.class, InnerHelper.MySecondInner.class
71+
},
72+
comparer);
73+
assertEquals(3, changedClasses.size());
6574
assertEquals(InnerHelper.class, changedClasses.get(0));
6675
assertEquals(InnerHelper.MyInner.class, changedClasses.get(1));
76+
assertEquals(InnerHelper.MySecondInner.class, changedClasses.get(2));
6777
}
6878

6979
private ConfigurationComparer createComparer(String sourceFile) {

0 commit comments

Comments
 (0)
0