refactor finding of vmstate storage

we need that on another place, so refactor in its own sub

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2019-12-09 15:26:58 +01:00 committed by Thomas Lamprecht
parent c3ddb94dc0
commit 66cebc4671
2 changed files with 27 additions and 15 deletions

View File

@ -133,23 +133,11 @@ sub get_replicatable_volumes {
sub __snapshot_save_vmstate { sub __snapshot_save_vmstate {
my ($class, $vmid, $conf, $snapname, $storecfg, $statestorage, $suspend) = @_; my ($class, $vmid, $conf, $snapname, $storecfg, $statestorage, $suspend) = @_;
# first, use explicitly configured storage # use given storage or search for one from the config
# either directly via API, or via conf my $target = $statestorage;
my $target = $statestorage // $conf->{vmstatestorage};
if (!$target) { if (!$target) {
my ($shared, $local); $target = PVE::QemuServer::find_vmstate_storage($conf, $storecfg);
PVE::QemuServer::foreach_storage_used_by_vm($conf, sub {
my ($sid) = @_;
my $scfg = PVE::Storage::storage_config($storecfg, $sid);
my $dst = $scfg->{shared} ? \$shared : \$local;
$$dst = $sid if !$$dst || $scfg->{path}; # prefer file based storage
});
# second, use shared storage where VM has at least one disk
# third, use local storage where VM has at least one disk
# fall back to local storage
$target = $shared // $local // 'local';
} }
my $defaults = PVE::QemuServer::load_defaults(); my $defaults = PVE::QemuServer::load_defaults();

View File

@ -7210,6 +7210,30 @@ sub resolve_first_disk {
return $firstdisk; return $firstdisk;
} }
# NOTE: if this logic changes, please update docs & possibly gui logic
sub find_vmstate_storage {
my ($conf, $storecfg) = @_;
# first, return storage from conf if set
return $conf->{vmstatestorage} if $conf->{vmstatestorage};
my ($target, $shared, $local);
foreach_storage_used_by_vm($conf, sub {
my ($sid) = @_;
my $scfg = PVE::Storage::storage_config($storecfg, $sid);
my $dst = $scfg->{shared} ? \$shared : \$local;
$$dst = $sid if !$$dst || $scfg->{path}; # prefer file based storage
});
# second, use shared storage where VM has at least one disk
# third, use local storage where VM has at least one disk
# fall back to local storage
$target = $shared // $local // 'local';
return $target;
}
sub generate_uuid { sub generate_uuid {
my ($uuid, $uuid_str); my ($uuid, $uuid_str);
UUID::generate($uuid); UUID::generate($uuid);