On 1/16/20 3:57 PM, Oguz Bektas wrote:
> Signed-off-by: Oguz Bektas <o.bek...@proxmox.com>
> ---
> 
> some thoughts about this, based on our offline discussion with dominik.
> 
> this patch currently allows us to hotplug the fstrim option for agent,
> when it's the only change.
> however if the user changes both the type and this option for example,
> it will not hotplug the option. this is the same behavior/semantic we
> have with the other options like for disks (where you can hotplug some
> options like backup etc. but they won't hotplug if you change
> non-hotpluggable things at the same time).

that's a bit of a bummer

> 
> one way of handling this in a generic way (for reuse) would be to have a
> schema for each property string, to define the hotpluggability (or other
> traits) of each substring/option.

funnily I did not read this, straight went out and tried it and though roughly
about the same.

> 
> so for now i decided to leave it like this since it behaves similar to
> our other options, but we can discuss some solutions

we do? ^^ Let us rather try to do it the rightâ„¢ wait now :)

This would've been fixed with:
----8<----
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 1d01a68..1197be1 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -5032,10 +5032,15 @@ sub vmconfig_hotplug_pending {
                vmconfig_update_disk($storecfg, $conf, 
$hotplug_features->{disk},
                                     $vmid, $opt, $value, 1, $arch, 
$machine_type);
            } elsif ($opt eq 'agent') {
-               my $old_agent = parse_guest_agent($conf);
-               my $new_agent = parse_guest_agent($conf->{pending});
-               if ($old_agent->{enabled} ne $new_agent->{enabled} ||
-                   $old_agent->{type} ne $new_agent->{type}) {
+               my $old = parse_guest_agent($conf);
+               my $new = parse_guest_agent($conf->{pending});
+               if ($old->{enabled} ne $new->{enabled} ||
+                   $old->{type} ne $new->{type}) {
+
+                   if ($old->{fstrim_cloned_disks} != 
$new->{fstrim_cloned_disks}) {
+                       $old->{fstrim_cloned_disks} = 
$new->{fstrim_cloned_disks};
+                       $conf->{$opt} = 
PVE::JSONSchema::print_property_string($old, $agent_fmt);
+                   }
                    die "skip\n"; # can't hotplug-enable agent or change type
                }
            } elsif ($opt =~ m/^memory$/) { #dimms
---

You may've guessed that the variable renaming was to make it more genreral.
I'd create a $partial_fast_plug_option map with 
{
    opt1 => {
        fmt => $fmt_ref,
        properties => [ 'hotpluggable_fmtstr_subkey1', 
'hotpluggable_fmtstr_subkey2', ... ]
    },
    opt2 => {
        ....
    },
   ...
};

A small helper method then can do the actual parse old/new format string, check 
if
* only hotpluggable keys changed -> fully apply (just early return, let the 
common
  code path handle it)
* a mix of those falue changed, apply hotpluggable one to the old has, 
print_property_string
  it to $conf->{opt}, die "skip"

Shouldn't be to hard, may want to see if you want to pass a comparator for old 
new (or have
it in the map? then a array won't cut it) or have a general one which compares 
by using the
schema info, i.e., checks if string, boolean, integer and does the respective 
comparission, 
i.e., a safe_ne on steroids - latter would probably be nicer to may be a bit 
complexer if
complex edge cases need to be handled, you'll see once you try it.

> 
>  PVE/QemuServer.pm | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index 9ef3b71..c2547d6 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -5031,6 +5031,13 @@ sub vmconfig_hotplug_pending {
>               }
>               vmconfig_update_disk($storecfg, $conf, 
> $hotplug_features->{disk},
>                                    $vmid, $opt, $value, 1, $arch, 
> $machine_type);
> +         } elsif ($opt eq 'agent') {
> +             my $old_agent = parse_guest_agent($conf);
> +             my $new_agent = parse_guest_agent($conf->{pending});
> +             if ($old_agent->{enabled} ne $new_agent->{enabled} ||
> +                 $old_agent->{type} ne $new_agent->{type}) {
> +                 die "skip\n"; # can't hotplug-enable agent or change type
> +             }
>           } elsif ($opt =~ m/^memory$/) { #dimms
>               die "skip\n" if !$hotplug_features->{memory};
>               $value = PVE::QemuServer::Memory::qemu_memory_hotplug($vmid, 
> $conf, $defaults, $opt, $value);
> 



_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to