From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 481977179B for ; Thu, 9 Sep 2021 14:04:40 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 2CEDD98FA for ; Thu, 9 Sep 2021 14:04:40 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id BE31698DD for ; Thu, 9 Sep 2021 14:04:37 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 7F63B44509; Thu, 9 Sep 2021 14:04:37 +0200 (CEST) To: Lorenz Stechauner , pve-devel@lists.proxmox.com, aderumier@odiso.com References: <20210906131542.178844-1-l.stechauner@proxmox.com> <20210906131542.178844-2-l.stechauner@proxmox.com> <31f9f8d5-e356-65aa-9a9c-301c4d1f68c6@proxmox.com> From: Fabian Ebner Message-ID: Date: Thu, 9 Sep 2021 14:04:35 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: <31f9f8d5-e356-65aa-9a9c-301c4d1f68c6@proxmox.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 1.084 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment NICE_REPLY_A -1.922 Looks like a legit reply (A) SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URI_NOVOWEL 0.5 URI hostname has long non-vowel sequence Subject: Re: [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Sep 2021 12:04:40 -0000 Am 09.09.21 um 13:11 schrieb Lorenz Stechauner: > > On 09.09.21 12:25, Fabian Ebner wrote: >> Am 08.09.21 um 10:11 schrieb alexandre derumier: >>> Hi, >>> it can be done too with ceph rbd with "rbd create ... –thick-provision" >>> >> >> Hi, >> there also is the 'sparse' storage config option (currently only used >> for ZFS plugins). If there is only thick or thin, re-using that one is >> probably nicer, because the newly proposed preallocation option seems >> to be closely tied to qemu-img. > > Sounds like a good idea. I doubt, that anyone would use full > prellocation anyway, so simply using 'sparse' for prealloc=off and > default remains prealloc=metadata sounds good. > I actually only meant re-using 'sparse' for the RBD use case. But yes, it seems like re-using it for the qemu-img use case would be enough to fix the bug too. It might be a bit confusing though, because when sparse is not set, the images would still be mostly sparse (except for metadata). >> >>> Le lundi 06 septembre 2021 à 15:15 +0200, Lorenz Stechauner a écrit : >>>> the plugins for file based storages >>>>   * BTRFS >>>>   * CIFS >>>>   * Dir >>>>   * Glusterfs >>>>   * NFS >>>> now allow the option 'preallocation'. >>>> >>>> 'preallocation' can have four values: >>>>   * default >>>>   * off >>>>   * metadata >>>>   * falloc >>>>   * full >>>> see man pages for `qemu-img` for what these mean exactly. [0] >>>> >>>> the defualt value was chosen to be >>>>   * qcow2: metadata (as previously) >>>>   * raw: off (I was unable to find any documentation on this, so >>>>      could only test this and found, that 'off' was the most >>>>      fitting.) >>>> >>>> when using 'metadata' as preallocation mode, for raw images 'off' >>>> is used. >>>> >>>> [0] >>>> https://qemu.readthedocs.io/en/latest/system/images.html#disk-image-file-formats >>>> >>>> >>>> Signed-off-by: Lorenz Stechauner >>>> --- >>>>   PVE/Storage/BTRFSPlugin.pm     |  1 + >>>>   PVE/Storage/CIFSPlugin.pm      |  1 + >>>>   PVE/Storage/DirPlugin.pm       |  1 + >>>>   PVE/Storage/GlusterfsPlugin.pm |  4 ++- >>>>   PVE/Storage/NFSPlugin.pm       |  1 + >>>>   PVE/Storage/Plugin.pm          | 46 >>>> +++++++++++++++++++++++++++++++++- >>>>   6 files changed, 52 insertions(+), 2 deletions(-) >>>> >>>> diff --git a/PVE/Storage/BTRFSPlugin.pm b/PVE/Storage/BTRFSPlugin.pm >>>> index fe42082..31a2954 100644 >>>> --- a/PVE/Storage/BTRFSPlugin.pm >>>> +++ b/PVE/Storage/BTRFSPlugin.pm >>>> @@ -73,6 +73,7 @@ sub options { >>>>          is_mountpoint => { optional => 1 }, >>>>          nocow => { optional => 1 }, >>>>          mkdir => { optional => 1 }, >>>> +       preallocation => { optional => 1 }, >>>>          # TODO: The new variant of mkdir with  `populate` vs >>>> `create`... >>>>       }; >>>>   } >>>> diff --git a/PVE/Storage/CIFSPlugin.pm b/PVE/Storage/CIFSPlugin.pm >>>> index 0221069..2d94413 100644 >>>> --- a/PVE/Storage/CIFSPlugin.pm >>>> +++ b/PVE/Storage/CIFSPlugin.pm >>>> @@ -140,6 +140,7 @@ sub options { >>>>          smbversion => { optional => 1}, >>>>          mkdir => { optional => 1 }, >>>>          bwlimit => { optional => 1 }, >>>> +       preallocation => { optional => 1 }, >>>>       }; >>>>   } >>>>   diff --git a/PVE/Storage/DirPlugin.pm b/PVE/Storage/DirPlugin.pm >>>> index 2267f11..3eeec98 100644 >>>> --- a/PVE/Storage/DirPlugin.pm >>>> +++ b/PVE/Storage/DirPlugin.pm >>>> @@ -59,6 +59,7 @@ sub options { >>>>          mkdir => { optional => 1 }, >>>>          is_mountpoint => { optional => 1 }, >>>>          bwlimit => { optional => 1 }, >>>> +       preallocation => { optional => 1 }, >>>>      }; >>>>   } >>>>   diff --git a/PVE/Storage/GlusterfsPlugin.pm >>>> b/PVE/Storage/GlusterfsPlugin.pm >>>> index ea4df82..d8d2b88 100644 >>>> --- a/PVE/Storage/GlusterfsPlugin.pm >>>> +++ b/PVE/Storage/GlusterfsPlugin.pm >>>> @@ -137,6 +137,7 @@ sub options { >>>>          format => { optional => 1 }, >>>>          mkdir => { optional => 1 }, >>>>          bwlimit => { optional => 1 }, >>>> +       preallocation => { optional => 1 }, >>>>       }; >>>>   } >>>>   @@ -260,7 +261,8 @@ sub alloc_image { >>>>         my $cmd = ['/usr/bin/qemu-img', 'create']; >>>>   -    push @$cmd, '-o', 'preallocation=metadata' if $fmt eq 'qcow2'; >>>> +    my $prealloc_opt = >>>> PVE::Storage::Plugin::preallocation_cmd_option($scfg, $fmt); >>>> +    push @$cmd, '-o', $prealloc_opt if defined($prealloc_opt); >>>>         push @$cmd, '-f', $fmt, $volumepath, "${size}K"; >>>>   diff --git a/PVE/Storage/NFSPlugin.pm b/PVE/Storage/NFSPlugin.pm >>>> index 39bf15a..21b288a 100644 >>>> --- a/PVE/Storage/NFSPlugin.pm >>>> +++ b/PVE/Storage/NFSPlugin.pm >>>> @@ -90,6 +90,7 @@ sub options { >>>>          format => { optional => 1 }, >>>>          mkdir => { optional => 1 }, >>>>          bwlimit => { optional => 1 }, >>>> +       preallocation => { optional => 1 }, >>>>       }; >>>>   } >>>>   diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm >>>> index b1865cb..4924525 100644 >>>> --- a/PVE/Storage/Plugin.pm >>>> +++ b/PVE/Storage/Plugin.pm >>>> @@ -41,6 +41,19 @@ our @SHARED_STORAGE = ( >>>>       'pbs', >>>>   ); >>>>   +our $QCOW2_PREALLOCATION = { >>>> +    off => 1, >>>> +    metadata => 1, >>>> +    falloc => 1, >>>> +    full => 1, >>>> +}; >>>> + >>>> +our $RAW_PREALLOCATION = { >>>> +    off => 1, >>>> +    falloc => 1, >>>> +    full => 1, >>>> +}; >>>> + >>>>   our $MAX_VOLUMES_PER_GUEST = 1024; >>>>     cfs_register_file ('storage.cfg', >>>> @@ -150,6 +163,11 @@ my $defaultData = { >>>>              type => 'string', format => 'pve-storage-format', >>>>              optional => 1, >>>>          }, >>>> +       preallocation => { >>>> +           description => "Preallocation mode for raw and qcow2 >>>> images.", >>>> +           type => 'string', enum => ['default', 'off', 'metadata', >>>> 'falloc', 'full'], >>>> +           optional => 1, >>>> +       }, >>>>       }, >>>>   }; >>>>   @@ -762,7 +780,8 @@ sub alloc_image { >>>>       } else { >>>>          my $cmd = ['/usr/bin/qemu-img', 'create']; >>>>   -       push @$cmd, '-o', 'preallocation=metadata' if $fmt eq >>>> 'qcow2'; >>>> +       my $prealloc_opt = preallocation_cmd_option($scfg, $fmt); >>>> +       push @$cmd, '-o', $prealloc_opt if defined($prealloc_opt); >>>>            push @$cmd, '-f', $fmt, $path, "${size}K"; >>>>   @@ -1484,4 +1503,29 @@ sub volume_import_formats { >>>>       return (); >>>>   } >>>>   +sub preallocation_cmd_option { >>>> +    my ($scfg, $fmt) = @_; >>>> + >>>> +    my $prealloc = $scfg->{preallocation}; >>>> + >>>> +    $prealloc = undef if $prealloc eq 'default'; >>>> + >>>> +    if ($fmt eq 'qcow2') { >>>> +       $prealloc = $prealloc // 'metadata'; >>>> + >>>> +       die "preallocation mode '$prealloc' not supported by format >>>> '$fmt'\n" if !$QCOW2_PREALLOCATION->{$prealloc}; >>>> + >>>> +       return "preallocation=$prealloc"; >>>> +    } elsif ($fmt eq 'raw') { >>>> +       $prealloc = $prealloc // 'off'; >>>> +       $prealloc = 'off' if $prealloc eq 'metadata'; >>>> + >>>> +       die "preallocation mode '$prealloc' not supported by format >>>> '$fmt'\n" if !$RAW_PREALLOCATION->{$prealloc}; >>>> + >>>> +       return "preallocation=$prealloc"; >>>> +    } >>>> + >>>> +    return undef; >>>> +} >>>> + >>>>   1; >>> >>> _______________________________________________ >>> pve-devel mailing list >>> pve-devel@lists.proxmox.com >>> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel >>>