]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/QMPClient.pm
net devs: avoid registering MAC to fdb if not static
[qemu-server.git] / PVE / QMPClient.pm
index 90cba64d61b6941737e9d9678ffd1d72fabe117b..9805c20600649579f6276d23c4387d7d044dda0c 100644 (file)
@@ -17,12 +17,12 @@ use PVE::QemuServer::Helpers;
 # This implementation uses IO::Multiplex (libio-multiplex-perl) and
 # allows you to issue qmp and qga commands to different VMs in parallel.
 
-# Note: qemu can onyl handle 1 connection, so we close connections asap
+# Note: qemu can only handle 1 connection, so we close connections asap
 
 sub new {
     my ($class, $eventcb) = @_;
 
-    my $mux = new IO::Multiplex;
+    my $mux = IO::Multiplex->new();
 
     my $self = bless {
        mux => $mux,
@@ -80,7 +80,7 @@ sub queue_cmd {
 
     &$push_cmd_to_queue($self, $vmid, $cmd);
 
-    return undef;
+    return;
 }
 
 # execute a single command
@@ -113,25 +113,31 @@ sub cmd {
            # locked state with high probability, so use an generous timeout
            $timeout = 60*60; # 1 hour
        } elsif ($cmd->{execute} eq 'guest-fsfreeze-thaw') {
-           # thaw has no possible long blocking actions, either it returns
-           # instantly or never (dead locked)
-           $timeout = 10;
-       } elsif ($cmd->{execute} eq 'savevm-start' ||
-                $cmd->{execute} eq 'savevm-end' ||
-                $cmd->{execute} eq 'query-backup' ||
-                $cmd->{execute} eq 'query-block-jobs' ||
-                $cmd->{execute} eq 'block-job-cancel' ||
-                $cmd->{execute} eq 'block-job-complete' ||
-                $cmd->{execute} eq 'backup-cancel' ||
-                $cmd->{execute} eq 'query-savevm' ||
-                $cmd->{execute} eq 'delete-drive-snapshot' ||
-                $cmd->{execute} eq 'guest-shutdown' ||
-                $cmd->{execute} eq 'blockdev-snapshot-internal-sync' ||
-                $cmd->{execute} eq 'blockdev-snapshot-delete-internal-sync' ||
-                $cmd->{execute} eq 'snapshot-drive'  ) {
+           # While it should return instantly or never (dead locked) for Linux guests,
+           # the variance for Windows guests can be big. And there might be hook scripts
+           # that are executed upon thaw, so use 3 minutes to be on the safe side.
+           $timeout = 3 * 60;
+       } elsif (
+           $cmd->{execute} eq 'savevm-start' ||
+           $cmd->{execute} eq 'savevm-end' ||
+           $cmd->{execute} eq 'query-backup' ||
+           $cmd->{execute} eq 'query-block-jobs' ||
+           $cmd->{execute} eq 'block-job-cancel' ||
+           $cmd->{execute} eq 'block-job-complete' ||
+           $cmd->{execute} eq 'backup-cancel' ||
+           $cmd->{execute} eq 'query-savevm' ||
+           $cmd->{execute} eq 'delete-drive-snapshot' ||
+           $cmd->{execute} eq 'guest-fstrim' ||
+           $cmd->{execute} eq 'guest-shutdown' ||
+           $cmd->{execute} eq 'blockdev-snapshot-internal-sync' ||
+           $cmd->{execute} eq 'blockdev-snapshot-delete-internal-sync' ||
+           $cmd->{execute} eq 'snapshot-drive'
+        ) {
            $timeout = 10*60; # 10 mins ?
        } else {
-           $timeout = 3; # default
+           #  NOTE: if you came here as user and want to change this, try using IO-Threads first
+           # which move out quite some processing of the main thread, leaving more time for QMP
+           $timeout = 5; # default
        }
     }
 
@@ -164,7 +170,7 @@ my $lookup_queue_info = sub {
     my $queue_info = $self->{queue_lookup}->{$fh};
     if (!$queue_info) {
        warn "internal error - unable to lookup queue info" if !$noerr;
-       return undef;
+       return;
     }
     return $queue_info;
 };