RFR: 8288783: JFR: Error messages are confusing when options conflict in -XX:StartFlightRecording

Erik Gahlin egahlin at openjdk.org
Fri Oct 7 05:30:29 UTC 2022


On Tue, 28 Jun 2022 05:50:38 GMT, Chihiro Ito <cito at openjdk.org> wrote:

> Could I have a review of PR that fixes incorrect error messages regarding of recording.
> 
> The current message is very confusing. If a user types jcmd <pid> JFR.start name=abc name=def or java --XX:StartFlightRecording=name=abc,name=def,  the error message says "Duplicates in diagnostic command arguments", but doesn't know what options are duplicated.
> Furthermore, if a user specifies two or three duplicate parameters, the same logs will be output.
> 
> It should say follows,
> Option name can only be specified once with starting flight recording
> Options name and disk can only be specified once with starting flight recording
> Options name, disk and maxage can only be specified once with starting flight recording
> This problem affects --XX:StartFlightRecording, jcmd JFR.start, JFR.stop, JFR.dump, JFR.check, and MBean.
> 
> For other than start, the output is as follows, (example of dump)
> Option name can only be specified once with dumping flight recording
> 
> Testing: jdk/jdk/jfr
> 
> Thanks
> Chihiro

src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/ArgumentParser.java line 77:

> 75:     }
> 76: 
> 77:     protected void checkConflict() {

I think this part can be simplified, the variable names are long and there is too much state to track.

How about this?

`private void checkConflicted() {
        if (conflictedOptions.isEmpty()) {
            return;
        }

        StringBuilder sb = new StringBuilder();
        if (conflictedOptions.size() == 1) {
            sb.append("Option ");
            sb.append(conflictedOptions.remove(0));
        } else {
            sb.append("Options ");
            StringJoiner sj = new StringJoiner(", ");
            while (conflictedOptions.size() > 1) {
                sj.add(conflictedOptions.remove(0));
            }
            sb.append(sj);
            sb.append(" and " + conflictedOptions.remove(0));
        }
        sb.append(" can only be specified once.");
        throw new IllegalArgumentException(sb.toString());
    }`
    
It requires an ArrayList, but you could do:
`    if (!conflictedOptions.contains(key)) {
        conflictedOptions.add(key);
      }`
          
I don't think it's worth the complication with the JfrCommand enum to display the correct command being used in an error message.

-------------

PR: https://git.openjdk.org/jdk/pull/9302


More information about the hotspot-jfr-dev mailing list