qemu: agent: ignore delayed reply when unsynced

Errors in qemuAgentIOProcessLine stop agent IO processing just
like any regular IO error, however some of current errors
that this functions spawns are false positives. Consider
next case for example:

1. send sync (unsynced state)
2. receive sync reply (sync established)
3. command send, but timeout occured (unsynced state)
4. receive command reply

Last IO triggers error because current code ignores
only delayed syncs when unsynced

We should not treat any delayed reply as error in unsynced
state. Until client and qga are not in sync delayed reply to any
command is possible. msg == NULL is the exact criterion
that we are not in sync.
This commit is contained in:
Nikolay Shirokovskiy 2016-09-16 13:35:32 +03:00 committed by Michal Privoznik
parent e5568193f4
commit 4fd25421e3

View File

@ -308,7 +308,6 @@ qemuAgentIOProcessLine(qemuAgentPtr mon,
{ {
virJSONValuePtr obj = NULL; virJSONValuePtr obj = NULL;
int ret = -1; int ret = -1;
unsigned long long id;
VIR_DEBUG("Line [%s]", line); VIR_DEBUG("Line [%s]", line);
@ -331,25 +330,11 @@ qemuAgentIOProcessLine(qemuAgentPtr mon,
msg->rxObject = obj; msg->rxObject = obj;
msg->finished = 1; msg->finished = 1;
obj = NULL; obj = NULL;
ret = 0;
} else { } else {
/* If we've received something like: /* we are out of sync */
* {"return": 1234} VIR_DEBUG("Ignoring delayed reply");
* it is likely that somebody started GA }
* which is now processing our previous
* guest-sync commands. Check if this is
* the case and don't report an error but
* return silently.
*/
if (virJSONValueObjectGetNumberUlong(obj, "return", &id) == 0) {
VIR_DEBUG("Ignoring delayed reply to guest-sync: %llu", id);
ret = 0; ret = 0;
goto cleanup;
}
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unexpected JSON reply '%s'"), line);
}
} else { } else {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unknown JSON reply '%s'"), line); _("Unknown JSON reply '%s'"), line);