* [pve-devel] [PATCH-SERIES storage/manager] fix #3580: make preallocation mode selectable for qcow2 and raw images
@ 2021-09-06 13:15 Lorenz Stechauner
2021-09-06 13:15 ` [pve-devel] [PATCH storage 1/1] fix #3580: plugins: " Lorenz Stechauner
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Lorenz Stechauner @ 2021-09-06 13:15 UTC (permalink / raw)
To: pve-devel
this series allows users to configure the `qemu-img` preallocation
mode per storage. this only applies to file-based storages and the
file types 'qcow2' and 'raw'.
pve-storage:
Lorenz Stechauner (1):
fix #3580: plugins: make preallocation mode selectable for qcow2 and
raw images
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(-)
pve-manager:
Lorenz Stechauner (2):
ui: add PreallocationSelector
fix 3850: ui: storage: using PreallocationSelector for file based
storage types
www/manager6/Makefile | 1 +
www/manager6/controller/StorageEdit.js | 6 ++++++
www/manager6/form/PreallocationSelector.js | 14 ++++++++++++++
www/manager6/storage/Base.js | 18 ++++++++++++++++++
4 files changed, 39 insertions(+)
create mode 100644 www/manager6/form/PreallocationSelector.js
--
2.30.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
2021-09-06 13:15 [pve-devel] [PATCH-SERIES storage/manager] fix #3580: make preallocation mode selectable for qcow2 and raw images Lorenz Stechauner
@ 2021-09-06 13:15 ` Lorenz Stechauner
2021-09-08 8:11 ` alexandre derumier
2021-09-14 9:44 ` Fabian Ebner
2021-09-06 13:15 ` [pve-devel] [PATCH manager 1/2] ui: add PreallocationSelector Lorenz Stechauner
2021-09-06 13:15 ` [pve-devel] [PATCH manager 2/2] fix 3850: ui: storage: using PreallocationSelector for file based storage types Lorenz Stechauner
2 siblings, 2 replies; 12+ messages in thread
From: Lorenz Stechauner @ 2021-09-06 13:15 UTC (permalink / raw)
To: pve-devel
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 <l.stechauner@proxmox.com>
---
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;
--
2.30.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [pve-devel] [PATCH manager 1/2] ui: add PreallocationSelector
2021-09-06 13:15 [pve-devel] [PATCH-SERIES storage/manager] fix #3580: make preallocation mode selectable for qcow2 and raw images Lorenz Stechauner
2021-09-06 13:15 ` [pve-devel] [PATCH storage 1/1] fix #3580: plugins: " Lorenz Stechauner
@ 2021-09-06 13:15 ` Lorenz Stechauner
2021-09-06 13:15 ` [pve-devel] [PATCH manager 2/2] fix 3850: ui: storage: using PreallocationSelector for file based storage types Lorenz Stechauner
2 siblings, 0 replies; 12+ messages in thread
From: Lorenz Stechauner @ 2021-09-06 13:15 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Lorenz Stechauner <l.stechauner@proxmox.com>
---
www/manager6/Makefile | 1 +
www/manager6/form/PreallocationSelector.js | 14 ++++++++++++++
2 files changed, 15 insertions(+)
create mode 100644 www/manager6/form/PreallocationSelector.js
diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 75d355a5..f60fad06 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -49,6 +49,7 @@ JSSRC= \
form/PCISelector.js \
form/PermPathSelector.js \
form/PoolSelector.js \
+ form/PreallocationSelector.js \
form/PrivilegesSelector.js \
form/QemuBiosSelector.js \
form/SDNControllerSelector.js \
diff --git a/www/manager6/form/PreallocationSelector.js b/www/manager6/form/PreallocationSelector.js
new file mode 100644
index 00000000..0a58ee87
--- /dev/null
+++ b/www/manager6/form/PreallocationSelector.js
@@ -0,0 +1,14 @@
+Ext.define('PVE.form.preallocationSelector', {
+ extend: 'Proxmox.form.KVComboBox',
+ alias: ['widget.pvePreallocationSelector'],
+ config: {
+ deleteEmpty: false,
+ },
+ comboItems: [
+ ['default', 'Default'],
+ ['off', 'Off'],
+ ['metadata', 'Metadata'],
+ ['falloc', 'Full (posix_fallocate)'],
+ ['full', 'Full'],
+ ],
+});
--
2.30.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [pve-devel] [PATCH manager 2/2] fix 3850: ui: storage: using PreallocationSelector for file based storage types
2021-09-06 13:15 [pve-devel] [PATCH-SERIES storage/manager] fix #3580: make preallocation mode selectable for qcow2 and raw images Lorenz Stechauner
2021-09-06 13:15 ` [pve-devel] [PATCH storage 1/1] fix #3580: plugins: " Lorenz Stechauner
2021-09-06 13:15 ` [pve-devel] [PATCH manager 1/2] ui: add PreallocationSelector Lorenz Stechauner
@ 2021-09-06 13:15 ` Lorenz Stechauner
2021-09-14 9:55 ` Fabian Ebner
2 siblings, 1 reply; 12+ messages in thread
From: Lorenz Stechauner @ 2021-09-06 13:15 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Lorenz Stechauner <l.stechauner@proxmox.com>
---
www/manager6/controller/StorageEdit.js | 6 ++++++
www/manager6/storage/Base.js | 18 ++++++++++++++++++
2 files changed, 24 insertions(+)
diff --git a/www/manager6/controller/StorageEdit.js b/www/manager6/controller/StorageEdit.js
index 4246d363..cb73b776 100644
--- a/www/manager6/controller/StorageEdit.js
+++ b/www/manager6/controller/StorageEdit.js
@@ -4,6 +4,12 @@ Ext.define('PVE.controller.StorageEdit', {
control: {
'field[name=content]': {
change: function(field, value) {
+ const hasImages = Ext.Array.contains(value, 'images');
+ const prealloc = field.up('form').getForm().findField('preallocation');
+ if (prealloc) {
+ prealloc.setDisabled(!hasImages);
+ }
+
var hasBackups = Ext.Array.contains(value, 'backup');
var maxfiles = this.lookupReference('maxfiles');
if (!maxfiles) {
diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
index ee8b54e8..457576a3 100644
--- a/www/manager6/storage/Base.js
+++ b/www/manager6/storage/Base.js
@@ -51,6 +51,24 @@ Ext.define('PVE.panel.StorageBase', {
},
);
+ const fileBasedStorageTypes = ['dir', 'btrfs', 'nfs', 'cifs', 'glusterfs'];
+
+ if (fileBasedStorageTypes.includes(me.type)) {
+ const preallocSelector = {
+ xtype: 'pvePreallocationSelector',
+ name: 'preallocation',
+ fieldLabel: gettext('Preallocation'),
+ allowBlank: false,
+ value: 'default',
+ };
+
+ // ensures, that the PreallocationSelector is always on the left side
+ if (me.advancedColumn1) {
+ me.advancedColumn2 = me.advancedColumn1;
+ }
+ me.advancedColumn1 = [preallocSelector];
+ }
+
me.callParent();
},
});
--
2.30.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
2021-09-06 13:15 ` [pve-devel] [PATCH storage 1/1] fix #3580: plugins: " Lorenz Stechauner
@ 2021-09-08 8:11 ` alexandre derumier
2021-09-09 10:25 ` Fabian Ebner
2021-09-14 9:44 ` Fabian Ebner
1 sibling, 1 reply; 12+ messages in thread
From: alexandre derumier @ 2021-09-08 8:11 UTC (permalink / raw)
To: Proxmox VE development discussion
Hi,
it can be done too with ceph rbd with "rbd create ... –thick-provision"
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 <l.stechauner@proxmox.com>
> ---
> 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;
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
2021-09-08 8:11 ` alexandre derumier
@ 2021-09-09 10:25 ` Fabian Ebner
2021-09-09 11:11 ` Lorenz Stechauner
0 siblings, 1 reply; 12+ messages in thread
From: Fabian Ebner @ 2021-09-09 10:25 UTC (permalink / raw)
To: pve-devel, aderumier, Lorenz Stechauner
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.
> 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 <l.stechauner@proxmox.com>
>> ---
>> 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
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
2021-09-09 10:25 ` Fabian Ebner
@ 2021-09-09 11:11 ` Lorenz Stechauner
2021-09-09 12:04 ` Fabian Ebner
0 siblings, 1 reply; 12+ messages in thread
From: Lorenz Stechauner @ 2021-09-09 11:11 UTC (permalink / raw)
To: Fabian Ebner, pve-devel, aderumier
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.
>
>> 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 <l.stechauner@proxmox.com>
>>> ---
>>> 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
>>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
2021-09-09 11:11 ` Lorenz Stechauner
@ 2021-09-09 12:04 ` Fabian Ebner
2021-09-09 12:26 ` Lorenz Stechauner
2021-09-09 12:28 ` Thomas Lamprecht
0 siblings, 2 replies; 12+ messages in thread
From: Fabian Ebner @ 2021-09-09 12:04 UTC (permalink / raw)
To: Lorenz Stechauner, pve-devel, aderumier
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 <l.stechauner@proxmox.com>
>>>> ---
>>>> 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
>>>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
2021-09-09 12:04 ` Fabian Ebner
@ 2021-09-09 12:26 ` Lorenz Stechauner
2021-09-09 12:28 ` Thomas Lamprecht
1 sibling, 0 replies; 12+ messages in thread
From: Lorenz Stechauner @ 2021-09-09 12:26 UTC (permalink / raw)
To: Fabian Ebner, pve-devel, aderumier
On 09.09.21 14:04, Fabian Ebner wrote:
> 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).
makes sense, I got a bit confused by the rbd stuff. Then I won't update
the patch to use 'sparse' :)
>
>>>
>>>> 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 <l.stechauner@proxmox.com>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
2021-09-09 12:04 ` Fabian Ebner
2021-09-09 12:26 ` Lorenz Stechauner
@ 2021-09-09 12:28 ` Thomas Lamprecht
1 sibling, 0 replies; 12+ messages in thread
From: Thomas Lamprecht @ 2021-09-09 12:28 UTC (permalink / raw)
To: Proxmox VE development discussion, Fabian Ebner,
Lorenz Stechauner, aderumier
On 09.09.21 14:04, Fabian Ebner wrote:
> 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).
Yeah, I'm not sure that just deriving all from the sparse storage option would
be good UX - I think it should be per creation and if we want to expand the scope
of such a value we should rather see it as fallback.
But IMO this is a bit of an edge case anyway, so I'd not rush the latter without
user demand.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [pve-devel] [PATCH storage 1/1] fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images
2021-09-06 13:15 ` [pve-devel] [PATCH storage 1/1] fix #3580: plugins: " Lorenz Stechauner
2021-09-08 8:11 ` alexandre derumier
@ 2021-09-14 9:44 ` Fabian Ebner
1 sibling, 0 replies; 12+ messages in thread
From: Fabian Ebner @ 2021-09-14 9:44 UTC (permalink / raw)
To: pve-devel, Lorenz Stechauner
Am 06.09.21 um 15:15 schrieb Lorenz Stechauner:
> 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 <l.stechauner@proxmox.com>
> ---
> 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,
It might be worth to mention that 'metadata' for raw means 'off' in the
description.
Any reason for an explicit 'default' rather then having 'option not set
at all' be the default? You could also write
default => 'metadata',
as part of the option's properties.
> + },
> },
> };
>
> @@ -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 {
I suppose this function should not be part of the Plugin API, so it
should either be above the
# Storage implementation
comment or made into a private helper using
my $preallocation_cmd_option = sub
> + my ($scfg, $fmt) = @_;
> +
> + my $prealloc = $scfg->{preallocation};
> +
> + $prealloc = undef if $prealloc eq 'default';
Will lead to a warning when $prealloc is already undef:
Use of uninitialized value $prealloc in string eq
> +
> + if ($fmt eq 'qcow2') {
> + $prealloc = $prealloc // 'metadata';
> +
> + die "preallocation mode '$prealloc' not supported by format '$fmt'\n" if !$QCOW2_PREALLOCATION->{$prealloc};
Style nit: line too long
Nit: I'm wondering if the check is worth it. It should not be possible
to trigger with the current implementation, and even if there were a bad
value and no check here, qemu-img would still complain afterwards. But
I'm also fine with the check.
> +
> + 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};
Same here.
> +
> + return "preallocation=$prealloc";
> + }
> +
> + return undef;
Nit: 'return;' should be preferred over 'return undef;' (behaves
differently when called in list context).
> +}
> +
> 1;
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [pve-devel] [PATCH manager 2/2] fix 3850: ui: storage: using PreallocationSelector for file based storage types
2021-09-06 13:15 ` [pve-devel] [PATCH manager 2/2] fix 3850: ui: storage: using PreallocationSelector for file based storage types Lorenz Stechauner
@ 2021-09-14 9:55 ` Fabian Ebner
0 siblings, 0 replies; 12+ messages in thread
From: Fabian Ebner @ 2021-09-14 9:55 UTC (permalink / raw)
To: pve-devel, Lorenz Stechauner
Am 06.09.21 um 15:15 schrieb Lorenz Stechauner:
> Signed-off-by: Lorenz Stechauner <l.stechauner@proxmox.com>
> ---
> www/manager6/controller/StorageEdit.js | 6 ++++++
> www/manager6/storage/Base.js | 18 ++++++++++++++++++
> 2 files changed, 24 insertions(+)
>
> diff --git a/www/manager6/controller/StorageEdit.js b/www/manager6/controller/StorageEdit.js
> index 4246d363..cb73b776 100644
> --- a/www/manager6/controller/StorageEdit.js
> +++ b/www/manager6/controller/StorageEdit.js
> @@ -4,6 +4,12 @@ Ext.define('PVE.controller.StorageEdit', {
> control: {
> 'field[name=content]': {
> change: function(field, value) {
> + const hasImages = Ext.Array.contains(value, 'images');
> + const prealloc = field.up('form').getForm().findField('preallocation');
> + if (prealloc) {
> + prealloc.setDisabled(!hasImages);
> + }
> +
> var hasBackups = Ext.Array.contains(value, 'backup');
> var maxfiles = this.lookupReference('maxfiles');
> if (!maxfiles) {
> diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
> index ee8b54e8..457576a3 100644
> --- a/www/manager6/storage/Base.js
> +++ b/www/manager6/storage/Base.js
> @@ -51,6 +51,24 @@ Ext.define('PVE.panel.StorageBase', {
> },
> );
>
> + const fileBasedStorageTypes = ['dir', 'btrfs', 'nfs', 'cifs', 'glusterfs'];
Nit: CephFS is also file-based. What about using qemuImgStorageTypes or
if (['dir',...].includes(me.type)) directly?
> +
> + if (fileBasedStorageTypes.includes(me.type)) {
> + const preallocSelector = {
> + xtype: 'pvePreallocationSelector',
> + name: 'preallocation',
> + fieldLabel: gettext('Preallocation'),
> + allowBlank: false,
> + value: 'default',
> + };
> +
> + // ensures, that the PreallocationSelector is always on the left side
> + if (me.advancedColumn1) {
> + me.advancedColumn2 = me.advancedColumn1;
Why does it need to be on the left side? What if there already is an
advancedColumn2?
> + }
> + me.advancedColumn1 = [preallocSelector];
> + }
> +
> me.callParent();
> },
> });
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2021-09-14 9:55 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-06 13:15 [pve-devel] [PATCH-SERIES storage/manager] fix #3580: make preallocation mode selectable for qcow2 and raw images Lorenz Stechauner
2021-09-06 13:15 ` [pve-devel] [PATCH storage 1/1] fix #3580: plugins: " Lorenz Stechauner
2021-09-08 8:11 ` alexandre derumier
2021-09-09 10:25 ` Fabian Ebner
2021-09-09 11:11 ` Lorenz Stechauner
2021-09-09 12:04 ` Fabian Ebner
2021-09-09 12:26 ` Lorenz Stechauner
2021-09-09 12:28 ` Thomas Lamprecht
2021-09-14 9:44 ` Fabian Ebner
2021-09-06 13:15 ` [pve-devel] [PATCH manager 1/2] ui: add PreallocationSelector Lorenz Stechauner
2021-09-06 13:15 ` [pve-devel] [PATCH manager 2/2] fix 3850: ui: storage: using PreallocationSelector for file based storage types Lorenz Stechauner
2021-09-14 9:55 ` Fabian Ebner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox