Am 6/17/20 um 2:13 PM schrieb Aaron Lauterer: > Move the logic which volumes are included in the backup job to its own > method and adapt the VZDump code accordingly. This makes it possible to > develop other features around backup jobs. > > Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com> > --- > > v5 -> v6: create hash with volume data directly in push call instead of > adding a new variable beforehand
looks OK in general, some issue with logging the reason below - sorry for noticing that only now. > > v4->v5: > * use new foreach_volume call > * change $ret_volumes to $return_volumes > * use dedicated variables in PVE::VZDump::QemuServer where hash is used > more than once > * renamed $backup_included and other variables to (IMHO) better names > > v3->v4: changed function call for `foreach_drive` to QemuServer::Drive > > PVE/QemuConfig.pm | 31 ++++++++++++++++++++++++++++ > PVE/VZDump/QemuServer.pm | 44 +++++++++++++++++++++------------------- > 2 files changed, 54 insertions(+), 21 deletions(-) > > diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm > index 240fc06..02cddeb 100644 > --- a/PVE/QemuConfig.pm > +++ b/PVE/QemuConfig.pm > @@ -165,6 +165,37 @@ sub get_replicatable_volumes { > return $volhash; > } > > +sub get_backup_volumes { > + my ($class, $conf) = @_; > + > + my $return_volumes = []; > + > + my $test_volume = sub { > + my ($key, $drive) = @_; > + > + return if PVE::QemuServer::drive_is_cdrom($drive); > + > + my $included = $drive->{backup} // 1;; > + my $reason = defined($drive->{backup}) ? 'disabled' : 'enabled'; > + > + if ($key =~ m/^efidisk/ && (!defined($conf->{bios}) || $conf->{bios} ne > 'ovmf')) { > + $included = 0; > + $reason = "efidisk with non omvf bios"; > + } > + > + push @$return_volumes, { > + key => $key, > + included => $included, > + reason => $reason, > + data => $drive, > + }; > + }; > + > + PVE::QemuConfig->foreach_volume($conf, $test_volume); > + > + return $return_volumes; > +} > + > sub __snapshot_save_vmstate { > my ($class, $vmid, $conf, $snapname, $storecfg, $statestorage, $suspend) > = @_; > > diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm > index 91df455..9eeb1b9 100644 > --- a/PVE/VZDump/QemuServer.pm > +++ b/PVE/VZDump/QemuServer.pm > @@ -69,37 +69,39 @@ sub prepare { > > my $vollist = []; > my $drivehash = {}; > - PVE::QemuConfig->foreach_volume($conf, sub { > - my ($ds, $drive) = @_; > - > - return if PVE::QemuServer::drive_is_cdrom($drive); > - > - my $volid = $drive->{file}; > - > - if (defined($drive->{backup}) && !$drive->{backup}) { > - $self->loginfo("exclude disk '$ds' '$volid' (backup=no)"); > - return; > - } elsif ($self->{vm_was_running} && $drive->{iothread}) { > + my $backup_volumes = PVE::QemuConfig->get_backup_volumes($conf); > + > + foreach my $volume (@{$backup_volumes}) { > + my $name = $volume->{key}; > + my $data = $volume->{data}; data is so general, maybe volcfg or even volume_cfg or more even™ volume_config (for both, hash key and variable name) > + my $volid = $data->{file}; > + my $size = $data->{size}; > + > + if (!$volume->{included}) { > + if ($volume->{reason} eq 'efidisk with non omvf bios') { > + $self->loginfo("excluding '$name' (efidisks can only be backed > up when BIOS is set to 'ovmf')"); > + next; > + } > + $self->loginfo("exclude disk '$name' '$volid' (backup=no)"); I really do not like checking the reason string manually and transforming it here if we have it under full control already on generation. Rather just do $self->loginfo("exclude disk '$name' '$volid' ($volume->{reason})"); If you think the reason isn't explaining enough add to it when setting it, but IMO the efi one works OK as is, and the "nobackup" set just could be "backup=no" > + next; > + } elsif ($self->{vm_was_running} && $data->{iothread}) { > if (!PVE::QemuServer::Machine::runs_at_least_qemu_version($vmid, 4, > 0, 1)) { > - die "disk '$ds' '$volid' (iothread=on) can't use backup feature > with running QEMU " . > + die "disk '$name' '$volid' (iothread=on) can't use backup > feature with running QEMU " . > "version < 4.0.1! Either set backup=no for this drive or > upgrade QEMU and restart VM\n"; > } > - } elsif ($ds =~ m/^efidisk/ && (!defined($conf->{bios}) || > $conf->{bios} ne 'ovmf')) { > - $self->loginfo("excluding '$ds' (efidisks can only be backed up > when BIOS is set to 'ovmf')"); > - return; > } else { > - my $log = "include disk '$ds' '$volid'"; > - if (defined $drive->{size}) { > - my $readable_size = > PVE::JSONSchema::format_size($drive->{size}); > + my $log = "include disk '$name' '$volid'"; > + if (defined $size) { as $size is only used here you could avoid it above and do: if (defined(my $size = $vol_cfg->{size})) { just a suggestion. > + my $readable_size = PVE::JSONSchema::format_size($size); > $log .= " $readable_size"; > - } > + } > $self->loginfo($log); > } > > my ($storeid, $volname) = PVE::Storage::parse_volume_id($volid, 1); > push @$vollist, $volid if $storeid; > - $drivehash->{$ds} = $drive; > - }); > + $drivehash->{$name} = $volume->{data}; > + } > > PVE::Storage::activate_volumes($self->{storecfg}, $vollist); > > _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel