From: "Max R. Carrara" <m.carrara@proxmox.com>
To: "Thomas Ellmenreich" <t.ellmenreich@proxmox.com>,
<pve-devel@lists.proxmox.com>
Subject: Re: [RFC qemu-server/storage 0/2] refactor of volume_id classification
Date: Wed, 29 Jul 2026 10:27:46 +0200 [thread overview]
Message-ID: <DKAWVJPFFI3L.BHRVCNOAZ08L@proxmox.com> (raw)
In-Reply-To: <DKA9XQ0TBZTM.2SKDG0NKQVRA7@proxmox.com>
On Tue Jul 28, 2026 at 4:29 PM CEST, Thomas Ellmenreich wrote:
> First of all, thanks for taking a look ;)
>
> Some comments below. I will wait a little longer to see if anyone else
> would like to leave some comments, but then I will send a v1.
>
> On Tue Jul 28, 2026 at 3:30 PM CEST, Max R. Carrara wrote:
>
> [snip]
>
> > Overall I like this idea a lot, but there are some things that IMO still
> > need to be fleshed out more. A bunch of comments:
> >
> > - I'm personally not a fan of `use constant` anymore, since it's rather
> > unwieldy and doesn't play too nice with the rest of Perl (e.g.
> > interpolating those constants is annoying).
>
> good to know
>
> >
> > - I would also refrain from exposing any additional constants / variables
> > in PVE::Storage or PVE::Storage::Plugin, because those things
> > implicitly become part of the public API of PVE::Storage, which in
> > turn means it's really hard to change them later on.
>
> also good to know
>
> > In fact, in one of my recent [series] I'm actively trying to get rid
> > of the `our $RE_.*` regexes in PVE::Storage for precisely that reason
> > (see patches #22 - #28 there).
> >
> > Perl's lack of a type system also makes it rather annoying to model
> > such things -- in Rust this would be just a neat enum and we could
> > call it a day.
>
> Yes, that's what I was also thinking of, but perl does not make it easy.
>
> > - The other thing is, do we have a need for anything but 'volume' in
> > pve-storage? Wouldn't it make sense for this helper to live somewhere
> > else?
> >
> > If we decide to keep this in pve-storage, it should only remain in
> > PVE::Storage or PVE::Storage::Common, and not PVE::Storage::Plugin,
> > since ::Plugin should only contain things relevant for the storage
> > plugin API.
>
> Yeah, I think you are right with your assumption. I was also considering
> just leaving the subroutine in 'qemu_server', but then I found it fitting
> to place it next to 'parse_volume_id'. That said, 'qemu_server' is the
> better location, so I will place it there.
>
> >
> > - Also, such functions should not throw an error at all -- you have
> > noticed yourself that you always pass `$noerr`, so there's most likely
> > not a need for it to exist. If the caller throws an error directly
> > if something doesn't match, it's easier to see what the intention
> > behind the check is.
>
> :thumbs-up:
>
> >
> > - So, with all that being said, I instead suggest using four subroutines
> > that each perform their own dedicated check, e.g.:
> >
> > use v5.36;
> >
> > use Exporter qw(import);
> >
> > our @EXPORT_OK = qw(
> > is_cdrom
> > );
> >
> > sub is_cdrom : prototype($) ($value) {
> > return defined($value) && $value eq 'cdrom';
> > }
> >
> > ... and so on.
> >
> > Without checking in greater detail, these helper functions can
> > probably live in their own module somewhere inside qemu-server, though
> > I don't know where else you are planning to use these helpers.
> >
> > While it would probably be considered insane to use a separate
> > function for each check in a normal programming language, Perl doesn't
> > really provide any (sane) constructs (without 10.000 gotchas) that
> > allow you to express this kind of thing in a neater manner.
>
> I was actually also considering this option, but then discarded it in favour
> of the constants. Since those are not an option anymore, I don't find this
> approach that bad.
>
> > Separate subroutines also make it easier to change the underlying
> > implementation once necessary -- I doubt this will matter much here,
> > since the checks are relatively simple, but if we e.g. use perlmod
> > more and end up expressing this as an enum in Rust, then we could let
> > those subroutines wrap the (single) function that we expose through
> > perlmod instead. If we were to introduce new constants in Perl, this
> > would not be possible -- you would have to modify each call site where
> > those constants are used again.
> >
> > This is just an example, but I hope this makes sense.
> >
> > - To summarize all of my rambling above, I would suggest putting this
> > into a dedicated module for such utils somewhere in qemu-server, as
>
> Should I really create a completely new module? I was thinking of placing them
> in PVE::QemuServer::Helpers, but maybe that is not quite correct? And the
> names would have to be a bit more explicit if they were placed in ::Helpers.
Oh yeah, that would of course be a good spot to place them! I hadn't
checked for any existing places 😇
>
> > I don't really see a use case for it in pve-storage. Then, use a
> > separate subroutine for each check. Once we see a need for these
> > helpers elsewhere, we can start generalizing them, maybe even move
> > them to pve-common or something similar. The existing subroutines in
> > qemu-server could then just be wrappers for those in pve-common (or
> > some other package).
> >
> > That way you can do your refactor in qemu-server and then later expand
> > to other places, without having to worry about additional churn, or
> > having to move constants around.
> >
> > I hope all of this makes sense -- I know it's a lot, but I wanted to
> > share all of my thoughts here, esp. because I have stepped into many
> > (way too many) little traps myself when it comes to refactoring Perl
> > code. I do like the fact that you're tackling this a lot; I'm always a
> > fan of reducing the number of random regexes and strings that are
> > floating around. So, I hope my comments are of use to you! :)
>
> The comments are very much appreciated ^^
I'm very glad! If you have any more questions etc. please let me know,
I'm always happy to help :)
>
> >
> > [series] https://lore.proxmox.com/pve-devel/20260422111322.257380-1-m.carrara@proxmox.com/
next prev parent reply other threads:[~2026-07-29 8:28 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-28 12:22 [RFC qemu-server/storage 0/2] refactor of volume_id classification Thomas Ellmenreich
2026-07-28 12:22 ` [PATCH storage 1/2] add subroutine to classify volume ids Thomas Ellmenreich
2026-07-31 10:13 ` Fiona Ebner
2026-07-31 10:21 ` Fiona Ebner
2026-07-28 12:22 ` [PATCH qemu-server 2/2] use new classify_volume_id subroutine Thomas Ellmenreich
2026-07-31 10:13 ` Fiona Ebner
2026-07-28 13:30 ` [RFC qemu-server/storage 0/2] refactor of volume_id classification Max R. Carrara
2026-07-28 14:29 ` Thomas Ellmenreich
2026-07-29 8:27 ` Max R. Carrara [this message]
2026-07-31 9:56 ` Fiona Ebner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DKAWVJPFFI3L.BHRVCNOAZ08L@proxmox.com \
--to=m.carrara@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
--cc=t.ellmenreich@proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox