From 4bc86a26db1eb3d054d80c9759fe04686e1e36b3 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Tue, 23 Sep 2025 12:36:13 +0000 Subject: [PATCH] 8367948: JFR: MethodTrace threshold setting has no effect Reviewed-by: shade --- .../jdk/jfr/events/MethodTraceEvent.java | 2 +- .../classes/jdk/jfr/tracing/MethodTracer.java | 8 ++--- .../jfr/event/tracing/TestMethodTrace.java | 29 +++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/jdk.jfr/share/classes/jdk/jfr/events/MethodTraceEvent.java b/src/jdk.jfr/share/classes/jdk/jfr/events/MethodTraceEvent.java index a56de3e6fca..fa9d1345cd6 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/events/MethodTraceEvent.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/events/MethodTraceEvent.java @@ -49,7 +49,7 @@ public final class MethodTraceEvent extends AbstractJDKEvent { return 0; } - public static boolean enabled() { + public static boolean shouldCommit(long duration) { // Generated by JFR return false; } diff --git a/src/jdk.jfr/share/classes/jdk/jfr/tracing/MethodTracer.java b/src/jdk.jfr/share/classes/jdk/jfr/tracing/MethodTracer.java index 0d7b8072194..c4cb0e4fa2c 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/tracing/MethodTracer.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/tracing/MethodTracer.java @@ -50,7 +50,7 @@ public final class MethodTracer { public static void traceObjectInit(long startTime, long methodId) { long endTime = JVM.counterTime(); long duration = endTime - startTime; - if (MethodTraceEvent.enabled() && JVM.getEventWriter() != null) { + if (MethodTraceEvent.shouldCommit(duration) && JVM.getEventWriter() != null) { MethodTraceEvent.commit(startTime, duration, methodId); } } @@ -66,7 +66,7 @@ public final class MethodTracer { public static void traceTimingObjectInit(long startTime, long methodId) { long endTime = JVM.counterTime(); long duration = endTime - startTime; - if (MethodTraceEvent.enabled() && JVM.getEventWriter() != null) { + if (MethodTraceEvent.shouldCommit(duration) && JVM.getEventWriter() != null) { MethodTraceEvent.commit(startTime, duration, methodId); } if (MethodTimingEvent.enabled()) { @@ -77,7 +77,7 @@ public final class MethodTracer { public static void trace(long startTime, long methodId) { long endTime = JVM.counterTime(); long duration = endTime - startTime; - if (MethodTraceEvent.enabled()) { + if (MethodTraceEvent.shouldCommit(duration)) { MethodTraceEvent.commit(startTime, duration, methodId); } } @@ -96,7 +96,7 @@ public final class MethodTracer { if (MethodTimingEvent.enabled()) { PlatformTracer.addTiming(methodId, duration); } - if (MethodTraceEvent.enabled()) { + if (MethodTraceEvent.shouldCommit(duration)) { MethodTraceEvent.commit(startTime, duration, methodId); } } diff --git a/test/jdk/jdk/jfr/event/tracing/TestMethodTrace.java b/test/jdk/jdk/jfr/event/tracing/TestMethodTrace.java index a5fd1430627..5f26e5588f3 100644 --- a/test/jdk/jdk/jfr/event/tracing/TestMethodTrace.java +++ b/test/jdk/jdk/jfr/event/tracing/TestMethodTrace.java @@ -22,6 +22,8 @@ */ package jdk.jfr.event.tracing; +import java.time.Duration; +import java.util.List; import java.util.concurrent.atomic.AtomicReference; import jdk.jfr.Event; @@ -29,7 +31,9 @@ import jdk.jfr.StackTrace; import jdk.jfr.consumer.RecordedEvent; import jdk.jfr.consumer.RecordedMethod; import jdk.jfr.consumer.RecordingStream; +import jdk.jfr.Recording; +import jdk.test.lib.jfr.Events; /** * @test * @summary Basic test of the MethodTrace event. @@ -52,6 +56,31 @@ public class TestMethodTrace { } public static void main(String... args) throws Exception { + testWithoutThreshold(); + testWithThreshold(); + } + + private static void testWithThreshold() throws Exception { + try (Recording r = new Recording()) { + r.enable(EVENT_NAME) + .with("filter", CLASS_NAME + "::printHello") + .withThreshold(Duration.ofHours(1)); + r.start(); + printHello(); + r.stop(); + List events = Events.fromRecording(r); + if (!events.isEmpty()) { + System.out.println(events); + throw new Exception("Unexpected MethodTrace event"); + } + } + } + + public static void printHello() { + System.out.println("Hello!"); + } + + private static void testWithoutThreshold() throws Exception { AtomicReference o = new AtomicReference<>(); AtomicReference i = new AtomicReference<>(); AtomicReference e = new AtomicReference<>();