[pve-devel] applied: [PatchV2 storage 1/2] fix #1691: replace udev check
Thomas Lamprecht
t.lamprecht at proxmox.com
Mon May 7 12:21:09 CEST 2018
Am 04/19/2018 um 08:39 AM schrieb Wolfgang Link:
> `zfs create` add the creation job in a worker queue,
> which should normally execute instantly. But there are circumstances
> where the job will take a while to get processed.
> If this is the case udev settle will see no dev in the queue and the program
> will continue without an allocated dev.
>
> The busy waiting is not best practice but the only way to be sure,
> that the block device exists.
> ---
> PVE/Storage/ZFSPoolPlugin.pm | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm
> index e864a58..9680a94 100644
> --- a/PVE/Storage/ZFSPoolPlugin.pm
> +++ b/PVE/Storage/ZFSPoolPlugin.pm
> @@ -211,9 +211,14 @@ sub alloc_image {
> $class->zfs_create_zvol($scfg, $volname, $size);
> my $devname = "/dev/zvol/$scfg->{pool}/$volname";
>
> - run_command("udevadm trigger --subsystem-match block");
> - system('udevadm', 'settle', '--timeout', '10', "--exit-if-exists=${devname}");
> + my $timeout = 10;
> + for (my $i = 1; $i <= $timeout; $i++) {
> + last if -b $devname;
> + die "Timeout: no zvol after $timeout sec found.\n"
> + if $i == $timeout;
>
> + sleep(1);
note: this isn't interrupt safe and may actually sleep less
as we have quite a few such constructs in our code base it
could make sense to add a helper doing this correctly to PVE::Tools
and replace the various, often not ideal, implementations of this...
> + }
> } elsif ( $fmt eq 'subvol') {
>
> die "illegal name '$volname' - sould be 'subvol-$vmid-*'\n"
>
applied both storage patches, will try to address the note above soon :)
More information about the pve-devel
mailing list