Skip to content

Commit 01639f2

Browse files
fix: exclude jdk.jfr classes from transformation to prevent JFR reentrancy corruption (#821)
During JFR event writing (e.g. FileWriteEvent), EventWriter.endEvent() may trigger class loading of jdk.jfr.internal.Bits on the large-size path. TtlTransformer intercepts this class loading, and Javassist introspection side effects (NotFoundException, object allocations) produce nested JFR events that corrupt the in-progress event buffer, resulting in corrupted JFR files with invalid event sizes. Adding jdk.jfr to the package exclusion list prevents this reentrancy. TTL would never transform JFR classes anyway (they are not executors or thread pools), so this is a safe no-op filter.
1 parent f900932 commit 01639f2

2 files changed

Lines changed: 10 additions & 0 deletions

File tree

ttl-agent/src/main/java/com/alibaba/ttl3/agent/TtlTransformer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ public final byte[] transform(@Nullable final ClassLoader loader, @Nullable fina
6363
final ClassInfo classInfo = new ClassInfo(classFile, classFileBuffer, loader);
6464
if (isClassUnderPackage(classInfo.getClassName(), "com.alibaba.ttl")) return NO_TRANSFORM;
6565
if (isClassUnderPackage(classInfo.getClassName(), "java.lang")) return NO_TRANSFORM;
66+
// Exclude JFR classes to prevent reentrancy corruption in JFR EventWriter.
67+
// During event writing, class loading can trigger this transformer, and Javassist
68+
// introspection side effects (exceptions, allocations) produce nested JFR events
69+
// that corrupt the in-progress event buffer.
70+
if (isClassUnderPackage(classInfo.getClassName(), "jdk.jfr")) return NO_TRANSFORM;
6671

6772
if (logClassTransform)
6873
logger.info("[TtlTransformer] transforming " + classInfo.getClassName()

ttl2-compatible/src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ public final byte[] transform(@Nullable final ClassLoader loader, @Nullable fina
6464
final ClassInfo classInfo = new ClassInfo(classFile, classFileBuffer, loader);
6565
if (isClassUnderPackage(classInfo.getClassName(), "com.alibaba.ttl")) return NO_TRANSFORM;
6666
if (isClassUnderPackage(classInfo.getClassName(), "java.lang")) return NO_TRANSFORM;
67+
// Exclude JFR classes to prevent reentrancy corruption in JFR EventWriter.
68+
// During event writing, class loading can trigger this transformer, and Javassist
69+
// introspection side effects (exceptions, allocations) produce nested JFR events
70+
// that corrupt the in-progress event buffer.
71+
if (isClassUnderPackage(classInfo.getClassName(), "jdk.jfr")) return NO_TRANSFORM;
6772

6873
if (logClassTransform)
6974
logger.info("[TtlTransformer] transforming " + classInfo.getClassName()

0 commit comments

Comments
 (0)