[pve-devel] [PATCH pve-storage 4/4] Add support for creating LXC snapshot backup

Michael Rasmussen mir at datanom.net
Thu Jun 15 10:50:45 CEST 2017


Hi Andreas,
Even better, I can sent you the deb packages?

On June 15, 2017 10:20:32 AM GMT+02:00, Andreas Steinel <a.steinel at gmail.com> wrote:
>Hi mir,
>
>have you a public git with all the changes? I'd like to try but I
>don't want to extract all the patches from this list, try to figure
>out which ones are already taken care of and manually apply them.
>
>Best,
>LnxBil
>
>On Wed, Jun 14, 2017 at 9:55 PM, Michael Rasmussen <mir at datanom.net>
>wrote:
>> Signed-off-by: Michael Rasmussen <mir at datanom.net>
>> ---
>>  PVE/Storage/FreeNASPlugin.pm | 129
>+++++++++++++++++++++++++------------------
>>  1 file changed, 74 insertions(+), 55 deletions(-)
>>
>> diff --git a/PVE/Storage/FreeNASPlugin.pm
>b/PVE/Storage/FreeNASPlugin.pm
>> index 0f2a56d..fee3d27 100644
>> --- a/PVE/Storage/FreeNASPlugin.pm
>> +++ b/PVE/Storage/FreeNASPlugin.pm
>> @@ -427,40 +427,38 @@ sub freenas_find_free_diskname {
>>  }
>>
>>  sub freenas_get_lun_number {
>> -    my ($scfg, $volname, $snap) = @_;
>> +    my ($scfg, $volname) = @_;
>>      my $lunid = undef;
>>
>> -    if ($volname =~ /^(vm|base)-\d+-disk-(\d+)$/ && ! defined $snap)
>{
>> +    if ($volname =~ /^(vm|base)-\d+-disk-(\d+)$/) {
>>         $lunid = $2 - 1;
>>      } elsif ($volname =~ /^vm-(\d+)-state/) {
>>         # Find id for temporary LUN
>> -       if ($snap) {
>> -               # TODO
>> -               # Required to be able to exposed read-only LUNs for
>snapshot backup CT
>> -       } else {
>> -               my $target = freenas_get_target($scfg, $1);
>> -               my $id = $max_luns;
>> -                       my $response = freenas_request($scfg, 'GET',
>"services/iscsi/targettoextent?limit=$limit");
>> -                       die HTTP::Status::status_message($response)
>if $response =~ /^\d+$/;
>> -                       my $t2extents = decode_json($response);
>> -
>> -                       foreach my $t2extent (@$t2extents) {
>> -                               next unless $t2extent->{iscsi_target}
>== $target &&
>> -                                                      
>$t2extent->{iscsi_lunid} + 1 > $max_luns &&
>> -                                                      
>$t2extent->{iscsi_lunid} < $max_luns + $active_snaps;
>> -                               my $eid = freenas_get_extent($scfg,
>$volname);
>> -                               if ($eid) {
>> -                                       $response =
>freenas_request($scfg, 'GET', "services/iscsi/extent/$eid");
>> -                                       die
>HTTP::Status::status_message($response) if $response =~ /^\d+$/;
>> -                                       my $extent =
>decode_json($response);
>> -                                       # Request to get lunid for an
>existing lun
>> -                                       last if
>$t2extent->{iscsi_extent} eq $eid;
>> -                               }
>> -                               $id++;
>> +               my $target = freenas_get_target($scfg, $1);
>> +               my $id = $max_luns;
>> +               my $response = freenas_request($scfg, 'GET',
>"services/iscsi/targettoextent?limit=$limit");
>> +               die HTTP::Status::status_message($response) if
>$response =~ /^\d+$/;
>> +               my $t2extents = decode_json($response);
>> +
>> +               foreach my $t2extent (@$t2extents) {
>> +                       next unless $t2extent->{iscsi_target} ==
>$target &&
>> +                                              
>$t2extent->{iscsi_lunid} + 1 > $max_luns &&
>> +                                              
>$t2extent->{iscsi_lunid} < $max_luns + $active_snaps;
>> +                       my $eid = freenas_get_extent($scfg,
>$volname);
>> +                       if ($eid) {
>> +                               $response = freenas_request($scfg,
>'GET', "services/iscsi/extent/$eid");
>> +                               die
>HTTP::Status::status_message($response) if $response =~ /^\d+$/;
>> +                               my $extent = decode_json($response);
>> +                               # Request to get lunid for an
>existing lun
>> +                               last if $t2extent->{iscsi_extent} eq
>$eid;
>>                         }
>> -                       die "Max snapshots (4) is reached" unless
>($id - $max_luns) < $active_snaps;
>> -                       $lunid = $id;
>> -       }
>> +                       $id++;
>> +               }
>> +               die "Max snapshots (4) is reached" unless ($id -
>$max_luns) < $active_snaps;
>> +               $lunid = $id;
>> +    } elsif ($volname =~ /^(vm|base)-\d+-disk-\d+\@vzdump$/) {
>> +        # Required to be able to exposed read-only LUNs for snapshot
>backup CT
>> +        $lunid = $max_luns + $active_snaps;
>>      }
>>
>>      return $lunid;
>> @@ -891,12 +889,13 @@ sub list_images {
>>
>>  sub path {
>>      my ($class, $scfg, $volname, $storeid, $snapname) = @_;
>> -
>> -    die "direct access to snapshots not implemented"
>> -       if defined($snapname);
>> +    #die "direct access to snapshots not implemented"
>> +       #if defined($snapname);
>>
>>      my ($vtype, $vname, $vmid) = $class->parse_volname($volname);
>>
>> +       $vname = "$vname\@$snapname" if $snapname;
>> +
>>         my $luns = get_active_luns($class, $storeid, $scfg, $vname);
>>         my $path = disk_by_path($scfg, $vname);
>>
>> @@ -1116,24 +1115,54 @@ sub volume_resize {
>>
>>  sub volume_snapshot {
>>      my ($class, $scfg, $storeid, $volname, $snap) = @_;
>> -
>> -    my $vname = ($class->parse_volname($volname))[1];
>> -
>> +
>> +       my (undef, $vname, $vmid) = $class->parse_volname($volname);
>> +
>>      my $data = {
>>         dataset => "$scfg->{pool}/$vname",
>>         name => $snap,
>>      };
>> -       my $response = freenas_request($scfg, 'POST',
>"storage/snapshot", encode_json($data));
>> +       my $response = freenas_request($scfg, 'POST',
>"storage/snapshot/", encode_json($data));
>>         die HTTP::Status::status_message($response) if $response =~
>/^\d+$/;
>> +
>> +       if ($snap) {
>> +           eval {
>> +               freenas_create_lun($scfg, $vmid, "$vname\@$snap");
>> +               $class->activate_volume($storeid, $scfg,
>"$vname\@$snap");
>> +           };
>> +           if ($@) {
>> +               die "$@ - unable to activate snapshot from remote
>FreeNAS storage";
>> +           }
>> +    }
>>  }
>>
>>  sub volume_snapshot_delete {
>>      my ($class, $scfg, $storeid, $volname, $snap, $running) = @_;
>>
>> -    my $vname = ($class->parse_volname($volname))[1];
>> -
>> +    my (undef, $vname, $vmid) = $class->parse_volname($volname);
>> +
>> +       if ($snap) {
>> +           eval {
>> +               my $target = freenas_get_target($scfg, $vmid);
>> +               die "volume_snapshot_delete-> missing target" unless
>$target;
>> +               my $extent = freenas_get_extent($scfg,
>"$vname\@$snap");
>> +               die "volume_snapshot_delete-> missing extent" unless
>$extent;
>> +               my $tg2exent = freenas_get_target_to_exent($scfg,
>$extent, $target);
>> +               die "volume_snapshot_delete-> missing target to
>extent" unless $tg2exent;
>> +               my $lun = freenas_get_lun_number($scfg,
>"$vname\@$snap");
>> +               die "volume_snapshot_delete-> missing LUN" unless
>defined $lun;
>> +               freenas_delete_target_to_exent($scfg, $tg2exent);
>> +               freenas_delete_extent($scfg, $extent);
>> +           };
>> +           warn "$@ - unable to deactivate snapshot from remote
>FreeNAS storage" if $@;
>> +       }
>> +
>>      my $response = freenas_request($scfg, 'DELETE',
>"storage/snapshot/$scfg->{pool}/$vname\@$snap");
>>         die HTTP::Status::status_message($response) if $response =~
>/^\d+$/;
>> +
>> +       if ($snap) {
>> +           $class->deactivate_volume($storeid, $scfg,
>"$vname\@$snap");
>> +    }
>>  }
>>
>>  sub volume_snapshot_rollback {
>> @@ -1232,16 +1261,11 @@ sub deactivate_storage {
>>  sub activate_volume {
>>      my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_;
>>
>> -       # TODO: FreeNAS supports exposing a ro LUN from a snapshot
>> -       # ERROR: Backup of VM xyz failed - unable to activate
>snapshot from remote zfs storage
>> -       # at /usr/share/perl5/PVE/Storage/ZFSPlugin.pm line 418.
>> -       # $vname\@$snapname
>> -       die "mode failure - unable to activate snapshot from remote
>zfs storage" if $snapname;
>> -
>> -       my (undef, $name) = $class->parse_volname($volname);
>> +       return if $snapname; # Activated when creating snapshot
>> +
>> +       my $name = ($class->parse_volname($volname))[1];
>>
>>         my $active_luns = get_active_luns($class, $storeid, $scfg,
>$name);
>> -
>>      my $lun = freenas_get_lun_number($scfg, $name);
>>         $active_luns->{$lun} = "0:0:0:$lun";
>>
>> @@ -1266,18 +1290,13 @@ sub activate_volume {
>>  #      deactivate lun
>>  sub deactivate_volume {
>>      my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_;
>> -
>> -       # TODO: FreeNAS supports exposing a ro LUN from a snapshot
>> -       # ERROR: Backup of VM xyz failed - unable to activate
>snapshot from remote zfs storage
>> -       # at /usr/share/perl5/PVE/Storage/ZFSPlugin.pm line 418.
>> -       # $vname\@$snapname
>> -    die "mode failure - unable to deactivate snapshot from remote
>zfs storage" if $snapname;
>> -
>> -       my (undef, $name) = $class->parse_volname($volname);
>> +
>> +    return if $snapname; # Deactivated when deleting snapshot
>> +
>> +    my $name = ($class->parse_volname($volname))[1];
>>
>>         my $active_luns = get_active_luns($class, $storeid, $scfg,
>$name);
>> -
>> -    my $lun = freenas_get_lun_number($scfg, $name);
>> +       my $lun = freenas_get_lun_number($scfg, $name);
>>         delete $active_luns->{$lun};
>>
>>         eval {
>> --
>> 2.1.4
>>
>>
>> ----
>>
>> This mail was virus scanned and spam checked before delivery.
>> This mail is also DKIM signed. See header dkim-signature.
>>
>> _______________________________________________
>> 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

-- 
Sent from my Android phone with K-9 Mail. Please excuse my brevity.


More information about the pve-devel mailing list