Skip to content

Commit 9544ab0

Browse files
authored
Handle race between calling jfr RecordingStream.start() and close() (#15231)
1 parent 61af4bd commit 9544ab0

File tree

1 file changed

+19
-1
lines changed
  • instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17

1 file changed

+19
-1
lines changed

instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/RuntimeMetrics.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ static class JfrRuntimeMetrics implements Closeable {
8989
private final List<RecordedEventHandler> recordedEventHandlers;
9090
private final RecordingStream recordingStream;
9191
private final CountDownLatch startUpLatch = new CountDownLatch(1);
92+
private volatile boolean closed = false;
9293

9394
private JfrRuntimeMetrics(OpenTelemetry openTelemetry, Predicate<JfrFeature> featurePredicate) {
9495
this.recordedEventHandlers = HandlerRegistry.getHandlers(openTelemetry, featurePredicate);
@@ -101,12 +102,28 @@ private JfrRuntimeMetrics(OpenTelemetry openTelemetry, Predicate<JfrFeature> fea
101102
recordingStream.onEvent(handler.getEventName(), handler);
102103
});
103104
recordingStream.onMetadata(event -> startUpLatch.countDown());
104-
Thread daemonRunner = new Thread(recordingStream::start, "OpenTelemetry JFR-Metrics-Runner");
105+
Thread daemonRunner =
106+
new Thread(this::startRecordingStream, "OpenTelemetry JFR-Metrics-Runner");
105107
daemonRunner.setDaemon(true);
106108
daemonRunner.setContextClassLoader(null);
107109
daemonRunner.start();
108110
}
109111

112+
private void startRecordingStream() {
113+
if (closed) {
114+
return;
115+
}
116+
117+
try {
118+
recordingStream.start();
119+
} catch (IllegalStateException exception) {
120+
// Can happen when close is called at the same time as start
121+
if (!closed) {
122+
throw exception;
123+
}
124+
}
125+
}
126+
110127
static JfrRuntimeMetrics build(
111128
OpenTelemetry openTelemetry, Predicate<JfrFeature> featurePredicate) {
112129
if (!isJfrAvailable()) {
@@ -117,6 +134,7 @@ static JfrRuntimeMetrics build(
117134

118135
@Override
119136
public void close() {
137+
closed = true;
120138
recordingStream.close();
121139
recordedEventHandlers.forEach(RecordedEventHandler::close);
122140
}

0 commit comments

Comments
 (0)