[pve-devel] [PATCH v3 qemu-server] vzdump: move include logic for volumes to method
Aaron Lauterer
a.lauterer at proxmox.com
Thu Mar 26 10:52:09 CET 2020
Thx for the info :)
On 3/24/20 10:16 AM, Fabian Ebner wrote:
> On 17.03.20 15:34, Fabian Grünbichler wrote:
>> On March 16, 2020 4:44 pm, Aaron Lauterer wrote:
>>> 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.lauterer at proxmox.com>
>>> ---
>>>
>>> v2 -> v3: rebased
>>>
>>> v1 -> v2:
>>> * implemented the suggestions from Fabian [0]
>>> * incorporated changes that happened in the meantime, most notably the
>>> check for efidisk without omvf bios set
>>>
>>> I decided to keep the check for IOThreaded VMs where it is because it
>>> will only trigger if the backup is run with an older qemu version. By
>>> the time this patch series gets applied and shipped I think it unlikely
>>> that this will actually be triggered anymore.
>>>
>>> There also seems to be a problem with the way the IFs are nested in that
>>> section. I sent in separate small patch to fix it [1]. I wasn't sure if
>>> I should have implemented that patch here as well. Depending on which
>>> patch gets applied first, the other will need some rebasing.
>>>
>>> [0] https://pve.proxmox.com/pipermail/pve-devel/2020-January/041360.html
>>> [1]
>>> https://pve.proxmox.com/pipermail/pve-devel/2020-February/041968.html
>>>
>>> PVE/QemuConfig.pm | 31 +++++++++++++++++++++++++++++++
>>> PVE/VZDump/QemuServer.pm | 38 +++++++++++++++++++-------------------
>>> 2 files changed, 50 insertions(+), 19 deletions(-)
>>>
>>> diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
>>> index 1ba728a..f5b737c 100644
>>> --- a/PVE/QemuConfig.pm
>>> +++ b/PVE/QemuConfig.pm
>>> @@ -130,6 +130,37 @@ sub get_replicatable_volumes {
>>> return $volhash;
>>> }
>>> +sub get_backup_volumes {
>>> + my ($class, $conf) = @_;
>>> +
>>> + my $ret_volumes = [];
>>> +
>>> + my $test_volume = sub {
>>> + my ($key, $drive) = @_;
>>> +
>>> + return if PVE::QemuServer::drive_is_cdrom($drive);
>>> +
>>> + my $volume = {};
>>> + 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";
>>> + }
>>> + $volume->{key} = $key;
>>> + $volume->{included} = $included;
>>> + $volume->{reason} = $reason;
>>> + $volume->{data} = $drive;
>>> +
>>> + push @$ret_volumes, $volume;
>>> + };
>>> +
>>> + PVE::QemuServer::foreach_drive($conf, $test_volume);
>>
>> nit: this is in PVE::QemuServer::Drive now, and we don't want to add new
>> dependencies from QemuConfig to QemuServer.
>>
>
> Once it's available, the new abstract foreach_volume (will be part of
> QemuConfig.pm via AbstractConfig.pm) can also be used here. I'll send
> the next version of the series[0] later this week and hopefully it's in
> good enough shape to be applied.
>
> [0]: https://pve.proxmox.com/pipermail/pve-devel/2020-March/042324.html
>
>
>>> +
>>> + return $ret_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 7695ad6..38471de 100644
>>> --- a/PVE/VZDump/QemuServer.pm
>>> +++ b/PVE/VZDump/QemuServer.pm
>>> @@ -69,37 +69,37 @@ sub prepare {
>>> my $vollist = [];
>>> my $drivehash = {};
>>> - PVE::QemuServer::foreach_drive($conf, sub {
>>> - my ($ds, $drive) = @_;
>>> + my $backup_included = PVE::QemuConfig->get_backup_volumes($conf);
>>> - return if PVE::QemuServer::drive_is_cdrom($drive);
>>> + foreach my $volume(@{$backup_included}) {
>>> + my $volid = $volume->{data}->{file};
>>> + my $name = $volume->{key};
>>> - 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}) {
>>> + 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)");
>>> + next;
>>> + } elsif ($self->{vm_was_running} && $volume->{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 $volume->{data}->{size}) {
>>> + my $readable_size =
>>> PVE::JSONSchema::format_size($volume->{data}->{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);
>>> --
>>> 2.20.1
>>>
>>>
>>> _______________________________________________
>>> pve-devel mailing list
>>> pve-devel at pve.proxmox.com
>>> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>>>
>>>
>>
>> _______________________________________________
>> pve-devel mailing list
>> pve-devel at pve.proxmox.com
>> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>>
More information about the pve-devel
mailing list