[pve-devel] [PATCH qemu-server 1/1] Fix #1664: nbd mirror : remove socat tunnel

Alexandre Derumier aderumier at odiso.com
Thu Feb 15 13:43:10 CET 2018


socat tunnel for nbd mirror was introduce here
https://pve.proxmox.com/pipermail/pve-devel/2017-January/024777.html
to workaround when nbd client was hanging on non responding nbd server.

We have added a 30s timeout on socat tunnel, but when we migrate
multiple disks, it can break migration if for example first disk
is already finished and don't send any new datas in the tunnel.

The connect timeout bug has been fixed in qemu 2.9,
so we can remove the socat tunnel now.
---
 PVE/QemuServer.pm | 46 +---------------------------------------------
 1 file changed, 1 insertion(+), 45 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 20d6682..b134be0 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -6052,31 +6052,8 @@ sub qemu_drive_mirror {
     $jobs->{"drive-$drive"} = {};
 
     if ($dst_volid =~ /^nbd:(localhost|[\d\.]+|\[[\d\.:a-fA-F]+\]):(\d+):exportname=(\S+)/) {
-	my $server = $1;
-	my $port = $2;
-	my $exportname = $3;
-
+	$qemu_target = $dst_volid;
 	$format = "nbd";
-	my $unixsocket = "/run/qemu-server/$vmid.mirror-drive-$drive";
-	$qemu_target = "nbd+unix:///$exportname?socket=$unixsocket";
-	my $cmd = ['socat', '-T30', "UNIX-LISTEN:$unixsocket,fork", "TCP:$server:$2,connect-timeout=5"];
-
-	my $pid = fork();
-	if (!defined($pid)) {
-	    die "forking socat tunnel failed\n";
-	} elsif ($pid == 0) {
-	    exec(@$cmd);
-	    warn "exec failed: $!\n";
-	    POSIX::_exit(-1);
-	}
-	$jobs->{"drive-$drive"}->{pid} = $pid;
-
-	my $timeout = 0;
-	while (!-S $unixsocket) {
-	    die "nbd connection helper timed out\n"
-		if $timeout++ > 5;
-	    sleep 1;
-	}
     } else {
 	my $storecfg = PVE::Storage::config();
 	my ($dst_storeid, $dst_volname) = PVE::Storage::parse_volume_id($dst_volid);
@@ -6188,7 +6165,6 @@ sub qemu_drive_mirror_monitor {
 			}else {
 			    print "$job: Completed successfully.\n";
 			    $jobs->{$job}->{complete} = 1;
-			    eval { qemu_blockjobs_finish_tunnel($vmid, $job, $jobs->{$job}->{pid}) } ;
 			}
 		    }
 		}
@@ -6226,7 +6202,6 @@ sub qemu_blockjobs_cancel {
 
 	    if (defined($jobs->{$job}->{cancel}) && !defined($running_jobs->{$job})) {
 		print "$job: Done.\n";
-		eval { qemu_blockjobs_finish_tunnel($vmid, $job, $jobs->{$job}->{pid}) } ;
 		delete $jobs->{$job};
 	    }
 	}
@@ -6237,25 +6212,6 @@ sub qemu_blockjobs_cancel {
     }
 }
 
-sub qemu_blockjobs_finish_tunnel {
-   my ($vmid, $job, $cpid) = @_;
-
-   return if !$cpid;
-
-   for (my $i = 1; $i < 20; $i++) {
-	my $waitpid = waitpid($cpid, WNOHANG);
-	last if (defined($waitpid) && ($waitpid == $cpid));
- 
-	if ($i == 10) {
-	    kill(15, $cpid);
-	} elsif ($i >= 15) {
-	    kill(9, $cpid);
-	}
-	sleep (1);
-    }
-    unlink "/run/qemu-server/$vmid.mirror-$job";
-}
-
 sub clone_disk {
     my ($storecfg, $vmid, $running, $drivename, $drive, $snapname,
 	$newvmid, $storage, $format, $full, $newvollist, $jobs, $skipcomplete, $qga) = @_;
-- 
2.11.0




More information about the pve-devel mailing list