mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 07:05:28 +00:00
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:
parent
e5568193f4
commit
4fd25421e3
@ -308,7 +308,6 @@ qemuAgentIOProcessLine(qemuAgentPtr mon,
|
||||
{
|
||||
virJSONValuePtr obj = NULL;
|
||||
int ret = -1;
|
||||
unsigned long long id;
|
||||
|
||||
VIR_DEBUG("Line [%s]", line);
|
||||
|
||||
@ -331,25 +330,11 @@ qemuAgentIOProcessLine(qemuAgentPtr mon,
|
||||
msg->rxObject = obj;
|
||||
msg->finished = 1;
|
||||
obj = NULL;
|
||||
ret = 0;
|
||||
} else {
|
||||
/* If we've received something like:
|
||||
* {"return": 1234}
|
||||
* 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;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unexpected JSON reply '%s'"), line);
|
||||
/* we are out of sync */
|
||||
VIR_DEBUG("Ignoring delayed reply");
|
||||
}
|
||||
ret = 0;
|
||||
} else {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unknown JSON reply '%s'"), line);
|
||||
|
Loading…
Reference in New Issue
Block a user