From a6315091dcb7c01e7083acc3d33cf1aa0cfcc0a5 Mon Sep 17 00:00:00 2001 From: Guido De Rosa Date: Wed, 27 Nov 2013 16:23:00 +0100 Subject: [PATCH] qemu: handle unix sockets conditions (Not-so-)gracefully... --- modules/qemu/controller/virtualization/qemu.rb | 6 ++++++ .../lib/onboard/virtualization/qemu/instance.rb | 15 +++++++++++++++ .../onboard/virtualization/qemu/monitor/qmp.rb | 3 ++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/modules/qemu/controller/virtualization/qemu.rb b/modules/qemu/controller/virtualization/qemu.rb index 0bbc8af7..46426a3a 100644 --- a/modules/qemu/controller/virtualization/qemu.rb +++ b/modules/qemu/controller/virtualization/qemu.rb @@ -6,6 +6,12 @@ class OnBoard class Controller < Sinatra::Base + before do + if request.path_info =~ /^\/virtualization\/qemu/ + Virtualization::QEMU.cleanup + end + end + get '/virtualization/qemu.:format' do format( :module => 'qemu', diff --git a/modules/qemu/lib/onboard/virtualization/qemu/instance.rb b/modules/qemu/lib/onboard/virtualization/qemu/instance.rb index 6bd8609d..78851ef2 100644 --- a/modules/qemu/lib/onboard/virtualization/qemu/instance.rb +++ b/modules/qemu/lib/onboard/virtualization/qemu/instance.rb @@ -273,6 +273,19 @@ def prepare_pci_passthrough end def start(*opts) + # WARNING: opts is also a sugar method of this class... + + QEMU.cleanup + + # Circumvent a possible QEMU bug (as of 1.6.1) when a USB device + # is passed-through. (assertion failed) + unless opts.include? :paused + if @config.cmd['opts']['-loadvm'] + start :paused, *opts + drives # a way to wait for QMP/Monitor sockets ready + resume + end + end # Auto-update from previous versions' configs # which didn't use QMP. @@ -395,6 +408,8 @@ def drives @cache['block_json'] ||= @qmp.execute 'query-block' qmp_data = JSON.load @cache['block_json'] qmp_return = qmp_data['return'] + + return {} unless qmp_return # Compatibility with the old return value of this method # (which has been based on "human-redable" monitor...) diff --git a/modules/qemu/lib/onboard/virtualization/qemu/monitor/qmp.rb b/modules/qemu/lib/onboard/virtualization/qemu/monitor/qmp.rb index 8bd13919..871f459c 100644 --- a/modules/qemu/lib/onboard/virtualization/qemu/monitor/qmp.rb +++ b/modules/qemu/lib/onboard/virtualization/qemu/monitor/qmp.rb @@ -28,7 +28,8 @@ def execute(command, arguments={}) sleep pause retry else - raise + LOGGER.error $! + return JSON.dump({'error' => {'message' => $!}}) end end end