On 06/23/2017 11:32 AM, Martin Kletzander wrote:
On Thu, Jun 22, 2017 at 03:44:46PM +0200, Michal Privoznik wrote:
>
https://bugzilla.redhat.com/show_bug.cgi?id=1461270
>
> When fetching stats for a vhost-user type of interface, we run
> couple of ovs-vsctl commands and parse their output. However, not
> all stats exist at all times, for instance "rx_dropped" or
> "tx_errors" can be missing. Thing is, we ask for a bulk of
> statistics and if one of them is missing an error is reported
> instead of returning the rest. Since we ignore errors, we fail to
> set statistics. Fix this by asking for each piece alone.
>
> Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
> ---
> src/util/virnetdevopenvswitch.c | 96
> +++++++++++++++--------------------------
> 1 file changed, 34 insertions(+), 62 deletions(-)
>
> diff --git a/src/util/virnetdevopenvswitch.c
> b/src/util/virnetdevopenvswitch.c
> index 8f7215e06..6848f65b7 100644
> --- a/src/util/virnetdevopenvswitch.c
> +++ b/src/util/virnetdevopenvswitch.c
> @@ -340,67 +334,45 @@ virNetDevOpenvswitchInterfaceStats(const char
> *ifname,
[...]
> + if (!gotStats) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("Fail to parse ovs-vsctl output"));
> + _("Interface doesn't have statistics"));
s/have/have any/ or s/have/support/
> goto cleanup;
Is it possible that the version of ovs-vsctl command doesn't return
non-zero value and the right fix is just setting the values to -1
instead of the 'goto cleanup;' here (and leave it to fail if one of the
first four values are missing)?
Well, if it doesn't return a non-zero value on an error, it's ovs bug
because of their documentation:
EXIT STATUS
0 Successful program execution.
1 Usage, syntax, or configuration file error.
Anyway, your approach is more error-prone, even though we're running the
command 8 times (ewww).
Yes, I don't like it either.
But the output of `ovs-vsctl get interface
$ifname statistics` is not in a format that we would have parsers for.
Even though it wouldn't be that hard to parse it (wiki:BiteSizedTasks?),
Good idea, I'll add it there.
it's not that big of a deal except the constant
statistics-gathering
APIs. But it would be nice if we fixed that in the (hopefully near)
future.
Well, the ultimate goal would be to communicate with ovs directly via
socket instead of spawning ovs-vsctl command repeatedly (which is
something we do in other areas of the code btw - e.g. when plugging a
nic into an ovs bridge). However, that is a long shot from here, because
so far OVS devels consider their protocol the same way we do - internal
implementation. There is no stable library for communicating with ovs
yet. So I'm afraid for now we're stuck with spawning binaries :(
Reviewed-by: Martin Kletzander <mkletzan(a)redhat.com>
Thanks, pushed.
Michal