]> git.proxmox.com Git - qemu-server.git/commitdiff
migration: nbd export: switch away from deprecated QMP command
authorFiona Ebner <f.ebner@proxmox.com>
Fri, 2 Dec 2022 12:54:52 +0000 (13:54 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Fri, 13 Jan 2023 13:04:39 +0000 (14:04 +0100)
The 'nbd-server-add' QMP command has been deprecated since QEMU 5.2 in
favor of a more general 'block-export-add'.

When using 'nbd-server-add', QEMU internally converts the parameters
and calls blk_exp_add() which is also used by 'block-export-add'. It
does one more thing, namely calling nbd_export_set_on_eject_blk() to
auto-remove the export from the server when the backing drive goes
away. But that behavior is not needed in our case, stopping the NBD
server removes the exports anyways.

It was checked with a debugger that the parameters to blk_exp_add()
are still the same after this change. Well, the block node names are
autogenerated and not consistent across invocations.

The alternative to using 'query-block' would be specifying a
predictable 'node-name' for our '-drive' commandline. It's not that
difficult for this use case, but in general one needs to be careful
(e.g. it can't be specified for an empty CD drive, but would need to
be set when inserting a CD later). Querying the actual 'node-name'
seemed a bit more future-proof.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
PVE/QemuServer.pm
test/MigrationTest/QmMock.pm

index f4b15fd2bfda6f2aa13cd5c91d96c465a3ae95c2..658afc5f474251298c6dff97f52ea6ebcc37664c 100644 (file)
@@ -5974,10 +5974,25 @@ sub vm_start_nolock {
            $migrate_storage_uri = "nbd:${localip}:${storage_migrate_port}";
        }
 
+       my $block_info = mon_cmd($vmid, "query-block");
+       $block_info = { map { $_->{device} => $_ } $block_info->@* };
+
        foreach my $opt (sort keys %$nbd) {
            my $drivestr = $nbd->{$opt}->{drivestr};
            my $volid = $nbd->{$opt}->{volid};
-           mon_cmd($vmid, "nbd-server-add", device => "drive-$opt", writable => JSON::true );
+
+           my $block_node = $block_info->{"drive-$opt"}->{inserted}->{'node-name'};
+
+           mon_cmd(
+               $vmid,
+               "block-export-add",
+               id => "drive-$opt",
+               'node-name' => $block_node,
+               writable => JSON::true,
+               type => "nbd",
+               name => "drive-$opt", # NBD export name
+           );
+
            my $nbd_uri = "$migrate_storage_uri:exportname=drive-$opt";
            print "storage migration listens on $nbd_uri volume:$drivestr\n";
            print "re-using replicated volume: $opt - $volid\n"
index 2d5d5c6c77aa6b0e8009e1f3f6084bc8febacd17..e34686e30f65f36bac92a4646e1157c474e66261 100644 (file)
@@ -103,8 +103,10 @@ $MigrationTest::Shared::qemu_server_module->mock(
 
        if ($command eq 'nbd-server-start') {
            return;
-       } elsif ($command eq 'nbd-server-add') {
+       } elsif ($command eq 'block-export-add') {
            return;
+       } elsif ($command eq 'query-block') {
+           return [];
        } elsif ($command eq 'qom-set') {
            return;
        }