On Fri, Mar 16, 2012 at 17:35:09 +0100, Michal Privoznik wrote:
If we issue guest command and GA is not running, the issuing thread
will block endlessly. We can check for GA presence by issuing
guest-sync with unique ID (timestamp). We don't want to issue real
command as even if GA is not running, once it is started, it process
all commands written to GA socket.
---
diff to v1:
- don't keep list of issued IDs because it's pointless
Some background on this:
I've intended to switch to new guest-sync-delimited and use
older guest-sync for older GA. However, since we don't use
stream base implementation but use new line as delimiter for
GA responses we don't need GA to issue sentinel byte 0xFF for us:
http://wiki.qemu.org/Features/QAPI/GuestAgent#QEMU_Guest_Agent_Protocol
Moreover, since we are using guest-sync just for detecting GA, it is
not necessary to use sentinel byte at all:
http://lists.nongnu.org/archive/html/qemu-devel/2012-03/msg03278.html
src/qemu/qemu_agent.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 128 insertions(+), 6 deletions(-)
ACK, but don't forget to run make syntax-check before pushing to fix your
violation of recently added sizeof() rule.
Anyway, there is a small chance the guest-agent will crash after sending us a
response to guest-sync but before it can process the real command. Current
code will just hang waiting for the reply. We were discussing this issue with
Michal and came up with a possible solution:
- use timeouts for all ga commands
- any code sending ga command has to register a callback which will be used in
case the command takes longer than timeout; in that case the caller already
exited with error and the callback will make sure to undo any changes the
command (which we thought was never acted upon) made; e.g., it will unfreeze
guest's filesystem after we didn't get a reply to freeze in time
- when a new command is about to be issued, guest-sync is called (already
done) and getting reply to it removes any callbacks since we know it won't
be processed
- anytime the callback is present, we may report that guest agent is not
responding to us using domcontrol (if possible) or using a new api
Jirka