mirror of
https://git.proxmox.com/git/qemu-server
synced 2025-08-06 17:47:31 +00:00
fix bug 242: re-add old monitor code
This commit is contained in:
parent
3a97020c07
commit
dab36e1ee9
2
Makefile
2
Makefile
@ -2,7 +2,7 @@ RELEASE=2.1
|
|||||||
|
|
||||||
VERSION=2.0
|
VERSION=2.0
|
||||||
PACKAGE=qemu-server
|
PACKAGE=qemu-server
|
||||||
PKGREL=48
|
PKGREL=49
|
||||||
|
|
||||||
DESTDIR=
|
DESTDIR=
|
||||||
PREFIX=/usr
|
PREFIX=/usr
|
||||||
|
@ -2547,6 +2547,114 @@ sub qemu_block_set_io_throttle {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# old code, only used to shutdown old VM after update
|
||||||
|
sub __read_avail {
|
||||||
|
my ($fh, $timeout) = @_;
|
||||||
|
|
||||||
|
my $sel = new IO::Select;
|
||||||
|
$sel->add($fh);
|
||||||
|
|
||||||
|
my $res = '';
|
||||||
|
my $buf;
|
||||||
|
|
||||||
|
my @ready;
|
||||||
|
while (scalar (@ready = $sel->can_read($timeout))) {
|
||||||
|
my $count;
|
||||||
|
if ($count = $fh->sysread($buf, 8192)) {
|
||||||
|
if ($buf =~ /^(.*)\(qemu\) $/s) {
|
||||||
|
$res .= $1;
|
||||||
|
last;
|
||||||
|
} else {
|
||||||
|
$res .= $buf;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!defined($count)) {
|
||||||
|
die "$!\n";
|
||||||
|
}
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
die "monitor read timeout\n" if !scalar(@ready);
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
# old code, only used to shutdown old VM after update
|
||||||
|
sub vm_monitor_command {
|
||||||
|
my ($vmid, $cmdstr, $nocheck) = @_;
|
||||||
|
|
||||||
|
my $res;
|
||||||
|
|
||||||
|
eval {
|
||||||
|
die "VM $vmid not running\n" if !check_running($vmid, $nocheck);
|
||||||
|
|
||||||
|
my $sname = "${var_run_tmpdir}/$vmid.mon";
|
||||||
|
|
||||||
|
my $sock = IO::Socket::UNIX->new( Peer => $sname ) ||
|
||||||
|
die "unable to connect to VM $vmid socket - $!\n";
|
||||||
|
|
||||||
|
my $timeout = 3;
|
||||||
|
|
||||||
|
# hack: migrate sometime blocks the monitor (when migrate_downtime
|
||||||
|
# is set)
|
||||||
|
if ($cmdstr =~ m/^(info\s+migrate|migrate\s)/) {
|
||||||
|
$timeout = 60*60; # 1 hour
|
||||||
|
}
|
||||||
|
|
||||||
|
# read banner;
|
||||||
|
my $data = __read_avail($sock, $timeout);
|
||||||
|
|
||||||
|
if ($data !~ m/^QEMU\s+(\S+)\s+monitor\s/) {
|
||||||
|
die "got unexpected qemu monitor banner\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $sel = new IO::Select;
|
||||||
|
$sel->add($sock);
|
||||||
|
|
||||||
|
if (!scalar(my @ready = $sel->can_write($timeout))) {
|
||||||
|
die "monitor write error - timeout";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $fullcmd = "$cmdstr\r";
|
||||||
|
|
||||||
|
# syslog('info', "VM $vmid monitor command: $cmdstr");
|
||||||
|
|
||||||
|
my $b;
|
||||||
|
if (!($b = $sock->syswrite($fullcmd)) || ($b != length($fullcmd))) {
|
||||||
|
die "monitor write error - $!";
|
||||||
|
}
|
||||||
|
|
||||||
|
return if ($cmdstr eq 'q') || ($cmdstr eq 'quit');
|
||||||
|
|
||||||
|
$timeout = 20;
|
||||||
|
|
||||||
|
if ($cmdstr =~ m/^(info\s+migrate|migrate\s)/) {
|
||||||
|
$timeout = 60*60; # 1 hour
|
||||||
|
} elsif ($cmdstr =~ m/^(eject|change)/) {
|
||||||
|
$timeout = 60; # note: cdrom mount command is slow
|
||||||
|
}
|
||||||
|
if ($res = __read_avail($sock, $timeout)) {
|
||||||
|
|
||||||
|
my @lines = split("\r?\n", $res);
|
||||||
|
|
||||||
|
shift @lines if $lines[0] !~ m/^unknown command/; # skip echo
|
||||||
|
|
||||||
|
$res = join("\n", @lines);
|
||||||
|
$res .= "\n";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
my $err = $@;
|
||||||
|
|
||||||
|
if ($err) {
|
||||||
|
syslog("err", "VM $vmid monitor command failed - $err");
|
||||||
|
die $err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
sub qemu_block_resize {
|
sub qemu_block_resize {
|
||||||
my ($vmid, $deviceid, $storecfg, $volid, $size) = @_;
|
my ($vmid, $deviceid, $storecfg, $volid, $size) = @_;
|
||||||
|
|
||||||
@ -2658,11 +2766,18 @@ sub vm_qmp_command {
|
|||||||
|
|
||||||
eval {
|
eval {
|
||||||
die "VM $vmid not running\n" if !check_running($vmid, $nocheck);
|
die "VM $vmid not running\n" if !check_running($vmid, $nocheck);
|
||||||
|
my $sname = PVE::QemuServer::qmp_socket($vmid);
|
||||||
|
if (-e $sname) {
|
||||||
|
my $qmpclient = PVE::QMPClient->new();
|
||||||
|
|
||||||
my $qmpclient = PVE::QMPClient->new();
|
$res = $qmpclient->cmd($vmid, $cmd);
|
||||||
|
} elsif (-e "${var_run_tmpdir}/$vmid.mon") {
|
||||||
$res = $qmpclient->cmd($vmid, $cmd);
|
die "can't execute complex command on old monitor - stop/start your vm to fix the problem\n"
|
||||||
|
if scalar(%{$cmd->{arguments}});
|
||||||
|
vm_monitor_command($vmid, $cmd->{execute}, $nocheck);
|
||||||
|
} else {
|
||||||
|
die "unable to open monitor socket\n";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
if (my $err = $@) {
|
if (my $err = $@) {
|
||||||
syslog("err", "VM $vmid qmp command failed - $err");
|
syslog("err", "VM $vmid qmp command failed - $err");
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
qemu-server (2.0-49) unstable; urgency=low
|
||||||
|
|
||||||
|
* fix bug 242: re-add old monitor code
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 17 Aug 2012 10:33:37 +0200
|
||||||
|
|
||||||
qemu-server (2.0-48) unstable; urgency=low
|
qemu-server (2.0-48) unstable; urgency=low
|
||||||
|
|
||||||
* add size hint to drive options
|
* add size hint to drive options
|
||||||
|
Loading…
Reference in New Issue
Block a user