[libvirt] [PATCH] [v2] qemu: Retry JSON monitor cont cmd on MigrationExpected error

Jim Fehlig jfehlig at novell.com
Fri Jan 21 16:38:12 UTC 2011


Daniel Veillard wrote:
> On Thu, Jan 20, 2011 at 07:27:14PM -0700, Jim Fehlig wrote:
>   
>> When restoring a saved qemu instance via JSON monitor, the vm is
>> left in a paused state.  Turns out the 'cont' cmd was failing with
>> "MigrationExpected" error class and "An incoming migration is
>> expected before this command can be executed" error description
>> due to migration (restore) not yet complete.
>>
>> Detect if 'cont' cmd fails with "MigrationExpecte" error class and
>> retry 'cont' cmd.
>>
>> V2: Fix potential double-free noted by Laine Stump
>> ---
>>  src/qemu/qemu_monitor_json.c |   22 +++++++++++++++++++---
>>  1 files changed, 19 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
>> index 7387089..35db285 100644
>> --- a/src/qemu/qemu_monitor_json.c
>> +++ b/src/qemu/qemu_monitor_json.c
>> @@ -702,13 +702,29 @@ qemuMonitorJSONStartCPUs(qemuMonitorPtr mon,
>>      int ret;
>>      virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("cont", NULL);
>>      virJSONValuePtr reply = NULL;
>> +    int i = 0, timeout = 3;
>>      if (!cmd)
>>          return -1;
>>  
>> -    ret = qemuMonitorJSONCommand(mon, cmd, &reply);
>> +    do {
>> +        ret = qemuMonitorJSONCommand(mon, cmd, &reply);
>>  
>> -    if (ret == 0)
>> -        ret = qemuMonitorJSONCheckError(cmd, reply);
>> +        if (ret != 0)
>> +            break;
>> +
>> +        /* If no error, we're done */
>> +        if ((ret = qemuMonitorJSONCheckError(cmd, reply)) == 0)
>> +            break;
>> +
>> +        /* If error class is not MigrationExpected, we're done.
>> +         * Otherwise try 'cont' cmd again */
>> +        if (!qemuMonitorJSONHasError(reply, "MigrationExpected"))
>> +            break;
>> +
>> +        virJSONValueFree(reply);
>> +        reply = NULL;
>> +        usleep(250000);
>> +    } while (++i <= timeout);
>>  
>>      virJSONValueFree(cmd);
>>      virJSONValueFree(reply);
>>     
>
>   Looks fine to me now, ACK,
>   

Thanks; pushed.

Regards,
Jim




More information about the libvir-list mailing list