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