--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java Fri May 17 15:53:21 2019 +0200
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java Fri May 17 16:02:27 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,6 @@
import static jdk.jfr.internal.LogTag.JFR;
import static jdk.jfr.internal.LogTag.JFR_SYSTEM;
-import java.io.IOException;
import java.security.AccessControlContext;
import java.security.AccessController;
import java.time.Duration;
@@ -96,6 +95,7 @@
Thread t = SecuritySupport.createThreadWitNoPermissions("Permissionless thread", ()-> {
result.add(new Timer("JFR Recording Scheduler", true));
});
+ jvm.exclude(t);
t.start();
t.join();
return result.get(0);
@@ -204,7 +204,7 @@
repository.clear();
}
- synchronized void start(PlatformRecording recording) {
+ synchronized long start(PlatformRecording recording) {
// State can only be NEW or DELAYED because of previous checks
Instant now = Instant.now();
recording.setStartTime(now);
@@ -215,14 +215,17 @@
}
boolean toDisk = recording.isToDisk();
boolean beginPhysical = true;
+ long streamInterval = recording.getStreamIntervalMillis();
for (PlatformRecording s : getRecordings()) {
if (s.getState() == RecordingState.RUNNING) {
beginPhysical = false;
if (s.isToDisk()) {
toDisk = true;
}
+ streamInterval = Math.min(streamInterval, s.getStreamIntervalMillis());
}
}
+ long startNanos = -1;
if (beginPhysical) {
RepositoryChunk newChunk = null;
if (toDisk) {
@@ -232,7 +235,8 @@
MetadataRepository.getInstance().setOutput(null);
}
currentChunk = newChunk;
- jvm.beginRecording_();
+ jvm.beginRecording_();
+ startNanos = jvm.getChunkStartNanos();
recording.setState(RecordingState.RUNNING);
updateSettings();
writeMetaEvents();
@@ -241,7 +245,8 @@
if (toDisk) {
newChunk = repository.newChunk(now);
RequestEngine.doChunkEnd();
- MetadataRepository.getInstance().setOutput(newChunk.getUnfishedFile().toString());
+ MetadataRepository.getInstance().setOutput(newChunk.getUnfishedFile().toString());
+ startNanos = jvm.getChunkStartNanos();
}
recording.setState(RecordingState.RUNNING);
updateSettings();
@@ -251,8 +256,12 @@
}
currentChunk = newChunk;
}
+ if (toDisk) {
+ RequestEngine.setFlushInterval(streamInterval);
+ }
+ RequestEngine.doChunkBegin();
- RequestEngine.doChunkBegin();
+ return startNanos;
}
synchronized void stop(PlatformRecording recording) {
@@ -267,6 +276,7 @@
Instant now = Instant.now();
boolean toDisk = false;
boolean endPhysical = true;
+ long streamInterval = Long.MAX_VALUE;
for (PlatformRecording s : getRecordings()) {
RecordingState rs = s.getState();
if (s != recording && RecordingState.RUNNING == rs) {
@@ -274,6 +284,7 @@
if (s.isToDisk()) {
toDisk = true;
}
+ streamInterval = Math.min(streamInterval, s.getStreamIntervalMillis());
}
}
OldObjectSample.emit(recording);
@@ -309,6 +320,13 @@
currentChunk = newChunk;
RequestEngine.doChunkBegin();
}
+
+ if (toDisk) {
+ RequestEngine.setFlushInterval(streamInterval);
+ } else {
+ RequestEngine.setFlushInterval(Long.MAX_VALUE);
+ }
+
recording.setState(RecordingState.STOPPED);
}
@@ -395,6 +413,7 @@
r.appendChunk(chunk);
}
}
+ FilePurger.purge();
}
private void writeMetaEvents() {
@@ -415,6 +434,8 @@
event.maxSize = size == null ? Long.MAX_VALUE : size;
Instant start = r.getStartTime();
event.recordingStart = start == null ? Long.MAX_VALUE : start.toEpochMilli();
+ Duration fi = r.getFlushInterval();
+ event.flushInterval = fi == null ? Long.MAX_VALUE : fi.toMillis();
event.commit();
}
}
@@ -448,7 +469,7 @@
JVM.FILE_DELTA_CHANGE.wait(duration < 10 ? 10 : duration);
}
} catch (InterruptedException e) {
- e.printStackTrace();
+ // Ignore
}
}