RFR: 8256156: JFR: Allow 'jfr' tool to show metadata without a recording
Erik Gahlin
egahlin at openjdk.java.net
Tue Feb 16 19:20:40 UTC 2021
On Sun, 7 Feb 2021 08:43:07 GMT, Yang Yi <github.com+5010047+kelthuzadx at openjdk.org> wrote:
>> Now --events operates on types, not just events.
>>
>> I think you could keep EventType, and much of the code that you changed into Type. You just need to check if a type is an EventType, i.e. if (Type.SUPER_TYPE_EVENT.equals(type.getSuperType())) { ...}, when using --events (or --categories).
>
> I've updated my patch. Only when meeting an event type, a filter applied, otherwise it operates on types
It still doesn't work the same way as when you specify a file.
Here is a patch I think it will fix the functionality. Not tested or formatted.
diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Metadata.java
b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Metadata.java
index 7a4b49703cf..1b6c50df441 100644
--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Metadata.java
+++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/tool/Metadata.java
@@ -39,6 +39,7 @@ import java.util.List;
import java.util.function.Predicate;
import jdk.jfr.EventType;
+import jdk.jfr.FlightRecorder;
import jdk.jfr.consumer.RecordingFile;
import jdk.jfr.internal.PlatformEventType;
import jdk.jfr.internal.PrivateAccess;
@@ -202,38 +203,40 @@ final class Metadata extends Command {
if (filter != null) {
filter = addCache(filter, type -> type.getId());
}
-
- List<Type> types = getAllTypes(file);
+ List<Type> types = findTypes(file);
Collections.sort(types, new TypeComparator());
for (Type type : types) {
- // if it's an event type, apply filter on it
- if (Type.SUPER_TYPE_EVENT.equals(type.getSuperType())) {
- EventType et = PrivateAccess.getInstance().newEventType((PlatformEventType) type);
- if (filter != null && !filter.test(et)) {
- continue;
+ if (filter != null) {
+ // If --events or --categories, only operate on events
+ if (Type.SUPER_TYPE_EVENT.equals(type.getSuperType())) {
+ EventType et = PrivateAccess.getInstance().newEventType((PlatformEventType) type);
+ if (filter.test(et)) {
+ prettyWriter.printType(type);
+ }
}
+ } else {
+ prettyWriter.printType(type);
}
-
- prettyWriter.printType(type);
}
prettyWriter.flush(true);
pw.flush();
}
}
- private List<Type> getAllTypes(Path file) throws UserDataException {
+ private List<Type> findTypes(Path file) throws UserDataException {
// Determine whether reading from recording file or reading from the JDK where
// the jfr tool is located will be used
if (file == null) {
+ // Force initialization
+ FlightRecorder.getFlightRecorder().getEventTypes();
return TypeLibrary.getInstance().getTypes();
}
- List<Type> types = null;
try (RecordingFile rf = new RecordingFile(file)) {
- types = PRIVATE_ACCESS.readTypes(rf);
+ return PRIVATE_ACCESS.readTypes(rf);
} catch (IOException ioe) {
couldNotReadError(file, ioe);
}
- return types;
+ return null; // Can't reach
}
private Path getOptionalJFRInputFile(Deque<String> options) throws UserDataException {
-------------
PR: https://git.openjdk.java.net/jdk/pull/1904
More information about the hotspot-jfr-dev
mailing list