[pve-devel] [PATCH pve-container v2] Make volume create and mount code independent of storage plugin types

Wolfgang Bumiller w.bumiller at proxmox.com
Mon Sep 26 16:02:50 CEST 2016


The behavior seems fine at a first look.

On Mon, Sep 19, 2016 at 01:57:17PM +0300, Dmitry Petuhov wrote:
> Instead, rely on plugin-defined supported formats to decide if it
> supports subvols.
> 
> Signed-off-by: Dmitry Petuhov <mityapetuhov at gmail.com>
> ---
> Still workaround 'rbd' plugin, that cannot be used for LXC without
> krbd. Maybe better way is to pass $scfg into plugin's plugindata()
> in storage code? So plugin could show instance's capabilities
> instead of whole plugin's capabilities, that may or may not be available
> in instance.

I doubt there are many storages with such special cases. The general
decision to make here is whether there's a way to get a mountable
path/device here (iow. whether we can "use" the storage without special
tools), which could be an option at some point if we need one.

> 
> Also workaround special-case 'rbdpool' storage, where we allways want to
> use subvols with LXC. Maybe signal that plugin wants such behaviour via
> plugindata() too? Like set default format to subvol instead of raw in
> zfspool?

Adding an option to the plugindata might be a good idea, however not via
the default format. The current "default" format is somewhat misleading
considering at this point we have what looks at first like a preference
depending on usage: VM => zvol, CT => subvol. The same with btrfs, btw.

The distinction as far as I can tell really only comes from the fact
that we cannot use quotas on directory-storage backed "subvolumes",
hence the size=0 special case.
With that in mind, I think that all our cases would be covered if we
could check whether subvolumes can have a size.

The code would then work almost the same as your patch here, but could
then be ordered in a somewhat more obvious way:
  if size=0: use a subvol or error if subvols aren't supported
  else if subvols are supported and support sizes: use a subvol
  else: use the default format
This way the intention is clear: size=0 images make no sense, subvolumes
are preferred, and otherwise the storage-specified default is used.

Maybe plugindata could have a 'subvol' key with a list of properties?
{
	...
	subvol => { size => 1 }
}

Or we make use of the fact that the format is a hash and change the '1'
to a feature list or bitfield or something... but I think a separate
hash like above is the most straightforward way.

> 
>  src/PVE/LXC.pm | 45 +++++++++++++++------------------------------
>  1 file changed, 15 insertions(+), 30 deletions(-)
> 
> diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
> index 35ce796..70d3b50 100644
> --- a/src/PVE/LXC.pm
> +++ b/src/PVE/LXC.pm
> @@ -1238,12 +1238,9 @@ sub mountpoint_mount {
>  	    if ($scfg->{path}) {
>  		$mounted_dev = run_with_loopdev($domount, $path);
>  		$use_loopdev = 1;
> -	    } elsif ($scfg->{type} eq 'drbd' || $scfg->{type} eq 'lvm' ||
> -		     $scfg->{type} eq 'rbd' || $scfg->{type} eq 'lvmthin') {
> +	    } else {
>  		$mounted_dev = $path;
>  		&$domount($path);
> -	    } else {
> -		die "unsupported storage type '$scfg->{type}'\n";
>  	    }
>  	    return wantarray ? ($path, $use_loopdev, $mounted_dev) : $path;
>  	} else {
> @@ -1331,43 +1328,31 @@ sub create_disks {
>  		my $size_kb = int(${size_gb}*1024) * 1024;
>  
>  		my $scfg = PVE::Storage::storage_config($storecfg, $storage);
> +		die "krbd option must be enabled on storage type 'rbd'\n" if ($scfg->{type} eq 'rbd') && !$scfg->{krbd};
>  		# fixme: use better naming ct-$vmid-disk-X.raw?
>  
> -		if ($scfg->{type} eq 'dir' || $scfg->{type} eq 'nfs') {
> -		    if ($size_kb > 0) {
> -			$volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw',
> -							   undef, $size_kb);
> -			format_disk($storecfg, $volid, $rootuid, $rootgid);
> -		    } else {
> +		if ($size_kb > 0 && $scfg->{type} ne 'zfspool') {
> +		    $volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw',
> +						       undef, $size_kb);
> +		    format_disk($storecfg, $volid, $rootuid, $rootgid);
> +		} else {
> +		    my (undef, $valid_formats) = PVE::Storage::storage_default_format($storecfg, $storage);
> +		    if (grep { $_ eq 'subvol' } @$valid_formats) {
>  			$volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'subvol',
> -							   undef, 0);
> +							   undef, $size_kb);
>  			push @$chown_vollist, $volid;
> +		    } else {
> +			die "Selected storage does not support subvols. Please, specify image size or select another storage";
>  		    }
> -		} elsif ($scfg->{type} eq 'zfspool') {
> -
> -		    $volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'subvol',
> -					               undef, $size_kb);
> -		    push @$chown_vollist, $volid;
> -		} elsif ($scfg->{type} eq 'drbd' || $scfg->{type} eq 'lvm' || $scfg->{type} eq 'lvmthin') {
> -
> -		    $volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw', undef, $size_kb);
> -		    format_disk($storecfg, $volid, $rootuid, $rootgid);
> -
> -		} elsif ($scfg->{type} eq 'rbd') {
> -
> -		    die "krbd option must be enabled on storage type '$scfg->{type}'\n" if !$scfg->{krbd};
> -		    $volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw', undef, $size_kb);
> -		    format_disk($storecfg, $volid, $rootuid, $rootgid);
> -		} else {
> -		    die "unable to create containers on storage type '$scfg->{type}'\n";
>  		}
> +
>  		push @$vollist, $volid;
>  		$mountpoint->{volume} = $volid;
>  		$mountpoint->{size} = $size_kb * 1024;
>  		$conf->{$ms} = PVE::LXC::Config->print_ct_mountpoint($mountpoint, $ms eq 'rootfs');
>  	    } else {
> -                # use specified/existing volid/dir/device
> -                $conf->{$ms} = PVE::LXC::Config->print_ct_mountpoint($mountpoint, $ms eq 'rootfs');
> +		# use specified/existing volid/dir/device
> +		$conf->{$ms} = PVE::LXC::Config->print_ct_mountpoint($mountpoint, $ms eq 'rootfs');
>  	    }
>  	});
>  
> -- 
> 2.1.4
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



More information about the pve-devel mailing list