RFR: 8365066: RecordingStream and RemoteRecordingStream do not terminate when the associated Recording is stopped or closed externally
Andrey Turbanov
aturbanov at openjdk.org
Thu Aug 21 09:27:50 UTC 2025
On Sat, 9 Aug 2025 01:33:29 GMT, Chihiro Ito <cito at openjdk.org> wrote:
> Fix an issue where RecordingStream and RemoteRecordingStream do not stop when their underlying the local/remote recording stop.
>
> Introduce an internal EventSource abstraction to unify control across local (PlatformRecording) and remote (FlightRecorderMXBean) recordings, ensuring consistent propagation of stop/close and stop time to the consumer streams.
>
> Tests updated to validate lifecycle consistency:
> Verifies that stopping/closing the underlying recording (local and remote) properly stops/closes the corresponding stream.
>
> Test: jdk/jdk/jfr
src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java line 171:
> 169: }
> 170:
> 171: if(!barrier.used()) {
Suggestion:
if (!barrier.used()) {
src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java line 195:
> 193: }
> 194:
> 195: if(!barrier.used()) {
Suggestion:
if (!barrier.used()) {
src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java line 200:
> 198: logStreamEnd("Event source is closed externally");
> 199: return;
> 200: }else if(state == RecordingState.STOPPED) {
Suggestion:
} else if (state == RecordingState.STOPPED) {
src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/LocalRecordingEventSource.java line 57:
> 55:
> 56: @Override
> 57: public RecordingState getState() {
Suggestion:
public RecordingState getState() {
src/jdk.management.jfr/share/classes/jdk/management/jfr/RemoteRecordingStream.java line 470:
> 468: stream.close();
> 469: try {
> 470: if(eventSource.getState() != RecordingState.CLOSED) {
Suggestion:
if (eventSource.getState() != RecordingState.CLOSED) {
src/jdk.management.jfr/share/classes/jdk/management/jfr/internal/RemoteRecordingEventSource.java line 48:
> 46: public long getStopTime() {
> 47: Optional<RecordingInfo> recordingInfo = mbean.getRecordings().stream().filter(r -> r.getId() == recordingId).findFirst();
> 48: if(recordingInfo.isEmpty()){
Suggestion:
if (recordingInfo.isEmpty()){
src/jdk.management.jfr/share/classes/jdk/management/jfr/internal/RemoteRecordingEventSource.java line 55:
> 53:
> 54: @Override
> 55: public RecordingState getState() {
Suggestion:
public RecordingState getState() {
src/jdk.management.jfr/share/classes/jdk/management/jfr/internal/RemoteRecordingEventSource.java line 57:
> 55: public RecordingState getState() {
> 56: Optional<RecordingInfo> recordingInfo = mbean.getRecordings().stream().filter(r -> r.getId() == recordingId).findFirst();
> 57: if(recordingInfo.isEmpty()){
Suggestion:
if (recordingInfo.isEmpty()){
src/jdk.management.jfr/share/classes/jdk/management/jfr/internal/RemoteRecordingEventSource.java line 58:
> 56: Optional<RecordingInfo> recordingInfo = mbean.getRecordings().stream().filter(r -> r.getId() == recordingId).findFirst();
> 57: if(recordingInfo.isEmpty()){
> 58: return RecordingState.CLOSED;
Suggestion:
return RecordingState.CLOSED;
test/jdk/jdk/jfr/api/consumer/recordingstream/TestClosedRecording.java line 47:
> 45: @Override
> 46: public void recordingStateChanged(Recording recording) {
> 47: if(recording.getState() == RecordingState.RUNNING){
Suggestion:
if (recording.getState() == RecordingState.RUNNING){
test/jdk/jdk/jfr/api/consumer/recordingstream/TestStoppedRecording.java line 44:
> 42: public class TestStoppedRecording {
> 43:
> 44: private static class SendEventListener implements FlightRecorderListener{
Suggestion:
private static class SendEventListener implements FlightRecorderListener {
test/jdk/jdk/jfr/api/consumer/recordingstream/TestStoppedRecording.java line 47:
> 45: @Override
> 46: public void recordingStateChanged(Recording recording) {
> 47: if(recording.getState() == RecordingState.RUNNING){
Suggestion:
if (recording.getState() == RecordingState.RUNNING){
test/jdk/jdk/jfr/jmx/streaming/TestClosedRecording.java line 49:
> 47: @Override
> 48: public void recordingStateChanged(Recording recording) {
> 49: if(recording.getState() == RecordingState.RUNNING){
Suggestion:
if (recording.getState() == RecordingState.RUNNING){
test/jdk/jdk/jfr/jmx/streaming/TestStoppedRecording.java line 49:
> 47: @Override
> 48: public void recordingStateChanged(Recording recording) {
> 49: if(recording.getState() == RecordingState.RUNNING){
Suggestion:
if (recording.getState() == RecordingState.RUNNING){
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2268786865
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2268787115
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2269049532
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2268786126
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2268785446
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2269052713
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2269053453
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2269053705
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2269053990
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2268784511
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2269051861
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2269050262
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2268784953
PR Review Comment: https://git.openjdk.org/jdk/pull/26710#discussion_r2269050747
More information about the hotspot-jfr-dev
mailing list