8359135: New test TestCPUTimeSampleThrottling fails intermittently

Reviewed-by: mdoerr
This commit is contained in:
Johannes Bechberger 2025-06-12 08:54:21 +00:00
parent 3e0ef832cc
commit 3f0fef2c9c

View File

@ -61,19 +61,27 @@ public class TestCPUTimeSampleThrottling {
private static void testThrottleSettingsPeriod() throws Exception { private static void testThrottleSettingsPeriod() throws Exception {
float rate = countEvents(1000, "10ms").rate(); float rate = countEvents(1000, "10ms").rate();
Asserts.assertTrue(rate > 90 && rate < 110, "Expected around 100 events per second, got " + rate); Asserts.assertTrue(rate > 75 && rate < 110, "Expected around 100 events per second, got " + rate);
} }
private record EventCount(long count, float time) { private record EventCount(long count, float cpuTime) {
float rate() { float rate() {
return count / time; return count / cpuTime;
} }
} }
private static EventCount countEvents(int timeMs, String rate) throws Exception { /**
try(Recording recording = new Recording()) { * Counting the events that are emitted for a given throttle in a given time.
* <p>
* The result is wall-clock independent; it only records the CPU-time and the number of
* emitted events. The result, therefore, does not depend on the load of the machine.
* And because failed events are counted too, the result is not affected by the thread
* doing other in-JVM work (like garbage collection).
*/
private static EventCount countEvents(int timeMs, String throttle) throws Exception {
try (Recording recording = new Recording()) {
recording.enable(EventNames.CPUTimeSample) recording.enable(EventNames.CPUTimeSample)
.with("throttle", rate); .with("throttle", throttle);
var bean = ManagementFactory.getThreadMXBean(); var bean = ManagementFactory.getThreadMXBean();
@ -92,8 +100,6 @@ public class TestCPUTimeSampleThrottling {
.equals(Thread.currentThread().getName())) .equals(Thread.currentThread().getName()))
.count(); .count();
System.out.println("Event count: " + eventCount + ", CPU time: " + spendCPUTime / 1_000_000_000f + "s");
return new EventCount(eventCount, spendCPUTime / 1_000_000_000f); return new EventCount(eventCount, spendCPUTime / 1_000_000_000f);
} }
} }