all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [RFC pve-container 1/1] mountpoint backup: allow changing backup flag at runtime
@ 2026-08-27 12:26 Thomas Ellmenreich
  0 siblings, 0 replies; only message in thread
From: Thomas Ellmenreich @ 2026-08-27 12:26 UTC (permalink / raw)
  To: pve-devel; +Cc: Thomas Ellmenreich

Previously, setting the backup flag of a running container would first
place it into a pending state, before applying it at a later time. However,
since the flag does not affect the actual mount point, it is now applied
directly.

In situations where multiple settings are changed at once and backup
happens to be one of them, the flag is not applied directly, but instead
marked as pending alongside the other changes.

Suggested-by: Filip Schauer <f.schauer@proxmox.com>
Signed-off-by: Thomas Ellmenreich <t.ellmenreich@proxmox.com>
---
Ticking the backup flag on a running mountpoint can be directly applied,
even if the container is running, as it has no effect on the mountpoint
itself.

This functionality is already present for VMs, but not for containers.

As also mentioned in the commit message, a change to the backup flag is
only directly applied if it is the only change. In cases where other
configuration changes are also made, all of them are set to pending as
a single unit.

Open Questions
--------------

- As far as I understand, qemu-server currently decides whether to change a
  configuration at runtime based on a set of 'fast_plug_option's as well as a
  set of 'non-hotpluggable options'. For the sake of simplicity, I have
  decided to stick with a list of 'fast plug options'. Is this the right
  approach? I considered creating an inverse list, but that would have
  involved more work. Having 'pending' as the default is the correct approach,
  in my opinion.

- Are there any other properties that could mabye be made fast-pluggable?

- Instead of moving the skip and apply control flow into the
  `apply_pending_mountpoint` subroutine, I considered leaving it where
  it was and taking the config parsing to the caller. However, I decided
  against this option, as delegating the config parsing to the caller
  seemed like the wrong decision.

Testing
-------

- Only changing the `backup` setting does precisely that, skipping the
  pending state.

- When combining `backup` with changing a different setting, they are both
  marked as pending.

 src/PVE/LXC/Config.pm | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm
index 7c81834..c28fb04 100644
--- a/src/PVE/LXC/Config.pm
+++ b/src/PVE/LXC/Config.pm
@@ -3,6 +3,7 @@ package PVE::LXC::Config;
 use strict;
 use warnings;
 
+use List::Util qw(uniq first);
 use Fcntl qw(O_RDONLY);
 
 use PVE::AbstractConfig;
@@ -1741,10 +1742,6 @@ sub vmconfig_hotplug_pending {
                     $hotplug_memory->($conf->{pending}->{memory}, $conf->{pending}->{swap});
                 }
             } elsif ($opt =~ m/^mp(\d+)$/) {
-                if (exists($conf->{$opt})) {
-                    die "skip\n"; # don't try to hotplug over existing mp
-                }
-
                 $class->apply_pending_mountpoint($vmid, $conf, $opt, $storecfg, 1);
                 # apply_pending_mountpoint modifies the value if it creates a new disk
                 $value = $conf->{pending}->{$opt};
@@ -1888,11 +1885,35 @@ my $rescan_volume = sub {
     warn "Could not rescan volume size - $@\n" if $@;
 };
 
+# Checks whether the changed properties can be applied at runtime. It only
+# returns true if all changes can be applied in this way. If even one
+# property cannot be applied, returns false to ensure changes are applied
+# as a unit.
+my $mountpoint_config_fast_plug_safe = sub {
+    my ($new, $old) = @_;
+    my @fast_plug_safe_keys = ("backup");
+
+    for my $key (uniq(keys %$new, keys %$old)) {
+        next if first { $_ eq $key } @fast_plug_safe_keys;
+        return 0 if ($new->{$key} // '') ne ($old->{$key} // '');
+    }
+
+    1;
+};
+
 sub apply_pending_mountpoint {
     my ($class, $vmid, $conf, $opt, $storecfg, $running) = @_;
 
     my $mp = $class->parse_volume($opt, $conf->{pending}->{$opt});
     my $old = $conf->{$opt};
+
+    if (exists($conf->{$opt}) && $running) {
+        if ($mountpoint_config_fast_plug_safe->($mp, $class->parse_volume($opt, $old))) {
+            return;
+        }
+        die "skip\n"; # don't try to hotplug over existing mp
+    }
+
     if ($mp->{type} eq 'volume' && $mp->{volume} =~ $PVE::LXC::NEW_DISK_RE) {
         my $original_value = $conf->{pending}->{$opt};
         my $vollist = PVE::LXC::create_disks(
-- 
2.47.3





^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-08-27 12:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-27 12:26 [RFC pve-container 1/1] mountpoint backup: allow changing backup flag at runtime Thomas Ellmenreich

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal