From 235b51f4ff223ca863b23c6d554e889e3fc9be20 Mon Sep 17 00:00:00 2001 From: Denghui Dong Date: Mon, 2 Mar 2020 10:32:49 +0800 Subject: [PATCH] [Backport] 8233870: JFR TestSetEndTime.java times out - onClose() is never called Summary: Test Plan: jdk/jfr Reviewed-by: yuleil Issue: https://github.com/alibaba/dragonwell8/issues/112 --- .../jdk/jfr/internal/consumer/ChunkHeader.java | 4 ++++ .../jdk/jfr/internal/consumer/ChunkParser.java | 7 +++++-- .../api/consumer/recordingstream/TestSetEndTime.java | 12 ++++++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java b/src/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java index 009f9dbba..203c3e82e 100644 --- a/src/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java +++ b/src/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java @@ -292,4 +292,8 @@ public final class ChunkHeader { static long headerSize() { return HEADER_SIZE; } + + public long getLastNanos() { + return getStartNanos() + getDurationNanos(); + } } diff --git a/src/share/classes/jdk/jfr/internal/consumer/ChunkParser.java b/src/share/classes/jdk/jfr/internal/consumer/ChunkParser.java index 5ad38d1ed..f9bca3666 100644 --- a/src/share/classes/jdk/jfr/internal/consumer/ChunkParser.java +++ b/src/share/classes/jdk/jfr/internal/consumer/ChunkParser.java @@ -202,7 +202,7 @@ public final class ChunkParser { long lastValid = absoluteChunkEnd; long metadataPoistion = chunkHeader.getMetataPosition(); long contantPosition = chunkHeader.getConstantPoolPosition(); - chunkFinished = awaitUpdatedHeader(absoluteChunkEnd); + chunkFinished = awaitUpdatedHeader(absoluteChunkEnd, configuration.filterEnd); if (chunkFinished) { Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "At chunk end"); return null; @@ -279,11 +279,14 @@ public final class ChunkParser { } } - private boolean awaitUpdatedHeader(long absoluteChunkEnd) throws IOException { + private boolean awaitUpdatedHeader(long absoluteChunkEnd, long filterEnd) throws IOException { if (Logger.shouldLog(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO)) { Logger.log(LogTag.JFR_SYSTEM_PARSER, LogLevel.INFO, "Waiting for more data (streaming). Read so far: " + chunkHeader.getChunkSize() + " bytes"); } while (true) { + if (chunkHeader.getLastNanos() > filterEnd) { + return true; + } chunkHeader.refresh(); if (absoluteChunkEnd != chunkHeader.getEnd()) { return false; diff --git a/test/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java b/test/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java index 0f8992d3f..8a8c0da31 100644 --- a/test/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java +++ b/test/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java @@ -62,6 +62,14 @@ public final class TestSetEndTime { public static void main(String... args) throws Exception { testEventStream(); testRecordingStream(); + testEmptyStream(); + } + + private static void testEmptyStream() { + try (RecordingStream rs = new RecordingStream()) { + rs.setEndTime(Instant.now().plusMillis(1100)); + rs.start(); + } } private static void testRecordingStream() throws Exception { @@ -88,10 +96,10 @@ public final class TestSetEndTime { } closed.await(); System.out.println("Found events: " + count.get()); - if (count.get() < 50) { + if (count.get() > 0 && count.get() < 50) { return; } - System.out.println("Found 50 events. Retrying"); + System.out.println("Retrying"); System.out.println(); } } -- GitLab