qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC PATCH v1 1/8] qapi: golang: Generate qapi's enum types in Go


From: Victor Toso
Subject: Re: [RFC PATCH v1 1/8] qapi: golang: Generate qapi's enum types in Go
Date: Tue, 10 May 2022 13:28:39 +0200

Hi,

On Tue, May 10, 2022 at 12:19:57PM +0100, Daniel P. Berrangé wrote:
> > Marshalling does error if you try to convert an int that is not
> > in the range of the enum type.
> > 
> > Unmarshalling should not error in this case, but the field ends
> > up not being set which defaults to 0 (in this case,
> > ShutdownCauseNone). That could mislead the *actual* reason but
> > not without a warning which is expected in this case, imho.
> > 
> > (I know is not an actual warning, just a Println, but it'll be
> > fixed in the next iteration)
> 
> I don't thinnk we should be emitting warnings/printlns at all
> in this case though. The app should be able to consume the enum
> without needing a warning.  If the app wants to validate
> against a specific set of constants, it can decide to emit a
> warning if there was a case it can't handle. We shouldn't emit
> warnings/errors in the unmarshalling step though,as it isn't
> the right place to decide on such policy.

I think it is useful to know that, a binary compiled to qapi-go
7.0 but running with qemu 7.1 would have some mismatches. It
could help detect issues (e.g: Why my program doesn't know/show
the reason for shutdown?).

So, some sort of --verbose option for this level should exist.

> >   | func (s *ShutdownCause) UnmarshalJSON(data []byte) error {
> >   |     var name string
> >   |
> >   |     if err := json.Unmarshal(data, &name); err != nil {
> >   |         return err
> >   |     }
> >   |
> >   |     switch name {
> >   |     case "none":
> >   |         (*s) = ShutdownCauseNone
> >   |     case "host-error":
> >   |         (*s) = ShutdownCauseHostError
> >   |     case "host-qmp-quit":
> >   |         (*s) = ShutdownCauseHostQmpQuit
> >   |     case "host-qmp-system-reset":
> >   |         (*s) = ShutdownCauseHostQmpSystemReset
> >   |     case "host-signal":
> >   |         (*s) = ShutdownCauseHostSignal
> >   |     case "host-ui":
> >   |         (*s) = ShutdownCauseHostUi
> >   |     case "guest-shutdown":
> >   |         (*s) = ShutdownCauseGuestShutdown
> >   |     case "guest-reset":
> >   |         (*s) = ShutdownCauseGuestReset
> >   |     case "guest-panic":
> >   |         (*s) = ShutdownCauseGuestPanic
> >   |     case "subsystem-reset":
> >   |         (*s) = ShutdownCauseSubsystemReset
> >   |     default:
> >   |         fmt.Println("Failed to decode ShutdownCause", *s)
> >   |     }
> >   |     return nil
> >   | }
> > 
> > > If the enums were just represented as strings, then we can
> > > gracefully accept any new enum value that arrives in future.
> > > The application can thus also still log the shutdown reason
> > > string, even though it was not a value explicitly known to the
> > > generated API.
> > 
> > As a string, the warning should still exist and default value of
> > "" or nil for ptr would apply. IMHO, between string + warning and
> > int + warning, I'd still go with int here.
> > 
> > That's a design decision to be made. All in all, I don't know
> > much about the changes in QEMU/QAPI per version to take this
> > decision, so I'll rely on you and the list for this, not just for
> > enums but for the other types too.
> 
> Essentially every release of QEMU will have QAPI changes. Most of
> the time these are append-only changes. ie a new struct, new command,
> new field, new enum value.  Sometimes there will be removals due
> to deprecation, though note my other reply saying that we really
> ought to stop doing removals from the schema, and instead just
> annotate when a field stops being used.

Ok, thanks.

Cheers,
Victor

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]