[libvirt] [PATCH 1/2] qemu: don't log error for missing optional sources on stats

John Ferlan jferlan at redhat.com
Wed Dec 12 14:38:21 UTC 2018



On 12/12/18 9:32 AM, Nikolay Shirokovskiy wrote:
> 
> 
> On 12.12.2018 16:28, John Ferlan wrote:
>>
>>
>> On 12/12/18 3:04 AM, Nikolay Shirokovskiy wrote:
>>>
>>>
>>> On 11.12.2018 17:33, John Ferlan wrote:
>>>>
>>>>
>>>> On 12/11/18 2:34 AM, Nikolay Shirokovskiy wrote:
>>>>>
>>>>>
>>>>> On 11.12.2018 01:05, John Ferlan wrote:
>>>>>>
>>>>>> $SUBJ:
>>>>>>
>>>>>> 'storage sources'
>>>>>>
>>>>>> On 11/12/18 7:58 AM, Nikolay Shirokovskiy wrote:
>>>>>>> Every time we call all domain stats for inactive domain with
>>>>>>> unavailable source we get error message in logs. It's a bit noisy.
>>>>>>
>>>>>> Are there ones in particular?
>>>>>
>>>>> Like this one:
>>>>>
>>>>> qemuOpenFileAs:3324 : Failed to open file '/path/to/optinal/disk': No such file or directory
>>>>>
>>>>
>>>> So this is the one that perhaps is bothersome to the degree of we're
>>>> ignoring that it doesn't exist, but then again the domain is not active,
>>>> so does it really matter.
>>>>
>>>
>>> I would prefer not to see false positive messages in logs if it is possible.
>>>
>>>>>>
>>>>>>> While it's arguable whether we need such message or not for mandatory
>>>>>>> disks we would like not to see messages for optional disks. Let's
>>>>>>
>>>>>> Filtering for the 'startupPolicy = optional' for domain stats (with
>>>>>> empty/unavailable local source) would seem to be a "new use" perhaps not
>>>>>> totally in line with the original intention.
>>>>>
>>>>> But I was not going to change behaviour only to stop polluting
>>>>> logs with messages like above.
>>>>>
>>>>
>>>> Your solution requires that someone has modified their definition to
>>>> include that startupPolicy='optional' attribute. I can be persuaded that
>>>> this is desirable; however, it would be nice to get Peter's opinion on
>>>> this especially since he knows the code and "rules" for backing stores
>>>> better than I do. IOW: From a storage backing chain perspective does it
>>>> make sense to use that.
>>>
>>> Not presicely, rather if someone already has optional disk then why logging
>>> this kind of errors.
>>>>>
>>>>>>
>>>>>>> filter at least for cases of local files. Fixing other cases would
>>>>>>> require passing flag down the stack to .backendInit of storage
>>>>>>> which is ugly.
>>>>>>
>>>>>> Yeah, I remember chasing down into backendInit (virStorageFileInitAs)
>>>>>> from qemuDomainStorageOpenStat for
>>>>>>
>>>>>>    virStorageFileBackendForType:145 : internal error: missing storage
>>>>>> backend for 'none' storage
>>>>>>    virStorageFileBackendForType:141 : internal error: missing storage
>>>>>> backend for network files using iscsi protocol
>>>>>>
>>>>>> where the 'none' comes from a volume using a storage pool of iSCSI
>>>>>> disks. I chased for a bit, but yes it got messy fast.
>>>>>>
>>>>>>>
>>>>>>> Stats for active domain are fine because we either drop disks
>>>>>>> with unavailable sources or clean source which is handled
>>>>>>> by virStorageSourceIsEmpty in qemuDomainGetStatsOneBlockFallback.
>>>>>>>
>>>>>>> We have these logs for successful stats since 25aa7035d which
>>>>>>> in turn fixes 596a13713 which added substantial stats for offline
>>>>>>> disks.
>>>>>>>
>>>>>>> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
>>>>>>> ---
>>>>>>>  src/qemu/qemu_driver.c  | 5 +++++
>>>>>>>  src/qemu/qemu_process.c | 9 +++++++++
>>>>>>>  src/qemu/qemu_process.h | 2 ++
>>>>>>>  3 files changed, 16 insertions(+)
>>>>>>>
>>>>>>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>>>>>>> index a52e249..72e4cfe 100644
>>>>>>> --- a/src/qemu/qemu_driver.c
>>>>>>> +++ b/src/qemu/qemu_driver.c
>>>>>>> @@ -20290,6 +20290,11 @@ qemuDomainGetStatsBlockExportDisk(virDomainDiskDefPtr disk,
>>>>>>>      const char *backendstoragealias;
>>>>>>>      int ret = -1;
>>>>>>>  
>>>>>>> +    if (!virDomainObjIsActive(dom) &&
>>>>>>> +        qemuProcessMissingLocalOptionalDisk(disk))
>>>>>>> +        return qemuDomainGetStatsBlockExportHeader(disk, disk->src, *recordnr,
>>>>>>> +                                                   records, nrecords);
>>>>>>> +
>>>>>>
>>>>>> From my quick read this part would seem reasonable since the *Frontend
>>>>>> and *Backend wouldn't have valid data and *GetStatsOneBlock is fetching
>>>>>> source sizing data which for an empty source would be unobtainable.
>>>>>>
>>>>>>>      for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) {
>>>>>>>          if (blockdev) {
>>>>>>>              frontendalias = QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName;
>>>>>>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>>>>>>> index 9cf9718..802274e 100644
>>>>>>> --- a/src/qemu/qemu_process.c
>>>>>>> +++ b/src/qemu/qemu_process.c
>>>>>>> @@ -6070,6 +6070,15 @@ qemuProcessPrepareSEVGuestInput(virDomainObjPtr vm)
>>>>>>>  }
>>>>>>>  
>>>>>>>  
>>>>>>> +bool
>>>>>>> +qemuProcessMissingLocalOptionalDisk(virDomainDiskDefPtr disk)
>>>>>>
>>>>>> Curious why you chose qemu_process and not qemu_domain or even
>>>>>> virstoragefile?  This has nothing to do with whether the qemu process is
>>>>>> running or not.
>>>>>
>>>>> Yeah, we have nothing qemu specific here. Just not sure is this useful
>>>>> for other purpuses or not.
>>>>>
>>>>
>>>> Since your chosen filter is "domain startup policy", I think qemu_domain
>>>> is where it belongs.
>>>>
>>>>>>
>>>>>>> +{
>>>>>>> +    return disk->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_OPTIONAL &&
>>>>>>
>>>>>> While I agree in principle about optional disks; however, since
>>>>>> startupPolicy is optional it would seem this particular check is chasing
>>>>>> a very specific condition. Would it be reasonable to use a flag instead?
>>>>>> Something passed on the command line to essentially say to only collect
>>>>>> the name/format the name of the local empty sources.
>>>>>
>>>>> Not sure I understand you. This patch does not change anything in respect
>>>>> to collected stats so I can not see why we need extra flags.
>>>>>
>>>>
>>>> To be clear, I'm not advocating some new domain attribute/flag here.
>>>>
>>>> The flag idea is something provided to virConnectGetAllDomainStats (or
>>>> of course virDomainListGetStats) rather than using startupPolicy. IOW,
>>>> some new VIR_CONNECT_GET_ALL_DOMAINS_STATS* flag.
>>>>
>>>> Just "odd" that using the startupPolicy flag to avoid stats collection
>>>> for inactive guests and in the next patch for backing chains.  Perhaps
>>>> something worth adding to the startupPolicy description if this is the
>>>> option taken.
>>>>  >>
>>>
>>> I agree that it is odd in case of stats collection but not in the second
>>> case because there we check startupPolicy flag during startup which 
>>> corresponds to flag's name and meaning.
>>>
>>> As to stats collection here we have discrepancy between name and usage.
>>> On the other hand optional policy makes disk kind of optional asset for domain so
>>> having screaming error messages in logs every several seconds is odd too.
>>> If this patch will be accepted it may make sense to introduce alias for
>>> for startupPolicy, something like 'presense' having in mind it already
>>> affects not only startup but migration/restore/revert.
>>>
>>
>> The qemuProcessMissingLocalOptionalDisk needs to at least move to
>> qemu_domain and be renamed in a v2.
>>
>> Noting in the description of startupPolicy in formatdomain.html.in that
>> collection of detailed disk stats for inactive guests when the path is
>> missing is something that I would think would be nice/good.
> 
> Ok
> 
>>
>> w/r/t Dan's comment about logging level using info vs error - could be a
>> challenge to do that given that you don't necessarily want to be carting
>> that around - although I suppose in the case where we know we're
>> "throwing away" an error (e.g. such as reset last error would do), we
>> could fetch that error and generate a VIR_INFO from it leaving it up to
>> the use to decide how chatty they'd like to have things.
> 
> With current approach this is difficult to archive. In both patches we skip
> code that can generate error. However I can add explicit INFO message
> that disk is skipped. Is this ok?
> 

Sure that's fine.  Although someone else may gripe that's too much
information (yes, a no win situation).

John

> Nikolay
> 
>>
>> John
>>
>>
>>> Nikolay
>>>
>>>>>> That way we're not reusing something that has other uses. Although I'm
>>>>>> open to other opinions.
>>>>>>
>>>>>>> +           virStorageSourceIsLocalStorage(disk->src) && disk->src->path &&
>>>>>>
>>>>>> Use virStorageSourceIsEmpty instead.
>>>>>
>>>>> But this is a bit different, say I use !virStorageSourceIsEmpty(src) instead of the line
>>>>> above, then I can not sure disk->src->path even makes sense in the below check.
>>>>>
>>>>
>>>> Ah, right the !virStorageSourceIsLocalStorage && src->path would pass...
>>>>  Cannot mistake virStorageSourceIsEmpty for (non existent)
>>>> virStorageLocalSourceIsEmpty
>>>>
>>>>>>
>>>>>>> +           !virFileExists(disk->src->path);
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>> And while I believe I understand why you chose this, it would seem to me
>>>>>> that it might be useful to know if an optional local disk had a path
>>>>>> disappear.  IOW: If all the other conditions are met, I'd like to know
>>>>>> that the source path is missing. That might be a good thing to know if
>>>>>> I'm getting stats for a domain. Maybe that's just me.
>>>>>
>>>>> Yeah, its arguable. But as getting stats is periodic with rather high
>>>>> frequency seeing such log error over and over again in logs can be
>>>>> tedious.
>>>>>
>>>>
>>>> Playing devil's advocate for a moment - what if someone didn't know the
>>>> $path to that backing store was missing? By at least logging somewhere
>>>> (but not fatal), the awareness can be made. By filtering the message if
>>>> the unrelated in name startupPolicy was set to optional, this knowledge
>>>> could be missed.
>>>>
>>>> The concept of filtering is fine to me - the concern is really the usage
>>>> of the essentially unrelated startupPolicy to do so is what gives me
>>>> pause for concern. If there are others that are OK with this, it's not a
>>>> deal breaker for me.
>>>>
>>>> John
>>>>
>>>>>>
>>>>>> BTW: I fixed a bug in the domstats path recently where the "last error"
>>>>>> was lost (see commit e1fc7ec08).  Although I don't think that's what
>>>>>> you're chasing here.
>>>>>
>>>>> Nope, it's different case.
>>>>>
>>>>> Nikolay
>>>>>
>>>>>>
>>>>>> John
>>>>>>
>>>>>>
>>>>>>> +}
>>>>>>> +
>>>>>>> +
>>>>>>>  static int
>>>>>>>  qemuProcessPrepareHostStorage(virQEMUDriverPtr driver,
>>>>>>>                                virDomainObjPtr vm,
>>>>>>> diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
>>>>>>> index 2037467..52d396d 100644
>>>>>>> --- a/src/qemu/qemu_process.h
>>>>>>> +++ b/src/qemu/qemu_process.h
>>>>>>> @@ -214,4 +214,6 @@ int qemuProcessStartManagedPRDaemon(virDomainObjPtr vm);
>>>>>>>  
>>>>>>>  void qemuProcessKillManagedPRDaemon(virDomainObjPtr vm);
>>>>>>>  
>>>>>>> +bool qemuProcessMissingLocalOptionalDisk(virDomainDiskDefPtr disk);
>>>>>>> +
>>>>>>>  #endif /* __QEMU_PROCESS_H__ */
>>>>>>>




More information about the libvir-list mailing list