From ddb79549469fc3b57edecb2599823cd7955914b4 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Tue, 26 Nov 2019 17:00:57 +0100 Subject: [PATCH] 8233870: JFR TestSetEndTime.java times out - onClose() is never called Reviewed-by: mgronlun --- .../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/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java index 009f9dbbaf3..203c3e82e83 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkHeader.java +++ b/src/jdk.jfr/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/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkParser.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkParser.java index 5ad38d1ed3b..f9bca36666c 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/ChunkParser.java +++ b/src/jdk.jfr/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/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java b/test/jdk/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java index df8a63f15d7..700c895f42d 100644 --- a/test/jdk/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java +++ b/test/jdk/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java @@ -63,6 +63,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 { @@ -89,10 +97,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(); } }