[libvirt] [PATCH 05/10] qemu: agent: straigten up failed agent start case

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Thu Oct 27 12:31:27 UTC 2016



On 26.10.2016 23:04, John Ferlan wrote:
> 
> 
> On 10/04/2016 02:56 AM, Nikolay Shirokovskiy wrote:
>> agentError is used for 2 different cases:
>>
>> 1. agent monitor is failed to start
> 
> Non guest fatal failure in qemuConnectAgent when first trying to connect
> to the agent
> 
>> 2. io error in agent monitor
> 
> I/O error with running agent resulting in qemuProcessHandleAgentError
> being called
> 
> Most of the above would seemingly be a reason for the removal of the
> agentError (which needs to be a separate patch)...

Removal is done in 2 steps. This is a step 1. Drop
flag usage for the case 1.

> 
>>
>> Actually to check for the first case we don't need the
>> flag at all. NULL agent is always error for old qemu
>> (QEMU_CAPS_VSERPORT_CHANGE is not supported), while
>> for modern qemu it is an error only if channel is in
>> connected state.
> 
> I suppose this explanation could be added too, but I'd have to see it in
> the context of what I've learned so far in a "new" series.
> 
> In any case, none of the above text seems to have anything to do with
> the change in reporting the errors at startup.

'failed agent start case' - that is case 1, we drop flag usage for
this case. Nothing to do... how come?

> 
>> ---
>>  src/qemu/qemu_domain.c  | 37 +++++++++++++++++++++++--------------
>>  src/qemu/qemu_process.c |  1 -
>>  2 files changed, 23 insertions(+), 15 deletions(-)
>>
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index 9b1a32e..cd788c8 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -5046,6 +5046,7 @@ qemuDomainAgentAvailable(virDomainObjPtr vm,
>>                           bool reportError)
>>  {
>>      qemuDomainObjPrivatePtr priv = vm->privateData;
>> +    virDomainChrDefPtr config;
>>  
>>      if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_RUNNING) {
>>          if (reportError) {
>> @@ -5062,22 +5063,30 @@ qemuDomainAgentAvailable(virDomainObjPtr vm,
>>          }
>>          return false;
>>      }
>> -    if (!priv->agent) {
>> -        if (qemuFindAgentConfig(vm->def)) {
>> -            if (reportError) {
>> -                virReportError(VIR_ERR_AGENT_UNRESPONSIVE, "%s",
>> -                               _("QEMU guest agent is not connected"));
>> -            }
>> -            return false;
>> -        } else {
>> -            if (reportError) {
>> -                virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
>> -                               _("QEMU guest agent is not configured"));
>> -            }
>> -            return false;
>> +
>> +    if (priv->agent)
>> +        return true;
>> +
>> +    config = qemuFindAgentConfig(vm->def);
>> +
>> +    if (!config) {
>> +        if (reportError) {
>> +            virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
>> +                           _("QEMU guest agent is not configured"));
>>          }
> 
> I'm OK through here, but the next two I'm not so sure I agree with.
> 
>> +    } else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VSERPORT_CHANGE) &&
>> +               config->state != VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED) {
> 
> What does the manner of startup (either legacy or VSERPORT) have to do
> with which error should be reported.

Ok. Let me explain it further.

Case 1. Legacy.

1. domain start (migration finish etc)
2. qemuConnectAgent is called, failed
   we need to report 'agent error'

Case 2. VSERPORT

1. domain start
2. qemuConnectAgent exits early
   in between we need to report 'not connected'
3. VSERPORT_CHANGE arrived
4. qemuConnectAgent is called, failed
   now we need to report 'agent error'
  

>> +        if (reportError) {
>> +            virReportError(VIR_ERR_AGENT_UNRESPONSIVE, "%s",
>> +                           _("QEMU guest agent is not connected"));
>> +        }
>> +    } else if (reportError) {
>> +        virReportError(VIR_ERR_AGENT_UNRESPONSIVE, "%s",
>> +                       _("QEMU guest agent is not "
>> +                         "available due to an error"));
> 
> I know you're setting up for the next set of patches (to remove the
> agentError flag), but I'm not sure yet whether using VSERPORT change
> configuration is the right way.
> 
> Unless of course my assumption from patch 1 review is true... This is
> really a startup/shutdown race...
> 
> John
>>      }
>> -    return true;
>> +
>> +    return false;
>>  }
>>  
>>  
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index d7c9ce3..78d530f 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -267,7 +267,6 @@ qemuConnectAgent(virQEMUDriverPtr driver, virDomainObjPtr vm)
>>   cleanup:
>>      if (!priv->agent) {
>>          VIR_WARN("Cannot connect to QEMU guest agent for %s", vm->def->name);
>> -        priv->agentError = true;
> 
> Wait, what, why?  you just added this in the previous patch and I see no
> reason for removing it now.

 After the above changes to qemuDomainAgentAvailable the meaning of this flag
to report agent startup errors (case 1 from the commit message) is disappered.
So we don't need to set this flag anymore here. We don't add this flag in the
previous patch just move into single place.

> 
> This would need a separate patch and reason.
> 

I think this is a matter of one patch. We drop the use case 1 from the flag.

Nikolay




More information about the libvir-list mailing list