From f4d06ca8fd9651f02868856ea2809f1fe716777d Mon Sep 17 00:00:00 2001 From: Boris Fiuczynski Date: Tue, 7 Feb 2017 16:16:43 +0100 Subject: [PATCH] network: allow to specify timeout for openvswitch calls This patchs allows to set the timeout value used for all openvswitch calls. The default timeout value remains as before at 5 seconds. Signed-off-by: Boris Fiuczynski Reviewed-by: Bjoern Walk Signed-off-by: Michal Privoznik --- src/libvirt_private.syms | 1 + src/util/virnetdevopenvswitch.c | 82 +++++++++++++++++++++++---------- src/util/virnetdevopenvswitch.h | 4 ++ 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d556c7d522..0a7de9a8ee 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2078,6 +2078,7 @@ virNetDevOpenvswitchGetVhostuserIfname; virNetDevOpenvswitchInterfaceStats; virNetDevOpenvswitchRemovePort; virNetDevOpenvswitchSetMigrateData; +virNetDevOpenvswitchSetTimeout; # util/virnetdevtap.h diff --git a/src/util/virnetdevopenvswitch.c b/src/util/virnetdevopenvswitch.c index e6cb096dfd..42abcb4bbf 100644 --- a/src/util/virnetdevopenvswitch.c +++ b/src/util/virnetdevopenvswitch.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2013 Red Hat, Inc. * Copyright (C) 2012 Nicira, Inc. + * Copyright (C) 2017 IBM Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,6 +21,7 @@ * Dan Wendlandt * Kyle Mestery * Ansis Atteka + * Boris Fiuczynski */ #include @@ -38,6 +40,29 @@ VIR_LOG_INIT("util.netdevopenvswitch"); +/* + * Set openvswitch default timout + */ +static unsigned int virNetDevOpenvswitchTimeout = VIR_NETDEV_OVS_DEFAULT_TIMEOUT; + +/** + * virNetDevOpenvswitchSetTimeout: + * @timeout: the timeout in seconds + * + * Set the openvswitch timeout + */ +void +virNetDevOpenvswitchSetTimeout(unsigned int timeout) +{ + virNetDevOpenvswitchTimeout = timeout; +} + +static void +virNetDevOpenvswitchAddTimeout(virCommandPtr cmd) +{ + virCommandAddArgFormat(cmd, "--timeout=%u", virNetDevOpenvswitchTimeout); +} + /** * virNetDevOpenvswitchAddPort: * @brname: the bridge name @@ -88,8 +113,8 @@ int virNetDevOpenvswitchAddPort(const char *brname, const char *ifname, } cmd = virCommandNew(OVSVSCTL); - - virCommandAddArgList(cmd, "--timeout=5", "--", "--if-exists", "del-port", + virNetDevOpenvswitchAddTimeout(cmd); + virCommandAddArgList(cmd, "--", "--if-exists", "del-port", ifname, "--", "add-port", brname, ifname, NULL); if (virtVlan && virtVlan->nTags > 0) { @@ -183,7 +208,8 @@ int virNetDevOpenvswitchRemovePort(const char *brname ATTRIBUTE_UNUSED, const ch virCommandPtr cmd = NULL; cmd = virCommandNew(OVSVSCTL); - virCommandAddArgList(cmd, "--timeout=5", "--", "--if-exists", "del-port", ifname, NULL); + virNetDevOpenvswitchAddTimeout(cmd); + virCommandAddArgList(cmd, "--", "--if-exists", "del-port", ifname, NULL); if (virCommandRun(cmd, NULL) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -212,8 +238,10 @@ int virNetDevOpenvswitchGetMigrateData(char **migrate, const char *ifname) size_t len; int ret = -1; - cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", "--if-exists", "get", "Interface", - ifname, "external_ids:PortData", NULL); + cmd = virCommandNew(OVSVSCTL); + virNetDevOpenvswitchAddTimeout(cmd); + virCommandAddArgList(cmd, "--if-exists", "get", "Interface", + ifname, "external_ids:PortData", NULL); virCommandSetOutputBuffer(cmd, migrate); @@ -255,8 +283,9 @@ int virNetDevOpenvswitchSetMigrateData(char *migrate, const char *ifname) return 0; } - cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", "set", - "Interface", ifname, NULL); + cmd = virCommandNew(OVSVSCTL); + virNetDevOpenvswitchAddTimeout(cmd); + virCommandAddArgList(cmd, "set", "Interface", ifname, NULL); virCommandAddArgFormat(cmd, "external_ids:PortData=%s", migrate); /* Run the command */ @@ -299,9 +328,9 @@ virNetDevOpenvswitchInterfaceStats(const char *ifname, int ret = -1; /* Just ensure the interface exists in ovs */ - cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", - "get", "Interface", ifname, - "name", NULL); + cmd = virCommandNew(OVSVSCTL); + virNetDevOpenvswitchAddTimeout(cmd); + virCommandAddArgList(cmd, "get", "Interface", ifname, "name", NULL); virCommandSetOutputBuffer(cmd, &output); if (virCommandRun(cmd, NULL) < 0) { @@ -314,12 +343,13 @@ virNetDevOpenvswitchInterfaceStats(const char *ifname, VIR_FREE(output); virCommandFree(cmd); - cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", - "get", "Interface", ifname, - "statistics:rx_bytes", - "statistics:rx_packets", - "statistics:tx_bytes", - "statistics:tx_packets", NULL); + cmd = virCommandNew(OVSVSCTL); + virNetDevOpenvswitchAddTimeout(cmd); + virCommandAddArgList(cmd, "get", "Interface", ifname, + "statistics:rx_bytes", + "statistics:rx_packets", + "statistics:tx_bytes", + "statistics:tx_packets", NULL); virCommandSetOutputBuffer(cmd, &output); if (virCommandRun(cmd, NULL) < 0) { @@ -345,12 +375,13 @@ virNetDevOpenvswitchInterfaceStats(const char *ifname, VIR_FREE(output); virCommandFree(cmd); - cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", - "get", "Interface", ifname, - "statistics:rx_errors", - "statistics:rx_dropped", - "statistics:tx_errors", - "statistics:tx_dropped", NULL); + cmd = virCommandNew(OVSVSCTL); + virNetDevOpenvswitchAddTimeout(cmd); + virCommandAddArgList(cmd, "get", "Interface", ifname, + "statistics:rx_errors", + "statistics:rx_dropped", + "statistics:tx_errors", + "statistics:tx_dropped", NULL); virCommandSetOutputBuffer(cmd, &output); if (virCommandRun(cmd, NULL) < 0) { /* This interface don't have errors or dropped, so set them to 0 */ @@ -399,6 +430,7 @@ virNetDevOpenvswitchGetVhostuserIfname(const char *path, size_t ntokens = 0; int status; int ret = -1; + char *ovs_timeout = NULL; /* Openvswitch vhostuser path are hardcoded to * //openvswitch/ @@ -412,8 +444,9 @@ virNetDevOpenvswitchGetVhostuserIfname(const char *path, goto cleanup; } - cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", "get", "Interface", - tmpIfname, "name", NULL); + cmd = virCommandNew(OVSVSCTL); + virNetDevOpenvswitchAddTimeout(cmd); + virCommandAddArgList(cmd, "get", "Interface", tmpIfname, "name", NULL); if (virCommandRun(cmd, &status) < 0 || status) { /* it's not a openvswitch vhostuser interface. */ @@ -428,5 +461,6 @@ virNetDevOpenvswitchGetVhostuserIfname(const char *path, cleanup: virStringListFreeCount(tokens, ntokens); virCommandFree(cmd); + VIR_FREE(ovs_timeout); return ret; } diff --git a/src/util/virnetdevopenvswitch.h b/src/util/virnetdevopenvswitch.h index 01f6233c51..4f62be1abe 100644 --- a/src/util/virnetdevopenvswitch.h +++ b/src/util/virnetdevopenvswitch.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2013 Red Hat, Inc. * Copyright (C) 2012 Nicira, Inc. + * Copyright (C) 2017 IBM Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,6 +21,7 @@ * Dan Wendlandt * Kyle Mestery * Ansis Atteka + * Boris Fiuczynski */ #ifndef __VIR_NETDEV_OPENVSWITCH_H__ @@ -31,6 +33,8 @@ # define VIR_NETDEV_OVS_DEFAULT_TIMEOUT 5 +void virNetDevOpenvswitchSetTimeout(unsigned int timeout); + int virNetDevOpenvswitchAddPort(const char *brname, const char *ifname, const virMacAddr *macaddr,