On 05/25/2016 02:46 AM, Marc Brothier wrote:
> Public bug reported:
> 
> Hi,
> 
> We have VMs which were started with an older version than qemu 2.1 which
> added "cache-miss-rate" property for XBZRLECacheStats. While trying to
> migrate the VM to a new host which is running a higher version (2.3) of
> Qemu we got an exception:
> 
> virJSONValueFromString:1642 : internal error: cannot parse json {"return": 
> {"expected-downtime": 1, "xbzrle-cache": {"bytes": 0, "cache-size": 67108864, 
> "cache-miss-rate": -nan, "pages": 0, "overflow": 0, "cache-miss": 8933}, 
> "status": "active", "disk": {"total": 429496729600, "dirty-sync-count": 0, 
> "remaining": 193896382464, "mbps": 0, "transferred": 235600347136, 
> "duplicate": 0, "dirty-pages-rate": 0, "skipped": 0, "normal-bytes": 0, 
> "normal": 0}, "setup-time": 13, "total-time": 1543124, "ram": {"total": 
> 8599183360, "dirty-sync-count": 4, "remaining": 30695424, "mbps": 830.636997, 
> "transferred": 3100448901, "duplicate": 1358341, "dirty-pages-rate": 7, 
> "skipped": 0, "normal-bytes": 3082199040, "normal": 752490}}, "id": 
> "libvirt-186200"}: lexical error: malformed number, a digit is required after 
> the minus sign.
>           67108864, "cache-miss-rate": -nan, "pages": 0, "overflow": 0
>                      (right here) ------^
> 
> virNetClientStreamRaiseError:191 : stream aborted at client request

Wow - I've known we have a problem with qemu emitting non-compliant
JSON, but this proves that it is fatal to libvirt. I guess my series on
improving the JSON parser [1] should consider doing a fallback to
s/NaN/0/ and s/Inf/DBL_MAX/ rather than completely erroring out when a
client tries to request it. Meanwhile, it's an easy patch to qemu to
avoid division by zero when generating cache-miss-rate.

[1] https://lists.gnu.org/archive/html/qemu-devel/2016-05/msg03424.html

> 
> 
> Would it be possible to improve the JSON parser to skip the key if the value 
> is incorrect

Libvirt uses libyajl to parse JSON, and libyajl has an outstanding bug
request to support extensions to JSON such as parsing non-finite floats.
 Since there has been no upstream reaction to the bug request, I
seriously doubt it will happen any time soon, so any change to tolerate
NaN in libvirt would have to be a one-off patch.  It sounds like the
better fix is to make qemu emit valid JSON in the first place, rather
than making libvirt deal with broken JSON from qemu.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to