[pve-devel] [PATCH qemu-server 7/8] vm_start: split NBD disk allocation further
Fabian Grünbichler
f.gruenbichler at proxmox.com
Mon Mar 30 13:41:35 CEST 2020
into one sub that retrieves the local disks, and the actual NBD
allocation. that way, remote incoming migration can just call the NBD
allocation with a custom list of volume names/storages/..
Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
---
PVE/QemuServer.pm | 52 +++++++++++++++++++++++++++++++----------------
1 file changed, 35 insertions(+), 17 deletions(-)
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index cd534f4..f4d50e7 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -4732,8 +4732,8 @@ sub vmconfig_update_disk {
}
# called in locked context by incoming migration
-sub vm_migrate_alloc_nbd_disks {
- my ($storecfg, $vmid, $conf, $storagemap, $replicated_volumes) = @_;
+sub vm_migrate_get_nbd_disks {
+ my ($storecfg, $conf, $replicated_volumes) = @_;
my $local_volumes = {};
foreach_drive($conf, sub {
@@ -4749,21 +4749,30 @@ sub vm_migrate_alloc_nbd_disks {
my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
return if $scfg->{shared};
- $local_volumes->{$ds} = [$volid, $storeid, $volname];
+
+ # replicated disks re-use existing state via bitmap
+ my $use_existing = $replicated_volumes->{$volid} ? 1 : 0;
+ $local_volumes->{$ds} = [$volid, $storeid, $volname, $drive, $use_existing];
});
+ return $local_volumes;
+}
+
+# called in locked context by incoming migration
+sub vm_migrate_alloc_nbd_disks {
+ my ($storecfg, $vmid, $source_volumes, $storagemap) = @_;
my $format = undef;
my $nbd = {};
- foreach my $opt (sort keys %$local_volumes) {
- my ($volid, $storeid, $volname) = @{$local_volumes->{$opt}};
- if ($replicated_volumes->{$volid}) {
- # re-use existing, replicated volume with bitmap on source side
- $nbd->{$opt} = $conf->{${opt}};
- print "re-using replicated volume: $opt - $volid\n";
+ foreach my $opt (sort keys %$source_volumes) {
+ my ($volid, $storeid, $volname, $drive, $use_existing) = @{$source_volumes->{$opt}};
+
+ if ($use_existing) {
+ $nbd->{$opt}->{drivestr} = print_drive($drive);
+ $nbd->{$opt}->{volid} = $volid;
+ $nbd->{$opt}->{replicated} = 1;
next;
}
- my $drive = parse_drive($opt, $conf->{$opt});
# If a remote storage is specified and the format of the original
# volume is not available there, fall back to the default format.
@@ -4784,9 +4793,8 @@ sub vm_migrate_alloc_nbd_disks {
$newdrive->{format} = $format;
$newdrive->{file} = $newvolid;
my $drivestr = print_drive($newdrive);
- $nbd->{$opt} = $drivestr;
- #pass drive to conf for command line
- $conf->{$opt} = $drivestr;
+ $nbd->{$opt}->{drivestr} = $drivestr;
+ $nbd->{$opt}->{volid} = $newvolid;
}
return $nbd;
@@ -4810,8 +4818,15 @@ sub vm_start {
die "VM $vmid already running\n" if check_running($vmid, undef, $migrate_opts->{migratedfrom});
- $migrate_opts->{nbd} = vm_migrate_alloc_nbd_disks($storecfg, $vmid, $conf, $migrate_opts->{storagemap}, $migrate_opts->{replicated_volumes})
- if $migrate_opts->{storagemap};
+ if (my $storagemap = $migrate_opts->{storagemap}) {
+ my $replicated = $migrate_opts->{replicated_volumes};
+ my $disks = vm_migrate_get_nbd_disks($storecfg, $conf, $replicated);
+ $migrate_opts->{nbd} = vm_migrate_alloc_nbd_disks($storecfg, $vmid, $disks, $storagemap);
+
+ foreach my $opt (keys %{$migrate_opts->{nbd}}) {
+ $conf->{$opt} = $migrate_opts->{nbd}->{$opt}->{drivestr};
+ }
+ }
vm_start_nolock($storecfg, $vmid, $conf, $params, $migrate_opts);
});
@@ -4826,7 +4841,7 @@ sub vm_start {
# paused => start VM in paused state (backup)
# resume => resume from hibernation
# migrate_opts:
-# nbd => newly allocated volumes for NBD exports (vm_migrate_alloc_nbd_disks)
+# nbd => volumes for NBD exports (vm_migrate_alloc_nbd_disks)
# migratedfrom => source node
# spice_ticket => used for spice migration, passed via tunnel/stdin
# network => CIDR of migration network
@@ -5078,9 +5093,12 @@ sub vm_start_nolock {
}
foreach my $opt (sort keys %$nbd) {
- my $drivestr = $nbd->{$opt};
+ my $drivestr = $nbd->{$opt}->{drivestr};
+ my $volid = $nbd->{$opt}->{volid};
mon_cmd($vmid, "nbd-server-add", device => "drive-$opt", writable => JSON::true );
print "storage migration listens on $migrate_storage_uri:exportname=drive-$opt volume:$drivestr\n";
+ print "re-using replicated volume: $opt - $volid\n"
+ if $nbd->{$opt}->{replicated};
}
}
--
2.20.1
More information about the pve-devel
mailing list