fix #6845: make regexes in zvol deletion retry logic less restrictive

As reported by a storage plugin developer in our community [0], some
plugins might not throw an exception in the exact format we expect. In
particular, this also applies to the built-in ZFS over iSCSI plugin.

In that plugin, if `$method` is not a "LUN command" [2], `zfs`
subcommands (or `zpool list`) [1] are executed over SSH. In the case
of image deletion, the command executed on the remote is always `zfs
destroy -r [...]`.

Therefore, match against "dataset is busy" / "dataset does not exist"
directly.

Tested this with an LIO iSCSI provider set up in a Debian Trixie VM,
as well as with the "legacy" proxmox-truenas plugin of the
community [3] (the one that patches our existing sources), by
migrating a VM's disk back and forth between the two ZFS-over-iSCSI
storages, and also to others and back again.

[0]: https://lore.proxmox.com/pve-devel/mailman.271.1758597756.390.pve-devel@lists.proxmox.com/
[1]: https://git.proxmox.com/?p=pve-storage.git;a=blob;f=src/PVE/Storage/ZFSPlugin.pm;h=99d8c8f43a27ae911ffd09c3aa9f25f1a8857015;hb=refs/heads/master#l84
[2]: https://git.proxmox.com/?p=pve-storage.git;a=blob;f=src/PVE/Storage/ZFSPlugin.pm;h=99d8c8f43a27ae911ffd09c3aa9f25f1a8857015;hb=refs/heads/master#l22
[3]: https://github.com/boomshankerx/proxmox-truenas

Fixes: #6845
Signed-off-by: Max R. Carrara <m.carrara@proxmox.com>
Link: https://lore.proxmox.com/20250925160721.445256-1-m.carrara@proxmox.com
[FE: explicitly mention ZFS over iSCSI plugin in commit message]
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
This commit is contained in:
Max R. Carrara
2025-09-25 18:07:19 +02:00
committed by Fiona Ebner
parent 9eb914de16
commit 6e5a42052c

View File

@ -368,9 +368,9 @@ sub zfs_delete_zvol {
eval { $class->zfs_request($scfg, undef, 'destroy', '-r', "$scfg->{pool}/$zvol"); }; eval { $class->zfs_request($scfg, undef, 'destroy', '-r', "$scfg->{pool}/$zvol"); };
if ($err = $@) { if ($err = $@) {
if ($err =~ m/^zfs error:(.*): dataset is busy.*/) { if ($err =~ m/dataset is busy/) {
sleep(1); sleep(1);
} elsif ($err =~ m/^zfs error:.*: dataset does not exist.*$/) { } elsif ($err =~ m/dataset does not exist/) {
$err = undef; $err = undef;
last; last;
} else { } else {