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